Глава 22 · Веб-разработка с Python

Развёртывание Flask-приложения

Сервер разработки Flask удобен локально — но не для того, что доступно всему интернету.

Раздел 22.5 запускал приложение командой python app.py, которая внутри вызывает app.run(debug=True). Это сервер разработки (development server) — встроенный во Flask, удобный для локальной работы, но не предназначенный для реальной эксплуатации. Раздел «Deploying to Production» официальной документации Flask прямо предупреждает об этом.

Среда разработкиРабочее развёртывание
Кто используетВы сами, локальноРеальные пользователи через интернет
СерверВстроенный сервер разработки FlaskОтдельный сервер приложений (раздел 22.19)
debug=TrueУдобно — подробные ошибки, автоперезапускОпасно — может показать посторонним внутренние детали кода и данные
Секреты (SECRET_KEY и т.п.)Можно временное значение для локальной работыОбязательно отдельное, не публикуемое значение
debug=True в открытом приложении — реальная уязвимость
В режиме отладки Flask может показать интерактивный отладчик с полным доступом к выполнению кода прямо в браузере при необработанной ошибке. Это огромное удобство локально и серьёзный риск, если приложение доступно кому-то ещё, — отладочный режим должен быть выключен в любом развёртывании, доступном не только вам.

Путь запроса до рабочего приложения

Браузер
пользователь в интернете
HTTPS / обратный прокси
раздел 22.10
Сервер приложений
Gunicorn, Uvicorn… (раздел 22.19)
Flask-приложение
та же логика, что и локально
База данных
отдельное надёжное хранилище
Тот же Flask-код — но между браузером и им теперь несколько дополнительных слоёв

Конфигурация через переменные окружения

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

app.py
app.config["DATABASE"] = os.environ.get("TODO_APP_DB", str(DEFAULT_DB_PATH))
app.config["SECRET_KEY"] = os.environ.get(
    "TODO_APP_SECRET_KEY", "dev-only-secret-do-not-use-in-production"
)

Так один и тот же код работает и локально (без единой настройки), и в другом окружении — там, где нужно, значения переменных окружения просто задают иначе, не трогая сам код.

Логи, несколько процессов, персистентность

У рабочего развёртывания есть и другие практические заботы, которые выходят за рамки этой главы: логи (записанная история происходящего, чтобы разбирать проблемы постфактум), запуск нескольких процессов или потоков одновременно для обработки параллельных запросов, и то, что база данных должна физически находиться на надёжном, не исчезающем хранилище. Мы намеренно не превращаем эту главу в учебник по эксплуатации — где эта тема продолжается, показывает раздел 22.36.

Официальная документация: Flask — Deploying to Production.