Gevent-socketio + Flask + Gunicorn

Можно ли использовать gevent-socketio с Flask, работающим под Gunicorn, и по-прежнему наслаждаться отличной возможностью печати, отладки и перезагрузки исключения, которые предлагает Flask? Как будет выглядеть мой рабочий класс артиллеристов и класс WSGI?

Ответ 1

У меня есть одна и та же проблема, поэтому я решил ее с помощью watchdog.

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_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

С этого момента все должно быть перезагружено с каждым изменением вашего проекта. Это немного сложно, но поскольку у пушки с рабочим (или встроенным сокет-сервером) нет никаких возможностей перезагрузки, я должен был сделать это вот так.

Это другой подход по сравнению с решением декоратора в другом ответе, но мне нравится сохранять чистый код в соответствии с конкретными решениями для разработки. Обе делают то же самое, поэтому я думаю, вам просто нужно выбрать подходящее решение.:)

О, в качестве дополнительного бонуса вы можете использовать производственный сервер в разработке, что означает, что обе среды соответствуют друг другу.

Ответ 2

Я изучал эту тему в последнее время. Я не думаю, что вы можете легко использовать функцию автозагрузки с Flask + gevent-socket.io + Gunicorn. Gunicorn - это производственный сервер, который не допускает таких функций изначально.

Однако я нашел приятное решение для моего сервера разработки: пользователь SocketIOServer предоставил библиотеку и флеш-фрагмент для автозагрузки. Вот запуск script (runningerver.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/

Ответ 3

Я сделал некоторые настройки для отладчика Werkzeug, поэтому теперь он работает с пространствами имен socket.io, см. ниже и наслаждайтесь:)

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