From ffc41160de85a7d68f76cab7526224fee39257f4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 19 Mar 2026 10:37:05 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20for=20uk?= =?UTF-8?q?=20(update-outdated)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 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/behind-a-proxy.md | 26 ++-- docs/uk/docs/advanced/custom-response.md | 117 +++++---------- docs/uk/docs/advanced/dataclasses.md | 12 +- docs/uk/docs/advanced/generate-clients.md | 18 +-- docs/uk/docs/advanced/index.md | 8 +- docs/uk/docs/advanced/openapi-callbacks.md | 10 +- .../advanced/response-change-status-code.md | 2 +- docs/uk/docs/advanced/response-cookies.md | 6 +- docs/uk/docs/advanced/response-directly.md | 44 ++++-- 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/sub-applications.md | 10 +- .../docs/advanced/using-request-directly.md | 4 +- 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 | 140 +++++++++--------- docs/uk/docs/deployment/index.md | 2 +- docs/uk/docs/deployment/manually.md | 14 +- docs/uk/docs/deployment/server-workers.md | 22 +-- docs/uk/docs/deployment/versions.md | 6 +- .../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/tutorial/dependencies/index.md | 4 +- 39 files changed, 318 insertions(+), 335 deletions(-) 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/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 } - -Наприклад, якщо ви максимально оптимізуєте продуктивність, можете встановити та використовувати `orjson` і встановити відповідь як `ORJSONResponse`. - -Імпортуйте потрібний клас `Response` (підклас) і оголосіть його в декораторі операції шляху. - -Для великих відповідей повернення `Response` безпосередньо значно швидше, ніж повернення словника. - -Це тому, що за замовчуванням FastAPI перевірятиме кожен елемент усередині та переконуватиметься, що його можна серіалізувати як JSON, використовуючи той самий [Сумісний кодувальник JSON](../tutorial/encoder.md){.internal-link target=_blank}, описаний у навчальному посібнику. Саме це дозволяє повертати довільні об'єкти, наприклад моделі бази даних. - -Але якщо ви впевнені, що вміст, який повертається, серіалізується в JSON, ви можете передати його безпосередньо класу відповіді та уникнути додаткових витрат FastAPI на пропускання вашого вмісту через `jsonable_encoder` перед передаванням його класу відповіді. +## JSON-відповіді { #json-responses } -{* ../../docs_src/custom_response/tutorial001b_py310.py hl[2,7] *} +Типово FastAPI повертає JSON-відповіді. -/// info | Інформація - -Параметр `response_class` також визначатиме «медіа-тип» відповіді. +Якщо ви оголосите [Модель відповіді](../tutorial/response-model.md), FastAPI використає її, щоб серіалізувати дані в JSON за допомогою Pydantic. -У цьому випадку HTTP-заголовок `Content-Type` буде встановлено в `application/json`. +Якщо ви не оголосите модель відповіді, FastAPI використає `jsonable_encoder`, пояснений у [Сумісний кодувальник JSON](../tutorial/encoder.md), і помістить результат у `JSONResponse`. -І це буде задокументовано відповідно в OpenAPI. +Якщо ви оголосите `response_class` з JSON медіа-типом (`application/json`), як у випадку з `JSONResponse`, дані, що повертаються, будуть автоматично перетворені (і відфільтровані) згідно з будь-якою Pydantic `response_model`, яку ви оголосили в декораторі операції шляху. Але дані не будуть серіалізовані в JSON-байти за допомогою Pydantic, натомість вони будуть перетворені з `jsonable_encoder`, а потім передані класу `JSONResponse`, який і серіалізує їх у байти, використовуючи стандартну JSON-бібліотеку в Python. -/// +### Продуктивність JSON { #json-performance } -/// tip | Порада +Коротко: якщо вам потрібна максимальна продуктивність, використовуйте [Модель відповіді](../tutorial/response-model.md) і не оголошуйте `response_class` у декораторі операції шляху. -`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 } - -Швидка альтернативна JSON-відповідь з використанням `orjson`, як описано вище. - -/// 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] *} +/// note | Технічні деталі -/// tip | Порада +Але якщо ви оголосите модель відповіді або тип, його буде використано безпосередньо для серіалізації даних у JSON, і відповідь з коректним медіа-типом для JSON буде повернута безпосередньо, без використання класу `JSONResponse`. -Ймовірно, `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-генератор або звичайний генератор/ітератор і транслює тіло відповіді потоково. - -{* ../../docs_src/custom_response/tutorial007_py310.py hl[2,14] *} - -#### Використання `StreamingResponse` з об'єктами типу file-like { #using-streamingresponse-with-file-like-objects } +Приймає async-генератор або звичайний генератор/ітератор (функцію з `yield`) і потоково передає тіло відповіді. -Якщо у вас є file-like об'єкт (наприклад, об'єкт, що повертається `open()`), ви можете створити генераторну функцію для ітерації по цьому file-like об'єкту. +{* ../../docs_src/custom_response/tutorial007_py310.py hl[3,16] *} -Таким чином, вам не потрібно спочатку читати все в пам'ять, і ви можете передати цю генераторну функцію в `StreamingResponse` і повернути її. - -Сюди входить багато бібліотек для взаємодії з хмарними сховищами, обробки відео та інші. +/// note | Технічні деталі -{* ../../docs_src/custom_response/tutorial008_py310.py hl[2,10:12,14] *} +Завдання `async` може бути скасовано лише тоді, коли воно досягає `await`. Якщо немає `await`, генератор (функція з `yield`) не може бути коректно скасований і може продовжувати працювати навіть після запиту на скасування. -1. Це генераторна функція. Вона є «генераторною функцією», бо містить оператори `yield` усередині. -2. Використовуючи блок `with`, ми гарантуємо, що file-like об'єкт буде закрито після завершення роботи генераторної функції. Тобто після того, як вона завершить надсилання відповіді. -3. Цей `yield from` вказує функції ітеруватися по об'єкту з назвою `file_like`. А потім, для кожної ітерованої частини, повертати цю частину, ніби вона надходить з цієї генераторної функції (`iterfile`). +Оскільки цьому невеликому прикладу не потрібні жодні оператори `await`, ми додаємо `await anyio.sleep(0)`, щоб надати циклу подій шанс обробити скасування. - Тож це генераторна функція, яка всередині передає роботу «генерації» чомусь іншому. +Це ще важливіше для великих або нескінченних потоків. - Роблячи це таким чином, ми можемо помістити її в блок `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/generate-clients.md b/docs/uk/docs/advanced/generate-clients.md index 66e9193ac3..cd762a548b 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 } @@ -100,7 +100,7 @@ npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client {* ../../docs_src/generate_clients/tutorial002_py310.py hl[21,26,34] *} -### Згенерувати TypeScript-клієнт із мітками { #generate-a-typescript-client-with-tags } +### Згенерувати TypeScript-клієнт із мітками { #generate-a-typescripts-client-with-tags } Якщо ви згенеруєте клієнт для застосунку FastAPI, що використовує мітки, зазвичай клієнтський код також буде розділено за цими мітками. 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/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/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..61bf9060ee 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,13 +46,13 @@ Ви також можете використати `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` тощо. Усе це відбувається за замовчуванням. Тепер подивімося, як це використати, щоб повернути власну відповідь. @@ -56,10 +62,22 @@ FastAPI надає ті самі `starlette.responses` як `fastapi.responses` {* ../../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/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/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/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..db6cda6367 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 сервер має мати «сертифікати», видані третьою стороною. - * Насправді ці сертифікати «отримуються» у третьої сторони, а не «генеруються». -* Сертифікати мають строк дії. - * Їхній строк дії спливає. - * І тоді їх потрібно поновити, знову отримавши у третьої сторони. -* Шифрування з'єднання відбувається на рівні TCP. - * Це один шар нижче від HTTP. - * Тож обробка сертифіката та шифрування виконується до HTTP. -* TCP не знає про «домени». Лише про IP-адреси. - * Інформація про конкретний домен, який запитується, міститься в даних HTTP. -* Сертифікати HTTPS «засвідчують» певний домен, але протокол і шифрування працюють на рівні TCP, до того як відомо, з яким доменом маємо справу. -* Типово це означало б, що на одну IP-адресу можна мати лише один сертифікат HTTPS. +Щоб **вивчити основи HTTPS** з точки зору споживача, перегляньте [https://howhttps.works/](https://howhttps.works/). + +Тепер, з **точки зору розробника**, ось кілька речей, які варто пам'ятати, розмірковуючи про 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, домен тощо. @@ -224,8 +224,8 @@ TLS Termination Proxy використає узгоджене шифруванн ## Підсумок { #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..eb488daf23 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 на контейнер. Але про це я розповім пізніше в тому розділі. @@ -64,13 +64,13 @@ $ fastapi run --workers 4 INFO Started server process [27368] INFO Started server process [27369] INFO Started server process [27370] - INFO Started server process [27367] - INFO Waiting for application startup. + INFO Started server process [27367] + INFO Waiting for application startup. INFO Waiting for application startup. INFO Waiting for application startup. INFO Waiting for application startup. INFO Application startup complete. - INFO Application startup complete. + INFO Application startup complete. INFO Application startup complete. INFO Application startup complete. ``` @@ -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/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/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` у документації. ///