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

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

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

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

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

Ви можете покращити цей переклад, допомігши нам краще спрямовувати AI LLM.

Англійська версія

У головному навчальному посібнику ви читали, як додати Користувацьке проміжне програмне забезпечення до вашого застосунку.

Також ви читали, як обробляти CORS за допомогою CORSMiddleware.

У цьому розділі розглянемо, як використовувати інше проміжне програмне забезпечення.

Додавання проміжного програмного забезпечення ASGI

Оскільки FastAPI базується на Starlette і реалізує специфікацію ASGI, ви можете використовувати будь-яке проміжне програмне забезпечення ASGI.

Проміжне програмне забезпечення не обов'язково має бути створене саме для FastAPI або Starlette, головне - щоб воно відповідало специфікації ASGI.

Загалом, компоненти проміжного програмного забезпечення ASGI - це класи, які очікують отримати застосунок ASGI як перший аргумент.

Тож у документації до сторонніх компонентів проміжного програмного забезпечення ASGI вам, імовірно, порадять зробити приблизно так:

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() приймає клас проміжного програмного забезпечення як перший аргумент і будь-які додаткові аргументи, що будуть передані цьому проміжному програмному забезпеченню.

Вбудоване проміжне програмне забезпечення

FastAPI містить кілька компонентів проміжного програмного забезпечення для поширених випадків використання, далі розглянемо, як їх використовувати.

Технічні деталі

У наступних прикладах ви також можете використовувати from starlette.middleware.something import SomethingMiddleware.

FastAPI надає кілька компонентів проміжного програмного забезпечення у fastapi.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=["*"], або не додавайте це проміжне програмне забезпечення.
  • www_redirect - Якщо встановлено True, запити до не-www версій дозволених хостів буде перенаправлено до їхніх www-варіантів. Типово True.

Якщо вхідний запит не проходить перевірку, буде надіслано відповідь 400.

GZipMiddleware

Обробляє відповіді GZip для будь-якого запиту, що містить "gzip" у заголовку Accept-Encoding.

Проміжне програмне забезпечення обробляє як стандартні, так і потокові відповіді.

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. Менше значення дає швидше стиснення, але більший розмір файлів; більше значення дає повільніше стиснення, але менший розмір файлів.

Інше проміжне програмне забезпечення

Є багато іншого проміжного програмного забезпечення ASGI.

Наприклад:

Щоб переглянути інше доступне проміжне програмне забезпечення, ознайомтеся з документацією Starlette щодо проміжного програмного забезпечення та списком ASGI Awesome.