Блюпринты: масштабируем структуру

Блюпринт — это «мини-приложение»: группа связанных маршрутов, шаблонов и статики, которую регистрируют в основном приложении. Способ разбить большой проект на модули.
Когда всех маршрутов десятки, один файл становится свалкой. Блюпринт группирует связанное: auth (вход/регистрация), posts (блог), admin (панель) — каждый в своём модуле. Фабрика просто регистрирует их. Это структурный аналог наследования шаблонов.

Представь приложение на 80 маршрутов в одном views.py — навигироваться невозможно. Блюпринты решают это так же, как папки решают хаос файлов: группируют по смыслу. Каждый блюпринт — самостоятельный набор маршрутов с возможным префиксом URL и своими шаблонами.

# blog/auth.py
from flask import Blueprint
auth = Blueprint("auth", __name__, url_prefix="/auth")

@auth.route("/login")
def login():
    return "Вход"

@auth.route("/register")
def register():
    return "Регистрация"

Фабрика регистрирует блюпринты — и только тогда их маршруты «оживают»:

# __init__.py
def create_app():
    app = Flask(__name__)
    from .auth import auth
    from .views import posts
    app.register_blueprint(auth)     # /auth/login, /auth/register
    app.register_blueprint(posts)    # /posts/...
    return app

Важная деталь: endpoint внутри блюпринта именуется с префиксом — url_for("auth.login"), а не "login". Это даёт пространства имён: в разных блюпринтах могут быть функции index без конфликта.

Блюпринты — это масштабирование структуры по тому же принципу, по которому папки масштабируют файловую систему: группировка по смыслу. Большой проект естественно делится на предметные области — auth, posts, admin, api, — и каждой даёшь свой блюпринт со своим url_prefix и, при желании, своими шаблонами и статикой. Фабрика затем просто регистрирует их все. Важный механизм — пространства имён endpoint: внутри блюпринта функции живут под его именем, поэтому url_for зовётся как 'auth.login', и в разных блюпринтах могут спокойно сосуществовать одноимённые функции index без конфликтов. Импортируй блюпринты внутри create_app, а не на верхнем уровне модуля — так ты избегаешь циклических импортов, ради чего фабрика отчасти и существует.

Как работает под капотом

Блюпринт сам по себе ничего не делает — он лишь копит маршруты в отложенном виде. Реальная регистрация происходит при register_blueprint: тогда маршруты с учётом url_prefix добавляются в общую URL-карту приложения.

  Blueprint("auth", url_prefix="/auth")
     │ накапливает: login → /login, register → /register
     ▼ register_blueprint(auth) в фабрике
  URL-карта приложения:
     /auth/login    → auth.login
     /auth/register → auth.register
  endpoint'ы в пространстве имён "auth.*"

Смоделируем блюпринт как отложенный набор маршрутов с префиксом.

class Blueprint:
    def __init__(self, name, url_prefix=""):
        self.name = name
        self.url_prefix = url_prefix
        self.routes = {}
    def route(self, path):
        def deco(func):
            self.routes[path] = func
            return func
        return deco

app_map = {}
def register(bp):
    for path, func in bp.routes.items():
        full = bp.url_prefix + path
        app_map[full] = bp.name + "." + func.__name__

auth = Blueprint("auth", "/auth")
@auth.route("/login")
def login(): return "вход"
@auth.route("/register")
def register_v(): return "рег"

register(auth)
for url, endpoint in app_map.items():
    print(url, "->", endpoint)

Запусти: маршруты блюпринта попали в общую карту с префиксом /auth и именами вида auth.login. Точно так Flask собирает приложение из блюпринтов в фабрике.

Частые ошибки

  • Забыть register_blueprint. Маршруты определены, но не зарегистрированы — 404.
  • url_for без имени блюпринта. Нужно "auth.login", иначе BuildError.
  • Импортировать блюпринты на верхнем уровне __init__. Импортируй внутри create_app, избегая циклов.

Best practices

  • Один блюпринт — одна предметная область (auth, posts, admin, api).
  • Задавай url_prefix на уровне блюпринта, а не повторяй в каждом маршруте.
  • Регистрируй блюпринты внутри фабрики, импортируя их там же.

Что запомнить

  • Блюпринт группирует связанные маршруты, шаблоны и статику в модуль.
  • register_blueprint в фабрике встраивает маршруты в URL-карту с префиксом.
  • Endpoint'ы блюпринта живут в пространстве имён: url_for('auth.login').
  • Блюпринты импортируют внутри create_app, избегая циклов.

Итог: блюпринт группирует маршруты в модуль с префиксом и пространством имён, а фабрика их регистрирует. Это масштабирует структуру без хаоса. Дальше — обработка ошибок и страницы 404/500.

Проверьте себя
1. Что делает register_blueprint в фабрике?
AСоздаёт базу данных
BДобавляет маршруты блюпринта (с учётом url_prefix) в URL-карту приложения
CЗапускает сервер
DРендерит шаблоны
2. Как сослаться на endpoint login в блюпринте auth?
Aurl_for('login')
Burl_for('auth.login') — с именем блюпринта
Curl_for('/auth/login')
Durl_for('auth/login')