11

Gunicorn で実行している Flask で gevent-socketio を使用しても、Flask が提供する優れた例外出力、デバッガー、およびリロード機能を利用できますか? gunicorn ワーカーと WSGI アプリ クラスはどのようになりますか?

4

3 に答える 3

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にはリロード機能がないため、このようにする必要がありました。

他の回答のデコレータソリューションとは異なるアプローチですが、開発固有のソリューションから実際のコードをクリーンに保つのが好きです。どちらも同じことを成し遂げるので、あなたはあなたが好きな解決策を選ぶ必要があると思います。:)

ああ、追加のボーナスとして、開発で本番サーバーを使用できるようになります。つまり、両方の環境が互いに一致します。

于 2012-11-30T10:37:37.743 に答える
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/から着想を得ています。

于 2012-11-30T10:30:42.747 に答える