Sync fastapi docs from 50113da1 on 2026-09-11
This commit is contained in:
@@ -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`.
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ pytest
|
||||
$ uv run pytest
|
||||
|
||||
---> 100%
|
||||
```
|
||||
|
||||
@@ -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)
|
||||
```
|
||||
|
||||
@@ -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 }
|
||||
|
||||
|
||||
@@ -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/).
|
||||
|
||||
Зокрема, як працювати зі станом тривалості життя, який можна використовувати в інших ділянках вашого коду.
|
||||
|
||||
|
||||
@@ -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 | Порада
|
||||
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -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`:
|
||||
|
||||
|
||||
@@ -48,4 +48,4 @@
|
||||
|
||||
///
|
||||
|
||||
Щоб побачити всі доступні параметри та опції, перегляньте [документацію в Starlette](https://www.starlette.dev/responses/#set-cookie).
|
||||
Щоб побачити всі доступні параметри та опції, перегляньте [документацію в Starlette](https://starlette.dev/responses/#set-cookie).
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -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/).
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -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)
|
||||
```
|
||||
|
||||
@@ -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/).
|
||||
|
||||
@@ -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` так:
|
||||
|
||||
|
||||
@@ -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 | Технічні деталі
|
||||
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
/// note | Примітка
|
||||
|
||||
Для цього потрібно встановити `a2wsgi`, наприклад за допомогою `pip install a2wsgi`.
|
||||
Для цього потрібно додати `a2wsgi` до вашого проєкту, наприклад за допомогою `uv add a2wsgi`.
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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)):
|
||||
|
||||

|
||||
|
||||
|
||||
@@ -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 самостійно, зокрема на власних серверах. 🤓
|
||||
|
||||
@@ -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)
|
||||
```
|
||||
|
||||
@@ -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). Ви побачите, що ці інструменти також мають прості способи вирішити інші **концепції розгортання**. ✨
|
||||
|
||||
@@ -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`.
|
||||
|
||||
@@ -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-адреси, таким чином він буде публічно доступним для будь-кого, хто може взаємодіяти з машиною. Зазвичай саме так ви запускатимете його в продакшн, наприклад у контейнері.
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||

|
||||
|
||||
* Альтернативна документація API за допомогою [**ReDoc**](https://github.com/Rebilly/ReDoc).
|
||||
* Альтернативна документація API за допомогою [**ReDoc**](https://github.com/Redocly/redoc).
|
||||
|
||||

|
||||
|
||||
@@ -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>-и для баз даних.
|
||||
|
||||
|
||||
@@ -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. Ви можете спробувати його та розглянути для своїх проєктів.
|
||||
|
||||
@@ -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/).
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -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 }
|
||||
|
||||
|
||||
@@ -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
@@ -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)):
|
||||
|
||||

|
||||
|
||||
@@ -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 }
|
||||
|
||||
|
||||
@@ -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 та інших частин сучасного фронтенд-стеку.
|
||||
|
||||
@@ -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/).
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -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`.
|
||||
|
||||
|
||||
@@ -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)
|
||||
```
|
||||
|
||||
@@ -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`:
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
Ваш API майже завжди має надсилати тіло **відповіді**. Але клієнтам не обов’язково потрібно постійно надсилати тіла **запитів** - інколи вони лише запитують шлях, можливо з деякими параметрами запиту, але не надсилають тіло.
|
||||
|
||||
Щоб оголосити тіло **запиту**, ви використовуєте [Pydantic](https://docs.pydantic.dev/) моделі з усією їх потужністю та перевагами.
|
||||
Щоб оголосити тіло **запиту**, ви використовуєте [Pydantic](https://pydantic.dev/docs/) моделі з усією їх потужністю та перевагами.
|
||||
|
||||
/// note | Примітка
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 }
|
||||
|
||||
|
||||
@@ -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]`.
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -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)):
|
||||
|
||||

|
||||
|
||||
@@ -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`.
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -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()` обслуговує файли, вже згенеровані вашою фронтенд-збіркою.
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
|
||||
## Встановлення власних обробників виключень { #install-custom-exception-handlers }
|
||||
|
||||
Ви можете додати власні обробники виключень за допомогою [тих самих утиліт для виключень зі Starlette](https://www.starlette.dev/exceptions/).
|
||||
Ви можете додати власні обробники виключень за допомогою [тих самих утиліт для виключень зі Starlette](https://starlette.dev/exceptions/).
|
||||
|
||||
Припустімо, у вас є власне виключення `UnicornException`, яке ви (або бібліотека, яку ви використовуєте) можете `raise`.
|
||||
|
||||
|
||||
@@ -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 }
|
||||
|
||||
|
||||
@@ -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()` оскільки він може бути більш точним для таких випадків. 🤓
|
||||
|
||||
|
||||
@@ -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) та інші. 🤓
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
///
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
|
||||
Щоб використовувати форми, спочатку встановіть [`python-multipart`](https://github.com/Kludex/python-multipart).
|
||||
|
||||
Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його, і потім встановили бібліотеку, наприклад:
|
||||
Додайте його до вашого проєкту:
|
||||
|
||||
```console
|
||||
$ pip install python-multipart
|
||||
$ uv add python-multipart
|
||||
```
|
||||
|
||||
///
|
||||
|
||||
@@ -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)
|
||||
```
|
||||
|
||||
@@ -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%
|
||||
```
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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/).
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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`.
|
||||
|
||||
Reference in New Issue
Block a user