我有一個 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)
這種用法有什么問題嗎。如何解決這個問題?
謝謝
uj5u.com熱心網友回復:
這與 Flask-SocketIO 無關,而是與 Flask 有關。您啟動的后臺任務沒有請求和應用程式背景關系,因此它無權訪問會話(它甚至不知道客戶端是誰)。
Flask 提供了copy_current_request_context裝飾器,將請求/應用程式背景關系從請求處理程式復制到后臺任務中。
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'
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/411646.html
標籤:
