4.9 KiB
Middleware (Проміжний шар)
У FastAPI можна додавати middleware (проміжний шар).
"Middleware" — це функція, яка працює з кожним запитом перед його обробкою будь-якою конкретною операцією шляху (path operation), а також з кожною відповіддю перед її поверненням.
- Middleware отримує кожен запит, що надходить до Вашого застосунку.
- Може виконати певні дії із цим запитом або запустити необхідний код.
- Далі передає запит для обробки основним застосунком (операцією шляху).
- Отримує відповідь, сформовану застосунком (операцією шляху).
- Може змінити цю відповідь або виконати додатковий код.
- Повертає відповідь клієнту.
/// note | Технічні деталі
Якщо у Вас є залежності з yield
, код виходу виконається після middleware.
Якщо були заплановані фонові задачі (background tasks - розглянуто далі), вони виконаються після всіх middleware.
///
Створення middleware
Щоб створити middleware, Ви використовуєте декоратор @app.middleware("http")
на функції.
Функція middleware отримує:
-
Запит
. -
Функцію
call_next
, яка приймаєзапит
як параметр.- Ця функція передає
запит
відповідній операції шляху. - Потім вона повертає
відповідь
, згенеровану цією операцією шляху.
- Ця функція передає
-
Ви можете ще змінити
відповідь
перед тим, як повернути її.
{* ../../docs_src/middleware/tutorial001.py hl[8:9,11,14] *}
/// tip | Порада
Не забувайте, що власні заголовки можна додавати, використовуючи префікс 'X-'.
Але якщо у Вас є власні заголовки, які Ви хочете, щоб браузерний клієнт міг побачити, потрібно додати їх до Вашої конфігурації CORS (див. CORS (Обмін ресурсами між різними джерелами){.internal-link target=_blank} за допомогою параметра expose_headers
, описаного в документації Starlette по CORS.
///
/// note | Технічні деталі
Ви також можете використати from starlette.requests import Request
.
FastAPI надає це для Вашої зручності як розробника. Але він походить безпосередньо зі Starlette.
///
До і після response
(відповіді
)
Ви можете додати код, який буде виконуватися з запитом
(request
), до того, як його обробить будь-яка операція шляху (path operation).
Також Ви можете додати код, який буде виконуватися після того, як відповідь
(response
) буде згенеровано, перед тим як його повернути.
Наприклад, Ви можете додати власний заголовок X-Process-Time
, який міститиме час у секундах, який витратився на обробку запиту та генерацію відповіді:
{* ../../docs_src/middleware/tutorial001.py hl[10,12:13] *}
/// tip | Підказка
Тут ми використовуємо time.perf_counter()
замість time.time()
оскільки він може бути більш точним для таких випадків. 🤓
///
Інші middlewares
Ви можете пізніше прочитати більше про інші middlewares в Advanced User Guide: Advanced Middleware{.internal-link target=_blank}.
Ви дізнаєтесь, як обробляти CORS за допомогою middleware в наступному розділі.