python - Flask-Login + Flask-Sockets = 困惑

标签 python flask websocket

我已经安装了 Flask-Login 和 Flask-Sockets。它们都工作正常但是当我尝试获取当前用户(使用 g.user)时,我得到一个 AttributeError: '_AppCtxGlobals' object has no attribute 'user'

@sockets.route('/echo')
def echo_socket(ws):
    with app.app_context():
        user = current_user #This causes problems, just like basically anything else that uses something that is not provided in this function
        while True:
            message = ws.receive()
            ws.send("lol")

我对 Flask 还是个新手,非常感谢任何帮助。

最佳答案

问题是您将套接字函数视为常规请求,而实际上它们不是。

在常规(即非套接字)情况下,客户端向服务器发送请求。每个请求都包含一个由 Flask-Login 在登录时设置的 cookie。这个 cookie 包含登录的用户。Flask-Login 有一个 before_request 处理程序读取这个 cookie,加载用户,然后通过 current_user 公开它,这样通过在您的函数运行时,您可以访问此信息。

套接字连接与上面的完全不同。对于套接字连接,客户端打开到路由的套接字,并与服务器建立永久连接。这里不存在请求的概念,它只是两台机器使用自己的协议(protocol)发送和接收数据。因为没有 HTTP 请求,所以也没有 cookie,没有 before_request 处理程序,没有推送的应用程序和请求上下文,也没有来自 Flask-Login 的 current_user。套接字路由在 Flask 应用程序之外真正起作用。

如果您需要知道用户,您需要让客户端通过套接字接口(interface)发送凭据,并且您需要自己在套接字路由中验证这些凭据,因为 Flask-Login 无法在套接字环境中工作由于缺少请求、cookie 等。套接字和常规路由之间的一个显着区别是套接字连接是永久性的,因此您只需要在连接建立时对用户进行身份验证。

希望对您有所帮助。抱歉,我没有适合您的快速简便的解决方案。

关于python - Flask-Login + Flask-Sockets = 困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20863629/

相关文章:

python - python bcrypt 出现问题,找不到模块

python - 使用 python 使用 IP 摄像头捕获单个图像

python - 如何在 Pandas DataFrame 中查找包含数字的字符串数据类型

node.js - 尝试通过 socket.io 连接到服务器时出现 CORS 错误

python - 使用 urllib2 抓取 Biography.com

python - FLASK REST API 在 POST 上返回 400

python - 如何在 url 中传递带有 *slashes* 的参数?

python - 尝试使用 Flask-Security 手动确认用户电子邮件时,确认 token 无效

security - 如何在 Java EE 7 中保护 Websocket 服务器

web-services - 在没有加密的情况下通过网络向用户发送 SSL-pubkey 是否安全?