Flask和Google App Engine的服务器发送事件

时间:2019-06-18 07:59:08

标签: google-app-engine flask gunicorn wsgi server-sent-events

我一直在尝试使用服务器发送事件的Web应用程序正常工作。使用Flask的app.run()方法时,我编写的应用程序可以在本地计算机上运行。但是,当我在GAE上运行它时,我却无法使其工作。

Web应用经常使用SSE发布当前时间的消息。客户端只需将其添加到div的HTML中即可。

Flask应用程序

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")

home.html中的Java语言

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开发者控制台的“网络”选项卡中,我看到对/stream的GET请求,但是一分钟后仍未收到响应。
  • 在GAE日志中,我看到"GET /stream" 499

我如何找出问题所在?

1 个答案:

答案 0 :(得分:1)

我在浏览Google App Engine文档时找到了答案-在此页面上:https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-handled

本质上,您希望HTTP响应中的以下标头可用于SSE:

X-Accel-Buffering: no

这将禁用默认情况下启用的缓冲。我对其进行了测试,并且SSE正在按我的预期工作。