⚖️ Старый и современный подход к Flask-приложению

⚡ Различия в двух словах

Старый: всё в одном файле app.py, глобальный объект app, сложно тестировать.

Новый: Application Factory — функция создаёт приложение по запросу, легко тестировать, конфигурировать и масштабировать.

Вывод: для учёбы и прототипов подходит монолитный файл, для реальных проектов — Application Factory.

📜 Как показано в исходном PDF (и в большинстве туториалов)

# app.py — всё в одном файле
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello, Flask!'

if __name__ == '__main__':
    app.run(debug=True)

Что здесь происходит: создаём глобальный объект app, навешиваем на него маршруты, запускаем. Это просто и понятно для первого знакомства.

❌ Почему этот подход может быть не лучшим сейчас

  • Глобальное состояние: объект app создаётся при импорте модуля. Это мешает тестированию — нельзя легко создать второй экземпляр приложения с другой конфигурацией.
  • Циклические импорты: при росте проекта часто возникают ситуации, когда views.py импортирует app из app.py, а app.py импортирует views.py.
  • Сложность конфигурации: конфигурацию приходится загружать до создания app, что не всегда удобно.
  • Масштабирование: при переходе на WSGI-сервер (gunicorn) глобальный app может вызвать проблемы с импортами.

✅ Рекомендуемый современный вариант: Application Factory

# app/__init__.py
from flask import Flask

def create_app(config_name='development'):
    app = Flask(__name__)
    app.config.from_object(f'config.{config_name}')

    from . import routes
    app.register_blueprint(routes.bp)

    return app
# app/routes.py
from flask import Blueprint

bp = Blueprint('main', __name__)

@bp.route('/')
def hello():
    return 'Hello, Flask!'
# run.py
from app import create_app

app = create_app()

if __name__ == '__main__':
    app.run(debug=True)

Что улучшилось:

  • Нет глобального состояния: приложение создаётся функцией create_app() по требованию.
  • Легко тестировать: в тестах можно создать create_app('testing') с отдельной конфигурацией.
  • Blueprints: маршруты разбиваются на модули, избегая циклических импортов.
  • Гибкость конфигурации: конфигурация передаётся при создании приложения.
Преимущества Application Factory:
  • Проще тестировать (создаём приложение с тестовой конфигурацией).
  • Проще масштабировать (добавляем Blueprints, расширения).
  • Избегаем циклических импортов.
  • Соответствует рекомендациям Flask документации.

🕰️ Когда старый подход ещё можно встретить

Старый подход (всё в одном файле) до сих пор встречается в:

  • Учебных туториалах и курсах (включая текущий PDF) — для простоты восприятия.
  • Прототипах и скриптах «на коленке».
  • Микросервисах с 2-3 эндпоинтами, где factory — избыточность.

Как мигрировать: начните с одного файла, как в уроке. Когда проект вырастет до 5+ маршрутов, разделите на factory + blueprints.