Flask中使用eventlet管理socketio
Using eventlet to manage socketio in Flask
我正在尝试设置一个小型服务器来处理 HTTP 和 socketio 请求 -- 我没有太多设置服务器的经验,但现在 apache2 可以很好地为 http 提供服务。然而,socketio 事务一直失败,错误代码为 400(错误请求),我在服务器日志中看到一些奇怪的错误。有时我看到 engineio 错误并且服务器响应 'bad request' 和代码 400,但它总是告诉我 eventlet 服务器需要启动:
[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-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)
不是应该为我启动 eventlet 服务器吗?为什么服务器会(有时)返回错误的请求?
要使 WSGI 应用程序在线可用,您需要通过 Web 服务器公开它。当您的应用程序使用 Flask-SocketIO 时,普通的 WSGI Web 服务器是不够的,因为 WSGI 不支持 WebSocket,WSGI 协议需要非官方扩展来支持此协议。
Flask-SocketIO支持多种支持WebSocket的网络服务器。您似乎在虚拟环境中安装了 eventlet,因此您会收到必须使用 eventlet Web 服务器的错误。
您似乎没有意识到,您正在使用 Apache 的网络服务器(我猜 mod_wsgi?)。此 Web 服务器是一个普通的分叉 Web 服务器,它不是一个 eventlet 兼容的 Web 服务器。
Isn't the socketio.run(app) supposed to start the eventlet server for me?
是的,如果您要通过 socketio.run(app)
运行 您的应用程序,您将获得一个完全启用的 eventlet 网络服务器。但你并没有这样做,你是在 apache 上 运行ning 它。 Eventlet 有一个 web 服务器,而 apache 有一个 web 服务器,它们是两个独立的 web 服务器,都能够 运行 一个 WSGI 应用程序。但是apache one不支持WebSocket。
Flask-SocketIO documentation 描述了一些有效的部署方案。
我正在尝试设置一个小型服务器来处理 HTTP 和 socketio 请求 -- 我没有太多设置服务器的经验,但现在 apache2 可以很好地为 http 提供服务。然而,socketio 事务一直失败,错误代码为 400(错误请求),我在服务器日志中看到一些奇怪的错误。有时我看到 engineio 错误并且服务器响应 'bad request' 和代码 400,但它总是告诉我 eventlet 服务器需要启动:
[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-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)
不是应该为我启动 eventlet 服务器吗?为什么服务器会(有时)返回错误的请求?
要使 WSGI 应用程序在线可用,您需要通过 Web 服务器公开它。当您的应用程序使用 Flask-SocketIO 时,普通的 WSGI Web 服务器是不够的,因为 WSGI 不支持 WebSocket,WSGI 协议需要非官方扩展来支持此协议。
Flask-SocketIO支持多种支持WebSocket的网络服务器。您似乎在虚拟环境中安装了 eventlet,因此您会收到必须使用 eventlet Web 服务器的错误。
您似乎没有意识到,您正在使用 Apache 的网络服务器(我猜 mod_wsgi?)。此 Web 服务器是一个普通的分叉 Web 服务器,它不是一个 eventlet 兼容的 Web 服务器。
Isn't the socketio.run(app) supposed to start the eventlet server for me?
是的,如果您要通过 socketio.run(app)
运行 您的应用程序,您将获得一个完全启用的 eventlet 网络服务器。但你并没有这样做,你是在 apache 上 运行ning 它。 Eventlet 有一个 web 服务器,而 apache 有一个 web 服务器,它们是两个独立的 web 服务器,都能够 运行 一个 WSGI 应用程序。但是apache one不支持WebSocket。
Flask-SocketIO documentation 描述了一些有效的部署方案。