我有带有路由(webhook)的 Flask 应用程序从外部电话应用程序(来电 = POST 请求)接收 POST 请求(webhook)。此路由设置 threading.Event.set() 并基于此事件,另一个路由 (eventsource) 将事件流发送到由另一个路由 (eventstream) 创建的网页上打开的 EventSource 连接。
telfa_called = Event()
telfa_called.clear()
call = ""
@telfa.route('/webhook', methods=['GET', 'POST'])
def webhook():
global call
print('THE CALL IS HERE')
x = request.data
y = ET.fromstring(x.decode())
caller_number = y.find('caller_number').text
telfa_called.set() # setting threading.Event for another route
return Response(status=200)
@telfa.route('/eventstream', methods = ['GET','POST'])
@login_required
def eventstream():
jsid = str(uuid.uuid4())
return render_template('telfa/stream.html', jsid=jsid)
def eventsource_gen():
while 1:
if telfa_called.wait(10):
telfa_called.clear()
print('JE TO TADY')
yield "data: {}\n\n".format(json.dumps(call))
@telfa.route('/eventsource', methods=['GET', 'POST'])
def eventsource():
return Response(eventsource_gen(), mimetype='text/event-stream')`
在纯 Python 应用程序中进行测试时,一切都很好。问题开始了,当我将它移动到生产服务器时,我将 uWSGI 与 nginx 一起使用。(这个 Python 应用程序的其他部分可以正常工作。)
当打开 eventSource 连接并且应该处理传入的 webhook 时,整个烧瓶服务器卡住(对于所有其他用户也是如此),页面停止加载并且我找不到错误所在。我只知道,收到了来自外部应用程序的 POST 请求,但没有对 EventSource 做出响应。我怀疑它与进程有关——来自 JavaScript 的 EventSource 连接是一个进程,webhook 路由是另一个进程——它们不通信。左右,我想这必须有非常微不足道的解决方案,但我在过去的 3 天三夜没有找到它。请问有什么提示吗?提前致谢。
要完整,这是我的 uwsgi 配置文件:
[uwsgi]
module = wsgi:app
enable-threads = true
master = true
processes = 5
threads = 2
uid = www-data
gid= www-data
socket = /tmp/myproject.sock
chmod-socket = 666
vacuum = true
die-on-term = true
limit-as=512
buffer-size = 512000
workers = 5
max-requests = 100
req-logger = file:/tmp/uwsg-req.log
logger = file:/tmp/uwsgi.log`