基于flask的网页聊天室(二)
基于flask的网页聊天室(二)
前言
接上一次的内容继续完善,今天完成的内容不是很多,只是简单的用户注册登录,内容具体如下
具体内容
这次要加入与数据哭交互的操作,所以首先要建立相关表结构,这里使用flask-sqlalchemy来辅助创建
首先修改之前的init文件为:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
from web_chatroom.models import *
from web_chatroom.auth import auth
from web_chatroom.chat import chat
def create_app():
app = Flask(__name__)
app.register_blueprint(auth)
app.register_blueprint(chat)
# 添加配置
app.config.from_object('web_chatroom.settings.DebugConfig')
# 读取配置
db.init_app(app)
return app
这是为了引入SQLAlchemy()对象db,并读取相关的配置,首先要注意的是db = SQLAlchemy()必须要在from web_chatroom.auth import auth之前,因为我在auth.py中使用了db,所以必须要在db创建之后,同时,models是创建的数据库表结构,也要引入内存当中。
接下来看一下配置文件settings,只是一个很简单的配置:
class DebugConfig():
DEBUG = True
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:******@127.0.0.1:3306/webChatroom'
SECRET_KEY = 'webchatroom'
主要是在这里先把数据库url配置好
然后是表结构models目前只有user表
from web_chatroom import db
class User(db.Model):
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
email = db.Column(db.String(256),unique=True,nullable=False)
username = db.Column(db.String(32),unique=True,nullable=False)
password_hash = db.Column(db.String(128))
为了能够像django一样能够执行数据库迁移的操作,我们使用flask-migrate来维护数据库迁移的版本,于是将之前的app.py修改:
from web_chatroom import create_app,db
from flask_script import Manager
from flask_migrate import Migrate,MigrateCommand
app = create_app()
manager = Manager(app)
migrate = Migrate(app,db)
manager.add_command('db',MigrateCommand)
if __name__ == '__main__':
manager.run()
这样就可以通过执行
python app.py db init
python app.py db migrate
python app.py db upgrate
完成数据库的迁移
那么相关数据库的建立已完成,接下来可以完善用户的注册登录了
为了辅助表单验证,先建立了utils文件夹,并在其中建立forms.py保存了wtforms的相关form类:
from wtforms import Form
from wtforms.fields import simple,html5
from wtforms import validators
from wtforms import widgets
class LoginForm(Form):
username = simple.StringField(
validators=[
validators.DataRequired(message='用户名不能为空.')
],
widget=widgets.TextInput(),
)
password = simple.PasswordField(
validators=[
validators.DataRequired(message='密码不能为空.'),
validators.Length(min=8, message='密码长度必须大于%(min)d'),
],
widget=widgets.PasswordInput(),
)
class RegisterForm(Form):
username = simple.StringField(
validators=[
validators.DataRequired(message='用户名不能为空.')
],
widget=widgets.TextInput(),
)
password = simple.PasswordField(
validators=[
validators.DataRequired(message='密码不能为空.'),
validators.Length(min=8, message='密码长度必须大于%(min)d'),
],
widget=widgets.PasswordInput(),
)
email = html5.EmailField(
label='邮箱',
validators=[
validators.DataRequired(message='邮箱不能为空.'),
validators.Email(message='邮箱格式错误')
],
widget=widgets.TextInput(input_type='email'),
)
接下来修改一下登录与注册的html页面,具体代码就不放了,然后在auth.py中的视图函数中处理验证:
from flask import render_template,flash,redirect,url_for
from flask import request
from web_chatroom import models
from web_chatroom import db
import hashlib
from utils import forms
auth = Blueprint('auth', __name__)
@auth.route('/login', methods=['GET', "POST"],endpoint='login')
def login():
if request.method == 'GET':
return render_template('login.html')
elif request.method == 'POST':
form = forms.LoginForm(formdata=request.form)
if form.validate():
password_hash = hashlib.md5(form.data['password'].encode('utf-8')).hexdigest()
count = db.session.query(models.User).filter(db.and_(models.User.username == form.data['username'],
models.User.password_hash == password_hash)).count()
if count:
return redirect(url_for('chat.chat'))
else:
flash('用户名或密码错误')
return redirect(url_for('auth.login'))
pass
else:
for error in form.errors:
flash(form.errors[error][0])
return redirect(url_for('auth.login'))
@auth.route('/register', methods=['GET', "POST"],endpoint='register')
def register():
if request.method == 'GET':
return render_template('register.html')
elif request.method == 'POST':
form = forms.RegisterForm(formdata=request.form)
if form.validate():
count = db.session.query(models.User).filter(db.or_(models.User.username == form.data['username'],
models.User.email == form.data['email'])).count()
if count:
flash('用户名或邮箱已存在')
return redirect(url_for('auth.register'))
else:
password_hash = hashlib.md5(form.data['password'].encode('utf-8')).hexdigest()
db.session.add(models.User(username=form.data['username'],
email=form.data['email'],
password_hash=password_hash))
db.session.commit()
db.session.close()
flash('注册成功')
return redirect(url_for('auth.login'))
else:
for error in form.errors:
flash(form.errors[error][0])
return redirect(url_for('auth.register'))
验证的错误信息通过flash在页面显示,像这样:

注册同理,最后登录成功会跳转到chat.html页面,chat.py中的视图函数就只先写了个显示:
from flask import Blueprint
from flask import render_template,flash,redirect,url_for
from flask import request
chat = Blueprint('chat', __name__)
@chat.route('/chat', methods=['GET', "POST"],endpoint='chat')
def chatroom():
if request.method == 'GET':
return render_template('chatroom.html')
当然页面里目前什么也没有。。。
最后,当前项目的目录结构是这样的:

总结
今天主要完成了简单的数据库交互,明天继续加入cookie,session,以及csrf的保护,以及chat的页面,消息表等。。
基于flask的网页聊天室(二)的更多相关文章
- 基于flask的网页聊天室(四)
基于flask的网页聊天室(四) 前言 接前天的内容,今天完成了消息的处理 具体内容 上次使用了flask_login做用户登录,但是直接访问login_requare装饰的函数会报401错误,这里可 ...
- 基于flask的网页聊天室(三)
基于flask的网页聊天室(三) 前言 继续上一次的内容,今天完成了csrf防御的添加,用户头像的存储以及用户的登录状态 具体内容 首先是添加csrf的防御,为整个app添加防御: from flas ...
- 基于flask的网页聊天室(一)
基于flask的网页聊天室(一) 基本目标 基于flask实现的web聊天室,具有基本的登录注册,多人发送消息,接受消息 扩展目标 除基本目标外添加当前在线人数,消息回复,markdown支持,历史消 ...
- workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的)
workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的) 一.总结 1.下面链接里面还有一个来聊的php聊天室源码可以学习 2. ...
- Java和WebSocket开发网页聊天室
小编心语:咳咳咳,今天又是聊天室,到现在为止小编已经分享了不下两个了,这一次跟之前的又不大相同,这一次是网页聊天室,具体怎么着,还请各位看官往下看~ Java和WebSocket开发网页聊天室 一.项 ...
- JavaWeb网页聊天室(WebSocket即时通讯)
原文:http://baike.xsoftlab.net/view/656.html Git地址 http://git.oschina.net/loopcc/WebSocketChat 概要: Web ...
- SpringBoot基于websocket的网页聊天
一.入门简介正常聊天程序需要使用消息组件ActiveMQ或者Kafka等,这里是一个Websocket入门程序. 有人有疑问这个技术有什么作用,为什么要有它?其实我们虽然有http协议,但是它有一个缺 ...
- WebSocket 网页聊天室的实现(服务器端:.net + windows服务,前端:Html5)
websocket是HTML5中的比较有特色一块,它使得以往在客户端软件中常用的socket在web程序中也能轻松的使用,较大的提高了效率.废话不多说,直接进入题. 网页聊天室包括2个部分,后端服务器 ...
- 基于springboot的websocket聊天室
WebSocket入门 1.概述 1.1 Http #http简介 HTTP是一个应用层协议,无状态的,端口号为80.主要的版本有1.0/1.1/2.0. #http1.0/1.1/2.0 1.HTT ...
随机推荐
- PostgreSQL - 官方手册、中文手册及Github项目地址
PostgreSQL每次更新都会有语法变化,低版本的PostgreSQL是无法运行高版本的sql语法的,下边是官方手册地址,可以查看多个版本的: https://www.postgresql.org/ ...
- c++,类的对象作为形参时一定会调用复制构造函数吗?
c++,类的对象作为形参时一定会调用复制构造函数吗? 答:如果参数是引用传递,则不会调用任何构造函数:如果是按值传递,则调用复制构造函数,按参数的值构造一个临时对象,这个临时对象仅仅在函数执行是存在, ...
- byte的范围-128-127
01111111 表示的是最大的数字 是127这个没有问题 ,前面的0 表示的正数,1表示的负数 而负数在计算机中的存储都是通过补码的形式存在的,也就是说 1 1111 111 是计算机中最小的数 ...
- websocket来回收发消息
# server- # pip install geventwebsocket# pip install flask from flask import Flask, render_template, ...
- 题解报告:NYOJ #78 圈水池(打印凸包顶点)
描述: 有一个牧场,牧场上有很多个供水装置,现在牧场的主人想要用篱笆把这些供水装置圈起来,以防止不是自己的牲畜来喝水,各个水池都标有各自的坐标,现在要你写一个程序利用最短的篱笆将这些供水装置圈起来!( ...
- 题解报告:hdu 2141 Can you find it?(二分)
Problem Description Give you three sequences of numbers A, B, C, then we give you a number X. Now yo ...
- h5-26-web本地存储
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- java容器章节总结
- 看Facebook是如何优化React Native性能
原文出处: facebook 译文出处:@Siva海浪高 该文章翻译自Facebook官方博客,传送门 React Native 允许我们运用 React 和 Relay 提供的声明式的编程模型, ...
- RHEL 6.5----CDN(lumanger)
主机名 IP 服务 master 192.168.30.130 CDN(LuManager) slave 192.168.30.131 DNS 软件安装包下载地址及安装方法 http:// ...