Расширенное использование 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 для распространённых сценариев. Ниже рассмотрим, как их использовать.
Технические детали
В следующих примерах вы также можете использовать from starlette.middleware.something import SomethingMiddleware.
FastAPI предоставляет несколько middleware в fastapi.middleware для удобства разработчика. Но большинство доступных middleware приходит напрямую из Starlette.
HTTPSRedirectMiddleware¶
Гарантирует, что все входящие запросы должны использовать либо https, либо wss.
Любой входящий запрос по http или ws будет перенаправлен на безопасную схему.
from fastapi import FastAPI
from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware
app = FastAPI()
app.add_middleware(HTTPSRedirectMiddleware)
@app.get("/")
async def main():
return {"message": "Hello World"}
TrustedHostMiddleware¶
Гарантирует, что во всех входящих запросах корректно установлен Host‑заголовок, чтобы защититься от атак на HTTP‑заголовок Host.
from fastapi import FastAPI
from fastapi.middleware.trustedhost import TrustedHostMiddleware
app = FastAPI()
app.add_middleware(
TrustedHostMiddleware, allowed_hosts=["example.com", "*.example.com"]
)
@app.get("/")
async def main():
return {"message": "Hello World"}
Поддерживаются следующие аргументы:
allowed_hosts— список доменных имён, которые следует разрешить как имена хостов. Подстановки вида*.example.comподдерживаются для сопоставления поддоменов. Чтобы разрешить любой хост, используйте либоallowed_hosts=["*"], либо не добавляйте это middleware.www_redirect— если установлено в True, запросы к не‑www версиям разрешённых хостов будут перенаправляться на их www‑аналоги. По умолчанию —True.
Если входящий запрос не проходит валидацию, будет отправлен ответ 400.
GZipMiddleware¶
Обрабатывает GZip‑ответы для любых запросов, которые включают "gzip" в заголовке Accept-Encoding.
Это middleware обрабатывает как обычные, так и потоковые ответы.
from fastapi import FastAPI
from fastapi.middleware.gzip import GZipMiddleware
app = FastAPI()
app.add_middleware(GZipMiddleware, minimum_size=1000, compresslevel=5)
@app.get("/")
async def main():
return "somebigcontent"
Поддерживаются следующие аргументы:
minimum_size— не сжимать GZip‑ом ответы, размер которых меньше этого минимального значения в байтах. По умолчанию —500.compresslevel— уровень GZip‑сжатия. Целое число от 1 до 9. По умолчанию —9. Более низкое значение — быстреее сжатие, но больший размер файла; более высокое значение — более медленное сжатие, но меньший размер файла.
Другие middleware¶
Существует много других ASGI middleware.
Например:
Чтобы увидеть другие доступные middleware, посмотрите документацию по middleware в Starlette и список ASGI Awesome.