Отправить ответ на 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`

0 ответов

Другие вопросы по тегам