当前位置:  开发笔记 > 编程语言 > 正文

使用eventlet来管理Flask中的socketio

如何解决《使用eventlet来管理Flask中的socketio》经验,为你挑选了1个好方法。

我正在尝试设置一个小型服务器来处理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服务器?为什么服务器吐出错误的请求(有时)?



1> Miguel..:

要使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(app)应该为我启动eventlet服务器?

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

该烧瓶SocketIO文档描述了有效的几个部署方案.

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有