Я пытаюсь настроить небольшой сервер для обработки запросов 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 для меня ? Почему сервер отбрасывает неверный запрос (иногда)?
Спасибо за разъяснение! Я определенно не шутил, когда сказал, что у меня нет опыта в этом. Если я придерживаюсь длинного опроса, вы знаете, почему эта ошибка о плохих запросах продолжается? Он не дает больше информации, чем эта ошибка. – zeck
Для долгого опроса сервер должен иметь возможность обрабатывать два одновременных запроса для каждого клиента в том же процессе. Таким образом, единственными веб-серверами, которые могут работать с длинным опросом, являются те, которые используют потоки. Многопроцессорные веб-серверы на основе многократного использования не могут выполнять длительный опрос. – Miguel