Отправить ответ на EventSource после webook (Flask + uWSGI + nginx)
У меня есть приложение Flask с маршрутом (webhook), получающее POST-запросы (webhooks) от внешнего телефонного приложения (входящий вызов = POST-запрос). Этот маршрут устанавливает threading.Event.set(), и на основе этого события другой маршрут (источник событий) отправляет поток событий в открытое соединение EventSource на веб-странице, созданной еще одним маршрутом (eventstream).
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 открывается и должен быть обработан входящий веб-крючок, весь флеш-сервер зависает (и для всех остальных пользователей), страница перестает загружаться, и я не могу найти, где находится ошибка. Я только знаю, запрос POST от внешнего приложения получен, но ответ на EventSource не сделан. Я подозреваю, что это как-то связано с процессами - подключение к EventSource из JavaScript - это один процесс, маршрут веб-крюка - другой, и они не взаимодействуют. Так или иначе, я полагаю, что это должно быть очень тривиальным решением, но я не нашел его в последние 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`