Gunicorn で実行している Flask で gevent-socketio を使用しても、Flask が提供する優れた例外出力、デバッガー、およびリロード機能を利用できますか? gunicorn ワーカーと 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/から着想を得ています。