如何在访问请求上下文时从 Flask 发送服务器端事件?

How can I send server-side events from Flask while accessing the request context?

我正在尝试使用 Flask 将事件流发送到前端客户端,如 this question 中所述。如果我不访问请求上下文中的任何内容,这就可以正常工作,但一旦访问就会失败。

这里有一个例子来演示。

from time import sleep
from flask import Flask, request, Response

app = Flask(__name__)

@app.route('/events')
def events():
    return Response(_events(), mimetype="text/event-stream")

def _events():
    while True:
        # yield "Test"  # Works fine
        yield request.args[0]  # Throws RuntimeError: Working outside of request context
        sleep(1)

有没有办法访问服务器发送事件的请求上下文?

您可以使用 @copy_current_request_context 装饰器复制您的事件流函数可以使用的请求上下文:

from time import sleep
from flask import Flask, request, Response, copy_current_request_context

app = Flask(__name__)

@app.route('/events')
def events():
    @copy_current_request_context
    def _events():
        while True:
            # yield "Test"  # Works fine
            yield request.args[0]
            sleep(1)

    return Response(_events(), mimetype="text/event-stream")

请注意,为了能够使用此装饰器,必须将目标函数移动到具有源请求的视图函数中。