您当前的位置: 首页 >  Python

从头搭建一个基于 Python 的在线聊天室

蔚1 发布时间:2019-07-02 23:30:10 ,浏览量:2

本场 Chat,是基于 Python + Redis + Flask 来搭建一个简单易用的在线聊天室。完全从零开始,一步一步完成整个项目。

主要分享内容:

  1. Flask 项目结构
  2. Python Redis 应用
  3. WebSocket 应用
  4. 对接聊天机器人
  5. 聊天室管理功能,禁言、踢人等

对于 flask 不太熟悉的同学可以先看看这个,Python 入门实战之鉴权系统

      • 整体技术栈
      • 搭建权限框架
      • 构建前端页面
      • 应用 Redis
      • 完善 chat 视图功能
      • 创建及加入聊天室
        • 创建聊天室
        • 加入聊天室
      • 一些辅助功能
        • 聊天室列表
        • 退出操作
        • 用户头像
      • 消息推送逻辑
      • 效果图展示
      • 调整项目结构
      • 具体代码拆分
      • 功能增强
      • 清理过期消息
      • 禁言功能
      • 踢人
      • 对接聊天机器人

大家跟着我,齐步一起走!文章比较长,还请耐心阅读。

先提供项目源码,欢迎 Start 和 Fork:

https://github.com/zhouwei713/online-chat

整体技术栈
  1. Flask 框架
  2. Flask_login 的使用
  3. WebSocket 简单应用
  4. Redis 应用
  5. 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 %}
关注
打赏
1688896170
查看更多评论
0.0770s