Просунуте проміжне програмне забезпечення¶
🌐 Переклад ШІ та людьми
Цей переклад виконано ШІ під керівництвом людей. 🤝
Можливі помилки через неправильне розуміння початкового змісту або неприродні формулювання тощо. 🤖
Ви можете покращити цей переклад, допомігши нам краще спрямовувати AI LLM.
У головному навчальному посібнику ви читали, як додати Користувацьке проміжне ПЗ до вашого застосунку.
Також ви читали, як обробляти CORS за допомогою CORSMiddleware.
У цьому розділі розглянемо, як використовувати інше проміжне ПЗ.
Додавання middleware ASGI¶
Оскільки FastAPI базується на Starlette і реалізує специфікацію ASGI, ви можете використовувати будь-яке проміжне ПЗ ASGI.
Middleware не обов'язково має бути створене саме для FastAPI або Starlette, головне - щоб воно відповідало специфікації ASGI.
Загалом, middleware ASGI — це класи, які очікують отримати застосунок ASGI як перший аргумент.
Тож у документації до сторонніх middleware ASGI вам, імовірно, порадять зробити приблизно так:
from unicorn import UnicornMiddleware
app = SomeASGIApp()
new_app = UnicornMiddleware(app, some_config="rainbow")
Але FastAPI (точніше Starlette) надає простіший спосіб, який гарантує, що внутрішнє middleware обробляє помилки сервера, а користувацькі обробники винятків працюють коректно.
Для цього використовуйте 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"}
🤓 Other versions and variants
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 Header.
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"}
🤓 Other versions and variants
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"
🤓 Other versions and variants
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, ознайомтеся з документацією Starlette щодо middleware та списком ASGI Awesome.