Перейти до змісту

Просунуте проміжне програмне забезпечення

🌐 Переклад ШІ та людьми

Цей переклад виконано ШІ під керівництвом людей. 🤝

Можливі помилки через неправильне розуміння початкового змісту або неприродні формулювання тощо. 🤖

Ви можете покращити цей переклад, допомігши нам краще спрямовувати 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.