Развёртывание Flask

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

В этой главе описаны ключевые шаги и аспекты перехода от разработки к производству.


Сервер разработки против производственного сервера

Важно: встроенный сервер разработки Flask (flask run) подходит только для сред разработки. Ему не хватает безопасности, стабильности и производительности, необходимых для производства. В производственных средах необходимо использовать профессиональный сервер WSGI.

Особенности Сервер разработки Flask Производственный сервер WSGI (Gunicorn/Waitress)
Обработка параллелизма Однопоточный (по умолчанию) Многопроцессный/Многопоточный/Корутинный
Безопасность Режим отладки позволяет выполнять код в браузере Нет функций отладки, безопасно и контролируемо
Производительность Неоптимизированный Оптимизированный для высокой конкурентности
Применимые сценарии Локальная разработка и отладка Продакшен-среда

Контрольный список развёртывания

Перед развёртыванием убедитесь, что все перечисленные ниже пункты выполнены:

Пример

# Путь к файлу: app.py (Проверки конфигурации продакшен-среды)
import os

app.config.update(
    # 1. Отключите режим отладки (обязательно!)
    DEBUG=False,

    # 2. Чтение секретного ключа из переменных окружения (никогда не хардкодить его)
    SECRET_KEY=os.environ.get("FLASK_SECRET_KEY", ""),

    # 3. Настройте параметры безопасности cookie сессии
    SESSION_COOKIE_SECURE=True,   # Передавать только по HTTPS
    SESSION_COOKIE_HTTPONLY=True, # Блокировать доступ из JavaScript
    SESSION_COOKIE_SAMESITE="Lax",  # Предотвратить CSRF-атаки
)

Полный контрольный список:

Пункт проверки Описание Уровень риска
DEBUG = False Отключите режим отладки, чтобы предотвратить утечку кода Критично
SECRET_KEY случайный и секретный Сессия и flash зависят от подписи ключом Критично
SECRET_KEY считывается из переменных окружения Никакого хардкода, не коммитьте в Git Критично
Читайте пароли к базе данных из переменных окружения Чувствительная информация не в коде Критично
SESSION_COOKIE_SECURE = True Отправляйте cookie только по HTTPS Высокая
Страницы ошибок не раскрывают информацию трассировки стека Используйте пользовательский errorhandler Средняя

Развёртывание с Waitress (Windows/macOS/Linux)

WaitressЭто WSGI-сервер на чистом Python, кроссплатформенный и простой в установке:

(.venv) $ pip install waitress

Пример

# Путь к файлу: run.py (скрипт запуска для продакшена)
from waitress import serve
from app import create_app

app = create_app()

if __name__ == "__main__":
    # Запуск production-сервера
    serve(app, host="0.0.0.0", port=8000, threads=4)
    # host="0.0.0.0" разрешает внешний доступ
    # threads=4 использует 4 потока для обработки одновременных запросов

Запуск:

(.venv) $ python run.py
Serving on http://0.0.0.0:8000

Развертывание с Gunicorn (Linux/macOS)

GunicornЭто самый популярный Python WSGI-сервер на Linux с отличной производительностью:

(.venv) $ pip install gunicorn

Запуск Gunicorn (укажите приложение непосредственно в командной строке):

# 基本用法:4 个 worker 进程
$ gunicorn -w 4 -b 0.0.0.0:8000 "app:create_app()"

# 参数说明:
# -w 4       : 启动 4 个 worker 进程(通常设为 CPU 核心数 × 2 + 1)
# -b 0.0.0.0:8000 : 监听所有网络接口的 8000 端口
# "app:create_app()" : 模块名:工厂函数(与 flask --app 语法相同)

Выбор типа воркера Gunicorn:

Тип воркера Применимые сценарии Команда
sync (по умолчанию) Интенсивная нагрузка на ЦП, низкая конкурентность gunicorn -w 4 app:app
gevent Интенсивный ввод-вывод, высокая конкурентность, длительные соединения gunicorn -k gevent -w 4 app:app
gthread Средняя конкурентность, требуется поддержка потоков gunicorn --threads=2 -w 4 app:app

Gunicorn не поддерживает Windows. Если вы развёртываете на Windows, пожалуйста, используйтеWaitress。


Используйте Nginx в качестве обратного прокси

