本场 Chat,是基于 Python + Redis + Flask 来搭建一个简单易用的在线聊天室。完全从零开始,一步一步完成整个项目。
主要分享内容:
- Flask 项目结构
- Python Redis 应用
- WebSocket 应用
- 对接聊天机器人
- 聊天室管理功能,禁言、踢人等
对于 flask 不太熟悉的同学可以先看看这个,Python 入门实战之鉴权系统
-
-
- 整体技术栈
- 搭建权限框架
- 构建前端页面
- 应用 Redis
- 完善 chat 视图功能
- 创建及加入聊天室
- 创建聊天室
- 加入聊天室
- 一些辅助功能
- 聊天室列表
- 退出操作
- 用户头像
- 消息推送逻辑
- 效果图展示
- 调整项目结构
- 具体代码拆分
- 功能增强
- 清理过期消息
- 禁言功能
- 踢人
- 对接聊天机器人
-
大家跟着我,齐步一起走!文章比较长,还请耐心阅读。
先提供项目源码,欢迎 Start 和 Fork:
https://github.com/zhouwei713/online-chat
整体技术栈- Flask 框架
- Flask_login 的使用
- WebSocket 简单应用
- Redis 应用
- Flask_socketio 的使用
还是使用 Flask 来搭建后台应用,使用 Flask_login 扩展来处理用户登录鉴权逻辑。
首先定义登录表单:
class LoginForm(FlaskForm): username = StringField('Username', validators=[DataRequired(), ]) password = PasswordField('Password', validators=[DataRequired()]) remember_me = BooleanField('Keep me logged in') submit = SubmitField('Log in')
一个简单的登录表单,不做过多解释。
接下来定义数据库结构:
class User(UserMixin, db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64), unique=True, index=True) password = db.Column(db.String(64))
当前,我们只需要一个 user 用户表,只包含三个字段的简单表。用户密码也只是简单地保存了明文,后面再处理用户密码的 hash 问题。
下面就可以定义用户登录表单:
from flask_login import LoginManagerlogin_manager = LoginManager()login_manager.session_protection = 'strong'login_manager.login_view = 'login'app = Flask(__name__)login_manager.init_app(app)app.config['SECRET_KEY'] = 'hardtohard'@login_manager.user_loaderdef load_user(user_id): return User.query.get(int(user_id))@app.route('/login', methods=['GET', 'POST'])def login(): form = LoginForm() if form.validate_on_submit(): user = User.query.filter_by(username=form.username.data).first() if user: login_user(user) return redirect(url_for('chat')) return render_template('login.html', form=form)
这里定义了,只检查用户名是否存在,如果存在,就执行 login_user() 函数,登录。用户密码的使用,也留到后面再做处理。
其中 load_user,是回调函数,将获取到的 user 对象存储到浏览器的 session 中,然后在调用 login_user 函数时,就会调用 load_user 来把真正需要登录的用户设置到 session 中。当登录成功后,就会跳转到 chat 函数所对应的页面。
chat 函数比较简单,只是展示一个网页:
@app.route('/chat', methods=['GET', 'POST'])@login_requireddef chat(): return render_template('chat.html')
使用 login_required 装饰器,保证该函数只允许登录的用户访问。
增加些初始化函数:
@app.route('/adddb', methods=['GET', 'POST'])def addbd(): db.create_all() return "OK"@app.route('/deldb', methods=['GET', 'POST'])def delbd(): db.drop_all() return "OK"@app.route('/adduser/', methods=['GET', 'POST'])def adduser(user): user = User(username=user, password='admin') db.session.add(user) db.session.commit() return "OK"
增加了初始化数据库和新增用户的函数。
构建前端页面首先处理登录页面,在 login.html 中添加:
{% extends "bootstrap/base.html" %}{% import "bootstrap/wtf.html" as wtf %}{% block title %}Flasky{% endblock %}{% block navbar %} Toggle navigation Flasky - Home
{% if current_user.is_authenticated %} -
关注
打赏
立即登录/注册
微信扫码登录