← Назад к вопросам
Какой паттерн проектирования есть в middleware?
1.8 Middle🔥 141 комментариев
#Архитектура и паттерны
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Паттерны проектирования в Middleware
Middleware реализует несколько паттернов, основной из которых — Цепочка ответственности (Chain of Responsibility).
Chain of Responsibility
Это структурный паттерн, где запрос передаётся по цепочке обработчиков. Каждый middleware может:
- Обработать запрос
- Передать его следующему обработчику
- Изменить ответ
Пример в Django:
class RequestLogMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
print(f"Incoming: {request.method} {request.path}")
response = self.get_response(request) # Передача цепочке
print(f"Status: {response.status_code}")
return response
Decorator (Декоратор)
Можно трактовать как Decorator паттерн — middleware оборачивает функцию обработчика:
def auth_middleware(func):
def wrapper(request):
if not request.user.is_authenticated:
return HttpResponse("Unauthorized", status=401)
return func(request)
return wrapper
@auth_middleware
def my_view(request):
return HttpResponse("OK")
Pipeline / Decorator Pattern Combo
В современных фреймворках (FastAPI) используется Pipeline паттерн — последовательная обработка через декораторы:
from fastapi import FastAPI
app = FastAPI()
@app.middleware("http")
async def logging_middleware(request, call_next):
print(f"Start: {request.url}")
response = await call_next(request)
print(f"End: {response.status_code}")
return response
Ключевые характеристики
- Цепочка объектов — каждый middleware передаёт управление следующему
- Разделение ответственности — логирование, аутентификация, валидация отделены друг от друга
- Гибкость — легко добавлять/убирать обработчики
- Прозрачность — основной код не знает о middleware
Практический порядок выполнения
Мiddleware выполняется слой за слоем (как матрёшка):
Request → Middleware1 → Middleware2 → View → Middleware2 → Middleware1 → Response
Это позволяет контролировать как входящий запрос, так и исходящий ответ.