Middleware (Проміжний шар)¶
У FastAPI можна додавати middleware (проміжний шар).
"Middleware" — це функція, яка працює з кожним запитом перед його обробкою будь-якою конкретною операцією шляху (path operation), а також з кожною відповіддю перед її поверненням.
- Middleware отримує кожен запит, що надходить до Вашого застосунку.
- Може виконати певні дії із цим запитом або запустити необхідний код.
- Далі передає запит для обробки основним застосунком (операцією шляху).
- Отримує відповідь, сформовану застосунком (операцією шляху).
- Може змінити цю відповідь або виконати додатковий код.
- Повертає відповідь клієнту.
Технічні деталі
Якщо у Вас є залежності з yield, код виходу виконається після middleware.
Якщо були заплановані фонові задачі (background tasks - розглянуто далі), вони виконаються після всіх middleware.
Створення middleware¶
Щоб створити middleware, Ви використовуєте декоратор @app.middleware("http") на функції.
Функція middleware отримує:
Запит.-
Функцію
call_next, яка приймаєзапитяк параметр.- Ця функція передає
запитвідповідній операції шляху. - Потім вона повертає
відповідь, згенеровану цією операцією шляху.
- Ця функція передає
-
Ви можете ще змінити
відповідьперед тим, як повернути її.
import time
from fastapi import FastAPI, Request
app = FastAPI()
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
start_time = time.perf_counter()
response = await call_next(request)
process_time = time.perf_counter() - start_time
response.headers["X-Process-Time"] = str(process_time)
return response
Порада
Не забувайте, що власні заголовки можна додавати, використовуючи префікс 'X-'.
Але якщо у Вас є власні заголовки, які Ви хочете, щоб браузерний клієнт міг побачити, потрібно додати їх до Вашої конфігурації CORS (див. CORS (Обмін ресурсами між різними джерелами) за допомогою параметра expose_headers, описаного в документації Starlette по CORS.
Технічні деталі
Ви також можете використати from starlette.requests import Request.
FastAPI надає це для Вашої зручності як розробника. Але він походить безпосередньо зі Starlette.
До і після response(відповіді)¶
Ви можете додати код, який буде виконуватися з запитом (request), до того, як його обробить будь-яка операція шляху (path operation).
Також Ви можете додати код, який буде виконуватися після того, як відповідь (response) буде згенеровано, перед тим як його повернути.
Наприклад, Ви можете додати власний заголовок X-Process-Time, який міститиме час у секундах, який витратився на обробку запиту та генерацію відповіді:
import time
from fastapi import FastAPI, Request
app = FastAPI()
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
start_time = time.perf_counter()
response = await call_next(request)
process_time = time.perf_counter() - start_time
response.headers["X-Process-Time"] = str(process_time)
return response
Підказка
Тут ми використовуємо time.perf_counter() замість time.time() оскільки він може бути більш точним для таких випадків. 🤓
Інші middlewares¶
Ви можете пізніше прочитати більше про інші middlewares в Advanced User Guide: Advanced Middleware.
Ви дізнаєтесь, як обробляти CORS за допомогою middleware в наступному розділі.