首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Flask中使用eventlet管理socketio

在Flask中使用eventlet管理socketio
EN

Stack Overflow用户
提问于 2016-01-12 11:40:06
回答 1查看 18.4K关注 0票数 9

我正在尝试设置一个小型服务器来处理HTTP和socketio请求--我没有太多设置服务器的经验,但是现在apache2可以很好地为http提供服务。但是,socketio事务总是失败,错误代码为400 (请求错误),我在服务器日志中看到一些奇怪的错误。有时我看到一个引擎错误,服务器响应‘错误请求’和代码400,但总是告诉我eventlet服务器需要启动:

代码语言:javascript
运行
复制
[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

我的服务器代码非常简单:

代码语言:javascript
运行
复制
 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库:

代码语言:javascript
运行
复制
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服务器吗?为什么服务器(有时)会回吐错误的请求?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-12 23:25:51

要使WSGI应用程序在线可用,您需要通过web服务器公开它。当您的应用程序使用Flask-SocketIO时,一个普通的WSGI web服务器是不够的,因为WSGI不支持WebSocket,WSGI协议需要非官方的扩展来支持这个协议。

Flask-SocketIO支持各种支持WebSocket的web服务器。看起来你已经在你的虚拟环境中安装了eventlet,所以这就是为什么你会收到你必须使用eventlet web服务器的错误。

您似乎没有意识到,您正在使用Apache的web服务器(我猜是mod_wsgi?)。此web服务器是一个普通的分叉web服务器,它不是一个与eventlet兼容的web服务器。

不是应该由socketio.run(应用程序)为我启动eventlet服务器吗?

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

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

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34735206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档