Sync fastapi docs from 50113da1 on 2026-09-11

This commit is contained in:
The Librarian
2026-09-11 04:00:08 +00:00
parent 632909b5f6
commit 818066b271
739 changed files with 4974 additions and 17395 deletions
@@ -16,7 +16,7 @@
## Додаткова відповідь з `model` { #additional-response-with-model }
Ви можете передати вашим декораторам операцій шляху параметр `responses`.
Ви можете передати вашим *декораторам операцій шляху* параметр `responses`.
Він приймає `dict`: ключі - це коди статусу для кожної відповіді (наприклад, `200`), а значення - інші `dict` з інформацією для кожної з них.
@@ -49,7 +49,7 @@
///
Згенеровані відповіді в OpenAPI для цієї операції шляху будуть такими:
Згенеровані відповіді в OpenAPI для цієї *операції шляху* будуть такими:
```JSON hl_lines="3-12"
{
@@ -173,7 +173,7 @@
Можна використати цей самий параметр `responses`, щоб додати різні типи медіа для тієї ж основної відповіді.
Наприклад, можна додати додатковий тип медіа `image/png`, оголосивши, що ваша операція шляху може повертати JSON-об'єкт (з типом медіа `application/json`) або PNG-зображення:
Наприклад, можна додати додатковий тип медіа `image/png`, оголосивши, що ваша *операція шляху* може повертати JSON-об'єкт (з типом медіа `application/json`) або PNG-зображення:
{* ../../docs_src/additional_responses/tutorial002_py310.py hl[17:22,26] *}
@@ -211,7 +211,7 @@
## Комбінуйте попередньо визначені та власні відповіді { #combine-predefined-responses-and-custom-ones }
Можливо, ви захочете мати кілька попередньо визначених відповідей, що застосовуються до багатьох операцій шляху, але поєднувати їх із власними відповідями, потрібними для кожної операції шляху.
Можливо, ви захочете мати кілька попередньо визначених відповідей, що застосовуються до багатьох *операцій шляху*, але поєднувати їх із власними відповідями, потрібними для кожної *операції шляху*.
Для таких випадків можна скористатися прийомом Python «розпакування» `dict` за допомогою `**dict_to_unpack`:
@@ -233,7 +233,7 @@ new_dict = {**old_dict, "new key": "new value"}
}
```
Цей прийом можна використати, щоб перевикористовувати деякі попередньо визначені відповіді у ваших операціях шляху та поєднувати їх із додатковими власними.
Цей прийом можна використати, щоб перевикористовувати деякі попередньо визначені відповіді у ваших *операціях шляху* та поєднувати їх із додатковими власними.
Наприклад:
@@ -243,5 +243,5 @@ new_dict = {**old_dict, "new key": "new value"}
Щоб побачити, що саме можна включати у відповіді, ознайомтеся з цими розділами специфікації OpenAPI:
- [Об'єкт відповідей OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#responses-object), він включає `Response Object`.
- [Об'єкт відповіді OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#response-object), ви можете включити будь-що з цього безпосередньо в кожну відповідь у параметрі `responses`. Зокрема `description`, `headers`, `content` (усередині нього ви оголошуєте різні типи медіа та Схеми JSON) і `links`.
- [Об'єкт відповідей OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#responses-object), він включає `Response Object`.
- [Об'єкт відповіді OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#response-object), ви можете включити будь-що з цього безпосередньо в кожну відповідь у параметрі `responses`. Зокрема `description`, `headers`, `content` (усередині нього ви оголошуєте різні типи медіа та Схеми JSON) і `links`.
+1 -1
View File
@@ -45,7 +45,7 @@
<div class="termy">
```console
$ pytest
$ uv run pytest
---> 100%
```
+8 -8
View File
@@ -33,7 +33,7 @@
<div class="termy">
```console
$ fastapi run --forwarded-allow-ips="*"
$ uv run fastapi run --forwarded-allow-ips="*"
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
@@ -91,9 +91,9 @@ sequenceDiagram
Ці заголовки зберігають інформацію про оригінальний запит, яка інакше була б втрачена:
- X-Forwarded-For: оригінальна IP-адреса клієнта
- X-Forwarded-Proto: оригінальний протокол (`https`)
- X-Forwarded-Host: оригінальний хост (`mysuperapp.com`)
* **X-Forwarded-For**: оригінальна IP-адреса клієнта
* **X-Forwarded-Proto**: оригінальний протокол (`https`)
* **X-Forwarded-Host**: оригінальний хост (`mysuperapp.com`)
Коли **FastAPI CLI** налаштовано з `--forwarded-allow-ips`, він довіряє цим заголовкам і використовує їх, наприклад, для побудови коректних URL-адрес у перенаправленнях.
@@ -170,7 +170,7 @@ IP `0.0.0.0` зазвичай означає, що програма слухає
<div class="termy">
```console
$ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1
$ uv run fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
@@ -200,7 +200,7 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1
<div class="termy">
```console
$ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1
$ uv run fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
@@ -253,7 +253,7 @@ Uvicorn очікуватиме, що представник буде зверт
Ви можете легко провести експеримент локально з вилученим префіксом шляху, використовуючи [Traefik](https://docs.traefik.io/).
[Завантажте Traefik](https://github.com/containous/traefik/releases), це один бінарний файл, ви можете розпакувати архів і запустити його безпосередньо з термінала.
[Завантажте Traefik](https://github.com/traefik/traefik/releases), це один бінарний файл, ви можете розпакувати архів і запустити його безпосередньо з термінала.
Потім створіть файл `traefik.toml` з таким вмістом:
@@ -321,7 +321,7 @@ INFO[0000] Configuration loaded from file: /home/user/awesomeapi/traefik.toml
<div class="termy">
```console
$ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1
$ uv run fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
+2 -3
View File
@@ -1,13 +1,12 @@
# Використання dataclasses { #using-dataclasses }
FastAPI побудовано поверх **Pydantic**, і я показував вам, як використовувати моделі Pydantic для оголошення запитів і відповідей.
Але FastAPI також підтримує використання [`dataclasses`](https://docs.python.org/3/library/dataclasses.html) таким самим чином:
{* ../../docs_src/dataclasses_/tutorial001_py310.py hl[1,6:11,18:19] *}
Це підтримується завдяки **Pydantic**, адже він має [внутрішню підтримку `dataclasses`](https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel).
Це підтримується завдяки **Pydantic**, адже він має [внутрішню підтримку `dataclasses`](https://pydantic.dev/docs/validation/latest/concepts/dataclasses/#usage-of-stdlib-dataclasses-with-basemodel).
Тож навіть із наведеним вище кодом, який явно не використовує Pydantic, FastAPI використовує Pydantic, щоб перетворити стандартні dataclasses у власний варіант dataclasses Pydantic.
@@ -89,7 +88,7 @@ Dataclass буде автоматично перетворено на dataclass
Можна поєднувати `dataclasses` з іншими моделями Pydantic, наслідувати їх, включати у власні моделі тощо.
Щоб дізнатися більше, перегляньте [документацію Pydantic про dataclasses](https://docs.pydantic.dev/latest/concepts/dataclasses/).
Щоб дізнатися більше, перегляньте [документацію Pydantic про dataclasses](https://pydantic.dev/docs/validation/latest/concepts/dataclasses/).
## Версія { #version }
+1 -1
View File
@@ -154,7 +154,7 @@ async with lifespan(app):
/// note | Примітка
Ви можете прочитати більше про обробники `lifespan` Starlette у [документації Starlette про Lifespan](https://www.starlette.dev/lifespan/).
Ви можете прочитати більше про обробники `lifespan` Starlette у [документації Starlette про Lifespan](https://starlette.dev/lifespan/).
Зокрема, як працювати зі станом тривалості життя, який можна використовувати в інших ділянках вашого коду.
+1 -1
View File
@@ -12,7 +12,7 @@
Для **клієнтів TypeScript** [Hey API](https://heyapi.dev/) - спеціалізоване рішення, що надає оптимізований досвід для екосистеми TypeScript.
Більше генераторів SDK ви можете знайти на [OpenAPI.Tools](https://openapi.tools/#sdk).
Більше генераторів SDK ви можете знайти на [OpenAPI.Tools](https://openapi.tools/categories/sdk-generators).
/// tip | Порада
+23 -23
View File
@@ -1,20 +1,20 @@
# Просунуте проміжне програмне забезпечення { #advanced-middleware }
У головному навчальному посібнику ви читали, як додати [Користувацьке проміжне ПЗ](../tutorial/middleware.md) до вашого застосунку.
У головному навчальному посібнику ви читали, як додати [Користувацьке проміжне програмне забезпечення](../tutorial/middleware.md) до вашого застосунку.
Також ви читали, як обробляти [CORS за допомогою `CORSMiddleware`](../tutorial/cors.md).
У цьому розділі розглянемо, як використовувати інше проміжне ПЗ.
У цьому розділі розглянемо, як використовувати інше проміжне програмне забезпечення.
## Додавання middleware ASGI { #adding-asgi-middlewares }
## Додавання проміжного програмного забезпечення ASGI { #adding-asgi-middlewares }
Оскільки **FastAPI** базується на Starlette і реалізує специфікацію <abbr title="Asynchronous Server Gateway Interface - Асинхронний інтерфейс шлюзу сервера">ASGI</abbr>, ви можете використовувати будь-яке проміжне ПЗ ASGI.
Оскільки **FastAPI** базується на Starlette і реалізує специфікацію <abbr title="Asynchronous Server Gateway Interface - Асинхронний інтерфейс шлюзу сервера">ASGI</abbr>, ви можете використовувати будь-яке проміжне програмне забезпечення ASGI.
Middleware не обов'язково має бути створене саме для FastAPI або Starlette, головне - щоб воно відповідало специфікації ASGI.
Проміжне програмне забезпечення не обов'язково має бути створене саме для FastAPI або Starlette, головне - щоб воно відповідало специфікації ASGI.
Загалом, middleware ASGI це класи, які очікують отримати застосунок ASGI як перший аргумент.
Загалом, компоненти проміжного програмного забезпечення ASGI - це класи, які очікують отримати застосунок ASGI як перший аргумент.
Тож у документації до сторонніх middleware ASGI вам, імовірно, порадять зробити приблизно так:
Тож у документації до сторонніх компонентів проміжного програмного забезпечення ASGI вам, імовірно, порадять зробити приблизно так:
```Python
from unicorn import UnicornMiddleware
@@ -24,7 +24,7 @@ app = SomeASGIApp()
new_app = UnicornMiddleware(app, some_config="rainbow")
```
Але FastAPI (точніше Starlette) надає простіший спосіб, який гарантує, що внутрішнє middleware обробляє помилки сервера, а користувацькі обробники винятків працюють коректно.
Але FastAPI (точніше Starlette) надає простіший спосіб, який гарантує, що внутрішнє проміжне програмне забезпечення обробляє помилки сервера, а користувацькі обробники винятків працюють коректно.
Для цього використовуйте `app.add_middleware()` (як у прикладі для CORS).
@@ -37,17 +37,17 @@ app = FastAPI()
app.add_middleware(UnicornMiddleware, some_config="rainbow")
```
`app.add_middleware()` приймає клас middleware як перший аргумент і будь-які додаткові аргументи, що будуть передані цьому middleware.
`app.add_middleware()` приймає клас проміжного програмного забезпечення як перший аргумент і будь-які додаткові аргументи, що будуть передані цьому проміжному програмному забезпеченню.
## Вбудоване middleware { #integrated-middlewares }
## Вбудоване проміжне програмне забезпечення { #integrated-middlewares }
**FastAPI** містить кілька middleware для поширених випадків використання, далі розглянемо, як їх використовувати.
**FastAPI** містить кілька компонентів проміжного програмного забезпечення для поширених випадків використання, далі розглянемо, як їх використовувати.
/// note | Технічні деталі
У наступних прикладах ви також можете використовувати `from starlette.middleware.something import SomethingMiddleware`.
**FastAPI** надає кілька middleware у `fastapi.middleware` виключно для зручності розробника. Але більшість доступних middleware походять безпосередньо зі Starlette.
**FastAPI** надає кілька компонентів проміжного програмного забезпечення у `fastapi.middleware` виключно для зручності розробника. Але більшість доступних компонентів проміжного програмного забезпечення походять безпосередньо зі Starlette.
///
@@ -61,14 +61,14 @@ app.add_middleware(UnicornMiddleware, some_config="rainbow")
## `TrustedHostMiddleware` { #trustedhostmiddleware }
Примушує, щоб усі вхідні запити мали коректно встановлений заголовок `Host`, щоб захиститися від атак HTTP Host Header.
Примушує, щоб усі вхідні запити мали коректно встановлений заголовок `Host`, щоб захиститися від атак через заголовок HTTP Host.
{* ../../docs_src/advanced_middleware/tutorial002_py310.py hl[2,6:8] *}
Підтримуються такі аргументи:
- `allowed_hosts` - Список доменних імен, які слід дозволити як імена хостів. Підтримуються домени з «дикою картою», такі як `*.example.com`, для зіставлення піддоменів. Щоб дозволити будь-яке ім'я хоста, або використовуйте `allowed_hosts=["*"]`, або не додавайте це middleware.
- `www_redirect` - Якщо встановлено True, запити до не-www версій дозволених хостів буде перенаправлено до їхніх www-варіантів. Типово `True`.
* `allowed_hosts` - Список доменних імен, які слід дозволити як імена хостів. Підтримуються домени з «дикою картою», такі як `*.example.com`, для зіставлення піддоменів. Щоб дозволити будь-яке ім'я хоста, або використовуйте `allowed_hosts=["*"]`, або не додавайте це проміжне програмне забезпечення.
* `www_redirect` - Якщо встановлено True, запити до не-www версій дозволених хостів буде перенаправлено до їхніх www-варіантів. Типово `True`.
Якщо вхідний запит не проходить перевірку, буде надіслано відповідь `400`.
@@ -76,22 +76,22 @@ app.add_middleware(UnicornMiddleware, some_config="rainbow")
Обробляє відповіді GZip для будь-якого запиту, що містить `"gzip"` у заголовку `Accept-Encoding`.
Middleware обробляє як стандартні, так і потокові відповіді.
Проміжне програмне забезпечення обробляє як стандартні, так і потокові відповіді.
{* ../../docs_src/advanced_middleware/tutorial003_py310.py hl[2,6] *}
Підтримуються такі аргументи:
- `minimum_size` - Не GZip-увати відповіді, менші за цей мінімальний розмір у байтах. Типово `500`.
- `compresslevel` - Використовується під час стиснення GZip. Це ціле число в діапазоні від 1 до 9. Типово `9`. Менше значення дає швидше стиснення, але більший розмір файлів; більше значення дає повільніше стиснення, але менший розмір файлів.
* `minimum_size` - Не GZip-увати відповіді, менші за цей мінімальний розмір у байтах. Типово `500`.
* `compresslevel` - Використовується під час стиснення GZip. Це ціле число в діапазоні від 1 до 9. Типово `9`. Менше значення дає швидше стиснення, але більший розмір файлів; більше значення дає повільніше стиснення, але менший розмір файлів.
## Інше middleware { #other-middlewares }
## Інше проміжне програмне забезпечення { #other-middlewares }
Є багато іншого проміжного ПЗ ASGI.
Є багато іншого проміжного програмного забезпечення ASGI.
Наприклад:
- [`ProxyHeadersMiddleware` з Uvicorn](https://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.py)
- [MessagePack](https://github.com/florimondmanca/msgpack-asgi)
* [`ProxyHeadersMiddleware` від Uvicorn](https://github.com/Kludex/uvicorn/blob/main/uvicorn/middleware/proxy_headers.py)
* [MessagePack](https://github.com/florimondmanca/msgpack-asgi)
Щоб переглянути інші доступні middleware, ознайомтеся з [документацією Starlette щодо middleware](https://www.starlette.dev/middleware/) та [списком ASGI Awesome](https://github.com/florimondmanca/awesome-asgi).
Щоб переглянути інше доступне проміжне програмне забезпечення, ознайомтеся з [документацією Starlette щодо проміжного програмного забезпечення](https://starlette.dev/middleware/) та [списком ASGI Awesome](https://github.com/florimondmanca/awesome-asgi).
+10 -10
View File
@@ -18,10 +18,10 @@
Потім ваш API буде (уявімо):
- Надсилати рахунок деякому клієнту зовнішнього розробника.
- Отримувати оплату.
- Надсилати сповіщення назад користувачу API (зовнішньому розробнику).
- Це буде зроблено шляхом надсилання POST-запиту (з *вашого API*) до деякого *зовнішнього API*, наданого тим зовнішнім розробником (це і є «зворотний виклик»).
* Надсилати рахунок деякому клієнту зовнішнього розробника.
* Отримувати оплату.
* Надсилати сповіщення назад користувачу API (зовнішньому розробнику).
* Це буде зроблено шляхом надсилання POST-запиту (з *вашого API*) до деякого *зовнішнього API*, наданого тим зовнішнім розробником (це і є «зворотний виклик»).
## Звичайний застосунок **FastAPI** { #the-normal-fastapi-app }
@@ -35,7 +35,7 @@
/// tip | Порада
Параметр запиту `callback_url` використовує тип Pydantic [Url](https://docs.pydantic.dev/latest/api/networks/).
Параметр запиту `callback_url` використовує тип Pydantic [Url](https://pydantic.dev/docs/validation/latest/api/pydantic/networks/).
///
@@ -98,19 +98,19 @@ httpx.post(callback_url, json={"description": "Invoice paid", "paid": True})
Вона має виглядати як звичайна *операція шляху* FastAPI:
- Ймовірно має містити оголошення тіла, яке вона приймає, наприклад `body: InvoiceEvent`.
- І також може містити оголошення відповіді, яку вона повертає, наприклад `response_model=InvoiceEventReceived`.
* Ймовірно має містити оголошення тіла, яке вона приймає, наприклад `body: InvoiceEvent`.
* І також може містити оголошення відповіді, яку вона повертає, наприклад `response_model=InvoiceEventReceived`.
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[14:16,19:20,26:30] *}
Є 2 основні відмінності від звичайної *операції шляху*:
- Їй не потрібен реальний код, адже ваш застосунок ніколи не викликатиме цей код. Вона використовується лише для документування *зовнішнього API*. Тому функція може просто містити `pass`.
- *Шлях* може містити [вираз OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) (див. нижче), де можна використовувати змінні з параметрами та частини оригінального запиту, надісланого до *вашого API*.
* Їй не потрібен реальний код, адже ваш застосунок ніколи не викликатиме цей код. Вона використовується лише для документування *зовнішнього API*. Тому функція може просто містити `pass`.
* *Шлях* може містити [вираз OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#key-expression) (див. нижче), де можна використовувати змінні з параметрами та частини оригінального запиту, надісланого до *вашого API*.
### Вираз шляху зворотного виклику { #the-callback-path-expression }
*Шлях* зворотного виклику може містити [вираз OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression), який включає частини оригінального запиту, надісланого до *вашого API*.
*Шлях* зворотного виклику може містити [вираз OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#key-expression), який включає частини оригінального запиту, надісланого до *вашого API*.
У цьому випадку це `str`:
+1 -1
View File
@@ -48,4 +48,4 @@
///
Щоб побачити всі доступні параметри та опції, перегляньте [документацію в Starlette](https://www.starlette.dev/responses/#set-cookie).
Щоб побачити всі доступні параметри та опції, перегляньте [документацію в Starlette](https://starlette.dev/responses/#set-cookie).
+2 -2
View File
@@ -2,7 +2,7 @@
## Використовуйте параметр `Response` { #use-a-response-parameter }
Ви можете оголосити параметр типу `Response` у вашій функції операції шляху (так само, як і для кукі).
Ви можете оголосити параметр типу `Response` у вашій *функції операції шляху* (так само, як і для кукі).
Потім ви можете встановлювати заголовки в цьому *тимчасовому* обʼєкті відповіді.
@@ -38,4 +38,4 @@
Майте на увазі, що власні пропрієтарні заголовки можна додавати [за допомогою префікса `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers).
Але якщо у вас є власні заголовки, які клієнт у браузері має бачити, вам потрібно додати їх у вашу конфігурацію CORS (докладніше в [CORS (спільне використання ресурсів між різними джерелами)](../tutorial/cors.md)), використовуючи параметр `expose_headers`, задокументований у [документації Starlette щодо CORS](https://www.starlette.dev/middleware/#corsmiddleware).
Але якщо у вас є власні заголовки, які клієнт у браузері має бачити, вам потрібно додати їх у вашу конфігурацію CORS (докладніше в [CORS (спільне використання ресурсів між різними джерелами)](../tutorial/cors.md)), використовуючи параметр `expose_headers`, задокументований у [документації Starlette щодо CORS](https://starlette.dev/middleware/#corsmiddleware).
+36 -12
View File
@@ -6,41 +6,45 @@
З цієї причини поширено надавати їх у змінних оточення, які зчитуються застосунком.
**Змінна оточення** (також відома як **env var**) - це значення, яке існує поза кодом Python, в операційній системі, і може бути прочитане вашим застосунком та іншими програмами.
Ви можете створити змінну оточення для команди під час її запуску. Нижче ви побачите команди для конкретних платформ.
/// tip | Порада
Щоб зрозуміти змінні оточення, ви можете прочитати [Змінні оточення](../environment-variables.md).
Прочитайте [посібник зі змінних оточення](https://tiangolo.com/guides/environment-variables/) для докладного пояснення того, як працюють змінні оточення.
///
## Типи та перевірка { #types-and-validation }
Ці змінні оточення можуть містити лише текстові строки, оскільки вони зовнішні до Python і мають бути сумісні з іншими програмами та рештою системи (і навіть з різними операційними системами, як-от Linux, Windows, macOS).
Ці змінні оточення можуть містити лише текстові строки, оскільки вони зовнішні до Python і мають бути сумісні з іншими програмами та рештою системи (і навіть з різними операційними системами, як-от Linux, Windows і macOS).
Це означає, що будь-яке значення, прочитане в Python зі змінної оточення, буде `str`, і будь-яке перетворення в інший тип або будь-яка перевірка мають виконуватися в коді.
## Pydantic `Settings` { #pydantic-settings }
На щастя, Pydantic надає чудовий інструмент для обробки цих налаштувань із змінних оточення - [Pydantic: Settings management](https://docs.pydantic.dev/latest/concepts/pydantic_settings/).
На щастя, Pydantic надає чудовий інструмент для обробки цих налаштувань із змінних оточення - [Pydantic: Settings management](https://pydantic.dev/docs/validation/latest/concepts/pydantic_settings/).
### Встановіть `pydantic-settings` { #install-pydantic-settings }
Спершу переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md), активували його, а потім встановили пакет `pydantic-settings`:
Додайте пакет `pydantic-settings` до вашого проєкту:
<div class="termy">
```console
$ pip install pydantic-settings
$ uv add pydantic-settings
---> 100%
```
</div>
Він також входить у склад, якщо ви встановлюєте додаткові можливості «all» за допомогою:
Він також входить у склад, якщо ви встановлюєте додаткові можливості `all` за допомогою:
<div class="termy">
```console
$ pip install "fastapi[all]"
$ uv add "fastapi[all]"
---> 100%
```
@@ -76,19 +80,39 @@ $ pip install "fastapi[all]"
Далі ви б запустили сервер, передаючи конфігурації як змінні оточення, наприклад, ви можете встановити `ADMIN_EMAIL` і `APP_NAME` так:
//// tab | Linux, macOS, Windows Bash
<div class="termy">
```console
$ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" fastapi run main.py
$ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" uv run fastapi run main.py
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
</div>
////
//// tab | Windows PowerShell
<div class="termy">
```console
$ $Env:ADMIN_EMAIL = "deadpool@example.com"
$ $Env:APP_NAME = "ChimichangApp"
$ uv run fastapi run main.py
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
</div>
////
/// tip | Порада
Щоб встановити кілька змінних оточення для однієї команди, просто розділіть їх пробілами і розмістіть усі перед командою.
У Bash, щоб встановити кілька змінних оточення для однієї команди, розділіть їх пробілом і розмістіть усі перед командою.
///
@@ -172,11 +196,11 @@ $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" fastapi run main.p
///
Pydantic має підтримку читання з таких типів файлів за допомогою зовнішньої бібліотеки. Ви можете дізнатися більше тут: [Pydantic Settings: Dotenv (.env) support](https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support).
Pydantic має підтримку читання з таких типів файлів за допомогою зовнішньої бібліотеки. Ви можете дізнатися більше тут: [Pydantic Settings: Dotenv (.env) support](https://pydantic.dev/docs/validation/latest/concepts/pydantic_settings/#dotenv-env-support).
/// tip | Порада
Щоб це працювало, потрібно виконати `pip install python-dotenv`.
Щоб це працювало, додайте `python-dotenv` до вашого проєкту за допомогою `uv add python-dotenv`.
///
@@ -197,7 +221,7 @@ APP_NAME="ChimichangApp"
/// tip | Порада
Атрибут `model_config` використовується лише для конфігурації Pydantic. Докладніше: [Pydantic: Concepts: Configuration](https://docs.pydantic.dev/latest/concepts/config/).
Атрибут `model_config` використовується лише для конфігурації Pydantic. Докладніше: [Pydantic: Concepts: Configuration](https://pydantic.dev/docs/validation/latest/concepts/config/).
///
+1 -1
View File
@@ -35,7 +35,7 @@
<div class="termy">
```console
$ fastapi dev
$ uv run fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
+7 -7
View File
@@ -8,12 +8,12 @@
## Встановіть залежності { #install-dependencies }
Переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md), активували його та встановили `jinja2`:
Додайте `jinja2` до вашого проєкту:
<div class="termy">
```console
$ pip install jinja2
$ uv add jinja2
---> 100%
```
@@ -22,10 +22,10 @@ $ pip install jinja2
## Використання `Jinja2Templates` { #using-jinja2templates }
- Імпортуйте `Jinja2Templates`.
- Створіть об'єкт `templates`, який ви зможете перевикористовувати.
- Оголосіть параметр `Request` в *операції шляху*, яка повертатиме шаблон.
- Використайте створені `templates`, щоб зрендерити та повернути `TemplateResponse`; передайте назву шаблону, об'єкт `request` і словник «контекст» з парами ключ-значення, які будуть використані всередині шаблону Jinja2.
* Імпортуйте `Jinja2Templates`.
* Створіть об'єкт `templates`, який ви зможете перевикористовувати.
* Оголосіть параметр `Request` в *операції шляху*, яка повертатиме шаблон.
* Використайте створені `templates`, щоб зрендерити та повернути `TemplateResponse`; передайте назву шаблону, об'єкт `request` і словник «контекст» з парами ключ-значення, які будуть використані всередині шаблону Jinja2.
{* ../../docs_src/templates/tutorial001_py310.py hl[4,11,15:18] *}
@@ -123,4 +123,4 @@ Item ID: 42
## Детальніше { #more-details }
Докладніше, зокрема як тестувати шаблони, дивіться [документацію Starlette щодо шаблонів](https://www.starlette.dev/templates/).
Докладніше, зокрема як тестувати шаблони, дивіться [документацію Starlette щодо шаблонів](https://starlette.dev/templates/).
+2 -1
View File
@@ -4,7 +4,8 @@
{* ../../docs_src/app_testing/tutorial004_py310.py hl[9:15,18,27:28,30:32,41:43] *}
Ви можете прочитати більше у [«Запуск тривалості життя у тестах на офіційному сайті документації Starlette.»](https://www.starlette.dev/lifespan/#running-lifespan-in-tests)
Ви можете прочитати більше деталей про [«Запуск тривалості життя у тестах на офіційному сайті документації Starlette.»](https://starlette.dev/lifespan/#running-lifespan-in-tests)
Для застарілих подій `startup` і `shutdown` ви можете використовувати `TestClient` так:
+1 -1
View File
@@ -8,6 +8,6 @@
/// note | Примітка
Докладніше дивіться документацію Starlette щодо [тестування WebSocket](https://www.starlette.dev/testclient/#testing-websocket-sessions).
Докладніше дивіться документацію Starlette щодо [тестування WebSocket](https://starlette.dev/testclient/#testing-websocket-sessions).
///
@@ -14,7 +14,7 @@
## Деталі про об'єкт `Request` { #details-about-the-request-object }
Оскільки під капотом **FastAPI** - це **Starlette** з шаром інструментів зверху, ви можете за потреби використовувати об'єкт [`Request`](https://www.starlette.dev/requests/) Starlette безпосередньо.
Оскільки під капотом **FastAPI** - це **Starlette** з шаром інструментів зверху, ви можете за потреби використовувати об'єкт [`Request`](https://starlette.dev/requests/) Starlette безпосередньо.
Це також означає, що якщо ви отримуєте дані безпосередньо з об'єкта `Request` (наприклад, читаєте тіло), FastAPI не буде їх перевіряти, перетворювати або документувати (через OpenAPI для автоматичного інтерфейсу користувача API).
@@ -24,13 +24,13 @@
## Використовуйте об'єкт `Request` безпосередньо { #use-the-request-object-directly }
Припустімо, ви хочете отримати IP-адресу/хост клієнта всередині вашої функції операції шляху.
Припустімо, ви хочете отримати IP-адресу/хост клієнта всередині вашої *функції операції шляху*.
Для цього потрібно звернутися до запиту безпосередньо.
{* ../../docs_src/using_request_directly/tutorial001_py310.py hl[1,7:8] *}
Якщо вказати у функції операції шляху параметр типу `Request`, **FastAPI** передасть у нього об'єкт `Request`.
Якщо вказати у *функції операції шляху* параметр типу `Request`, **FastAPI** передасть у нього об'єкт `Request`.
/// tip | Порада
@@ -44,7 +44,7 @@
## Документація `Request` { #request-documentation }
Докладніше про [об'єкт [`Request`] на офіційному сайті документації Starlette](https://www.starlette.dev/requests/).
Докладніше про [об'єкт [`Request`] на офіційному сайті документації Starlette](https://starlette.dev/requests/).
/// note | Технічні деталі
+9 -9
View File
@@ -4,12 +4,12 @@
## Встановіть `websockets` { #install-websockets }
Переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md), активували його та встановили `websockets` (бібліотеку Python, що полегшує використання протоколу «WebSocket»):
Додайте `websockets` (бібліотеку Python, що полегшує використання протоколу «WebSocket») до вашого проєкту:
<div class="termy">
```console
$ pip install websockets
$ uv add websockets
---> 100%
```
@@ -69,7 +69,7 @@ $ pip install websockets
<div class="termy">
```console
$ fastapi dev
$ uv run fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
@@ -111,7 +111,7 @@ $ fastapi dev
{* ../../docs_src/websockets_/tutorial002_an_py310.py hl[68:69,82] *}
/// note
/// note | Примітка
Оскільки це WebSocket, не має сенсу піднімати `HTTPException`, натомість ми піднімаємо `WebSocketException`.
@@ -126,7 +126,7 @@ $ fastapi dev
<div class="termy">
```console
$ fastapi dev
$ uv run fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
@@ -140,7 +140,7 @@ $ fastapi dev
* «Item ID», який використовується у шляху.
* «Token», який використовується як параметр запиту.
/// tip
/// tip | Порада
Зверніть увагу, що параметр запиту `token` буде оброблено залежністю.
@@ -168,7 +168,7 @@ $ fastapi dev
Client #1596980209979 left the chat
```
/// tip
/// tip | Порада
Застосунок вище - це мінімальний і простий приклад, що демонструє, як обробляти та розсилати повідомлення кільком з'єднанням WebSocket.
@@ -182,5 +182,5 @@ Client #1596980209979 left the chat
Щоб дізнатися більше про можливості, перегляньте документацію Starlette:
* [Клас `WebSocket`](https://www.starlette.dev/websockets/).
* [Обробка WebSocket на основі класів](https://www.starlette.dev/endpoints/#websocketendpoint).
* [Клас `WebSocket`](https://starlette.dev/websockets/).
* [Обробка WebSocket на основі класів](https://starlette.dev/endpoints/#websocketendpoint).
+1 -1
View File
@@ -9,7 +9,7 @@
/// note | Примітка
Для цього потрібно встановити `a2wsgi`, наприклад за допомогою `pip install a2wsgi`.
Для цього потрібно додати `a2wsgi` до вашого проєкту, наприклад за допомогою `uv add a2wsgi`.
///
+8 -8
View File
@@ -20,7 +20,7 @@
Він відносно тісно пов’язаний з реляційними базами даних (наприклад, MySQL або PostgreSQL), тому мати базу даних NoSQL (наприклад, Couchbase, MongoDB, Cassandra тощо) як основний механізм зберігання не дуже просто.
Він був створений для створення HTML у серверній частині, а не для створення API, які використовуються сучасним інтерфейсом (як-от React, Vue.js і Angular) або іншими системами (як-от <abbr title="Internet of Things - Інтернет речей">IoT</abbr> пристрої), які спілкуються з ним.
Він був створений для створення HTML у серверній частині, а не для створення API, які використовються сучасним інтерфейсом (як-от React, Vue.js і Angular) або іншими системами (як-от <abbr title="Internet of Things - Інтернет речей">IoT</abbr> пристрої), які спілкуються з ним.
### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework }
@@ -125,7 +125,7 @@ def read_url():
Інтегрувати інструменти інтерфейсу на основі стандартів:
* [Swagger UI](https://github.com/swagger-api/swagger-ui)
* [ReDoc](https://github.com/Rebilly/ReDoc)
* [ReDoc](https://github.com/Redocly/redoc)
Ці два було обрано через те, що вони досить популярні та стабільні, але, виконавши швидкий пошук, ви можете знайти десятки додаткових альтернативних інтерфейсів для OpenAPI (які можна використовувати з **FastAPI**).
@@ -237,7 +237,7 @@ Flask-apispec був створений тими ж розробниками Mar
///
### [NestJS](https://nestjs.com/) (та [Angular](https://angular.io/)) { #nestjs-and-angular }
### [NestJS](https://nestjs.com/) (та [Angular](https://angular.dev/)) { #nestjs-and-angular }
Це навіть не Python, NestJS - це фреймворк NodeJS JavaScript (TypeScript), натхненний Angular.
@@ -337,7 +337,7 @@ Hug був одним із перших фреймворків, який реа
/// note | Примітка
Hug створив Тімоті Крослі, той самий творець [`isort`](https://github.com/timothycrosley/isort), чудовий інструмент для автоматичного сортування імпорту у файлах Python.
Hug створив Тімоті Крослі, той самий творець [`isort`](https://github.com/PyCQA/isort), чудовий інструмент для автоматичного сортування імпорту у файлах Python.
///
@@ -363,7 +363,7 @@ Hug надихнув **FastAPI** оголосити параметр `response`
Він мав найкращі показники продуктивності на той час (перевершив лише Starlette).
Спочатку він не мав автоматичного веб-інтерфейсу документації API, але я знав, що можу додати до нього інтерфейс користувача Swagger.
Спочатку він не мав автоматичного веб-інтерфейсу документації API, але я знав, що можу додати до нього Swagger UI.
Він мав систему введення залежностей. Він вимагав попередньої реєстрації компонентів, як і інші інструменти, розглянуті вище. Але все одно це була чудова функція.
@@ -401,7 +401,7 @@ APIStar створив Том Крісті. Той самий хлопець, я
## Використовується **FastAPI** { #used-by-fastapi }
### [Pydantic](https://docs.pydantic.dev/) { #pydantic }
### [Pydantic](https://pydantic.dev/docs/) { #pydantic }
Pydantic - це бібліотека для визначення перевірки даних, серіалізації та документації (за допомогою Схеми JSON) на основі підказок типу Python.
@@ -417,7 +417,7 @@ Pydantic - це бібліотека для визначення перевір
///
### [Starlette](https://www.starlette.dev/) { #starlette }
### [Starlette](https://starlette.dev/) { #starlette }
Starlette - це легкий фреймворк/набір інструментів <dfn title="Новий стандарт для створення асинхронних вебзастосунків на Python">ASGI</dfn>, який ідеально підходить для створення високопродуктивних asyncio сервісів.
@@ -462,7 +462,7 @@ ASGI - це новий «стандарт», який розробляється
///
### [Uvicorn](https://www.uvicorn.dev/) { #uvicorn }
### [Uvicorn](https://uvicorn.dev) { #uvicorn }
Uvicorn - це блискавичний сервер ASGI, побудований на uvloop і httptools.
+15 -19
View File
@@ -105,36 +105,32 @@ Docker був одним з основних інструментів для с
### Вимоги до пакетів { #package-requirements }
Зазвичай ви маєте **вимоги до пакетів** для вашого застосунку в окремому файлі.
Коли ви керуєте своїм проєктом за допомогою `uv`, його прямі залежності оголошуються в `pyproject.toml`, а точні розв’язані версії зберігаються в `uv.lock`.
Це залежить переважно від інструменту, який ви використовуєте для **встановлення** цих вимог.
Найпоширеніший спосіб - мати файл `requirements.txt` з назвами пакетів і їхніми версіями, по одному на рядок.
Звісно, ви застосуєте ті самі ідеї з [Про версії FastAPI](versions.md), щоб задати діапазони версій.
Наприклад, ваш `requirements.txt` може виглядати так:
```
fastapi[standard]>=0.113.0,<0.114.0
pydantic>=2.7.0,<3.0.0
```
І зазвичай ви встановлюватимете ці залежності пакетів через `pip`, наприклад:
Ви можете додати пакети, потрібні вашому застосунку, за допомогою:
<div class="termy">
```console
$ pip install -r requirements.txt
$ uv add "fastapi[standard]" pydantic
---> 100%
Successfully installed fastapi pydantic
```
</div>
/// note | Примітка
Існують інші формати та інструменти для визначення і встановлення залежностей пакетів.
`Dockerfile` нижче використовує `pip` всередині контейнера. Ви можете експортувати зафіксовані залежності з вашого проєкту uv у формат `requirements.txt`, якого він очікує:
<div class="termy">
```console
$ uv export --format requirements-txt --no-dev --no-emit-project --output-file requirements.txt
```
</div>
Згенерований `requirements.txt` - це експорт для збірки контейнера. Продовжуйте керувати залежностями за допомогою `uv add` і генеруйте його повторно, коли `uv.lock` змінюється.
///
@@ -372,7 +368,7 @@ $ docker run -d --name mycontainer -p 80:80 myimage
Також ви можете перейти на [http://192.168.99.100/redoc](http://192.168.99.100/redoc) або [http://127.0.0.1/redoc](http://127.0.0.1/redoc) (або еквівалент, використовуючи ваш Docker-хост).
Ви побачите альтернативну автоматичну документацію (надається [ReDoc](https://github.com/Rebilly/ReDoc)):
Ви побачите альтернативну автоматичну документацію (надається [ReDoc](https://github.com/Redocly/redoc)):
![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png)
+6 -6
View File
@@ -5,7 +5,7 @@
<div class="termy">
```console
$ fastapi deploy
$ uv run fastapi deploy
Deploying to FastAPI Cloud...
@@ -30,11 +30,11 @@ CLI автоматично визначить ваш застосунок FastAP
Він також подбає про більшість речей, які вам потрібні під час розгортання застосунку, як-от:
- HTTPS
- реплікація з автомасштабуванням на основі запитів
- тощо
* HTTPS
* Реплікація, з автомасштабуванням на основі запитів
* тощо
FastAPI Cloud - основний спонсор і джерело фінансування для відкритих проєктів *«FastAPI та друзі»*. ✨
FastAPI Cloud - основний спонсор і джерело фінансування для проєктів з відкритим кодом *FastAPI та друзі*. ✨
## Розгортання в інших хмарних провайдерів { #deploy-to-other-cloud-providers }
@@ -44,4 +44,4 @@ FastAPI є відкритим кодом і базується на станда
## Розгортання на вашому сервері { #deploy-your-own-server }
Пізніше в цьому розділі **Розгортання** я також навчу вас усім деталям, щоб ви розуміли, що відбувається, що потрібно зробити і як розгортати застосунки FastAPI самостійно, зокрема на власних серверах. 🤓
Пізніше в цьому посібнику з **Розгортання** я також навчу вас усім деталям, щоб ви розуміли, що відбувається, що потрібно зробити і як розгортати застосунки FastAPI самостійно, зокрема на власних серверах. 🤓
+5 -5
View File
@@ -52,7 +52,7 @@ FastAPI використовує стандарт для побудови Python
Є кілька альтернатив, зокрема:
* [Uvicorn](https://www.uvicorn.dev/): високопродуктивний ASGI-сервер.
* [Uvicorn](https://uvicorn.dev): високопродуктивний ASGI-сервер.
* [Hypercorn](https://hypercorn.readthedocs.io/): ASGI-сервер, сумісний з HTTP/2 і Trio, серед інших можливостей.
* [Daphne](https://github.com/django/daphne): ASGI-сервер, створений для Django Channels.
* [Granian](https://github.com/emmett-framework/granian): Rust HTTP-сервер для Python-застосунків.
@@ -73,14 +73,14 @@ FastAPI використовує стандарт для побудови Python
Але ви також можете встановити ASGI-сервер вручну.
Переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md), активували його, після чого можете встановити серверну програму.
Додайте серверний застосунок до вашого проєкту.
Наприклад, щоб установити Uvicorn:
<div class="termy">
```console
$ pip install "uvicorn[standard]"
$ uv add "uvicorn[standard]"
---> 100%
```
@@ -95,7 +95,7 @@ $ pip install "uvicorn[standard]"
Зокрема `uvloop` - високопродуктивну заміну «без змін у коді» для `asyncio`, що суттєво підвищує рівночасність і продуктивність.
Якщо ви встановлюєте FastAPI через `pip install "fastapi[standard]"`, ви вже отримаєте і `uvicorn[standard]`.
Коли ви додаєте FastAPI за допомогою чогось на кшталт `uv add "fastapi[standard]"`, ви також уже отримуєте `uvicorn[standard]`.
///
@@ -106,7 +106,7 @@ $ pip install "uvicorn[standard]"
<div class="termy">
```console
$ uvicorn main:app --host 0.0.0.0 --port 80
$ uv run uvicorn main:app --host 0.0.0.0 --port 80
<span style="color: green;">INFO</span>: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)
```
+27 -27
View File
@@ -1,27 +1,27 @@
# Працівники сервера - Uvicorn з працівниками { #server-workers-uvicorn-with-workers }
# Серверні працівники - Uvicorn із працівниками { #server-workers-uvicorn-with-workers }
Повернімося до попередніх концепцій розгортання:
- Безпека - HTTPS
- Запуск під час старту
- Перезапуски
- **Реплікація (кількість процесів, що виконуються)**
- Пам'ять
- Попередні кроки перед запуском
* Безпека - HTTPS
* Запуск під час старту
* Перезапуски
* **Реплікація (кількість процесів, що виконуються)**
* Пам'ять
* Попередні кроки перед запуском
До цього моменту, проходячи всі навчальні посібники в документації, ви, ймовірно, запускали серверну програму, наприклад, використовуючи команду `fastapi`, яка запускає Uvicorn у вигляді одного процесу.
До цього моменту, проходячи всі навчальні посібники в документації, ви, ймовірно, запускали **серверну програму**, наприклад, використовуючи команду `fastapi`, яка запускає Uvicorn у вигляді **одного процесу**.
Під час розгортання застосунків ви, найімовірніше, захочете мати реплікацію процесів, щоб використовувати кілька ядер і обробляти більше запитів.
Під час розгортання застосунків ви, найімовірніше, захочете мати **реплікацію процесів**, щоб використовувати **кілька ядер** і обробляти більше запитів.
Як ви бачили в попередньому розділі про [Концепції розгортання](concepts.md), існує кілька стратегій, які можна використовувати.
Тут я покажу, як використовувати Uvicorn із процесами-працівниками за допомогою команди `fastapi` або безпосередньо команди `uvicorn`.
Тут я покажу, як використовувати **Uvicorn** із **процесами-працівниками** за допомогою команди `fastapi` або безпосередньо команди `uvicorn`.
/// note | Примітка
Якщо ви використовуєте контейнери, наприклад з Docker або Kubernetes, я розповім про це більше в наступному розділі: [FastAPI у контейнерах - Docker](docker.md).
Зокрема, під час запуску в Kubernetes вам, найімовірніше, не варто використовувати працівників, натомість запускати один процес Uvicorn на контейнер. Але про це я розповім пізніше в тому розділі.
Зокрема, під час запуску в **Kubernetes** вам, найімовірніше, **не** варто використовувати працівників, натомість запускати **один процес Uvicorn на контейнер**, але про це я розповім пізніше в тому розділі.
///
@@ -86,7 +86,7 @@ $ <font color="#4E9A06">fastapi</font> run --workers 4 <u style="text-decoration
<div class="termy">
```console
$ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4
$ uv run uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4
<font color="#A6E22E">INFO</font>: Uvicorn running on <b>http://0.0.0.0:8080</b> (Press CTRL+C to quit)
<font color="#A6E22E">INFO</font>: Started parent process [<font color="#A1EFE4"><b>27365</b></font>]
<font color="#A6E22E">INFO</font>: Started server process [<font color="#A1EFE4">27368</font>]
@@ -107,33 +107,33 @@ $ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4
////
Єдина нова опція тут `--workers`, яка вказує Uvicorn запустити 4 процеси-працівники.
Єдина нова опція тут - `--workers`, яка вказує Uvicorn запустити 4 процеси-працівники.
Також ви можете побачити, що виводиться PID кожного процесу: `27365` для батьківського процесу (це менеджер процесів) і по одному для кожного процесу-працівника: `27368`, `27369`, `27370` і `27367`.
Також ви можете побачити, що виводиться **PID** кожного процесу: `27365` для батьківського процесу (це **менеджер процесів**) і по одному для кожного процесу-працівника: `27368`, `27369`, `27370` і `27367`.
## Концепції розгортання { #deployment-concepts }
Тут ви побачили, як використовувати кілька працівників, щоб паралелізувати виконання застосунку, використати кілька ядер процесора та обслуговувати більше запитів.
Тут ви побачили, як використовувати кілька **працівників**, щоб **паралелізувати** виконання застосунку, використати **кілька ядер** процесора та обслуговувати **більше запитів**.
Із наведеного вище списку концепцій розгортання, використання працівників головним чином допоможе з частиною про реплікацію і трохи з перезапусками, але про інше все ще треба подбати:
Із наведеного вище списку концепцій розгортання, використання працівників головним чином допоможе з частиною про **реплікацію** і трохи з **перезапусками**, але про інше все ще треба подбати:
- **Безпека - HTTPS**
- **Запуск під час старту**
- ***Перезапуски***
- Реплікація (кількість процесів, що виконуються)
- **Пам'ять**
- **Попередні кроки перед запуском**
* **Безпека - HTTPS**
* **Запуск під час старту**
* ***Перезапуски***
* Реплікація (кількість процесів, що виконуються)
* **Пам'ять**
* **Попередні кроки перед запуском**
## Контейнери і Docker { #containers-and-docker }
У наступному розділі про [FastAPI у контейнерах - Docker](docker.md) я поясню кілька стратегій, які ви можете використати для інших концепцій розгортання.
У наступному розділі про [FastAPI у контейнерах - Docker](docker.md) я поясню кілька стратегій, які ви можете використати для інших **концепцій розгортання**.
Я покажу, як побудувати власний образ з нуля для запуску одного процесу Uvicorn. Це простий процес і, ймовірно, саме те, що потрібно при використанні розподіленої системи керування контейнерами, такої як Kubernetes.
Я покажу, як **побудувати власний образ з нуля** для запуску одного процесу Uvicorn. Це простий процес і, ймовірно, саме те, що потрібно при використанні розподіленої системи керування контейнерами, такої як **Kubernetes**.
## Підсумок { #recap }
Ви можете використовувати кілька процесів-працівників за допомогою параметра CLI `--workers` у командах `fastapi` або `uvicorn`, щоб скористатися перевагами багатоядерних процесорів і запускати кілька процесів паралельно.
Ви можете використовувати кілька процесів-працівників за допомогою параметра CLI `--workers` у командах `fastapi` або `uvicorn`, щоб скористатися перевагами **багатоядерних процесорів** і запускати **кілька процесів паралельно**.
Ви можете застосувати ці інструменти та ідеї, якщо налаштовуєте власну систему розгортання і самостійно дбаєте про інші концепції розгортання.
Ви можете застосувати ці інструменти та ідеї, якщо налаштовуєте **власну систему розгортання** і самостійно дбаєте про інші концепції розгортання.
Перегляньте наступний розділ, щоб дізнатися про FastAPI з контейнерами (наприклад Docker і Kubernetes). Ви побачите, що ці інструменти також мають прості способи вирішити інші концепції розгортання. ✨
Перегляньте наступний розділ, щоб дізнатися про **FastAPI** з контейнерами (наприклад Docker і Kubernetes). Ви побачите, що ці інструменти також мають прості способи вирішити інші **концепції розгортання**. ✨
+5 -292
View File
@@ -1,298 +1,11 @@
# Змінні оточення { #environment-variables }
/// tip | Порада
**Змінна оточення** (також відома як **env var**) - це значення, що існує поза вашим кодом Python, в операційній системі, і може бути прочитане вашим застосунком та іншими програмами.
Якщо ви вже знаєте, що таке «змінні оточення» і як їх використовувати, можете пропустити цей розділ.
Застосунки FastAPI часто використовують змінні оточення для конфігурації, наприклад URL бази даних, облікових даних email і секретних ключів.
///
Ви дізнаєтеся, як використовувати їх для конфігурації застосунку, у розділі [Налаштування та змінні оточення](advanced/settings.md).
Змінна оточення (також відома як «**env var**») - це змінна, що існує **поза** кодом Python, в **операційній системі**, і може бути прочитана вашим кодом Python (а також іншими програмами).
## Дізнайтеся більше { #learn-more }
Змінні оточення корисні для роботи з **налаштуваннями** застосунку, як частина **встановлення** Python тощо.
## Створення і використання змінних оточення { #create-and-use-env-vars }
Ви можете **створювати** і використовувати змінні оточення в **оболонці (терміналі)** без участі Python:
//// tab | Linux, macOS, Windows Bash
<div class="termy">
```console
// Ви можете створити змінну оточення MY_NAME командою
$ export MY_NAME="Wade Wilson"
// Потім можна використати її з іншими програмами, наприклад
$ echo "Hello $MY_NAME"
Hello Wade Wilson
```
</div>
////
//// tab | Windows PowerShell
<div class="termy">
```console
// Створіть змінну оточення MY_NAME
$ $Env:MY_NAME = "Wade Wilson"
// Використайте її з іншими програмами, наприклад
$ echo "Hello $Env:MY_NAME"
Hello Wade Wilson
```
</div>
////
## Читання змінних оточення в Python { #read-env-vars-in-python }
Ви також можете створити змінні оточення **поза** Python, у терміналі (або будь-яким іншим способом), а потім **зчитати їх у Python**.
Наприклад, у вас може бути файл `main.py` з:
```Python hl_lines="3"
import os
name = os.getenv("MY_NAME", "World")
print(f"Hello {name} from Python")
```
/// tip | Порада
Другий аргумент до [`os.getenv()`](https://docs.python.org/3.8/library/os.html#os.getenv) - це значення за замовчуванням, яке буде повернено.
Якщо його не вказано, за замовчуванням це `None`. Тут ми надаємо `"World"` як значення за замовчуванням.
///
Потім ви можете запустити цю програму Python:
//// tab | Linux, macOS, Windows Bash
<div class="termy">
```console
// Тут ми ще не встановлюємо змінну оточення
$ python main.py
// Оскільки ми не встановили змінну оточення, отримуємо значення за замовчуванням
Hello World from Python
// Але якщо спочатку створимо змінну оточення
$ export MY_NAME="Wade Wilson"
// А потім знову викличемо програму
$ python main.py
// Тепер вона може прочитати змінну оточення
Hello Wade Wilson from Python
```
</div>
////
//// tab | Windows PowerShell
<div class="termy">
```console
// Тут ми ще не встановлюємо змінну оточення
$ python main.py
// Оскільки ми не встановили змінну оточення, отримуємо значення за замовчуванням
Hello World from Python
// Але якщо спочатку створимо змінну оточення
$ $Env:MY_NAME = "Wade Wilson"
// А потім знову викличемо програму
$ python main.py
// Тепер вона може прочитати змінну оточення
Hello Wade Wilson from Python
```
</div>
////
Оскільки змінні оточення можна встановлювати поза кодом, але читати в коді, і їх не потрібно зберігати (фіксувати у `git`) разом з іншими файлами, їх часто використовують для конфігурацій або **налаштувань**.
Ви також можете створити змінну оточення лише для **конкретного запуску програми**, вона буде доступна тільки цій програмі і лише на час її виконання.
Щоб зробити це, створіть її безпосередньо перед командою запуску програми, в тому самому рядку:
<div class="termy">
```console
// Створіть змінну оточення MY_NAME безпосередньо в цьому виклику програми
$ MY_NAME="Wade Wilson" python main.py
// Тепер вона може прочитати змінну оточення
Hello Wade Wilson from Python
// Після цього змінна оточення більше не існує
$ python main.py
Hello World from Python
```
</div>
/// tip | Порада
Ви можете прочитати більше у [The Twelve-Factor App: Config](https://12factor.net/config).
///
## Типи і перевірка { #types-and-validation }
Ці змінні оточення можуть містити лише **текстові строки**, оскільки вони зовнішні щодо Python і мають бути сумісними з іншими програмами та рештою системи (і навіть з різними операційними системами, як-от Linux, Windows, macOS).
Це означає, що **будь-яке значення**, прочитане в Python зі змінної оточення, **буде `str`**, а будь-яке перетворення до іншого типу або будь-яка перевірка має виконуватися в коді.
Ви дізнаєтеся більше про використання змінних оточення для роботи з **налаштуваннями застосунку** в розділі [Просунутий посібник користувача - Налаштування і змінні оточення](./advanced/settings.md).
## Змінна оточення `PATH` { #path-environment-variable }
Є **спеціальна** змінна оточення **`PATH`**, яку використовують операційні системи (Linux, macOS, Windows) для пошуку програм для запуску.
Значення змінної `PATH` - це довга строка, що складається з каталогів, розділених двокрапкою `:` у Linux і macOS та крапкою з комою `;` у Windows.
Наприклад, змінна оточення `PATH` може виглядати так:
//// tab | Linux, macOS
```plaintext
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```
Це означає, що система має шукати програми в каталогах:
* `/usr/local/bin`
* `/usr/bin`
* `/bin`
* `/usr/sbin`
* `/sbin`
////
//// tab | Windows
```plaintext
C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32
```
Це означає, що система має шукати програми в каталогах:
* `C:\Program Files\Python312\Scripts`
* `C:\Program Files\Python312`
* `C:\Windows\System32`
////
Коли ви вводите **команду** в терміналі, операційна система **шукає** програму в **кожному з тих каталогів**, перелічених у змінній оточення `PATH`.
Наприклад, коли ви вводите `python` у терміналі, операційна система шукає програму з назвою `python` у **першому каталозі** цього списку.
Якщо знайде, вона **використає її**. Інакше продовжить пошук в **інших каталогах**.
### Встановлення Python і оновлення `PATH` { #installing-python-and-updating-the-path }
Під час встановлення Python вас можуть запитати, чи хочете ви оновити змінну оточення `PATH`.
//// tab | Linux, macOS
Припустімо, ви встановлюєте Python і він опиняється в каталозі `/opt/custompython/bin`.
Якщо ви погодитеся оновити змінну оточення `PATH`, інсталятор додасть `/opt/custompython/bin` до змінної `PATH`.
Це може виглядати так:
```plaintext
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/custompython/bin
```
Тепер, коли ви введете `python` у терміналі, система знайде програму Python у `/opt/custompython/bin` (останній каталог) і використає саме її.
////
//// tab | Windows
Припустімо, ви встановлюєте Python і він опиняється в каталозі `C:\opt\custompython\bin`.
Якщо ви погодитеся оновити змінну оточення `PATH`, інсталятор додасть `C:\opt\custompython\bin` до змінної `PATH`.
```plaintext
C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32;C:\opt\custompython\bin
```
Тепер, коли ви введете `python` у терміналі, система знайде програму Python у `C:\opt\custompython\bin` (останній каталог) і використає саме її.
////
Отже, якщо ви введете:
<div class="termy">
```console
$ python
```
</div>
//// tab | Linux, macOS
Система **знайде** програму `python` у `/opt/custompython/bin` і запустить її.
Це приблизно еквівалентно введенню:
<div class="termy">
```console
$ /opt/custompython/bin/python
```
</div>
////
//// tab | Windows
Система **знайде** програму `python` у `C:\opt\custompython\bin\python` і запустить її.
Це приблизно еквівалентно введенню:
<div class="termy">
```console
$ C:\opt\custompython\bin\python
```
</div>
////
Ця інформація стане у пригоді під час вивчення [Віртуальних середовищ](virtual-environments.md).
## Висновок { #conclusion }
Тепер ви маєте базове розуміння того, що таке **змінні оточення** і як їх використовувати в Python.
Також можна прочитати більше у [Вікіпедії про змінну оточення](https://en.wikipedia.org/wiki/Environment_variable).
У багатьох випадках не одразу очевидно, як змінні оточення будуть корисними та застосовними. Але вони постійно з’являються в різних сценаріях під час розробки, тож варто про них знати.
Наприклад, вам знадобиться ця інформація в наступному розділі про [Віртуальні середовища](virtual-environments.md).
Прочитайте [посібник зі змінних оточення](https://tiangolo.com/guides/environment-variables/) для детального, кросплатформного пояснення, зокрема як створювати й читати змінні оточення та як працює змінна оточення `PATH`.
+9 -5
View File
@@ -2,7 +2,7 @@
**FastAPI <abbr title="command line interface - інтерфейс командного рядка">CLI</abbr>** — це програма командного рядка, яку ви можете використовувати, щоб обслуговувати ваш застосунок FastAPI, керувати вашим проєктом FastAPI тощо.
Коли ви встановлюєте FastAPI (наприклад, за допомогою `pip install "fastapi[standard]"`), він постачається з програмою командного рядка, яку можна запускати в терміналі.
Коли ви додаєте FastAPI до вашого проєкту (наприклад, за допомогою `uv add "fastapi[standard]"`), він постачається з програмою командного рядка, яку можна запускати в терміналі.
Щоб запустити ваш застосунок FastAPI для розробки, ви можете використати команду `fastapi dev`:
@@ -52,7 +52,7 @@ $ <font color="#4E9A06">fastapi</font> dev
///
Внутрішньо **FastAPI CLI** використовує [Uvicorn](https://www.uvicorn.dev), високопродуктивний, готовий до продакшну ASGI сервер. 😎
Внутрішньо **FastAPI CLI** використовує [Uvicorn](https://uvicorn.dev), високопродуктивний, готовий до продакшну ASGI сервер. 😎
CLI `fastapi` спробує автоматично визначити застосунок FastAPI для запуску, припускаючи, що це об'єкт з назвою `app` у файлі `main.py` (або кілька інших варіантів).
@@ -100,13 +100,13 @@ from backend.main import app
Ви також можете передати шлях до файлу команді `fastapi dev`, і вона здогадається, який об'єкт застосунку FastAPI використовувати:
```console
$ fastapi dev main.py
$ uv run fastapi dev main.py
```
Або ви також можете передати опцію `--entrypoint` команді `fastapi dev`:
```console
$ fastapi dev --entrypoint main:app
$ uv run fastapi dev --entrypoint main:app
```
Але вам доведеться щоразу пам'ятати, щоб передавати правильний шлях\entrypoint під час виклику команди `fastapi`.
@@ -119,9 +119,13 @@ $ fastapi dev --entrypoint main:app
За замовчуванням **auto-reload** увімкнено, і сервер автоматично перезавантажується, коли ви вносите зміни у ваш код. Це ресурсоємно та може бути менш стабільним, ніж коли його вимкнено. Вам слід використовувати це лише для розробки. Також він слухає IP-адресу `127.0.0.1`, яка є IP-адресою для того, щоб ваша машина могла взаємодіяти лише сама з собою (`localhost`).
Перед імпортом вашого застосунку `fastapi dev` встановлює змінну оточення `FASTAPI_ENV` у значення `development`. Якщо `FASTAPI_ENV` уже встановлено, його наявне значення зберігається. Це дозволяє коду запуску застосунку обирати зручну для розробки поведінку, водночас даючи вам змогу вказати оточення, специфічне для застосунку, наприклад `staging`.
Умовними значеннями `FASTAPI_ENV` є `development` і `production`. Наразі `fastapi run` залишає `FASTAPI_ENV` без змін, тому встановіть його явно, якщо вашому застосунку потрібно визначати продакшн-режим.
## `fastapi run` { #fastapi-run }
Виконання `fastapi run` за замовчуванням запускає FastAPI у продакшн-режимі.
Виконання `fastapi run` запускає FastAPI у продакшн-режимі.
За замовчуванням **auto-reload** вимкнено. Також він слухає IP-адресу `0.0.0.0`, що означає всі доступні IP-адреси, таким чином він буде публічно доступним для будь-кого, хто може взаємодіяти з машиною. Зазвичай саме так ви запускатимете його в продакшн, наприклад у контейнері.
+3 -3
View File
@@ -19,7 +19,7 @@
![взаємодія Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png)
* Альтернативна документація API за допомогою [**ReDoc**](https://github.com/Rebilly/ReDoc).
* Альтернативна документація API за допомогою [**ReDoc**](https://github.com/Redocly/redoc).
![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png)
@@ -159,7 +159,7 @@ FastAPI містить надзвичайно просту у використа
## Можливості Starlette { #starlette-features }
**FastAPI** повністю сумісний із (та побудований на основі) [**Starlette**](https://www.starlette.dev/). Тому будь-який додатковий код Starlette, який ви маєте, також працюватиме.
**FastAPI** повністю сумісний із (та побудований на основі) [**Starlette**](https://starlette.dev/). Тому будь-який додатковий код Starlette, який ви маєте, також працюватиме.
`FastAPI` фактично є підкласом `Starlette`. Тому, якщо ви вже знайомі зі Starlette або використовуєте його, більшість функціональності працюватиме так само.
@@ -177,7 +177,7 @@ FastAPI містить надзвичайно просту у використа
## Можливості Pydantic { #pydantic-features }
**FastAPI** повністю сумісний із (та побудований на основі) [**Pydantic**](https://docs.pydantic.dev/). Тому будь-який додатковий код Pydantic, який ви маєте, також працюватиме.
**FastAPI** повністю сумісний із (та побудований на основі) [**Pydantic**](https://pydantic.dev/docs/). Тому будь-який додатковий код Pydantic, який ви маєте, також працюватиме.
Включно із зовнішніми бібліотеками, які також базуються на Pydantic, як-от <abbr title="Object-Relational Mapper - Об'єктно-реляційний відображувач">ORM</abbr>-и, <abbr title="Object-Document Mapper - Об'єктно-документний відображувач">ODM</abbr>-и для баз даних.
+7 -15
View File
@@ -45,20 +45,6 @@
* [@tiangolo.com у **Bluesky**](https://bsky.app/profile/tiangolo.com)
* [@tiangolo у **LinkedIn**](https://www.linkedin.com/in/tiangolo/).
## Допомагайте іншим з питаннями на GitHub { #help-others-with-questions-in-github }
Ви можете спробувати допомагати іншим з їхніми питаннями у [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered).
У багатьох випадках ви вже можете знати відповідь на ці питання. 🤓
Якщо ви багато допомагаєте людям із їхніми питаннями, ви станете офіційним [Експертом FastAPI](fastapi-people.md#fastapi-experts). 🎉
Пам'ятайте, найважливіше: намагайтеся бути добрими. 🤗
### Як допомагати { #how-to-help }
Дотримуйтесь [посібника, як допомагати](https://tiangolo.com/open-source/help/#help-others-with-questions-in-github) тут.
## Ставте питання { #ask-questions }
Ви можете [створити нове питання](https://github.com/fastapi/fastapi/discussions/new?category=questions) у репозиторії GitHub, наприклад, щоб:
@@ -68,7 +54,7 @@
## Долучайтеся до чату { #join-the-chat }
Долучайтеся до 👥 [серверу чату Discord](https://discord.gg/VQjSZaeJmf) 👥 і спілкуйтеся з іншими в спільноті FastAPI.
Долучайтеся до 👥 [серверу чату Discord](https://discord.com/invite/VQjSZaeJmf) 👥 і спілкуйтеся з іншими в спільноті FastAPI.
/// tip | Порада
@@ -85,3 +71,9 @@
У GitHub шаблон підкаже вам, як написати правильне питання, щоб ви легше отримали хорошу відповідь, або навіть розв'язали проблему самостійно ще до запиту.
Розмови в чатах також не так просто шукати, як у GitHub, вони губляться.
## Спробуйте FastAPI Cloud { #try-fastapi-cloud }
Основне фінансування FastAPI та друзів надходить від [**FastAPI Cloud**](https://fastapicloud.com), платформи для розгортання застосунків FastAPI простим і швидким способом, однією командою, `fastapi deploy`.
FastAPI Cloud створено тією ж командою, що стоїть за FastAPI. Ви можете спробувати його та розглянути для своїх проєктів.
+3 -3
View File
@@ -44,7 +44,7 @@
Я протестував кілька ідей у найпопулярніших Python-редакторах: PyCharm, VS Code, редакторах на основі Jedi.
За даними [Python Developer Survey](https://www.jetbrains.com/research/python-developers-survey-2018/#development-tools), це охоплює близько 80% користувачів.
За даними останнього [Python Developer Survey](https://www.jetbrains.com/research/python-developers-survey-2018/#development-tools), це охоплює близько 80% користувачів.
Це означає, що **FastAPI** спеціально тестувався з редакторами, якими користуються 80% розробників Python. І оскільки більшість інших редакторів працюють подібно, усі ці переваги мають працювати практично у всіх редакторах.
@@ -54,11 +54,11 @@
## Вимоги { #requirements }
Після перевірки кількох альтернатив я вирішив використовувати [**Pydantic**](https://docs.pydantic.dev/) через його переваги.
Після перевірки кількох альтернатив я вирішив використовувати [**Pydantic**](https://pydantic.dev/docs/) через його переваги.
Потім я зробив внески до нього, щоб зробити його повністю сумісним із Схемою JSON, додати підтримку різних способів оголошення обмежень і поліпшити підтримку редакторів (перевірки типів, автодоповнення) на основі тестів у кількох редакторах.
Під час розробки я також зробив внески до [**Starlette**](https://www.starlette.dev/), іншої ключової залежності.
Під час розробки я також зробив внески до [**Starlette**](https://starlette.dev/), іншої ключової залежності.
## Розробка { #development }
@@ -66,7 +66,7 @@
І саме ці дві сутності - `scope` та `receive` - потрібні для створення нового екземпляра `Request`.
Щоб дізнатися більше про `Request`, перегляньте [документацію Starlette про запити](https://www.starlette.dev/requests/).
Щоб дізнатися більше про `Request`, перегляньте [документацію Starlette про запити](https://starlette.dev/requests/).
///
+1 -1
View File
@@ -45,7 +45,7 @@
Використовуючи наведене вище, ви можете скористатися тією ж утилітарною функцією для генерації схеми OpenAPI і переписати потрібні частини.
Наприклад, додаймо [розширення OpenAPI ReDoc для додавання власного логотипа](https://github.com/Rebilly/ReDoc/blob/master/docs/redoc-vendor-extensions.md#x-logo).
Наприклад, додаймо [розширення OpenAPI ReDoc для додавання власного логотипа](https://github.com/Redocly/redoc/blob/main/docs/redoc-vendor-extensions.md#x-logo).
### Звичайний **FastAPI** { #normal-fastapi }
+1 -1
View File
@@ -21,7 +21,7 @@
* [Strawberry](https://strawberry.rocks/) 🍓
* З [документацією для FastAPI](https://strawberry.rocks/docs/integrations/fastapi)
* [Ariadne](https://ariadnegraphql.org/)
* З [документацією для FastAPI](https://ariadnegraphql.org/docs/fastapi-integration)
* З [документацією для FastAPI](https://ariadnegraphql.org/server/Integrations/fastapi-integration)
* [Tartiflette](https://tartiflette.io/)
* З [Tartiflette ASGI](https://tartiflette.github.io/tartiflette-asgi/) для інтеграції з ASGI
* [Graphene](https://graphene-python.org/)
@@ -24,7 +24,7 @@ FastAPI 0.128.0 також припинив підтримку `pydantic.v1`, т
## Офіційний посібник { #official-guide }
У Pydantic є офіційний [Посібник з міграції](https://docs.pydantic.dev/latest/migration/) з v1 на v2.
У Pydantic є офіційний [Посібник з міграції](https://pydantic.dev/docs/validation/latest/get-started/migration/) з v1 на v2.
Там описано, що змінилося, як перевірки тепер стали коректнішими та суворішими, можливі застереження тощо.
+21 -25
View File
@@ -45,7 +45,7 @@ FastAPI - це сучасний, швидкий (високопродуктив
* **Швидкий**: дуже висока продуктивність, на рівні з **NodeJS** та **Go** (завдяки Starlette та Pydantic). [Один із найшвидших Python-фреймворків](#performance).
* **Швидке написання коду**: пришвидшує розробку функціоналу приблизно на 200%–300%. *
* **Менше помилок**: зменшує приблизно на 40% кількість помилок, спричинених людиною (розробником). *
* **Інтуїтивний**: чудова підтримка редакторами коду. <dfn title="також відоме як: авто-доповнення, автозавершення, IntelliSense">Автодоповнення</dfn> всюди. Менше часу на налагодження.
* **Інтуїтивний**: чудова підтримка редакторами коду. <dfn title="також відоме як автодоповнення, автозавершення, IntelliSense">Автодоповнення</dfn> всюди. Менше часу на налагодження.
* **Простий**: спроєктований так, щоб бути простим у використанні та вивченні. Менше часу на читання документації.
* **Короткий**: мінімізує дублювання коду. Кілька можливостей з кожного оголошення параметра. Менше помилок.
* **Надійний**: ви отримуєте код, готовий до продакшну. З автоматичною інтерактивною документацією.
@@ -110,7 +110,7 @@ FastAPI - це сучасний, швидкий (високопродуктив
</div>
<div class="fastapi-opinions__panel" id="fo-panel-uber" role="tabpanel" aria-labelledby="fo-tab-uber" tabindex="0" hidden>
<blockquote class="fastapi-opinions__quote">«Ми прийняли бібліотеку <strong>FastAPI</strong>, щоб запустити сервер <strong>REST</strong>, до якого можна надсилати запити для отримання <strong>прогнозів</strong>». <em>[для Ludwig]</em></blockquote>
<div class="fastapi-opinions__attr">- Piero Molino, Yaroslav Dudin, Sai Sumanth Miryala, <strong>Uber</strong> <a href="https://eng.uber.com/ludwig-v0-2/">(джерело)</a></div>
<div class="fastapi-opinions__attr">- Piero Molino, Yaroslav Dudin, Sai Sumanth Miryala, <strong>Uber</strong> <a href="https://www.uber.com/us/en/blog/ludwig-v0-2/">(джерело)</a></div>
</div>
<div class="fastapi-opinions__panel" id="fo-panel-netflix" role="tabpanel" aria-labelledby="fo-tab-netflix" tabindex="0" hidden>
<blockquote class="fastapi-opinions__quote">«<strong>Netflix</strong> із задоволенням оголошує про випуск з відкритим кодом нашого фреймворку оркестрації <strong>керування кризами</strong>: <strong>Dispatch</strong>!» <em>[побудовано з FastAPI]</em></blockquote>
@@ -133,7 +133,7 @@ FastAPI - це сучасний, швидкий (високопродуктив
"_Ми прийняли бібліотеку **FastAPI**, щоб запустити сервер **REST**, до якого можна надсилати запити для отримання **прогнозів**. [для Ludwig]_"
<div style="text-align: right; margin-right: 10%;">Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - <strong>Uber</strong> <a href="https://eng.uber.com/ludwig-v0-2/"><small>(джерело)</small></a></div>
<div style="text-align: right; margin-right: 10%;">Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - <strong>Uber</strong> <a href="https://www.uber.com/us/en/blog/ludwig-v0-2/"><small>(джерело)</small></a></div>
---
@@ -151,12 +151,6 @@ FastAPI - це сучасний, швидкий (високопродуктив
</div>
## Конференція FastAPI { #fastapi-conf }
[**FastAPI Conf '26**](https://fastapiconf.com) відбудеться **28 жовтня 2026 року** в **Амстердамі, Нідерланди**. Усе про FastAPI з першоджерела. 🎤
<a class="fastapi-feature-banner" href="https://fastapiconf.com"><img src="https://fastapi.tiangolo.com/img/fastapi-conf.jpeg" alt="FastAPI Conf '26 - October 28, 2026 - Amsterdam, NL"></a>
## Міні-документальний фільм про FastAPI { #fastapi-mini-documentary }
Наприкінці 2025 року вийшов [міні-документальний фільм про FastAPI](https://www.youtube.com/watch?v=mpR8ngthqiE), ви можете переглянути його онлайн:
@@ -175,17 +169,17 @@ FastAPI - це сучасний, швидкий (високопродуктив
FastAPI стоїть на плечах гігантів:
* [Starlette](https://www.starlette.dev/) для вебчастини.
* [Pydantic](https://docs.pydantic.dev/) для частини даних.
* [Starlette](https://starlette.dev/) для вебчастини.
* [Pydantic](https://pydantic.dev/docs/) для частини даних.
## Встановлення { #installation }
Створіть і активуйте [віртуальне середовище](https://fastapi.tiangolo.com/uk/virtual-environments/), а потім встановіть FastAPI:
Спочатку [встановіть `uv`](https://docs.astral.sh/uv/getting-started/installation/), а потім додайте FastAPI до вашого проєкту:
<div class="termy">
```console
$ pip install "fastapi[standard]"
$ uv add "fastapi[standard]"
---> 100%
```
@@ -194,6 +188,8 @@ $ pip install "fastapi[standard]"
**Примітка**: переконайтеся, що ви взяли `"fastapi[standard]"` у лапки, щоб це працювало в усіх терміналах.
Якщо ви віддаєте перевагу `pip`, встановіть `fastapi[standard]` у віртуальному середовищі. Дивіться [посібник зі встановлення](tutorial/#install-fastapi) для альтернативних кроків.
## Приклад { #example }
### Створіть { #create-it }
@@ -250,7 +246,7 @@ async def read_item(item_id: int, q: str | None = None):
<div class="termy">
```console
$ fastapi dev
$ uv run fastapi dev
╭────────── FastAPI CLI - Development mode ───────────╮
│ │
@@ -277,7 +273,7 @@ INFO: Application startup complete.
<details markdown="1">
<summary>Про команду <code>fastapi dev</code>...</summary>
Команда `fastapi dev` автоматично читає ваш файл `main.py`, знаходить у ньому застосунок **FastAPI** і запускає сервер за допомогою [Uvicorn](https://www.uvicorn.dev).
Команда `fastapi dev` автоматично читає ваш файл `main.py`, знаходить у ньому застосунок **FastAPI** і запускає сервер за допомогою [Uvicorn](https://uvicorn.dev).
За замовчуванням `fastapi dev` запускається з авто-перезавантаженням для локальної розробки.
@@ -314,7 +310,7 @@ INFO: Application startup complete.
А тепер перейдіть на [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc).
Ви побачите альтернативну автоматичну документацію (надану [ReDoc](https://github.com/Rebilly/ReDoc)):
Ви побачите альтернативну автоматичну документацію (надану [ReDoc](https://github.com/Redocly/redoc)):
![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png)
@@ -479,7 +475,7 @@ item: Item
* Оголошення **параметрів** з інших різних місць, як-от: **заголовки**, **кукі**, **поля форми** та **файли**.
* Як встановлювати **обмеження валідації** як `maximum_length` або `regex`.
* Дуже потужну і просту у використанні систему **<dfn title="також відоме як: компоненти, ресурси, провайдери, сервіси, інжектовані залежності">Впровадження залежностей</dfn>**.
* Дуже потужну і просту у використанні систему **<dfn title="також відоме як компоненти, ресурси, провайдери, сервіси, інжектовані залежності">Впровадження залежностей</dfn>**.
* Безпеку та автентифікацію, включно з підтримкою **OAuth2** з **токенами JWT** та **базовою автентифікацією HTTP**.
* Досконаліші (але однаково прості) техніки для оголошення **глибоко вкладених моделей JSON** (завдяки Pydantic).
* Інтеграцію **GraphQL** з [Strawberry](https://strawberry.rocks) та іншими бібліотеками.
@@ -497,7 +493,7 @@ item: Item
<div class="termy">
```console
$ fastapi deploy
$ uv run fastapi deploy
Deploying to FastAPI Cloud...
@@ -540,7 +536,7 @@ FastAPI залежить від Pydantic і Starlette.
### Залежності `standard` { #standard-dependencies }
Коли ви встановлюєте FastAPI за допомогою `pip install "fastapi[standard]"`, ви отримуєте групу необовʼязкових залежностей `standard`:
Коли ви встановлюєте FastAPI за допомогою `uv add "fastapi[standard]"`, ви отримуєте групу необовʼязкових залежностей `standard`:
Використовується Pydantic:
@@ -554,17 +550,17 @@ FastAPI залежить від Pydantic і Starlette.
Використовується FastAPI:
* [`uvicorn`](https://www.uvicorn.dev) - для сервера, який завантажує та обслуговує ваш застосунок. Це включає `uvicorn[standard]`, до якого входять деякі залежності (наприклад, `uvloop`), потрібні для високопродуктивної роботи сервера.
* [`uvicorn`](https://uvicorn.dev) - для сервера, який завантажує та обслуговує ваш застосунок. Це включає `uvicorn[standard]`, до якого входять деякі залежності (наприклад, `uvloop`), потрібні для високопродуктивної роботи сервера.
* `fastapi-cli[standard]` - щоб надати команду `fastapi`.
* Це включає `fastapi-cloud-cli`, який дозволяє розгортати ваш застосунок FastAPI у [FastAPI Cloud](https://fastapicloud.com).
### Без залежностей `standard` { #without-standard-dependencies }
Якщо ви не хочете включати необовʼязкові залежності `standard`, ви можете встановити через `pip install fastapi` замість `pip install "fastapi[standard]"`.
Якщо ви не хочете включати необовʼязкові залежності `standard`, ви можете встановити через `uv add fastapi` замість `uv add "fastapi[standard]"`.
### Без `fastapi-cloud-cli` { #without-fastapi-cloud-cli }
Якщо ви хочете встановити FastAPI зі стандартними залежностями, але без `fastapi-cloud-cli`, ви можете встановити через `pip install "fastapi[standard-no-fastapi-cloud-cli]"`.
Якщо ви хочете встановити FastAPI зі стандартними залежностями, але без `fastapi-cloud-cli`, ви можете встановити через `uv add "fastapi[standard-no-fastapi-cloud-cli]"`.
### Додаткові необовʼязкові залежності { #additional-optional-dependencies }
@@ -572,13 +568,13 @@ FastAPI залежить від Pydantic і Starlette.
Додаткові необовʼязкові залежності Pydantic:
* [`pydantic-settings`](https://docs.pydantic.dev/latest/usage/pydantic_settings/) - для керування налаштуваннями.
* [`pydantic-extra-types`](https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/) - для додаткових типів, що можуть бути використані з Pydantic.
* [`pydantic-settings`](https://pydantic.dev/docs/validation/latest/concepts/pydantic_settings/) - для керування налаштуваннями.
* [`pydantic-extra-types`](https://github.com/pydantic/pydantic-extra-types) - для додаткових типів, що можуть бути використані з Pydantic.
Додаткові необовʼязкові залежності FastAPI:
* [`orjson`](https://github.com/ijl/orjson) - потрібно, якщо ви хочете використовувати `ORJSONResponse`.
* [`ujson`](https://github.com/esnme/ultrajson) - потрібно, якщо ви хочете використовувати `UJSONResponse`.
* [`ujson`](https://github.com/ultrajson/ultrajson) - потрібно, якщо ви хочете використовувати `UJSONResponse`.
## Ліцензія { #license }
+2 -3
View File
@@ -1,17 +1,16 @@
# Шаблон Full Stack FastAPI { #full-stack-fastapi-template }
Шаблони, хоча зазвичай постачаються з певним налаштуванням, спроєктовані бути гнучкими та налаштовуваними. Це дає змогу змінювати їх і адаптувати до вимог вашого проєкту, що робить їх чудовою відправною точкою. 🏁
Ви можете використати цей шаблон для старту, адже в ньому вже виконано значну частину початкового налаштування, безпеки, роботи з базою даних і деяких кінцевих точок API.
Репозиторій GitHub: [Шаблон Full Stack FastAPI](https://github.com/tiangolo/full-stack-fastapi-template)
Репозиторій GitHub: [Шаблон Full Stack FastAPI](https://github.com/fastapi/full-stack-fastapi-template)
## Шаблон Full Stack FastAPI - стек технологій і можливості { #full-stack-fastapi-template-technology-stack-and-features }
- ⚡ [**FastAPI**](https://fastapi.tiangolo.com/uk) для бекенд API на Python.
- 🧰 [SQLModel](https://sqlmodel.tiangolo.com) для взаємодії з SQL-базою даних у Python (ORM).
- 🔍 [Pydantic](https://docs.pydantic.dev), який використовується FastAPI, для перевірки даних і керування налаштуваннями.
- 🔍 [Pydantic](https://pydantic.dev/docs/), який використовується FastAPI, для перевірки даних і керування налаштуваннями.
- 💾 [PostgreSQL](https://www.postgresql.org) як SQL-база даних.
- 🚀 [React](https://react.dev) для фронтенду.
- 💃 Використання TypeScript, хуків, Vite та інших частин сучасного фронтенд-стеку.
+2 -2
View File
@@ -269,7 +269,7 @@ def some_function(data: Any):
## Моделі Pydantic { #pydantic-models }
[Pydantic](https://docs.pydantic.dev/) це бібліотека Python для валідації даних.
[Pydantic](https://pydantic.dev/docs/) - це бібліотека Python для валідації даних.
Ви оголошуєте «форму» даних як класи з атрибутами.
@@ -285,7 +285,7 @@ def some_function(data: Any):
/// note | Примітка
Щоб дізнатись більше про [Pydantic, перегляньте його документацію](https://docs.pydantic.dev/).
Щоб дізнатись більше про [Pydantic, перегляньте його документацію](https://pydantic.dev/docs/).
///
+6 -4
View File
@@ -25,7 +25,7 @@
Це звичайна функція, яка може отримувати параметри.
Вона може бути асинхронною `async def` або звичайною `def` функцією **FastAPI** обробить її правильно.
Вона може бути асинхронною `async def` або звичайною `def` функцією - **FastAPI** обробить її правильно.
У нашому випадку функція записує у файл (імітуючи надсилання email).
@@ -51,8 +51,10 @@
**FastAPI** знає, як діяти в кожному випадку і як повторно використовувати один і той самий об'єкт, щоб усі фонові задачі були об’єднані та виконувалися у фоновому режимі після завершення основного запиту:
{* ../../docs_src/background_tasks/tutorial002_an_py310.py hl[13,15,22,25] *}
У цьому прикладі повідомлення будуть записані у файл `log.txt` після того, як відповідь буде надіслана.
Якщо у запиті був переданий параметр запиту, він буде записаний у лог у фоновій задачі.
@@ -61,7 +63,7 @@
## Технічні деталі { #technical-details }
Клас `BackgroundTasks` походить безпосередньо з [`starlette.background`](https://www.starlette.dev/background/).
Клас `BackgroundTasks` походить безпосередньо з [`starlette.background`](https://starlette.dev/background/).
Він імпортується/включається безпосередньо у FastAPI, щоб ви могли імпортувати його з `fastapi` і випадково не імпортували альтернативний `BackgroundTask` (без `s` в кінці) з `starlette.background`.
@@ -69,13 +71,13 @@
Також можна використовувати `BackgroundTask` окремо в FastAPI, але для цього вам доведеться створити об'єкт у коді та повернути Starlette `Response`, включаючи його.
Детальніше можна почитати в [офіційній документації Starlette про Background Tasks](https://www.starlette.dev/background/).
Детальніше можна почитати в [офіційній документації Starlette про Background Tasks](https://starlette.dev/background/).
## Застереження { #caveat }
Якщо вам потрібно виконувати складні фонові обчислення, і при цьому нема потреби запускати їх у тому ж процесі (наприклад, не потрібно спільного доступу до пам’яті чи змінних), можливо, варто скористатися більш потужними інструментами, такими як [Celery](https://docs.celeryq.dev).
Такі інструменти зазвичай потребують складнішої конфігурації та менеджера черги повідомлень/завдань, наприклад, RabbitMQ або Redis. Однак вони дозволяють виконувати фонові задачі в кількох процесах і особливо на кількох серверах.
Такі інструменти зазвичай потребують складнішої конфігурації та менеджера черги повідомлень/завдань, наприклад, RabbitMQ або Redis. Однак вони дозволяють виконувати фонові задачі в кількох процесах і особливо - на кількох серверах.
Якщо ж вам потрібно отримати доступ до змінних і об’єктів із тієї ж **FastAPI**-програми або виконувати невеликі фонові завдання (наприклад, надсилати email-сповіщення), достатньо просто використовувати `BackgroundTasks`.
+2 -2
View File
@@ -487,7 +487,7 @@ from app.main import app
Ви також могли б передати шлях команді, наприклад:
```console
$ fastapi dev app/main.py
$ uv run fastapi dev app/main.py
```
Але тоді вам доведеться щоразу пам'ятати, щоб передавати правильний шлях, коли ви викликаєте команду `fastapi`.
@@ -503,7 +503,7 @@ $ fastapi dev app/main.py
<div class="termy">
```console
$ fastapi dev
$ uv run fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
+1 -1
View File
@@ -96,7 +96,7 @@ my_list: list[str]
Окрім звичайних одиничних типів, таких як `str`, `int`, `float`, та ін. ви можете використовувати складніші одиничні типи, які наслідують `str`.
Щоб побачити всі доступні варіанти, ознайомтеся з [Оглядом типів у Pydantic](https://docs.pydantic.dev/latest/concepts/types/). Деякі приклади будуть у наступному розділі.
Щоб побачити всі доступні варіанти, ознайомтеся з [Оглядом типів у Pydantic](https://pydantic.dev/docs/validation/latest/concepts/types/). Деякі приклади будуть у наступному розділі.
Наприклад, оскільки в моделі `Image` є поле `url`, ми можемо оголосити його як екземпляр `HttpUrl` від Pydantic замість `str`:
+1 -1
View File
@@ -6,7 +6,7 @@
Ваш API майже завжди має надсилати тіло **відповіді**. Але клієнтам не обов’язково потрібно постійно надсилати тіла **запитів** - інколи вони лише запитують шлях, можливо з деякими параметрами запиту, але не надсилають тіло.
Щоб оголосити тіло **запиту**, ви використовуєте [Pydantic](https://docs.pydantic.dev/) моделі з усією їх потужністю та перевагами.
Щоб оголосити тіло **запиту**, ви використовуєте [Pydantic](https://pydantic.dev/docs/) моделі з усією їх потужністю та перевагами.
/// note | Примітка
+2 -2
View File
@@ -16,7 +16,7 @@
<div class="termy">
```console
$ python myapp.py
$ uv run python myapp.py
```
</div>
@@ -36,7 +36,7 @@ from myapp import app
<div class="termy">
```console
$ python myapp.py
$ uv run python myapp.py
```
</div>
+2 -2
View File
@@ -36,7 +36,7 @@
* `datetime.timedelta`:
* Пайтонівський `datetime.timedelta`.
* У запитах та відповідях буде представлений як `float` загальної кількості секунд.
* Pydantic також дозволяє представляти це як «ISO 8601 time diff encoding», [дивіться документацію для отримання додаткової інформації](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers).
* Pydantic також дозволяє представляти це як «ISO 8601 time diff encoding», [дивіться документацію для отримання додаткової інформації](https://pydantic.dev/docs/validation/latest/concepts/serialization/#custom-serializers).
* `frozenset`:
* У запитах і відповідях це буде оброблено так само, як і `set`:
* У запитах список буде зчитано, дублікати буде видалено, і його буде перетворено на `set`.
@@ -49,7 +49,7 @@
* `Decimal`:
* Стандартний Пайтонівський `Decimal`.
* У запитах і відповідях це буде оброблено так само, як і `float`.
* Ви можете перевірити всі дійсні типи даних Pydantic тут: [типи даних Pydantic](https://docs.pydantic.dev/latest/usage/types/types/).
* Ви можете перевірити всі дійсні типи даних Pydantic тут: [типи даних Pydantic](https://pydantic.dev/docs/validation/latest/concepts/types/).
## Приклад { #example }
+1 -1
View File
@@ -166,7 +166,7 @@ UserInDB(
/// note | Примітка
Під час визначення [`Union`](https://docs.pydantic.dev/latest/concepts/types/#unions) спочатку вказуйте найконкретніший тип, а потім менш конкретний. У прикладі нижче більш конкретний `PlaneItem` стоїть перед `CarItem` у `Union[PlaneItem, CarItem]`.
Під час визначення [`Union`](https://pydantic.dev/docs/validation/latest/concepts/unions/) спочатку вказуйте найконкретніший тип, а потім менш конкретний. У прикладі нижче більш конкретний `PlaneItem` стоїть перед `CarItem` у `Union[PlaneItem, CarItem]`.
///
+12 -6
View File
@@ -6,12 +6,18 @@
Скопіюйте це до файлу `main.py`.
/// tip | Порада
FastAPI має [офіційне розширення для VS Code](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) (і Cursor), яке надає багато функцій, включно з оглядачем операцій шляху, пошуком операцій шляху, навігацією CodeLens у тестах (перехід до визначення з тестів), а також розгортанням і логами FastAPI Cloud - усе з вашого редактора.
///
Запустіть live-сервер:
<div class="termy">
```console
$ <font color="#4E9A06">fastapi</font> dev
$ <font color="#4E9A06">uv run fastapi</font> dev
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server 🚀
@@ -78,7 +84,7 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
А тепер перейдіть сюди [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc).
Ви побачите альтернативну автоматичну документацію (надається [ReDoc](https://github.com/Rebilly/ReDoc)):
Ви побачите альтернативну автоматичну документацію (надається [ReDoc](https://github.com/Redocly/redoc)):
![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png)
@@ -185,13 +191,13 @@ from backend.main import app
Ви також можете передати шлях до файлу в команду `fastapi dev`, і вона вгадає обʼєкт FastAPI app, який слід використовувати:
```console
$ fastapi dev main.py
$ uv run fastapi dev main.py
```
Або ви також можете передати параметр `--entrypoint` команді `fastapi dev`:
```console
$ fastapi dev --entrypoint main:app
$ uv run fastapi dev --entrypoint main:app
```
Але вам доведеться щоразу памʼятати передавати правильний шлях\entrypoint під час виклику команди `fastapi`.
@@ -205,7 +211,7 @@ $ fastapi dev --entrypoint main:app
<div class="termy">
```console
$ fastapi deploy
$ uv run fastapi deploy
Deploying to FastAPI Cloud...
@@ -232,7 +238,7 @@ CLI автоматично визначить ваш застосунок FastAP
`FastAPI` - це клас, який успадковується безпосередньо від `Starlette`.
Ви також можете використовувати всю функціональність [Starlette](https://www.starlette.dev/) у `FastAPI`.
Ви також можете використовувати всю функціональність [Starlette](https://starlette.dev/) у `FastAPI`.
///
+10 -4
View File
@@ -52,9 +52,9 @@ npm run build
{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *}
**FastAPI** використовує цей fallback лише для запитів `GET` і `HEAD`, які виглядають як навігація браузера. Відсутні файли, як-от JavaScript, CSS і зображення, все ще повертають `404`.
**FastAPI** використовує цей fallback лише для запитів `GET` і `HEAD`, які явно приймають HTML з `Accept: text/html` або `Accept: application/xhtml+xml`, як зазвичай роблять запити навігації браузера. Відсутні файли, як-от JavaScript, CSS і зображення, все ще повертають `404`.
Запити з іншими методами, як-от `POST` або `PUT`, до шляхів, що збігаються лише з frontend fallback, також повертають `404`. Звичайні *операції шляху* **FastAPI** все ще мають вищий пріоритет, ніж фронтенд-маршрути.
Запити з іншими методами, як-от `POST` або `PUT`, до шляхів, що збігаються лише з frontend fallback, також повертають `404`. Звичайні **FastAPI** *операції шляху* все ще мають вищий пріоритет, ніж фронтенд-маршрути.
/// tip | Порада
@@ -106,9 +106,13 @@ npm run build
## Перевірка директорії { #check-directory }
За замовчуванням `app.frontend()` перевіряє, що директорія існує, коли застосунок створюється.
За замовчуванням `app.frontend()` використовує `check_dir="auto"`.
Це допомагає виявити помилки конфігурації завчасно. Наприклад, якщо директорія вихідних файлів збірки фронтенду відсутня, **FastAPI** викличе помилку під час запуску.
Коли змінна оточення `FASTAPI_ENV` має значення `development`, **FastAPI** лише показує попередження, якщо директорія вихідних файлів збірки фронтенду відсутня. Команда [`fastapi dev`](https://github.com/fastapi/fastapi-cli#fastapi-dev) встановлює цю змінну оточення для вас, якщо її ще не встановлено. Це дає змогу запустити бекенд перед збіркою або запуском фронтенду під час розробки.
У будь-якому іншому оточенні **FastAPI** викликає помилку, коли застосунок створюється. Це допомагає виявити помилки конфігурації завчасно перед розгортанням застосунку без його фронтенд-файлів.
Ви також можете встановити `check_dir=True`, щоб завжди перевіряти директорію під час створення застосунку.
Якщо ваші фронтенд-файли створюються пізніше, наприклад окремим кроком збірки після створення об'єкта застосунку, встановіть `check_dir=False`:
@@ -132,6 +136,8 @@ npm run build
Залежності із застосунку, з `APIRouter` і з `include_router()` також застосовуються до фронтенд-відповідей. Це може бути корисно для захисту фронтенду за допомогою автентифікації на основі кукі або подібного.
Залежності також можуть змінювати заголовки відповіді та додавати фонові завдання, як і зі звичайними *операціями шляху*.
## Лише статичний результат збірки { #static-build-output-only }
`app.frontend()` обслуговує файли, вже згенеровані вашою фронтенд-збіркою.
+1 -1
View File
@@ -81,7 +81,7 @@
## Встановлення власних обробників виключень { #install-custom-exception-handlers }
Ви можете додати власні обробники виключень за допомогою [тих самих утиліт для виключень зі Starlette](https://www.starlette.dev/exceptions/).
Ви можете додати власні обробники виключень за допомогою [тих самих утиліт для виключень зі Starlette](https://starlette.dev/exceptions/).
Припустімо, у вас є власне виключення `UnicornException`, яке ви (або бібліотека, яку ви використовуєте) можете `raise`.
+55 -15
View File
@@ -10,12 +10,12 @@
Усі блоки коду можна скопіювати та використовувати безпосередньо (це фактично перевірені файли Python).
Щоб запустити будь-який із прикладів, скопіюйте код у файл `main.py`, і запустіть `fastapi dev`:
Щоб запустити будь-який із прикладів, скопіюйте код у файл `main.py` і запустіть `fastapi dev` за допомогою `uv run`:
<div class="termy">
```console
$ <font color="#4E9A06">fastapi</font> dev
$ <font color="#4E9A06">uv run fastapi</font> dev
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server 🚀
@@ -60,35 +60,75 @@ $ <font color="#4E9A06">fastapi</font> dev
## Встановлення FastAPI { #install-fastapi }
Першим кроком є встановлення FastAPI.
Першим кроком є налаштування вашого проєкту та додавання FastAPI.
Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його, а потім **встановіть FastAPI**:
Встановіть [`uv`](https://docs.astral.sh/uv/getting-started/installation/), потім створіть проєкт і додайте FastAPI:
<div class="termy">
```console
$ pip install "fastapi[standard]"
$ uv init awesome-project --bare
$ cd awesome-project
$ uv add "fastapi[standard]"
---> 100%
```
</div>
`uv add` створює віртуальне середовище проєкту в `.venv`, додає FastAPI до `pyproject.toml` і створює `uv.lock`, щоб ті самі версії пакетів можна було встановити пізніше.
/// details | Що роблять ці команди
* `uv init`: створює новий Python-проєкт.
* `awesome-project`: створює проєкт у новому каталозі з цією назвою.
* `--bare`: створює лише мінімальний файл `pyproject.toml`, без генерування прикладу `main.py`, `README.md` або інших файлів. Ви створите файли застосунку самостійно в наступних кроках цього навчального посібника.
Потім `cd awesome-project` входить до нового каталогу проєкту перед додаванням FastAPI.
`uv` використовуватиме сумісну версію Python, уже встановлену у вашій системі, або завантажить її за потреби.
Коли ви запускаєте `uv add`, він вибирає сумісні версії FastAPI та всіх пакетів, від яких залежить FastAPI. Він записує точні версії в `uv.lock`, що дає змогу встановити ті самі версії пакетів пізніше на іншому комп'ютері або під час розгортання застосунку.
Створення або оновлення цього файлу називається [**закріпленням** залежностей проєкту](https://docs.astral.sh/uv/concepts/projects/sync/). `uv` робить це автоматично, коли ви додаєте пакет.
///
/// details | Варіанти встановлення FastAPI
Коли ви встановлюєте через `uv add "fastapi[standard]"`, він постачається з деякими типовими необов'язковими стандартними залежностями, включно з `fastapi-cloud-cli`, який дозволяє розгортати в [FastAPI Cloud](https://fastapicloud.com).
Якщо ви не хочете мати ці необов'язкові залежності, натомість можете встановити `uv add fastapi`.
Якщо ви хочете встановити стандартні залежності, але без `fastapi-cloud-cli`, ви можете встановити через `uv add "fastapi[standard-no-fastapi-cloud-cli]"`.
///
/// details | Натомість використання `pip`
Якщо ви віддаєте перевагу керуванню віртуальним середовищем і пакетами вручну, створіть і активуйте віртуальне середовище, а потім встановіть FastAPI за допомогою `pip install "fastapi[standard]"`.
Прочитайте [посібник з віртуальних середовищ](https://tiangolo.com/guides/virtual-environments/) для детальних кроків.
///
## Навички AI-агента { #ai-agent-skills }
FastAPI включає офіційну навичку для AI-агентів для кодування. Вона постачається з пакетом, тому її настанови залишаються узгодженими з версією FastAPI, встановленою у вашому проєкті, і оновлюються, коли ви оновлюєте FastAPI.
Після встановлення FastAPI у вашому проєкті ви можете встановити навичку за допомогою <a href="https://library-skills.io">Library Skills</a>:
```bash
uvx library-skills
```
/// note | Примітка
Коли ви встановлюєте через `pip install "fastapi[standard]"`, він постачається з деякими типовими необов’язковими стандартними залежностями, включно з `fastapi-cloud-cli`, який дозволяє розгортати в [FastAPI Cloud](https://fastapicloud.com).
Якщо ви не хочете мати ці необов’язкові залежності, натомість можете встановити `pip install fastapi`.
Якщо ви хочете встановити стандартні залежності, але без `fastapi-cloud-cli`, ви можете встановити через `pip install "fastapi[standard-no-fastapi-cloud-cli]"`.
`uvx` - це псевдонім для `uv tool run`. Він запускає Library Skills у тимчасовому ізольованому середовищі, поки Library Skills сканує пакети, встановлені у вашому проєкті.
///
/// tip | Порада
FastAPI має [офіційне розширення для VS Code](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) (та Cursor), яке надає багато можливостей, включно з переглядачем операцій шляху, пошуком операцій шляху, навігацією CodeLens у тестах (перехід до визначення з тестів), а також розгортанням і журналами FastAPI Cloud - усе безпосередньо з вашого редактора.
///
Навичка сумісна з Codex, Claude Code, Cursor, GitHub Copilot, Gemini CLI, Pi, OpenCode і більшістю інших агентів для кодування. Для Claude Code виберіть `.claude/skills`, коли вас запитають, куди встановити навичку.
## Просунутий посібник користувача { #advanced-user-guide }
+3 -3
View File
@@ -33,11 +33,11 @@
{* ../../docs_src/middleware/tutorial001_py310.py hl[8:9,11,14] *}
/// tip
/// tip | Порада
Пам’ятайте, що власні пропрієтарні заголовки можна додавати [використовуючи префікс `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers).
Але якщо у вас є власні заголовки, які ви хочете, щоб клієнт у браузері міг побачити, потрібно додати їх до ваших конфігурацій CORS ([CORS (Спільне використання ресурсів між джерелами)](cors.md)) за допомогою параметра `expose_headers`, описаного в [документації Starlette по CORS](https://www.starlette.dev/middleware/#corsmiddleware).
Але якщо у вас є власні заголовки, які ви хочете, щоб клієнт у браузері міг побачити, потрібно додати їх до ваших конфігурацій CORS ([CORS (Спільне використання ресурсів між джерелами)](cors.md)) за допомогою параметра `expose_headers`, описаного в [документації Starlette по CORS](https://starlette.dev/middleware/#corsmiddleware).
///
@@ -59,7 +59,7 @@
{* ../../docs_src/middleware/tutorial001_py310.py hl[10,12:13] *}
/// tip
/// tip | Порада
Тут ми використовуємо [`time.perf_counter()`](https://docs.python.org/3/library/time.html#time.perf_counter) замість `time.time()` оскільки він може бути більш точним для таких випадків. 🤓
+19 -19
View File
@@ -1,6 +1,6 @@
# Параметри шляху { #path-parameters }
Ви можете оголосити «параметри» або «змінні» шляху, використовуючи той самий синтаксис, що й у форматованих рядках Python:
Ви можете оголосити «параметри» або «змінні» шляху, використовуючи той самий синтаксис, що й у форматованих строках Python:
{* ../../docs_src/path_params/tutorial001_py310.py hl[6:7] *}
@@ -36,9 +36,9 @@
/// tip | Порада
Зверніть увагу, що значення, яке отримала (і повернула) ваша функція, це `3`, як Python `int`, а не рядок `"3"`.
Зверніть увагу, що значення, яке отримала (і повернула) ваша функція, - це `3`, як Python `int`, а не строка `"3"`.
Отже, з таким оголошенням типу **FastAPI** надає вам автоматичний запит <dfn title="перетворення рядка, що надходить із HTTP-запиту, у дані Python">«парсинг»</dfn>.
Отже, з таким оголошенням типу **FastAPI** надає вам автоматичний <dfn title="перетворення строки, що надходить із HTTP-запиту, у дані Python">«парсинг»</dfn> запиту.
///
@@ -92,7 +92,7 @@
## Переваги стандартів, альтернативна документація { #standards-based-benefits-alternative-documentation }
І оскільки згенерована схема відповідає стандарту [OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md), існує багато сумісних інструментів.
І оскільки згенерована схема відповідає стандарту [OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md), існує багато сумісних інструментів.
Через це **FastAPI** також надає альтернативну API-документацію (використовуючи ReDoc), до якої ви можете отримати доступ за посиланням [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc):
@@ -102,17 +102,17 @@
## Pydantic { #pydantic }
Уся валідація даних виконується за лаштунками за допомогою [Pydantic](https://docs.pydantic.dev/), тож ви отримуєте всі переваги від його використання. І ви знаєте, що ви в надійних руках.
Уся валідація даних виконується за лаштунками за допомогою [Pydantic](https://pydantic.dev/docs/), тож ви отримуєте всі переваги від його використання. І ви знаєте, що ви в надійних руках.
Ви можете використовувати ті самі оголошення типів з `str`, `float`, `bool` та багатьма іншими складними типами даних.
Декілька з них розглядаються в наступних розділах посібника.
Декілька з них розглядаються в наступних розділах навчального посібника.
## Порядок має значення { #order-matters }
Під час створення *операцій шляху* можуть виникати ситуації, коли у вас є фіксований шлях.
Наприклад, `/users/me` припустімо, це для отримання даних про поточного користувача.
Наприклад, `/users/me` - припустімо, це для отримання даних про поточного користувача.
І тоді у вас також може бути шлях `/users/{user_id}` для отримання даних про конкретного користувача за його ID.
@@ -144,13 +144,13 @@
/// tip | Порада
Якщо вам цікаво, «AlexNet», «ResNet» та «LeNet» це просто назви моделей машинного навчання <dfn title="Технічно, архітектури моделей глибокого навчання">моделі</dfn>.
Якщо вам цікаво, «AlexNet», «ResNet» та «LeNet» - це просто назви моделей машинного навчання <dfn title="Технічно, архітектури моделей глибокого навчання">моделі</dfn>.
///
### Оголосіть *параметр шляху* { #declare-a-path-parameter }
Потім створіть *параметр шляху* з анотацією типу, використовуючи створений вами клас enum (`ModelName`):
Потім створіть *параметр шляху* з анотацією типу, використовуючи створений вами клас переліку (`ModelName`):
{* ../../docs_src/path_params/tutorial005_py310.py hl[16] *}
@@ -160,17 +160,17 @@
<img src="/img/tutorial/path-params/image03.png">
### Робота з Python *переліченнями* { #working-with-python-enumerations }
### Робота з Python *переліками* { #working-with-python-enumerations }
Значення *параметра шляху* буде *елементом перелічування*.
Значення *параметра шляху* буде *елементом переліку*.
#### Порівняйте *елементи перелічування* { #compare-enumeration-members }
#### Порівняйте *елементи переліку* { #compare-enumeration-members }
Ви можете порівнювати його з *елементом перелічування* у створеному вами enum `ModelName`:
Ви можете порівнювати його з *елементом переліку* у створеному вами переліку `ModelName`:
{* ../../docs_src/path_params/tutorial005_py310.py hl[17] *}
#### Отримайте *значення перелічування* { #get-the-enumeration-value }
#### Отримайте *значення переліку* { #get-the-enumeration-value }
Ви можете отримати фактичне значення (у цьому випадку це `str`), використовуючи `model_name.value`, або загалом `your_enum_member.value`:
@@ -182,11 +182,11 @@
///
#### Поверніть *елементи перелічування* { #return-enumeration-members }
#### Поверніть *елементи переліку* { #return-enumeration-members }
Ви можете повертати *елементи enum* з вашої *операції шляху*, навіть вкладені у JSON-тіло (наприклад, `dict`).
Ви можете повертати *елементи переліку* з вашої *операції шляху*, навіть вкладені у JSON-тіло (наприклад, `dict`).
Вони будуть перетворені на відповідні значення (у цьому випадку рядки) перед поверненням клієнту:
Вони будуть перетворені на відповідні значення (у цьому випадку строки) перед поверненням клієнту:
{* ../../docs_src/path_params/tutorial005_py310.py hl[18,21,23] *}
@@ -223,7 +223,7 @@ OpenAPI не підтримує спосіб оголошення *параме
/files/{file_path:path}
```
У цьому випадку ім’я параметра `file_path`, а остання частина `:path` вказує, що параметр має відповідати будь-якому *шляху*.
У цьому випадку ім’я параметра - `file_path`, а остання частина `:path` вказує, що параметр має відповідати будь-якому *шляху*.
Отже, ви можете використати його так:
@@ -242,7 +242,7 @@ OpenAPI не підтримує спосіб оголошення *параме
З **FastAPI**, використовуючи короткі, інтуїтивно зрозумілі та стандартні оголошення типів Python, ви отримуєте:
* Підтримку редактора: перевірка помилок, автодоповнення тощо.
* Перетворення даних «<dfn title="перетворення рядка, що надходить з HTTP-запиту, у дані Python">парсинг</dfn>»
* Перетворення даних «<dfn title="перетворення строки, що надходить з HTTP-запиту, у дані Python">парсинг</dfn>»
* Валідацію даних
* Анотацію API та автоматичну документацію
@@ -80,7 +80,7 @@ q: Annotated[str | None] = None
Тепер FastAPI:
* **Перевірить** дані, щоб переконатися, що їхня максимальна довжина - 50 символів
* Покажe **чітку помилку** клієнту, якщо дані недійсні
* Покаже **чітку помилку** клієнту, якщо дані недійсні
* **Задокументує** параметр в *операції шляху* схеми OpenAPI (що відобразиться в **автоматичному інтерфейсі документації**)
## Альтернативний (застарілий) метод: `Query` як значення за замовчуванням { #alternative-old-query-as-the-default-value }
@@ -370,11 +370,11 @@ http://127.0.0.1:8000/items/?item-query=foobaritems
У таких випадках ви можете використати **кастомну функцію-валідатор**, яка буде застосована після звичайної валідації (наприклад, після перевірки, що значення є типом `str`).
Це можна досягти за допомогою [Pydantic's `AfterValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) всередині `Annotated`.
Це можна досягти за допомогою [`AfterValidator` від Pydantic](https://pydantic.dev/docs/validation/latest/concepts/validators/#field-after-validator) всередині `Annotated`.
/// tip | Порада
Pydantic також має [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-before-validator) та інші. 🤓
Pydantic також має [`BeforeValidator`](https://pydantic.dev/docs/validation/latest/concepts/validators/#field-before-validator) та інші. 🤓
///
+2 -2
View File
@@ -6,10 +6,10 @@
Щоб отримувати завантажені файли, спочатку встановіть [`python-multipart`](https://github.com/Kludex/python-multipart).
Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його, а потім встановили його, наприклад:
Додайте його до вашого проєкту:
```console
$ pip install python-multipart
$ uv add python-multipart
```
Це необхідно, оскільки завантажені файли передаються як «дані форми».
+2 -2
View File
@@ -6,10 +6,10 @@
Щоб використовувати форми, спочатку встановіть [`python-multipart`](https://github.com/Kludex/python-multipart).
Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його, а потім встановили його, наприклад:
Додайте його до вашого проєкту:
```console
$ pip install python-multipart
$ uv add python-multipart
```
///
@@ -6,10 +6,10 @@
Щоб отримувати завантажені файли та/або дані форми, спочатку встановіть [`python-multipart`](https://github.com/Kludex/python-multipart).
Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його, а потім встановили бібліотеку, наприклад:
Додайте його до вашого проєкту:
```console
$ pip install python-multipart
$ uv add python-multipart
```
///
@@ -30,7 +30,7 @@ $ pip install python-multipart
/// warning | Попередження
Ви можете оголосити кілька параметрів `File` і `Form` в операції *шляху*, але не можете одночасно оголошувати `Body`-поля, які очікуєте отримати у форматі JSON, оскільки запит матиме тіло, закодоване за допомогою `multipart/form-data`, а не `application/json`.
Ви можете оголосити кілька параметрів `File` і `Form` в *операції шляху*, але не можете одночасно оголошувати `Body`-поля, які очікуєте отримати у форматі JSON, оскільки запит матиме тіло, закодоване за допомогою `multipart/form-data`, а не `application/json`.
Це не обмеження **FastAPI**, а частина протоколу HTTP.
+2 -2
View File
@@ -6,10 +6,10 @@
Щоб використовувати форми, спочатку встановіть [`python-multipart`](https://github.com/Kludex/python-multipart).
Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його, і потім встановили бібліотеку, наприклад:
Додайте його до вашого проєкту:
```console
$ pip install python-multipart
$ uv add python-multipart
```
///
+13 -13
View File
@@ -1,4 +1,4 @@
# Модель відповіді Тип, що повертається { #response-model-return-type }
# Модель відповіді - Тип, що повертається { #response-model-return-type }
Ви можете оголосити тип, який використовуватиметься у відповіді, анотувавши **тип повернення** *функції операції шляху*.
@@ -10,7 +10,7 @@ FastAPI використовуватиме цей тип повернення,
* **Перевірити правильність** повернених даних.
* Якщо дані не валідні (наприклад, відсутнє поле), це означає, що *ваш* код застосунку зламаний, не повертає те, що повинен, і буде повернуто помилку сервера замість некоректних даних. Так ви та ваші клієнти можете бути впевнені, що отримаєте дані й очікувану структуру даних.
* Додати **JSON Schema** для відповіді в OpenAPI *операції шляху*.
* Додати **Схему JSON** для відповіді в OpenAPI *операції шляху*.
* Це буде використано в **автоматичній документації**.
* Це також буде використано інструментами, які автоматично генерують клієнтський код.
* **Серіалізувати** повернені дані в JSON за допомогою Pydantic, який написаний мовою **Rust**, тому це буде **набагато швидше**.
@@ -76,16 +76,16 @@ FastAPI використовуватиме цей `response_model` для вик
Щоб використовувати `EmailStr`, спочатку встановіть [`email-validator`](https://github.com/JoshData/python-email-validator).
Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його, а потім встановили пакет, наприклад:
Додайте його до вашого проєкту:
```console
$ pip install email-validator
$ uv add email-validator
```
або так:
або за допомогою:
```console
$ pip install "pydantic[email]"
$ uv add "pydantic[email]"
```
///
@@ -144,7 +144,7 @@ $ pip install "pydantic[email]"
{* ../../docs_src/response_model/tutorial003_01_py310.py hl[7:10,13:14,18] *}
Завдяки цьому ми отримуємо підтримку інструментів від редакторів і mypy, адже цей код коректний з точки зору типів, але ми також отримуємо фільтрацію даних від FastAPI.
Завдяки цьому ми отримуємо підтримку інструментів - від редакторів і mypy, адже цей код коректний з точки зору типів, але ми також отримуємо фільтрацію даних від FastAPI.
Як це працює? Давайте розберемося. 🤓
@@ -168,7 +168,7 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
## Подивитися в документації { #see-it-in-the-docs }
Коли ви дивитеся автоматичну документацію, ви можете перевірити, що вхідна модель і вихідна модель матимуть власну JSON Schema:
Коли ви дивитеся автоматичну документацію, ви можете перевірити, що вхідна модель і вихідна модель матимуть власну Схему JSON:
<img src="/img/tutorial/response-model/image01.png">
@@ -182,11 +182,11 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
### Повернути Response напряму { #return-a-response-directly }
Найпоширенішим випадком буде [повернення Response напряму, як пояснюється пізніше у просунутому посібнику користувача](../advanced/response-directly.md).
Найпоширенішим випадком буде [повернення Response напряму, як пояснюється пізніше у просунутій документації](../advanced/response-directly.md).
{* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *}
Цей простий випадок автоматично обробляється FastAPI, тому що анотація типу повернення це клас (або підклас) `Response`.
Цей простий випадок автоматично обробляється FastAPI, тому що анотація типу повернення - це клас (або підклас) `Response`.
І інструменти також будуть задоволені, бо і `RedirectResponse`, і `JSONResponse` є підкласами `Response`, отже анотація типу коректна.
@@ -202,7 +202,7 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
Але коли ви повертаєте якийсь інший довільний об’єкт, що не є валідним типом Pydantic (наприклад, об’єкт бази даних), і анотуєте його так у функції, FastAPI спробує створити модель відповіді Pydantic на основі цієї анотації типу і це завершиться помилкою.
Те саме станеться, якщо у вас буде <dfn title="об'єднання між кількома типами означає «будь-який із цих типів»">об'єднання</dfn> між різними типами, де один або більше не є валідними типами Pydantic, наприклад, це завершиться помилкою 💥:
Те саме станеться, якщо у вас буде <dfn title='Об’єднання між кількома типами означає «будь-який із цих типів».'>обєднання</dfn> між різними типами, де один або більше не є валідними типами Pydantic, наприклад, це завершиться помилкою 💥:
{* ../../docs_src/response_model/tutorial003_04_py310.py hl[8] *}
@@ -258,7 +258,7 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
* `response_model_exclude_defaults=True`
* `response_model_exclude_none=True`
як описано в [документації Pydantic](https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict) для `exclude_defaults` та `exclude_none`.
як описано в [документації Pydantic](https://pydantic.dev/docs/validation/latest/concepts/serialization/#excluding-and-including-fields-based-on-their-value) для `exclude_defaults` та `exclude_none`.
///
@@ -315,7 +315,7 @@ FastAPI достатньо розумний (насправді, Pydantic дос
Але все ж рекомендується використовувати описані вище підходи, застосовуючи кілька класів, замість цих параметрів.
Це тому, що JSON Schema, який генерується в OpenAPI вашого застосунку (і в документації), все одно буде відповідати повній моделі, навіть якщо ви використовуєте `response_model_include` або `response_model_exclude`, щоб пропустити деякі атрибути.
Це тому, що Схема JSON, яка генерується в OpenAPI вашого застосунку (і в документації), все одно буде відповідати повній моделі, навіть якщо ви використовуєте `response_model_include` або `response_model_exclude`, щоб пропустити деякі атрибути.
Це також стосується `response_model_by_alias`, який працює подібним чином.
@@ -12,7 +12,7 @@
Ця додаткова інформація буде додана як є до **Схеми JSON** для цієї моделі, і вона буде використана в документації до API.
Ви можете використати атрибут `model_config`, який приймає `dict`, як описано в [документації Pydantic: Configuration](https://docs.pydantic.dev/latest/api/config/).
Ви можете використати атрибут `model_config`, який приймає `dict`, як описано в [документації Pydantic: Configuration](https://pydantic.dev/docs/validation/latest/api/pydantic/config/).
Ви можете встановити `"json_schema_extra"` як `dict`, що містить будь-які додаткові дані, які ви хочете відобразити у згенерованій Схемі JSON, включаючи `examples`.
@@ -26,14 +26,14 @@
/// note | Примітка
Пакет [`python-multipart`](https://github.com/Kludex/python-multipart) автоматично встановлюється з **FastAPI**, коли ви виконуєте команду `pip install "fastapi[standard]"`.
Пакет [`python-multipart`](https://github.com/Kludex/python-multipart) автоматично встановлюється з **FastAPI**, коли ви виконуєте команду `uv add "fastapi[standard]"`.
Однак, якщо ви використовуєте команду `pip install fastapi`, пакет `python-multipart` за замовчуванням не включено.
Однак, якщо ви використовуєте команду `uv add fastapi`, пакет `python-multipart` за замовчуванням не включено.
Щоб встановити його вручну, переконайтеся, що ви створили [віртуальне оточення](../../virtual-environments.md), активували його, а потім встановили:
Щоб встановити його вручну, додайте його до вашого проєкту за допомогою:
```console
$ pip install python-multipart
$ uv add python-multipart
```
Це тому, що **OAuth2** використовує «form data» для надсилання `username` та `password`.
@@ -45,7 +45,7 @@ $ pip install python-multipart
<div class="termy">
```console
$ fastapi dev
$ uv run fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
+4 -4
View File
@@ -30,12 +30,12 @@ eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4
Нам потрібно встановити `PyJWT`, щоб створювати та перевіряти токени JWT у Python.
Переконайтеся, що ви створили [віртуальне оточення](../../virtual-environments.md), активували його і тоді встановіть `pyjwt`:
Додайте `pyjwt` до вашого проєкту:
<div class="termy">
```console
$ pip install pyjwt
$ uv add pyjwt
---> 100%
```
@@ -72,12 +72,12 @@ pwdlib - це чудовий пакет Python для роботи з хешам
Рекомендований алгоритм - «Argon2».
Переконайтеся, що ви створили [віртуальне оточення](../../virtual-environments.md), активували його і тоді встановіть pwdlib з Argon2:
Додайте `pwdlib` з Argon2 до вашого проєкту:
<div class="termy">
```console
$ pip install "pwdlib[argon2]"
$ uv add "pwdlib[argon2]"
---> 100%
```
+6 -6
View File
@@ -34,12 +34,12 @@
## Встановіть `SQLModel` { #install-sqlmodel }
Спочатку переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md), активували його та встановили `sqlmodel`:
Додайте `sqlmodel` до вашого проєкту:
<div class="termy">
```console
$ pip install sqlmodel
$ uv add sqlmodel
---> 100%
```
@@ -49,7 +49,7 @@ $ pip install sqlmodel
Спершу створимо найпростішу версію застосунку з однією моделлю **SQLModel**.
Потім нижче покращимо безпеку і гнучкість за допомогою кількох моделей. 🤓
Потім нижче покращимо безпеку і гнучкість за допомогою **кількох моделей**. 🤓
### Створіть моделі { #create-models }
@@ -152,7 +152,7 @@ SQLModel матиме утиліти міграцій-обгортки над Al
<div class="termy">
```console
$ fastapi dev
$ uv run fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
@@ -337,14 +337,14 @@ $ fastapi dev
<div class="termy">
```console
$ fastapi dev
$ uv run fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
</div>
Якщо ви перейдете до UI `/docs`, побачите, що він оновився і більше не очікуватиме отримати `id` від клієнта під час створення героя тощо.
Якщо ви перейдете до UI API `/docs`, побачите, що він оновився і більше не очікуватиме отримати `id` від клієнта під час створення героя тощо.
<div class="screenshot">
<img src="/img/tutorial/sql-databases/image02.png">
+2 -2
View File
@@ -4,7 +4,7 @@
/// tip | Порада
Якщо вам потрібно розмістити фронтенд, натомість використовуйте `app.frontend()`, прочитайте про це у [Frontend](frontend.md).
Якщо вам потрібно розмістити фронтенд, натомість використовуйте `app.frontend()`, прочитайте про це у [Фронтенді](frontend.md).
`app.frontend()` використовує `StaticFiles` всередині, з кількома додатковими перевагами для фронтендів, як-от обробка клієнтської маршрутизації.
@@ -45,4 +45,4 @@
## Додаткова інформація { #more-info }
Для отримання додаткової інформації та параметрів перевірте [документацію Starlette про Static Files](https://www.starlette.dev/staticfiles/).
Для отримання додаткової інформації та параметрів перевірте [документацію Starlette про Static Files](https://starlette.dev/staticfiles/).
+7 -7
View File
@@ -1,6 +1,6 @@
# Тестування { #testing }
Завдяки [Starlette](https://www.starlette.dev/testclient/), тестувати застосунки **FastAPI** просто й приємно.
Завдяки [Starlette](https://starlette.dev/testclient/), тестувати застосунки **FastAPI** просто й приємно.
Воно базується на [HTTPX](https://www.python-httpx.org), який, своєю чергою, спроєктований на основі Requests, тож він дуже знайомий та інтуїтивно зрозумілий.
@@ -12,10 +12,10 @@
Щоб використовувати `TestClient`, спочатку встановіть [`httpx`](https://www.python-httpx.org).
Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його, а потім встановили `httpx`, наприклад:
Додайте його до вашого проєкту:
```console
$ pip install httpx
$ uv add httpx
```
///
@@ -130,7 +130,7 @@ $ pip install httpx
{* ../../docs_src/app_testing/app_b_an_py310/test_main.py *}
Коли вам потрібно, щоб клієнт передав інформацію в запиті, але ви не знаєте, як це зробити, ви можете пошукати (Google), як це зробити в `httpx`, або навіть як це зробити з `requests`, оскільки дизайн HTTPX базується на дизайні Requests.
Коли вам потрібно, щоб клієнт передав інформацію в запиті, але ви не знаєте, як це зробити, ви можете пошукати (Google), як це зробити в `httpx`, або навіть як це зробити з `requests`, оскільки дизайн HTTPX базується на дизайі Requests.
Далі ви просто повторюєте ці ж дії у ваших тестах.
@@ -156,12 +156,12 @@ $ pip install httpx
Після цього вам потрібно встановити `pytest`.
Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його і встановили необхідні пакети, наприклад:
Додайте його до вашого проєкту:
<div class="termy">
```console
$ pip install pytest
$ uv add pytest
---> 100%
```
@@ -175,7 +175,7 @@ $ pip install pytest
<div class="termy">
```console
$ pytest
$ uv run pytest
================ test session starts ================
platform linux -- Python 3.6.9, pytest-5.3.5, py-1.8.1, pluggy-0.13.1
+10 -839
View File
@@ -1,864 +1,35 @@
# Віртуальні середовища { #virtual-environments }
Коли ви працюєте над проєктами Python, вам, імовірно, слід використовувати **віртуальне середовище** (або схожий механізм), щоб ізолювати пакети, які ви встановлюєте для кожного проєкту.
Коли ви працюєте над проєктами Python, вам слід використовувати **віртуальне середовище**, щоб ізолювати пакети, встановлені для кожного проєкту.
/// note | Примітка
Якщо ви вже знаєте про віртуальні середовища, як їх створювати та використовувати, можете пропустити цей розділ. 🤓
///
/// tip | Порада
**Віртуальне середовище** відрізняється від **змінної оточення**.
**Змінна оточення** - це змінна в системі, яку можуть використовувати програми.
**Віртуальне середовище** - це каталог із файлами в ньому.
///
/// note | Примітка
На цій сторінці ви дізнаєтеся, як використовувати **віртуальні середовища** і як вони працюють.
Якщо ви готові прийняти **інструмент, що керує всім** за вас (включно з установленням Python), спробуйте [uv](https://github.com/astral-sh/uv).
///
Для проєктів FastAPI я рекомендую використовувати [uv](https://docs.astral.sh/uv/) для керування проєктом, його залежностями та віртуальним середовищем.
## Створіть проєкт { #create-a-project }
Спочатку створіть каталог для вашого проєкту.
Зазвичай я створюю каталог з назвою `code` у моєму домашньому каталозі користувача.
І всередині нього я створюю окремий каталог на кожен проєкт.
Встановіть `uv` за допомогою [офіційного посібника зі встановлення](https://docs.astral.sh/uv/getting-started/installation/), а потім створіть проєкт:
<div class="termy">
```console
// Перейдіть до домашнього каталогу
$ cd
// Створіть каталог для всіх ваших проєктів з кодом
$ mkdir code
// Перейдіть у цей каталог code
$ cd code
// Створіть каталог для цього проєкту
$ mkdir awesome-project
// Перейдіть до каталогу цього проєкту
$ uv init awesome-project --bare
$ cd awesome-project
$ uv add "fastapi[standard]"
```
</div>
## Створіть віртуальне середовище { #create-a-virtual-environment }
`uv` автоматично створює віртуальне середовище для проєкту. Вам не потрібно створювати або активувати його самостійно.
Коли ви починаєте працювати над проєктом Python **уперше**, створіть віртуальне середовище **<dfn title="є інші варіанти, це проста настанова">у вашому проєкті</dfn>**.
/// tip | Порада
Це потрібно робити лише **один раз на проєкт**, не щоразу, коли ви працюєте.
///
//// tab | `venv`
Щоб створити віртуальне середовище, ви можете використати модуль `venv`, який постачається разом із Python.
Виконуйте команди в середовищі проєкту за допомогою `uv run`, наприклад:
<div class="termy">
```console
$ python -m venv .venv
$ uv run fastapi dev
```
</div>
/// details | Що означає ця команда
## Дізнайтеся більше { #learn-more }
* `python`: використати програму з назвою `python`
* `-m`: викликати модуль як скрипт, далі ми вкажемо, який модуль
* `venv`: використати модуль з назвою `venv`, який зазвичай уже встановлено з Python
* `.venv`: створити віртуальне середовище в новому каталозі `.venv`
///
////
//// tab | `uv`
Якщо у вас встановлено [`uv`](https://github.com/astral-sh/uv), ви можете використати його для створення віртуального середовища.
<div class="termy">
```console
$ uv venv
```
</div>
/// tip | Порада
Типово `uv` створить віртуальне середовище в каталозі з назвою `.venv`.
Але ви можете налаштувати це, передавши додатковий аргумент з назвою каталогу.
///
////
Ця команда створює нове віртуальне середовище в каталозі з назвою `.venv`.
/// details | `.venv` або інша назва
Ви можете створити віртуальне середовище в іншому каталозі, але існує усталена домовленість називати його `.venv`.
///
## Активуйте віртуальне середовище { #activate-the-virtual-environment }
Активуйте нове віртуальне середовище, щоб будь-яка команда Python, яку ви запускаєте, або пакет, який ви встановлюєте, використовували його.
/// tip | Порада
Робіть це **щоразу**, коли ви починаєте **нову сесію термінала** для роботи над проєктом.
///
//// tab | Linux, macOS
<div class="termy">
```console
$ source .venv/bin/activate
```
</div>
////
//// tab | Windows PowerShell
<div class="termy">
```console
$ .venv\Scripts\Activate.ps1
```
</div>
////
//// tab | Windows Bash
Або якщо ви використовуєте Bash для Windows (напр., [Git Bash](https://gitforwindows.org/)):
<div class="termy">
```console
$ source .venv/Scripts/activate
```
</div>
////
/// tip | Порада
Кожного разу, коли ви встановлюєте **новий пакет** у це середовище, **активуйте** середовище знову.
Це гарантує, що якщо ви використовуєте **програму термінала (<abbr title="command line interface - інтерфейс командного рядка">CLI</abbr>)**, встановлену цим пакетом, ви використовуєте саме ту з вашого віртуального середовища, а не будь-яку іншу, яка може бути встановлена глобально, імовірно з іншою версією, ніж вам потрібно.
///
## Перевірте активність віртуального середовища { #check-the-virtual-environment-is-active }
Перевірте, що віртуальне середовище активне (попередня команда спрацювала).
/// tip | Порада
Це **необов'язково**, але це гарний спосіб **перевірити**, що все працює як очікується і ви використовуєте саме те віртуальне середовище, яке планували.
///
//// tab | Linux, macOS, Windows Bash
<div class="termy">
```console
$ which python
/home/user/code/awesome-project/.venv/bin/python
```
</div>
Якщо показано бінарний файл `python` за шляхом `.venv/bin/python` усередині вашого проєкту (у цьому випадку `awesome-project`), тоді все спрацювало. 🎉
////
//// tab | Windows PowerShell
<div class="termy">
```console
$ Get-Command python
C:\Users\user\code\awesome-project\.venv\Scripts\python
```
</div>
Якщо показано бінарний файл `python` за шляхом `.venv\Scripts\python` усередині вашого проєкту (у цьому випадку `awesome-project`), тоді все спрацювало. 🎉
////
## Оновіть `pip` { #upgrade-pip }
/// tip | Порада
Якщо ви використовуєте [`uv`](https://github.com/astral-sh/uv), ви використовуватимете його для встановлення замість `pip`, тож вам не потрібно оновлювати `pip`. 😎
///
Якщо ви використовуєте `pip` для встановлення пакетів (він іде за замовчуванням із Python), вам слід **оновити** його до найновішої версії.
Багато дивних помилок під час встановлення пакета вирішуються тим, що спочатку оновлюють `pip`.
/// tip | Порада
Зазвичай це роблять **один раз**, відразу після створення віртуального середовища.
///
Переконайтеся, що віртуальне середовище активне (командою вище), а потім виконайте:
<div class="termy">
```console
$ python -m pip install --upgrade pip
---> 100%
```
</div>
/// tip | Порада
Іноді ви можете отримати помилку **`No module named pip`** при спробі оновити pip.
Якщо це сталося, встановіть і оновіть pip за допомогою команди нижче:
<div class="termy">
```console
$ python -m ensurepip --upgrade
---> 100%
```
</div>
Ця команда встановить pip, якщо він ще не встановлений, і також гарантує, що встановлена версія pip принаймні така ж нова, як доступна в `ensurepip`.
///
## Додайте `.gitignore` { #add-gitignore }
Якщо ви використовуєте **Git** (варто це робити), додайте файл `.gitignore`, щоб виключити з Git усе у вашому `.venv`.
/// tip | Порада
Якщо ви використали [`uv`](https://github.com/astral-sh/uv) для створення віртуального середовища, він уже зробив це за вас, можете пропустити цей крок. 😎
///
/// tip | Порада
Зробіть це **один раз**, відразу після створення віртуального середовища.
///
<div class="termy">
```console
$ echo "*" > .venv/.gitignore
```
</div>
/// details | Що означає ця команда
* `echo "*"`: «виведе» текст `*` у термінал (наступна частина трохи це змінює)
* `>`: усе, що команда ліворуч від `>` «виводить» у термінал, не слід друкувати, натомість записати у файл, вказаний праворуч від `>`
* `.gitignore`: назва файлу, куди слід записати текст
А `*` для Git означає «все». Тож він ігноруватиме все в каталозі `.venv`.
Ця команда створить файл `.gitignore` із вмістом:
```gitignore
*
```
///
## Встановіть пакети { #install-packages }
Після активації середовища ви можете встановлювати в нього пакети.
/// tip | Порада
Робіть це **один раз** під час встановлення або оновлення пакетів, потрібних вашому проєкту.
Якщо вам потрібно оновити версію або додати новий пакет, ви **зробите це знову**.
///
### Встановіть пакети безпосередньо { #install-packages-directly }
Якщо ви поспішаєте та не хочете використовувати файл для оголошення вимог вашого проєкту до пакетів, ви можете встановити їх безпосередньо.
/// tip | Порада
Дуже добра ідея - записати пакети та версії, потрібні вашій програмі, у файл (наприклад, `requirements.txt` або `pyproject.toml`).
///
//// tab | `pip`
<div class="termy">
```console
$ pip install "fastapi[standard]"
---> 100%
```
</div>
////
//// tab | `uv`
Якщо у вас є [`uv`](https://github.com/astral-sh/uv):
<div class="termy">
```console
$ uv pip install "fastapi[standard]"
---> 100%
```
</div>
////
### Встановіть з `requirements.txt` { #install-from-requirements-txt }
Якщо у вас є `requirements.txt`, ви можете використати його для встановлення перелічених там пакетів.
//// tab | `pip`
<div class="termy">
```console
$ pip install -r requirements.txt
---> 100%
```
</div>
////
//// tab | `uv`
Якщо у вас є [`uv`](https://github.com/astral-sh/uv):
<div class="termy">
```console
$ uv pip install -r requirements.txt
---> 100%
```
</div>
////
/// details | `requirements.txt`
`requirements.txt` із деякими пакетами може виглядати так:
```requirements.txt
fastapi[standard]==0.113.0
pydantic==2.8.0
```
///
## Запустіть вашу програму { #run-your-program }
Після активації віртуального середовища ви можете запустити вашу програму, і вона використовуватиме Python із вашого віртуального середовища з пакетами, які ви там встановили.
<div class="termy">
```console
$ python main.py
Hello World
```
</div>
## Налаштуйте ваш редактор { #configure-your-editor }
Ймовірно, ви використовуєте редактор коду, переконайтеся, що ви налаштували його на використання того самого віртуального середовища, яке ви створили (швидше за все, він визначить його автоматично), щоб отримувати автодоповнення та підсвічування помилок.
Наприклад:
* [VS Code](https://code.visualstudio.com/docs/python/environments#_select-and-activate-an-environment)
* [PyCharm](https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html)
/// tip | Порада
Зазвичай це потрібно робити лише **один раз**, коли ви створюєте віртуальне середовище.
///
## Деактивуйте віртуальне середовище { #deactivate-the-virtual-environment }
Коли ви завершили роботу над проєктом, ви можете **деактивувати** віртуальне середовище.
<div class="termy">
```console
$ deactivate
```
</div>
Таким чином, коли ви запустите `python`, він не намагатиметься запускатися з того віртуального середовища з установленими там пакетами.
## Готові до роботи { #ready-to-work }
Тепер ви готові почати працювати над вашим проєктом.
/// tip | Порада
Хочете зрозуміти, що це все було вище?
Продовжуйте читати. 👇🤓
///
## Навіщо віртуальні середовища { #why-virtual-environments }
Щоб працювати з FastAPI, вам потрібно встановити [Python](https://www.python.org/).
Після цього вам потрібно буде **встановити** FastAPI та інші **пакети**, які ви хочете використовувати.
Для встановлення пакетів зазвичай використовують команду `pip`, що постачається з Python (або схожі альтернативи).
Однак, якщо ви просто користуватиметеся `pip` напряму, пакети встановлюватимуться у ваше **глобальне середовище Python** (глобальну інсталяцію Python).
### Проблема { #the-problem }
То в чому ж проблема встановлення пакетів у глобальне середовище Python?
З часом ви, вірогідно, писатимете багато різних програм, які залежать від **різних пакетів**. І деякі з цих ваших проєктів залежатимуть від **різних версій** одного й того ж пакета. 😱
Наприклад, ви можете створити проєкт із назвою `philosophers-stone`, ця програма залежить від іншого пакета з назвою **`harry`, використовуючи версію `1`**. Тож вам потрібно встановити `harry`.
```mermaid
flowchart LR
stone(philosophers-stone) -->|requires| harry-1[harry v1]
```
Потім, трохи згодом, ви створюєте інший проєкт із назвою `prisoner-of-azkaban`, і цей проєкт також залежить від `harry`, але йому потрібна **версія `harry` `3`**.
```mermaid
flowchart LR
azkaban(prisoner-of-azkaban) --> |requires| harry-3[harry v3]
```
Але тепер проблема в тому, що якщо ви встановлюєте пакети глобально (у глобальне середовище), а не у локальне **віртуальне середовище**, вам доведеться вибирати, яку версію `harry` встановити.
Якщо ви хочете запустити `philosophers-stone`, вам спочатку потрібно встановити `harry` версії `1`, наприклад, так:
<div class="termy">
```console
$ pip install "harry==1"
```
</div>
У підсумку у вас буде встановлено `harry` версії `1` у глобальному середовищі Python.
```mermaid
flowchart LR
subgraph global[global env]
harry-1[harry v1]
end
subgraph stone-project[philosophers-stone project]
stone(philosophers-stone) -->|requires| harry-1
end
```
Але якщо ви захочете запустити `prisoner-of-azkaban`, вам доведеться видалити `harry` версії `1` і встановити `harry` версії `3` (або просто встановлення версії `3` автоматично видалить версію `1`).
<div class="termy">
```console
$ pip install "harry==3"
```
</div>
У підсумку у вас буде встановлено `harry` версії `3` у глобальному середовищі Python.
А якщо ви знову спробуєте запустити `philosophers-stone`, є шанс, що він **не працюватиме**, тому що йому потрібен `harry` версії `1`.
```mermaid
flowchart LR
subgraph global[global env]
harry-1[<strike>harry v1</strike>]
style harry-1 fill:#ccc,stroke-dasharray: 5 5
harry-3[harry v3]
end
subgraph stone-project[philosophers-stone project]
stone(philosophers-stone) -.-x|⛔️| harry-1
end
subgraph azkaban-project[prisoner-of-azkaban project]
azkaban(prisoner-of-azkaban) --> |requires| harry-3
end
```
/// tip | Порада
У пакетах Python дуже поширена практика намагатися якнайкраще **уникати несумісних змін** у **нових версіях**, але краще підстрахуватися та встановлювати новіші версії свідомо і тоді, коли ви можете запустити тести, щоб перевірити, що все працює коректно.
///
Тепер уявіть те саме з **багатьма** іншими **пакетами**, від яких залежать усі ваші **проєкти**. Це дуже складно керувати. І ви, імовірно, запускатимете деякі проєкти з деякими **несумісними версіями** пакетів і не розумітимете, чому щось не працює.
Також, залежно від вашої операційної системи (напр., Linux, Windows, macOS), у ній може бути вже встановлений Python. І в такому разі, імовірно, уже будуть попередньо встановлені деякі пакети з певними версіями, **потрібними вашій системі**. Якщо ви встановлюєте пакети в глобальне середовище Python, ви можете **зламати** деякі програми, що постачаються з вашою операційною системою.
## Де встановлюються пакети { #where-are-packages-installed }
Коли ви встановлюєте Python, він створює на вашому комп'ютері кілька каталогів із деякими файлами.
Деякі з цих каталогів відповідають за зберігання всіх пакетів, які ви встановлюєте.
Коли ви запускаєте:
<div class="termy">
```console
// Не запускайте це зараз, це лише приклад 🤓
$ pip install "fastapi[standard]"
---> 100%
```
</div>
Це завантажить стиснений файл з кодом FastAPI, зазвичай із [PyPI](https://pypi.org/project/fastapi/).
Також будуть **завантажені** файли для інших пакетів, від яких залежить FastAPI.
Потім усе це буде **розпаковано** та покладено в каталог на вашому комп'ютері.
Типово ці завантажені та розпаковані файли будуть покладені в каталог, що постачається з вашою інсталяцією Python, це **глобальне середовище**.
## Що таке віртуальні середовища { #what-are-virtual-environments }
Рішенням проблеми з наявністю всіх пакетів у глобальному середовищі є використання **віртуального середовища для кожного проєкту**, над яким ви працюєте.
Віртуальне середовище - це **каталог**, дуже схожий на глобальний, у якому ви можете встановлювати пакети для конкретного проєкту.
Таким чином кожен проєкт матиме власне віртуальне середовище (каталог `.venv`) із власними пакетами.
```mermaid
flowchart TB
subgraph stone-project[philosophers-stone project]
stone(philosophers-stone) --->|requires| harry-1
subgraph venv1[.venv]
harry-1[harry v1]
end
end
subgraph azkaban-project[prisoner-of-azkaban project]
azkaban(prisoner-of-azkaban) --->|requires| harry-3
subgraph venv2[.venv]
harry-3[harry v3]
end
end
stone-project ~~~ azkaban-project
```
## Що означає активація віртуального середовища { #what-does-activating-a-virtual-environment-mean }
Коли ви активуєте віртуальне середовище, наприклад так:
//// tab | Linux, macOS
<div class="termy">
```console
$ source .venv/bin/activate
```
</div>
////
//// tab | Windows PowerShell
<div class="termy">
```console
$ .venv\Scripts\Activate.ps1
```
</div>
////
//// tab | Windows Bash
Або якщо ви використовуєте Bash для Windows (напр., [Git Bash](https://gitforwindows.org/)):
<div class="termy">
```console
$ source .venv/Scripts/activate
```
</div>
////
Ця команда створить або змінить деякі [змінні оточення](environment-variables.md), які будуть доступні для наступних команд.
Однією з цих змінних є змінна `PATH`.
/// tip | Порада
Ви можете дізнатися більше про змінну оточення `PATH` у розділі [Змінні оточення](environment-variables.md#path-environment-variable).
///
Активація віртуального середовища додає його шлях `.venv/bin` (на Linux і macOS) або `.venv\Scripts` (на Windows) до змінної оточення `PATH`.
Скажімо, до активації середовища змінна `PATH` виглядала так:
//// tab | Linux, macOS
```plaintext
/usr/bin:/bin:/usr/sbin:/sbin
```
Це означає, що система шукатиме програми в:
* `/usr/bin`
* `/bin`
* `/usr/sbin`
* `/sbin`
////
//// tab | Windows
```plaintext
C:\Windows\System32
```
Це означає, що система шукатиме програми в:
* `C:\Windows\System32`
////
Після активації віртуального середовища змінна `PATH` виглядатиме приблизно так:
//// tab | Linux, macOS
```plaintext
/home/user/code/awesome-project/.venv/bin:/usr/bin:/bin:/usr/sbin:/sbin
```
Це означає, що система тепер спочатку шукатиме програми в:
```plaintext
/home/user/code/awesome-project/.venv/bin
```
перед тим, як шукати в інших каталогах.
Тож коли ви введете `python` у терміналі, система знайде програму Python у
```plaintext
/home/user/code/awesome-project/.venv/bin/python
```
і використає саме її.
////
//// tab | Windows
```plaintext
C:\Users\user\code\awesome-project\.venv\Scripts;C:\Windows\System32
```
Це означає, що система тепер спочатку шукатиме програми в:
```plaintext
C:\Users\user\code\awesome-project\.venv\Scripts
```
перед тим, як шукати в інших каталогах.
Тож коли ви введете `python` у терміналі, система знайде програму Python у
```plaintext
C:\Users\user\code\awesome-project\.venv\Scripts\python
```
і використає саме її.
////
Важлива деталь: шлях до віртуального середовища буде додано на **початок** змінної `PATH`. Система знайде його **раніше** за будь-який інший доступний Python. Таким чином, коли ви запускаєте `python`, використовується саме Python **із віртуального середовища**, а не будь-який інший `python` (наприклад, з глобального середовища).
Активація віртуального середовища також змінює ще кілька речей, але це одна з найважливіших.
## Перевірка віртуального середовища { #checking-a-virtual-environment }
Коли ви перевіряєте, чи активне віртуальне середовище, наприклад так:
//// tab | Linux, macOS, Windows Bash
<div class="termy">
```console
$ which python
/home/user/code/awesome-project/.venv/bin/python
```
</div>
////
//// tab | Windows PowerShell
<div class="termy">
```console
$ Get-Command python
C:\Users\user\code\awesome-project\.venv\Scripts\python
```
</div>
////
Це означає, що програма `python`, яка буде використана, знаходиться **у віртуальному середовищі**.
На Linux і macOS використовують `which`, а в Windows PowerShell - `Get-Command`.
Принцип роботи цієї команди в тому, що вона перевіряє змінну оточення `PATH`, проходячи по **кожному шляху по порядку**, шукаючи програму з назвою `python`. Щойно вона її знайде, вона **покаже вам шлях** до цієї програми.
Найважливіше, що коли ви викликаєте `python`, це рівно той «`python`», який буде виконаний.
Отже, ви можете підтвердити, чи перебуваєте в правильному віртуальному середовищі.
/// tip | Порада
Легко активувати одне віртуальне середовище, отримати один Python, а потім **перейти до іншого проєкту**.
І другий проєкт **не працюватиме**, бо ви використовуєте **некоректний Python** з віртуального середовища іншого проєкту.
Корисно вміти перевіряти, який саме `python` використовується. 🤓
///
## Навіщо деактивувати віртуальне середовище { #why-deactivate-a-virtual-environment }
Наприклад, ви працюєте над проєктом `philosophers-stone`, **активували його віртуальне середовище**, встановили пакети та працюєте з цим середовищем.
А потім ви хочете працювати над **іншим проєктом** `prisoner-of-azkaban`.
Ви переходите до цього проєкту:
<div class="termy">
```console
$ cd ~/code/prisoner-of-azkaban
```
</div>
Якщо ви не деактивуєте віртуальне середовище для `philosophers-stone`, коли ви запустите `python` у терміналі, він спробує використовувати Python із `philosophers-stone`.
<div class="termy">
```console
$ cd ~/code/prisoner-of-azkaban
$ python main.py
// Помилка імпорту sirius, його не встановлено 😱
Traceback (most recent call last):
File "main.py", line 1, in <module>
import sirius
```
</div>
Але якщо ви деактивуєте віртуальне середовище і активуєте нове для `prisoner-of-azkaban`, тоді при запуску `python` він використовуватиме Python із віртуального середовища в `prisoner-of-azkaban`.
<div class="termy">
```console
$ cd ~/code/prisoner-of-azkaban
// Вам не потрібно бути в старому каталозі, щоб деактивувати, це можна зробити будь-де, навіть після переходу до іншого проєкту 😎
$ deactivate
// Активуйте віртуальне середовище в prisoner-of-azkaban/.venv 🚀
$ source .venv/bin/activate
// Тепер, коли ви запускаєте python, він знайде пакет sirius, встановлений у цьому віртуальному середовищі ✨
$ python main.py
I solemnly swear 🐺
```
</div>
## Альтернативи { #alternatives }
Це простий посібник, щоб ви швидко стартували та зрозуміли, як усе працює **«під капотом»**.
Існує багато **альтернатив** керування віртуальними середовищами, залежностями пакетів (вимогами), проєктами.
Коли будете готові й захочете використовувати інструмент для **керування всім проєктом**, залежностями пакетів, віртуальними середовищами тощо, я раджу спробувати [uv](https://github.com/astral-sh/uv).
`uv` уміє багато чого, зокрема:
* **Встановлювати Python** для вас, включно з різними версіями
* Керувати **віртуальним середовищем** ваших проєктів
* Встановлювати **пакети**
* Керувати **залежностями і версіями** пакетів у вашому проєкті
* Гарантувати, що у вас є **точний** набір пакетів і версій для встановлення, включно з їхніми залежностями, щоб ви були певні, що зможете запустити ваш проєкт у продакшені точно так само, як і на вашому комп'ютері під час розробки - це називається **блокуванням**
* І багато іншого
## Висновок { #conclusion }
Якщо ви все це прочитали й зрозуміли, тепер **ви знаєте значно більше** про віртуальні середовища, ніж багато розробників. 🤓
Знання цих деталей, найімовірніше, стане в пригоді в майбутньому, коли ви налагоджуватимете щось, що виглядає складним, але ви знатимете, **як усе працює «під капотом»**. 😎
Прочитайте [посібник з віртуальних середовищ](https://tiangolo.com/guides/virtual-environments/), щоб дізнатися, як віртуальні середовища працюють під капотом, включно з активацією та альтернативним робочим процесом із `python -m venv` і `pip`.