Как я могу отправлять серверные события из Flask при доступе к контексту запроса? - PullRequest
0 голосов
/ 22 июня 2019

Я пытаюсь использовать Flask для отправки потока событий внешнему клиенту, как описано в этом вопросе .Это прекрасно работает, если я не получаю доступ к чему-либо в контексте запроса, но завершается неудачно, как только я это делаю.

Вот пример для демонстрации.

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)

Есть ли способ доступаконтекст запроса для отправленных сервером событий?

1 Ответ

0 голосов
/ 22 июня 2019

Вы можете использовать декоратор @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")

Обратите внимание, что для возможности использования этого декоратора целевая функция должна бытьперемещено в функцию представления, которая имеет исходный запрос.

...