Flask-Sockets和Flask-Login联合实现websocket的登录认证功能

flask_login 提供了一个方便的方式来管理用户会话。当你在 Flask 的 HTTP 视图中使用它时,你可以简单地使用 @login_required 装饰器来确保用户已登录。

但是,flask_sockets 并没有直接与 flask_login 集成。如果你想在建立 WebSocket 连接时检查用户是否已登录,你需要采取一些额外的步骤。

以下是一个示例,说明如何在 flask_sockets 路由中使用 flask_login 进行身份验证:

  1. 初始化 Flask、Flask-Login 和 Flask-Sockets:
python 复制代码
from flask import Flask, request, session
from flask_login import LoginManager, current_user, UserMixin, login_required
from flask_sockets import Sockets

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'
sockets = Sockets(app)
login_manager = LoginManager()
login_manager.init_app(app)
  1. 定义用户模型和加载用户的回调:
python 复制代码
class User(UserMixin):
    # For simplicity, this example does not use a real database.
    # Instead, it uses this dictionary to simulate user data.
    users = {"1": {"id": "1", "username": "user1", "password": "pass1"}}

    def __init__(self, id_, username):
        self.id = id_
        self.username = username

    @classmethod
    def get(cls, id_):
        user_data = cls.users.get(id_)
        if not user_data:
            return None
        return User(id_=user_data["id"], username=user_data["username"])

@login_manager.user_loader
def load_user(user_id):
    return User.get(user_id)
  1. 定义 WebSocket 路由并检查登录状态:

为了检查用户是否已登录,我们会读取 Flask 的会话数据,因为 flask_login 在其中存储了有关用户身份的信息。

python 复制代码
@sockets.route('/socket')
def chat_socket(ws):
    # Flask's context might not be available in the WebSocket route,
    # so we manually load the user using Flask-Login's method.
    user = load_user(session.get("user_id"))

    # If user is not loaded (i.e., not logged in), we close the connection.
    if user is None:
        ws.close(reason="User not logged in.")
        return

    while not ws.closed:
        message = ws.receive()
        if message:
            ws.send(f"Hello {user.username}, you said: {message}")
  1. 创建一些基本的登录和注销路由:
python 复制代码
from flask import render_template, redirect, url_for, request

@app.route('/login', methods=["GET", "POST"])
def login():
    if request.method == "POST":
        username = request.form.get("username")
        password = request.form.get("password")
        user = [u for u in User.users.values() if u["username"] == username and u["password"] == password]
        if user:
            user = User.get(user[0]["id"])
            login_user(user)
            return redirect(url_for("index"))
    return render_template("login.html")

@app.route('/logout')
@login_required
def logout():
    logout_user()
    return redirect(url_for("login"))

@app.route('/')
@login_required
def index():
    return "Logged in as " + current_user.username
  1. 运行应用程序:
python 复制代码
if __name__ == "__main__":
    from gevent.pywsgi import WSGIServer
    from geventwebsocket.handler import WebSocketHandler
    server = WSGIServer(('127.0.0.1', 5000), app, handler_class=WebSocketHandler)
    server.serve_forever()

注意:在上述代码中,我们手动加载用户并检查他们是否已登录,而不是使用 @login_required 装饰器。在 WebSocket 路由中,由于 Flask 的请求上下文可能不可用,所以这是必要的。

相关推荐
夜雪一千30 分钟前
应用层加密的优缺点
python
计算机编程指导师42 分钟前
【计算机毕设选题推荐】基于Hadoop+Spark的化妆品销售大数据分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
大数据·hadoop·python·spark·毕业设计·课程设计·化妆品
用户0332126663671 小时前
Python 实用技巧:从零自主生成结构化 PDF 页面
python
benchmark_cc1 小时前
前复权数据每天可能变化,历史数据库应该覆盖还是保留原始价格?
大数据·python·pandas·量化交易·股票数据·quantdash
计算机编程指导师1 小时前
计算机毕设选题推荐:Hadoop大数据下的个体肥胖健康风险评估与可视化系统源码 毕业设计 毕设选题 数据分析 机器学习
大数据·hadoop·python·spark·毕业设计·课程设计·肥胖健康风险
code2cat1 小时前
【随笔】MCP输入Schema:把参数错误拦在工具执行之前
python·json schema·ai agent·mcp
计算机编程指导师1 小时前
Python大数据毕设怎么写?Django结合Hadoop+Spark京东销售分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
大数据·hadoop·python·spark·毕业设计·课程设计·京东商品
合尘猫2 小时前
AI 项目上线就停:一次事件循环阻塞的完整排查过程
人工智能·后端·python
染指11102 小时前
142.Agent-多Agent框架-通过Skills实现多Agent
开发语言·人工智能·python·langchain·agents
天国梦2 小时前
国密门禁品牌怎么选?2026年最新3个避坑要点
运维·服务器·数据库·python