我已经安装了 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/