Flask-Login + Flask-Sockets = Chaos

Posted

技术标签:

【中文标题】Flask-Login + Flask-Sockets = Chaos【英文标题】: 【发布时间】:2013-12-31 22:00:14 【问题描述】:

我已经安装了 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 的新手,非常感谢任何帮助。

【问题讨论】:

那你之前的问题解决了吗? 是的,使用with解决了这个问题 【参考方案1】:

问题在于您将套接字函数视为常规请求,而事实并非如此。

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

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

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

我希望这会有所帮助。抱歉,我没有为您提供快速简便的解决方案。

【讨论】:

感谢米格尔的回复!你知道我可以用 Flask(和 Flask-login)添加实时功能的任何其他方式吗? Flask-sockets 似乎有一些问题。 ps 我也是您的超级教程的粉丝!它教会了我很多东西 谢谢 :) Flask-Sockets 是其他软件的轻量级包装器。我认为它或 gevent 没有真正的问题,只是这些不适合您习惯使用 Flask 的服务器端模型。正如我在回答中所说,客户端需要发送凭据,可以是完整登录,也可以是更好的,通过常规路由成功登录后生成的令牌。这是一个很好的问题,顺便说一下,我已将此主题添加到我即将发布的博客文章列表中。 另外,Heroku 在这个主题中有一些可能有用的信息:devcenter.heroku.com/articles/…

以上是关于Flask-Login + Flask-Sockets = Chaos的主要内容,如果未能解决你的问题,请参考以下文章

flask-login 学习

Python flask 框架使用 flask-login 模块,来学习一下吧

Python flask 框架使用 flask-login 模块,来学习一下吧

Flask-Login 使用和进阶

Flask-login 插件使用

Flask-Login