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

101

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

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

Теги:
flask
web

6 ответов

82
Лучший ответ

Текущий рекомендуемый способ (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
    или pyvenv в python3.5, работа с flask run также работает, так как когда вы pip install flask , исполняемый файл фляги также устанавливается в venv/bin/ .
  • 0
    спасибо, это должен быть принятый ответ сейчас.
Показать ещё 1 комментарий
137

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

app.run(debug=True)

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

$ export FLASK_DEBUG=1
$ flask run

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

  • 6
    Это работает только при запуске сайта через встроенный сервер разработки. Но не при запуске через wsgi, на Apache. И я не настаиваю на том, что мне действительно нужно запускать его на Apache, поэтому, возможно, то, что вы предлагаете, является правильным способом сделать это.
  • 3
    правильный. В среде разработки встроенный сервер работает очень хорошо, и вам не нужно изобретать колесо для перезагрузки приложения. Я настоятельно советую вам просто использовать встроенный сервер для разработки. цели. В любом случае, в prod вы не хотите автоматически перезагружать приложение при каждом изменении кода.
32

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

Отладчик 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'

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

  • 1
    Спасибо за отличный совет. Я немного упростил это. Создайте bash-скрипт, который сам трогается при выполнении. Таким образом, вам нужно только запустить его, когда вы хотите перезагрузить. Мое решение: # touch_me_and_reload.sh touch $ 0
  • 0
    @Ewan. где должна быть линия сенсорной перезагрузки? раздел [program: uwsig] или раздел [supervisord]?
Показать ещё 1 комментарий
19

Если вы используете 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, это приведет к ошибке плохого шлюза.

3

Несколько обновлений для 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
  • вот рабочая ссылка на документацию (ссылка принятого ответа не работает)
0

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

PYTHONUNBUFFERED = 1; FLASK_DEBUG = 1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню