Что такое middleware и какие основные виды существуют
Что проверяют
Понимаете ли вы, что это обёртка вокруг обработки запроса, и знаете ли, что там уместно, а что нет.
Как отвечать
Middleware это слой между приёмом запроса и его обработчиком. Он видит запрос до обработчика и ответ после, поэтому туда выносят всё сквозное, что иначе пришлось бы повторять в каждом обработчике.
Работает как вложенные слои: запрос идёт сверху вниз, ответ обратно, и каждый слой может изменить оба или прервать цепочку.
@app.middleware("http")
async def add_request_id(request, call_next):
request.state.request_id = uuid4().hex
response = await call_next(request)
response.headers["X-Request-Id"] = request.state.request_id
return responseОсновные виды:
- логирование и трассировка: сквозной идентификатор запроса, время ответа;
- аутентификация и авторизация: разбор токена, подстановка пользователя;
- CORS: заголовки и обработка предварительного запроса;
- обработка ошибок: превращение исключений в корректный ответ вместо стека;
- сжатие ответа;
- ограничение частоты запросов;
- сессии и cookie;
- метрики: счётчики и гистограммы времени ответа.
Порядок важен: обработчик ошибок стоит снаружи, чтобы поймать всё, аутентификация до маршрутизации бизнес-логики, CORS достаточно рано, чтобы предварительный запрос не дошёл до кода.
Что не стоит класть: бизнес-логику и тяжёлые обращения к базе. Middleware выполняется на каждом запросе, включая проверки здоровья и статику.
Где спотыкаются
Забывают вернуть ответ из цепочки и получают зависший запрос.
Кладут в middleware обращение к базе на каждом запросе.
Путают порядок и удивляются, что обработчик ошибок не ловит исключение.
Хранят состояние запроса в глобальной переменной вместо объекта запроса.