gpt4 book ai didi

javascript - 服务器发送的事件不是(刷新?)正确地与 Flask 和 Redis 与 nginx 前端

转载 作者:可可西里 更新时间:2023-11-01 11:35:01 24 4
gpt4 key购买 nike

我正在尝试从 PBX 服务器流式传输调用数据。我有一个接收此数据并将其发布到 Redis 中的 channel 的 Golang 后端。这个想法是在网络应用程序中获取实时通话数据。

这由两个 Flask 应用程序组成:一个是应用程序本身。它充满了 api 和 ajax 调用。第二个只是流式传输调用数据的路由。

由于截止日期,我不得不将应用程序一分为二,以解决线程化主应用程序和 ajax 调用的问题。

为了避免 CORS 问题,我设置了一个 nginx 前端。这是我的配置:

http {
include mime.types;
default_type application/octet-stream;

keepalive_timeout 65;

server {
listen 80;
server_name <domain>;

location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:5000;
}
location /stream {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
expires off; # I set this trying to debug.
proxy_pass http://127.0.0.1:5001;
}
}
}

这是流式传输代码:

@app.route('/stream/', methods=['GET'])
def event_socket_stream():
def event_stream():
stream = redis.pubsub(ignore_subscribe_messages=True)
stream.subscribe('eventsocket')
for message in stream.listen():
print(message)
yield 'data: {}\n\n'.format(message['data'])

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

我通过执行 threaded=True 来处理上述内容在app.run()打电话。

在第一个应用程序中,我提供了一些使用 JavaScript SSE api 的 jQuery:

$(document).ready(function() {
// Skipping above non-related functions.
// Event Socket Stream
var eventStream = new EventSource('/stream/');
eventStream.onmessage = function(event) {
console.log(event);
fsEvent = JSON.parse(event.data);
parseEvent(fsEvent);
};
});

Chromium 和 Firefox 都会出现此问题。当我调用 PBX 时应该发送此事件,但是,第一个调用永远不会发送。不过,我可以在页面加载时看到浏览器连接到它。

GET XHR http://<domain>/stream/

当我调用 PBX 时,浏览器绝对没有接收到任何信息。如果我第二次调用它,我会看到我应该在第一次调用时收到的调用数据。

举例说明:

调用 -> 无 -> 调用 -> 调用 1 数据 -> 调用 -> 调用 2 数据

这就是为什么我称之为“冲洗”问题。收到调用时,流似乎没有刷新数据。

如果我设置 ignore_subscribe_messages=False ,然后我在第一次调用时收到了 redis 订阅消息。

此外,如果我终止流式应用程序进程,浏览器会收到本应收到的最后一个事件。

100% 欢迎任何解决方案。

谢谢!

最佳答案

事实证明,Nginx 没有使其工作所需的 header 。这使它工作:

proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;

现在,一切都很好。

感谢在 freenode 上#redis 的 friend 们!

关于javascript - 服务器发送的事件不是(刷新?)正确地与 Flask 和 Redis 与 nginx 前端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36017515/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com