6.3 KiB
Расширенное использование middleware
В основном руководстве вы читали, как добавить пользовательское middleware в ваше приложение.
А затем — как работать с CORS с помощью CORSMiddleware.
В этом разделе посмотрим, как использовать другие middleware.
Добавление ASGI middleware
Так как FastAPI основан на Starlette и реализует спецификацию ASGI, вы можете использовать любое ASGI middleware.
Middleware не обязательно должно быть сделано специально для FastAPI или Starlette — достаточно, чтобы оно соответствовало спецификации ASGI.
В общем случае ASGI middleware — это классы, которые ожидают получить ASGI‑приложение первым аргументом.
Поэтому в документации к сторонним ASGI middleware, скорее всего, вы увидите что‑то вроде:
from unicorn import UnicornMiddleware
app = SomeASGIApp()
new_app = UnicornMiddleware(app, some_config="rainbow")
Но FastAPI (точнее, Starlette) предоставляет более простой способ, который гарантирует корректную обработку внутренних ошибок сервера и корректную работу пользовательских обработчиков исключений.
Для этого используйте app.add_middleware() (как в примере с CORS).
from fastapi import FastAPI
from unicorn import UnicornMiddleware
app = FastAPI()
app.add_middleware(UnicornMiddleware, some_config="rainbow")
app.add_middleware() принимает класс middleware в качестве первого аргумента и любые дополнительные аргументы, которые будут переданы этому middleware.
Встроенные middleware
FastAPI включает несколько middleware для распространённых сценариев. Ниже рассмотрим, как их использовать.
/// note | Технические детали
В следующих примерах вы также можете использовать from starlette.middleware.something import SomethingMiddleware.
FastAPI предоставляет несколько middleware в fastapi.middleware для удобства разработчика. Но большинство доступных middleware приходит напрямую из Starlette.
///
HTTPSRedirectMiddleware
Гарантирует, что все входящие запросы должны использовать либо https, либо wss.
Любой входящий запрос по http или ws будет перенаправлен на безопасную схему.
{* ../../docs_src/advanced_middleware/tutorial001_py310.py hl[2,6] *}
TrustedHostMiddleware
Гарантирует, что во всех входящих запросах корректно установлен Host‑заголовок, чтобы защититься от атак на HTTP‑заголовок Host.
{* ../../docs_src/advanced_middleware/tutorial002_py310.py hl[2,6:8] *}
Поддерживаются следующие аргументы:
allowed_hosts— список доменных имён, которые следует разрешить как имена хостов. Подстановки вида*.example.comподдерживаются для сопоставления поддоменов. Чтобы разрешить любой хост, используйте либоallowed_hosts=["*"], либо не добавляйте это middleware.www_redirect— если установлено в True, запросы к не‑www версиям разрешённых хостов будут перенаправляться на их www‑аналоги. По умолчанию —True.
Если входящий запрос не проходит валидацию, будет отправлен ответ 400.
GZipMiddleware
Обрабатывает GZip‑ответы для любых запросов, которые включают "gzip" в заголовке Accept-Encoding.
Это middleware обрабатывает как обычные, так и потоковые ответы.
{* ../../docs_src/advanced_middleware/tutorial003_py310.py hl[2,6] *}
Поддерживаются следующие аргументы:
minimum_size— не сжимать GZip‑ом ответы, размер которых меньше этого минимального значения в байтах. По умолчанию —500.compresslevel— уровень GZip‑сжатия. Целое число от 1 до 9. По умолчанию —9. Более низкое значение — быстрее сжатие, но больший размер файла; более высокое значение — более медленное сжатие, но меньший размер файла.
Другие middleware
Существует много других ASGI middleware.
Например:
Чтобы увидеть другие доступные middleware, посмотрите документацию по middleware в Starlette и список ASGI Awesome.