В продакшене Nginx обычно используется как обратный прокси перед WSGI-сервером:

  • Nginx обрабатывает статические файлы (CSS, JS, изображения) гораздо эффективнее, чем Python
  • Nginx обеспечивает терминацию HTTPS (терминацию SSL)
  • Nginx выполняет балансировку нагрузки, распределяя запросы между несколькими бэкенд-воркерами

Flask 生产环境部署架构

Минимальный пример конфигурации Nginx:

Пример

# Путь к файлу: /etc/nginx/sites-available/example
server {
    listen 80;
    server_name example.com www.example.com;

    # Статические файлы обрабатываются напрямую Nginx
    location /static/ {
        alias /www/example/static/static/;
        exp 30d;  # Кэш браузера на 30 дней
    }

    # Остальные запросы перенаправляются в Gunicorn
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Включите конфигурацию и перезагрузите Nginx:

$ sudo ln -s /etc/nginx/sites-available/example /etc/nginx/sites-enabled/
$ sudo nginx -t          # 检查配置语法
$ sudo systemctl reload nginx

Используйте systemd для управления службами (Linux)

Создайте файл службы systemd, чтобы приложение Flask запускалось при загрузке и автоматически перезапускалось после сбоя:

Пример

# Путь к файлу: /etc/systemd/system/example.service
[Unit]
Description=ПРИМЕР приложения Flask
After=network.target

[Service]
User=www-data
WorkingDirectory=/var/www/example
# Автоматически загружать переменные окружения из файла .env при запуске
EnvironmentFile=-/var/www/example/.env
# Запустить приложение с помощью Gunicorn
ExecStart=/var/www/example/.venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 "app:create_app()"
# Автоматически перезапускать после сбоя
Restart=always
RestartSec=5

[Установка]
WantedBy=multi-user.target

Запуск и управление службами:

$ sudo systemctl daemon-reload        # 重载配置文件
$ sudo systemctl enable example        # 设置开机自启
$ sudo systemctl start example         # 启动服务
$ sudo systemctl status example        # 查看服务状态
$ sudo journalctl -u example -f        # 实时查看日志

Краткая справка по WSGI-серверу

Server Платформа Особенности Установка
Werkzeug (встроенный) Все платформы Только для разработки, поддерживает горячую перезагрузку и отладчик Поставляется вместе с Flask
Waitress Все платформы Чистый Python, предпочтителен для Windows pip install waitress
Gunicorn Linux/macOS Хорошая производительность, предпочтительный выбор на Linux и зрелая экосистема pip install gunicorn
uWSGI Linux/macOS Полнофункциональный, сложная конфигурация pip install uwsgi

Итоги руководства

Поздравляем с завершением всего материала вводного руководства по Flask!

Давайте повторим то, что вы изучили:

Глава Ключевые навыки
Понимание Flask Понять позиционирование и экосистему Flask
Подготовка окружения Создать виртуальное окружение, установить зависимости
Первое приложение Создать минимальное приложение и использовать flask run
Система маршрутизации Сопоставление URL, правила переменных, url_for, методы HTTP
Запрос и ответ Чтение данных запроса и создание ответов различных типов
Рендеринг шаблонов Синтаксис Jinja2, наследование шаблонов, защита от XSS
Статические файлы Управление статическими ресурсами, такими как CSS/JS/изображения
Сессия и Cookie Сохранение пользовательской сессии, Flash-сообщения
Управление конфигурацией Конфигурация для нескольких сред, загрузка переменных окружения
Blueprint Модульная организация кода, фабричный паттерн
Обработка ошибок Пользовательские страницы ошибок, логирование
Интеграция базы данных Операции с SQLite, использование объекта g для управления соединениями
Тестирование test_client, pytest: тестирование маршрутов и API
Развёртывание Gunicorn/Waitress + Nginx + systemd

Рекомендуемые направления для дальнейшего обучения:

  • Flask-SQLAlchemy: Более мощная интеграция с базами данных
  • Flask-Login: Аутентификация пользователей и управление разрешениями
  • Flask-WTF: Обработка форм и защита от CSRF
  • Flask-Migrate: Управление миграциями базы данных
  • Flask-RESTfulилиFlask-RESTX: Создание RESTful API
  • DockerКонтейнеризованное развёртывание для дальнейшего повышения переносимости
Другие расширения