From f97b72a75440aea3b10786312e1feef117420be0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Thu, 19 Mar 2026 19:27:41 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20for=20uk?= =?UTF-8?q?=20(update-outdated)=20(#15160)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] Co-authored-by: Yurii Motov --- docs/uk/docs/_llm-test.md | 31 ++-- docs/uk/docs/advanced/additional-responses.md | 4 +- .../docs/advanced/additional-status-codes.md | 2 +- .../uk/docs/advanced/advanced-dependencies.md | 6 +- docs/uk/docs/advanced/async-tests.md | 8 +- docs/uk/docs/advanced/behind-a-proxy.md | 26 ++-- docs/uk/docs/advanced/custom-response.md | 117 +++++---------- docs/uk/docs/advanced/dataclasses.md | 12 +- docs/uk/docs/advanced/events.md | 6 +- docs/uk/docs/advanced/generate-clients.md | 16 +- docs/uk/docs/advanced/index.md | 8 +- docs/uk/docs/advanced/middleware.md | 10 +- docs/uk/docs/advanced/openapi-callbacks.md | 10 +- docs/uk/docs/advanced/openapi-webhooks.md | 2 +- .../path-operation-advanced-configuration.md | 8 +- .../advanced/response-change-status-code.md | 2 +- docs/uk/docs/advanced/response-cookies.md | 6 +- docs/uk/docs/advanced/response-directly.md | 46 ++++-- docs/uk/docs/advanced/response-headers.md | 12 +- .../docs/advanced/security/http-basic-auth.md | 4 +- docs/uk/docs/advanced/security/index.md | 6 +- .../docs/advanced/security/oauth2-scopes.md | 4 +- docs/uk/docs/advanced/settings.md | 16 +- docs/uk/docs/advanced/sub-applications.md | 10 +- docs/uk/docs/advanced/templates.md | 4 +- docs/uk/docs/advanced/testing-websockets.md | 2 +- .../docs/advanced/using-request-directly.md | 4 +- docs/uk/docs/advanced/websockets.md | 24 +-- docs/uk/docs/advanced/wsgi.md | 6 +- docs/uk/docs/alternatives.md | 58 ++++---- docs/uk/docs/async.md | 26 ++-- docs/uk/docs/benchmarks.md | 18 +-- docs/uk/docs/deployment/cloud.md | 8 +- docs/uk/docs/deployment/concepts.md | 10 +- docs/uk/docs/deployment/docker.md | 44 +++--- docs/uk/docs/deployment/fastapicloud.md | 6 +- docs/uk/docs/deployment/https.md | 138 +++++++++--------- docs/uk/docs/deployment/index.md | 2 +- docs/uk/docs/deployment/manually.md | 14 +- docs/uk/docs/deployment/server-workers.md | 16 +- docs/uk/docs/deployment/versions.md | 6 +- docs/uk/docs/environment-variables.md | 10 +- docs/uk/docs/fastapi-cli.md | 69 ++++++++- docs/uk/docs/features.md | 28 ++-- docs/uk/docs/help-fastapi.md | 62 ++++---- docs/uk/docs/history-design-future.md | 12 +- .../authentication-error-status-code.md | 2 +- docs/uk/docs/how-to/conditional-openapi.md | 6 +- docs/uk/docs/how-to/configure-swagger-ui.md | 4 +- docs/uk/docs/how-to/custom-docs-ui-assets.md | 12 +- .../docs/how-to/custom-request-and-route.md | 8 +- docs/uk/docs/how-to/extending-openapi.md | 4 +- docs/uk/docs/how-to/general.md | 22 +-- docs/uk/docs/how-to/graphql.md | 30 ++-- docs/uk/docs/how-to/index.md | 2 +- ...migrate-from-pydantic-v1-to-pydantic-v2.md | 6 +- docs/uk/docs/how-to/testing-database.md | 6 +- docs/uk/docs/index.md | 118 +++++++-------- docs/uk/docs/project-generation.md | 2 +- docs/uk/docs/python-types.md | 10 +- docs/uk/docs/tutorial/background-tasks.md | 6 +- docs/uk/docs/tutorial/bigger-applications.md | 47 +++++- docs/uk/docs/tutorial/body-nested-models.md | 6 +- docs/uk/docs/tutorial/body-updates.md | 6 +- docs/uk/docs/tutorial/body.md | 20 +-- docs/uk/docs/tutorial/cors.md | 20 +-- docs/uk/docs/tutorial/debugging.md | 6 +- ...pendencies-in-path-operation-decorators.md | 4 +- .../dependencies/dependencies-with-yield.md | 20 +-- .../dependencies/global-dependencies.md | 6 +- docs/uk/docs/tutorial/dependencies/index.md | 4 +- docs/uk/docs/tutorial/encoder.md | 4 +- docs/uk/docs/tutorial/extra-data-types.md | 4 +- docs/uk/docs/tutorial/extra-models.md | 8 +- docs/uk/docs/tutorial/first-steps.md | 75 ++++++++-- docs/uk/docs/tutorial/handling-errors.md | 18 +-- docs/uk/docs/tutorial/index.md | 22 ++- docs/uk/docs/tutorial/metadata.md | 8 +- docs/uk/docs/tutorial/middleware.md | 10 +- .../tutorial/path-operation-configuration.md | 2 +- .../path-params-numeric-validations.md | 4 +- docs/uk/docs/tutorial/path-params.md | 16 +- .../tutorial/query-params-str-validations.md | 12 +- docs/uk/docs/tutorial/query-params.md | 2 +- docs/uk/docs/tutorial/request-files.md | 12 +- docs/uk/docs/tutorial/request-form-models.md | 10 +- .../docs/tutorial/request-forms-and-files.md | 4 +- docs/uk/docs/tutorial/request-forms.md | 6 +- docs/uk/docs/tutorial/response-model.md | 11 +- docs/uk/docs/tutorial/response-status-code.md | 6 +- docs/uk/docs/tutorial/schema-extra-example.md | 82 +++++------ docs/uk/docs/tutorial/security/first-steps.md | 10 +- docs/uk/docs/tutorial/security/oauth2-jwt.md | 10 +- .../docs/tutorial/security/simple-oauth2.md | 4 +- docs/uk/docs/tutorial/sql-databases.md | 22 +-- docs/uk/docs/tutorial/static-files.md | 4 +- docs/uk/docs/tutorial/testing.md | 20 +-- docs/uk/docs/virtual-environments.md | 30 ++-- 98 files changed, 921 insertions(+), 811 deletions(-) diff --git a/docs/uk/docs/_llm-test.md b/docs/uk/docs/_llm-test.md index 0dbfaa3db4..2673fb3e9c 100644 --- a/docs/uk/docs/_llm-test.md +++ b/docs/uk/docs/_llm-test.md @@ -11,7 +11,7 @@ * Перевірте, чи все гаразд у перекладі. * За потреби покращіть вашу мовно-специфічну підсказку, загальну підсказку або англійський документ. * Потім вручну виправте решту проблем у перекладі, щоб він був якісним. -* Перекладіть повторно, маючи якісний переклад на місці. Ідеальний результат - коли LLM більше не вносить змін до перекладу. Це означає, що загальна підсказка та ваша мовно-специфічна підсказка настільки добрі, наскільки це можливо (інколи він робитиме кілька, здавалося б, випадкових змін, причина в тому, що LLM-и не є детерміністичними алгоритмами). +* Перекладіть повторно, маючи якісний переклад на місці. Ідеальний результат - коли LLM більше не вносить змін до перекладу. Це означає, що загальна підсказка та ваша мовно-специфічна підсказка настільки добрі, наскільки це можливо (інколи він робитиме кілька, здавалося б, випадкових змін, причина в тому, що [LLM-и не є детерміністичними алгоритмами](https://doublespeak.chat/#/handbook#deterministic-output)). Тести: @@ -95,7 +95,7 @@ $ fastapi run Зовнішнє посилання -* Посилання на стиль -* Посилання на скрипт -* Посилання на зображення +* [Внутрішнє посилання](index.md#installation) +* [Зовнішнє посилання](https://sqlmodel.tiangolo.com/) +* [Посилання на стиль](https://fastapi.tiangolo.com/css/styles.css) +* [Посилання на скрипт](https://fastapi.tiangolo.com/js/logic.js) +* [Посилання на зображення](https://fastapi.tiangolo.com/img/foo.jpg) Текст посилання має бути перекладений, адреса посилання має вказувати на переклад: -* Посилання на FastAPI +* [Посилання на FastAPI](https://fastapi.tiangolo.com/uk/) //// @@ -313,6 +313,7 @@ Some text * тіло відповіді * тіло JSON * тіло форми +* тіло файлу * тіло функції * параметр diff --git a/docs/uk/docs/advanced/additional-responses.md b/docs/uk/docs/advanced/additional-responses.md index 089967a51a..2d2005837f 100644 --- a/docs/uk/docs/advanced/additional-responses.md +++ b/docs/uk/docs/advanced/additional-responses.md @@ -243,5 +243,5 @@ new_dict = {**old_dict, "new key": "new value"} Щоб побачити, що саме можна включати у відповіді, ознайомтеся з цими розділами специфікації OpenAPI: -- Об'єкт відповідей OpenAPI, він включає `Response Object`. -- Об'єкт відповіді OpenAPI, ви можете включити будь-що з цього безпосередньо в кожну відповідь у параметрі `responses`. Зокрема `description`, `headers`, `content` (усередині нього ви оголошуєте різні типи медіа та Схеми JSON) і `links`. +- [Об'єкт відповідей 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`. diff --git a/docs/uk/docs/advanced/additional-status-codes.md b/docs/uk/docs/advanced/additional-status-codes.md index afba933e20..26e2c14545 100644 --- a/docs/uk/docs/advanced/additional-status-codes.md +++ b/docs/uk/docs/advanced/additional-status-codes.md @@ -38,4 +38,4 @@ Якщо ви повертаєте додаткові коди статусу та відповіді безпосередньо, вони не будуть включені до схеми OpenAPI (документації API), адже FastAPI не має способу заздалегідь знати, що саме ви повернете. -Але ви можете задокументувати це у своєму коді, використовуючи: [Додаткові відповіді](additional-responses.md){.internal-link target=_blank}. +Але ви можете задокументувати це у своєму коді, використовуючи: [Додаткові відповіді](additional-responses.md). diff --git a/docs/uk/docs/advanced/advanced-dependencies.md b/docs/uk/docs/advanced/advanced-dependencies.md index 0c6f8cbb34..48a10ba4d4 100644 --- a/docs/uk/docs/advanced/advanced-dependencies.md +++ b/docs/uk/docs/advanced/advanced-dependencies.md @@ -132,7 +132,7 @@ checker(q="somequery") Так сесія звільнить з'єднання з базою даних, і його зможуть використовувати інші запити. -Якщо у вас інший сценарій, де потрібно раннє завершення залежності з `yield`, створіть, будь ласка, питання в обговореннях GitHub із вашим конкретним випадком і поясненням, чому вам корисне раннє закриття для залежностей з `yield`. +Якщо у вас інший сценарій, де потрібно раннє завершення залежності з `yield`, створіть, будь ласка, [питання в обговореннях GitHub](https://github.com/fastapi/fastapi/discussions/new?category=questions) із вашим конкретним випадком і поясненням, чому вам корисне раннє закриття для залежностей з `yield`. Якщо будуть переконливі приклади для раннього закриття в залежностях з `yield`, я розгляну додавання нового способу увімкнути раннє закриття. @@ -144,7 +144,7 @@ checker(q="somequery") ### Фонові задачі та залежності з `yield`, технічні деталі { #background-tasks-and-dependencies-with-yield-technical-details } -До **FastAPI** 0.106.0 піднімати винятки після `yield` було неможливо: завершальний код у залежностях з `yield` виконувався після надсилання відповіді, тож [обробники винятків](../tutorial/handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank} уже відпрацювали б. +До **FastAPI** 0.106.0 піднімати винятки після `yield` було неможливо: завершальний код у залежностях з `yield` виконувався після надсилання відповіді, тож [обробники винятків](../tutorial/handling-errors.md#install-custom-exception-handlers) уже відпрацювали б. Так було спроєктовано головно для того, щоб дозволити використовувати ті самі об'єкти, «віддані» залежностями через `yield`, усередині фонових задач, оскільки завершальний код виконувався після завершення фонових задач. @@ -160,4 +160,4 @@ checker(q="somequery") Якщо ви раніше покладалися на цю поведінку, тепер слід створювати ресурси для фонових задач усередині самої фонової задачі та використовувати всередині лише дані, що не залежать від ресурсів залежностей із `yield`. -Наприклад, замість використання тієї самої сесії бази даних ви створюватимете нову сесію в самій фоновій задачі та отримуватимете об'єкти з бази даних, використовуючи цю нову сесію. І далі, замість передавання об'єкта з бази даних як параметра у функцію фонової задачі, ви передасте ідентифікатор цього об'єкта, а потім отримаєте об'єкт знову всередині функції фонової задачі. +Наприклад, замість використання тієї самої сесії бази даних ви створюватимете нову сесію в самій фоновій задачі та отримуватимете об'єкти з бази даних, використовуючи Цю нову сесію. І далі, замість передавання об'єкта з бази даних як параметра у функцію фонової задачі, ви передасте ідентифікатор цього об'єкта, а потім отримаєте об'єкт знову всередині функції фонової задачі. diff --git a/docs/uk/docs/advanced/async-tests.md b/docs/uk/docs/advanced/async-tests.md index 51d0d57610..9f19bed14d 100644 --- a/docs/uk/docs/advanced/async-tests.md +++ b/docs/uk/docs/advanced/async-tests.md @@ -16,11 +16,11 @@ `TestClient` робить певну «магію» всередині, щоб викликати асинхронний застосунок FastAPI у ваших звичайних тестових функціях `def`, використовуючи стандартний pytest. Але ця «магія» більше не працює, коли ми використовуємо його всередині асинхронних функцій. Запускаючи тести асинхронно, ми більше не можемо використовувати `TestClient` у наших тестових функціях. -`TestClient` побудований на основі HTTPX, і на щастя, ми можемо використовувати його безпосередньо для тестування API. +`TestClient` побудований на основі [HTTPX](https://www.python-httpx.org), і на щастя, ми можемо використовувати його безпосередньо для тестування API. ## Приклад { #example } -Для простого прикладу розгляньмо структуру файлів, подібну до описаної в [Більші застосунки](../tutorial/bigger-applications.md){.internal-link target=_blank} та [Тестування](../tutorial/testing.md){.internal-link target=_blank}: +Для простого прикладу розгляньмо структуру файлів, подібну до описаної в [Більші застосунки](../tutorial/bigger-applications.md) та [Тестування](../tutorial/testing.md): ``` . @@ -84,7 +84,7 @@ response = client.get('/') /// warning | Попередження -Якщо ваш застосунок залежить від подій тривалості життя, `AsyncClient` не ініціюватиме ці події. Щоб гарантувати їх ініціалізацію, використовуйте `LifespanManager` з florimondmanca/asgi-lifespan. +Якщо ваш застосунок залежить від подій тривалості життя, `AsyncClient` не ініціюватиме ці події. Щоб гарантувати їх ініціалізацію, використовуйте `LifespanManager` з [florimondmanca/asgi-lifespan](https://github.com/florimondmanca/asgi-lifespan#usage). /// @@ -94,6 +94,6 @@ response = client.get('/') /// tip | Порада -Якщо ви натрапили на `RuntimeError: Task attached to a different loop` під час інтеграції асинхронних викликів у ваші тести (наприклад, при використанні MongoDB's MotorClient), пам'ятайте створювати об'єкти, яким потрібен цикл подій, лише всередині асинхронних функцій, наприклад, у зворотному виклику `@app.on_event("startup")`. +Якщо ви натрапили на `RuntimeError: Task attached to a different loop` під час інтеграції асинхронних викликів у ваші тести (наприклад, при використанні [MongoDB's MotorClient](https://stackoverflow.com/questions/41584243/runtimeerror-task-attached-to-a-different-loop)), пам'ятайте створювати об'єкти, яким потрібен цикл подій, лише всередині асинхронних функцій, наприклад, у зворотному виклику `@app.on_event("startup")`. /// diff --git a/docs/uk/docs/advanced/behind-a-proxy.md b/docs/uk/docs/advanced/behind-a-proxy.md index 66bb4c0827..55fc248f9a 100644 --- a/docs/uk/docs/advanced/behind-a-proxy.md +++ b/docs/uk/docs/advanced/behind-a-proxy.md @@ -16,9 +16,9 @@ Заголовки представника: -* X-Forwarded-For -* X-Forwarded-Proto -* X-Forwarded-Host +* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For) +* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto) +* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host) /// @@ -60,7 +60,7 @@ https://mysuperapp.com/items/ /// tip | Порада -Якщо хочете дізнатися більше про HTTPS, перегляньте посібник [Про HTTPS](../deployment/https.md){.internal-link target=_blank}. +Якщо хочете дізнатися більше про HTTPS, перегляньте посібник [Про HTTPS](../deployment/https.md). /// @@ -228,7 +228,7 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 Майте на увазі, що сервер (Uvicorn) не використовуватиме `root_path` ні для чого, окрім передачі його застосунку. -Але якщо ви перейдете у вашому браузері на http://127.0.0.1:8000/app, ви побачите звичайну відповідь: +Але якщо ви перейдете у вашому браузері на [http://127.0.0.1:8000/app](http://127.0.0.1:8000/app), ви побачите звичайну відповідь: ```JSON { @@ -251,9 +251,9 @@ Uvicorn очікуватиме, що представник буде зверт ## Локальне тестування з Traefik { #testing-locally-with-traefik } -Ви можете легко провести експеримент локально з вилученим префіксом шляху, використовуючи Traefik. +Ви можете легко провести експеримент локально з вилученим префіксом шляху, використовуючи [Traefik](https://docs.traefik.io/). -Завантажте Traefik, це один бінарний файл, ви можете розпакувати архів і запустити його безпосередньо з термінала. +[Завантажте Traefik](https://github.com/containous/traefik/releases), це один бінарний файл, ви можете розпакувати архів і запустити його безпосередньо з термінала. Потім створіть файл `traefik.toml` з таким вмістом: @@ -330,7 +330,7 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 ### Перевірте відповіді { #check-the-responses } -Тепер, якщо ви перейдете за URL із портом Uvicorn: http://127.0.0.1:8000/app, ви побачите звичайну відповідь: +Тепер, якщо ви перейдете за URL із портом Uvicorn: [http://127.0.0.1:8000/app](http://127.0.0.1:8000/app), ви побачите звичайну відповідь: ```JSON { @@ -345,7 +345,7 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 /// -А тепер відкрийте URL із портом Traefik, включно з префіксом шляху: http://127.0.0.1:9999/api/v1/app. +А тепер відкрийте URL із портом Traefik, включно з префіксом шляху: [http://127.0.0.1:9999/api/v1/app](http://127.0.0.1:9999/api/v1/app). Ми отримуємо ту саму відповідь: @@ -370,13 +370,13 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 «Офіційний» спосіб доступу до застосунку - через представника з префіксом шляху, який ми визначили. Тож, як і очікується, якщо ви спробуєте інтерфейс документації, який обслуговує безпосередньо Uvicorn без префікса шляху в URL, це не запрацює, оскільки він очікує доступу через представника. -Ви можете перевірити це на http://127.0.0.1:8000/docs: +Ви можете перевірити це на [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs): Але якщо ми звернемося до інтерфейсу документації за «офіційним» URL, використовуючи представника з портом `9999`, за адресою `/api/v1/docs`, усе працює коректно! 🎉 -Ви можете перевірити це на http://127.0.0.1:9999/api/v1/docs: +Ви можете перевірити це на [http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs): @@ -433,7 +433,7 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 /// -В інтерфейсі документації за адресою http://127.0.0.1:9999/api/v1/docs це виглядатиме так: +В інтерфейсі документації за адресою [http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs) це виглядатиме так: @@ -461,6 +461,6 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 ## Монтування підзастосунку { #mounting-a-sub-application } -Якщо вам потрібно змонтувати підзастосунок (як описано в [Підзастосунки - монтування](sub-applications.md){.internal-link target=_blank}), одночасно використовуючи представника з `root_path`, ви можете робити це звичайним чином, як і очікуєте. +Якщо вам потрібно змонтувати підзастосунок (як описано в [Підзастосунки - монтування](sub-applications.md)), одночасно використовуючи представника з `root_path`, ви можете робити це звичайним чином, як і очікуєте. FastAPI внутрішньо розумно використовуватиме `root_path`, тож усе просто працюватиме. ✨ diff --git a/docs/uk/docs/advanced/custom-response.md b/docs/uk/docs/advanced/custom-response.md index ebd0ec24a1..4ed7616bf7 100644 --- a/docs/uk/docs/advanced/custom-response.md +++ b/docs/uk/docs/advanced/custom-response.md @@ -1,52 +1,36 @@ # Користувацька відповідь - HTML, стрім, файл, інше { #custom-response-html-stream-file-others } -Типово **FastAPI** повертатиме відповіді, використовуючи `JSONResponse`. +Типово **FastAPI** повертатиме JSON-відповіді. -Ви можете переписати це, повернувши безпосередньо `Response`, як показано в [Повернути відповідь безпосередньо](response-directly.md){.internal-link target=_blank}. +Ви можете переписати це, повернувши `Response` безпосередньо, як показано в [Повернути відповідь безпосередньо](response-directly.md). -Але якщо ви повертаєте `Response` безпосередньо (або будь-який його підклас, як-от `JSONResponse`), дані не будуть автоматично конвертовані (навіть якщо ви оголосите `response_model`), і документація не буде автоматично згенерована (наприклад, із включенням конкретного «медіа-типу» в HTTP-заголовку `Content-Type` як частини згенерованого OpenAPI). +Але якщо ви повертаєте `Response` безпосередньо (або будь-який його підклас, як-от `JSONResponse`), дані не будуть автоматично конвертовані (навіть якщо ви оголосите `response_model`), і документація не буде автоматично згенерована (наприклад, з включенням конкретного «медіа-типу» в HTTP-заголовку `Content-Type` як частини згенерованого OpenAPI). Ви також можете оголосити `Response`, який слід використовувати (наприклад, будь-який підклас `Response`), у декораторі операції шляху через параметр `response_class`. Вміст, який ви повертаєте з вашої функції операції шляху, буде поміщений усередину цього `Response`. -І якщо цей `Response` має JSON медіа-тип (`application/json`), як у випадку з `JSONResponse` та `UJSONResponse`, дані, що повертаються, будуть автоматично перетворені (і відфільтровані) з урахуванням будь-якого Pydantic `response_model`, який ви оголосили в декораторі операції шляху. - /// note | Примітка -Якщо ви використовуєте клас відповіді без медіа-типу, FastAPI очікуватиме, що у вашої відповіді не буде вмісту, тож формат відповіді не буде задокументовано в згенерованих OpenAPI-документах. +Якщо ви використовуєте клас відповіді без медіа-типу, FastAPI очікуватиме, що у вашої відповіді не буде вмісту, тож формат відповіді не буде задокументовано в згенерованій документації OpenAPI. /// -## Використовуйте `ORJSONResponse` { #use-orjsonresponse } +## JSON-відповіді { #json-responses } -Наприклад, якщо ви максимально оптимізуєте продуктивність, можете встановити та використовувати `orjson` і встановити відповідь як `ORJSONResponse`. +Типово FastAPI повертає JSON-відповіді. -Імпортуйте потрібний клас `Response` (підклас) і оголосіть його в декораторі операції шляху. +Якщо ви оголосите [Модель відповіді](../tutorial/response-model.md), FastAPI використає її, щоб серіалізувати дані в JSON за допомогою Pydantic. -Для великих відповідей повернення `Response` безпосередньо значно швидше, ніж повернення словника. +Якщо ви не оголосите модель відповіді, FastAPI використає `jsonable_encoder`, пояснений у [Сумісний кодувальник JSON](../tutorial/encoder.md), і помістить результат у `JSONResponse`. -Це тому, що за замовчуванням FastAPI перевірятиме кожен елемент усередині та переконуватиметься, що його можна серіалізувати як JSON, використовуючи той самий [Сумісний кодувальник JSON](../tutorial/encoder.md){.internal-link target=_blank}, описаний у навчальному посібнику. Саме це дозволяє повертати довільні об'єкти, наприклад моделі бази даних. +Якщо ви оголосите `response_class` з JSON медіа-типом (`application/json`), як у випадку з `JSONResponse`, дані, що повертаються, будуть автоматично перетворені (і відфільтровані) згідно з будь-якою Pydantic `response_model`, яку ви оголосили в декораторі операції шляху. Але дані не будуть серіалізовані в JSON-байти за допомогою Pydantic, натомість вони будуть перетворені з `jsonable_encoder`, а потім передані класу `JSONResponse`, який і серіалізує їх у байти, використовуючи стандартну JSON-бібліотеку в Python. -Але якщо ви впевнені, що вміст, який повертається, серіалізується в JSON, ви можете передати його безпосередньо класу відповіді та уникнути додаткових витрат FastAPI на пропускання вашого вмісту через `jsonable_encoder` перед передаванням його класу відповіді. +### Продуктивність JSON { #json-performance } -{* ../../docs_src/custom_response/tutorial001b_py310.py hl[2,7] *} +Коротко: якщо вам потрібна максимальна продуктивність, використовуйте [Модель відповіді](../tutorial/response-model.md) і не оголошуйте `response_class` у декораторі операції шляху. -/// info | Інформація - -Параметр `response_class` також визначатиме «медіа-тип» відповіді. - -У цьому випадку HTTP-заголовок `Content-Type` буде встановлено в `application/json`. - -І це буде задокументовано відповідно в OpenAPI. - -/// - -/// tip | Порада - -`ORJSONResponse` доступний лише у FastAPI, не в Starlette. - -/// +{* ../../docs_src/response_model/tutorial001_01_py310.py ln[15:17] hl[16] *} ## HTML-відповідь { #html-response } @@ -69,7 +53,7 @@ ### Повернути `Response` { #return-a-response } -Як показано в [Повернути відповідь безпосередньо](response-directly.md){.internal-link target=_blank}, ви також можете переписати відповідь безпосередньо у вашій операції шляху, просто повернувши її. +Як показано в [Повернути відповідь безпосередньо](response-directly.md), ви також можете переписати відповідь безпосередньо у вашій операції шляху, просто повернувши її. Той самий приклад вище, що повертає `HTMLResponse`, може виглядати так: @@ -134,7 +118,7 @@ - `headers` - `dict` строк. - `media_type` - `str`, що задає медіа-тип, напр. `"text/html"`. -FastAPI (насправді Starlette) автоматично додасть заголовок Content-Length. Також буде додано заголовок Content-Type, на основі `media_type` з додаванням набору символів для текстових типів. +FastAPI (насправді Starlette) автоматично додасть заголовок Content-Length. Також буде додано заголовок Content-Type на основі `media_type` з додаванням набору символів для текстових типів. {* ../../docs_src/response_directly/tutorial002_py310.py hl[1,18] *} @@ -154,37 +138,11 @@ FastAPI (насправді Starlette) автоматично додасть з Це типова відповідь, яку використовує **FastAPI**, як зазначено вище. -### `ORJSONResponse` { #orjsonresponse } +/// note | Технічні деталі -Швидка альтернативна JSON-відповідь з використанням `orjson`, як описано вище. +Але якщо ви оголосите модель відповіді або тип, його буде використано безпосередньо для серіалізації даних у JSON, і відповідь з коректним медіа-типом для JSON буде повернута безпосередньо, без використання класу `JSONResponse`. -/// info | Інформація - -Потрібно встановити `orjson`, наприклад `pip install orjson`. - -/// - -### `UJSONResponse` { #ujsonresponse } - -Альтернативна JSON-відповідь з використанням `ujson`. - -/// info | Інформація - -Потрібно встановити `ujson`, наприклад `pip install ujson`. - -/// - -/// warning | Попередження - -`ujson` менш обережний, ніж вбудована реалізація Python, у поводженні з деякими крайніми випадками. - -/// - -{* ../../docs_src/custom_response/tutorial001_py310.py hl[2,7] *} - -/// tip | Порада - -Ймовірно, `ORJSONResponse` може бути швидшою альтернативою. +Це ідеальний спосіб отримати найкращу продуктивність. /// @@ -200,6 +158,7 @@ FastAPI (насправді Starlette) автоматично додасть з Або ви можете використати його в параметрі `response_class`: + {* ../../docs_src/custom_response/tutorial006b_py310.py hl[2,7,9] *} У такому разі ви можете повертати URL безпосередньо з вашої функції операції шляху. @@ -214,31 +173,25 @@ FastAPI (насправді Starlette) автоматично додасть з ### `StreamingResponse` { #streamingresponse } -Приймає async-генератор або звичайний генератор/ітератор і транслює тіло відповіді потоково. +Приймає async-генератор або звичайний генератор/ітератор (функцію з `yield`) і потоково передає тіло відповіді. -{* ../../docs_src/custom_response/tutorial007_py310.py hl[2,14] *} +{* ../../docs_src/custom_response/tutorial007_py310.py hl[3,16] *} -#### Використання `StreamingResponse` з об'єктами типу file-like { #using-streamingresponse-with-file-like-objects } +/// note | Технічні деталі -Якщо у вас є file-like об'єкт (наприклад, об'єкт, що повертається `open()`), ви можете створити генераторну функцію для ітерації по цьому file-like об'єкту. +Завдання `async` може бути скасовано лише тоді, коли воно досягає `await`. Якщо немає `await`, генератор (функція з `yield`) не може бути коректно скасований і може продовжувати працювати навіть після запиту на скасування. -Таким чином, вам не потрібно спочатку читати все в пам'ять, і ви можете передати цю генераторну функцію в `StreamingResponse` і повернути її. +Оскільки цьому невеликому прикладу не потрібні жодні оператори `await`, ми додаємо `await anyio.sleep(0)`, щоб надати циклу подій шанс обробити скасування. -Сюди входить багато бібліотек для взаємодії з хмарними сховищами, обробки відео та інші. +Це ще важливіше для великих або нескінченних потоків. -{* ../../docs_src/custom_response/tutorial008_py310.py hl[2,10:12,14] *} - -1. Це генераторна функція. Вона є «генераторною функцією», бо містить оператори `yield` усередині. -2. Використовуючи блок `with`, ми гарантуємо, що file-like об'єкт буде закрито після завершення роботи генераторної функції. Тобто після того, як вона завершить надсилання відповіді. -3. Цей `yield from` вказує функції ітеруватися по об'єкту з назвою `file_like`. А потім, для кожної ітерованої частини, повертати цю частину, ніби вона надходить з цієї генераторної функції (`iterfile`). - - Тож це генераторна функція, яка всередині передає роботу «генерації» чомусь іншому. - - Роблячи це таким чином, ми можемо помістити її в блок `with` і таким чином гарантувати, що file-like об'єкт буде закрито після завершення. +/// /// tip | Порада -Зверніть увагу, що тут ми використовуємо стандартний `open()`, який не підтримує `async` та `await`, тому ми оголошуємо операцію шляху звичайною `def`. +Замість того щоб повертати `StreamingResponse` безпосередньо, імовірно, краще дотримуватися стилю в [Потокова передача даних](./stream-data.md), це значно зручніше та обробляє скасування «за лаштунками» для вас. + +Якщо ви транслюєте JSON Lines, дотримуйтесь навчального посібника [Потоки JSON Lines](../tutorial/stream-json-lines.md). /// @@ -267,7 +220,7 @@ FastAPI (насправді Starlette) автоматично додасть з Ви можете створити власний клас відповіді, успадкувавши його від `Response`, і використовувати його. -Наприклад, скажімо, ви хочете використовувати `orjson`, але з деякими користувацькими налаштуваннями, які не використовуються у вбудованому класі `ORJSONResponse`. +Наприклад, скажімо, ви хочете використовувати [`orjson`](https://github.com/ijl/orjson) з деякими налаштуваннями. Припустімо, ви хочете, щоб повертався відформатований із відступами JSON, тож ви хочете використати опцію orjson `orjson.OPT_INDENT_2`. @@ -291,13 +244,21 @@ FastAPI (насправді Starlette) автоматично додасть з Звісно, ви, ймовірно, знайдете значно кращі способи скористатися цим, ніж просто форматування JSON. 😉 +### `orjson` або Модель відповіді { #orjson-or-response-model } + +Якщо ви шукаєте продуктивність, імовірно, краще використати [Модель відповіді](../tutorial/response-model.md), ніж відповідь `orjson`. + +З моделлю відповіді FastAPI використає Pydantic, щоб серіалізувати дані в JSON без проміжних кроків, як-от перетворення за допомогою `jsonable_encoder`, що відбувалося б в іншому випадку. + +І «під капотом» Pydantic використовує ті самі внутрішні механізми Rust, що й `orjson`, для серіалізації в JSON, тож ви вже отримаєте найкращу продуктивність із моделлю відповіді. + ## Типова відповідь за замовчуванням { #default-response-class } Створюючи екземпляр класу **FastAPI** або `APIRouter`, ви можете вказати, який клас відповіді використовувати за замовчуванням. Параметр, що це визначає, - `default_response_class`. -У прикладі нижче **FastAPI** використовуватиме `ORJSONResponse` за замовчуванням в усіх операціях шляху замість `JSONResponse`. +У прикладі нижче **FastAPI** використовуватиме `HTMLResponse` за замовчуванням в усіх операціях шляху, замість JSON. {* ../../docs_src/custom_response/tutorial010_py310.py hl[2,4] *} @@ -309,4 +270,4 @@ FastAPI (насправді Starlette) автоматично додасть з ## Додаткова документація { #additional-documentation } -Ви також можете оголосити медіа-тип і багато інших деталей в OpenAPI, використовуючи `responses`: [Додаткові відповіді в OpenAPI](additional-responses.md){.internal-link target=_blank}. +Ви також можете оголосити медіа-тип і багато інших деталей в OpenAPI, використовуючи `responses`: [Додаткові відповіді в OpenAPI](additional-responses.md). diff --git a/docs/uk/docs/advanced/dataclasses.md b/docs/uk/docs/advanced/dataclasses.md index a41e6e5890..1c91304b08 100644 --- a/docs/uk/docs/advanced/dataclasses.md +++ b/docs/uk/docs/advanced/dataclasses.md @@ -2,11 +2,11 @@ FastAPI побудовано поверх **Pydantic**, і я показував вам, як використовувати моделі Pydantic для оголошення запитів і відповідей. -Але FastAPI також підтримує використання `dataclasses` таким самим чином: +Але FastAPI також підтримує використання [`dataclasses`](https://docs.python.org/3/library/dataclasses.html) таким самим чином: {* ../../docs_src/dataclasses_/tutorial001_py310.py hl[1,6:11,18:19] *} -Це підтримується завдяки **Pydantic**, адже він має внутрішню підтримку `dataclasses`. +Це підтримується завдяки **Pydantic**, адже він має [внутрішню підтримку `dataclasses`](https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel). Тож навіть із наведеним вище кодом, який явно не використовує Pydantic, FastAPI використовує Pydantic, щоб перетворити стандартні dataclasses у власний варіант dataclasses Pydantic. @@ -18,7 +18,7 @@ FastAPI побудовано поверх **Pydantic**, і я показував Це працює так само, як із моделями Pydantic. Насправді під капотом це також досягається за допомогою Pydantic. -/// info | Інформація +/// info Майте на увазі, що dataclasses не можуть робити все те, що можуть моделі Pydantic. @@ -64,7 +64,7 @@ Dataclass буде автоматично перетворено на dataclass 6. Тут ми повертаємо словник, що містить `items`, який є списком dataclass. - FastAPI усе ще здатний серіалізувати дані до JSON. + FastAPI усе ще здатний серіалізувати дані до JSON. 7. Тут у `response_model` використано анотацію типу список dataclass `Author`. @@ -74,7 +74,7 @@ Dataclass буде автоматично перетворено на dataclass Як завжди, у FastAPI ви можете поєднувати `def` і `async def` за потреби. - Якщо вам потрібне коротке нагадування, коли що використовувати, перегляньте розділ _«Поспішаєте?»_ у документації про [`async` та `await`](../async.md#in-a-hurry){.internal-link target=_blank}. + Якщо вам потрібне коротке нагадування, коли що використовувати, перегляньте розділ _«Поспішаєте?»_ у документації про [`async` та `await`](../async.md#in-a-hurry). 9. Ця *функція операції шляху* не повертає dataclasses (хоча могла б), а список словників із внутрішніми даними. @@ -88,7 +88,7 @@ Dataclass буде автоматично перетворено на dataclass Можна поєднувати `dataclasses` з іншими моделями Pydantic, наслідувати їх, включати у власні моделі тощо. -Щоб дізнатися більше, перегляньте документацію Pydantic про dataclasses. +Щоб дізнатися більше, перегляньте [документацію Pydantic про dataclasses](https://docs.pydantic.dev/latest/concepts/dataclasses/). ## Версія { #version } diff --git a/docs/uk/docs/advanced/events.md b/docs/uk/docs/advanced/events.md index 7c05ee4a4e..33f6314fe1 100644 --- a/docs/uk/docs/advanced/events.md +++ b/docs/uk/docs/advanced/events.md @@ -150,11 +150,11 @@ async with lifespan(app): Невелика технічна деталь для допитливих нердів. 🤓 -Під капотом, у технічній специфікації ASGI, це частина Протоколу тривалості життя, і там визначені події `startup` і `shutdown`. +Під капотом, у технічній специфікації ASGI, це частина [Протоколу тривалості життя](https://asgi.readthedocs.io/en/latest/specs/lifespan.html), і там визначені події `startup` і `shutdown`. /// info | Інформація -Ви можете прочитати більше про обробники `lifespan` у документації Starlette про Lifespan. +Ви можете прочитати більше про обробники `lifespan` у [документації Starlette про Lifespan](https://www.starlette.dev/lifespan/). Зокрема, як працювати зі станом тривалості життя, який можна використовувати в інших ділянках вашого коду. @@ -162,4 +162,4 @@ async with lifespan(app): ## Підзастосунки { #sub-applications } -🚨 Майте на увазі, що ці події тривалості життя (startup і shutdown) виконуються лише для головного застосунку, а не для [Підзастосунки - монтування](sub-applications.md){.internal-link target=_blank}. +🚨 Майте на увазі, що ці події тривалості життя (startup і shutdown) виконуються лише для головного застосунку, а не для [Підзастосунки - монтування](sub-applications.md). diff --git a/docs/uk/docs/advanced/generate-clients.md b/docs/uk/docs/advanced/generate-clients.md index 66e9193ac3..257089c41a 100644 --- a/docs/uk/docs/advanced/generate-clients.md +++ b/docs/uk/docs/advanced/generate-clients.md @@ -8,11 +8,11 @@ ## Генератори SDK з відкритим кодом { #open-source-sdk-generators } -Універсальним варіантом є OpenAPI Generator, який підтримує **багато мов програмування** та може генерувати SDK з вашої специфікації OpenAPI. +Універсальним варіантом є [OpenAPI Generator](https://openapi-generator.tech/), який підтримує **багато мов програмування** та може генерувати SDK з вашої специфікації OpenAPI. -Для **клієнтів TypeScript** Hey API — спеціалізоване рішення, що надає оптимізований досвід для екосистеми TypeScript. +Для **клієнтів TypeScript** [Hey API](https://heyapi.dev/) — спеціалізоване рішення, що надає оптимізований досвід для екосистеми TypeScript. -Більше генераторів SDK ви можете знайти на OpenAPI.Tools. +Більше генераторів SDK ви можете знайти на [OpenAPI.Tools](https://openapi.tools/#sdk). /// tip | Порада @@ -24,15 +24,15 @@ FastAPI автоматично генерує специфікації **OpenAPI У цьому розділі представлено рішення від компаній, що спонсорують FastAPI: вони мають **венчурну підтримку** та **корпоративну підтримку**. Ці продукти надають **додаткові можливості** та **інтеграції** поверх високоякісно згенерованих SDK. -Завдяки ✨ [**спонсорству FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨ ці компанії допомагають підтримувати фреймворк та його **екосистему** здоровими та **сталими**. +Завдяки ✨ [**спонсорству FastAPI**](../help-fastapi.md#sponsor-the-author) ✨ ці компанії допомагають підтримувати фреймворк та його **екосистему** здоровими та **сталими**. Їхня підтримка також демонструє сильну відданість **спільноті** FastAPI (вам), показуючи, що їм важливо не лише надавати **відмінний сервіс**, а й підтримувати **міцний і процвітаючий фреймворк**, FastAPI. 🙇 Наприклад, ви можете спробувати: -* Speakeasy -* Stainless -* liblab +* [Speakeasy](https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship) +* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral) +* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi) Деякі з цих рішень також можуть бути з відкритим кодом або мати безкоштовні тарифи, тож ви можете спробувати їх без фінансових зобов'язань. Інші комерційні генератори SDK також доступні й їх можна знайти онлайн. 🤓 @@ -66,7 +66,7 @@ npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client Це згенерує TypeScript SDK у `./src/client`. -Ви можете дізнатися, як встановити `@hey-api/openapi-ts`, і почитати про згенерований результат на їхньому сайті. +Ви можете дізнатися, як [встановити `@hey-api/openapi-ts`](https://heyapi.dev/openapi-ts/get-started), і почитати про [згенерований результат](https://heyapi.dev/openapi-ts/output) на їхньому сайті. ### Використання SDK { #using-the-sdk } diff --git a/docs/uk/docs/advanced/index.md b/docs/uk/docs/advanced/index.md index 1cffe0cecd..d856c1e9e1 100644 --- a/docs/uk/docs/advanced/index.md +++ b/docs/uk/docs/advanced/index.md @@ -2,13 +2,13 @@ ## Додаткові можливості { #additional-features } -Основний [Навчальний посібник - Посібник користувача](../tutorial/index.md){.internal-link target=_blank} має бути достатнім, щоб провести вас через усі основні можливості **FastAPI**. +Основний [Навчальний посібник - Посібник користувача](../tutorial/index.md) має бути достатнім, щоб провести вас через усі основні можливості **FastAPI**. У наступних розділах ви побачите інші опції, конфігурації та додаткові можливості. -/// tip | Порада +/// tip -Наступні розділи не обов'язково «просунуті». +Наступні розділи **не обов'язково «просунуті»**. І можливо, що рішення для вашого випадку використання може бути в одному з них. @@ -16,6 +16,6 @@ ## Спершу прочитайте навчальний посібник { #read-the-tutorial-first } -Ви все ще можете використовувати більшість можливостей **FastAPI**, маючи знання з основного [Навчального посібника - Посібника користувача](../tutorial/index.md){.internal-link target=_blank}. +Ви все ще можете використовувати більшість можливостей **FastAPI**, маючи знання з основного [Навчального посібника - Посібника користувача](../tutorial/index.md). А в наступних розділах передбачається, що ви вже його прочитали і знайомі з основними ідеями. diff --git a/docs/uk/docs/advanced/middleware.md b/docs/uk/docs/advanced/middleware.md index 207ca96e0a..d24bc4a5c2 100644 --- a/docs/uk/docs/advanced/middleware.md +++ b/docs/uk/docs/advanced/middleware.md @@ -1,8 +1,8 @@ # Просунуте проміжне програмне забезпечення { #advanced-middleware } -У головному навчальному посібнику ви читали, як додати [Користувацьке проміжне ПЗ](../tutorial/middleware.md){.internal-link target=_blank} до вашого застосунку. +У головному навчальному посібнику ви читали, як додати [Користувацьке проміжне ПЗ](../tutorial/middleware.md) до вашого застосунку. -Також ви читали, як обробляти [CORS за допомогою `CORSMiddleware`](../tutorial/cors.md){.internal-link target=_blank}. +Також ви читали, як обробляти [CORS за допомогою `CORSMiddleware`](../tutorial/cors.md). У цьому розділі розглянемо, як використовувати інше проміжне ПЗ. @@ -91,7 +91,7 @@ Middleware обробляє як стандартні, так і потоков Наприклад: -- `ProxyHeadersMiddleware` з Uvicorn -- MessagePack +- [`ProxyHeadersMiddleware` з Uvicorn](https://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.py) +- [MessagePack](https://github.com/florimondmanca/msgpack-asgi) -Щоб переглянути інші доступні middleware, ознайомтеся з документацією Starlette щодо middleware та списком ASGI Awesome. +Щоб переглянути інші доступні middleware, ознайомтеся з [документацією Starlette щодо middleware](https://www.starlette.dev/middleware/) та [списком ASGI Awesome](https://github.com/florimondmanca/awesome-asgi). diff --git a/docs/uk/docs/advanced/openapi-callbacks.md b/docs/uk/docs/advanced/openapi-callbacks.md index 1f2adb1fc0..5c5c966614 100644 --- a/docs/uk/docs/advanced/openapi-callbacks.md +++ b/docs/uk/docs/advanced/openapi-callbacks.md @@ -35,7 +35,7 @@ /// tip | Порада -Параметр запиту `callback_url` використовує тип Pydantic Url. +Параметр запиту `callback_url` використовує тип Pydantic [Url](https://docs.pydantic.dev/latest/api/networks/). /// @@ -66,7 +66,7 @@ httpx.post(callback_url, json={"description": "Invoice paid", "paid": True}) Фактичний зворотний виклик - це просто HTTP-запит. -Реалізуючи зворотний виклик самостійно, ви можете скористатися, наприклад, HTTPX або Requests. +Реалізуючи зворотний виклик самостійно, ви можете скористатися, наприклад, [HTTPX](https://www.python-httpx.org) або [Requests](https://requests.readthedocs.io/). /// @@ -106,11 +106,11 @@ httpx.post(callback_url, json={"description": "Invoice paid", "paid": True}) Є 2 основні відмінності від звичайної операції шляху: - Їй не потрібен реальний код, адже ваш застосунок ніколи не викликатиме цей код. Вона використовується лише для документування зовнішнього API. Тому функція може просто містити `pass`. -- Шлях може містити вираз OpenAPI 3 (див. нижче), де можна використовувати змінні з параметрами та частини оригінального запиту, надісланого до вашого API. +- Шлях може містити [вираз OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) (див. нижче), де можна використовувати змінні з параметрами та частини оригінального запиту, надісланого до вашого API. ### Вираз шляху зворотного виклику { #the-callback-path-expression } -Шлях зворотного виклику може містити вираз OpenAPI 3, який включає частини оригінального запиту, надісланого до вашого API. +Шлях зворотного виклику може містити [вираз OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression), який включає частини оригінального запиту, надісланого до вашого API. У цьому випадку це строка: @@ -179,7 +179,7 @@ https://www.external.org/events/invoices/2expen51ve ### Перевірте документацію { #check-the-docs } -Тепер ви можете запустити застосунок і перейти за адресою http://127.0.0.1:8000/docs. +Тепер ви можете запустити застосунок і перейти за адресою [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Ви побачите вашу документацію з розділом «Callbacks» для вашої операції шляху, який показує, як має виглядати зовнішній API: diff --git a/docs/uk/docs/advanced/openapi-webhooks.md b/docs/uk/docs/advanced/openapi-webhooks.md index 0d8a7f4c5f..bf51f54667 100644 --- a/docs/uk/docs/advanced/openapi-webhooks.md +++ b/docs/uk/docs/advanced/openapi-webhooks.md @@ -48,7 +48,7 @@ ### Перевірте документацію { #check-the-docs } -Тепер ви можете запустити свій застосунок і перейти за адресою http://127.0.0.1:8000/docs. +Тепер ви можете запустити свій застосунок і перейти за адресою [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Ви побачите у своїй документації звичайні *операції шляху*, а також деякі **вебхуки**: diff --git a/docs/uk/docs/advanced/path-operation-advanced-configuration.md b/docs/uk/docs/advanced/path-operation-advanced-configuration.md index 202f9317ed..f760209abe 100644 --- a/docs/uk/docs/advanced/path-operation-advanced-configuration.md +++ b/docs/uk/docs/advanced/path-operation-advanced-configuration.md @@ -24,7 +24,7 @@ /// tip | Порада -Якщо ви вручну викликаєте `app.openapi()`, оновіть значення `operationId` до цього. +Якщо ви вручну викликаєте `app.openapi()`, оновіть усі `operationId` до цього. /// @@ -60,7 +60,7 @@ Також можна оголосити додаткові відповіді з їхніми моделями, кодами статусу тощо. -У документації є цілий розділ про це, ви можете прочитати його тут: [Додаткові відповіді в OpenAPI](additional-responses.md){.internal-link target=_blank}. +У документації є цілий розділ про це, ви можете прочитати його тут: [Додаткові відповіді в OpenAPI](additional-responses.md). ## Додатково в OpenAPI { #openapi-extra } @@ -68,7 +68,7 @@ /// note | Технічні деталі -У специфікації OpenAPI це називається Об'єкт Operation. +У специфікації OpenAPI це називається [Об'єкт Operation](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#operation-object). /// @@ -82,7 +82,7 @@ Це низькорівнева точка розширення. -Якщо вам потрібно лише оголосити додаткові відповіді, зручніше зробити це через [Додаткові відповіді в OpenAPI](additional-responses.md){.internal-link target=_blank}. +Якщо вам потрібно лише оголосити додаткові відповіді, зручніше зробити це через [Додаткові відповіді в OpenAPI](additional-responses.md). /// diff --git a/docs/uk/docs/advanced/response-change-status-code.md b/docs/uk/docs/advanced/response-change-status-code.md index fdf9f81c56..167df83132 100644 --- a/docs/uk/docs/advanced/response-change-status-code.md +++ b/docs/uk/docs/advanced/response-change-status-code.md @@ -1,6 +1,6 @@ # Відповідь - зміна коду статусу { #response-change-status-code } -Ймовірно, ви вже читали, що можна встановити типовий [код статусу відповіді](../tutorial/response-status-code.md){.internal-link target=_blank}. +Ймовірно, ви вже читали, що можна встановити типовий [код статусу відповіді](../tutorial/response-status-code.md). Але інколи потрібно повернути інший код статусу, ніж типовий. diff --git a/docs/uk/docs/advanced/response-cookies.md b/docs/uk/docs/advanced/response-cookies.md index 826602e708..f4a79fb985 100644 --- a/docs/uk/docs/advanced/response-cookies.md +++ b/docs/uk/docs/advanced/response-cookies.md @@ -20,13 +20,13 @@ Ви також можете створювати кукі, повертаючи `Response` безпосередньо у вашому коді. -Для цього ви можете створити відповідь, як описано в [Повернути відповідь безпосередньо](response-directly.md){.internal-link target=_blank}. +Для цього ви можете створити відповідь, як описано в [Повернути відповідь безпосередньо](response-directly.md). Потім встановіть у ньому кукі і поверніть його: {* ../../docs_src/response_cookies/tutorial001_py310.py hl[10:12] *} -/// tip | Порада +/// tip Майте на увазі, що якщо ви повертаєте відповідь безпосередньо замість використання параметра `Response`, FastAPI поверне її напряму. @@ -48,4 +48,4 @@ /// -Щоб побачити всі доступні параметри та опції, перегляньте документацію в Starlette. +Щоб побачити всі доступні параметри та опції, перегляньте [документацію в Starlette](https://www.starlette.dev/responses/#set-cookie). diff --git a/docs/uk/docs/advanced/response-directly.md b/docs/uk/docs/advanced/response-directly.md index 7396ab7565..30d8f58609 100644 --- a/docs/uk/docs/advanced/response-directly.md +++ b/docs/uk/docs/advanced/response-directly.md @@ -1,36 +1,42 @@ # Повернення Response безпосередньо { #return-a-response-directly } -Коли ви створюєте операцію шляху FastAPI, зазвичай ви можете повертати з неї будь-які дані: `dict`, `list`, модель Pydantic, модель бази даних тощо. +Коли ви створюєте операцію шляху **FastAPI**, зазвичай ви можете повертати з неї будь-які дані: `dict`, `list`, модель Pydantic, модель бази даних тощо. -Типово FastAPI автоматично перетворить це значення повернення на JSON, використовуючи `jsonable_encoder`, описаний у [Сумісному з JSON кодері](../tutorial/encoder.md){.internal-link target=_blank}. +Якщо ви оголосите [Модель відповіді](../tutorial/response-model.md), **FastAPI** використає її, щоб серіалізувати дані у JSON за допомогою Pydantic. -Потім, за лаштунками, він помістить ці дані, сумісні з JSON (наприклад, `dict`), у `JSONResponse`, який буде використано для надсилання відповіді клієнту. +Якщо ви не оголошуєте модель відповіді, **FastAPI** використає `jsonable_encoder`, описаний у [Сумісному з JSON кодері](../tutorial/encoder.md), і помістить результат у `JSONResponse`. -Але ви можете повертати `JSONResponse` безпосередньо з ваших операцій шляху. +Ви також можете створити `JSONResponse` безпосередньо і повернути його. -Це може бути корисним, наприклад, щоб повертати власні заголовки або кукі. +/// tip | Порада + +Зазвичай ви отримаєте значно кращу продуктивність, використовуючи [Модель відповіді](../tutorial/response-model.md), ніж повертаючи `JSONResponse` безпосередньо, адже так дані серіалізуються Pydantic на Rust. + +/// ## Повернення `Response` { #return-a-response } -Насправді ви можете повертати будь-який `Response` або будь-який його підклас. +Ви можете повертати `Response` або будь-який його підклас. -/// tip | Порада +/// info | Інформація `JSONResponse` сам є підкласом `Response`. /// -І коли ви повертаєте `Response`, FastAPI передасть його безпосередньо. +І коли ви повертаєте `Response`, **FastAPI** передасть його безпосередньо. Він не виконуватиме жодних перетворень даних за допомогою моделей Pydantic, не перетворюватиме вміст на будь-який тип тощо. Це дає вам багато гнучкості. Ви можете повертати будь-які типи даних, переписувати будь-які оголошення або перевірки даних тощо. +Це також покладає на вас багато відповідальності. Ви маєте переконатися, що дані, які ви повертаєте, коректні, у правильному форматі, можуть бути серіалізовані тощо. + ## Використання `jsonable_encoder` у `Response` { #using-the-jsonable-encoder-in-a-response } -Оскільки FastAPI не вносить змін у `Response`, який ви повертаєте, вам потрібно впевнитися, що його вміст готовий. +Оскільки **FastAPI** не вносить змін у `Response`, який ви повертаєте, вам потрібно впевнитися, що його вміст готовий. -Наприклад, ви не можете покласти модель Pydantic у `JSONResponse`, не перетворивши її спочатку на `dict` з усіма типами даних (як-от `datetime`, `UUID` тощо), перетвореними на типи, сумісні з JSON. +Наприклад, ви не можете помістити модель Pydantic у `JSONResponse`, не перетворивши її спочатку на `dict` з усіма типами даних (як-от `datetime`, `UUID` тощо), перетвореними на типи, сумісні з JSON. Для таких випадків ви можете використати `jsonable_encoder`, щоб перетворити ваші дані перед тим, як передати їх у відповідь: @@ -40,26 +46,38 @@ Ви також можете використати `from starlette.responses import JSONResponse`. -FastAPI надає ті самі `starlette.responses` як `fastapi.responses` просто як зручність для вас, розробника. Але більшість доступних `Response` походять безпосередньо зі Starlette. +**FastAPI** надає ті самі `starlette.responses` як `fastapi.responses` просто як зручність для вас, розробника. Але більшість доступних відповідей походять безпосередньо зі Starlette. /// ## Повернення власного `Response` { #returning-a-custom-response } -Наведений вище приклад показує всі необхідні частини, але він ще не дуже корисний, адже ви могли просто повернути `item` безпосередньо, і FastAPI помістив би його у `JSONResponse`, перетворивши на `dict` тощо. Усе це відбувається за замовчуванням. +Наведений вище приклад показує всі необхідні частини, але він ще не дуже корисний, адже ви могли просто повернути `item` безпосередньо, і **FastAPI** помістив би його у `JSONResponse`, перетворивши на `dict` тощо. Усе це відбувається за замовчуванням. Тепер подивімося, як це використати, щоб повернути власну відповідь. -Припустімо, ви хочете повернути відповідь XML. +Припустімо, ви хочете повернути відповідь [XML](https://en.wikipedia.org/wiki/XML). Ви можете помістити свій вміст XML у строку, помістити це в `Response` і повернути: {* ../../docs_src/response_directly/tutorial002_py310.py hl[1,18] *} +## Як працює модель відповіді { #how-a-response-model-works } + +Коли ви оголошуєте [Модель відповіді - Тип, що повертається](../tutorial/response-model.md) в операції шляху, **FastAPI** використає її, щоб серіалізувати дані у JSON за допомогою Pydantic. + +{* ../../docs_src/response_model/tutorial001_01_py310.py hl[16,21] *} + +Оскільки це відбувається на боці Rust, продуктивність буде значно кращою, ніж якби це робилося звичайним Python і класом `JSONResponse`. + +Коли використовується `response_model` або тип, що повертається, **FastAPI** не використовуватиме `jsonable_encoder` для перетворення даних (що було б повільніше) і не використовуватиме клас `JSONResponse`. + +Натомість воно бере байти JSON, згенеровані Pydantic за допомогою моделі відповіді (або типу, що повертається), і повертає `Response` з відповідним медіа-типом для JSON (`application/json`) безпосередньо. + ## Примітки { #notes } Коли ви повертаєте `Response` безпосередньо, його дані не перевіряються, не перетворюються (серіалізуються) і не документуються автоматично. -Але ви все ще можете задокументувати це, як описано в [Додаткових відповідях в OpenAPI](additional-responses.md){.internal-link target=_blank}. +Але ви все ще можете задокументувати це, як описано в [Додаткових відповідях в OpenAPI](additional-responses.md). У подальших розділах ви побачите, як використовувати/оголошувати ці власні `Response`, водночас зберігаючи автоматичне перетворення даних, документацію тощо. diff --git a/docs/uk/docs/advanced/response-headers.md b/docs/uk/docs/advanced/response-headers.md index 1c9d4e6773..95ab57fe08 100644 --- a/docs/uk/docs/advanced/response-headers.md +++ b/docs/uk/docs/advanced/response-headers.md @@ -12,7 +12,7 @@ Якщо ви оголосили `response_model`, його все одно буде використано для фільтрації та перетворення поверненого обʼєкта. -FastAPI використає цей *тимчасовий* обʼєкт відповіді, щоб витягти заголовки (а також кукі та код статусу) і помістить їх у кінцеву відповідь, яка міститиме повернуте вами значення, відфільтроване будь-яким `response_model`. +**FastAPI** використає цей *тимчасовий* обʼєкт відповіді, щоб витягти заголовки (а також кукі та код статусу) і помістить їх у кінцеву відповідь, яка міститиме повернуте вами значення, відфільтроване будь-яким `response_model`. Також ви можете оголосити параметр `Response` у залежностях і встановлювати в них заголовки (та кукі). @@ -20,7 +20,7 @@ FastAPI використає цей *тимчасовий* обʼєкт відп Ви також можете додавати заголовки, коли повертаєте `Response` безпосередньо. -Створіть відповідь, як описано в [Повернення Response безпосередньо](response-directly.md){.internal-link target=_blank}, і передайте заголовки як додатковий параметр: +Створіть відповідь, як описано в [Повернення Response безпосередньо](response-directly.md), і передайте заголовки як додатковий параметр: {* ../../docs_src/response_headers/tutorial001_py310.py hl[10:12] *} @@ -28,14 +28,14 @@ FastAPI використає цей *тимчасовий* обʼєкт відп Ви також можете використати `from starlette.responses import Response` або `from starlette.responses import JSONResponse`. -FastAPI надає ті самі `starlette.responses` як `fastapi.responses` просто для зручності для вас, розробника. Але більшість доступних типів відповідей походять безпосередньо зі Starlette. +**FastAPI** надає ті самі `starlette.responses` як `fastapi.responses` просто для зручності для вас, розробника. Але більшість доступних типів відповідей походять безпосередньо зі Starlette. -Оскільки `Response` часто використовують для встановлення заголовків і кукі, FastAPI також надає його як `fastapi.Response`. +Оскільки `Response` часто використовують для встановлення заголовків і кукі, **FastAPI** також надає його як `fastapi.Response`. /// ## Власні заголовки { #custom-headers } -Майте на увазі, що власні закриті заголовки можна додавати за допомогою префікса `X-`. +Майте на увазі, що власні пропрієтарні заголовки можна додавати [за допомогою префікса `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers). -Але якщо у вас є власні заголовки, які клієнт у браузері має бачити, вам потрібно додати їх у вашу конфігурацію CORS (докладніше в [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md){.internal-link target=_blank}), використовуючи параметр `expose_headers`, задокументований у документації Starlette щодо CORS. +Але якщо у вас є власні заголовки, які клієнт у браузері має бачити, вам потрібно додати їх у вашу конфігурацію CORS (докладніше в [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md)), використовуючи параметр `expose_headers`, задокументований у [документації Starlette щодо CORS](https://www.starlette.dev/middleware/#corsmiddleware). diff --git a/docs/uk/docs/advanced/security/http-basic-auth.md b/docs/uk/docs/advanced/security/http-basic-auth.md index e0578772d3..ac356dd8d6 100644 --- a/docs/uk/docs/advanced/security/http-basic-auth.md +++ b/docs/uk/docs/advanced/security/http-basic-auth.md @@ -32,7 +32,7 @@ Використайте залежність, щоб перевірити, чи правильні ім'я користувача та пароль. -Для цього використайте стандартний модуль Python `secrets`, щоб перевірити ім'я користувача та пароль. +Для цього використайте стандартний модуль Python [`secrets`](https://docs.python.org/3/library/secrets.html), щоб перевірити ім'я користувача та пароль. `secrets.compare_digest()` повинен отримувати `bytes` або `str`, що містить лише ASCII-символи (англійські), це означає, що він не працюватиме з символами на кшталт `á`, як у `Sebastián`. @@ -46,7 +46,7 @@ ```Python if not (credentials.username == "stanleyjobson") or not (credentials.password == "swordfish"): - # Return some error + # Поверніть якусь помилку ... ``` diff --git a/docs/uk/docs/advanced/security/index.md b/docs/uk/docs/advanced/security/index.md index a3479794f8..2c00d68a19 100644 --- a/docs/uk/docs/advanced/security/index.md +++ b/docs/uk/docs/advanced/security/index.md @@ -2,11 +2,11 @@ ## Додаткові можливості { #additional-features } -Є кілька додаткових можливостей для роботи з безпекою, окрім тих, що розглянуті в [Навчальний посібник - Посібник користувача: Безпека](../../tutorial/security/index.md){.internal-link target=_blank}. +Є кілька додаткових можливостей для роботи з безпекою, окрім тих, що розглянуті в [Навчальний посібник - Посібник користувача: Безпека](../../tutorial/security/index.md). /// tip | Порада -Наступні розділи не обов'язково «просунуті». +Наступні розділи **не обов'язково «просунуті»**. І можливо, що для вашого випадку використання рішення є в одному з них. @@ -14,6 +14,6 @@ ## Спершу прочитайте навчальний посібник { #read-the-tutorial-first } -У наступних розділах передбачається, що ви вже прочитали основний [Навчальний посібник - Посібник користувача: Безпека](../../tutorial/security/index.md){.internal-link target=_blank}. +У наступних розділах передбачається, що ви вже прочитали основний [Навчальний посібник - Посібник користувача: Безпека](../../tutorial/security/index.md). Усі вони базуються на тих самих концепціях, але надають деякі додаткові можливості. diff --git a/docs/uk/docs/advanced/security/oauth2-scopes.md b/docs/uk/docs/advanced/security/oauth2-scopes.md index 34ef04a288..7f5ba96926 100644 --- a/docs/uk/docs/advanced/security/oauth2-scopes.md +++ b/docs/uk/docs/advanced/security/oauth2-scopes.md @@ -60,7 +60,7 @@ OAuth2 зі scopes - це механізм, який використовуют ## Загальний огляд { #global-view } -Спочатку швидко подивімося на частини, що відрізняються від прикладів у головному **Навчальному посібнику - Керівництві користувача** для [OAuth2 з паролем (і хешуванням), Bearer з JWT-токенами](../../tutorial/security/oauth2-jwt.md){.internal-link target=_blank}. Тепер із використанням OAuth2 scopes: +Спочатку швидко подивімося на частини, що відрізняються від прикладів у головному **Навчальному посібнику - Керівництві користувача** для [OAuth2 з паролем (і хешуванням), Bearer з JWT-токенами](../../tutorial/security/oauth2-jwt.md). Тепер із використанням OAuth2 scopes: {* ../../docs_src/security/tutorial005_an_py310.py hl[5,9,13,47,65,106,108:116,122:126,130:136,141,157] *} @@ -271,4 +271,4 @@ OAuth2 зі scopes - це механізм, який використовуют ## `Security` у параметрі декоратора `dependencies` { #security-in-decorator-dependencies } -Так само як ви можете визначити `list` із `Depends` у параметрі `dependencies` декоратора (як пояснено в [Залежності в декораторах операцій шляху](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}), ви також можете використовувати там `Security` зі `scopes`. +Так само як ви можете визначити `list` із `Depends` у параметрі `dependencies` декоратора (як пояснено в [Залежності в декораторах операцій шляху](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md)), ви також можете використовувати там `Security` зі `scopes`. diff --git a/docs/uk/docs/advanced/settings.md b/docs/uk/docs/advanced/settings.md index dccb4b0911..b369e2f120 100644 --- a/docs/uk/docs/advanced/settings.md +++ b/docs/uk/docs/advanced/settings.md @@ -8,7 +8,7 @@ /// tip | Порада -Щоб зрозуміти змінні оточення, ви можете прочитати [Змінні оточення](../environment-variables.md){.internal-link target=_blank}. +Щоб зрозуміти змінні оточення, ви можете прочитати [Змінні оточення](../environment-variables.md). /// @@ -20,11 +20,11 @@ ## Pydantic `Settings` { #pydantic-settings } -На щастя, Pydantic надає чудовий інструмент для обробки цих налаштувань із змінних оточення - Pydantic: Settings management. +На щастя, Pydantic надає чудовий інструмент для обробки цих налаштувань із змінних оточення - [Pydantic: Settings management](https://docs.pydantic.dev/latest/concepts/pydantic_settings/). ### Встановіть `pydantic-settings` { #install-pydantic-settings } -Спершу переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md){.internal-link target=_blank}, активували його, а потім встановили пакет `pydantic-settings`: +Спершу переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md), активували його, а потім встановили пакет `pydantic-settings`:
@@ -100,7 +100,7 @@ $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" fastapi run main.p ## Налаштування в іншому модулі { #settings-in-another-module } -Ви можете розмістити ці налаштування в іншому модулі, як ви бачили в [Більші застосунки - кілька файлів](../tutorial/bigger-applications.md){.internal-link target=_blank}. +Ви можете розмістити ці налаштування в іншому модулі, як ви бачили в [Більші застосунки - кілька файлів](../tutorial/bigger-applications.md). Наприклад, у вас може бути файл `config.py` з: @@ -112,7 +112,7 @@ $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" fastapi run main.p /// tip | Порада -Вам також знадобиться файл `__init__.py`, як ви бачили в [Більші застосунки - кілька файлів](../tutorial/bigger-applications.md){.internal-link target=_blank}. +Вам також знадобиться файл `__init__.py`, як ви бачили в [Більші застосунки - кілька файлів](../tutorial/bigger-applications.md). /// @@ -172,7 +172,7 @@ $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" fastapi run main.p /// -Pydantic має підтримку читання з таких типів файлів за допомогою зовнішньої бібліотеки. Ви можете дізнатися більше тут: Pydantic Settings: Dotenv (.env) support. +Pydantic має підтримку читання з таких типів файлів за допомогою зовнішньої бібліотеки. Ви можете дізнатися більше тут: [Pydantic Settings: Dotenv (.env) support](https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support). /// tip | Порада @@ -197,7 +197,7 @@ APP_NAME="ChimichangApp" /// tip | Порада -Атрибут `model_config` використовується лише для конфігурації Pydantic. Докладніше: Pydantic: Concepts: Configuration. +Атрибут `model_config` використовується лише для конфігурації Pydantic. Докладніше: [Pydantic: Concepts: Configuration](https://docs.pydantic.dev/latest/concepts/config/). /// @@ -291,7 +291,7 @@ participant execute as Execute function Таким чином, вона поводиться майже так само, якби це була просто глобальна змінна. Але оскільки використовується функція залежності, ми можемо легко переписати її для тестування. -`@lru_cache` є частиною `functools`, що входить до стандартної бібліотеки Python, більше про це можна прочитати в документації Python для `@lru_cache`. +`@lru_cache` є частиною `functools`, що входить до стандартної бібліотеки Python, більше про це можна прочитати в [документації Python для `@lru_cache`](https://docs.python.org/3/library/functools.html#functools.lru_cache). ## Підсумок { #recap } diff --git a/docs/uk/docs/advanced/sub-applications.md b/docs/uk/docs/advanced/sub-applications.md index 5e611c6ff2..bc105824ee 100644 --- a/docs/uk/docs/advanced/sub-applications.md +++ b/docs/uk/docs/advanced/sub-applications.md @@ -30,25 +30,25 @@ ### Перевірте автоматичну документацію API { #check-the-automatic-api-docs } -Тепер запустіть команду `fastapi` з вашим файлом: +Тепер запустіть команду `fastapi`:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-І відкрийте документацію за адресою http://127.0.0.1:8000/docs. +І відкрийте документацію за адресою [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Ви побачите автоматичну документацію API для головного застосунку, що містить лише його власні _операції шляху_: -А потім відкрийте документацію для підзастосунку за адресою http://127.0.0.1:8000/subapi/docs. +А потім відкрийте документацію для підзастосунку за адресою [http://127.0.0.1:8000/subapi/docs](http://127.0.0.1:8000/subapi/docs). Ви побачите автоматичну документацію API для підзастосунку, що містить лише його власні _операції шляху_, усі з правильним префіксом підшляху `/subapi`: @@ -64,4 +64,4 @@ $ fastapi dev main.py Підзастосунок також може мати власні змонтовані підзастосунки, і все працюватиме коректно, оскільки FastAPI автоматично обробляє всі ці `root_path`. -Ви дізнаєтеся більше про `root_path` і як використовувати його явно в розділі [За представником](behind-a-proxy.md){.internal-link target=_blank}. +Ви дізнаєтеся більше про `root_path` і як використовувати його явно в розділі [За представником](behind-a-proxy.md). diff --git a/docs/uk/docs/advanced/templates.md b/docs/uk/docs/advanced/templates.md index 9e1ce3709b..3d9f96e72f 100644 --- a/docs/uk/docs/advanced/templates.md +++ b/docs/uk/docs/advanced/templates.md @@ -8,7 +8,7 @@ ## Встановіть залежності { #install-dependencies } -Переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md){.internal-link target=_blank}, активували його та встановили `jinja2`: +Переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md), активували його та встановили `jinja2`:
@@ -123,4 +123,4 @@ Item ID: 42 ## Детальніше { #more-details } -Докладніше, зокрема як тестувати шаблони, дивіться документацію Starlette щодо шаблонів. +Докладніше, зокрема як тестувати шаблони, дивіться [документацію Starlette щодо шаблонів](https://www.starlette.dev/templates/). diff --git a/docs/uk/docs/advanced/testing-websockets.md b/docs/uk/docs/advanced/testing-websockets.md index cec576fddf..717bffac32 100644 --- a/docs/uk/docs/advanced/testing-websockets.md +++ b/docs/uk/docs/advanced/testing-websockets.md @@ -8,6 +8,6 @@ /// note | Примітка -Докладніше дивіться документацію Starlette з тестування WebSocket. +Докладніше дивіться документацію Starlette щодо [тестування WebSocket](https://www.starlette.dev/testclient/#testing-websocket-sessions). /// diff --git a/docs/uk/docs/advanced/using-request-directly.md b/docs/uk/docs/advanced/using-request-directly.md index 81b90f19b9..330a0b751e 100644 --- a/docs/uk/docs/advanced/using-request-directly.md +++ b/docs/uk/docs/advanced/using-request-directly.md @@ -14,7 +14,7 @@ ## Деталі про об'єкт `Request` { #details-about-the-request-object } -Оскільки під капотом **FastAPI** - це **Starlette** з шаром інструментів зверху, ви можете за потреби використовувати об'єкт `Request` Starlette безпосередньо. +Оскільки під капотом **FastAPI** - це **Starlette** з шаром інструментів зверху, ви можете за потреби використовувати об'єкт [`Request`](https://www.starlette.dev/requests/) Starlette безпосередньо. Це також означає, що якщо ви отримуєте дані безпосередньо з об'єкта `Request` (наприклад, читаєте тіло), FastAPI не буде їх перевіряти, перетворювати або документувати (через OpenAPI для автоматичного інтерфейсу користувача API). @@ -44,7 +44,7 @@ ## Документація `Request` { #request-documentation } -Докладніше про об'єкт `Request` на офіційному сайті документації Starlette. +Докладніше про [об'єкт [`Request`] на офіційному сайті документації Starlette](https://www.starlette.dev/requests/). /// note | Технічні деталі diff --git a/docs/uk/docs/advanced/websockets.md b/docs/uk/docs/advanced/websockets.md index bb06ac00b7..aa290b3897 100644 --- a/docs/uk/docs/advanced/websockets.md +++ b/docs/uk/docs/advanced/websockets.md @@ -1,10 +1,10 @@ # WebSockets { #websockets } -Ви можете використовувати WebSockets з **FastAPI**. +Ви можете використовувати [WebSockets](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) з **FastAPI**. ## Встановіть `websockets` { #install-websockets } -Переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md){.internal-link target=_blank}, активували його та встановили `websockets` (бібліотеку Python, що полегшує використання протоколу «WebSocket»): +Переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md), активували його та встановили `websockets` (бібліотеку Python, що полегшує використання протоколу «WebSocket»):
@@ -64,19 +64,19 @@ $ pip install websockets ## Спробуйте { #try-it } -Якщо ваш файл називається `main.py`, запустіть ваш застосунок командою: +Розмістіть код у файлі `main.py`, а потім запустіть ваш застосунок:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-Відкрийте у браузері http://127.0.0.1:8000. +Відкрийте у браузері [http://127.0.0.1:8000](http://127.0.0.1:8000). Ви побачите просту сторінку на кшталт: @@ -115,25 +115,25 @@ $ fastapi dev main.py Оскільки це WebSocket, не має сенсу піднімати `HTTPException`, натомість ми піднімаємо `WebSocketException`. -Ви можете використати код закриття з чинних кодів, визначених у специфікації. +Ви можете використати код закриття з [чинних кодів, визначених у специфікації](https://tools.ietf.org/html/rfc6455#section-7.4.1). /// ### Спробуйте WebSockets із залежностями { #try-the-websockets-with-dependencies } -Якщо ваш файл називається `main.py`, запустіть ваш застосунок командою: +Запустіть ваш застосунок:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-Відкрийте у браузері http://127.0.0.1:8000. +Відкрийте у браузері [http://127.0.0.1:8000](http://127.0.0.1:8000). Там ви можете встановити: @@ -174,7 +174,7 @@ Client #1596980209979 left the chat Але майте на увазі, що оскільки все обробляється в пам'яті, в одному списку, це працюватиме лише поки процес запущений, і лише з одним процесом. -Якщо вам потрібне щось просте для інтеграції з FastAPI, але більш надійне, з підтримкою Redis, PostgreSQL чи інших, перегляньте encode/broadcaster. +Якщо вам потрібне щось просте для інтеграції з FastAPI, але більш надійне, з підтримкою Redis, PostgreSQL чи інших, перегляньте [encode/broadcaster](https://github.com/encode/broadcaster). /// @@ -182,5 +182,5 @@ Client #1596980209979 left the chat Щоб дізнатися більше про можливості, перегляньте документацію Starlette: -* Клас `WebSocket`. -* Обробка WebSocket на основі класів. +* [Клас `WebSocket`](https://www.starlette.dev/websockets/). +* [Обробка WebSocket на основі класів](https://www.starlette.dev/endpoints/#websocketendpoint). diff --git a/docs/uk/docs/advanced/wsgi.md b/docs/uk/docs/advanced/wsgi.md index 8969241350..84d4aa4609 100644 --- a/docs/uk/docs/advanced/wsgi.md +++ b/docs/uk/docs/advanced/wsgi.md @@ -1,6 +1,6 @@ # Підключення WSGI - Flask, Django та інші { #including-wsgi-flask-django-others } -Ви можете монтувати застосунки WSGI, як ви бачили в [Підзастосунки - монтування](sub-applications.md){.internal-link target=_blank}, [За представником](behind-a-proxy.md){.internal-link target=_blank}. +Ви можете монтувати застосунки WSGI, як ви бачили в [Підзастосунки - монтування](sub-applications.md), [За представником](behind-a-proxy.md). Для цього ви можете використати `WSGIMiddleware` і обгорнути ним ваш застосунок WSGI, наприклад Flask, Django тощо. @@ -36,13 +36,13 @@ А решта - **FastAPI**. -Якщо ви запустите це й перейдете на http://localhost:8000/v1/, ви побачите відповідь від Flask: +Якщо ви запустите це й перейдете на [http://localhost:8000/v1/](http://localhost:8000/v1/), ви побачите відповідь від Flask: ```txt Hello, World from Flask! ``` -А якщо ви перейдете на http://localhost:8000/v2, ви побачите відповідь від FastAPI: +А якщо ви перейдете на [http://localhost:8000/v2](http://localhost:8000/v2), ви побачите відповідь від FastAPI: ```JSON { diff --git a/docs/uk/docs/alternatives.md b/docs/uk/docs/alternatives.md index 5dbf8a96ba..1e9d479da1 100644 --- a/docs/uk/docs/alternatives.md +++ b/docs/uk/docs/alternatives.md @@ -14,7 +14,7 @@ ## Попередні інструменти { #previous-tools } -### Django { #django } +### [Django](https://www.djangoproject.com/) { #django } Це найпопулярніший фреймворк Python, який користується широкою довірою. Він використовується для створення таких систем, як Instagram. @@ -22,7 +22,7 @@ Він був створений для створення HTML у серверній частині, а не для створення API, які використовуються сучасним інтерфейсом (як-от React, Vue.js і Angular) або іншими системами (як-от IoT пристрої), які спілкуються з ним. -### Django REST Framework { #django-rest-framework } +### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework } Фреймворк Django REST був створений як гнучкий інструментарій для створення веб-інтерфейсів API використовуючи Django в основі, щоб покращити його можливості API. @@ -42,7 +42,7 @@ Django REST Framework створив Том Крісті. Той самий тв /// -### Flask { #flask } +### [Flask](https://flask.palletsprojects.com) { #flask } Flask — це «мікрофреймворк», він не включає інтеграцію бази даних, а також багато речей, які за замовчуванням є в Django. @@ -64,7 +64,7 @@ Flask — це «мікрофреймворк», він не включає ін /// -### Requests { #requests } +### [Requests](https://requests.readthedocs.io) { #requests } **FastAPI** насправді не є альтернативою **Requests**. Сфера їх застосування дуже різна. @@ -106,7 +106,7 @@ def read_url(): /// -### Swagger / OpenAPI { #swagger-openapi } +### [Swagger](https://swagger.io/) / [OpenAPI](https://github.com/OAI/OpenAPI-Specification/) { #swagger-openapi } Головною функцією, яку я хотів від Django REST Framework, була автоматична API документація. @@ -124,8 +124,8 @@ def read_url(): Інтегрувати інструменти інтерфейсу на основі стандартів: -* Інтерфейс Swagger -* ReDoc +* [Інтерфейс Swagger](https://github.com/swagger-api/swagger-ui) +* [ReDoc](https://github.com/Rebilly/ReDoc) Ці два було обрано через те, що вони досить популярні та стабільні, але, виконавши швидкий пошук, ви можете знайти десятки додаткових альтернативних інтерфейсів для OpenAPI (які можна використовувати з **FastAPI**). @@ -135,9 +135,9 @@ def read_url(): Існує кілька фреймворків Flask REST, але, витративши час і роботу на їх дослідження, я виявив, що багато з них припинено або залишено, з кількома постійними проблемами, які зробили їх непридатними. -### Marshmallow { #marshmallow } +### [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) { #marshmallow } -Однією з головних функцій, необхідних для систем API, є "серіалізація", яка бере дані з коду (Python) і перетворює їх на щось, що можна надіслати через мережу. Наприклад, перетворення об’єкта, що містить дані з бази даних, на об’єкт JSON. Перетворення об’єктів `datetime` на строки тощо. +Однією з головних функцій, необхідних для систем API, є «серіалізація», яка бере дані з коду (Python) і перетворює їх на щось, що можна надіслати через мережу. Наприклад, перетворення об’єкта, що містить дані з бази даних, на об’єкт JSON. Перетворення об’єктів `datetime` на строки тощо. Іншою важливою функцією, необхідною для API, є перевірка даних, яка забезпечує дійсність даних за певними параметрами. Наприклад, що деяке поле є `int`, а не деяка випадкова строка. Це особливо корисно для вхідних даних. @@ -153,7 +153,7 @@ Marshmallow створено для забезпечення цих функці /// -### Webargs { #webargs } +### [Webargs](https://webargs.readthedocs.io/en/latest/) { #webargs } Іншою важливою функцією, необхідною для API, є аналіз даних із вхідних запитів. @@ -175,7 +175,7 @@ Webargs був створений тими ж розробниками Marshmall /// -### APISpec { #apispec } +### [APISpec](https://apispec.readthedocs.io/en/stable/) { #apispec } Marshmallow і Webargs забезпечують перевірку, аналіз і серіалізацію як плагіни. @@ -205,7 +205,7 @@ APISpec був створений тими ж розробниками Marshmall /// -### Flask-apispec { #flask-apispec } +### [Flask-apispec](https://flask-apispec.readthedocs.io/en/latest/) { #flask-apispec } Це плагін Flask, який об’єднує Webargs, Marshmallow і APISpec. @@ -219,11 +219,11 @@ APISpec був створений тими ж розробниками Marshmall Її використання призвело до створення кількох генераторів повного стека Flask. Це основний стек, який я (та кілька зовнішніх команд) використовував досі: -* https://github.com/tiangolo/full-stack -* https://github.com/tiangolo/full-stack-flask-couchbase -* https://github.com/tiangolo/full-stack-flask-couchdb +* [https://github.com/tiangolo/full-stack](https://github.com/tiangolo/full-stack) +* [https://github.com/tiangolo/full-stack-flask-couchbase](https://github.com/tiangolo/full-stack-flask-couchbase) +* [https://github.com/tiangolo/full-stack-flask-couchdb](https://github.com/tiangolo/full-stack-flask-couchdb) -І ці самі генератори повного стеку були основою [**FastAPI** генераторів проектів](project-generation.md){.internal-link target=_blank}. +І ці самі генератори повного стеку були основою [**FastAPI** генераторів проектів](project-generation.md). /// info | Інформація @@ -237,7 +237,7 @@ Flask-apispec був створений тими ж розробниками Mar /// -### NestJS (та Angular) { #nestjs-and-angular } +### [NestJS](https://nestjs.com/) (та [Angular](https://angular.io/)) { #nestjs-and-angular } Це навіть не Python, NestJS — це фреймворк NodeJS JavaScript (TypeScript), натхненний Angular. @@ -259,13 +259,13 @@ Flask-apispec був створений тими ж розробниками Mar /// -### Sanic { #sanic } +### [Sanic](https://sanic.readthedocs.io/en/latest/) { #sanic } Це був один із перших надзвичайно швидких фреймворків Python на основі `asyncio`. Він був дуже схожий на Flask. /// note | Технічні деталі -Він використовував `uvloop` замість стандартного циклу Python `asyncio`. Ось що зробило його таким швидким. +Він використовував [`uvloop`](https://github.com/MagicStack/uvloop) замість стандартного циклу Python `asyncio`. Ось що зробило його таким швидким. Це явно надихнуло Uvicorn і Starlette, які зараз швидші за Sanic у відкритих тестах. @@ -279,7 +279,7 @@ Flask-apispec був створений тими ж розробниками Mar /// -### Falcon { #falcon } +### [Falcon](https://falconframework.org/) { #falcon } Falcon — ще один високопродуктивний фреймворк Python, він розроблений як мінімальний і працює як основа інших фреймворків, таких як Hug. @@ -297,7 +297,7 @@ Falcon — ще один високопродуктивний фреймворк /// -### Molten { #molten } +### [Molten](https://moltenframework.com/) { #molten } Я відкрив для себе Molten на перших етапах створення **FastAPI**. І він має досить схожі ідеї: @@ -321,7 +321,7 @@ Falcon — ще один високопродуктивний фреймворк /// -### Hug { #hug } +### [Hug](https://github.com/hugapi/hug) { #hug } Hug був одним із перших фреймворків, який реалізував оголошення типів параметрів API за допомогою підказок типу Python. Це була чудова ідея, яка надихнула інші інструменти зробити те саме. @@ -337,7 +337,7 @@ Hug був одним із перших фреймворків, який реа /// info | Інформація -Hug створив Тімоті Крослі, той самий творець `isort`, чудовий інструмент для автоматичного сортування імпорту у файлах Python. +Hug створив Тімоті Крослі, той самий творець [`isort`](https://github.com/timothycrosley/isort), чудовий інструмент для автоматичного сортування імпорту у файлах Python. /// @@ -351,7 +351,7 @@ Hug надихнув **FastAPI** оголосити параметр `response` /// -### APIStar (<= 0,5) { #apistar-0-5 } +### [APIStar](https://github.com/encode/apistar) (<= 0,5) { #apistar-0-5 } Безпосередньо перед тим, як вирішити створити **FastAPI**, я знайшов сервер **APIStar**. Він мав майже все, що я шукав, і мав чудовий дизайн. @@ -401,7 +401,7 @@ APIStar створив Том Крісті. Той самий хлопець, я ## Використовується **FastAPI** { #used-by-fastapi } -### Pydantic { #pydantic } +### [Pydantic](https://docs.pydantic.dev/) { #pydantic } Pydantic — це бібліотека для визначення перевірки даних, серіалізації та документації (за допомогою Схеми JSON) на основі підказок типу Python. @@ -417,7 +417,7 @@ Pydantic — це бібліотека для визначення переві /// -### Starlette { #starlette } +### [Starlette](https://www.starlette.dev/) { #starlette } Starlette — це легкий фреймворк/набір інструментів ASGI, який ідеально підходить для створення високопродуктивних asyncio сервісів. @@ -462,7 +462,7 @@ ASGI — це новий «стандарт», який розробляєтьс /// -### Uvicorn { #uvicorn } +### [Uvicorn](https://www.uvicorn.dev/) { #uvicorn } Uvicorn — це блискавичний сервер ASGI, побудований на uvloop і httptools. @@ -476,10 +476,10 @@ Uvicorn — це блискавичний сервер ASGI, побудован Ви також можете використати параметр командного рядка `--workers`, щоб мати асинхронний багатопроцесний сервер. -Додаткову інформацію див. у розділі [Розгортання](deployment/index.md){.internal-link target=_blank}. +Додаткову інформацію див. у розділі [Розгортання](deployment/index.md). /// ## Орієнтири та швидкість { #benchmarks-and-speed } -Щоб зрозуміти, порівняти та побачити різницю між Uvicorn, Starlette і FastAPI, перегляньте розділ про [Бенчмарки](benchmarks.md){.internal-link target=_blank}. +Щоб зрозуміти, порівняти та побачити різницю між Uvicorn, Starlette і FastAPI, перегляньте розділ про [Бенчмарки](benchmarks.md). diff --git a/docs/uk/docs/async.md b/docs/uk/docs/async.md index baf4720542..95ecec21f1 100644 --- a/docs/uk/docs/async.md +++ b/docs/uk/docs/async.md @@ -141,7 +141,7 @@ def results(): /// info | Інформація -Прекрасні ілюстрації від Ketrina Thompson. 🎨 +Прекрасні ілюстрації від [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨 /// @@ -207,7 +207,7 @@ def results(): /// info | Інформація -Прекрасні ілюстрації від Ketrina Thompson. 🎨 +Прекрасні ілюстрації від [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨 /// @@ -215,7 +215,7 @@ def results(): У цьому сценарії паралельних бургерів ви - комп’ютер/програма 🤖 з двома процесорами (ви і ваша симпатія), які обидва чекають 🕙 і приділяють увагу ⏯ «очікуванню біля прилавка» 🕙 тривалий час. -У закладу фастфуду 8 процесорів (касира/кухаря). У той час як у закладі з рівночасними бургерами могло бути лише 2 (один касир і один кухар). +У закладу фастфуду 8 процесорів (касира/кухаря). У той час як у закладу з рівночасними бургерами могло бути лише 2 (один касир і один кухар). Та все одно фінальний досвід не найкращий. 😞 @@ -251,7 +251,7 @@ def results(): І такий самий рівень продуктивності ви отримуєте з **FastAPI**. -А оскільки можна мати паралелізм і асинхронність одночасно, ви отримуєте вищу продуктивність, ніж більшість протестованих фреймворків NodeJS, і на рівні з Go, який є компільованою мовою, ближчою до C (усе завдяки Starlette). +А оскільки можна мати паралелізм і асинхронність одночасно, ви отримуєте вищу продуктивність, ніж більшість протестованих фреймворків NodeJS, і на рівні з Go, який є компільованою мовою, ближчою до C [(усе завдяки Starlette)](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1). ### Чи краща рівночасність за паралелізм? { #is-concurrency-better-than-parallelism } @@ -298,7 +298,7 @@ def results(): Це, плюс простий факт, що Python є основною мовою для **Data Science**, машинного навчання і особливо глибокого навчання, робить FastAPI дуже вдалим вибором для веб API та застосунків Data Science / машинного навчання (серед багатьох інших). -Щоб побачити, як досягти цього паралелізму у продакшні, див. розділ про [Розгортання](deployment/index.md){.internal-link target=_blank}. +Щоб побачити, як досягти цього паралелізму у продакшні, див. розділ про [Розгортання](deployment/index.md). ## `async` і `await` { #async-and-await } @@ -363,13 +363,13 @@ async def read_burgers(): ### Пишемо свій власний async-код { #write-your-own-async-code } -Starlette (і **FastAPI**) базуються на AnyIO, що робить їх сумісними як зі стандартною бібліотекою Python asyncio, так і з Trio. +Starlette (і **FastAPI**) базуються на [AnyIO](https://anyio.readthedocs.io/en/stable/), що робить їх сумісними як зі стандартною бібліотекою Python [asyncio](https://docs.python.org/3/library/asyncio-task.html), так і з [Trio](https://trio.readthedocs.io/en/stable/). -Зокрема, ви можете безпосередньо використовувати AnyIO для ваших просунутих сценаріїв рівночасності, що потребують складніших патернів у вашому коді. +Зокрема, ви можете безпосередньо використовувати [AnyIO](https://anyio.readthedocs.io/en/stable/) для ваших просунутих сценаріїв рівночасності, що потребують складніших патернів у вашому коді. -І навіть якщо ви не використовували FastAPI, ви могли б писати свої власні async-застосунки з AnyIO, щоб мати високу сумісність і отримати його переваги (наприклад, *структурована рівночасність*). +І навіть якщо ви не використовували FastAPI, ви могли б писати свої власні async-застосунки з [AnyIO](https://anyio.readthedocs.io/en/stable/), щоб мати високу сумісність і отримати його переваги (наприклад, *структурована рівночасність*). -Я створив іншу бібліотеку поверх AnyIO, як тонкий шар, щоб дещо покращити анотації типів і отримати кращу **автодопомогу** (autocompletion), **вбудовані помилки** (inline errors) тощо. Вона також має дружній вступ і навчальний посібник, щоб допомогти вам **зрозуміти** і написати **власний async-код**: Asyncer. Вона буде особливо корисною, якщо вам потрібно **поєднувати async-код зі звичайним** (блокуючим/синхронним) кодом. +Я створив іншу бібліотеку поверх AnyIO, як тонкий шар, щоб дещо покращити анотації типів і отримати кращу **автодопомогу** (autocompletion), **вбудовані помилки** (inline errors) тощо. Вона також має дружній вступ і навчальний посібник, щоб допомогти вам **зрозуміти** і написати **власний async-код**: [Asyncer](https://asyncer.tiangolo.com/). Вона буде особливо корисною, якщо вам потрібно **поєднувати async-код зі звичайним** (блокуючим/синхронним) кодом. ### Інші форми асинхронного коду { #other-forms-of-asynchronous-code } @@ -381,7 +381,7 @@ Starlette (і **FastAPI**) базуються на Gevent. Але код набагато складніший для розуміння, налагодження і мислення про нього. +У попередніх версіях Python ви могли використовувати потоки (threads) або [Gevent](https://www.gevent.org/). Але код набагато складніший для розуміння, налагодження і мислення про нього. У попередніх версіях NodeJS/Browser JavaScript ви б використовували «callbacks», що призводить до «callback hell». @@ -419,15 +419,15 @@ Starlette (і **FastAPI**) базуються на I/O. -Втім, у будь-якій ситуації є велика ймовірність, що **FastAPI** [все одно буде швидшим](index.md#performance){.internal-link target=_blank} (або принаймні порівнянним) за ваш попередній фреймворк. +Втім, у будь-якій ситуації є велика ймовірність, що **FastAPI** [все одно буде швидшим](index.md#performance) (або принаймні порівнянним) за ваш попередній фреймворк. ### Залежності { #dependencies } -Те саме стосується і [залежностей](tutorial/dependencies/index.md){.internal-link target=_blank}. Якщо залежність є стандартною функцією `def` замість `async def`, вона виконується у зовнішньому пулі потоків. +Те саме стосується і [залежностей](tutorial/dependencies/index.md). Якщо залежність є стандартною функцією `def` замість `async def`, вона виконується у зовнішньому пулі потоків. ### Підзалежності { #sub-dependencies } -Ви можете мати кілька залежностей і [підзалежностей](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank}, які вимагають одна одну (як параметри визначень функцій). Деякі з них можуть бути створені з `async def`, а деякі - зі звичайним `def`. Все працюватиме, і ті, що створені зі звичайним `def`, будуть викликані у зовнішньому потоці (з пулу потоків), а не «очікувані». +Ви можете мати кілька залежностей і [підзалежностей](tutorial/dependencies/sub-dependencies.md), які вимагають одна одну (як параметри визначень функцій). Деякі з них можуть бути створені з `async def`, а деякі - зі звичайним `def`. Все працюватиме, і ті, що створені зі звичайним `def`, будуть викликані у зовнішньому потоці (з пулу потоків), а не «очікувані». ### Інші допоміжні функції { #other-utility-functions } diff --git a/docs/uk/docs/benchmarks.md b/docs/uk/docs/benchmarks.md index d53b7ee989..b55ef720fa 100644 --- a/docs/uk/docs/benchmarks.md +++ b/docs/uk/docs/benchmarks.md @@ -1,6 +1,6 @@ # Бенчмарки { #benchmarks } -Незалежні бенчмарки TechEmpower показують, що застосунки FastAPI, запущені під керуванням Uvicorn, є одним із найшвидших доступних фреймворків Python, поступаючись лише самим Starlette і Uvicorn (використовуються FastAPI внутрішньо). +Незалежні бенчмарки TechEmpower показують, що застосунки **FastAPI**, запущені під керуванням Uvicorn, є [одним із найшвидших доступних фреймворків Python](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7), поступаючись лише самим Starlette і Uvicorn (використовуються FastAPI внутрішньо). Але переглядаючи бенчмарки та порівняння, майте на увазі таке. @@ -14,20 +14,20 @@ Ієрархія приблизно така: -* Uvicorn: сервер ASGI - * Starlette: (використовує Uvicorn) веб-мікрофреймворк - * FastAPI: (використовує Starlette) мікрофреймворк для API з низкою додаткових можливостей для створення API, з валідацією даних тощо. +* **Uvicorn**: сервер ASGI + * **Starlette**: (використовує Uvicorn) веб-мікрофреймворк + * **FastAPI**: (використовує Starlette) мікрофреймворк для API з низкою додаткових можливостей для створення API, з валідацією даних тощо. -* Uvicorn: +* **Uvicorn**: * Матиме найвищу продуктивність, адже майже не містить додаткового коду окрім власне сервера. - * Ви не писатимете застосунок безпосередньо на Uvicorn. Це означало б, що ваш код мав би включати принаймні приблизно весь код, який надає Starlette (або FastAPI). І якщо зробити так, ваш кінцевий застосунок матиме ті самі накладні витрати, що й під час використання фреймворку, який мінімізує код застосунку та помилки. + * Ви не писатимете застосунок безпосередньо на Uvicorn. Це означало б, що ваш код мав би включати принаймні приблизно весь код, який надає Starlette (або **FastAPI**). І якщо зробити так, ваш кінцевий застосунок матиме ті самі накладні витрати, що й під час використання фреймворку, який мінімізує код застосунку та помилки. * Якщо ви порівнюєте Uvicorn, порівнюйте його з Daphne, Hypercorn, uWSGI тощо. Сервери застосунків. -* Starlette: +* **Starlette**: * Матиме наступну за швидкістю продуктивність після Uvicorn. Насправді Starlette використовує Uvicorn для запуску. Тож вона може бути «повільнішою» за Uvicorn лише через необхідність виконувати більше коду. * Але надає інструменти для створення простих веб-застосунків із маршрутизацією на основі шляхів тощо. * Якщо ви порівнюєте Starlette, порівнюйте її з Sanic, Flask, Django тощо. Веб-фреймворки (або мікрофреймворки). -* FastAPI: - * Аналогічно до того, як Starlette використовує Uvicorn і не може бути швидшою за нього, FastAPI використовує Starlette, тож не може бути швидшою за неї. +* **FastAPI**: + * Аналогічно до того, як Starlette використовує Uvicorn і не може бути швидшою за нього, **FastAPI** використовує Starlette, тож не може бути швидшою за неї. * FastAPI надає більше можливостей поверх Starlette. Можливості, які майже завжди потрібні під час створення API, як-от валідація та серіалізація даних. І, використовуючи його, ви безкоштовно отримуєте автоматичну документацію (автоматична документація навіть не додає накладних витрат під час роботи застосунку - вона генерується під час запуску). * Якби ви не використовували FastAPI і застосували Starlette безпосередньо (або інший інструмент, наприклад Sanic, Flask, Responder тощо), вам довелося б самостійно реалізувати всю валідацію та серіалізацію даних. Тож ваш кінцевий застосунок усе одно мав би ті самі накладні витрати, ніби він був створений із використанням FastAPI. І в багатьох випадках саме ця валідація та серіалізація даних становить найбільший обсяг коду в застосунках. * Отже, використовуючи FastAPI, ви заощаджуєте час розробки, зменшуєте кількість помилок і рядків коду та, ймовірно, отримуєте таку саму (або кращу) продуктивність, як і без нього (адже інакше вам довелося б реалізувати все це у власному коді). diff --git a/docs/uk/docs/deployment/cloud.md b/docs/uk/docs/deployment/cloud.md index a17aaf2591..97d972717f 100644 --- a/docs/uk/docs/deployment/cloud.md +++ b/docs/uk/docs/deployment/cloud.md @@ -6,7 +6,7 @@ ## FastAPI Cloud { #fastapi-cloud } -**FastAPI Cloud** створено тим самим автором і командою, що стоять за **FastAPI**. +**[FastAPI Cloud](https://fastapicloud.com)** створено тим самим автором і командою, що стоять за **FastAPI**. Воно спрощує процес **створення**, **розгортання** та **доступу** до API з мінімальними зусиллями. @@ -16,9 +16,9 @@ FastAPI Cloud є основним спонсором і джерелом фін ## Хмарні постачальники - спонсори { #cloud-providers-sponsors } -Деякі інші хмарні постачальники ✨ [**спонсорують FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨ також. 🙇 +Деякі інші хмарні постачальники ✨ [**спонсорують FastAPI**](../help-fastapi.md#sponsor-the-author) ✨ також. 🙇 Можливо, ви захочете розглянути їх, щоб дотримуватися їхніх інструкцій і спробувати їхні сервіси: -* Render -* Railway +* [Render](https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi) +* [Railway](https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi) diff --git a/docs/uk/docs/deployment/concepts.md b/docs/uk/docs/deployment/concepts.md index 07ad314405..a6a5bc80e0 100644 --- a/docs/uk/docs/deployment/concepts.md +++ b/docs/uk/docs/deployment/concepts.md @@ -25,7 +25,7 @@ ## Безпека - HTTPS { #security-https } -У [попередньому розділі про HTTPS](https.md){.internal-link target=_blank} ми дізналися, як HTTPS забезпечує шифрування для вашого API. +У [попередньому розділі про HTTPS](https.md) ми дізналися, як HTTPS забезпечує шифрування для вашого API. Ми також бачили, що HTTPS зазвичай надається компонентом, **зовнішнім** щодо вашого серверного застосунку, - **TLS Termination Proxy**. @@ -190,9 +190,9 @@ ### Процеси-працівники і порти { #worker-processes-and-ports } -Пам'ятаєте з документації [Про HTTPS](https.md){.internal-link target=_blank}, що на сервері лише один процес може слухати певну комбінацію порту та IP-адреси? +Пам'ятаєте з документації [Про HTTPS](https.md), що на сервері лише один процес може слухати певну комбінацію порту та IP-адреси? -Це досі так. +Это досі так. Отже, щоб мати **кілька процесів** одночасно, має бути **єдиний процес, який слухає порт**, і який далі якимось чином передає комунікацію кожному процесу-працівнику. @@ -243,7 +243,7 @@ Не хвилюйтеся, якщо деякі пункти про **контейнери**, Docker чи Kubernetes поки що не дуже зрозумілі. -Я розповім більше про образи контейнерів, Docker, Kubernetes тощо в майбутньому розділі: [FastAPI у контейнерах - Docker](docker.md){.internal-link target=_blank}. +Я розповім більше про образи контейнерів, Docker, Kubernetes тощо в майбутньому розділі: [FastAPI у контейнерах - Docker](docker.md). /// @@ -281,7 +281,7 @@ /// tip | Порада -Я наведу більш конкретні приклади для цього з контейнерами у майбутньому розділі: [FastAPI у контейнерах - Docker](docker.md){.internal-link target=_blank}. +Я наведу більш конкретні приклади для цього з контейнерами у майбутньому розділі: [FastAPI у контейнерах - Docker](docker.md). /// diff --git a/docs/uk/docs/deployment/docker.md b/docs/uk/docs/deployment/docker.md index d6faacfe5e..9d9afc0d16 100644 --- a/docs/uk/docs/deployment/docker.md +++ b/docs/uk/docs/deployment/docker.md @@ -1,6 +1,6 @@ # FastAPI у контейнерах - Docker { #fastapi-in-containers-docker } -Під час розгортання застосунків FastAPI поширений підхід - збирати образи контейнерів Linux. Зазвичай це робиться за допомогою Docker. Потім ви можете розгорнути цей образ контейнера кількома різними способами. +Під час розгортання застосунків FastAPI поширений підхід - збирати образи контейнерів Linux. Зазвичай це робиться за допомогою [Docker](https://www.docker.com/). Потім ви можете розгорнути цей образ контейнера кількома різними способами. Використання контейнерів Linux має кілька переваг, зокрема безпека, відтворюваність, простота та інші. @@ -60,16 +60,16 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"] Docker був одним з основних інструментів для створення та керування образами контейнерів і контейнерами. -Існує публічний Docker Hub з готовими офіційними образами для багатьох інструментів, середовищ, баз даних і застосунків. +Існує публічний [Docker Hub](https://hub.docker.com/) з готовими офіційними образами для багатьох інструментів, середовищ, баз даних і застосунків. -Наприклад, є офіційний образ Python. +Наприклад, є офіційний [образ Python](https://hub.docker.com/_/python). І є багато інших образів для різних речей, як-от бази даних, наприклад для: -* PostgreSQL -* MySQL -* MongoDB -* Redis тощо. +* [PostgreSQL](https://hub.docker.com/_/postgres) +* [MySQL](https://hub.docker.com/_/mysql) +* [MongoDB](https://hub.docker.com/_/mongo) +* [Redis](https://hub.docker.com/_/redis) тощо. Використовуючи готовий образ контейнера, дуже легко поєднувати та використовувати різні інструменти. Наприклад, щоб випробувати нову базу даних. У більшості випадків ви можете використати офіційні образи та просто налаштувати їх змінними оточення. @@ -111,7 +111,7 @@ Docker був одним з основних інструментів для с Найпоширеніший спосіб - мати файл `requirements.txt` з назвами пакетів і їхніми версіями, по одному на рядок. -Звісно, ви застосуєте ті самі ідеї з [Про версії FastAPI](versions.md){.internal-link target=_blank}, щоб задати діапазони версій. +Звісно, ви застосуєте ті самі ідеї з [Про версії FastAPI](versions.md), щоб задати діапазони версій. Наприклад, ваш `requirements.txt` може виглядати так: @@ -238,7 +238,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"] #### Використовуйте `CMD` - exec form { #use-cmd-exec-form } -Інструкцію Docker `CMD` можна записати у двох формах: +Інструкцію Docker [`CMD`](https://docs.docker.com/reference/dockerfile/#cmd) можна записати у двох формах: ✅ Exec form: @@ -254,11 +254,11 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"] CMD fastapi run app/main.py --port 80 ``` -Обов’язково завжди використовуйте exec form, щоб FastAPI міг коректно завершувати роботу та щоб були викликані [події тривалості життя](../advanced/events.md){.internal-link target=_blank}. +Обов’язково завжди використовуйте exec form, щоб FastAPI міг коректно завершувати роботу та щоб були викликані [події тривалості життя](../advanced/events.md). -Докладніше про це можна прочитати в документації Docker про shell та exec form. +Докладніше про це можна прочитати в [документації Docker про shell та exec form](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form). -Це може бути особливо помітно при використанні `docker compose`. Див. розділ FAQ Docker Compose для технічних деталей: Чому мої сервіси потребують 10 секунд, щоб пересотворитися або зупинитися?. +Це може бути особливо помітно при використанні `docker compose`. Див. розділ FAQ Docker Compose для технічних деталей: [Чому мої сервіси потребують 10 секунд, щоб пересотворитися або зупинитися?](https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop). #### Структура директорій { #directory-structure } @@ -352,7 +352,7 @@ $ docker run -d --name mycontainer -p 80:80 myimage ## Перевірте { #check-it } -Ви маєте змогу перевірити це за URL вашого Docker-контейнера, наприклад: http://192.168.99.100/items/5?q=somequery або http://127.0.0.1/items/5?q=somequery (або еквівалент, використовуючи ваш Docker-хост). +Ви маєте змогу перевірити це за URL вашого Docker-контейнера, наприклад: [http://192.168.99.100/items/5?q=somequery](http://192.168.99.100/items/5?q=somequery) або [http://127.0.0.1/items/5?q=somequery](http://127.0.0.1/items/5?q=somequery) (або еквівалент, використовуючи ваш Docker-хост). Ви побачите щось таке: @@ -362,17 +362,17 @@ $ docker run -d --name mycontainer -p 80:80 myimage ## Інтерактивна документація API { #interactive-api-docs } -Тепер ви можете перейти на http://192.168.99.100/docs або http://127.0.0.1/docs (або еквівалент, використовуючи ваш Docker-хост). +Тепер ви можете перейти на [http://192.168.99.100/docs](http://192.168.99.100/docs) або [http://127.0.0.1/docs](http://127.0.0.1/docs) (або еквівалент, використовуючи ваш Docker-хост). -Ви побачите автоматичну інтерактивну документацію API (надається Swagger UI): +Ви побачите автоматичну інтерактивну документацію API (надається [Swagger UI](https://github.com/swagger-api/swagger-ui)): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ## Альтернативна документація API { #alternative-api-docs } -Також ви можете перейти на http://192.168.99.100/redoc або http://127.0.0.1/redoc (або еквівалент, використовуючи ваш Docker-хост). +Також ви можете перейти на [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): +Ви побачите альтернативну автоматичну документацію (надається [ReDoc](https://github.com/Rebilly/ReDoc)): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) @@ -413,7 +413,7 @@ CMD ["fastapi", "run", "main.py", "--port", "80"] ## Концепції розгортання { #deployment-concepts } -Поговорімо знову про деякі з тих самих [Концепцій розгортання](concepts.md){.internal-link target=_blank} у термінах контейнерів. +Поговорімо знову про деякі з тих самих [Концепцій розгортання](concepts.md) у термінах контейнерів. Контейнери - це переважно інструмент для спрощення процесу збирання та розгортання застосунку, але вони не нав’язують конкретний підхід до обробки цих концепцій розгортання, і існує кілька можливих стратегій. @@ -432,7 +432,7 @@ CMD ["fastapi", "run", "main.py", "--port", "80"] Якщо зосередитись лише на образі контейнера для застосунку FastAPI (а згодом на запущеному контейнері), HTTPS зазвичай обробляється зовнішнім іншим інструментом. -Це може бути інший контейнер, наприклад з Traefik, що обробляє HTTPS і автоматичне отримання сертифікатів. +Це може бути інший контейнер, наприклад з [Traefik](https://traefik.io/), що обробляє HTTPS і автоматичне отримання сертифікатів. /// tip | Порада @@ -558,7 +558,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"] /// info | Інформація -Якщо ви використовуєте Kubernetes, це, ймовірно, буде Init Container. +Якщо ви використовуєте Kubernetes, це, ймовірно, буде [Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/). /// @@ -570,7 +570,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"] ### Базовий образ Docker { #base-docker-image } -Колись існував офіційний образ Docker для FastAPI: tiangolo/uvicorn-gunicorn-fastapi. Але зараз він застарілий. ⛔️ +Колись існував офіційний образ Docker для FastAPI: [tiangolo/uvicorn-gunicorn-fastapi](https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker). Але зараз він застарілий. ⛔️ Ймовірно, вам не слід використовувати цей базовий образ Docker (або будь-який інший подібний). @@ -600,7 +600,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"] ## Образ Docker з `uv` { #docker-image-with-uv } -Якщо ви використовуєте uv для встановлення та керування вашим проєктом, ви можете скористатися їхнім посібником Docker для uv. +Якщо ви використовуєте [uv](https://github.com/astral-sh/uv) для встановлення та керування вашим проєктом, ви можете скористатися їхнім [посібником Docker для uv](https://docs.astral.sh/uv/guides/integration/docker/). ## Підсумок { #recap } diff --git a/docs/uk/docs/deployment/fastapicloud.md b/docs/uk/docs/deployment/fastapicloud.md index 4b4f3e59be..63d9fa4595 100644 --- a/docs/uk/docs/deployment/fastapicloud.md +++ b/docs/uk/docs/deployment/fastapicloud.md @@ -1,6 +1,6 @@ # FastAPI Cloud { #fastapi-cloud } -Ви можете розгорнути свій застосунок FastAPI на FastAPI Cloud однією командою, приєднуйтесь до списку очікування, якщо ще ні. 🚀 +Ви можете розгорнути свій застосунок FastAPI на [FastAPI Cloud](https://fastapicloud.com) **однією командою**, приєднуйтесь до списку очікування, якщо ще ні. 🚀 ## Вхід { #login } @@ -20,7 +20,7 @@ You are logged in to FastAPI Cloud 🚀 ## Розгортання { #deploy } -Тепер розгорніть свій застосунок однією командою: +Тепер розгорніть свій застосунок **однією командою**:
@@ -40,7 +40,7 @@ Deploying to FastAPI Cloud... ## Про FastAPI Cloud { #about-fastapi-cloud } -**FastAPI Cloud** створено тим самим автором і командою, що стоїть за **FastAPI**. +**[FastAPI Cloud](https://fastapicloud.com)** створено тим самим автором і командою, що стоїть за **FastAPI**. Він спрощує процес **створення**, **розгортання** та **доступу** до API з мінімальними зусиллями. diff --git a/docs/uk/docs/deployment/https.md b/docs/uk/docs/deployment/https.md index 29329c88f0..439adf61e2 100644 --- a/docs/uk/docs/deployment/https.md +++ b/docs/uk/docs/deployment/https.md @@ -10,31 +10,31 @@ /// -Щоб вивчити основи HTTPS з точки зору споживача, перегляньте https://howhttps.works/. +Щоб **вивчити основи HTTPS** з точки зору споживача, перегляньте [https://howhttps.works/](https://howhttps.works/). -Тепер, з точки зору розробника, ось кілька речей, які варто пам'ятати, розмірковуючи про HTTPS: +Тепер, з **точки зору розробника**, ось кілька речей, які варто пам'ятати, розмірковуючи про HTTPS: -* Для HTTPS сервер має мати «сертифікати», видані третьою стороною. - * Насправді ці сертифікати «отримуються» у третьої сторони, а не «генеруються». -* Сертифікати мають строк дії. - * Їхній строк дії спливає. - * І тоді їх потрібно поновити, знову отримавши у третьої сторони. -* Шифрування з'єднання відбувається на рівні TCP. - * Це один шар нижче від HTTP. - * Тож обробка сертифіката та шифрування виконується до HTTP. -* TCP не знає про «домени». Лише про IP-адреси. - * Інформація про конкретний домен, який запитується, міститься в даних HTTP. -* Сертифікати HTTPS «засвідчують» певний домен, але протокол і шифрування працюють на рівні TCP, до того як відомо, з яким доменом маємо справу. -* Типово це означало б, що на одну IP-адресу можна мати лише один сертифікат HTTPS. +* Для HTTPS **сервер** має **мати «сертифікати»**, видані **третьою стороною**. + * Насправді ці сертифікати **«отримуються»** у третьої сторони, а не **«генеруються»**. +* Сертифікати мають **строк дії**. + * Їхній строк дії **спливає**. + * І тоді їх потрібно **поновити**, **знову отримавши** у третьої сторони. +* Шифрування з'єднання відбувається на **рівні TCP**. + * Це один шар **нижче від HTTP**. + * Тож **обробка сертифіката та шифрування** виконується **до HTTP**. +* **TCP не знає про «домени»**. Лише про IP-адреси. + * Інформація про **конкретний домен**, який запитується, міститься в **даних HTTP**. +* **Сертифікати HTTPS** «засвідчують» **певний домен**, але протокол і шифрування працюють на рівні TCP, **до того як відомо**, з яким доменом маємо справу. +* **Типово**, це означало б, що на одну IP-адресу можна мати **лише один сертифікат HTTPS**. * Неважливо, наскільки великий ваш сервер або наскільки малий кожен застосунок на ньому. - * Однак для цього є рішення. -* Є розширення протоколу TLS (який обробляє шифрування на рівні TCP, до HTTP), що називається SNI. - * Це розширення SNI дозволяє одному серверу (з однією IP-адресою) мати кілька сертифікатів HTTPS і обслуговувати кілька доменів/застосунків по HTTPS. - * Щоб це працювало, один-єдиний компонент (програма), що працює на сервері та слухає публічну IP-адресу, має мати всі сертифікати HTTPS на сервері. -* Після отримання захищеного з'єднання протокол обміну все ще HTTP. - * Вміст зашифровано, хоча він надсилається протоколом HTTP. + * Однак для цього є **рішення**. +* Є **розширення** протоколу **TLS** (який обробляє шифрування на рівні TCP, до HTTP), що називається **[SNI](https://en.wikipedia.org/wiki/Server_Name_Indication)**. + * Це розширення SNI дозволяє одному серверу (з **однією IP-адресою**) мати **кілька сертифікатів HTTPS** і обслуговувати **кілька доменів/застосунків через HTTPS**. + * Щоб це працювало, один-єдиний компонент (програма), що працює на сервері та слухає **публічну IP-адресу**, має мати **всі сертифікати HTTPS** на сервері. +* **Після** отримання захищеного з'єднання протокол обміну **залишається HTTP**. + * Вміст **зашифровано**, хоча він надсилається з використанням **протоколу HTTP**. -Поширена практика мати одну програму/HTTP-сервер, що працює на сервері (машині, хості тощо) і керує всіма частинами HTTPS: приймає зашифровані HTTPS-запити, надсилає розшифровані HTTP-запити до фактичного HTTP-застосунку, що працює на тому ж сервері (у нашому випадку застосунок FastAPI), отримує HTTP-відповідь від застосунку, шифрує її за допомогою відповідного сертифіката HTTPS і надсилає її назад клієнту через HTTPS. Такий сервер часто називають TLS Termination Proxy. +Поширена практика мати **одну програму/HTTP-сервер**, що працює на сервері (машині, хості тощо) і **керує всіма частинами HTTPS**: приймає **зашифровані HTTPS-запити**, надсилає **розшифровані HTTP-запити** до фактичного HTTP-застосунку, що працює на тому ж сервері (у нашому випадку застосунок **FastAPI**), отримує **HTTP-відповідь** від застосунку, **шифрує її** за допомогою відповідного **сертифіката HTTPS** і надсилає її назад клієнту через **HTTPS**. Такий сервер часто називають **[TLS Termination Proxy](https://en.wikipedia.org/wiki/TLS_termination_proxy)**. Деякі варіанти, які ви можете використати як TLS Termination Proxy: @@ -45,17 +45,17 @@ ## Let's Encrypt { #lets-encrypt } -До Let's Encrypt ці сертифікати HTTPS продавалися довіреними третіми сторонами. +До Let's Encrypt ці **сертифікати HTTPS** продавалися довіреними третіми сторонами. Процес отримання одного з таких сертифікатів був громіздким, вимагав чимало паперової роботи, а самі сертифікати були доволі дорогими. -Але потім з'явився проєкт Let's Encrypt. +Але потім з'явився проєкт **[Let's Encrypt](https://letsencrypt.org/)**. -Це проєкт Linux Foundation. Він надає сертифікати HTTPS безкоштовно, в автоматизований спосіб. Ці сертифікати використовують усі стандартні криптографічні механізми безпеки і є короткостроковими (близько 3 місяців), тож безпека насправді краща завдяки зменшеній тривалості життя. +Це проєкт Linux Foundation. Він надає **сертифікати HTTPS безкоштовно**, в автоматизований спосіб. Ці сертифікати використовують усі стандартні криптографічні механізми безпеки і є короткостроковими (близько 3 місяців), тож **безпека насправді краща** завдяки зменшеній тривалості життя. Домени безпечно перевіряються, а сертифікати генеруються автоматично. Це також дозволяє автоматизувати поновлення цих сертифікатів. -Ідея полягає в автоматизації отримання та поновлення цих сертифікатів, щоб ви могли мати безпечний HTTPS безкоштовно та назавжди. +Ідея полягає в автоматизації отримання та поновлення цих сертифікатів, щоб ви могли мати **безпечний HTTPS, безкоштовно і назавжди**. ## HTTPS для розробників { #https-for-developers } @@ -63,11 +63,11 @@ ### Доменне ім'я { #domain-name } -Ймовірно, все почнеться з того, що ви придбаєте якесь доменне ім'я. Потім ви налаштуєте його на сервері DNS (можливо, у вашого ж хмарного провайдера). +Ймовірно, все почнеться з того, що ви **придбаєте** якесь **доменне ім'я**. Потім ви налаштуєте його на сервері DNS (можливо, у вашого ж хмарного провайдера). -Ви, скоріш за все, отримаєте хмарний сервер (віртуальну машину) або щось подібне, і він матиме фіксовану публічну IP-адресу. +Ви, скоріш за все, отримаєте хмарний сервер (віртуальну машину) або щось подібне, і він матиме фіксовану **публічну IP-адресу**. -На сервері(ах) DNS ви налаштуєте запис («`A record`»), щоб спрямувати ваш домен на публічну IP-адресу вашого сервера. +На сервері(ах) DNS ви налаштуєте запис («`A record`»), щоб спрямувати **ваш домен** на публічну **IP-адресу вашого сервера**. Ймовірно, ви зробите це лише один раз, уперше, коли все налаштовуватимете. @@ -81,136 +81,136 @@ Тепер зосередьмося на всіх власне частинах HTTPS. -Спочатку браузер звернеться до серверів DNS, щоб дізнатися, яка IP-адреса для домену, у цьому випадку `someapp.example.com`. +Спочатку браузер звернеться до **DNS-серверів**, щоб дізнатися, яка **IP-адреса для домену**, у цьому випадку `someapp.example.com`. -Сервери DNS повідомлять браузеру використати конкретну IP-адресу. Це буде публічна IP-адреса, яку використовує ваш сервер і яку ви налаштували на серверах DNS. +Сервери DNS повідомлять браузеру використати конкретну **IP-адресу**. Це буде публічна IP-адреса, яку використовує ваш сервер і яку ви налаштували на серверах DNS. ### Початок TLS рукостискання { #tls-handshake-start } -Потім браузер зв'яжеться з цією IP-адресою на порту 443 (порт HTTPS). +Потім браузер зв'яжеться з цією IP-адресою на **порту 443** (порт HTTPS). Перша частина комунікації - це просто встановлення з'єднання між клієнтом і сервером та узгодження криптографічних ключів тощо. -Ця взаємодія між клієнтом і сервером для встановлення з'єднання TLS називається TLS рукостисканням. +Ця взаємодія між клієнтом і сервером для встановлення з'єднання TLS називається **TLS рукостисканням**. ### TLS із розширенням SNI { #tls-with-sni-extension } -Лише один процес на сервері може слухати конкретний порт на конкретній IP-адресі. Інші процеси можуть слухати інші порти на тій самій IP-адресі, але лише один для кожної комбінації IP-адреси та порту. +**Лише один процес** на сервері може слухати конкретний **порт** на конкретній **IP-адресі**. Інші процеси можуть слухати інші порти на тій самій IP-адресі, але лише один для кожної комбінації IP-адреси та порту. TLS (HTTPS) за замовчуванням використовує конкретний порт `443`. Отже, це порт, який нам потрібен. -Оскільки лише один процес може слухати цей порт, процесом, що робитиме це, буде TLS Termination Proxy. +Оскільки лише один процес може слухати цей порт, процесом, що робитиме це, буде **TLS Termination Proxy**. -TLS Termination Proxy матиме доступ до одного або кількох сертифікатів TLS (сертифікатів HTTPS). +TLS Termination Proxy матиме доступ до одного або кількох **сертифікатів TLS** (сертифікатів HTTPS). -Використовуючи обговорене вище розширення SNI, TLS Termination Proxy перевірить, який із наявних сертифікатів TLS (HTTPS) слід використати для цього з'єднання, обравши той, що відповідає домену, очікуваному клієнтом. +Використовуючи **розширення SNI**, обговорене вище, TLS Termination Proxy перевірить, який із наявних сертифікатів TLS (HTTPS) слід використати для цього з'єднання, обравши той, що відповідає домену, очікуваному клієнтом. У цьому випадку він використає сертифікат для `someapp.example.com`. -Клієнт уже довіряє сутності, яка видала цей сертифікат TLS (у цьому випадку Let's Encrypt, але про це згодом), тож він може перевірити, що сертифікат дійсний. +Клієнт уже **довіряє** сутності, яка видала цей сертифікат TLS (у цьому випадку Let's Encrypt, але про це згодом), тож він може **перевірити**, що сертифікат дійсний. -Потім, використовуючи сертифікат, клієнт і TLS Termination Proxy узгоджують, як шифрувати решту TCP-комунікації. На цьому частина TLS рукостискання завершується. +Потім, використовуючи сертифікат, клієнт і TLS Termination Proxy **вирішать, як шифрувати** решту **TCP-комунікації**. На цьому частина **TLS рукостискання** завершується. -Після цього клієнт і сервер мають зашифроване TCP-з'єднання - саме це надає TLS. І тоді вони можуть використати це з'єднання, щоб почати власне HTTP-комунікацію. +Після цього клієнт і сервер мають **зашифроване TCP-з'єднання** - саме це надає TLS. І тоді вони можуть використати це з'єднання, щоб почати власне **HTTP-комунікацію**. -І це і є HTTPS: це звичайний HTTP усередині захищеного TLS-з'єднання замість чистого (незашифрованого) TCP-з'єднання. +І це і є **HTTPS**: це звичайний **HTTP** усередині **захищеного TLS-з'єднання** замість чистого (незашифрованого) TCP-з'єднання. /// tip | Порада -Зверніть увагу, що шифрування комунікації відбувається на рівні TCP, а не на рівні HTTP. +Зверніть увагу, що шифрування комунікації відбувається на **рівні TCP**, а не на рівні HTTP. /// ### HTTPS-запит { #https-request } -Тепер, коли клієнт і сервер (конкретно браузер і TLS Termination Proxy) мають зашифроване TCP-з'єднання, вони можуть почати HTTP-комунікацію. +Тепер, коли клієнт і сервер (конкретно браузер і TLS Termination Proxy) мають **зашифроване TCP-з'єднання**, вони можуть почати **HTTP-комунікацію**. -Отже, клієнт надсилає HTTPS-запит. Це просто HTTP-запит через зашифроване TLS-з'єднання. +Отже, клієнт надсилає **HTTPS-запит**. Це просто HTTP-запит через зашифроване TLS-з'єднання. ### Розшифрування запиту { #decrypt-the-request } -TLS Termination Proxy використає узгоджене шифрування, щоб розшифрувати запит, і передасть звичайний (розшифрований) HTTP-запит процесу, що запускає застосунок (наприклад, процесу з Uvicorn, який запускає застосунок FastAPI). +TLS Termination Proxy використає узгоджене шифрування, щоб **розшифрувати запит**, і передасть **звичайний (розшифрований) HTTP-запит** процесу, що запускає застосунок (наприклад, процесу з Uvicorn, який запускає застосунок FastAPI). ### HTTP-відповідь { #http-response } -Застосунок обробить запит і надішле звичайну (незашифровану) HTTP-відповідь TLS Termination Proxy. +Застосунок обробить запит і надішле **звичайну (незашифровану) HTTP-відповідь** TLS Termination Proxy. ### HTTPS-відповідь { #https-response } -Потім TLS Termination Proxy зашифрує відповідь, використовуючи попередньо узгоджену криптографію (що почалася із сертифіката для `someapp.example.com`), і надішле її назад у браузер. +Потім TLS Termination Proxy **зашифрує відповідь**, використовуючи попередньо узгоджену криптографію (що почалася із сертифіката для `someapp.example.com`), і надішле її назад у браузер. -Далі браузер перевірить, що відповідь дійсна й зашифрована правильним криптографічним ключем тощо. Потім він розшифрує відповідь і обробить її. +Далі браузер перевірить, що відповідь дійсна й зашифрована правильним криптографічним ключем тощо. Потім він **розшифрує відповідь** і обробить її. -Клієнт (браузер) знатиме, що відповідь надходить від правильного сервера, тому що використовується узгоджена раніше криптографія з використанням сертифіката HTTPS. +Клієнт (браузер) знатиме, що відповідь надходить від правильного сервера, тому що використовується узгоджена раніше криптографія з використанням **сертифіката HTTPS**. ### Кілька застосунків { #multiple-applications } -На тому самому сервері (або серверах) може бути кілька застосунків, наприклад інші програми API або база даних. +На тому самому сервері (або серверах) може бути **кілька застосунків**, наприклад інші програми API або база даних. -Лише один процес може обробляти конкретну IP-адресу і порт (TLS Termination Proxy у нашому прикладі), але інші застосунки/процеси також можуть працювати на сервері(ах), доки вони не намагаються використати ту саму комбінацію публічної IP-адреси й порту. +Лише один процес може обробляти конкретну IP-адресу і порт (TLS Termination Proxy у нашому прикладі), але інші застосунки/процеси також можуть працювати на сервері(ах), доки вони не намагаються використати ту саму **комбінацію публічної IP-адреси й порту**. -Таким чином, TLS Termination Proxy може обробляти HTTPS і сертифікати для кількох доменів, для кількох застосунків, а потім передавати запити до відповідного застосунку в кожному випадку. +Таким чином, TLS Termination Proxy може обробляти HTTPS і сертифікати для **кількох доменів**, для кількох застосунків, а потім передавати запити до відповідного застосунку в кожному випадку. ### Поновлення сертифіката { #certificate-renewal } -У певний момент у майбутньому строк дії кожного сертифіката спливе (приблизно через 3 місяці після його отримання). +У певний момент у майбутньому строк дії кожного сертифіката **спливе** (приблизно через 3 місяці після його отримання). Потім інша програма (в деяких випадках це інша програма, а в деяких - той самий TLS Termination Proxy) зв'яжеться з Let's Encrypt і поновить сертифікат(и). -Сертифікати TLS пов'язані з доменним іменем, а не з IP-адресою. +**Сертифікати TLS** пов'язані **з доменним іменем**, а не з IP-адресою. -Тому, щоб поновити сертифікати, програма поновлення має довести авторитету (Let's Encrypt), що вона справді «володіє» і контролює цей домен. +Тому, щоб поновити сертифікати, програма поновлення має **довести** авторитету (Let's Encrypt), що вона справді **«володіє» і контролює цей домен**. Щоб зробити це й задовольнити різні потреби застосунків, є кілька способів. Деякі популярні: -* Змінити деякі записи DNS. +* **Змінити деякі записи DNS**. * Для цього програма поновлення має підтримувати API провайдера DNS, тож залежно від того, якого провайдера DNS ви використовуєте, це може бути або не бути варіантом. -* Запуститися як сервер (принаймні під час процесу отримання сертифіката) на публічній IP-адресі, пов'язаній із доменом. +* **Запуститися як сервер** (принаймні під час процесу отримання сертифіката) на публічній IP-адресі, пов'язаній із доменом. * Як ми казали вище, лише один процес може слухати конкретну IP-адресу та порт. * Це одна з причин, чому дуже зручно, коли той самий TLS Termination Proxy також займається процесом поновлення сертифікатів. * Інакше вам, можливо, доведеться на мить зупинити TLS Termination Proxy, запустити програму поновлення, щоб отримати сертифікати, потім налаштувати їх у TLS Termination Proxy і перезапустити TLS Termination Proxy. Це неідеально, оскільки ваші застосунки будуть недоступні під час вимкнення TLS Termination Proxy. -Увесь цей процес поновлення, паралельно з обслуговуванням застосунку, - одна з головних причин, чому ви можете захотіти мати окрему систему для обробки HTTPS за допомогою TLS Termination Proxy замість того, щоб просто використовувати сертифікати TLS безпосередньо з сервером застосунку (наприклад, Uvicorn). +Увесь цей процес поновлення, паралельно з обслуговуванням застосунку, - одна з головних причин, чому ви можете захотіти мати **окрему систему для обробки HTTPS** за допомогою TLS Termination Proxy замість того, щоб просто використовувати сертифікати TLS безпосередньо з сервером застосунку (наприклад, Uvicorn). ## Направлені заголовки проксі { #proxy-forwarded-headers } -Коли ви використовуєте проксі для обробки HTTPS, ваш сервер застосунку (наприклад, Uvicorn через FastAPI CLI) нічого не знає про процес HTTPS, він спілкується звичайним HTTP із TLS Termination Proxy. +Коли ви використовуєте проксі для обробки HTTPS, ваш **сервер застосунку** (наприклад, Uvicorn через FastAPI CLI) нічого не знає про процес HTTPS, він спілкується звичайним HTTP із **TLS Termination Proxy**. -Цей проксі зазвичай динамічно встановлює деякі HTTP-заголовки перед передачею запиту серверу застосунку, щоб дати йому знати, що запит направляється проксі. +Цей **проксі** зазвичай динамічно встановлює деякі HTTP-заголовки перед передачею запиту **серверу застосунку**, щоб дати йому знати, що запит **направляється** проксі. /// note | Технічні деталі Заголовки проксі: -* X-Forwarded-For -* X-Forwarded-Proto -* X-Forwarded-Host +* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For) +* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto) +* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host) /// -Втім, оскільки сервер застосунку не знає, що він стоїть за довіреним проксі, за замовчуванням він не довірятиме цим заголовкам. +Втім, оскільки **сервер застосунку** не знає, що він стоїть за довіреним **проксі**, за замовчуванням він не довірятиме цим заголовкам. -Але ви можете налаштувати сервер застосунку, щоб довіряти направленим заголовкам, надісланим проксі. Якщо ви використовуєте FastAPI CLI, ви можете скористатися курсивною *опцією CLI* `--forwarded-allow-ips`, щоб повідомити, з яких IP-адрес слід довіряти цим направленим заголовкам. +Але ви можете налаштувати **сервер застосунку**, щоб довіряти направленим заголовкам, надісланим **проксі**. Якщо ви використовуєте FastAPI CLI, ви можете скористатися курсивною *опцією CLI* `--forwarded-allow-ips`, щоб повідомити, з яких IP-адрес слід довіряти цим направленим заголовкам. -Наприклад, якщо сервер застосунку отримує комунікацію лише від довіреного проксі, ви можете встановити `--forwarded-allow-ips="*"`, щоб довіряти всім вхідним IP-адресам, оскільки він отримуватиме запити лише з тієї IP-адреси, яку використовує проксі. +Наприклад, якщо **сервер застосунку** отримує комунікацію лише від довіреного **проксі**, ви можете встановити `--forwarded-allow-ips="*"`, щоб довіряти всім вхідним IP-адресам, оскільки він отримуватиме запити лише з тієї IP-адреси, яку використовує **проксі**. Так застосунок зможе знати свою публічну URL-адресу, чи використовує він HTTPS, домен тощо. @@ -218,14 +218,14 @@ TLS Termination Proxy використає узгоджене шифруванн /// tip | Порада -Ви можете дізнатися більше про це в документації [За проксі - Увімкнути направлені заголовки проксі](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers){.internal-link target=_blank} +Ви можете дізнатися більше про це в документації [За проксі - Увімкнути направлені заголовки проксі](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers) /// ## Підсумок { #recap } -Наявність HTTPS дуже важлива і в більшості випадків критична. Більшість зусиль, які вам як розробнику доведеться докласти навколо HTTPS, полягають лише в розумінні цих концепцій і того, як вони працюють. +Наявність **HTTPS** дуже важлива і в більшості випадків **критична**. Більшість зусиль, які вам як розробнику доведеться докласти навколо HTTPS, полягають лише в **розумінні цих концепцій** і того, як вони працюють. -Але як тільки ви знаєте базову інформацію про HTTPS для розробників, ви можете легко комбінувати й налаштовувати різні інструменти, щоб керувати всім просто. +Але як тільки ви знаєте базову інформацію про **HTTPS для розробників**, ви можете легко комбінувати й налаштовувати різні інструменти, щоб керувати всім просто. -У деяких наступних розділах я покажу кілька конкретних прикладів налаштування HTTPS для застосунків FastAPI. 🔒 +У деяких наступних розділах я покажу кілька конкретних прикладів налаштування **HTTPS** для застосунків **FastAPI**. 🔒 diff --git a/docs/uk/docs/deployment/index.md b/docs/uk/docs/deployment/index.md index 7386681397..aa9c1f1fdf 100644 --- a/docs/uk/docs/deployment/index.md +++ b/docs/uk/docs/deployment/index.md @@ -16,7 +16,7 @@ Ви можете розгорнути сервер самостійно, використовуючи комбінацію інструментів, можете скористатися **хмарним сервісом**, який виконує частину роботи за вас, або обрати інші варіанти. -Наприклад, ми, команда, що стоїть за FastAPI, створили **FastAPI Cloud**, щоб зробити розгортання застосунків FastAPI у хмарі якомога простішим і з тим самим досвідом розробки, що й під час роботи з FastAPI. +Наприклад, ми, команда, що стоїть за FastAPI, створили [**FastAPI Cloud**](https://fastapicloud.com), щоб зробити розгортання застосунків FastAPI у хмарі якомога простішим і з тим самим досвідом розробки, що й під час роботи з FastAPI. Я покажу вам кілька основних концепцій, про які, ймовірно, варто пам'ятати під час розгортання **FastAPI**-застосунку (хоча більшість із них стосується будь-яких інших типів веб-застосунків). diff --git a/docs/uk/docs/deployment/manually.md b/docs/uk/docs/deployment/manually.md index d70ec5d5d0..7ea2c78e39 100644 --- a/docs/uk/docs/deployment/manually.md +++ b/docs/uk/docs/deployment/manually.md @@ -52,11 +52,11 @@ FastAPI використовує стандарт для побудови Python Є кілька альтернатив, зокрема: -* Uvicorn: високопродуктивний ASGI-сервер. -* Hypercorn: ASGI-сервер, сумісний з HTTP/2 і Trio, серед інших можливостей. -* Daphne: ASGI-сервер, створений для Django Channels. -* Granian: Rust HTTP-сервер для Python-застосунків. -* NGINX Unit: NGINX Unit - легке й універсальне середовище виконання вебзастосунків. +* [Uvicorn](https://www.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-застосунків. +* [NGINX Unit](https://unit.nginx.org/howto/fastapi/): NGINX Unit - легке й універсальне середовище виконання вебзастосунків. ## Серверна машина і серверна програма { #server-machine-and-server-program } @@ -74,7 +74,7 @@ FastAPI використовує стандарт для побудови Python Але ви також можете встановити ASGI-сервер вручну. -Переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md){.internal-link target=_blank}, активували його, після чого можете встановити серверну програму. +Переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md), активували його, після чого можете встановити серверну програму. Наприклад, щоб установити Uvicorn: @@ -137,7 +137,7 @@ Uvicorn та інші сервери підтримують опцію `--reload Опція `--reload` споживає значно більше ресурсів, є менш стабільною тощо. -Вона дуже допомагає під час розробки, але її не слід використовувати в продакшні. +Вона дуже допомагає під час **розробки**, але її **не слід** використовувати в **продакшні**. /// diff --git a/docs/uk/docs/deployment/server-workers.md b/docs/uk/docs/deployment/server-workers.md index 81a8bd2a4d..f165bb7079 100644 --- a/docs/uk/docs/deployment/server-workers.md +++ b/docs/uk/docs/deployment/server-workers.md @@ -5,7 +5,7 @@ - Безпека - HTTPS - Запуск під час старту - Перезапуски -- Реплікація (кількість процесів, що виконуються) +- **Реплікація (кількість процесів, що виконуються)** - Пам'ять - Попередні кроки перед запуском @@ -13,13 +13,13 @@ Під час розгортання застосунків ви, найімовірніше, захочете мати реплікацію процесів, щоб використовувати кілька ядер і обробляти більше запитів. -Як ви бачили в попередньому розділі про [Концепції розгортання](concepts.md){.internal-link target=_blank}, існує кілька стратегій, які можна використовувати. +Як ви бачили в попередньому розділі про [Концепції розгортання](concepts.md), існує кілька стратегій, які можна використовувати. Тут я покажу, як використовувати Uvicorn із процесами-працівниками за допомогою команди `fastapi` або безпосередньо команди `uvicorn`. /// info | Інформація -Якщо ви використовуєте контейнери, наприклад з Docker або Kubernetes, я розповім про це більше в наступному розділі: [FastAPI у контейнерах - Docker](docker.md){.internal-link target=_blank}. +Якщо ви використовуєте контейнери, наприклад з Docker або Kubernetes, я розповім про це більше в наступному розділі: [FastAPI у контейнерах - Docker](docker.md). Зокрема, під час запуску в Kubernetes вам, найімовірніше, не варто використовувати працівників, натомість запускати один процес Uvicorn на контейнер. Але про це я розповім пізніше в тому розділі. @@ -117,16 +117,16 @@ $ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4 Із наведеного вище списку концепцій розгортання, використання працівників головним чином допоможе з частиною про реплікацію і трохи з перезапусками, але про інше все ще треба подбати: -- Безпека - HTTPS -- Запуск під час старту +- **Безпека - HTTPS** +- **Запуск під час старту** - ***Перезапуски*** - Реплікація (кількість процесів, що виконуються) -- Пам'ять -- Попередні кроки перед запуском +- **Пам'ять** +- **Попередні кроки перед запуском** ## Контейнери і Docker { #containers-and-docker } -У наступному розділі про [FastAPI у контейнерах - Docker](docker.md){.internal-link target=_blank} я поясню кілька стратегій, які ви можете використати для інших концепцій розгортання. +У наступному розділі про [FastAPI у контейнерах - Docker](docker.md) я поясню кілька стратегій, які ви можете використати для інших концепцій розгортання. Я покажу, як побудувати власний образ з нуля для запуску одного процесу Uvicorn. Це простий процес і, ймовірно, саме те, що потрібно при використанні розподіленої системи керування контейнерами, такої як Kubernetes. diff --git a/docs/uk/docs/deployment/versions.md b/docs/uk/docs/deployment/versions.md index 4f6d1b01a2..568ff40ee4 100644 --- a/docs/uk/docs/deployment/versions.md +++ b/docs/uk/docs/deployment/versions.md @@ -4,7 +4,7 @@ Нові можливості додаються часто, помилки регулярно виправляються, а код постійно поліпшується. -Тому поточні версії все ще `0.x.x`, це відображає те, що кожна версія потенційно може містити несумісні зміни. Це відповідає правилам Семантичного версіонування. +Тому поточні версії все ще `0.x.x`, це відображає те, що кожна версія потенційно може містити несумісні зміни. Це відповідає правилам [Семантичного версіонування](https://semver.org/). Ви можете створювати продакшн-застосунки з **FastAPI** вже зараз (і, ймовірно, робите це вже певний час), просто переконайтеся, що ви використовуєте версію, яка коректно працює з рештою вашого коду. @@ -34,7 +34,7 @@ fastapi[standard]>=0.112.0,<0.113.0 ## Доступні версії { #available-versions } -Ви можете переглянути доступні версії (наприклад, щоб перевірити поточну останню) в [Примітках до випусків](../release-notes.md){.internal-link target=_blank}. +Ви можете переглянути доступні версії (наприклад, щоб перевірити поточну останню) в [Примітках до випусків](../release-notes.md). ## Про версії { #about-versions } @@ -66,7 +66,7 @@ fastapi>=0.45.0,<0.46.0 Ви повинні додати тести для вашого застосунку. -З **FastAPI** це дуже легко (завдяки Starlette), перегляньте документацію: [Тестування](../tutorial/testing.md){.internal-link target=_blank} +З **FastAPI** це дуже легко (завдяки Starlette), перегляньте документацію: [Тестування](../tutorial/testing.md) Після того як у вас є тести, ви можете оновити версію **FastAPI** до новішої і переконатися, що весь ваш код працює правильно, запустивши тести. diff --git a/docs/uk/docs/environment-variables.md b/docs/uk/docs/environment-variables.md index b61fd011f6..7b5223bc21 100644 --- a/docs/uk/docs/environment-variables.md +++ b/docs/uk/docs/environment-variables.md @@ -65,7 +65,7 @@ print(f"Hello {name} from Python") /// tip | Порада -Другий аргумент до `os.getenv()` - це значення за замовчуванням, яке буде повернено. +Другий аргумент до [`os.getenv()`](https://docs.python.org/3.8/library/os.html#os.getenv) - це значення за замовчуванням, яке буде повернено. Якщо його не вказано, за замовчуванням це `None`. Тут ми надаємо `"World"` як значення за замовчуванням. @@ -153,7 +153,7 @@ Hello World from Python /// tip | Порада -Докладніше про це можна прочитати у The Twelve-Factor App: Config. +Ви можете прочитати більше у [The Twelve-Factor App: Config](https://12factor.net/config). /// @@ -163,7 +163,7 @@ Hello World from Python Це означає, що будь-яке значення, прочитане в Python зі змінної оточення, буде `str`, а будь-яке перетворення до іншого типу або будь-яка перевірка має виконуватися в коді. -Ви дізнаєтеся більше про використання змінних оточення для роботи з налаштуваннями застосунку в розділі [Просунутий посібник користувача - Налаштування і змінні оточення](./advanced/settings.md){.internal-link target=_blank}. +Ви дізнаєтеся більше про використання змінних оточення для роботи з налаштуваннями застосунку в розділі [Просунутий посібник користувача - Налаштування і змінні оточення](./advanced/settings.md). ## Змінна оточення `PATH` { #path-environment-variable } @@ -285,13 +285,13 @@ $ C:\opt\custompython\bin\python //// -Ця інформація стане у пригоді під час вивчення [Віртуальних середовищ](virtual-environments.md){.internal-link target=_blank}. +Ця інформація стане у пригоді під час вивчення [Віртуальних середовищ](virtual-environments.md). ## Висновок { #conclusion } Тепер ви маєте базове розуміння того, що таке змінні оточення і як їх використовувати в Python. -Також можна прочитати більше у Вікіпедії про змінну оточення. +Також можна прочитати більше у [Вікіпедії про змінну оточення](https://en.wikipedia.org/wiki/Environment_variable). У багатьох випадках не одразу очевидно, як змінні оточення будуть корисними та застосовними. Але вони постійно з’являються в різних сценаріях під час розробки, тож варто про них знати. diff --git a/docs/uk/docs/fastapi-cli.md b/docs/uk/docs/fastapi-cli.md index eb55382302..1183c08c0f 100644 --- a/docs/uk/docs/fastapi-cli.md +++ b/docs/uk/docs/fastapi-cli.md @@ -1,15 +1,15 @@ # FastAPI CLI { #fastapi-cli } -**FastAPI CLI** — це програма командного рядка, яку ви можете використовувати, щоб обслуговувати ваш застосунок FastAPI, керувати вашим проєктом FastAPI тощо. +**FastAPI CLI** — це програма командного рядка, яку ви можете використовувати, щоб обслуговувати ваш застосунок FastAPI, керувати вашим проєктом FastAPI тощо. -Коли ви встановлюєте FastAPI (наприклад, за допомогою `pip install "fastapi[standard]"`), він включає пакет під назвою `fastapi-cli`, цей пакет надає команду `fastapi` у терміналі. +Коли ви встановлюєте FastAPI (наприклад, за допомогою `pip install "fastapi[standard]"`), він постачається з програмою командного рядка, яку можна запускати в терміналі. Щоб запустити ваш застосунок FastAPI для розробки, ви можете використати команду `fastapi dev`:
```console -$ fastapi dev main.py +$ fastapi dev FastAPI Starting development server 🚀 @@ -46,13 +46,66 @@ $ fastapi dev Uvicorn, високопродуктивний, production-ready, ASGI сервер. 😎 +Внутрішньо **FastAPI CLI** використовує [Uvicorn](https://www.uvicorn.dev), високопродуктивний, готовий до продакшну ASGI сервер. 😎 + +CLI `fastapi` спробує автоматично визначити застосунок FastAPI для запуску, припускаючи, що це об'єкт з назвою `app` у файлі `main.py` (або кілька інших варіантів). + +Але ви можете явно налаштувати застосунок, який слід використовувати. + +## Налаштуйте `entrypoint` застосунку в `pyproject.toml` { #configure-the-app-entrypoint-in-pyproject-toml } + +Ви можете налаштувати розташування вашого застосунку у файлі `pyproject.toml`, наприклад: + +```toml +[tool.fastapi] +entrypoint = "main:app" +``` + +Цей `entrypoint` підкаже команді `fastapi`, що слід імпортувати застосунок так: + +```python +from main import app +``` + +Якщо ваш код має таку структуру: + +``` +. +├── backend +│   ├── main.py +│   ├── __init__.py +``` + +Тоді ви встановили б `entrypoint` як: + +```toml +[tool.fastapi] +entrypoint = "backend.main:app" +``` + +що еквівалентно: + +```python +from backend.main import app +``` + +### `fastapi dev` зі шляхом { #fastapi-dev-with-path } + +Ви також можете передати шлях до файлу команді `fastapi dev`, і вона здогадається, який об'єкт застосунку FastAPI використовувати: + +```console +$ fastapi dev main.py +``` + +Але вам доведеться щоразу пам'ятати, щоб передавати правильний шлях під час виклику команди `fastapi`. + +Крім того, інші інструменти можуть не знайти його, наприклад [Розширення VS Code](editor-support.md) або [FastAPI Cloud](https://fastapicloud.com), тому рекомендується використовувати `entrypoint` у `pyproject.toml`. ## `fastapi dev` { #fastapi-dev } @@ -70,6 +123,6 @@ FastAPI CLI бере шлях до вашої Python-програми (напр /// tip | Порада -Ви можете дізнатися більше про це в [документації з розгортання](deployment/index.md){.internal-link target=_blank}. +Ви можете дізнатися більше про це в [документації з розгортання](deployment/index.md). /// diff --git a/docs/uk/docs/features.md b/docs/uk/docs/features.md index db044bf947..0dee012cd5 100644 --- a/docs/uk/docs/features.md +++ b/docs/uk/docs/features.md @@ -6,8 +6,8 @@ ### На основі відкритих стандартів { #based-on-open-standards } -* OpenAPI для створення API, включаючи оголошення шляхів, операцій, параметрів, тіл запитів, безпеки тощо. -* Автоматична документація моделей даних за допомогою JSON Schema (оскільки OpenAPI базується саме на JSON Schema). +* [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification) для створення API, включаючи оголошення шляхів операцій, параметрів, тіл запитів, безпеки тощо. +* Автоматична документація моделей даних за допомогою [**JSON Schema**](https://json-schema.org/) (оскільки OpenAPI базується саме на JSON Schema). * Розроблено на основі цих стандартів після ретельного аналізу, а не як додатковий рівень поверх основної архітектури. * Це також дає змогу використовувати автоматичну **генерацію клієнтського коду** багатьма мовами. @@ -15,11 +15,11 @@ Інтерактивна документація API та вебінтерфейси для його дослідження. Оскільки фреймворк базується на OpenAPI, є кілька варіантів, 2 з яких включені за замовчуванням. -* Swagger UI — з інтерактивним дослідженням, викликом і тестуванням вашого API прямо з браузера. +* [**Swagger UI**](https://github.com/swagger-api/swagger-ui) — з інтерактивним дослідженням, викликом і тестуванням вашого API прямо з браузера. ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) -* Альтернативна документація API за допомогою ReDoc. +* Альтернативна документація API за допомогою [**ReDoc**](https://github.com/Rebilly/ReDoc). ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) @@ -27,7 +27,7 @@ Усе базується на стандартних оголошеннях **типів Python** (завдяки Pydantic). Жодного нового синтаксису для вивчення. Лише стандартний сучасний Python. -Якщо вам потрібно 2-хвилинне нагадування про те, як використовувати типи Python (навіть якщо ви не використовуєте FastAPI), перегляньте короткий підручник: [Типи Python](python-types.md){.internal-link target=_blank}. +Якщо вам потрібно 2-хвилинне нагадування про те, як використовувати типи Python (навіть якщо ви не використовуєте FastAPI), перегляньте короткий підручник: [Типи Python](python-types.md). Ви пишете стандартний Python з типами: @@ -71,11 +71,11 @@ my_second_user: User = User(**second_user_data) /// -### Підтримка редакторів (IDE) { #editor-support } +### Підтримка редакторів { #editor-support } Увесь фреймворк спроєктовано так, щоб ним було легко та інтуїтивно користуватися; усі рішення тестувалися у кількох редакторах ще до початку розробки, щоб забезпечити найкращий досвід розробки. -З опитувань розробників Python зрозуміло що однією з найуживаніших функцій є «автодоповнення». +З опитувань розробників Python зрозуміло [що однією з найуживаніших функцій є «автодоповнення»](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features). Увесь фреймворк **FastAPI** побудований так, щоб це забезпечити. Автодоповнення працює всюди. @@ -83,11 +83,11 @@ my_second_user: User = User(**second_user_data) Ось як ваш редактор може вам допомогти: -* у Visual Studio Code: +* у [Visual Studio Code](https://code.visualstudio.com/): ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) -* у PyCharm: +* у [PyCharm](https://www.jetbrains.com/pycharm/): ![editor support](https://fastapi.tiangolo.com/img/pycharm-completion.png) @@ -124,7 +124,7 @@ FastAPI має розумні **налаштування за замовчува Підтримуються всі схеми безпеки, визначені в OpenAPI, включно з: * HTTP Basic. -* **OAuth2** (також із підтримкою **JWT tokens**). Перегляньте підручник: [OAuth2 із JWT](tutorial/security/oauth2-jwt.md){.internal-link target=_blank}. +* **OAuth2** (також із підтримкою **JWT tokens**). Перегляньте підручник: [OAuth2 із JWT](tutorial/security/oauth2-jwt.md). * Ключі API в: * Заголовках. * Параметрах запиту. @@ -141,7 +141,7 @@ FastAPI містить надзвичайно просту у використа * Навіть залежності можуть мати власні залежності, утворюючи ієрархію або **«граф» залежностей**. * Усе **автоматично обробляється** фреймворком. * Усі залежності можуть вимагати дані із запитів і **розширювати обмеження операції шляху** та автоматичну документацію. -* **Автоматична валідація** навіть для параметрів *операції шляху*, визначених у залежностях. +* **Автоматична валідація** навіть для *операції шляху*, визначених у залежностях. * Підтримка складних систем автентифікації користувачів, **підключень до баз даних** тощо. * **Жодних компромісів** із базами даних, фронтендами тощо. Але проста інтеграція з усіма ними. @@ -159,13 +159,13 @@ FastAPI містить надзвичайно просту у використа ## Можливості Starlette { #starlette-features } -**FastAPI** повністю сумісний із (та побудований на основі) Starlette. Тому будь-який додатковий код Starlette, який ви маєте, також працюватиме. +**FastAPI** повністю сумісний із (та побудований на основі) [**Starlette**](https://www.starlette.dev/). Тому будь-який додатковий код Starlette, який ви маєте, також працюватиме. `FastAPI` фактично є підкласом `Starlette`. Тому, якщо ви вже знайомі зі Starlette або використовуєте його, більшість функціональності працюватиме так само. З **FastAPI** ви отримуєте всі можливості **Starlette** (адже FastAPI — це просто Starlette на стероїдах): -* Разюча продуктивність. Це один із найшвидших доступних Python-фреймворків, на рівні з **NodeJS** і **Go**. +* Разюча продуктивність. Це [один із найшвидших доступних Python-фреймворків, на рівні з **NodeJS** і **Go**](https://github.com/encode/starlette#performance). * Підтримка **WebSocket**. * Фонові задачі у процесі. * Події запуску та завершення роботи. @@ -177,7 +177,7 @@ FastAPI містить надзвичайно просту у використа ## Можливості Pydantic { #pydantic-features } -**FastAPI** повністю сумісний із (та побудований на основі) Pydantic. Тому будь-який додатковий код Pydantic, який ви маєте, також працюватиме. +**FastAPI** повністю сумісний із (та побудований на основі) [**Pydantic**](https://docs.pydantic.dev/). Тому будь-який додатковий код Pydantic, який ви маєте, також працюватиме. Включно із зовнішніми бібліотеками, які також базуються на Pydantic, як-от ORM-и, ODM-и для баз даних. diff --git a/docs/uk/docs/help-fastapi.md b/docs/uk/docs/help-fastapi.md index a98e56c260..152bf2e291 100644 --- a/docs/uk/docs/help-fastapi.md +++ b/docs/uk/docs/help-fastapi.md @@ -12,7 +12,7 @@ ## Підпишіться на розсилку { #subscribe-to-the-newsletter } -Ви можете підписатися на (нечасту) розсилку [**FastAPI and friends**](newsletter.md){.internal-link target=_blank}, щоб бути в курсі: +Ви можете підписатися на (нечасту) розсилку [**FastAPI and friends**](newsletter.md), щоб бути в курсі: * Новин про FastAPI та друзів 🚀 * Посібників 📝 @@ -22,17 +22,17 @@ ## Стежте за FastAPI в X (Twitter) { #follow-fastapi-on-x-twitter } -Стежте за @fastapi в **X (Twitter)**, щоб отримувати найсвіжіші новини про **FastAPI**. 🐦 +[Стежте за @fastapi в **X (Twitter)**](https://x.com/fastapi), щоб отримувати найсвіжіші новини про **FastAPI**. 🐦 ## Додайте зірочку **FastAPI** на GitHub { #star-fastapi-in-github } -Ви можете «поставити зірочку» FastAPI на GitHub (натиснувши кнопку зірочки у верхньому правому куті): https://github.com/fastapi/fastapi. ⭐️ +Ви можете «поставити зірочку» FastAPI на GitHub (натиснувши кнопку зірочки у верхньому правому куті): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). ⭐️ Додавши зірочку, іншим користувачам буде легше його знайти і побачити, що він уже був корисним для інших. ## Стежте за випусками в репозиторії GitHub { #watch-the-github-repository-for-releases } -Ви можете «спостерігати» за FastAPI на GitHub (натиснувши кнопку «watch» у верхньому правому куті): https://github.com/fastapi/fastapi. 👀 +Ви можете «спостерігати» за FastAPI на GitHub (натиснувши кнопку «watch» у верхньому правому куті): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). 👀 Там ви можете вибрати «Releases only». @@ -40,45 +40,45 @@ ## Зв'яжіться з автором { #connect-with-the-author } -Ви можете зв'язатися зі мною (Sebastián Ramírez / `tiangolo`), автором. +Ви можете зв'язатися зі [мною (Sebastián Ramírez / `tiangolo`)](https://tiangolo.com), автором. Ви можете: -* Стежити за мною на **GitHub**. +* [Стежити за мною на **GitHub**](https://github.com/tiangolo). * Подивитися інші Open Source-проєкти, які я створив і які можуть вам допомогти. * Стежити, щоб бачити, коли я створюю новий Open Source-проєкт. -* Стежити за мною в **X (Twitter)** або Mastodon. +* [Стежити за мною в **X (Twitter)**](https://x.com/tiangolo) або [Mastodon](https://fosstodon.org/@tiangolo). * Розкажіть мені, як ви використовуєте FastAPI (мені дуже приємно це чути). * Дізнаватися, коли я роблю оголошення або випускаю нові інструменти. - * Також ви можете стежити за @fastapi в X (Twitter) (окремий акаунт). -* Стежити за мною в **LinkedIn**. + * Також ви можете [стежити за @fastapi в X (Twitter)](https://x.com/fastapi) (окремий акаунт). +* [Стежити за мною в **LinkedIn**](https://www.linkedin.com/in/tiangolo/). * Дізнаватися, коли я роблю оголошення або випускаю нові інструменти (хоча X (Twitter) я використовую частіше 🤷‍♂). -* Читати, що я пишу (або стежити за мною) на **Dev.to** або **Medium**. +* Читати, що я пишу (або стежити за мною) на [**Dev.to**](https://dev.to/tiangolo) або [**Medium**](https://medium.com/@tiangolo). * Читати інші ідеї, статті та про інструменти, які я створив. * Стежити, щоб читати нове, коли я щось публікую. ## Твітніть про **FastAPI** { #tweet-about-fastapi } -Твітніть про **FastAPI** і дайте мені та іншим знати, чому він вам подобається. 🎉 +[Твітніть про **FastAPI**](https://x.com/compose/tweet?text=I'm loving @fastapi because... https://github.com/fastapi/fastapi) і дайте мені та іншим знати, чому він вам подобається. 🎉 Мені дуже подобається дізнаватися, як використовують **FastAPI**, що вам у ньому сподобалося, у якому проєкті/компанії ви його застосовуєте тощо. ## Голосуйте за FastAPI { #vote-for-fastapi } -* Проголосуйте за **FastAPI** на Slant. -* Проголосуйте за **FastAPI** на AlternativeTo. -* Повідомте, що ви використовуєте **FastAPI**, на StackShare. +* [Проголосуйте за **FastAPI** на Slant](https://www.slant.co/options/34241/~fastapi-review). +* [Проголосуйте за **FastAPI** на AlternativeTo](https://alternativeto.net/software/fastapi/about/). +* [Повідомте, що ви використовуєте **FastAPI**, на StackShare](https://stackshare.io/pypi-fastapi). ## Допомагайте іншим з питаннями на GitHub { #help-others-with-questions-in-github } Ви можете спробувати допомагати іншим з їхніми питаннями у: -* GitHub Discussions -* GitHub Issues +* [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered) +* [GitHub Issues](https://github.com/fastapi/fastapi/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Aquestion+-label%3Aanswered+) У багатьох випадках ви вже можете знати відповідь на ці питання. 🤓 -Якщо ви багато допомагаєте людям із їхніми питаннями, ви станете офіційним [Експертом FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank}. 🎉 +Якщо ви багато допомагаєте людям із їхніми питаннями, ви станете офіційним [Експертом FastAPI](fastapi-people.md#fastapi-experts). 🎉 Пам'ятайте, найважливіше: намагайтеся бути добрими. Люди приходять зі своєю фрустрацією і часто питають не найкращим чином, але постарайтеся бути якомога доброзичливішими. 🤗 @@ -104,7 +104,7 @@ Часто вони наводять лише фрагмент коду, але цього недостатньо, щоб **відтворити проблему**. -* Ви можете попросити надати мінімальний, відтворюваний приклад, який ви зможете **скопіювати-вставити** і запустити локально, щоб побачити ту саму помилку або поведінку, яку бачать вони, або краще зрозуміти їхній варіант використання. +* Ви можете попросити надати [мінімальний, відтворюваний приклад](https://stackoverflow.com/help/minimal-reproducible-example), який ви зможете **скопіювати-вставити** і запустити локально, щоб побачити ту саму помилку або поведінку, яку бачать вони, або краще зрозуміти їхній варіант використання. * Якщо ви дуже щедрі, можете спробувати **створити такий приклад** самостійно, лише на основі опису проблеми. Просто майте на увазі, що це може зайняти багато часу, і краще спочатку попросити їх уточнити проблему. @@ -125,7 +125,7 @@ ## Стежте за репозиторієм GitHub { #watch-the-github-repository } -Ви можете «спостерігати» за FastAPI на GitHub (натиснувши кнопку «watch» у верхньому правому куті): https://github.com/fastapi/fastapi. 👀 +Ви можете «спостерігати» за FastAPI на GitHub (натиснувши кнопку «watch» у верхньому правому куті): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). 👀 Якщо вибрати «Watching» замість «Releases only», ви отримуватимете сповіщення, коли хтось створює нове issue або питання. Ви також можете вказати, що хочете отримувати сповіщення лише про нові issues, або discussions, або PR тощо. @@ -133,7 +133,7 @@ ## Ставте питання { #ask-questions } -Ви можете створити нове питання у репозиторії GitHub, наприклад, щоб: +Ви можете [створити нове питання](https://github.com/fastapi/fastapi/discussions/new?category=questions) у репозиторії GitHub, наприклад, щоб: * Поставити **питання** або запитати про **проблему**. * Запропонувати нову **можливість**. @@ -170,7 +170,7 @@ * Потім залиште **коментар**, що ви це зробили, так я знатиму, що ви справді перевірили. -/// info | Інформація +/// info На жаль, я не можу просто довіряти PR, які мають кілька схвалень. @@ -196,12 +196,12 @@ ## Створіть запит на витяг { #create-a-pull-request } -Ви можете [зробити внесок](contributing.md){.internal-link target=_blank} у вихідний код із запитами на витяг, наприклад: +Ви можете [зробити внесок](contributing.md) у вихідний код із запитами на витяг, наприклад: * Щоб виправити описку, знайдену в документації. -* Щоб поділитися статтею, відео або подкастом про FastAPI, який ви створили або знайшли, відредагувавши цей файл. +* Щоб поділитися статтею, відео або подкастом про FastAPI, який ви створили або знайшли, [відредагувавши цей файл](https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml). * Обов'язково додайте ваше посилання на початок відповідного розділу. -* Щоб допомогти [перекласти документацію](contributing.md#translations){.internal-link target=_blank} вашою мовою. +* Щоб допомогти [перекласти документацію](contributing.md#translations) вашою мовою. * Ви також можете допомогти з переглядом перекладів, створених іншими. * Щоб запропонувати нові розділи документації. * Щоб виправити наявну проблему/помилку. @@ -218,8 +218,8 @@ Основні завдання, які ви можете виконувати вже зараз: -* [Допомагайте іншим з питаннями на GitHub](#help-others-with-questions-in-github){.internal-link target=_blank} (див. розділ вище). -* [Переглядайте запити на витяг](#review-pull-requests){.internal-link target=_blank} (див. розділ вище). +* [Допомагайте іншим з питаннями на GitHub](#help-others-with-questions-in-github) (див. розділ вище). +* [Переглядайте запити на витяг](#review-pull-requests) (див. розділ вище). Ці два завдання **найбільше споживають час**. Це основна робота з підтримки FastAPI. @@ -227,11 +227,11 @@ ## Долучайтеся до чату { #join-the-chat } -Долучайтеся до 👥 серверу чату Discord 👥 і спілкуйтеся з іншими в спільноті FastAPI. +Долучайтеся до 👥 [серверу чату Discord](https://discord.gg/VQjSZaeJmf) 👥 і спілкуйтеся з іншими в спільноті FastAPI. -/// tip | Порада +/// tip -Для запитань ставте їх у GitHub Discussions, там значно вища ймовірність, що вам допоможуть [Експерти FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank}. +Для запитань ставте їх у [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/new?category=questions), там значно вища ймовірність, що вам допоможуть [Експерти FastAPI](fastapi-people.md#fastapi-experts). Використовуйте чат лише для інших загальних розмов. @@ -243,13 +243,13 @@ У GitHub шаблон підкаже вам, як написати правильне питання, щоб ви легше отримали хорошу відповідь, або навіть вирішили проблему самостійно ще до запиту. І в GitHub я можу гарантувати, що завжди на все відповім, навіть якщо це займе трохи часу. Особисто я не можу робити це в чатах. 😅 -Розмови в чатах також не так просто шукати, як у GitHub, тож питання та відповіді можуть загубитися. І лише ті, що в GitHub, зараховуються, щоб стати [Експертом FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank}, тож швидше за все ви отримаєте більше уваги саме в GitHub. +Розмови в чатах також не так просто шукати, як у GitHub, тож питання та відповіді можуть загубитися. І лише ті, що в GitHub, зараховуються, щоб стати [Експертом FastAPI](fastapi-people.md#fastapi-experts), тож швидше за все ви отримаєте більше уваги саме в GitHub. З іншого боку, у чатах є тисячі користувачів, тож дуже ймовірно, що ви майже завжди знайдете там співрозмовника. 😄 ## Спонсоруйте автора { #sponsor-the-author } -Якщо ваш **продукт/компанія** залежить від **FastAPI** або пов'язана з ним і ви хочете охопити його користувачів, ви можете спонсорувати автора (мене) через GitHub sponsors. Залежно від рівня ви можете отримати додаткові переваги, наприклад значок у документації. 🎁 +Якщо ваш **продукт/компанія** залежить від **FastAPI** або пов'язана з ним і ви хочете охопити його користувачів, ви можете спонсорувати автора (мене) через [GitHub sponsors](https://github.com/sponsors/tiangolo). Залежно від рівня ви можете отримати додаткові переваги, наприклад значок у документації. 🎁 --- diff --git a/docs/uk/docs/history-design-future.md b/docs/uk/docs/history-design-future.md index 1897807c84..621885904a 100644 --- a/docs/uk/docs/history-design-future.md +++ b/docs/uk/docs/history-design-future.md @@ -1,6 +1,6 @@ # Історія, проєктування і майбутнє { #history-design-and-future } -Деякий час тому користувач **FastAPI** запитав: +Деякий час тому [користувач **FastAPI** запитав](https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920): > Яка історія цього проєкту? Здається, він нізвідки за кілька тижнів став чудовим [...] @@ -14,7 +14,7 @@ Історія **FastAPI** значною мірою - це історія його попередників. -Як сказано в розділі [Альтернативи](alternatives.md){.internal-link target=_blank}: +Як сказано в розділі [Альтернативи](alternatives.md):
@@ -44,7 +44,7 @@ Я протестував кілька ідей у найпопулярніших Python-редакторах: PyCharm, VS Code, редакторах на основі Jedi. -За даними Python Developer Survey, це охоплює близько 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** через його переваги. +Після перевірки кількох альтернатив я вирішив використовувати [**Pydantic**](https://docs.pydantic.dev/) через його переваги. Потім я зробив внески до нього, щоб зробити його повністю сумісним із Схемою JSON, додати підтримку різних способів оголошення обмежень і поліпшити підтримку редакторів (перевірки типів, автодоповнення) на основі тестів у кількох редакторах. -Під час розробки я також зробив внески до **Starlette**, іншої ключової залежності. +Під час розробки я також зробив внески до [**Starlette**](https://www.starlette.dev/), іншої ключової залежності. ## Розробка { #development } @@ -76,4 +76,4 @@ **FastAPI** має велике майбутнє. -І [ваша допомога](help-fastapi.md){.internal-link target=_blank} дуже цінується. +І [ваша допомога](help-fastapi.md) дуже цінується. diff --git a/docs/uk/docs/how-to/authentication-error-status-code.md b/docs/uk/docs/how-to/authentication-error-status-code.md index 58016f261b..d670713711 100644 --- a/docs/uk/docs/how-to/authentication-error-status-code.md +++ b/docs/uk/docs/how-to/authentication-error-status-code.md @@ -2,7 +2,7 @@ До версії FastAPI `0.122.0`, коли інтегровані засоби безпеки повертали клієнту помилку після невдалої автентифікації, вони використовували HTTP код статусу `403 Forbidden`. -Починаючи з версії FastAPI `0.122.0`, вони використовують більш доречний HTTP код статусу `401 Unauthorized` і повертають змістовний заголовок `WWW-Authenticate` у відповіді, відповідно до специфікацій HTTP, RFC 7235, RFC 9110. +Починаючи з версії FastAPI `0.122.0`, вони використовують більш доречний HTTP код статусу `401 Unauthorized` і повертають змістовний заголовок `WWW-Authenticate` у відповіді, відповідно до специфікацій HTTP, [RFC 7235](https://datatracker.ietf.org/doc/html/rfc7235#section-3.1), [RFC 9110](https://datatracker.ietf.org/doc/html/rfc9110#name-401-unauthorized). Але якщо з якоїсь причини ваші клієнти залежать від старої поведінки, ви можете повернутися до неї, переписавши метод `make_not_authenticated_error` у ваших класах безпеки. diff --git a/docs/uk/docs/how-to/conditional-openapi.md b/docs/uk/docs/how-to/conditional-openapi.md index f8bbaa6498..80c22eeb5d 100644 --- a/docs/uk/docs/how-to/conditional-openapi.md +++ b/docs/uk/docs/how-to/conditional-openapi.md @@ -4,13 +4,13 @@ ## Про безпеку, API та документацію { #about-security-apis-and-docs } -Приховування інтерфейсів документації у продукційному середовищі *не має* бути способом захисту вашого API. +Приховування інтерфейсів документації у продукційному середовищі не має бути способом захисту вашого API. -Це не додає жодної додаткової безпеки вашому API, *операції шляху* й надалі будуть доступні там, де вони є. +Це не додає жодної додаткової безпеки вашому API, операції шляху й надалі будуть доступні там, де вони є. Якщо у вашому коді є вразливість, вона залишиться. -Приховування документації лише ускладнює розуміння того, як взаємодіяти з вашим API, і може ускладнити для вас його налагодження у продакшні. Це можна вважати просто формою Безпека через неясність. +Приховування документації лише ускладнює розуміння того, як взаємодіяти з вашим API, і може ускладнити для вас його налагодження у продакшні. Це можна вважати просто формою [Безпека через неясність](https://en.wikipedia.org/wiki/Security_through_obscurity). Якщо ви хочете захистити ваш API, є кілька кращих дій, які ви можете зробити, наприклад: diff --git a/docs/uk/docs/how-to/configure-swagger-ui.md b/docs/uk/docs/how-to/configure-swagger-ui.md index f8c4470dfa..5fe47d12e6 100644 --- a/docs/uk/docs/how-to/configure-swagger-ui.md +++ b/docs/uk/docs/how-to/configure-swagger-ui.md @@ -1,6 +1,6 @@ # Налаштуйте Swagger UI { #configure-swagger-ui } -Ви можете налаштувати додаткові параметри Swagger UI. +Ви можете налаштувати додаткові [параметри Swagger UI](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/). Щоб їх налаштувати, передайте аргумент `swagger_ui_parameters` під час створення об’єкта додатка `FastAPI()` або до функції `get_swagger_ui_html()`. @@ -50,7 +50,7 @@ FastAPI містить деякі параметри конфігурації з ## Інші параметри Swagger UI { #other-swagger-ui-parameters } -Щоб побачити всі можливі налаштування, які ви можете використовувати, прочитайте офіційну документацію щодо параметрів Swagger UI. +Щоб побачити всі можливі налаштування, які ви можете використовувати, прочитайте офіційну [документацію щодо параметрів Swagger UI](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/). ## Налаштування лише для JavaScript { #javascript-only-settings } diff --git a/docs/uk/docs/how-to/custom-docs-ui-assets.md b/docs/uk/docs/how-to/custom-docs-ui-assets.md index faea3ccc4a..f8a4f99662 100644 --- a/docs/uk/docs/how-to/custom-docs-ui-assets.md +++ b/docs/uk/docs/how-to/custom-docs-ui-assets.md @@ -54,7 +54,7 @@ Swagger UI впорається з цим «за лаштунками», але ### Перевірте { #test-it } -Тепер ви маєте змогу відкрити документацію за http://127.0.0.1:8000/docs і перезавантажити сторінку, вона завантажить ці ресурси з нового CDN. +Тепер ви маєте змогу відкрити документацію за [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) і перезавантажити сторінку, вона завантажить ці ресурси з нового CDN. ## Самохостинг JavaScript і CSS для документації { #self-hosting-javascript-and-css-for-docs } @@ -93,12 +93,12 @@ Swagger UI впорається з цим «за лаштунками», але **Swagger UI** використовує файли: -- `swagger-ui-bundle.js` -- `swagger-ui.css` +- [`swagger-ui-bundle.js`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js) +- [`swagger-ui.css`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css) А **ReDoc** використовує файл: -- `redoc.standalone.js` +- [`redoc.standalone.js`](https://cdn.jsdelivr.net/npm/redoc@2/bundles/redoc.standalone.js) Після цього ваша структура файлів може виглядати так: @@ -122,7 +122,7 @@ Swagger UI впорається з цим «за лаштунками», але ### Перевірте статичні файли { #test-the-static-files } -Запустіть ваш застосунок і перейдіть до http://127.0.0.1:8000/static/redoc.standalone.js. +Запустіть ваш застосунок і перейдіть до [http://127.0.0.1:8000/static/redoc.standalone.js](http://127.0.0.1:8000/static/redoc.standalone.js). Ви маєте побачити дуже довгий файл JavaScript для **ReDoc**. @@ -180,6 +180,6 @@ Swagger UI впорається з цим «за лаштунками», але ### Перевірте UI зі статичними файлами { #test-static-files-ui } -Тепер ви маєте змогу вимкнути WiFi, відкрити документацію за http://127.0.0.1:8000/docs і перезавантажити сторінку. +Тепер ви маєте змогу вимкнути WiFi, відкрити документацію за [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) і перезавантажити сторінку. І навіть без Інтернету ви зможете побачити документацію для вашого API і взаємодіяти з ним. diff --git a/docs/uk/docs/how-to/custom-request-and-route.md b/docs/uk/docs/how-to/custom-request-and-route.md index 9f21da7a86..6a46b57239 100644 --- a/docs/uk/docs/how-to/custom-request-and-route.md +++ b/docs/uk/docs/how-to/custom-request-and-route.md @@ -18,7 +18,7 @@ Деякі варіанти використання: -- Перетворення не-JSON тіл запитів на JSON (наприклад, `msgpack`). +- Перетворення не-JSON тіл запитів на JSON (наприклад, [`msgpack`](https://msgpack.org/index.html)). - Розпакування тіл запитів, стиснених gzip. - Автоматичне логування всіх тіл запитів. @@ -32,7 +32,7 @@ /// tip | Порада -Це навчальний приклад, щоб продемонструвати принцип роботи. Якщо вам потрібна підтримка Gzip, скористайтеся вбудованим [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware){.internal-link target=_blank}. +Це навчальний приклад, щоб продемонструвати принцип роботи. Якщо вам потрібна підтримка Gzip, скористайтеся вбудованим [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware). /// @@ -66,7 +66,7 @@ І саме ці дві сутності - `scope` та `receive` - потрібні для створення нового екземпляра `Request`. -Щоб дізнатися більше про `Request`, перегляньте документацію Starlette про запити. +Щоб дізнатися більше про `Request`, перегляньте [документацію Starlette про запити](https://www.starlette.dev/requests/). /// @@ -82,7 +82,7 @@ /// tip | Порада -Щоб розв’язати це саме завдання, скоріш за все, простіше використати `body` у користувацькому обробнику `RequestValidationError` ([Обробка помилок](../tutorial/handling-errors.md#use-the-requestvalidationerror-body){.internal-link target=_blank}). +Щоб розв’язати це саме завдання, скоріш за все, простіше використати `body` у користувацькому обробнику `RequestValidationError` ([Обробка помилок](../tutorial/handling-errors.md#use-the-requestvalidationerror-body)). Але цей приклад усе ще корисний і показує, як взаємодіяти з внутрішніми компонентами. diff --git a/docs/uk/docs/how-to/extending-openapi.md b/docs/uk/docs/how-to/extending-openapi.md index 1597cbc762..fcd0982a9d 100644 --- a/docs/uk/docs/how-to/extending-openapi.md +++ b/docs/uk/docs/how-to/extending-openapi.md @@ -37,7 +37,7 @@ Використовуючи наведене вище, ви можете скористатися тією ж утилітарною функцією для генерації схеми OpenAPI і переписати потрібні частини. -Наприклад, додаймо розширення OpenAPI для ReDoc для додавання власного логотипа. +Наприклад, додаймо [розширення OpenAPI ReDoc для додавання власного логотипа](https://github.com/Rebilly/ReDoc/blob/master/docs/redoc-vendor-extensions.md#x-logo). ### Звичайний **FastAPI** { #normal-fastapi } @@ -75,6 +75,6 @@ ### Перевірте { #check-it } -Коли ви перейдете за адресою http://127.0.0.1:8000/redoc, побачите, що використовується ваш власний логотип (у цьому прикладі логотип **FastAPI**): +Коли ви перейдете за адресою [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc), побачите, що використовується ваш власний логотип (у цьому прикладі логотип **FastAPI**): diff --git a/docs/uk/docs/how-to/general.md b/docs/uk/docs/how-to/general.md index f33ae195c6..75761dff53 100644 --- a/docs/uk/docs/how-to/general.md +++ b/docs/uk/docs/how-to/general.md @@ -4,36 +4,40 @@ ## Фільтрування даних - Безпека { #filter-data-security } -Щоб гарантувати, що ви не повертаєте більше даних, ніж слід, прочитайте документацію [Навчальний посібник - Модель відповіді - Тип повернення](../tutorial/response-model.md){.internal-link target=_blank}. +Щоб гарантувати, що ви не повертаєте більше даних, ніж слід, прочитайте документацію [Навчальний посібник - Модель відповіді - Тип повернення](../tutorial/response-model.md). + +## Оптимізувати продуктивність відповіді - Модель відповіді - Тип повернення { #optimize-response-performance-response-model-return-type } + +Щоб оптимізувати продуктивність під час повернення даних JSON, використовуйте тип повернення або модель відповіді, таким чином Pydantic виконуватиме серіалізацію в JSON на боці Rust, без проходження через Python. Докладніше читайте в документації [Навчальний посібник - Модель відповіді - Тип повернення](../tutorial/response-model.md). ## Мітки документації - OpenAPI { #documentation-tags-openapi } -Щоб додати мітки до ваших *операцій шляху* та згрупувати їх в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Мітки](../tutorial/path-operation-configuration.md#tags){.internal-link target=_blank}. +Щоб додати мітки до ваших *операцій шляху* та згрупувати їх в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Мітки](../tutorial/path-operation-configuration.md#tags). ## Короткий опис і опис - OpenAPI { #documentation-summary-and-description-openapi } -Щоб додати короткий опис і опис до ваших *операцій шляху* і показати їх в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Короткий опис і опис](../tutorial/path-operation-configuration.md#summary-and-description){.internal-link target=_blank}. +Щоб додати короткий опис і опис до ваших *операцій шляху* і показати їх в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Короткий опис і опис](../tutorial/path-operation-configuration.md#summary-and-description). ## Опис відповіді в документації - OpenAPI { #documentation-response-description-openapi } -Щоб визначити опис відповіді, що відображається в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Опис відповіді](../tutorial/path-operation-configuration.md#response-description){.internal-link target=_blank}. +Щоб визначити опис відповіді, що відображається в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Опис відповіді](../tutorial/path-operation-configuration.md#response-description). ## Позначити застарілою *операцію шляху* - OpenAPI { #documentation-deprecate-a-path-operation-openapi } -Щоб позначити *операцію шляху* як застарілу і показати це в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Позначення як застаріле](../tutorial/path-operation-configuration.md#deprecate-a-path-operation){.internal-link target=_blank}. +Щоб позначити *операцію шляху* як застарілу і показати це в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Позначення як застаріле](../tutorial/path-operation-configuration.md#deprecate-a-path-operation). ## Перетворити будь-які дані на сумісні з JSON { #convert-any-data-to-json-compatible } -Щоб перетворити будь-які дані на сумісні з JSON, прочитайте документацію [Навчальний посібник - Кодувальник, сумісний з JSON](../tutorial/encoder.md){.internal-link target=_blank}. +Щоб перетворити будь-які дані на сумісні з JSON, прочитайте документацію [Навчальний посібник - Кодувальник, сумісний з JSON](../tutorial/encoder.md). ## Метадані OpenAPI - Документація { #openapi-metadata-docs } -Щоб додати метадані до вашої схеми OpenAPI, зокрема ліцензію, версію, контактні дані тощо, прочитайте документацію [Навчальний посібник - Метадані та URL документації](../tutorial/metadata.md){.internal-link target=_blank}. +Щоб додати метадані до вашої схеми OpenAPI, зокрема ліцензію, версію, контактні дані тощо, прочитайте документацію [Навчальний посібник - Метадані та URL документації](../tutorial/metadata.md). ## Власний URL OpenAPI { #openapi-custom-url } -Щоб налаштувати URL OpenAPI (або прибрати його), прочитайте документацію [Навчальний посібник - Метадані та URL документації](../tutorial/metadata.md#openapi-url){.internal-link target=_blank}. +Щоб налаштувати URL OpenAPI (або прибрати його), прочитайте документацію [Навчальний посібник - Метадані та URL документації](../tutorial/metadata.md#openapi-url). ## URL документації OpenAPI { #openapi-docs-urls } -Щоб оновити URL, які використовуються для автоматично згенерованих інтерфейсів користувача документації, прочитайте документацію [Навчальний посібник - Метадані та URL документації](../tutorial/metadata.md#docs-urls){.internal-link target=_blank}. +Щоб оновити URL, які використовуються для автоматично згенерованих інтерфейсів користувача документації, прочитайте документацію [Навчальний посібник - Метадані та URL документації](../tutorial/metadata.md#docs-urls). diff --git a/docs/uk/docs/how-to/graphql.md b/docs/uk/docs/how-to/graphql.md index 2d0e355ea4..c070c7e0cd 100644 --- a/docs/uk/docs/how-to/graphql.md +++ b/docs/uk/docs/how-to/graphql.md @@ -18,18 +18,18 @@ GraphQL розв’язує деякі дуже специфічні сцена Ось деякі бібліотеки GraphQL з підтримкою ASGI. Ви можете використовувати їх із FastAPI: -* Strawberry 🍓 - * З документацією для FastAPI -* Ariadne - * З документацією для FastAPI -* Tartiflette - * З Tartiflette ASGI для інтеграції з ASGI -* Graphene - * З starlette-graphene3 +* [Strawberry](https://strawberry.rocks/) 🍓 + * З [документацією для FastAPI](https://strawberry.rocks/docs/integrations/fastapi) +* [Ariadne](https://ariadnegraphql.org/) + * З [документацією для FastAPI](https://ariadnegraphql.org/docs/fastapi-integration) +* [Tartiflette](https://tartiflette.io/) + * З [Tartiflette ASGI](https://tartiflette.github.io/tartiflette-asgi/) для інтеграції з ASGI +* [Graphene](https://graphene-python.org/) + * З [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3) ## GraphQL зі Strawberry { #graphql-with-strawberry } -Якщо вам потрібен або ви хочете використовувати GraphQL, Strawberry - рекомендована бібліотека, адже її дизайн найближчий до дизайну FastAPI; усе базується на анотаціях типів. +Якщо вам потрібен або ви хочете використовувати GraphQL, [Strawberry](https://strawberry.rocks/) - рекомендована бібліотека, адже її дизайн найближчий до дизайну FastAPI; усе базується на анотаціях типів. Залежно від вашого сценарію використання ви можете надати перевагу іншій бібліотеці, але якби ви запитали мене, я, ймовірно, порадив би спробувати Strawberry. @@ -37,24 +37,24 @@ GraphQL розв’язує деякі дуже специфічні сцена {* ../../docs_src/graphql_/tutorial001_py310.py hl[3,22,25] *} -Більше про Strawberry ви можете дізнатися в документації Strawberry. +Більше про Strawberry ви можете дізнатися в [документації Strawberry](https://strawberry.rocks/). -І також документацію про Strawberry з FastAPI. +І також [документацію про Strawberry з FastAPI](https://strawberry.rocks/docs/integrations/fastapi). ## Застарілий `GraphQLApp` зі Starlette { #older-graphqlapp-from-starlette } -Попередні версії Starlette містили клас `GraphQLApp` для інтеграції з Graphene. +Попередні версії Starlette містили клас `GraphQLApp` для інтеграції з [Graphene](https://graphene-python.org/). -Його вилучено з Starlette як застарілий, але якщо у вас є код, що його використовував, ви можете легко мігрувати на starlette-graphene3, який покриває той самий сценарій використання та має майже ідентичний інтерфейс. +Його вилучено з Starlette як застарілий, але якщо у вас є код, що його використовував, ви можете легко мігрувати на [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3), який покриває той самий сценарій використання та має майже ідентичний інтерфейс. /// tip | Порада -Якщо вам потрібен GraphQL, я все ж рекомендую звернути увагу на Strawberry, адже він базується на анотаціях типів, а не на власних класах і типах. +Якщо вам потрібен GraphQL, я все ж рекомендую звернути увагу на [Strawberry](https://strawberry.rocks/), адже він базується на анотаціях типів, а не на власних класах і типах. /// ## Дізнайтеся більше { #learn-more } -Ви можете дізнатися більше про GraphQL в офіційній документації GraphQL. +Ви можете дізнатися більше про GraphQL в [офіційній документації GraphQL](https://graphql.org/). Також ви можете почитати більше про кожну з цих бібліотек за наведеними посиланнями. diff --git a/docs/uk/docs/how-to/index.md b/docs/uk/docs/how-to/index.md index ac2dd16eb9..db72181a35 100644 --- a/docs/uk/docs/how-to/index.md +++ b/docs/uk/docs/how-to/index.md @@ -8,6 +8,6 @@ /// tip | Порада -Якщо ви хочете **вивчити FastAPI** у структурований спосіб (рекомендується), натомість прочитайте [Навчальний посібник - Посібник користувача](../tutorial/index.md){.internal-link target=_blank} розділ за розділом. +Якщо ви хочете **вивчити FastAPI** у структурований спосіб (рекомендується), натомість прочитайте [Навчальний посібник - Посібник користувача](../tutorial/index.md) розділ за розділом. /// diff --git a/docs/uk/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md b/docs/uk/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md index 0f5d1c924e..c5519b98d8 100644 --- a/docs/uk/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md +++ b/docs/uk/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md @@ -22,7 +22,7 @@ FastAPI 0.126.0 припинив підтримку Pydantic v1, водноча ## Офіційний посібник { #official-guide } -У Pydantic є офіційний Посібник з міграції з v1 на v2. +У Pydantic є офіційний [Посібник з міграції](https://docs.pydantic.dev/latest/migration/) з v1 на v2. Там описано, що змінилося, як перевірки тепер стали коректнішими та суворішими, можливі застереження тощо. @@ -30,7 +30,7 @@ FastAPI 0.126.0 припинив підтримку Pydantic v1, водноча ## Тести { #tests } -Переконайтеся, що у вашій програмі є [тести](../tutorial/testing.md){.internal-link target=_blank} і що ви запускаєте їх у системі безперервної інтеграції (CI). +Переконайтеся, що у вашій програмі є [тести](../tutorial/testing.md) і що ви запускаєте їх у системі безперервної інтеграції (CI). Так ви зможете виконати оновлення і впевнитися, що все працює як очікується. @@ -38,7 +38,7 @@ FastAPI 0.126.0 припинив підтримку Pydantic v1, водноча У багатьох випадках, якщо ви використовуєте звичайні моделі Pydantic без налаштувань, більшу частину процесу міграції з Pydantic v1 на Pydantic v2 можна автоматизувати. -Ви можете скористатися `bump-pydantic` від тієї ж команди Pydantic. +Ви можете скористатися [`bump-pydantic`](https://github.com/pydantic/bump-pydantic) від тієї ж команди Pydantic. Цей інструмент допоможе автоматично змінити більшість коду, який потрібно змінити. diff --git a/docs/uk/docs/how-to/testing-database.md b/docs/uk/docs/how-to/testing-database.md index 2e6b21ced0..0f12b9d529 100644 --- a/docs/uk/docs/how-to/testing-database.md +++ b/docs/uk/docs/how-to/testing-database.md @@ -1,7 +1,7 @@ # Тестування бази даних { #testing-a-database } -Ви можете ознайомитися з базами даних, SQL і SQLModel у документації SQLModel. 🤓 +Ви можете ознайомитися з базами даних, SQL і SQLModel у [документації SQLModel](https://sqlmodel.tiangolo.com/). 🤓 -Є невеликий навчальний посібник про використання SQLModel з FastAPI. ✨ +Є невеликий [навчальний посібник про використання SQLModel з FastAPI](https://sqlmodel.tiangolo.com/tutorial/fastapi/). ✨ -Цей навчальний посібник містить розділ про тестування баз даних SQL. 😎 +Цей навчальний посібник містить розділ про [тестування баз даних SQL](https://sqlmodel.tiangolo.com/tutorial/fastapi/tests/). 😎 diff --git a/docs/uk/docs/index.md b/docs/uk/docs/index.md index 0a6788502a..06bf865d92 100644 --- a/docs/uk/docs/index.md +++ b/docs/uk/docs/index.md @@ -11,25 +11,25 @@ Фреймворк FastAPI - це висока продуктивність, легко вивчати, швидко писати код, готовий до продакшину

- + Test - + Coverage - + Package version - + Supported Python versions

--- -**Документація**: https://fastapi.tiangolo.com +**Документація**: [https://fastapi.tiangolo.com](https://fastapi.tiangolo.com/uk) -**Вихідний код**: https://github.com/fastapi/fastapi +**Вихідний код**: [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi) --- @@ -44,7 +44,7 @@ FastAPI - це сучасний, швидкий (високопродуктив * **Простий**: спроєктований так, щоб бути простим у використанні та вивченні. Менше часу на читання документації. * **Короткий**: мінімізує дублювання коду. Кілька можливостей з кожного оголошення параметра. Менше помилок. * **Надійний**: ви отримуєте код, готовий до продакшину. З автоматичною інтерактивною документацією. -* **Заснований на стандартах**: базується на (і повністю сумісний з) відкритими стандартами для API: OpenAPI (раніше відомий як Swagger) та JSON Schema. +* **Заснований на стандартах**: базується на (і повністю сумісний з) відкритими стандартами для API: [OpenAPI](https://github.com/OAI/OpenAPI-Specification) (раніше відомий як Swagger) та [JSON Schema](https://json-schema.org/). * оцінка на основі тестів, проведених внутрішньою командою розробників, що створює продакшн-застосунки. @@ -55,51 +55,51 @@ FastAPI - це сучасний, швидкий (високопродуктив ### Ключовий спонсор { #keystone-sponsor } {% for sponsor in sponsors.keystone -%} - + {% endfor -%} ### Золоті та срібні спонсори { #gold-and-silver-sponsors } {% for sponsor in sponsors.gold -%} - + {% endfor -%} {%- for sponsor in sponsors.silver -%} - + {% endfor %} -Інші спонсори +[Інші спонсори](https://fastapi.tiangolo.com/uk/fastapi-people/#sponsors) ## Враження { #opinions } "_[...] I'm using **FastAPI** a ton these days. [...] I'm actually planning to use it for all of my team's **ML services at Microsoft**. Some of them are getting integrated into the core **Windows** product and some **Office** products._" -
Kabir Khan - Microsoft (ref)
+
Kabir Khan - Microsoft (ref)
--- "_We adopted the **FastAPI** library to spawn a **REST** server that can be queried to obtain **predictions**. [for Ludwig]_" -
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)
+
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)
--- "_**Netflix** is pleased to announce the open-source release of our **crisis management** orchestration framework: **Dispatch**! [built with **FastAPI**]_" -
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
+
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
--- "_I’m over the moon excited about **FastAPI**. It’s so fun!_" -
Brian Okken - Python Bytes podcast host (ref)
+
Brian Okken - [Python Bytes](https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855) podcast host (ref)
--- "_Honestly, what you've built looks super solid and polished. In many ways, it's what I wanted **Hug** to be - it's really inspiring to see someone build that._" -
Timothy Crosley - Hug creator (ref)
+
Timothy Crosley - [Hug](https://github.com/hugapi/hug) creator (ref)
--- @@ -107,27 +107,27 @@ FastAPI - це сучасний, швидкий (високопродуктив "_We've switched over to **FastAPI** for our **APIs** [...] I think you'll like it [...]_" -
Ines Montani - Matthew Honnibal - Explosion AI founders - spaCy creators (ref) - (ref)
+
Ines Montani - Matthew Honnibal - [Explosion AI](https://explosion.ai) founders - [spaCy](https://spacy.io) creators (ref) - (ref)
--- "_If anyone is looking to build a production Python API, I would highly recommend **FastAPI**. It is **beautifully designed**, **simple to use** and **highly scalable**, it has become a **key component** in our API first development strategy and is driving many automations and services such as our Virtual TAC Engineer._" -
Deon Pillsbury - Cisco (ref)
+
Deon Pillsbury - Cisco (ref)
--- ## Міні-документальний фільм про FastAPI { #fastapi-mini-documentary } -Наприкінці 2025 року вийшов міні-документальний фільм про FastAPI, ви можете переглянути його онлайн: +Наприкінці 2025 року вийшов [міні-документальний фільм про FastAPI](https://www.youtube.com/watch?v=mpR8ngthqiE), ви можете переглянути його онлайн: -FastAPI Mini Documentary +FastAPI Mini Documentary ## **Typer**, FastAPI для CLI { #typer-the-fastapi-of-clis } - + -Якщо ви створюєте застосунок CLI для використання в терміналі замість веб-API, зверніть увагу на **Typer**. +Якщо ви створюєте застосунок CLI для використання в терміналі замість веб-API, зверніть увагу на [**Typer**](https://typer.tiangolo.com/). **Typer** - молодший брат FastAPI. І його задумано як **FastAPI для CLI**. ⌨️ 🚀 @@ -135,12 +135,12 @@ FastAPI - це сучасний, швидкий (високопродуктив FastAPI стоїть на плечах гігантів: -* Starlette для вебчастини. -* Pydantic для частини даних. +* [Starlette](https://www.starlette.dev/) для вебчастини. +* [Pydantic](https://docs.pydantic.dev/) для частини даних. ## Встановлення { #installation } -Створіть і активуйте віртуальне середовище, а потім встановіть FastAPI: +Створіть і активуйте [віртуальне середовище](https://fastapi.tiangolo.com/uk/virtual-environments/), а потім встановіть FastAPI:
@@ -199,7 +199,7 @@ async def read_item(item_id: int, q: str | None = None): **Примітка**: -Якщо ви не знаєте, перегляньте розділ _"In a hurry?"_ про `async` та `await` у документації. +Якщо ви не знаєте, перегляньте розділ _"In a hurry?"_ про [`async` та `await` у документації](https://fastapi.tiangolo.com/uk/async/#in-a-hurry). @@ -210,7 +210,7 @@ async def read_item(item_id: int, q: str | None = None):
```console -$ fastapi dev main.py +$ fastapi dev ╭────────── FastAPI CLI - Development mode ───────────╮ │ │ @@ -235,19 +235,19 @@ INFO: Application startup complete.
-Про команду fastapi dev main.py... +Про команду fastapi dev... -Команда `fastapi dev` читає ваш файл `main.py`, знаходить у ньому застосунок **FastAPI** і запускає сервер за допомогою Uvicorn. +Команда `fastapi dev` автоматично читає ваш файл `main.py`, знаходить у ньому застосунок **FastAPI** і запускає сервер за допомогою [Uvicorn](https://www.uvicorn.dev). За замовчуванням `fastapi dev` запускається з авто-перезавантаженням для локальної розробки. -Докладніше читайте в документації FastAPI CLI. +Докладніше читайте в [документації FastAPI CLI](https://fastapi.tiangolo.com/uk/fastapi-cli/).
### Перевірте { #check-it } -Відкрийте браузер і перейдіть на http://127.0.0.1:8000/items/5?q=somequery. +Відкрийте браузер і перейдіть на [http://127.0.0.1:8000/items/5?q=somequery](http://127.0.0.1:8000/items/5?q=somequery). Ви побачите JSON-відповідь: @@ -264,17 +264,17 @@ INFO: Application startup complete. ### Інтерактивна документація API { #interactive-api-docs } -Тепер перейдіть на http://127.0.0.1:8000/docs. +Тепер перейдіть на [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). -Ви побачите автоматичну інтерактивну документацію API (надану Swagger UI): +Ви побачите автоматичну інтерактивну документацію API (надану [Swagger UI](https://github.com/swagger-api/swagger-ui)): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### Альтернативна документація API { #alternative-api-docs } -А тепер перейдіть на http://127.0.0.1:8000/redoc. +А тепер перейдіть на [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). -Ви побачите альтернативну автоматичну документацію (надану ReDoc): +Ви побачите альтернативну автоматичну документацію (надану [ReDoc](https://github.com/Rebilly/ReDoc)): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) @@ -316,7 +316,7 @@ def update_item(item_id: int, item: Item): ### Оновлення інтерактивної документації API { #interactive-api-docs-upgrade } -Тепер перейдіть на http://127.0.0.1:8000/docs. +Тепер перейдіть на [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). * Інтерактивна документація API буде автоматично оновлена, включно з новим тілом: @@ -332,7 +332,7 @@ def update_item(item_id: int, item: Item): ### Оновлення альтернативної документації API { #alternative-api-docs-upgrade } -А тепер перейдіть на http://127.0.0.1:8000/redoc. +А тепер перейдіть на [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). * Альтернативна документація також відобразить новий параметр запиту та тіло: @@ -442,7 +442,7 @@ item: Item * Дуже потужну і просту у використанні систему **Впровадження залежностей**. * Безпеку та автентифікацію, включно з підтримкою **OAuth2** з **JWT tokens** та **HTTP Basic** auth. * Досконаліші (але однаково прості) техніки для оголошення **глибоко вкладених моделей JSON** (завдяки Pydantic). -* Інтеграцію **GraphQL** з Strawberry та іншими бібліотеками. +* Інтеграцію **GraphQL** з [Strawberry](https://strawberry.rocks) та іншими бібліотеками. * Багато додаткових можливостей (завдяки Starlette) як-от: * **WebSockets** * надзвичайно прості тести на основі HTTPX та `pytest` @@ -452,24 +452,10 @@ item: Item ### Розгортання застосунку (необовʼязково) { #deploy-your-app-optional } -За бажання ви можете розгорнути ваш застосунок FastAPI у FastAPI Cloud, перейдіть і приєднайтеся до списку очікування, якщо ви ще цього не зробили. 🚀 +За бажання ви можете розгорнути ваш застосунок FastAPI у [FastAPI Cloud](https://fastapicloud.com), перейдіть і приєднайтеся до списку очікування, якщо ви ще цього не зробили. 🚀 Якщо у вас вже є обліковий запис **FastAPI Cloud** (ми запросили вас зі списку очікування 😉), ви можете розгорнути ваш застосунок однією командою. -Перед розгортанням переконайтеся, що ви ввійшли в систему: - -
- -```console -$ fastapi login - -You are logged in to FastAPI Cloud 🚀 -``` - -
- -Потім розгорніть ваш застосунок: -
```console @@ -488,7 +474,7 @@ Deploying to FastAPI Cloud... #### Про FastAPI Cloud { #about-fastapi-cloud } -**FastAPI Cloud** створено тим самим автором і командою, що стоять за **FastAPI**. +**[FastAPI Cloud](https://fastapicloud.com)** створено тим самим автором і командою, що стоять за **FastAPI**. Він спрощує процес **створення**, **розгортання** та **доступу** до API з мінімальними зусиллями. @@ -504,9 +490,9 @@ FastAPI - open source проект і базується на стандарта ## Продуктивність { #performance } -Незалежні тести TechEmpower показують застосунки **FastAPI**, які працюють під керуванням Uvicorn, як одні з найшвидших доступних Python-фреймворків, поступаючись лише Starlette та Uvicorn (які внутрішньо використовуються в FastAPI). (*) +Незалежні тести TechEmpower показують застосунки **FastAPI**, які працюють під керуванням Uvicorn, як [одні з найшвидших доступних Python-фреймворків](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7), поступаючись лише Starlette та Uvicorn (які внутрішньо використовуються в FastAPI). (*) -Щоб дізнатися більше, перегляньте розділ Benchmarks. +Щоб дізнатися більше, перегляньте розділ [Benchmarks](https://fastapi.tiangolo.com/uk/benchmarks/). ## Залежності { #dependencies } @@ -518,19 +504,19 @@ FastAPI залежить від Pydantic і Starlette. Використовується Pydantic: -* email-validator - для валідації електронної пошти. +* [`email-validator`](https://github.com/JoshData/python-email-validator) - для валідації електронної пошти. Використовується Starlette: -* httpx - потрібно, якщо ви хочете використовувати `TestClient`. -* jinja2 - потрібно, якщо ви хочете використовувати конфігурацію шаблонів за замовчуванням. -* python-multipart - потрібно, якщо ви хочете підтримувати форми з «парсингом» через `request.form()`. +* [`httpx`](https://www.python-httpx.org) - потрібно, якщо ви хочете використовувати `TestClient`. +* [`jinja2`](https://jinja.palletsprojects.com) - потрібно, якщо ви хочете використовувати конфігурацію шаблонів за замовчуванням. +* [`python-multipart`](https://github.com/Kludex/python-multipart) - потрібно, якщо ви хочете підтримувати форми з «парсингом» через `request.form()`. Використовується FastAPI: -* uvicorn - для сервера, який завантажує та обслуговує ваш застосунок. Це включає `uvicorn[standard]`, до якого входять деякі залежності (наприклад, `uvloop`), потрібні для високопродуктивної роботи сервера. +* [`uvicorn`](https://www.uvicorn.dev) - для сервера, який завантажує та обслуговує ваш застосунок. Це включає `uvicorn[standard]`, до якого входять деякі залежності (наприклад, `uvloop`), потрібні для високопродуктивної роботи сервера. * `fastapi-cli[standard]` - щоб надати команду `fastapi`. - * Це включає `fastapi-cloud-cli`, який дозволяє розгортати ваш застосунок FastAPI у FastAPI Cloud. + * Це включає `fastapi-cloud-cli`, який дозволяє розгортати ваш застосунок FastAPI у [FastAPI Cloud](https://fastapicloud.com). ### Без залежностей `standard` { #without-standard-dependencies } @@ -546,13 +532,13 @@ FastAPI залежить від Pydantic і Starlette. Додаткові необовʼязкові залежності Pydantic: -* pydantic-settings - для керування налаштуваннями. -* pydantic-extra-types - для додаткових типів, що можуть бути використані з 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. Додаткові необовʼязкові залежності FastAPI: -* orjson - потрібно, якщо ви хочете використовувати `ORJSONResponse`. -* ujson - потрібно, якщо ви хочете використовувати `UJSONResponse`. +* [`orjson`](https://github.com/ijl/orjson) - потрібно, якщо ви хочете використовувати `ORJSONResponse`. +* [`ujson`](https://github.com/esnme/ultrajson) - потрібно, якщо ви хочете використовувати `UJSONResponse`. ## Ліцензія { #license } diff --git a/docs/uk/docs/project-generation.md b/docs/uk/docs/project-generation.md index 4899090d42..6e3781740e 100644 --- a/docs/uk/docs/project-generation.md +++ b/docs/uk/docs/project-generation.md @@ -4,7 +4,7 @@ Ви можете використати цей шаблон для старту, адже в ньому вже виконано значну частину початкового налаштування, безпеки, роботи з базою даних і деяких кінцевих точок API. -Репозиторій GitHub: Шаблон Full Stack FastAPI +Репозиторій GitHub: [Шаблон Full Stack FastAPI](https://github.com/tiangolo/full-stack-fastapi-template) ## Шаблон Full Stack FastAPI - стек технологій і можливості { #full-stack-fastapi-template-technology-stack-and-features } diff --git a/docs/uk/docs/python-types.md b/docs/uk/docs/python-types.md index deeeb2f9c5..274da80cec 100644 --- a/docs/uk/docs/python-types.md +++ b/docs/uk/docs/python-types.md @@ -269,7 +269,7 @@ def some_function(data: Any): ## Pydantic моделі { #pydantic-models } -Pydantic — це бібліотека Python для валідації даних. +[Pydantic](https://docs.pydantic.dev/) — це бібліотека Python для валідації даних. Ви оголошуєте «форму» даних як класи з атрибутами. @@ -285,13 +285,13 @@ def some_function(data: Any): /// info | Інформація -Щоб дізнатись більше про Pydantic, перегляньте його документацію. +Щоб дізнатись більше про [Pydantic, перегляньте його документацію](https://docs.pydantic.dev/). /// **FastAPI** повністю базується на Pydantic. -Ви побачите набагато більше цього всього на практиці в [Навчальний посібник - Посібник користувача](tutorial/index.md){.internal-link target=_blank}. +Ви побачите набагато більше цього всього на практиці в [Навчальний посібник - Посібник користувача](tutorial/index.md). ## Підказки типів з анотаціями метаданих { #type-hints-with-metadata-annotations } @@ -337,12 +337,12 @@ def some_function(data: Any): * **Документування** API за допомогою OpenAPI: * який потім використовується для автоматичної інтерактивної документації користувальницьких інтерфейсів. -Все це може здатися абстрактним. Не хвилюйтеся. Ви побачите все це в дії в [Навчальний посібник - Посібник користувача](tutorial/index.md){.internal-link target=_blank}. +Все це може здатися абстрактним. Не хвилюйтеся. Ви побачите все це в дії в [Навчальний посібник - Посібник користувача](tutorial/index.md). Важливо те, що за допомогою стандартних типів Python в одному місці (замість того, щоб додавати більше класів, декораторів тощо), **FastAPI** зробить багато роботи за вас. /// info | Інформація -Якщо ви вже пройшли весь навчальний посібник і повернулися, щоб дізнатися більше про типи, ось хороший ресурс: «шпаргалка» від `mypy`. +Якщо ви вже пройшли весь навчальний посібник і повернулися, щоб дізнатися більше про типи, ось хороший ресурс: [«шпаргалка» від `mypy`](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html). /// diff --git a/docs/uk/docs/tutorial/background-tasks.md b/docs/uk/docs/tutorial/background-tasks.md index 71266a8b10..2894bd2d08 100644 --- a/docs/uk/docs/tutorial/background-tasks.md +++ b/docs/uk/docs/tutorial/background-tasks.md @@ -61,7 +61,7 @@ ## Технічні деталі { #technical-details } -Клас `BackgroundTasks` походить безпосередньо з `starlette.background`. +Клас `BackgroundTasks` походить безпосередньо з [`starlette.background`](https://www.starlette.dev/background/). Він імпортується/включається безпосередньо у FastAPI, щоб ви могли імпортувати його з `fastapi` і випадково не імпортували альтернативний `BackgroundTask` (без `s` в кінці) з `starlette.background`. @@ -69,11 +69,11 @@ Також можна використовувати `BackgroundTask` окремо в FastAPI, але для цього вам доведеться створити об'єкт у коді та повернути Starlette `Response`, включаючи його. -Детальніше можна почитати в офіційній документації Starlette про Background Tasks. +Детальніше можна почитати в [офіційній документації Starlette про Background Tasks](https://www.starlette.dev/background/). ## Застереження { #caveat } -Якщо вам потрібно виконувати складні фонові обчислення, і при цьому нема потреби запускати їх у тому ж процесі (наприклад, не потрібно спільного доступу до пам’яті чи змінних), можливо, варто скористатися більш потужними інструментами, такими як Celery. +Якщо вам потрібно виконувати складні фонові обчислення, і при цьому нема потреби запускати їх у тому ж процесі (наприклад, не потрібно спільного доступу до пам’яті чи змінних), можливо, варто скористатися більш потужними інструментами, такими як [Celery](https://docs.celeryq.dev). Такі інструменти зазвичай потребують складнішої конфігурації та менеджера черги повідомлень/завдань, наприклад, RabbitMQ або Redis. Однак вони дозволяють виконувати фонові задачі в кількох процесах і особливо — на кількох серверах. diff --git a/docs/uk/docs/tutorial/bigger-applications.md b/docs/uk/docs/tutorial/bigger-applications.md index a75da2ac6d..7745509ddf 100644 --- a/docs/uk/docs/tutorial/bigger-applications.md +++ b/docs/uk/docs/tutorial/bigger-applications.md @@ -123,7 +123,7 @@ from app.routers import items Ми використовуємо вигаданий заголовок, щоб спростити приклад. -Але в реальних випадках ви отримаєте кращі результати, використовуючи інтегровані [засоби безпеки](security/index.md){.internal-link target=_blank}. +Але в реальних випадках ви отримаєте кращі результати, використовуючи інтегровані [засоби безпеки](security/index.md). /// @@ -169,7 +169,7 @@ async def read_item(item_id: str): /// tip | Порада -Зверніть увагу, що так само як і для [залежностей у декораторах *операцій шляху*](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, жодне значення не буде передано вашій *функції операції шляху*. +Зверніть увагу, що так само як і для [залежностей у декораторах *операцій шляху*](dependencies/dependencies-in-path-operation-decorators.md), жодне значення не буде передано вашій *функції операції шляху*. /// @@ -185,8 +185,8 @@ async def read_item(item_id: str): * Усі вони включатимуть наперед визначені `responses`. * Для всіх цих *операцій шляху* список `dependencies` буде оцінений/виконаний перед ними. * Якщо ви також оголосите залежності в конкретній *операції шляху*, **вони також будуть виконані**. - * Спочатку виконуються залежності router'а, потім [`dependencies` у декораторі](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, а потім звичайні параметричні залежності. - * Ви також можете додати [`Security` залежності з `scopes`](../advanced/security/oauth2-scopes.md){.internal-link target=_blank}. + * Спочатку виконуються залежності router'а, потім [`dependencies` у декораторі](dependencies/dependencies-in-path-operation-decorators.md), а потім звичайні параметричні залежності. + * Ви також можете додати [`Security` залежності з `scopes`](../advanced/security/oauth2-scopes.md). /// tip | Порада @@ -303,7 +303,7 @@ from ...dependencies import get_token_header Імпортуйте та створіть клас `FastAPI`, як зазвичай. -І ми навіть можемо оголосити [глобальні залежності](dependencies/global-dependencies.md){.internal-link target=_blank}, які будуть поєднані із залежностями кожного `APIRouter`: +І ми навіть можемо оголосити [глобальні залежності](dependencies/global-dependencies.md), які будуть поєднані із залежностями кожного `APIRouter`: {* ../../docs_src/bigger_applications/app_an_py310/main.py hl[1,3,7] title["app/main.py"] *} @@ -353,7 +353,7 @@ from .routers import items, users from app.routers import items, users ``` -Щоб дізнатися більше про пакети й модулі Python, прочитайте офіційну документацію Python про модулі. +Щоб дізнатися більше про пакети й модулі Python, прочитайте [офіційну документацію Python про модулі](https://docs.python.org/3/tutorial/modules.html). /// @@ -465,6 +465,37 @@ from .routers.users import router /// +## Налаштуйте `entrypoint` у `pyproject.toml` { #configure-the-entrypoint-in-pyproject-toml } + +Оскільки ваш об'єкт FastAPI `app` знаходиться в `app/main.py`, ви можете налаштувати `entrypoint` у файлі `pyproject.toml` так: + +```toml +[tool.fastapi] +entrypoint = "app.main:app" +``` + +це еквівалентно імпорту: + +```python +from app.main import app +``` + +Таким чином команда `fastapi` знатиме, де знайти ваш застосунок. + +/// Note | Примітка + +Ви також могли б передати шлях команді, наприклад: + +```console +$ fastapi dev app/main.py +``` + +Але тоді вам доведеться щоразу пам'ятати, щоб передавати правильний шлях, коли ви викликаєте команду `fastapi`. + +Крім того, інші інструменти можуть не знайти його, наприклад [розширення VS Code](../editor-support.md) або [FastAPI Cloud](https://fastapicloud.com), тому рекомендовано використовувати `entrypoint` у `pyproject.toml`. + +/// + ## Перевірте автоматичну документацію API { #check-the-automatic-api-docs } Тепер запустіть ваш застосунок: @@ -472,14 +503,14 @@ from .routers.users import router
```console -$ fastapi dev app/main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-І відкрийте документацію за адресою http://127.0.0.1:8000/docs. +І відкрийте документацію за адресою [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Ви побачите автоматичну документацію API, що включає шляхи з усіх підмодулів, з правильними шляхами (і префіксами) та правильними мітками: diff --git a/docs/uk/docs/tutorial/body-nested-models.md b/docs/uk/docs/tutorial/body-nested-models.md index a56ae484df..97fea36dc5 100644 --- a/docs/uk/docs/tutorial/body-nested-models.md +++ b/docs/uk/docs/tutorial/body-nested-models.md @@ -17,7 +17,7 @@ ### Оголошення `list` з параметром типу { #declare-a-list-with-a-type-parameter } Щоб оголосити типи з параметрами типу (внутрішніми типами), такими як `list`, `dict`, `tuple`, -передайте внутрішні тип(и) як «параметри типу», використовуючи квадратні дужки: `[` and `]` +передайте внутрішні тип(и) як «параметри типу», використовуючи квадратні дужки: `[` та `]` ```Python my_list: list[str] @@ -96,7 +96,7 @@ my_list: list[str] Окрім звичайних типів, таких як `str`, `int`, `float`, та ін. ви можете використовувати складніші типи, які наслідують `str`. -Щоб побачити всі доступні варіанти, ознайомтеся з оглядом типів у Pydantic. Деякі приклади будуть у наступних розділах. +Щоб побачити всі доступні варіанти, ознайомтеся з [Оглядом типів у Pydantic](https://docs.pydantic.dev/latest/concepts/types/). Деякі приклади будуть у наступному розділі. Наприклад, у моделі `Image` є поле `url`, тому ми можемо оголосити його як `HttpUrl` від Pydantic замість `str`: @@ -215,7 +215,7 @@ images: list[Image] А також отримуєте всі переваги: * Підтримка в редакторі (автодоповнення всюди!) -* Конвертація даних (парсинг/сериалізація) +* Конвертація даних (парсинг/серіалізація) * Валідація даних * Документація схем * Автоматичне створення документації diff --git a/docs/uk/docs/tutorial/body-updates.md b/docs/uk/docs/tutorial/body-updates.md index 2ae68291ca..082bec1f03 100644 --- a/docs/uk/docs/tutorial/body-updates.md +++ b/docs/uk/docs/tutorial/body-updates.md @@ -2,7 +2,7 @@ ## Оновлення із заміною за допомогою `PUT` { #update-replacing-with-put } -Щоб оновити елемент, ви можете використати HTTP `PUT` операцію. +Щоб оновити елемент, ви можете використати [HTTP `PUT`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT) операцію. Ви можете використати `jsonable_encoder`, щоб перетворити вхідні дані на такі, які можна зберігати як JSON (наприклад, у NoSQL базі даних). Наприклад, перетворюючи `datetime` у `str`. @@ -28,7 +28,7 @@ ## Часткові оновлення з `PATCH` { #partial-updates-with-patch } -Ви також можете використовувати операцію HTTP `PATCH` для *часткового* оновлення даних. +Ви також можете використовувати операцію [HTTP `PATCH`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH) для *часткового* оновлення даних. Це означає, що Ви можете надіслати лише ті дані, які хочете оновити, залишаючи інші без змін. @@ -95,6 +95,6 @@ Тож, якщо Ви хочете отримувати часткові оновлення, які можуть пропускати всі атрибути, Вам потрібно мати модель, де всі атрибути позначені як необов’язкові (зі значеннями за замовчуванням або `None`). -Щоб розрізняти моделі з усіма необов’язковими значеннями для **оновлення** і моделі з обов’язковими значеннями для **створення**, Ви можете скористатись ідеями, описаними у [Додаткові моделі](extra-models.md){.internal-link target=_blank}. +Щоб розрізняти моделі з усіма необов’язковими значеннями для **оновлення** і моделі з обов’язковими значеннями для **створення**, Ви можете скористатись ідеями, описаними у [Додаткові моделі](extra-models.md). /// diff --git a/docs/uk/docs/tutorial/body.md b/docs/uk/docs/tutorial/body.md index 615f0274cc..91c4b42527 100644 --- a/docs/uk/docs/tutorial/body.md +++ b/docs/uk/docs/tutorial/body.md @@ -2,13 +2,13 @@ Коли вам потрібно надіслати дані з клієнта (скажімо, браузера) до вашого API, ви надсилаєте їх як **тіло запиту**. -Тіло **запиту** — це дані, надіслані клієнтом до вашого API. Тіло **відповіді** — це дані, які ваш API надсилає клієнту. +Тіло **запиту** - це дані, надіслані клієнтом до вашого API. Тіло **відповіді** - це дані, які ваш API надсилає клієнту. Ваш API майже завжди має надсилати тіло **відповіді**. Але клієнтам не обов’язково потрібно постійно надсилати тіла **запитів** — інколи вони лише запитують шлях, можливо з деякими параметрами запиту, але не надсилають тіло. -Щоб оголосити тіло **запиту**, ви використовуєте Pydantic моделі з усією їх потужністю та перевагами. +Щоб оголосити тіло **запиту**, ви використовуєте [Pydantic](https://docs.pydantic.dev/) моделі з усією їх потужністю та перевагами. -/// info +/// info | Інформація Щоб надіслати дані, ви повинні використовувати один із: `POST` (більш поширений), `PUT`, `DELETE` або `PATCH`. @@ -73,7 +73,7 @@ * Якщо дані недійсні, він поверне гарну та чітку помилку, вказуючи, де саме і які дані були неправильними. * Надавати отримані дані у параметрі `item`. * Оскільки ви оголосили його у функції як тип `Item`, ви також матимете всю підтримку редактора (автозаповнення, тощо) для всіх атрибутів та їх типів. -* Генерувати визначення Схеми JSON для вашої моделі, ви також можете використовувати їх де завгодно, якщо це має сенс для вашого проекту. +* Генерувати визначення [Схеми JSON](https://json-schema.org) для вашої моделі, ви також можете використовувати їх де завгодно, якщо це має сенс для вашого проекту. * Ці схеми будуть частиною згенерованої схеми OpenAPI і використовуватимуться автоматичною документацією UIs. ## Автоматична документація { #automatic-docs } @@ -102,15 +102,15 @@ Були навіть деякі зміни в самому Pydantic, щоб підтримати це. -Попередні скріншоти були зроблені у Visual Studio Code. +Попередні скріншоти були зроблені у [Visual Studio Code](https://code.visualstudio.com). -Але ви отримаєте ту саму підтримку редактора у PyCharm та більшість інших редакторів Python: +Але ви отримаєте ту саму підтримку редактора у [PyCharm](https://www.jetbrains.com/pycharm/) та більшість інших редакторів Python: -/// tip +/// tip | Порада -Якщо ви використовуєте PyCharm як ваш редактор, ви можете використати Pydantic PyCharm Plugin. +Якщо ви використовуєте [PyCharm](https://www.jetbrains.com/pycharm/) як ваш редактор, ви можете використати [Pydantic PyCharm Plugin](https://github.com/koxudaxi/pydantic-pycharm-plugin/). Він покращує підтримку редакторів для моделей Pydantic за допомогою: @@ -151,7 +151,7 @@ * Якщо параметр має **сингулярний тип** (наприклад, `int`, `float`, `str`, `bool` тощо), він буде інтерпретуватися як параметр **запиту**. * Якщо параметр оголошується як тип **Pydantic моделі**, він інтерпретується як **тіло** **запиту**. -/// note +/// note | Примітка FastAPI буде знати, що значення `q` не є обов'язковим через значення за замовчуванням `= None`. @@ -163,4 +163,4 @@ FastAPI буде знати, що значення `q` не є обов'язко ## Без Pydantic { #without-pydantic } -Якщо ви не хочете використовувати моделі Pydantic, ви також можете використовувати параметри **Body**. Перегляньте документацію для [Тіло - Кілька параметрів: Окремі значення в тілі](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank}. +Якщо ви не хочете використовувати моделі Pydantic, ви також можете використовувати параметри **Body**. Перегляньте документацію для [Тіло - Кілька параметрів: Окремі значення в тілі](body-multiple-params.md#singular-values-in-body). diff --git a/docs/uk/docs/tutorial/cors.md b/docs/uk/docs/tutorial/cors.md index 5c959cef18..993bf31f58 100644 --- a/docs/uk/docs/tutorial/cors.md +++ b/docs/uk/docs/tutorial/cors.md @@ -1,6 +1,6 @@ # CORS (Обмін ресурсами між різними джерелами) { #cors-cross-origin-resource-sharing } -CORS або «Cross-Origin Resource Sharing» є ситуація, коли фронтенд, що працює в браузері, містить JavaScript-код, який взаємодіє з бекендом, розташованим в іншому «джерелі» (origin). +[CORS або «Cross-Origin Resource Sharing»](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) є ситуація, коли фронтенд, що працює в браузері, містить JavaScript-код, який взаємодіє з бекендом, розташованим в іншому «джерелі» (origin). ## Джерело (Origin) { #origin } @@ -29,7 +29,7 @@ Можна також оголосити список як `"*"` (дика карта), що означає дозвіл для всіх джерел. -Однак це дозволить лише певні типи комунікації, виключаючи все, що пов'язане з обліковими даними: Cookies, заголовки авторизації, як-от ті, що використовуються з токенами носія, тощо. +Однак це дозволить лише певні типи комунікації, виключаючи все, що пов'язане з обліковими даними: кукі, заголовки авторизації, як-от ті, що використовуються з токенами носія, тощо. Тому для коректної роботи краще явно вказувати дозволені джерела. @@ -43,7 +43,7 @@ Також можна вказати, чи дозволяє ваш бекенд: -* Облікові дані (заголовки авторизації, Cookies, тощо). +* Облікові дані (заголовки авторизації, кукі, тощо). * Конкретні HTTP-методи (`POST`, `PUT`) або всі за допомогою `"*"` * Конкретні HTTP-заголовки або всі за допомогою `"*"`. @@ -58,10 +58,10 @@ * `allow_origins` - Список джерел, яким дозволено здійснювати міждоменні запити. Наприклад `['https://example.org', 'https://www.example.org']`. Ви можете використовувати `['*']`, щоб дозволити будь-яке джерело. * `allow_origin_regex` - Рядок регулярного виразу для відповідності джерелам, яким дозволено здійснювати міждоменні запити. Наприклад, `'https://.*\.example\.org'`. * `allow_methods` - Список HTTP-методів, дозволених для міждоменних запитів. За замовчуванням `['GET']`. Ви можете використовувати `['*']`, щоб дозволити всі стандартні методи. -* `allow_headers` - Список HTTP-заголовків запиту, які підтримуються для міждоменних запитів. За замовчуванням `[]`. Ви можете використовувати `['*']`, щоб дозволити всі заголовки. Заголовки `Accept`, `Accept-Language`, `Content-Language` і `Content-Type` завжди дозволені для простих CORS-запитів. -* `allow_credentials` - Визначає, чи повинні підтримуватися cookies для міждоменних запитів. За замовчуванням `False`. +* `allow_headers` - Список HTTP-заголовків запиту, які підтримуються для міждоменних запитів. За замовчуванням `[]`. Ви можете використовувати `['*']`, щоб дозволити всі заголовки. Заголовки `Accept`, `Accept-Language`, `Content-Language` і `Content-Type` завжди дозволені для [простих CORS-запитів](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests). +* `allow_credentials` - Визначає, чи повинні підтримуватися кукі для міждоменних запитів. За замовчуванням `False`. - Жоден із параметрів `allow_origins`, `allow_methods` і `allow_headers` не можна встановлювати як `['*']`, якщо `allow_credentials` встановлено як `True`. Усі вони мають бути явно вказані. + Жоден із параметрів `allow_origins`, `allow_methods` і `allow_headers` не можна встановлювати як `['*']`, якщо `allow_credentials` встановлено як `True`. Усі вони мають бути [явно вказані](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards). * `expose_headers` - Вказує, які заголовки відповіді повинні бути доступні для браузера. За замовчуванням `[]`. * `max_age` - Встановлює максимальний час (у секундах) для кешування CORS-відповідей у браузерах. За замовчуванням `600`. @@ -72,20 +72,20 @@ Це будь-які `OPTIONS` - запити, що містять заголовки `Origin` та `Access-Control-Request-Method`. -У такому випадку middleware перехопить вхідний запит і відповість відповідними CORS-заголовками, повертаючи або `200`, або `400` для інформаційних цілей. +У такому випадку проміжне програмне забезпечення перехопить вхідний запит і відповість відповідними CORS-заголовками, повертаючи або `200`, або `400` для інформаційних цілей. ### Прості запити { #simple-requests } -Будь-які запити із заголовком `Origin`. У цьому випадку middleware пропустить запит як звичайний, але додасть відповідні CORS-заголовки у відповідь. +Будь-які запити із заголовком `Origin`. У цьому випадку проміжне програмне забезпечення пропустить запит як звичайний, але додасть відповідні CORS-заголовки у відповідь. ## Додаткова інформація { #more-info } -Більше про CORS можна дізнатися в документації Mozilla про CORS. +Більше про CORS можна дізнатися в [документації Mozilla про CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS). /// note | Технічні деталі Також можна використовувати `from starlette.middleware.cors import CORSMiddleware`. -**FastAPI** надає кілька middleware у `fastapi.middleware` для зручності розробників. Але більшість доступних middleware походять безпосередньо зі Starlette. +**FastAPI** надає кілька проміжних програмних забезпечень у `fastapi.middleware` для зручності розробників. Але більшість доступного проміжного програмного забезпечення походить безпосередньо зі Starlette. /// diff --git a/docs/uk/docs/tutorial/debugging.md b/docs/uk/docs/tutorial/debugging.md index 679018cc2f..d0100587b8 100644 --- a/docs/uk/docs/tutorial/debugging.md +++ b/docs/uk/docs/tutorial/debugging.md @@ -59,7 +59,7 @@ $ python myapp.py ```Python from myapp import app -# Some more code +# Ще трохи коду ``` у цьому випадку автоматично створена змінна `__name__` всередині `myapp.py` не матиме значення `"__main__"`. @@ -72,9 +72,9 @@ from myapp import app не буде виконано. -/// info | Інформація +/// info -Для отримання додаткової інформації дивіться офіційну документацію Python. +Для отримання додаткової інформації дивіться [офіційну документацію Python](https://docs.python.org/3/library/__main__.html). /// diff --git a/docs/uk/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md b/docs/uk/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md index 4614c626c5..a82461c8dc 100644 --- a/docs/uk/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md +++ b/docs/uk/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md @@ -32,7 +32,7 @@ У цьому прикладі ми використовуємо вигадані власні заголовки `X-Key` і `X-Token`. -Але в реальних випадках, під час впровадження безпеки, ви отримаєте більше користі, використовуючи вбудовані [Інструменти безпеки (наступний розділ)](../security/index.md){.internal-link target=_blank}. +Але в реальних випадках, під час впровадження безпеки, ви отримаєте більше користі, використовуючи вбудовані [Інструменти безпеки (наступний розділ)](../security/index.md). /// @@ -62,7 +62,7 @@ ## Залежності для групи операцій шляху { #dependencies-for-a-group-of-path-operations } -Далі, читаючи про структурування великих застосунків ([Більші застосунки - декілька файлів](../../tutorial/bigger-applications.md){.internal-link target=_blank}), можливо з кількома файлами, ви дізнаєтеся, як оголосити один параметр `dependencies` для групи *операцій шляху*. +Далі, читаючи про структурування великих застосунків ([Більші застосунки - декілька файлів](../../tutorial/bigger-applications.md)), можливо з кількома файлами, ви дізнаєтеся, як оголосити один параметр `dependencies` для групи *операцій шляху*. ## Глобальні залежності { #global-dependencies } diff --git a/docs/uk/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/uk/docs/tutorial/dependencies/dependencies-with-yield.md index 70d4210a1c..53b49e61b6 100644 --- a/docs/uk/docs/tutorial/dependencies/dependencies-with-yield.md +++ b/docs/uk/docs/tutorial/dependencies/dependencies-with-yield.md @@ -1,6 +1,6 @@ # Залежності з yield { #dependencies-with-yield } -FastAPI підтримує залежності, які виконують деякі додаткові кроки після завершення. +FastAPI підтримує залежності, які виконують деякі додаткові кроки після завершення. Щоб це зробити, використовуйте `yield` замість `return` і напишіть додаткові кроки (код) після нього. @@ -14,8 +14,8 @@ FastAPI підтримує залежності, які виконують де Будь-яка функція, яку можна використовувати з: -* `@contextlib.contextmanager` або -* `@contextlib.asynccontextmanager` +* [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) або +* [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager) буде придатною як залежність у **FastAPI**. @@ -87,7 +87,7 @@ FastAPI підтримує залежності, які виконують де /// note | Технічні деталі -Це працює завдяки Менеджерам контексту Python. +Це працює завдяки Python [Менеджерам контексту](https://docs.python.org/3/library/contextlib.html). **FastAPI** використовує їх внутрішньо, щоб досягти цього. @@ -111,7 +111,7 @@ FastAPI підтримує залежності, які виконують де {* ../../docs_src/dependencies/tutorial008b_an_py310.py hl[18:22,31] *} -Якщо ви хочете перехоплювати винятки та створювати на їх основі користувацьку відповідь, створіть [Користувацький обробник винятків](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank}. +Якщо ви хочете перехоплювати винятки та створювати на їх основі користувацьку відповідь, створіть [Користувацький обробник винятків](../handling-errors.md#install-custom-exception-handlers). ## Залежності з `yield` та `except` { #dependencies-with-yield-and-except } @@ -233,14 +233,14 @@ participant operation as Path Operation Залежності з `yield` еволюціонували з часом, щоб покрити різні сценарії та виправити деякі проблеми. -Якщо ви хочете дізнатися, що змінювалося в різних версіях FastAPI, прочитайте про це в просунутому посібнику користувача: [Розширені залежності - Залежності з `yield`, `HTTPException`, `except` і фоновими задачами](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks){.internal-link target=_blank}. +Якщо ви хочете дізнатися, що змінювалося в різних версіях FastAPI, прочитайте про це в просунутому посібнику користувача: [Розширені залежності - Залежності з `yield`, `HTTPException`, `except` і фоновими задачами](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks). ## Менеджери контексту { #context-managers } ### Що таке «Менеджери контексту» { #what-are-context-managers } «Менеджери контексту» - це будь-які Python-об'єкти, які можна використовувати в операторі `with`. -Наприклад, можна використати `with`, щоб прочитати файл: +Наприклад, [можна використати `with`, щоб прочитати файл](https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files): ```Python with open("./somefile.txt") as f: @@ -264,7 +264,7 @@ with open("./somefile.txt") as f: /// -У Python ви можете створювати Менеджери контексту, створивши клас із двома методами: `__enter__()` і `__exit__()`. +У Python ви можете створювати Менеджери контексту, [створивши клас із двома методами: `__enter__()` і `__exit__()`](https://docs.python.org/3/reference/datamodel.html#context-managers). Ви також можете використовувати їх усередині залежностей **FastAPI** з `yield`, використовуючи `with` або `async with` у середині функції залежності: @@ -275,8 +275,8 @@ with open("./somefile.txt") as f: Інший спосіб створити менеджер контексту: -* `@contextlib.contextmanager` або -* `@contextlib.asynccontextmanager` +* [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) або +* [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager) використовуючи їх для декорування функції з одним `yield`. diff --git a/docs/uk/docs/tutorial/dependencies/global-dependencies.md b/docs/uk/docs/tutorial/dependencies/global-dependencies.md index 3cffa1752c..da8b08cdff 100644 --- a/docs/uk/docs/tutorial/dependencies/global-dependencies.md +++ b/docs/uk/docs/tutorial/dependencies/global-dependencies.md @@ -2,14 +2,14 @@ Для деяких типів застосунків ви можете захотіти додати залежності до всього застосунку. -Подібно до того, як ви можете [додавати `dependencies` до *декораторів операцій шляху*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, ви можете додати їх до застосунку `FastAPI`. +Подібно до того, як ви можете [додавати `dependencies` до *декораторів операцій шляху*](dependencies-in-path-operation-decorators.md), ви можете додати їх до застосунку `FastAPI`. У такому разі вони будуть застосовані до всіх *операцій шляху* в застосунку: {* ../../docs_src/dependencies/tutorial012_an_py310.py hl[17] *} -Усі ідеї з розділу про [додавання `dependencies` до *декораторів операцій шляху*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank} так само застосовні, але в цьому випадку - до всіх *операцій шляху* в застосунку. +Усі ідеї з розділу про [додавання `dependencies` до *декораторів операцій шляху*](dependencies-in-path-operation-decorators.md) так само застосовні, але в цьому випадку - до всіх *операцій шляху* в застосунку. ## Залежності для груп *операцій шляху* { #dependencies-for-groups-of-path-operations } -Пізніше, читаючи про структуру більших застосунків ([Більші застосунки - кілька файлів](../../tutorial/bigger-applications.md){.internal-link target=_blank}), можливо з кількома файлами, ви дізнаєтеся, як оголосити єдиний параметр `dependencies` для групи *операцій шляху*. +Пізніше, читаючи про структуру більших застосунків ([Більші застосунки - кілька файлів](../../tutorial/bigger-applications.md)), можливо з кількома файлами, ви дізнаєтеся, як оголосити єдиний параметр `dependencies` для групи *операцій шляху*. diff --git a/docs/uk/docs/tutorial/dependencies/index.md b/docs/uk/docs/tutorial/dependencies/index.md index cbcf693077..bea5f598d6 100644 --- a/docs/uk/docs/tutorial/dependencies/index.md +++ b/docs/uk/docs/tutorial/dependencies/index.md @@ -57,7 +57,7 @@ FastAPI додав підтримку `Annotated` (і почав її реком Якщо у вас старіша версія, ви отримаєте помилки при спробі використати `Annotated`. -Переконайтеся, що ви [Оновіть версію FastAPI](../../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} щонайменше до 0.95.1 перед використанням `Annotated`. +Переконайтеся, що ви [Оновіть версію FastAPI](../../deployment/versions.md#upgrading-the-fastapi-versions) щонайменше до 0.95.1 перед використанням `Annotated`. /// @@ -152,7 +152,7 @@ commons: Annotated[dict, Depends(common_parameters)] /// note | Примітка -Якщо ви не впевнені, перегляньте розділ [Async: *"In a hurry?"*](../../async.md#in-a-hurry){.internal-link target=_blank} про `async` і `await` у документації. +Якщо ви не впевнені, перегляньте розділ [Async: *"In a hurry?"*](../../async.md#in-a-hurry) про `async` і `await` у документації. /// diff --git a/docs/uk/docs/tutorial/encoder.md b/docs/uk/docs/tutorial/encoder.md index 1b403d5bba..7bbc45ef7b 100644 --- a/docs/uk/docs/tutorial/encoder.md +++ b/docs/uk/docs/tutorial/encoder.md @@ -12,7 +12,7 @@ Наприклад, вона не приймає об'єкти типу `datetime`, оскільки вони не сумісні з JSON. -Отже, об'єкт типу `datetime` потрібно перетворити на `str`, який містить дані в форматі ISO. +Отже, об'єкт типу `datetime` потрібно перетворити на `str`, який містить дані в [форматі ISO](https://en.wikipedia.org/wiki/ISO_8601). Так само ця база даних не прийматиме модель Pydantic (об'єкт з атрибутами), а лише `dict`. @@ -24,7 +24,7 @@ У цьому прикладі вона конвертує модель Pydantic у `dict`, а `datetime` у `str`. -Результат виклику цієї функції — це щось, що можна кодувати з використанням стандарту Python `json.dumps()`. +Результат виклику цієї функції — це щось, що можна кодувати з використанням стандарту Python [`json.dumps()`](https://docs.python.org/3/library/json.html#json.dumps). Вона не повертає великий `str`, який містить дані у форматі JSON (як рядок). Вона повертає стандартну структуру даних Python (наприклад, `dict`) зі значеннями та підзначеннями, які є сумісними з JSON. diff --git a/docs/uk/docs/tutorial/extra-data-types.md b/docs/uk/docs/tutorial/extra-data-types.md index a3545e0746..26d7c306fe 100644 --- a/docs/uk/docs/tutorial/extra-data-types.md +++ b/docs/uk/docs/tutorial/extra-data-types.md @@ -36,7 +36,7 @@ * `datetime.timedelta`: * Пайтонівський `datetime.timedelta`. * У запитах та відповідях буде представлений як `float` загальної кількості секунд. - * Pydantic також дозволяє представляти це як "ISO 8601 time diff encoding", дивіться документацію для отримання додаткової інформації. + * Pydantic також дозволяє представляти це як "ISO 8601 time diff encoding", [дивіться документацію для отримання додаткової інформації](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers). * `frozenset`: * У запитах і відповідях це буде оброблено так само, як і `set`: * У запитах список буде зчитано, дублікати буде видалено, і його буде перетворено на `set`. @@ -49,7 +49,7 @@ * `Decimal`: * Стандартний Пайтонівський `Decimal`. * У запитах і відповідях це буде оброблено так само, як і `float`. -* Ви можете перевірити всі дійсні типи даних Pydantic тут: типи даних Pydantic. +* Ви можете перевірити всі дійсні типи даних Pydantic тут: [типи даних Pydantic](https://docs.pydantic.dev/latest/usage/types/types/). ## Приклад { #example } diff --git a/docs/uk/docs/tutorial/extra-models.md b/docs/uk/docs/tutorial/extra-models.md index 25930b8c0b..271e553fd8 100644 --- a/docs/uk/docs/tutorial/extra-models.md +++ b/docs/uk/docs/tutorial/extra-models.md @@ -12,7 +12,7 @@ Ніколи не зберігайте паролі користувачів у відкритому вигляді. Завжди зберігайте «безпечний хеш», який потім можна перевірити. -Якщо ви ще не знаєте, що таке «хеш пароля», ви дізнаєтесь у [розділах про безпеку](security/simple-oauth2.md#password-hashing){.internal-link target=_blank}. +Якщо ви ще не знаєте, що таке «хеш пароля», ви дізнаєтесь у [розділах про безпеку](security/simple-oauth2.md#password-hashing). /// @@ -108,7 +108,7 @@ UserInDB(**user_dict) UserInDB(**user_in.model_dump()) ``` -...тому що `user_in.model_dump()` повертає `dict`, а ми змушуємо Python «розпакувати» його, передаючи в `UserInDB` з префіксом `**`. +...тому що `user_in.model_dump()` - це `dict`, а ми змушуємо Python «розпакувати» його, передаючи в `UserInDB` з префіксом `**`. Тож ми отримуємо модель Pydantic з даних іншої моделі Pydantic. @@ -162,11 +162,11 @@ UserInDB( В OpenAPI це буде визначено як `anyOf`. -Для цього використайте стандартну підказку типу Python `typing.Union`: +Для цього використайте стандартну підказку типу Python [`typing.Union`](https://docs.python.org/3/library/typing.html#typing.Union): /// note | Примітка -Під час визначення `Union` спочатку вказуйте найконкретніший тип, а потім менш конкретний. У прикладі нижче більш конкретний `PlaneItem` стоїть перед `CarItem` у `Union[PlaneItem, CarItem]`. +Під час визначення [`Union`](https://docs.pydantic.dev/latest/concepts/types/#unions) спочатку вказуйте найконкретніший тип, а потім менш конкретний. У прикладі нижче більш конкретний `PlaneItem` стоїть перед `CarItem` у `Union[PlaneItem, CarItem]`. /// diff --git a/docs/uk/docs/tutorial/first-steps.md b/docs/uk/docs/tutorial/first-steps.md index f03a120a09..0f46890d9b 100644 --- a/docs/uk/docs/tutorial/first-steps.md +++ b/docs/uk/docs/tutorial/first-steps.md @@ -11,7 +11,7 @@
```console -$ fastapi dev main.py +$ fastapi dev FastAPI Starting development server 🚀 @@ -58,7 +58,7 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ### Перевірте { #check-it } -Відкрийте браузер та введіть адресу http://127.0.0.1:8000. +Відкрийте браузер за адресою [http://127.0.0.1:8000](http://127.0.0.1:8000). Ви побачите JSON-відповідь: @@ -68,17 +68,17 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ### Інтерактивна API документація { #interactive-api-docs } -Тепер перейдіть сюди http://127.0.0.1:8000/docs. +Тепер перейдіть сюди [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). -Ви побачите автоматичну інтерактивну API документацію (надається Swagger UI): +Ви побачите автоматичну інтерактивну API документацію (надається [Swagger UI](https://github.com/swagger-api/swagger-ui)): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### Альтернативна API документація { #alternative-api-docs } -А тепер перейдіть сюди http://127.0.0.1:8000/redoc. +А тепер перейдіть сюди [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). -Ви побачите альтернативну автоматичну документацію (надається ReDoc): +Ви побачите альтернативну автоматичну документацію (надається [ReDoc](https://github.com/Rebilly/ReDoc)): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) @@ -92,7 +92,7 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) #### API «схема» { #api-schema } -У цьому випадку, OpenAPI є специфікацією, яка визначає, як описати схему вашого API. +У цьому випадку, [OpenAPI](https://github.com/OAI/OpenAPI-Specification) є специфікацією, яка визначає, як описати схему вашого API. Це визначення схеми включає шляхи (paths) вашого API, можливі параметри, які вони приймають, тощо. @@ -110,7 +110,7 @@ OpenAPI описує схему API для вашого API. І ця схема Якщо вас цікавить, як виглядає «сирий» OpenAPI schema, FastAPI автоматично генерує JSON (schema) з описами всього вашого API. -Ви можете побачити це напряму тут: http://127.0.0.1:8000/openapi.json. +Ви можете побачити це напряму тут: [http://127.0.0.1:8000/openapi.json](http://127.0.0.1:8000/openapi.json). Ви побачите JSON, що починається приблизно так: @@ -143,9 +143,58 @@ OpenAPI schema — це те, на чому працюють дві включе Ви також можете використовувати його для автоматичної генерації коду для клієнтів, які взаємодіють з вашим API. Наприклад, для фронтенд-, мобільних або IoT-застосунків. +### Налаштуйте `entrypoint` застосунку в `pyproject.toml` { #configure-the-app-entrypoint-in-pyproject-toml } + +Ви можете налаштувати, де знаходиться ваш застосунок, у файлі `pyproject.toml`, приблизно так: + +```toml +[tool.fastapi] +entrypoint = "main:app" +``` + +Цей `entrypoint` повідомить команді `fastapi`, що вона має імпортувати застосунок так: + +```python +from main import app +``` + +Якщо структура вашого коду виглядала б так: + +``` +. +├── backend +│   ├── main.py +│   ├── __init__.py +``` + +Тоді ви б задали `entrypoint` як: + +```toml +[tool.fastapi] +entrypoint = "backend.main:app" +``` + +що було б еквівалентно: + +```python +from backend.main import app +``` + +### `fastapi dev` із шляхом { #fastapi-dev-with-path } + +Ви також можете передати шлях до файлу в команду `fastapi dev`, і вона вгадає обʼєкт FastAPI app, який слід використовувати: + +```console +$ fastapi dev main.py +``` + +Але вам доведеться щоразу памʼятати передавати правильний шлях під час виклику команди `fastapi`. + +Крім того, інші інструменти можуть не знайти його, наприклад [Розширення VS Code](../editor-support.md) або [FastAPI Cloud](https://fastapicloud.com), тому рекомендується використовувати `entrypoint` у `pyproject.toml`. + ### Розгорніть ваш застосунок (необовʼязково) { #deploy-your-app-optional } -За бажанням ви можете розгорнути ваш FastAPI-застосунок у FastAPI Cloud, перейдіть і приєднайтеся до списку очікування, якщо ви цього ще не зробили. 🚀 +За бажанням ви можете розгорнути ваш FastAPI-застосунок у [FastAPI Cloud](https://fastapicloud.com), перейдіть і приєднайтеся до списку очікування, якщо ви цього ще не зробили. 🚀 Якщо у вас вже є обліковий запис **FastAPI Cloud** (ми запросили вас зі списку очікування 😉), ви можете розгорнути ваш застосунок однією командою. @@ -191,7 +240,7 @@ Deploying to FastAPI Cloud... `FastAPI` — це клас, який успадковується безпосередньо від `Starlette`. -Ви також можете використовувати всю функціональність Starlette у `FastAPI`. +Ви також можете використовувати всю функціональність [Starlette](https://www.starlette.dev/) у `FastAPI`. /// @@ -336,7 +385,7 @@ https://example.com/items/foo /// note -Якщо ви не знаєте різницю, подивіться [Асинхронність: *«Поспішаєте?»*](../async.md#in-a-hurry){.internal-link target=_blank}. +Якщо ви не знаєте різницю, подивіться [Асинхронність: *«Поспішаєте?»*](../async.md#in-a-hurry). /// @@ -352,11 +401,11 @@ https://example.com/items/foo ### Крок 6: розгорніть його { #step-6-deploy-it } -Розгорніть ваш застосунок у **FastAPI Cloud** однією командою: `fastapi deploy`. 🎉 +Розгорніть ваш застосунок у **[FastAPI Cloud](https://fastapicloud.com)** однією командою: `fastapi deploy`. 🎉 #### Про FastAPI Cloud { #about-fastapi-cloud } -**FastAPI Cloud** створено тим самим автором і командою, які стоять за **FastAPI**. +**[FastAPI Cloud](https://fastapicloud.com)** створено тим самим автором і командою, які стоять за **FastAPI**. Він спрощує процес **створення**, **розгортання** та **доступу** до API з мінімальними зусиллями. diff --git a/docs/uk/docs/tutorial/handling-errors.md b/docs/uk/docs/tutorial/handling-errors.md index 28a83127ff..262efa0e03 100644 --- a/docs/uk/docs/tutorial/handling-errors.md +++ b/docs/uk/docs/tutorial/handling-errors.md @@ -11,11 +11,11 @@ * Елемент, до якого він намагається отримати доступ, не існує. * тощо. -У таких випадках зазвичай повертається **HTTP статус-код** в діапазоні **400** (від 400 до 499). +У таких випадках зазвичай повертається **код статусу HTTP** у діапазоні **400** (від 400 до 499). -Це схоже на HTTP статус-коди 200 (від 200 до 299). Ці «200» статус-коди означають, що якимось чином запит був «успішним». +Це схоже на коди статусу HTTP 200 (від 200 до 299). Ці «200» коди статусу означають, що якимось чином запит був «успішним». -Статус-коди в діапазоні 400 означають, що сталася помилка з боку клієнта. +Коди статусу в діапазоні 400 означають, що сталася помилка з боку клієнта. Пам'ятаєте всі ці помилки **«404 Not Found»** (і жарти про них)? @@ -29,7 +29,7 @@ ### Згенеруйте `HTTPException` у своєму коді { #raise-an-httpexception-in-your-code } -`HTTPException` — це звичайна помилка Python із додатковими даними, які стосуються API. +`HTTPException` - це звичайна помилка Python із додатковими даними, які стосуються API. Оскільки це помилка Python, ви не `return` її, а `raise` її. @@ -37,13 +37,13 @@ Перевага генерації виключення замість повернення значення стане більш очевидною в розділі про залежності та безпеку. -У цьому прикладі, коли клієнт запитує елемент за ID, якого не існує, згенеруйте виключення зі статус-кодом `404`: +У цьому прикладі, коли клієнт запитує елемент за ID, якого не існує, згенеруйте виключення з кодом статусу `404`: {* ../../docs_src/handling_errors/tutorial001_py310.py hl[11] *} ### Отримана відповідь { #the-resulting-response } -Якщо клієнт робить запит за шляхом `http://example.com/items/foo` (де `item_id` `"foo"`), він отримає HTTP статус-код 200 і JSON відповідь: +Якщо клієнт робить запит за шляхом `http://example.com/items/foo` (де `item_id` `"foo"`), він отримає код статусу HTTP 200 і JSON відповідь: ```JSON { @@ -51,7 +51,7 @@ } ``` -Але якщо клієнт робить запит на `http://example.com/items/bar` (де `item_id` має не існуюче значення `"bar"`), то отримає HTTP статус-код 404 (помилка «не знайдено») та JSON відповідь: +Але якщо клієнт робить запит на `http://example.com/items/bar` (де `item_id` має не існуюче значення `"bar"`), то отримає код статусу HTTP 404 (помилка «не знайдено») та JSON відповідь: ```JSON { @@ -81,7 +81,7 @@ ## Встановлення власних обробників виключень { #install-custom-exception-handlers } -Ви можете додати власні обробники виключень за допомогою тих самих утиліт для виключень зі Starlette. +Ви можете додати власні обробники виключень за допомогою [тих самих утиліт для виключень зі Starlette](https://www.starlette.dev/exceptions/). Припустімо, у вас є власне виключення `UnicornException`, яке ви (або бібліотека, яку ви використовуєте) можете `raise`. @@ -95,7 +95,7 @@ Але вона буде оброблена функцією-обробником `unicorn_exception_handler`. -Отже, ви отримаєте зрозумілу помилку зі HTTP-статусом `418` і JSON-вмістом: +Отже, ви отримаєте зрозумілу помилку з кодом статусу HTTP `418` і JSON-вмістом: ```JSON {"message": "Oops! yolo did something. There goes a rainbow..."} diff --git a/docs/uk/docs/tutorial/index.md b/docs/uk/docs/tutorial/index.md index ed53ac7728..629b71decc 100644 --- a/docs/uk/docs/tutorial/index.md +++ b/docs/uk/docs/tutorial/index.md @@ -1,4 +1,4 @@ -# Туторіал - Посібник користувача { #tutorial-user-guide } +# Навчальний посібник - Посібник користувача { #tutorial-user-guide } У цьому посібнику показано, як користуватися **FastAPI** з більшістю його функцій, крок за кроком. @@ -10,12 +10,12 @@ Усі блоки коду можна скопіювати та використовувати безпосередньо (це фактично перевірені файли Python). -Щоб запустити будь-який із прикладів, скопіюйте код у файл `main.py` і запустіть `fastapi dev` за допомогою: +Щоб запустити будь-який із прикладів, скопіюйте код у файл `main.py`, і запустіть `fastapi dev`:
```console -$ fastapi dev main.py +$ fastapi dev FastAPI Starting development server 🚀 @@ -62,7 +62,7 @@ $ fastapi dev @@ -76,7 +76,7 @@ $ pip install "fastapi[standard]" /// note | Примітка -Коли ви встановлюєте через `pip install "fastapi[standard]"`, він постачається з деякими типовими необов’язковими стандартними залежностями, включно з `fastapi-cloud-cli`, який дозволяє розгортати в FastAPI Cloud. +Коли ви встановлюєте через `pip install "fastapi[standard]"`, він постачається з деякими типовими необов’язковими стандартними залежностями, включно з `fastapi-cloud-cli`, який дозволяє розгортати в [FastAPI Cloud](https://fastapicloud.com). Якщо ви не хочете мати ці необов’язкові залежності, натомість можете встановити `pip install fastapi`. @@ -84,12 +84,18 @@ $ pip install "fastapi[standard]" /// +/// tip | Порада + +FastAPI має [офіційне розширення для VS Code](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) (та Cursor), яке надає багато можливостей, включно з переглядачем операцій шляху, пошуком операцій шляху, навігацією CodeLens у тестах (перехід до визначення з тестів), а також розгортанням і журналами FastAPI Cloud — усе безпосередньо з вашого редактора. + +/// + ## Просунутий посібник користувача { #advanced-user-guide } -Існує також **Просунутий посібник користувача**, який ви зможете прочитати пізніше після цього **Туторіал - Посібник користувача**. +Існує також **Просунутий посібник користувача**, який ви зможете прочитати пізніше після цього **Навчальний посібник - Посібник користувача**. **Просунутий посібник користувача** засновано на цьому, використовує ті самі концепції та навчає вас деяким додатковим функціям. -Але вам слід спочатку прочитати **Туторіал - Посібник користувача** (те, що ви зараз читаєте). +Але вам слід спочатку прочитати **Навчальний посібник - Посібник користувача** (те, що ви зараз читаєте). -Він розроблений таким чином, що ви можете створити повну програму лише за допомогою **Туторіал - Посібник користувача**, а потім розширити її різними способами, залежно від ваших потреб, використовуючи деякі з додаткових ідей з **Просунутого посібника користувача**. +Він розроблений таким чином, що ви можете створити повну програму лише за допомогою **Навчальний посібник - Посібник користувача**, а потім розширити її різними способами, залежно від ваших потреб, використовуючи деякі з додаткових ідей з **Просунутого посібника користувача**. diff --git a/docs/uk/docs/tutorial/metadata.md b/docs/uk/docs/tutorial/metadata.md index ebe8dc40e1..ee1fdaf6dd 100644 --- a/docs/uk/docs/tutorial/metadata.md +++ b/docs/uk/docs/tutorial/metadata.md @@ -14,7 +14,7 @@ | `version` | `string` | Версія API. Це версія Вашого додатка, а не OpenAPI. Наприклад, `2.5.0`. | | `terms_of_service` | `str` | URL до умов використання API. Якщо вказано, має бути у форматі URL. | | `contact` | `dict` | Інформація для контакту з опублікованим API. Може містити кілька полів.
contact поля
ПараметрТипОпис
namestrІдентифікаційне ім'я контактної особи або організації.
urlstrURL, що вказує на контактну інформацію. МАЄ бути у форматі URL.
emailstrАдреса електронної пошти контактної особи або організації. МАЄ бути у форматі адреси електронної пошти.
| -| `license_info` | `dict` | Інформація про ліцензію для опублікованого API. Може містити кілька полів.
license_info поля
ПараметрТипОпис
namestrОБОВ'ЯЗКОВО (якщо встановлено license_info). Назва ліцензії для API.
identifierstrЛіцензійний вираз за SPDX для API. Поле identifier взаємовиключне з полем url. Доступно з OpenAPI 3.1.0, FastAPI 0.99.0.
urlstrURL до ліцензії, яка використовується для API. МАЄ бути у форматі URL.
| +| `license_info` | `dict` | Інформація про ліцензію для опублікованого API. Може містити кілька полів.
license_info поля
ПараметрТипОпис
namestrОБОВ'ЯЗКОВО (якщо встановлено license_info). Назва ліцензії для API.
identifierstrЛіцензійний вираз за [SPDX](https://spdx.org/licenses/) для API. Поле identifier взаємовиключне з полем url. Доступно з OpenAPI 3.1.0, FastAPI 0.99.0.
urlstrURL до ліцензії, яка використовується для API. МАЄ бути у форматі URL.
| Ви можете налаштувати їх наступним чином: @@ -40,7 +40,7 @@ ## Метадані для тегів { #metadata-for-tags } -Ви також можете додати додаткові метадані для різних тегів, які використовуються для групування операцій шляхів, за допомогою параметра `openapi_tags`. +Ви також можете додати додаткові метадані для різних тегів, які використовуються для групування операцій шляху, за допомогою параметра `openapi_tags`. Він приймає список, який містить один словник для кожного тега. @@ -60,7 +60,7 @@ {* ../../docs_src/metadata/tutorial004_py310.py hl[3:16,18] *} -Зверніть увагу, що в описах можна використовувати Markdown, наприклад, "login" буде показано жирним шрифтом (**login**), а "fancy" буде показано курсивом (_fancy_). +Зверніть увагу, що в описах можна використовувати Markdown, наприклад, «login» буде показано жирним шрифтом (**login**), а «fancy» буде показано курсивом (_fancy_). /// tip | Порада @@ -76,7 +76,7 @@ /// info | Інформація -Детальніше про теги читайте в розділі [Конфігурація операції шляху](path-operation-configuration.md#tags){.internal-link target=_blank}. +Детальніше про теги читайте в розділі [Конфігурація операції шляху](path-operation-configuration.md#tags). /// diff --git a/docs/uk/docs/tutorial/middleware.md b/docs/uk/docs/tutorial/middleware.md index 961fb179e7..a31357ba10 100644 --- a/docs/uk/docs/tutorial/middleware.md +++ b/docs/uk/docs/tutorial/middleware.md @@ -15,7 +15,7 @@ Якщо у вас є залежності з `yield`, код виходу виконається *після* middleware. -Якщо були заплановані фонові задачі (розглянуто в розділі [Background Tasks](background-tasks.md){.internal-link target=_blank}, ви побачите це пізніше), вони виконаються *після* всіх middleware. +Якщо були заплановані фонові задачі (розглянуто в розділі [Фонові задачі](background-tasks.md), ви побачите це пізніше), вони виконаються *після* всіх middleware. /// @@ -35,9 +35,9 @@ /// tip -Пам’ятайте, що власні пропрієтарні заголовки можна додавати використовуючи префікс `X-`. +Пам’ятайте, що власні пропрієтарні заголовки можна додавати [використовуючи префікс `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers). -Але якщо у вас є власні заголовки, які ви хочете, щоб клієнт у браузері міг побачити, потрібно додати їх до ваших конфігурацій CORS ([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank}) за допомогою параметра `expose_headers`, описаного в документації Starlette по CORS. +Але якщо у вас є власні заголовки, які ви хочете, щоб клієнт у браузері міг побачити, потрібно додати їх до ваших конфігурацій CORS ([CORS (Спільне використання ресурсів між джерелами)](cors.md)) за допомогою параметра `expose_headers`, описаного в [документації Starlette по CORS](https://www.starlette.dev/middleware/#corsmiddleware). /// @@ -61,7 +61,7 @@ /// tip -Тут ми використовуємо `time.perf_counter()` замість `time.time()` оскільки він може бути більш точним для таких випадків. 🤓 +Тут ми використовуємо [`time.perf_counter()`](https://docs.python.org/3/library/time.html#time.perf_counter) замість `time.time()` оскільки він може бути більш точним для таких випадків. 🤓 /// @@ -90,6 +90,6 @@ app.add_middleware(MiddlewareB) ## Інші middlewares { #other-middlewares } -Ви можете пізніше прочитати більше про інші middlewares в [Advanced User Guide: Advanced Middleware](../advanced/middleware.md){.internal-link target=_blank}. +Ви можете пізніше прочитати більше про інші middlewares у [просунутому посібнику користувача: просунуте middleware](../advanced/middleware.md). Ви дізнаєтесь, як обробляти CORS за допомогою middleware в наступному розділі. diff --git a/docs/uk/docs/tutorial/path-operation-configuration.md b/docs/uk/docs/tutorial/path-operation-configuration.md index 91b58b24ec..292066c1f8 100644 --- a/docs/uk/docs/tutorial/path-operation-configuration.md +++ b/docs/uk/docs/tutorial/path-operation-configuration.md @@ -58,7 +58,7 @@ FastAPI підтримує це так само, як і зі звичайним Оскільки описи зазвичай довгі та займають кілька рядків, ви можете оголосити опис «операції шляху» у строці документації функції, і FastAPI прочитає його звідти. -Ви можете писати Markdown у строці документації, його буде інтерпретовано та показано коректно (з урахуванням відступів у строці документації). +Ви можете писати [Markdown](https://en.wikipedia.org/wiki/Markdown) у строці документації, його буде інтерпретовано та показано коректно (з урахуванням відступів у строці документації). {* ../../docs_src/path_operation_configuration/tutorial004_py310.py hl[17:25] *} diff --git a/docs/uk/docs/tutorial/path-params-numeric-validations.md b/docs/uk/docs/tutorial/path-params-numeric-validations.md index 9458436fd3..39397a3b1d 100644 --- a/docs/uk/docs/tutorial/path-params-numeric-validations.md +++ b/docs/uk/docs/tutorial/path-params-numeric-validations.md @@ -14,7 +14,7 @@ FastAPI додав підтримку `Annotated` (і почав рекомен Якщо у вас стара версія, при спробі використати `Annotated` можуть виникати помилки. -Переконайтеся, що ви [оновили версію FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} принаймні до версії 0.95.1 перед використанням `Annotated`. +Переконайтеся, що ви [оновили версію FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions) принаймні до версії 0.95.1 перед використанням `Annotated`. /// @@ -122,7 +122,7 @@ Python нічого не зробить із цією `*`, але розпізн ## Підсумок { #recap } -За допомогою `Query`, `Path` (і інших параметрів, які ви ще не бачили) можна оголошувати метадані та перевірки рядків так само як у [Query параметри та валідація рядків](query-params-str-validations.md){.internal-link target=_blank}. +За допомогою `Query`, `Path` (і інших параметрів, які ви ще не бачили) можна оголошувати метадані та перевірки рядків так само як у [Query параметри та валідація рядків](query-params-str-validations.md). Також можна оголошувати числові перевірки: diff --git a/docs/uk/docs/tutorial/path-params.md b/docs/uk/docs/tutorial/path-params.md index 17b99cf39a..eb05a4412f 100644 --- a/docs/uk/docs/tutorial/path-params.md +++ b/docs/uk/docs/tutorial/path-params.md @@ -6,7 +6,7 @@ Значення параметра шляху `item_id` буде передано у вашу функцію як аргумент `item_id`. -Отже, якщо ви запустите цей приклад і перейдете за посиланням http://127.0.0.1:8000/items/foo, то побачите відповідь: +Отже, якщо ви запустите цей приклад і перейдете за посиланням [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo), то побачите відповідь: ```JSON {"item_id":"foo"} @@ -28,7 +28,7 @@ ## Перетворення даних { #data-conversion } -Якщо ви запустите цей приклад і відкриєте у браузері http://127.0.0.1:8000/items/3, то побачите відповідь: +Якщо ви запустите цей приклад і відкриєте у браузері [http://127.0.0.1:8000/items/3](http://127.0.0.1:8000/items/3), то побачите відповідь: ```JSON {"item_id":3} @@ -44,7 +44,7 @@ ## Валідація даних { #data-validation } -Але якщо ви перейдете у браузері за посиланням http://127.0.0.1:8000/items/foo, ви побачите гарну HTTP-помилку: +Але якщо ви перейдете у браузері за посиланням [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo), ви побачите гарну HTTP-помилку: ```JSON { @@ -64,7 +64,7 @@ тому що параметр шляху `item_id` мав значення `"foo"`, яке не є `int`. -Та сама помилка з’явиться, якщо ви передасте `float` замість `int`, як у: http://127.0.0.1:8000/items/4.2 +Та сама помилка з’явиться, якщо ви передасте `float` замість `int`, як у: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2) /// check | Перевірте @@ -78,7 +78,7 @@ ## Документація { #documentation } -А коли ви відкриєте у браузері http://127.0.0.1:8000/docs, ви побачите автоматичну, інтерактивну, API-документацію на кшталт: +А коли ви відкриєте у браузері [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs), ви побачите автоматичну, інтерактивну, API-документацію на кшталт: @@ -92,9 +92,9 @@ ## Переваги стандартів, альтернативна документація { #standards-based-benefits-alternative-documentation } -І оскільки згенерована схема відповідає стандарту OpenAPI, існує багато сумісних інструментів. +І оскільки згенерована схема відповідає стандарту [OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md), існує багато сумісних інструментів. -Через це **FastAPI** також надає альтернативну API-документацію (використовуючи ReDoc), до якої ви можете отримати доступ за посиланням http://127.0.0.1:8000/redoc: +Через це **FastAPI** також надає альтернативну API-документацію (використовуючи ReDoc), до якої ви можете отримати доступ за посиланням [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc): @@ -102,7 +102,7 @@ ## Pydantic { #pydantic } -Уся валідація даних виконується за лаштунками за допомогою Pydantic, тож ви отримуєте всі переваги від його використання. І ви знаєте, що ви в надійних руках. +Уся валідація даних виконується за лаштунками за допомогою [Pydantic](https://docs.pydantic.dev/), тож ви отримуєте всі переваги від його використання. І ви знаєте, що ви в надійних руках. Ви можете використовувати ті самі оголошення типів з `str`, `float`, `bool` та багатьма іншими складними типами даних. diff --git a/docs/uk/docs/tutorial/query-params-str-validations.md b/docs/uk/docs/tutorial/query-params-str-validations.md index 706dc670aa..afe86d482b 100644 --- a/docs/uk/docs/tutorial/query-params-str-validations.md +++ b/docs/uk/docs/tutorial/query-params-str-validations.md @@ -35,13 +35,13 @@ FastAPI додав підтримку `Annotated` (і почав рекомен Якщо у вас старіша версія, під час використання `Annotated` можуть виникати помилки. -Переконайтеся, що ви [оновили версію FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} до принаймні 0.95.1, перш ніж використовувати `Annotated`. +Переконайтеся, що ви [оновили версію FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions) до принаймні 0.95.1, перш ніж використовувати `Annotated`. /// ## Використання `Annotated` у типі параметра `q` { #use-annotated-in-the-type-for-the-q-parameter } -Пам’ятаєте, як я раніше розповідав, що `Annotated` можна використовувати для додавання метаданих до параметрів у [Вступі до типів Python](../python-types.md#type-hints-with-metadata-annotations){.internal-link target=_blank}? +Пам’ятаєте, як я раніше розповідав, що `Annotated` можна використовувати для додавання метаданих до параметрів у [Вступі до типів Python](../python-types.md#type-hints-with-metadata-annotations)? Зараз саме час використати його разом із FastAPI. 🚀 @@ -157,7 +157,7 @@ q: str = Query(default="rick") Якщо ви не використовуєте `Annotated`, а використовуєте (старий) стиль значень за замовчуванням, то при виклику цієї функції без FastAPI в інших місцях потрібно пам’ятати передати їй аргументи, щоб вона працювала коректно, інакше значення будуть відрізнятися від очікуваних (наприклад, ви отримаєте `QueryInfo` або щось подібне замість `str`). І ваш редактор не повідомить про помилку, і Python не скаржитиметься під час запуску цієї функції — лише коли операції всередині завершаться помилкою. -Оскільки `Annotated` може містити кілька анотацій метаданих, тепер ви навіть можете використовувати ту саму функцію з іншими інструментами, такими як Typer. 🚀 +Оскільки `Annotated` може містити кілька анотацій метаданих, тепер ви навіть можете використовувати ту саму функцію з іншими інструментами, такими як [Typer](https://typer.tiangolo.com/). 🚀 ## Додавання додаткових валідацій { #add-more-validations } @@ -223,7 +223,7 @@ q: Annotated[str | None, Query(min_length=3)] = None Ви можете вказати, що параметр може приймати `None`, але при цьому залишається обов’язковим. Це змусить клієнтів надіслати значення, навіть якщо значення дорівнює `None`. -Щоб зробити це, оголосіть, що `None` є допустимим типом, але просто не вказуйте значення за замовчуванням: +Щоб зробити це, оголосіть, що `None` є допустимим типом, але просто не вкажіть значення за замовчуванням: {* ../../docs_src/query_params_str_validations/tutorial006c_an_py310.py hl[9] *} @@ -369,11 +369,11 @@ http://127.0.0.1:8000/items/?item-query=foobaritems У таких випадках ви можете використати кастомну функцію-валідатор, яка буде застосована після звичайної валідації (наприклад, після перевірки, що значення є типом `str`). -Це можна досягти за допомогою Pydantic's `AfterValidator` в середині `Annotated`. +Це можна досягти за допомогою [Pydantic's `AfterValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) в середині `Annotated`. /// tip | Порада -Pydantic також має `BeforeValidator` та інші. 🤓 +Pydantic також має [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-before-validator) та інші. 🤓 /// diff --git a/docs/uk/docs/tutorial/query-params.md b/docs/uk/docs/tutorial/query-params.md index 4888f4c461..b665a620e5 100644 --- a/docs/uk/docs/tutorial/query-params.md +++ b/docs/uk/docs/tutorial/query-params.md @@ -183,6 +183,6 @@ http://127.0.0.1:8000/items/foo-item?needy=sooooneedy /// tip | Порада -Ви також можете використовувати `Enum` так само, як і з [Параметри шляху](path-params.md#predefined-values){.internal-link target=_blank}. +Ви також можете використовувати `Enum` так само, як і з [Параметри шляху](path-params.md#predefined-values). /// diff --git a/docs/uk/docs/tutorial/request-files.md b/docs/uk/docs/tutorial/request-files.md index 8e64b12c38..f81e468d0d 100644 --- a/docs/uk/docs/tutorial/request-files.md +++ b/docs/uk/docs/tutorial/request-files.md @@ -4,9 +4,9 @@ /// info | Інформація -Щоб отримувати завантажені файли, спочатку встановіть `python-multipart`. +Щоб отримувати завантажені файли, спочатку встановіть [`python-multipart`](https://github.com/Kludex/python-multipart). -Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його, а потім встановили пакет, наприклад: +Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його, а потім встановили його, наприклад: ```console $ pip install python-multipart @@ -63,8 +63,8 @@ $ pip install python-multipart * Файл зберігається в пам'яті до досягнення максимального обмеження розміру, після чого він буде збережений на диску. * Це означає, що він добре працюватиме для великих файлів, таких як зображення, відео, великі двійкові файли тощо, не споживаючи всю пам'ять. * Ви можете отримати метадані про завантажений файл. -* Він має file-like `async` інтерфейс. -* Він надає фактичний об'єкт Python `SpooledTemporaryFile`, який можна передавати безпосередньо іншим бібліотекам, що очікують file-like об'єкт. +* Він має [file-like](https://docs.python.org/3/glossary.html#term-file-like-object) `async` інтерфейс. +* Він надає фактичний об'єкт Python [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile), який можна передавати безпосередньо іншим бібліотекам, що очікують file-like об'єкт. ### `UploadFile` { #uploadfile } @@ -72,7 +72,7 @@ $ pip install python-multipart * `filename`: Рядок `str` з оригінальною назвою файлу, який був завантажений (наприклад, `myimage.jpg`). * `content_type`: Рядок `str` з типом вмісту (MIME type / media type) (наприклад, `image/jpeg`). -* `file`: `SpooledTemporaryFile` (file-like об'єкт). Це фактичний файловий об'єкт Python, який ви можете передавати безпосередньо іншим функціям або бібліотекам, що очікують «file-like» об'єкт. +* `file`: [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) ([file-like](https://docs.python.org/3/glossary.html#term-file-like-object) об'єкт). Це фактичний файловий об'єкт Python, який ви можете передавати безпосередньо іншим функціям або бібліотекам, що очікують «file-like» об'єкт. `UploadFile` має такі асинхронні `async` методи. Вони всі викликають відповідні методи файлу під капотом (використовуючи внутрішній `SpooledTemporaryFile`). @@ -121,7 +121,7 @@ contents = myfile.file.read() Але якщо форма містить файли, вона кодується як `multipart/form-data`. Якщо ви використовуєте `File`, **FastAPI** знатиме, що потрібно отримати файли з правильної частини тіла. -Якщо ви хочете дізнатися більше про ці типи кодування та формові поля, ознайомтеся з MDN web docs для POST. +Якщо ви хочете дізнатися більше про ці типи кодування та формові поля, ознайомтеся з [MDN web docs для `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST). /// diff --git a/docs/uk/docs/tutorial/request-form-models.md b/docs/uk/docs/tutorial/request-form-models.md index 86510be589..6f785016da 100644 --- a/docs/uk/docs/tutorial/request-form-models.md +++ b/docs/uk/docs/tutorial/request-form-models.md @@ -2,11 +2,11 @@ У FastAPI ви можете використовувати **Pydantic-моделі** для оголошення **полів форми**. -/// info | Інформація +/// info -Щоб використовувати форми, спочатку встановіть `python-multipart`. +Щоб використовувати форми, спочатку встановіть [`python-multipart`](https://github.com/Kludex/python-multipart). -Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його, а потім встановили його, наприклад: +Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його, а потім встановили його, наприклад: ```console $ pip install python-multipart @@ -14,7 +14,7 @@ $ pip install python-multipart /// -/// note | Примітка +/// note Це підтримується, починаючи з FastAPI версії `0.113.0`. 🤓 @@ -40,7 +40,7 @@ $ pip install python-multipart У деяких особливих випадках (ймовірно, не дуже поширених) ви можете **обмежити** поля форми лише тими, які були оголошені в Pydantic-моделі. І **заборонити** будь-які **додаткові** поля. -/// note | Примітка +/// note Це підтримується, починаючи з FastAPI версії `0.114.0`. 🤓 diff --git a/docs/uk/docs/tutorial/request-forms-and-files.md b/docs/uk/docs/tutorial/request-forms-and-files.md index 817769b714..c6d2548084 100644 --- a/docs/uk/docs/tutorial/request-forms-and-files.md +++ b/docs/uk/docs/tutorial/request-forms-and-files.md @@ -4,9 +4,9 @@ /// info | Інформація -Щоб отримувати завантажені файли та/або дані форми, спочатку встановіть `python-multipart`. +Щоб отримувати завантажені файли та/або дані форми, спочатку встановіть [`python-multipart`](https://github.com/Kludex/python-multipart). -Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його, а потім встановили бібліотеку, наприклад: +Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його, а потім встановили бібліотеку, наприклад: ```console $ pip install python-multipart diff --git a/docs/uk/docs/tutorial/request-forms.md b/docs/uk/docs/tutorial/request-forms.md index 7f0c6e9bb3..d02b85068b 100644 --- a/docs/uk/docs/tutorial/request-forms.md +++ b/docs/uk/docs/tutorial/request-forms.md @@ -4,9 +4,9 @@ /// info | Інформація -Щоб використовувати форми, спочатку встановіть `python-multipart`. +Щоб використовувати форми, спочатку встановіть [`python-multipart`](https://github.com/Kludex/python-multipart). -Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його, і потім встановили бібліотеку, наприклад: +Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його, і потім встановили бібліотеку, наприклад: ```console $ pip install python-multipart @@ -56,7 +56,7 @@ HTML-форми (`
`) надсилають дані на серве Але якщо форма містить файли, вона кодується як `multipart/form-data`. Ви дізнаєтеся про обробку файлів у наступному розділі. -Якщо ви хочете дізнатися більше про ці кодування та поля форм, зверніться до MDN вебдокументації для POST. +Якщо ви хочете дізнатися більше про ці кодування та поля форм, зверніться до [MDN вебдокументації для `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST). /// diff --git a/docs/uk/docs/tutorial/response-model.md b/docs/uk/docs/tutorial/response-model.md index fcf765c9da..86f12bff44 100644 --- a/docs/uk/docs/tutorial/response-model.md +++ b/docs/uk/docs/tutorial/response-model.md @@ -13,6 +13,7 @@ FastAPI використовуватиме цей тип повернення, * Додати **JSON Schema** для відповіді в OpenAPI *операції шляху*. * Це буде використано в **автоматичній документації**. * Це також буде використано інструментами, які автоматично генерують клієнтський код. +* **Серіалізувати** повернені дані в JSON за допомогою Pydantic, який написаний мовою **Rust**, тому це буде **набагато швидше**. Але найголовніше: @@ -73,9 +74,9 @@ FastAPI використовуватиме цей `response_model` для вик /// info | Інформація -Щоб використовувати `EmailStr`, спочатку встановіть `email-validator`. +Щоб використовувати `EmailStr`, спочатку встановіть [`email-validator`](https://github.com/JoshData/python-email-validator). -Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його, а потім встановили пакет, наприклад: +Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його, а потім встановили пакет, наприклад: ```console $ pip install email-validator @@ -101,7 +102,7 @@ $ pip install "pydantic[email]" /// danger | Обережно -Ніколи не зберігайте пароль користувача у відкритому вигляді та не надсилайте його у відповіді таким чином, якщо тільки ви не знаєте всіх застережень і точно розумієте, що робите. +Ніколи не зберігайте пароль користувача у відкритому вигляді та не надсилайте його у відповіді таким чином, якщо тільки ви не знаєте всі застереження і точно розумієте, що робите. /// @@ -181,7 +182,7 @@ FastAPI виконує кілька внутрішніх операцій з Pyd ### Повернути Response напряму { #return-a-response-directly } -Найпоширенішим випадком буде [повернення Response напряму, як пояснюється пізніше у розширеній документації](../advanced/response-directly.md){.internal-link target=_blank}. +Найпоширенішим випадком буде [повернення Response напряму, як пояснюється пізніше у розширеній документації](../advanced/response-directly.md). {* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *} @@ -257,7 +258,7 @@ FastAPI виконує кілька внутрішніх операцій з Pyd * `response_model_exclude_defaults=True` * `response_model_exclude_none=True` -як описано в документації Pydantic для `exclude_defaults` та `exclude_none`. +як описано в [документації Pydantic](https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict) для `exclude_defaults` та `exclude_none`. /// diff --git a/docs/uk/docs/tutorial/response-status-code.md b/docs/uk/docs/tutorial/response-status-code.md index c9ceb8f508..d453510f92 100644 --- a/docs/uk/docs/tutorial/response-status-code.md +++ b/docs/uk/docs/tutorial/response-status-code.md @@ -20,7 +20,7 @@ /// info | Інформація -`status_code` також може, як альтернативу, приймати `IntEnum`, наприклад, Python `http.HTTPStatus`. +`status_code` також може, як альтернативу, приймати `IntEnum`, наприклад, Python [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus). /// @@ -66,7 +66,7 @@ FastAPI знає про це і створить документацію OpenAP /// tip | Порада -Щоб дізнатися більше про кожен код статусу і для чого призначений кожен із них, перегляньте документацію MDN про HTTP коди статусу. +Щоб дізнатися більше про кожен код статусу і для чого призначений кожен із них, перегляньте [документацію MDN про HTTP коди статусу](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status). /// @@ -98,4 +98,4 @@ FastAPI знає про це і створить документацію OpenAP ## Зміна значення за замовчуванням { #changing-the-default } -Пізніше, у [Посібнику для досвідчених користувачів](../advanced/response-change-status-code.md){.internal-link target=_blank}, ви побачите, як повертати інший код статусу, ніж значення за замовчуванням, яке ви оголошуєте тут. +Пізніше, у [Просунутому посібнику користувача](../advanced/response-change-status-code.md), ви побачите, як повертати інший код статусу, ніж значення за замовчуванням, яке ви оголошуєте тут. diff --git a/docs/uk/docs/tutorial/schema-extra-example.md b/docs/uk/docs/tutorial/schema-extra-example.md index 38ce0eb303..742871e394 100644 --- a/docs/uk/docs/tutorial/schema-extra-example.md +++ b/docs/uk/docs/tutorial/schema-extra-example.md @@ -1,34 +1,34 @@ # Декларування прикладів вхідних даних { #declare-request-example-data } -Ви можете задати приклади даних, які Ваш застосунок може отримувати. +Ви можете задати приклади даних, які ваш застосунок може отримувати. Ось кілька способів, як це зробити. -## Додаткові дані JSON-схеми в моделях Pydantic { #extra-json-schema-data-in-pydantic-models } +## Додаткові дані Схеми JSON у моделях Pydantic { #extra-json-schema-data-in-pydantic-models } -Ви можете задати `examples` для моделі Pydantic, які буде додано до згенерованої JSON-схеми. +Ви можете задати `examples` для моделі Pydantic, які буде додано до згенерованої Схеми JSON. {* ../../docs_src/schema_extra_example/tutorial001_py310.py hl[13:24] *} -Ця додаткова інформація буде додана як є до **JSON-схеми** для цієї моделі, і вона буде використана в документації до API. +Ця додаткова інформація буде додана як є до **Схеми JSON** для цієї моделі, і вона буде використана в документації до API. -Ви можете використати атрибут `model_config`, який приймає `dict`, як описано в документації Pydantic: Configuration. +Ви можете використати атрибут `model_config`, який приймає `dict`, як описано в [документації Pydantic: Configuration](https://docs.pydantic.dev/latest/api/config/). -Ви можете встановити `"json_schema_extra"` як `dict`, що містить будь-які додаткові дані, які Ви хочете відобразити у згенерованій JSON-схемі, включаючи `examples`. +Ви можете встановити `"json_schema_extra"` як `dict`, що містить будь-які додаткові дані, які ви хочете відобразити у згенерованій Схемі JSON, включаючи `examples`. /// tip | Порада -Ви можете використати ту ж техніку, щоб розширити JSON-схему і додати власну додаткову інформацію. +Ви можете використати ту ж техніку, щоб розширити Схему JSON і додати власну додаткову інформацію. -Наприклад, Ви можете використати її для додавання метаданих для інтерфейсу користувача на фронтенді тощо. +Наприклад, ви можете використати її для додавання метаданих для інтерфейсу користувача на фронтенді тощо. /// /// info | Інформація -OpenAPI 3.1.0 (який використовується починаючи з FastAPI 0.99.0) додав підтримку `examples`, що є частиною стандарту **JSON-схеми**. +OpenAPI 3.1.0 (який використовується починаючи з FastAPI 0.99.0) додав підтримку `examples`, що є частиною стандарту **Схеми JSON**. -До цього підтримувався лише ключ `example` з одним прикладом. Він все ще підтримується в OpenAPI 3.1.0, але є застарілим і не входить до стандарту JSON Schema. Тому рекомендується перейти з `example` на `examples`. 🤓 +До цього підтримувався лише ключ `example` з одним прикладом. Він все ще підтримується в OpenAPI 3.1.0, але є застарілим і не входить до стандарту Схеми JSON. Тому рекомендується перейти з `example` на `examples`. 🤓 Більше про це можна прочитати в кінці цієї сторінки. @@ -36,11 +36,11 @@ OpenAPI 3.1.0 (який використовується починаючи з F ## Додаткові аргументи `Field` { #field-additional-arguments } -Коли ви використовуєте `Field()` у моделях Pydantic, Ви також можете вказати додаткові `examples`: +Коли ви використовуєте `Field()` у моделях Pydantic, ви також можете вказати додаткові `examples`: {* ../../docs_src/schema_extra_example/tutorial002_py310.py hl[2,8:11] *} -## `examples` у JSON-схемі - OpenAPI { #examples-in-json-schema-openapi } +## `examples` у Схемі JSON - OpenAPI { #examples-in-json-schema-openapi } При використанні будь-кого з наступного: @@ -52,7 +52,7 @@ OpenAPI 3.1.0 (який використовується починаючи з F * `Form()` * `File()` -Ви також можете задати набір `examples` з додатковою інформацією, яка буде додана до їхніх **JSON-схем** у **OpenAPI**. +ви також можете задати набір `examples` з додатковою інформацією, яка буде додана до їхніх **Схем JSON** у **OpenAPI**. ### `Body` з `examples` { #body-with-examples } @@ -68,25 +68,25 @@ OpenAPI 3.1.0 (який використовується починаючи з F ### `Body` з кількома `examples` { #body-with-multiple-examples } -Звичайно, Ви також можете передати кілька `examples`: +Звичайно, ви також можете передати кілька `examples`: {* ../../docs_src/schema_extra_example/tutorial004_an_py310.py hl[23:38] *} -Коли Ви це робите, приклади будуть частиною внутрішньої **JSON-схеми** для цих даних тіла. +Коли ви це робите, приклади будуть частиною внутрішньої **Схеми JSON** для цих даних тіла. -Втім, на час написання цього, Swagger UI — інструмент, який відповідає за відображення UI документації — не підтримує показ кількох прикладів для даних у **JSON-схемі**. Але нижче можна прочитати про обхідний шлях. +Втім, на час написання цього, Swagger UI - інструмент, який відповідає за відображення UI документації - не підтримує показ кількох прикладів для даних у **Схемі JSON**. Але нижче можна прочитати про обхідний шлях. ### Специфічні для OpenAPI `examples` { #openapi-specific-examples } -Ще до того, як **JSON-схема** почала підтримувати `examples`, OpenAPI вже мала підтримку іншого поля, яке також називається `examples`. +Ще до того, як **Схема JSON** почала підтримувати `examples`, OpenAPI вже мала підтримку іншого поля, яке також називається `examples`. -Це **специфічне для OpenAPI** поле `examples` розміщується в іншому розділі специфікації OpenAPI. Воно розміщується в **деталях кожної *операції шляху***, а не всередині кожної JSON-схеми. +Це **специфічне для OpenAPI** поле `examples` розміщується в іншому розділі специфікації OpenAPI. Воно розміщується в **деталях кожної *операції шляху***, а не всередині кожної Схеми JSON. -І Swagger UI вже давно підтримує це поле `examples`. Тому Ви можете використовувати його, щоб **відображати** різні **приклади в UI документації**. +І Swagger UI вже давно підтримує це поле `examples`. Тому ви можете використовувати його, щоб **відображати** різні **приклади в UI документації**. -Форма цього специфічного для OpenAPI поля `examples` — це `dict` з **кількома прикладами** (а не `list`), кожен із яких має додаткову інформацію, яка також буде додана до **OpenAPI**. +Форма цього специфічного для OpenAPI поля `examples` - це `dict` з **кількома прикладами** (а не `list`), кожен із яких має додаткову інформацію, яка також буде додана до **OpenAPI**. -Воно не включається всередину кожної JSON-схеми, що міститься в OpenAPI, воно розміщується зовні, безпосередньо в *операції шляху*. +Воно не включається всередину кожної Схеми JSON, що міститься в OpenAPI, воно розміщується зовні, безпосередньо в *операції шляху*. ### Використання параметра `openapi_examples` { #using-the-openapi-examples-parameter } @@ -100,7 +100,7 @@ OpenAPI 3.1.0 (який використовується починаючи з F * `Form()` * `File()` -Ключі `dict` ідентифікують кожен приклад, а кожне значення — це інший `dict`. +Ключі `dict` ідентифікують кожен приклад, а кожне значення - це інший `dict`. Кожен специфічний `dict` прикладу в `examples` може містити: @@ -123,34 +123,34 @@ OpenAPI 3.1.0 (який використовується починаючи з F /// tip | Порада -Якщо Ви вже використовуєте **FastAPI** версії **0.99.0 або вище**, Ви, ймовірно, можете **пропустити** ці технічні деталі. +Якщо ви вже використовуєте **FastAPI** версії **0.99.0 або вище**, ви, ймовірно, можете **пропустити** ці технічні деталі. Вони більш актуальні для старих версій, до появи OpenAPI 3.1.0. -Можна вважати це коротким **історичним екскурсом** у OpenAPI та JSON Schema. 🤓 +Можна вважати це коротким **історичним екскурсом** у OpenAPI та Схему JSON. 🤓 /// /// warning | Попередження -Це дуже технічна інформація про стандарти **JSON Schema** і **OpenAPI**. +Це дуже технічна інформація про стандарти **Схема JSON** і **OpenAPI**. -Якщо вищезгадані ідеї вже працюють у Вас, цього може бути достатньо, і Вам, ймовірно, не потрібні ці деталі — можете пропустити. +Якщо вищезгадані ідеї вже працюють у вас, цього може бути достатньо, і вам, ймовірно, не потрібні ці деталі - можете пропустити. /// -До OpenAPI 3.1.0 OpenAPI використовував стару та модифіковану версію **JSON Schema**. +До OpenAPI 3.1.0 OpenAPI використовував стару та модифіковану версію **Схеми JSON**. -JSON Schema не мала `examples`, тож OpenAPI додала власне поле `example` до своєї модифікованої версії. +Схема JSON не мала `examples`, тож OpenAPI додала власне поле `example` до своєї модифікованої версії. OpenAPI також додала поля `example` і `examples` до інших частин специфікації: -* `Parameter Object` (в специфікації), який використовувався утилітами FastAPI: +* [`Parameter Object` (у специфікації)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#parameter-object), який використовувався утилітами FastAPI: * `Path()` * `Query()` * `Header()` * `Cookie()` -* `Request Body Object`, у полі `content`, у `Media Type Object` (в специфікації), який використовувався утилітами FastAPI: +* [`Request Body Object`, у полі `content`, у `Media Type Object` (у специфікації)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object), який використовувався утилітами FastAPI: * `Body()` * `File()` * `Form()` @@ -161,19 +161,19 @@ OpenAPI також додала поля `example` і `examples` до інших /// -### Поле `examples` у JSON Schema { #json-schemas-examples-field } +### Поле `examples` у Схемі JSON { #json-schemas-examples-field } -Пізніше JSON Schema додала поле `examples` у нову версію специфікації. +Пізніше Схема JSON додала поле [`examples`](https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.9.5) у нову версію специфікації. А потім новий OpenAPI 3.1.0 базувався на найновішій версії (JSON Schema 2020-12), яка включала це нове поле `examples`. І тепер це нове поле `examples` має вищий пріоритет за старе одиночне (і кастомне) поле `example`, яке тепер є застарілим. -Це нове поле `examples` у JSON Schema — це **просто `list`** прикладів, а не `dict` з додатковими метаданими, як в інших місцях OpenAPI (описаних вище). +Це нове поле `examples` у Схемі JSON - це **просто `list`** прикладів, а не `dict` з додатковими метаданими, як в інших місцях OpenAPI (описаних вище). /// info | Інформація -Навіть після релізу OpenAPI 3.1.0 з цією новою простішою інтеграцією з JSON Schema, протягом певного часу Swagger UI, інструмент, який надає автоматичну документацію, не підтримував OpenAPI 3.1.0 (тепер підтримує, починаючи з версії 5.0.0 🎉). +Навіть після релізу OpenAPI 3.1.0 з цією новою простішою інтеграцією зі Схемою JSON, протягом певного часу Swagger UI, інструмент, який надає автоматичну документацію, не підтримував OpenAPI 3.1.0 (тепер підтримує, починаючи з версії 5.0.0 🎉). Через це версії FastAPI до 0.99.0 все ще використовували версії OpenAPI нижчі за 3.1.0. @@ -181,22 +181,22 @@ OpenAPI також додала поля `example` і `examples` до інших ### `examples` у Pydantic і FastAPI { #pydantic-and-fastapi-examples } -Коли Ви додаєте `examples` у модель Pydantic через `schema_extra` або `Field(examples=["something"])`, цей приклад додається до **JSON Schema** для цієї моделі Pydantic. +Коли ви додаєте `examples` у модель Pydantic через `schema_extra` або `Field(examples=["something"])`, цей приклад додається до **Схеми JSON** для цієї моделі Pydantic. -І ця **JSON Schema** Pydantic-моделі включається до **OpenAPI** Вашого API, а потім використовується в UI документації. +І ця **Схема JSON** Pydantic-моделі включається до **OpenAPI** вашого API, а потім використовується в UI документації. -У версіях FastAPI до 0.99.0 (0.99.0 і вище використовують новіший OpenAPI 3.1.0), коли Ви використовували `example` або `examples` з будь-якими іншими утилітами (`Query()`, `Body()` тощо), ці приклади не додавалися до JSON Schema, що описує ці дані (навіть не до власної версії JSON Schema в OpenAPI), натомість вони додавалися безпосередньо до декларації *операції шляху* в OpenAPI (поза межами частин OpenAPI, які використовують JSON Schema). +У версіях FastAPI до 0.99.0 (0.99.0 і вище використовують новіший OpenAPI 3.1.0), коли ви використовували `example` або `examples` з будь-якими іншими утилітами (`Query()`, `Body()` тощо), ці приклади не додавалися до Схеми JSON, що описує ці дані (навіть не до власної версії Схеми JSON в OpenAPI), натомість вони додавалися безпосередньо до декларації *операції шляху* в OpenAPI (поза межами частин OpenAPI, які використовують Схему JSON). -Але тепер, коли FastAPI 0.99.0 і вище використовує OpenAPI 3.1.0, який використовує JSON Schema 2020-12, і Swagger UI 5.0.0 і вище, все стало більш узгодженим, і приклади включаються до JSON Schema. +Але тепер, коли FastAPI 0.99.0 і вище використовує OpenAPI 3.1.0, який використовує JSON Schema 2020-12, і Swagger UI 5.0.0 і вище, все стало більш узгодженим, і приклади включаються до Схеми JSON. ### Swagger UI та специфічні для OpenAPI `examples` { #swagger-ui-and-openapi-specific-examples } -Оскільки Swagger UI не підтримував кілька прикладів JSON Schema (станом на 2023-08-26), користувачі не мали можливості показати кілька прикладів у документації. +Оскільки Swagger UI не підтримував кілька прикладів Схеми JSON (станом на 2023-08-26), користувачі не мали можливості показати кілька прикладів у документації. Щоб вирішити це, FastAPI `0.103.0` **додав підтримку** оголошення того самого старого **OpenAPI-специфічного** поля `examples` через новий параметр `openapi_examples`. 🤓 ### Підсумок { #summary } -Раніше я казав, що не дуже люблю історію... а тепер подивіться на мене — читаю «технічні історичні» лекції. 😅 +Раніше я казав, що не дуже люблю історію... а тепер подивіться на мене - читаю «технічні історичні» лекції. 😅 -Коротко: **оновіться до FastAPI 0.99.0 або вище** — і все стане значно **простішим, узгодженим та інтуїтивно зрозумілим**, і Вам не доведеться знати всі ці історичні деталі. 😎 +Коротко: **оновіться до FastAPI 0.99.0 або вище** - і все стане значно **простішим, узгодженим та інтуїтивно зрозумілим**, і вам не доведеться знати всі ці історичні деталі. 😎 diff --git a/docs/uk/docs/tutorial/security/first-steps.md b/docs/uk/docs/tutorial/security/first-steps.md index 491328d865..bfe1962234 100644 --- a/docs/uk/docs/tutorial/security/first-steps.md +++ b/docs/uk/docs/tutorial/security/first-steps.md @@ -26,11 +26,11 @@ /// info | Інформація -Пакет `python-multipart` автоматично встановлюється з **FastAPI**, коли ви виконуєте команду `pip install "fastapi[standard]"`. +Пакет [`python-multipart`](https://github.com/Kludex/python-multipart) автоматично встановлюється з **FastAPI**, коли ви виконуєте команду `pip install "fastapi[standard]"`. Однак, якщо ви використовуєте команду `pip install fastapi`, пакет `python-multipart` за замовчуванням не включено. -Щоб встановити його вручну, переконайтеся, що ви створили [віртуальне оточення](../../virtual-environments.md){.internal-link target=_blank}, активували його, а потім встановили: +Щоб встановити його вручну, переконайтеся, що ви створили [віртуальне оточення](../../virtual-environments.md), активували його, а потім встановили: ```console $ pip install python-multipart @@ -45,7 +45,7 @@ $ pip install python-multipart
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -54,7 +54,7 @@ $ fastapi dev main.py ## Перевірте { #check-it } -Перейдіть до інтерактивної документації: http://127.0.0.1:8000/docs. +Перейдіть до інтерактивної документації: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Ви побачите щось подібне: @@ -140,7 +140,7 @@ OAuth2 був спроєктований так, щоб backend або API мо Тому, якщо ваш API розміщений на `https://example.com/`, це буде `https://example.com/token`. А якщо на `https://example.com/api/v1/`, тоді це буде `https://example.com/api/v1/token`. -Використання відносної URL-адреси важливе, щоб ваша програма продовжувала працювати навіть у просунутому сценарії, як-от [Behind a Proxy](../../advanced/behind-a-proxy.md){.internal-link target=_blank}. +Використання відносної URL-адреси важливе, щоб ваша програма продовжувала працювати навіть у просунутому сценарії, як-от [За представником](../../advanced/behind-a-proxy.md). /// diff --git a/docs/uk/docs/tutorial/security/oauth2-jwt.md b/docs/uk/docs/tutorial/security/oauth2-jwt.md index f94abb897b..64774af6d0 100644 --- a/docs/uk/docs/tutorial/security/oauth2-jwt.md +++ b/docs/uk/docs/tutorial/security/oauth2-jwt.md @@ -24,13 +24,13 @@ eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4 Через тиждень токен завершить термін дії, і користувач не буде авторизований та має знову увійти, щоб отримати новий токен. І якщо користувач (або третя сторона) намагатиметься змінити токен, щоб змінити термін дії, ви це виявите, бо підписи не співпадатимуть. -Якщо хочете «погратися» з токенами JWT і побачити, як вони працюють, перегляньте https://jwt.io. +Якщо хочете «погратися» з токенами JWT і побачити, як вони працюють, перегляньте [https://jwt.io](https://jwt.io/). ## Встановіть `PyJWT` { #install-pyjwt } Нам потрібно встановити `PyJWT`, щоб створювати та перевіряти токени JWT у Python. -Переконайтеся, що ви створили [віртуальне оточення](../../virtual-environments.md){.internal-link target=_blank}, активували його і тоді встановіть `pyjwt`: +Переконайтеся, що ви створили [віртуальне оточення](../../virtual-environments.md), активували його і тоді встановіть `pyjwt`:
@@ -46,7 +46,7 @@ $ pip install pyjwt Якщо ви плануєте використовувати алгоритми цифрового підпису на кшталт RSA або ECDSA, слід встановити залежність криптобібліотеки `pyjwt[crypto]`. -Докладніше про це можна прочитати у документації з встановлення PyJWT. +Докладніше про це можна прочитати у [документації з встановлення PyJWT](https://pyjwt.readthedocs.io/en/latest/installation.html). /// @@ -72,7 +72,7 @@ pwdlib - це чудовий пакет Python для роботи з хешам Рекомендований алгоритм - «Argon2». -Переконайтеся, що ви створили [віртуальне оточення](../../virtual-environments.md){.internal-link target=_blank}, активували його і тоді встановіть pwdlib з Argon2: +Переконайтеся, що ви створили [віртуальне оточення](../../virtual-environments.md), активували його і тоді встановіть pwdlib з Argon2:
@@ -200,7 +200,7 @@ JWT може використовуватися й для інших речей, ## Перевірте { #check-it } -Запустіть сервер і перейдіть до документації: http://127.0.0.1:8000/docs. +Запустіть сервер і перейдіть до документації: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Ви побачите такий інтерфейс користувача: diff --git a/docs/uk/docs/tutorial/security/simple-oauth2.md b/docs/uk/docs/tutorial/security/simple-oauth2.md index 05f949738d..7c83e4c2a7 100644 --- a/docs/uk/docs/tutorial/security/simple-oauth2.md +++ b/docs/uk/docs/tutorial/security/simple-oauth2.md @@ -146,7 +146,7 @@ UserInDB( /// info | Інформація -Для повнішого пояснення `**user_dict` перегляньте [документацію для **Додаткових моделей**](../extra-models.md#about-user-in-dict){.internal-link target=_blank}. +Для повнішого пояснення `**user_dict` перегляньте [документацію для **Додаткових моделей**](../extra-models.md#about-user-in-dict). /// @@ -216,7 +216,7 @@ UserInDB( ## Подивіться в дії { #see-it-in-action } -Відкрийте інтерактивну документацію: http://127.0.0.1:8000/docs. +Відкрийте інтерактивну документацію: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). ### Автентифікація { #authenticate } diff --git a/docs/uk/docs/tutorial/sql-databases.md b/docs/uk/docs/tutorial/sql-databases.md index 991d1e33aa..57b67226a0 100644 --- a/docs/uk/docs/tutorial/sql-databases.md +++ b/docs/uk/docs/tutorial/sql-databases.md @@ -2,9 +2,9 @@ **FastAPI** не вимагає від вас використовувати SQL (реляційну) базу даних. Але ви можете скористатися будь-якою базою даних, яку забажаєте. -Тут ми розглянемо приклад з SQLModel. +Тут ми розглянемо приклад з [SQLModel](https://sqlmodel.tiangolo.com/). -**SQLModel** побудовано поверх SQLAlchemy та Pydantic. Її створив той самий автор, що і **FastAPI**, як ідеальну пару для застосунків FastAPI, яким потрібні **SQL бази даних**. +**SQLModel** побудовано поверх [SQLAlchemy](https://www.sqlalchemy.org/) та Pydantic. Її створив той самий автор, що і **FastAPI**, як ідеальну пару для застосунків FastAPI, яким потрібні **SQL бази даних**. /// tip | Порада @@ -26,15 +26,15 @@ /// tip | Порада -Існує офіційний генератор проєкту з **FastAPI** та **PostgreSQL**, включно з фронтендом та іншими інструментами: https://github.com/fastapi/full-stack-fastapi-template +Існує офіційний генератор проєкту з **FastAPI** та **PostgreSQL**, включно з фронтендом та іншими інструментами: [https://github.com/fastapi/full-stack-fastapi-template](https://github.com/fastapi/full-stack-fastapi-template) /// -Це дуже простий і короткий навчальний посібник. Якщо ви хочете вивчити бази даних загалом, SQL або більш просунуті можливості, зверніться до документації SQLModel. +Це дуже простий і короткий навчальний посібник. Якщо ви хочете вивчити бази даних загалом, SQL або більш просунуті можливості, зверніться до [документації SQLModel](https://sqlmodel.tiangolo.com/). ## Встановіть `SQLModel` { #install-sqlmodel } -Спочатку переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md){.internal-link target=_blank}, активували його та встановили `sqlmodel`: +Спочатку переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md), активували його та встановили `sqlmodel`:
@@ -65,7 +65,7 @@ $ pip install sqlmodel * `Field(primary_key=True)` каже SQLModel, що `id` - це **первинний ключ** у SQL базі даних (більше про первинні ключі в SQL див. у документації SQLModel). - Примітка: Ми використовуємо `int | None` для поля первинного ключа, щоб у Python-коді можна було створити об’єкт без `id` (`id=None`), припускаючи, що база даних згенерує його під час збереження. SQLModel розуміє, що `id` надасть база даних, і визначає стовпець як ненульовий `INTEGER` у схемі бази даних. Докладніше див. документацію SQLModel про первинні ключі. + Примітка: Ми використовуємо `int | None` для поля первинного ключа, щоб у Python-коді можна було створити об’єкт без `id` (`id=None`), припускаючи, що база даних згенерує його під час збереження. SQLModel розуміє, що `id` надасть база даних, і визначає стовпець як ненульовий `INTEGER` у схемі бази даних. Докладніше див. [документацію SQLModel про первинні ключі](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id). * `Field(index=True)` каже SQLModel створити **SQL-індекс** для цього стовпця, що дозволить швидше виконувати пошук у базі даних під час читання даних, відфільтрованих за цим стовпцем. @@ -111,7 +111,7 @@ $ pip install sqlmodel /// tip | Порада -SQLModel матиме утиліти міграцій-обгортки над Alembic, але поки що ви можете використовувати Alembic напряму. +SQLModel матиме утиліти міграцій-обгортки над Alembic, але поки що ви можете використовувати [Alembic](https://alembic.sqlalchemy.org/en/latest/) напряму. /// @@ -152,7 +152,7 @@ SQLModel матиме утиліти міграцій-обгортки над Al
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -337,7 +337,7 @@ $ fastapi dev main.py
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -352,6 +352,6 @@ $ fastapi dev main.py ## Підсумок { #recap } -Ви можете використовувати **SQLModel** для взаємодії з SQL базою даних і спростити код за допомогою «моделей даних» та «табличних моделей». +Ви можете використовувати [**SQLModel**](https://sqlmodel.tiangolo.com/) для взаємодії з SQL базою даних і спростити код за допомогою «моделей даних» та «табличних моделей». -Багато чого ще можна дізнатися в документації **SQLModel**, там є розширений міні-навчальний посібник з використання SQLModel з **FastAPI**. 🚀 +Багато чого ще можна дізнатися в документації **SQLModel**, там є розширений міні-[навчальний посібник з використання SQLModel з **FastAPI**](https://sqlmodel.tiangolo.com/tutorial/fastapi/). 🚀 diff --git a/docs/uk/docs/tutorial/static-files.md b/docs/uk/docs/tutorial/static-files.md index 7f45973df3..2141744c33 100644 --- a/docs/uk/docs/tutorial/static-files.md +++ b/docs/uk/docs/tutorial/static-files.md @@ -23,7 +23,7 @@ Це відрізняється від використання `APIRouter`, оскільки під'єднаний застосунок є повністю незалежним. OpenAPI та документація вашого основного застосунку не будуть знати нічого про ваш під'єднаний застосунок тощо. -Ви можете дізнатися більше про це в [Посібнику для просунутих користувачів](../advanced/index.md){.internal-link target=_blank}. +Ви можете дізнатися більше про це в [Посібнику для просунутих користувачів](../advanced/index.md). ## Деталі { #details } @@ -37,4 +37,4 @@ ## Додаткова інформація { #more-info } -Детальніше про налаштування та можливості можна дізнатися в документації Starlette про статичні файли. +Детальніше про налаштування та можливості можна дізнатися в [документації Starlette про статичні файли](https://www.starlette.dev/staticfiles/). diff --git a/docs/uk/docs/tutorial/testing.md b/docs/uk/docs/tutorial/testing.md index ff32e9fb66..ccae2303a4 100644 --- a/docs/uk/docs/tutorial/testing.md +++ b/docs/uk/docs/tutorial/testing.md @@ -1,18 +1,18 @@ # Тестування { #testing } -Завдяки Starlette тестувати застосунки **FastAPI** просто й приємно. +Завдяки [Starlette](https://www.starlette.dev/testclient/), тестувати застосунки **FastAPI** просто й приємно. -Воно базується на HTTPX, який, своєю чергою, спроєктований на основі Requests, тож він дуже знайомий та інтуїтивно зрозумілий. +Воно базується на [HTTPX](https://www.python-httpx.org), який, своєю чергою, спроєктований на основі Requests, тож він дуже знайомий та інтуїтивно зрозумілий. -З його допомогою ви можете використовувати pytest безпосередньо з **FastAPI**. +З його допомогою ви можете використовувати [pytest](https://docs.pytest.org/) безпосередньо з **FastAPI**. ## Використання `TestClient` { #using-testclient } /// info | Інформація -Щоб використовувати `TestClient`, спочатку встановіть `httpx`. +Щоб використовувати `TestClient`, спочатку встановіть [`httpx`](https://www.python-httpx.org). -Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його, а потім встановили `httpx`, наприклад: +Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його, а потім встановили `httpx`, наприклад: ```console $ pip install httpx @@ -52,7 +52,7 @@ $ pip install httpx /// tip | Порада -Якщо ви хочете викликати `async`-функції у ваших тестах, окрім відправлення запитів до вашого застосунку FastAPI (наприклад, асинхронні функції роботи з базою даних), перегляньте [Async Tests](../advanced/async-tests.md){.internal-link target=_blank} у розширеному керівництві. +Якщо ви хочете викликати `async`-функції у ваших тестах, окрім відправлення запитів до вашого застосунку FastAPI (наприклад, асинхронні функції роботи з базою даних), перегляньте [Async Tests](../advanced/async-tests.md) у розширеному керівництві. /// @@ -64,7 +64,7 @@ $ pip install httpx ### Файл застосунку **FastAPI** { #fastapi-app-file } -Припустимо, у вас є структура файлів, описана в розділі [Bigger Applications](bigger-applications.md){.internal-link target=_blank}: +Припустимо, у вас є структура файлів, описана в розділі [Bigger Applications](bigger-applications.md): ``` . @@ -142,13 +142,13 @@ $ pip install httpx * Щоб передати заголовки *headers*, використовуйте `dict` у параметрі `headers`. * Для *cookies* використовуйте `dict` у параметрі `cookies`. -Докладніше про передачу даних у бекенд (за допомогою `httpx` або `TestClient`) можна знайти в документації HTTPX. +Докладніше про передачу даних у бекенд (за допомогою `httpx` або `TestClient`) можна знайти в [документації HTTPX](https://www.python-httpx.org). /// info | Інформація Зверніть увагу, що `TestClient` отримує дані, які можна конвертувати в JSON, а не Pydantic-моделі. -Якщо у вас є Pydantic-модель у тесті, і ви хочете передати її дані в застосунок під час тестування, ви можете використати `jsonable_encoder`, описаний у розділі [JSON Compatible Encoder](encoder.md){.internal-link target=_blank}. +Якщо у вас є Pydantic-модель у тесті, і ви хочете передати її дані в застосунок під час тестування, ви можете використати `jsonable_encoder`, описаний у розділі [JSON Compatible Encoder](encoder.md). /// @@ -156,7 +156,7 @@ $ pip install httpx Після цього вам потрібно встановити `pytest`. -Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його і встановили необхідні пакети, наприклад: +Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його і встановили необхідні пакети, наприклад:
diff --git a/docs/uk/docs/virtual-environments.md b/docs/uk/docs/virtual-environments.md index 78e7ab32f5..d7735b234f 100644 --- a/docs/uk/docs/virtual-environments.md +++ b/docs/uk/docs/virtual-environments.md @@ -22,7 +22,7 @@ На цій сторінці ви дізнаєтеся, як використовувати віртуальні середовища і як вони працюють. -Якщо ви готові прийняти інструмент, що керує всім за вас (включно з установленням Python), спробуйте uv. +Якщо ви готові прийняти інструмент, що керує всім за вас (включно з установленням Python), спробуйте [uv](https://github.com/astral-sh/uv). /// @@ -86,7 +86,7 @@ $ python -m venv .venv //// tab | `uv` -Якщо у вас встановлено `uv`, ви можете використати його для створення віртуального середовища. +Якщо у вас встановлено [`uv`](https://github.com/astral-sh/uv), ви можете використати його для створення віртуального середовища.
@@ -150,7 +150,7 @@ $ .venv\Scripts\Activate.ps1 //// tab | Windows Bash -Або якщо ви використовуєте Bash для Windows (напр., Git Bash): +Або якщо ви використовуєте Bash для Windows (напр., [Git Bash](https://gitforwindows.org/)):
@@ -216,7 +216,7 @@ C:\Users\user\code\awesome-project\.venv\Scripts\python /// tip | Порада -Якщо ви використовуєте `uv`, ви використовуватимете його для встановлення замість `pip`, тож вам не потрібно оновлювати `pip`. 😎 +Якщо ви використовуєте [`uv`](https://github.com/astral-sh/uv), ви використовуватимете його для встановлення замість `pip`, тож вам не потрібно оновлювати `pip`. 😎 /// @@ -268,7 +268,7 @@ $ python -m ensurepip --upgrade /// tip | Порада -Якщо ви використали `uv` для створення віртуального середовища, він уже зробив це за вас, можете пропустити цей крок. 😎 +Якщо ви використали [`uv`](https://github.com/astral-sh/uv) для створення віртуального середовища, він уже зробив це за вас, можете пропустити цей крок. 😎 /// @@ -340,7 +340,7 @@ $ pip install "fastapi[standard]" //// tab | `uv` -Якщо у вас є `uv`: +Якщо у вас є [`uv`](https://github.com/astral-sh/uv):
@@ -372,7 +372,7 @@ $ pip install -r requirements.txt //// tab | `uv` -Якщо у вас є `uv`: +Якщо у вас є [`uv`](https://github.com/astral-sh/uv):
@@ -416,8 +416,8 @@ Hello World Наприклад: -* VS Code -* PyCharm +* [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 | Порада @@ -453,7 +453,7 @@ $ deactivate ## Навіщо віртуальні середовища { #why-virtual-environments } -Щоб працювати з FastAPI, вам потрібно встановити Python. +Щоб працювати з FastAPI, вам потрібно встановити [Python](https://www.python.org/). Після цього вам потрібно буде встановити FastAPI та інші пакети, які ви хочете використовувати. @@ -562,7 +562,7 @@ $ pip install "fastapi[standard]"
-Це завантажить стиснений файл з кодом FastAPI, зазвичай із PyPI. +Це завантажить стиснений файл з кодом FastAPI, зазвичай із [PyPI](https://pypi.org/project/fastapi/). Також будуть завантажені файли для інших пакетів, від яких залежить FastAPI. @@ -625,7 +625,7 @@ $ .venv\Scripts\Activate.ps1 //// tab | Windows Bash -Або якщо ви використовуєте Bash для Windows (напр., Git Bash): +Або якщо ви використовуєте Bash для Windows (напр., [Git Bash](https://gitforwindows.org/)):
@@ -637,13 +637,13 @@ $ source .venv/Scripts/activate //// -Ця команда створить або змінить деякі [Змінні оточення](environment-variables.md){.internal-link target=_blank}, які будуть доступні для наступних команд. +Ця команда створить або змінить деякі [Змінні оточення](environment-variables.md), які будуть доступні для наступних команд. Однією з цих змінних є змінна `PATH`. /// tip | Порада -Ви можете дізнатися більше про змінну оточення `PATH` у розділі [Змінні оточення](environment-variables.md#path-environment-variable){.internal-link target=_blank}. +Ви можете дізнатися більше про змінну оточення `PATH` у розділі [Змінні оточення](environment-variables.md#path-environment-variable). /// @@ -844,7 +844,7 @@ I solemnly swear 🐺 Існує багато альтернатив керування віртуальними середовищами, залежностями пакетів (вимогами), проєктами. -Коли будете готові й захочете використовувати інструмент для керування всім проєктом, залежностями пакетів, віртуальними середовищами тощо, я раджу спробувати uv. +Коли будете готові й захочете використовувати інструмент для керування всім проєктом, залежностями пакетів, віртуальними середовищами тощо, я раджу спробувати [uv](https://github.com/astral-sh/uv). `uv` уміє багато чого, зокрема: