基于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的网页聊天室(二)的更多相关文章

  1. 基于flask的网页聊天室(四)

    基于flask的网页聊天室(四) 前言 接前天的内容,今天完成了消息的处理 具体内容 上次使用了flask_login做用户登录,但是直接访问login_requare装饰的函数会报401错误,这里可 ...

  2. 基于flask的网页聊天室(三)

    基于flask的网页聊天室(三) 前言 继续上一次的内容,今天完成了csrf防御的添加,用户头像的存储以及用户的登录状态 具体内容 首先是添加csrf的防御,为整个app添加防御: from flas ...

  3. 基于flask的网页聊天室(一)

    基于flask的网页聊天室(一) 基本目标 基于flask实现的web聊天室,具有基本的登录注册,多人发送消息,接受消息 扩展目标 除基本目标外添加当前在线人数,消息回复,markdown支持,历史消 ...

  4. workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的)

    workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的) 一.总结 1.下面链接里面还有一个来聊的php聊天室源码可以学习 2. ...

  5. Java和WebSocket开发网页聊天室

    小编心语:咳咳咳,今天又是聊天室,到现在为止小编已经分享了不下两个了,这一次跟之前的又不大相同,这一次是网页聊天室,具体怎么着,还请各位看官往下看~ Java和WebSocket开发网页聊天室 一.项 ...

  6. JavaWeb网页聊天室(WebSocket即时通讯)

    原文:http://baike.xsoftlab.net/view/656.html Git地址 http://git.oschina.net/loopcc/WebSocketChat 概要: Web ...

  7. SpringBoot基于websocket的网页聊天

    一.入门简介正常聊天程序需要使用消息组件ActiveMQ或者Kafka等,这里是一个Websocket入门程序. 有人有疑问这个技术有什么作用,为什么要有它?其实我们虽然有http协议,但是它有一个缺 ...

  8. WebSocket 网页聊天室的实现(服务器端:.net + windows服务,前端:Html5)

    websocket是HTML5中的比较有特色一块,它使得以往在客户端软件中常用的socket在web程序中也能轻松的使用,较大的提高了效率.废话不多说,直接进入题. 网页聊天室包括2个部分,后端服务器 ...

  9. 基于springboot的websocket聊天室

    WebSocket入门 1.概述 1.1 Http #http简介 HTTP是一个应用层协议,无状态的,端口号为80.主要的版本有1.0/1.1/2.0. #http1.0/1.1/2.0 1.HTT ...

随机推荐

  1. 状压dp小结 By cellur925

    会一直慢慢写的... 一.一些技巧(位运算) 取出整数n在二进制表示下的第k位,检验是否为1---(n>>k)&1 求最后完备状态(假设都是1),有n个待枚举状态,结果是(1< ...

  2. Ubuntu 18.04 LTS 安装后 各种问题以及解决方案

    1. root的初始密码,默认是不知道的,需要进行设置 a. 进入终端自己的用户 b. 输入 sudo passwd回车 c. 输入新密码,回车,重复,回车,搞定 d. su 一下,就可以了 2.  ...

  3. UML 图中类之间的关系:依赖,泛化,关联,聚合,组合,实现

    http://www.uml.org.cn/oobject/201211231.asp 1. 关联 一个类作为另外一个类的变量:在UML类图中,用实线连接有关联关系的对象所对应的类 2.聚合 表示整体 ...

  4. icomoon字体使用

    如何灵活利用免费开源图标字体-IcoMoon篇 by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/w ...

  5. Python标准库 os

    (掌握os模块,你需要了解Linux或类Unix系统下常用命令的操作) os.name  指示你正在使用的平台.比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix' ...

  6. 使用ansible对远程主机上的ssh公钥进行批量分发

    使用ansible对远程主机上的ssh公钥进行批量分发或者是删除修改操作 ansible内置了一个authorized_key模块,这个模块很好用,我们使用这个模块可以对远程 主机上的ssh公钥进行批 ...

  7. 《统计学习方法》笔记三 k近邻法

    本系列笔记内容参考来源为李航<统计学习方法> k近邻是一种基本分类与回归方法,书中只讨论分类情况.输入为实例的特征向量,输出为实例的类别.k值的选择.距离度量及分类决策规则是k近邻法的三个 ...

  8. 在脚本中输入密码执行sudo,可关机等。

    如下,makexxx.sh make update-api make echo "password" | sudo -S shutdown -h now

  9. c#学习系列之装箱拆箱

    1.      装箱和拆箱是一个抽象的概念 2.      装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型       利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的 ...

  10. MySQL优化步骤和my.cnf优化配置

    1.查看机器配置,指三大件:cpu.内存.硬盘 2.查看mysql配置参数 3.查看mysql运行状态,可以用mysqlreport工具来查看 4.查看mysql的慢查询 依次解决了以上问题之后,再来 ...