Можно ли использовать gevent-socketio с Flask, работающим под Gunicorn, и по-прежнему наслаждаться отличной возможностью печати, отладки и перезагрузки исключения, которые предлагает Flask? Как будет выглядеть мой рабочий класс артиллеристов и класс WSGI?
Gevent-socketio + Flask + Gunicorn
Ответ 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, см. ниже и наслаждайтесь:)