来自后台任务的 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'
我有一个 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'