Как работает Middleware?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как работает Middleware?
Middleware — это компонент, который обрабатывает запросы и ответы веб-приложения. Это один из основных паттернов в веб-фреймворках на Python (FastAPI, Django, Flask).
Концепция работы
Middleware работает как цепочка обработчиков (chain of responsibility). Запрос проходит через несколько слоёв middleware перед попаданием в основной обработчик, а ответ проходит обратный путь:
Request → Middleware 1 → Middleware 2 → Handler → Response → Middleware 2 → Middleware 1 → Client
Примеры middleware
1. CORS Middleware — разрешает кросс-доменные запросы:
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"],
)
2. Authentication Middleware — проверяет JWT токен:
from fastapi import Request
from starlette.middleware.base import BaseHTTPMiddleware
class AuthMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next):
token = request.headers.get("Authorization")
if not token:
return {"error": "Unauthorized"}
request.state.user_id = decode_token(token)
response = await call_next(request)
return response
3. Logging Middleware — логирует все запросы:
class LoggingMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next):
print(f"Request: {request.method} {request.url}")
response = await call_next(request)
print(f"Response status: {response.status_code}")
return response
Порядок регистрации middleware
Это важно! Middleware регистрируются в обратном порядке выполнения:
app.add_middleware(LoggingMiddleware) # Выполнится ВТОРЫМ
app.add_middleware(AuthMiddleware) # Выполнится ПЕРВЫМ
Первый добавленный middleware будет выполнен последним в цепи (как стек).
Django Middleware
В Django работает по тому же принципу, но с другим синтаксисом:
class CustomMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# До обработки запроса
response = self.get_response(request)
# После обработки
return response
Ключевые особенности
- Асинхронность — middleware в современных фреймворках часто асинхронные для лучшей производительности
- Сложность обработки — can modify request/response, access database, redirect
- Performance — middleware выполняется для КАЖДОГО запроса, поэтому важна оптимизация
- Exception handling — middleware может перехватывать и обрабатывать исключения
Middleware — это мощный механизм для кроссавтинга и обработки общей логики приложения.