2016-01-12 3 views
4

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

[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) 

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

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

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

ответ

6

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

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

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

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

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

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

+0

Спасибо за разъяснение! Я определенно не шутил, когда сказал, что у меня нет опыта в этом. Если я придерживаюсь длинного опроса, вы знаете, почему эта ошибка о плохих запросах продолжается? Он не дает больше информации, чем эта ошибка. – zeck

+0

Для долгого опроса сервер должен иметь возможность обрабатывать два одновременных запроса для каждого клиента в том же процессе. Таким образом, единственными веб-серверами, которые могут работать с длинным опросом, являются те, которые используют потоки. Многопроцессорные веб-серверы на основе многократного использования не могут выполнять длительный опрос. – Miguel

Смежные вопросы