来自后台任务的 Flask-SocketIO 访问会话

Flask-SocketIO access session from background task

我有一个 Flask 应用程序,用于使用 gevent 在客户端和服务器之间进行 http 和 web 套接字 (Flask-SocketIO) 通信。我还为应用程序使用服务器端会话和 Flask-Session 扩展。我 运行 使用 SocketIO.start_background_task 的后台任务。从这个任务中,我需要访问会话信息,这些信息将用于使用 socketio 发出消息。从任务 "RuntimeError: Working outside of request context." This typically means that you attempted to use functionality that needed an active HTTP request.

访问会话时出现错误

Socket IO实例创建如下- socket_io = SocketIO(app, async_mode='gevent', manage_session=False)

这种用法有什么问题吗?如何解决这个问题?

谢谢

这与Flask-SocketIO无关,与Flask有关。您启动的后台任务没有请求和应用程序上下文,因此它无权访问会话(它甚至不知道客户端是谁)。

Flask 提供 copy_current_request_context 装饰器将请求处理程序中的 request/app 上下文复制到后台任务中。

Flask 文档中的示例使用 gevent.spawn() 启动任务,但这对于使用 start_background_task() 启动的任务是相同的。

import gevent
from flask import copy_current_request_context

@app.route('/')
def index():
    @copy_current_request_context
    def do_some_work():
        # do some work here, it can access flask.request or
        # flask.session like you would otherwise in the view function.
        ...
    gevent.spawn(do_some_work)
    return 'Regular response'