python - Flask中使用eventlet管理socketio

标签 python flask flask-socketio

我正在尝试设置一个小型服务器来处理 HTTP 和 socketio 请求——我没有太多设置服务器的经验,但现在 apache2 可以很好地处理 http。然而,socketio 事务一直失败,错误代码为 400(错误请求),我在服务器日志中看到一些奇怪的错误。有时我会看到一个 engineio 错误并且服务器响应一个“错误的请求”和代码 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 协议(protocol)需要非官方扩展来支持该协议(protocol)。

Flask-SocketIO 支持多种支持 WebSocket 的网络服务器。您的虚拟环境中似乎安装了 eventlet,因此您会收到必须使用 eventlet Web 服务器的错误消息。

您似乎没有意识到,您正在使用 Apache 的 Web 服务器(我猜是 mod_wsgi?)。这个网络服务器是一个普通的、 fork 的网络服务器,它不是一个 eventlet 兼容的网络服务器。

Isn't the socketio.run(app) supposed to start the eventlet server for me?

是的,如果您要通过 socketio.run(app) 运行您的应用程序,您将获得一个完全启用的 eventlet web 服务器。但你并没有这样做,你是在 apache 上运行它。 Eventlet 有一个 web 服务器,而 apache 有一个 web 服务器,它们是两个独立的 web 服务器,都能够运行一个 WSGI 应用程序。但是 apache 不支持 WebSocket。

Flask-SocketIO documentation描述了一些有效的部署方案。

关于python - Flask中使用eventlet管理socketio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34735206/

相关文章:

python - 元音索引 : Python error "' in <string >' requires string as left operand, not int"

nginx - 混合内容: page at https was loaded over https but requested an insecure

python - 联合类型实际上存在于 python 中吗?

python - 将图像添加到 pandas 数据框行

flask - Flask-Caching 如何/在哪里存储数据?

html - 是否可以使用 flask 执行包含?

Python:Hello world with Flask 给我一个与 app.run(debug=True) 相关的错误

javascript - 从 Flask 套接字检索消息引发 "Invalid left-hand side in assignment"

Flask-SQLAlchemy 的 Flask-socketio 上下文

python - Redis:如何解析列表结果