1

我有带有路由(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`
4

0 回答 0