Автозавантажувати додаток python Flask при зміні коду


205

Я досліджую, як розробити гідний веб-додаток з Python. Оскільки я не хочу, щоб якісь структури високого порядку перешкоджали моєму вибору, мій вибір впав на полегшену колбу . Час покаже, чи це був правильний вибір.

Отже, зараз я створив сервер Apache з mod_wsgi, і мій тестовий сайт працює нормально. Однак я хотів би прискорити розпорядок розробки, змусивши сайт автоматично перезавантажуватися після будь-яких змін у файлах py або шаблонів, які я вношу. Я бачу, що будь-які зміни у .wsgi-файлі сайту викликають перезавантаження (навіть без WSGIScriptReloading On у конфігураційному файлі apache), але мені все одно доводиться продавати його вручну (тобто вставляти додатковий рядок, зберігати). Чи є спосіб, як викликати перезавантаження, коли я редагую деякі з py-файлів програми? Або від мене очікується використання IDE, який оновлює файл .wsgi для мене?

Відповіді:


233

Поточний рекомендований спосіб - 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. Не проблема з кодом, але, схоже, колба не визнає зміни в налаштуваннях.
citynorman

211

Якщо ви говорите про тестові / розробницькі середовища, то просто скористайтеся опцією налагодження. Він автоматично завантажить додаток у колбу, коли станеться зміна коду.

app.run(debug=True)

Або з оболонки:

$ export FLASK_DEBUG=1
$ flask run

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


6
Це працює лише тоді, коли ви запускаєте сайт через вбудований сервер розробки. Але не під час запуску через wsgi, на Apache. І я не наполягаю, що мені дуже потрібно запустити його на Apache, тому, можливо, те, що ви пропонуєте, це правильний спосіб зробити це.
Пассідай

4
правильно. У середовищі розробників вбудований сервер працює дуже добре, і вам не потрібно винаходити колесо для перезавантаження програми. Настійно раджу просто використовувати вбудований сервер для розробників. цілей. У будь-якому разі, ви не хочете автоматично перезавантажувати додаток при кожній зміні коду.
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". Ваш сценарій uWSGI ini (який підтримує Supervisord - очевидно) містить десь цей рядок:

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

Я сподіваюся, що це допомагає!


1
Дякую за чудову пораду. Я трохи спростив це. Створіть сценарій bash, який зачіпає себе при виконанні. Таким чином, запускати його потрібно лише тоді, коли потрібно перезавантажити. Моє рішення: # touch_me_and_reload.sh touch $ 0
Jabba

@Ewan. де повинна знаходитися лінія сенсорного перезавантаження? розділ [program: uwsig] або розділ [supervisord]?
користувач805981

@ user805981 - ні, окремий .iniфайл конфігурації uwsgi . Якщо ви читаєте документацію на "touch-reload", це конфігурація uWSGI, а не супервізор.
Еван

Дякую за це 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лише для того, щоб переконатися, що він увімкнено
  • Flask CLI тепер автоматично читатиме такі речі, як, FLASK_APPі FLASK_ENVякщо у вас є .envфайл у корені проекту та встановлено python-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кожен раз, коли вам потрібно. Але використання іншого файлу конфігурації для обробки фактичного робочого середовища здається кращим рішенням, тому я настійно рекомендую використовувати цей метод.


Ідеально! також не забудьте включити FLASK_APPзмінну у .flaskenvфайл.
Секвіль

2

Кольорові програми можна додатково виконувати в режимі налагодження. У цьому режимі два дуже зручні модулі сервера розробки, які називаються перезавантажувачем та налагоджувачем , увімкнено за замовчуванням. Коли перезавантажувач увімкнено, Flask відстежує всі файли вихідного коду вашого проекту та автоматично перезапускає сервер, коли будь-який із файлів змінено.

За замовчуванням режим налагодження відключений. Щоб увімкнути це, встановіть FLASK_DEBUG=1змінну середовища перед тим, як викликати колбу 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 = "розвиток"

колба бігати

Над цим слід попрацювати


Можливо, було б корисно додати трохи більше контексту до цієї ідеї, наприклад, який набір інструментів, операційна система хоста тощо.
Манфред

0

з терміналу u можна просто сказати

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

або у файлі ур

if __name__ == "__main__":
    app.run(debug=True)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.