Flask-Login + Flask-Sockets =混乱

Hig*_*ler 2 python websocket flask

我已经安装了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")
Run Code Online (Sandbox Code Playgroud)

我仍然是Flask的新人,任何帮助都会受到超级赞赏.

Mig*_*uel 7

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

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

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

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

我希望这有帮助.对不起,我没有快速简便的解决方案.

  • 谢谢:) Flask-Sockets是一个围绕其他软件的光包装.我不认为它或gevent存在真正的问题,只是这些不适合您习惯使用Flask的服务器端模型.正如我在回答中所说,客户端需要发送凭据,这可以是完整登录或更好,是在成功登录常规路由后生成的令牌.这是一个很好的问题,顺便说一句,我已将此主题添加到我即将发布的博客文章列表中. (3认同)