Автоматическая перезагрузка приложения Python Flask при изменении кода

Я изучаю, как разработать приличное веб-приложение с Python. Поскольку я не хочу, чтобы некоторые высококлассные структуры мешали мне, мой выбор упал на облегченную фляжную структуру. Время покажет, был ли это правильный выбор.

Итак, теперь я настроил сервер Apache с mod_wsgi, и мой тестовый сайт работает нормально. Тем не менее, я бы хотел ускорить процедуру разработки, сделав сайт автоматически перезагруженным при любых изменениях в файлах py или шаблонов, которые я делаю. Я вижу, что любые изменения в файле .wsgi сайта приводят к перезагрузке (даже без WSGIScriptReloading On в конфигурационном файле apache), но мне все равно придется его вручную выталкивать (т.е. Вставлять дополнительные строки, сохранять). Есть ли способ вызвать перезагрузку, когда я редактирую некоторые файлы app py? Или я ожидаю использовать IDE, которая обновляет файл .wsgi для меня?

Ответ 1

Текущий рекомендуемый способ (Flask >= 0.11) - с утилитой командной строки flask.

http://flask.pocoo.org/docs/0.11/server/

Пример:

$ export FLASK_APP=main.py
$ export FLASK_DEBUG=1
$ python -m flask run

или в одной команде:

$ FLASK_APP=main.py FLASK_DEBUG=1 python -m flask run

Я предпочитаю python -m flask run, а не flask run, потому что первая также работает с virtualenv.

Если вам нужен другой порт, чем параметр по умолчанию (5000), добавьте --port.

Пример:

$ python -m flask run --port 8080

Дополнительные параметры доступны с помощью

$ python -m flask run --help

Ответ 2

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

app.run(debug=True)

Или из оболочки:

$ export FLASK_DEBUG=1
$ flask run

http://flask.pocoo.org/docs/quickstart/#debug-mode

Ответ 3

В средах тестирования/разработки

Отладчик werkzeug уже имеет функцию автозагрузки, которую можно включить, выполнив одно из следующих действий:

app.run(debug=True)

или

app.debug = True

Вы также можете использовать отдельный файл конфигурации для управления всей своей настройкой, если вам нужно. Например, я использую параметр "settings.py" с опцией "DEBUG = True". Импортировать этот файл также легко,

app.config.from_object('application.settings')

Однако это не подходит для производственной среды.

Производственная среда

Лично я выбрал Nginx + uWSGI поверх Apache + mod_wsgi по нескольким причинам производительности, а также по настройкам. Параметр touch-reload позволяет указать файл/папку, которая заставит приложение uWSGI перезагрузить недавно развернутое фляжное приложение.

Например, ваше обновление script отключает ваши новейшие изменения и затрагивает файл reload_me.txt. Ваш uWSGI ini script (который поддерживается Supervisord - очевидно) имеет эту строку где-то:

touch-reload = '/opt/virtual_environments/application/reload_me.txt'

Надеюсь, это поможет!

Ответ 4

Если вы используете uwsgi, просмотрите опцию автоматической перезагрузки python:

uwsgi --py-autoreload 1

Пример uwsgi-dev-example.ini:

[uwsgi]
socket = 127.0.0.1:5000
master = true
virtualenv = /Users/xxxx/.virtualenvs/sites_env
chdir = /Users/xxx/site_root
module = site_module:register_debug_server()
callable = app
uid = myuser
chmod-socket = 660
log-date = true
workers = 1
py-autoreload = 1

site_root/__ __ INIT. Ру

def register_debug_server():
    from werkzeug.debug import DebuggedApplication

    app = Flask(__name__)
    app.debug = True
    app = DebuggedApplication(app, evalex=True)
    return app

Затем запустите:

uwsgi --ini uwsgi-dev-example.ini

Примечание. Этот пример также позволяет отладчику.

Я пошел по этому маршруту, чтобы подражать производству как можно ближе к моей настройке nginx. Просто запуская приложение флеш с его встроенным веб-сервером позади nginx, это приведет к ошибке плохого шлюза.

Ответ 5

Несколько обновлений для Flask 1.0

Основной подход к горячей перезагрузке:

$ export FLASK_APP=my_application
$ export FLASK_ENV=development
$ flask run
  • Вы должны использовать FLASK_ENV=development (не FLASK_DEBUG=1)
  • в качестве проверки безопасности вы можете запустить flask run --debugger только для того, чтобы убедиться, что она flask run --debugger
  • CLI Flask теперь будет автоматически читать такие вещи, как FLASK_APP и FLASK_ENV если у вас есть файл .env в корне проекта (из-за интеграции с python-dotenv)
  • вот рабочая ссылка на документацию (ссылка принятого ответа не работает)

Ответ 6

Для достижения этого в PyCharm установите раздел "Переменные среды" в:

PYTHONUNBUFFERED = 1; FLASK_DEBUG = 1

Для Flask "запуск/отладка конфигураций"

Ответ 7

лучший Sloution - использовать usereloader

if __name__=='__main__':

    app.run(port=5000,debug=True,use_reloader=True)