gevent-socketio + Flask + Gunicorn

时间:2012-11-25 12:35:01

标签: socket.io flask gevent gunicorn

我可以在Gunicorn下运行Flask-socketio,还能享受Flask提供的漂亮异常打印,调试器和重载功能吗?我的枪手工作者和WSGI应用程序类怎么样?

3 个答案:

答案 0 :(得分:11)

我遇到了完全相同的问题所以我通过使用看门狗来解决它。

pip install watchdog

与此命令一起:

watchmedo shell-command --patterns="*.py*;;*.less;*.css;*.js;*.txt;*.html" --recursive --command='kill -HUP `cat /tmp/gunicorn.pid` && echo "Reloading code" >> /tmp/gunicorn.log' ~/projectfolder

它需要(嗯,不是真的,但是我将“重新加载代码”指向同一个日志文件中,所以这是一件好事)你守护着gunicorn进程,我喜欢这样:

<强> gunicorn_config.py

workers = 2
worker_class = 'socketio.sgunicorn.GeventSocketIOWorker'
bind = '0.0.0.0:5000'
pidfile = '/tmp/gunicorn.pid'
debug = True
loglevel = 'debug'
errorlog = '/tmp/gunicorn.log'
daemon = True

启动应用程序:

gunicorn run:app -c gunicorn-config.py

查看日志:

tail -f /tmp/gunicorn.log

从这一点开始,应该在项目中的每次更改时重新加载所有内容。 这有点复杂但是因为带有工人(或内置的socketio-server)的gunicorn没有任何重新加载功能,所以我必须这样做。

与其他答案中的装饰器解决方案相比,这是一种不同的方法,但我喜欢将实际代码保持在特定于开发的解决方案中。两者都完成了同样的事情,所以我猜你只需选择你喜欢的解决方案。 :)

哦,作为一个额外的好处,你可以在开发中使用生产服务器,这意味着两个环境相互匹配。

答案 1 :(得分:5)

我最近一直在研究这个问题。我不认为你可以轻松地使用Flask + gevent-socket.io + Gunicorn的自动加载功能。 Gunicorn是一个生产服务器,本身不允许这样的功能。

但是,我为我的开发服务器找到了一个不错的解决方案:用户提供的SocketIOServer和一个用于自动加载的Flask片段。这是启动脚本(runserver.py):

from myapp import app
from gevent import monkey
from socketio.server import SocketIOServer
import werkzeug.serving

# necessary for autoreload (at least)
monkey.patch_all()

PORT = 5000

@werkzeug.serving.run_with_reloader
def runServer():
    print 'Listening on %s...' % PORT
    ws = SocketIOServer(('0.0.0.0', PORT), app, resource="socket.io", policy_server=False)
    ws.serve_forever()

runServer()

此解决方案的灵感来自:http://flask.pocoo.org/snippets/34/

答案 2 :(得分:3)

我对Werkzeug调试器进行了一些调整,所以它现在可以与socket.io命名空间一起使用,见下文并享受:)

https://github.com/aldanor/SocketIO-Flask-Debug