Развёртывание Flask
После завершения разработки приложение Flask необходимо развернуть в производственной среде, чтобы реальные пользователи могли получить к нему доступ.
В этой главе описаны ключевые шаги и аспекты перехода от разработки к производству.
Сервер разработки против производственного сервера
Важно: встроенный сервер разработки Flask (flask run) подходит только для сред разработки. Ему не хватает безопасности, стабильности и производительности, необходимых для производства. В производственных средах необходимо использовать профессиональный сервер WSGI.
| Особенности | Сервер разработки Flask | Производственный сервер WSGI (Gunicorn/Waitress) |
|---|---|---|
| Обработка параллелизма | Однопоточный (по умолчанию) | Многопроцессный/Многопоточный/Корутинный |
| Безопасность | Режим отладки позволяет выполнять код в браузере | Нет функций отладки, безопасно и контролируемо |
| Производительность | Неоптимизированный | Оптимизированный для высокой конкурентности |
| Применимые сценарии | Локальная разработка и отладка | Продакшен-среда |
Контрольный список развёртывания
Перед развёртыванием убедитесь, что все перечисленные ниже пункты выполнены:
Пример
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
Пример
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 выполняет балансировку нагрузки, распределяя запросы между несколькими бэкенд-воркерами
Минимальный пример конфигурации Nginx:
Пример
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 запускалось при загрузке и автоматически перезапускалось после сбоя:
Пример
[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Контейнеризованное развёртывание для дальнейшего повышения переносимости