Сервер отправляет события с помощью Flask и Google App Engine - PullRequest
0 голосов
/ 18 июня 2019

Я пытался заставить работать веб-приложение, использующее события, отправленные сервером. Приложение, которое я написал, работает на моей локальной машине при использовании метода Flask app.run(). Но когда я запускаю его на GAE, я не смог заставить его работать.

Веб-приложение время от времени использует SSE для публикации сообщения с текущим временем. Клиент просто добавляет его в HTML-код div.

Приложение для колб

import random

from datetime import datetime
from flask import render_template, Response
from time import sleep

from message_server import app

def event_stream():
    while True:
        time_now = datetime.now()
        message = "New message at time: {0}".format(time_now.strftime("%H:%M:%S"))
        yield "event: {0}\ndata: {1}\n\n".format("listen", message)
        sleep(random.randint(1, 5))


@app.route('/')
def hello():
    return render_template('home.html')


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

Javascript в home.html

var source = new EventSource("/stream");
source.onmessage = function(event) {
  document.getElementById("messages").innerHTML += event.data + "<br>";
};

source.addEventListener("listen", function(event) {
  document.getElementById("messages").innerHTML += event.data + "<br>";
}, false);

GAE app.yaml

runtime: python
env: flex

entrypoint: gunicorn -b :$PORT --worker-class gevent --threads 10 message_server:app

runtime_config:
    python_version: 3

manual_scaling:
  instances: 1
resources:
  cpu: 1
  memory_gb: 0.5
  disk_size_gb: 10

Моя структура каталогов следующая:

app.yaml
/message_server
    __init__.py
    sse.py
    /templates
        home.html

message_server - упаковка, в которой находится колба app.

Я использую Firefox 67 для тестирования своего приложения.

  • На вкладке «Сеть» консоли разработчика Firefox я вижу запрос GET, сделанный для /stream, но ответа не получено даже через минуту.
  • В логах GAE я вижу "GET /stream" 499.

Как мне понять, что не так?

1 Ответ

1 голос
/ 19 июня 2019

Я нашел ответ при просмотре документации Google App Engine - на этой странице: https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-handled

По сути, вы хотите, чтобы следующий заголовок в ответе HTTP для SSE работал:

X-Accel-Buffering: no

Это отключает буферизацию, которая включена по умолчанию. Я проверил это, и SSE работает, как и ожидалось.

...