Использование eventlet для управления socketio в Flask

Я пытаюсь настроить небольшой сервер для обработки запросов HTTP и socketio - у меня нет большого опыта в настройке серверов, но сейчас apache2 отлично обслуживает http. Однако транзакции socketio продолжают давать сбой с кодом ошибки 400 (неверный запрос), и я вижу некоторые странные ошибки в журналах сервера. Иногда я вижу ошибку engineio, и сервер отвечает «неверным запросом» и кодом 400, но всегда говорит мне, что сервер событий должен быть запущен:

[Mon Jan 11 19:02:54.068282 2016] [:error] [pid 4908:tid 140274923673344] [client 100.96.180.39:53473]     return ws(environ, start_response)
[Mon Jan 11 19:02:54.068305 2016] [:error] [pid 4908:tid 140274923673344] [client 100.96.180.39:53473]   File "/var/www/projectENV/lib/python2.7/site-packages/engineio/async_eventlet.py", line 10, in __call__
[Mon Jan 11 19:02:54.068342 2016] [:error] [pid 4908:tid 140274923673344] [client 100.96.180.39:53473]     raise RuntimeError('You need to use the eventlet server.')
[Mon Jan 11 19:02:54.068380 2016] [:error] [pid 4908:tid 140274923673344] [client 100.96.180.39:53473] RuntimeError: You need to use the eventlet server. See the Deployment section of the documentation for more information.
[Mon Jan 11 19:02:54.253124 2016] [:error] [pid 4909:tid 140274940458752] WARNING:engineio:Invalid session cde3f9aadbee4794bf9d7bb98d0b396e

Код моего сервера довольно прост:

 from flask import Flask
 import flaskext.couchdb
 from flask.ext.socketio import SocketIO

 # for socketio
 import eventlet
 eventlet.monkey_patch()

 # creation of server & db objects
 app = Flask(__name__)

 # socketio initialization
 socketio =  SocketIO(app, async_mode='eventlet')

 # import views once site properties are set
 from app import views

 if __name__== "__main__":
     socketio.run(app, debug=True)

И мой клиентский код, написанный на питоне, использует библиотеку socketio-client прямо из документации:

from socketIO_client import SocketIO, LoggingNamespace
with SocketIO(SERVER_URL, 80, LoggingNamespace) as socketIO:
    socketIO.emit('aaa')
    socketIO.wait(seconds=1)

Разве socketio.run(app) не должен запускать для меня сервер событий? Почему сервер выдает неверный запрос (иногда)?


person zeck    schedule 12.01.2016    source источник


Ответы (1)


Чтобы сделать приложение WSGI доступным в Интернете, вам необходимо открыть его через веб-сервер. Когда ваше приложение использует Flask-SocketIO, простого веб-сервера WSGI недостаточно, поскольку WSGI не поддерживает WebSocket, протокол WSGI нуждается в неофициальных расширениях для поддержки этого протокола.

Flask-SocketIO поддерживает множество веб-серверов, поддерживающих WebSocket. Похоже, у вас установлен eventlet в вашей виртуальной среде, поэтому вы получаете сообщение об ошибке, что вам нужно использовать веб-сервер eventlet.

Чего вы, кажется, не понимаете, так это того, что вы используете веб-сервер Apache (я полагаю, mod_wsgi?). Этот веб-сервер является обычным разветвленным веб-сервером, он не является веб-сервером, совместимым с eventlet.

Разве socketio.run(app) не должен запускать для меня сервер событий?

Да, если бы вы запускали свое приложение через socketio.run(app), вы бы получили полностью включенный веб-сервер событий. Но вы этого не делаете, вы запускаете его на апаче. У Eventlet есть веб-сервер, а у apache есть веб-сервер, это два отдельных веб-сервера, оба могут запускать приложение WSGI. Но apache не поддерживает WebSocket.

В документации Flask-SocketIO описаны несколько допустимых сценариев развертывания.

person Miguel    schedule 12.01.2016
comment
Благодарю за разъяснение! Я определенно не шутил, когда сказал, что у меня нет опыта в этом. Если я буду придерживаться длительного опроса, знаете ли вы, почему эта ошибка о неверных запросах продолжает появляться? Это не дает больше информации, чем эта одна ошибка. - person zeck; 12.01.2016
comment
Для работы длительного опроса сервер должен иметь возможность обрабатывать два одновременных запроса для каждого клиента в одном и том же процессе. Таким образом, единственные веб-серверы, которые могут работать с длинным опросом, — это те, которые используют потоки. Разветвленные многопроцессорные веб-серверы не могут выполнять длительный опрос. - person Miguel; 12.01.2016