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

205

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

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

Passiday
источник

Ответы:

234

В настоящее время рекомендуется использовать flaskутилиту командной строки.

https://flask.palletsprojects.com/en/1.1.x/quickstart/#debug-mode

Пример:

$ export FLASK_APP=main.py
$ export FLASK_ENV=development
$ flask run

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

$ FLASK_APP=main.py FLASK_ENV=development flask run

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

Пример:

$ FLASK_APP=main.py FLASK_ENV=development flask run --port 8080

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

$ flask run --help
Эяль Левин
источник
3
или pyvenv в python3.5, flask runтакже работает, так как когда вы pip install flask, в папке также устанавливается исполняемый файл фляги venv/bin/.
TonyTony
Это простое решение, которое может быть переведено в Docker для целей разработки. Это же решение можно увидеть здесь .
1
Работает нормально, но, похоже, это не работает в Ubuntu с кодом в разделе NTFS. Не проблема с кодом, но колба, похоже, не распознает изменения в этой настройке.
горожанин
211

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

app.run(debug=True)

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

$ export FLASK_DEBUG=1
$ flask run

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

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

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

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

app.run(debug=True)

или

app.debug = True

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

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

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

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

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

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

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

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

Ewan
источник
1
Спасибо за отличный совет. Я немного упростил это. Создайте сценарий bash, который прикасается к себе самому. Таким образом, вам нужно только запустить его, когда вы хотите перезагрузить. Мое решение: # touch_me_and_reload.sh touch $ 0
Jabba
@Ewan. где должна быть линия сенсорной перезагрузки? раздел [program: uwsig] или раздел [supervisord]?
user805981
@ user805981 - ни один, отдельный .iniфайл конфигурации uwsgi . Если вы читаете документацию по «touch-reload», она находится в конфигурации uWSGI, а не supervisor.
Эван
Спасибо за это. app.run(debug=True)не удается, но настройка переменной среды работает.
Ари
23

Если вы используете 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__.py

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, вы получите ошибку шлюза.

Кайл Джеймс Уокер
источник
16

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

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

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

У меня другая идея:

Первый:

pip install python-dotenv

Установите python-dotenvмодуль, который будет читать локальные настройки для среды вашего проекта.

Во-вторых:

Добавьте .flaskenvфайл в каталог вашего проекта. Добавьте следующий код:

FLASK_ENV=development

Это сделано!

С этим конфигом для вашего проекта Flask, когда вы запустите flask runи увидите этот вывод в вашем терминале:

введите описание изображения здесь

И когда вы редактируете свой файл, просто сохраните изменения. Вы увидите, что автоперезагрузка для вас:

введите описание изображения здесь

С дополнительным объяснением:

Конечно, вы можете вручную нажимать export FLASK_ENV=developmentкаждый раз, когда вам нужно. Но использование другого файла конфигурации для обработки фактической рабочей среды кажется лучшим решением, поэтому я настоятельно рекомендую этот метод, который я использую.

Anthonyeef
источник
Отлично! также не забудьте включить FLASK_APPпеременную в .flaskenvфайл.
Кекель
2

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

По умолчанию режим отладки отключен. Чтобы включить его, установите FLASK_DEBUG=1переменную окружения перед вызовом flask run:

(venv) $ export FLASK_APP=hello.py for Windows use > set FLASK_APP=hello.py

(venv) $ export FLASK_DEBUG=1 for Windows use > set FLASK_DEBUG=1

(venv) $ flask run

* Serving Flask app "hello"
* Forcing debug mode on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 273-181-528

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

Асим Фахи
источник
0

$ env: Flask_ENV = "MyAPP.py"

$ env: Flask_ENV = "разработка"

пробирка

Надо работать

Liqiang
источник
Возможно, было бы полезно добавить немного больше контекста к этой идее, например, что такое набор инструментов, операционная система хоста и т. Д.
Манфред
0

из терминала вы можете просто сказать

expoort FLASK_APP=app_name.py
export FLASK_ENV=development
flask run

или в вашем файле

if __name__ == "__main__":
    app.run(debug=True)
memesterhub
источник