我可以将 gevent-socketio 与 Flask 一起使用,在 Gunicorn 下运行,并且仍然享受 Flask 提供的出色的异常打印、调试器和重新加载功能吗?我的 gunicorn worker 和 WSGI 应用程序类会是什么样子?
3 回答
我有完全相同的问题,所以我通过使用看门狗解决了它。
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 没有任何重新加载功能,我不得不这样做。
与其他答案中的装饰器解决方案相比,这是一种不同的方法,但我喜欢保持实际代码与开发特定解决方案无关。两者都完成了同样的事情,所以我想你只需要选择你喜欢的解决方案。:)
哦,作为额外的奖励,您可以在开发中使用生产服务器,这意味着两个环境相互匹配。
我最近一直在研究这个主题。我不认为你可以轻松地使用 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/
我已经对 Werkzeug 调试器进行了一些调整,因此它现在可以与 socket.io 命名空间一起使用,请参见下文并享受 :)