基于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 ...
随机推荐
- Centos 内存释放
原因:最近发现服务器老师提示内存不足的警报,很多时候内存都占用百分之80以上,查看运行的服务似乎并没有占用很大的内存,top查看运行的服务,然后按shift+m排名第一的才百分之1.x,看了别人的博客 ...
- 关于 typedef struct 和 struct
举个例子说明:typedef struct abc{ int x; int y; int z;}ABC;是将结构体abc类型重新起个名字为ABC,以后再定义同一类型的变量时,可以写成:ABC m,n; ...
- git常用命令图解 & 常见错误
Git 常用命令 基本命令 git clone.这是一种较为简单的初始化方式,当你已经有一个远程的Git版本库,只需要在本地克隆一份 git clone git://github.com/someon ...
- leetcode410 Split Array Largest Sum
思路: dp. 实现: class Solution { public: int splitArray(vector<int>& nums, int m) { int n = nu ...
- linux的top下buffer与cache的区别
buffer: 缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据 的区域.通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据 时,速度快的设备的操作进程不发 ...
- JS内置对象练习(慕课网题目)
效果图: XXXX年XX月X日 星期X--班级总分为:81 格式要求: 1.显示打印的日期. 格式为类似“XXXX年XX月XX日 星期X” 的当前的时间. 2.计算出该班级的平均分(保留整数). 同学 ...
- HV000184: ParameterMessageInterpolator has been chosen, EL interpolation will not be supported问题解决
今天创建springboot项目的时候添加完依赖启动出现了这个错误 -- :: --- [ main] o.h.v.m.ParameterMessageInterpolator : HV000184: ...
- Android如何用阿里云的API进行身份证识别
准备工作:在libs下添加 alicloud-Android-apigateway-sdk-1.0.1.jar,commons-codec-1.10-1.jar 在build.gradle添加 co ...
- SEO 第十章
SEO第十章 本次课目标: 1. 站外优化方案计划 2. 常见的SEO作弊手段(黑帽) 3. 百度站长平台的使用 4. 网站流量提升和转化率提升 一.站外优化方案计划 友情链接 权重相当.行业 ...
- Android(java)学习笔记166:上下文的区分
1.两种上下文: (1)Activity.this 界面的上下文 (2)getApplicationContext() 整 ...