diff --git a/.github/DISCUSSION_TEMPLATE/translations.yml b/.github/DISCUSSION_TEMPLATE/translations.yml
new file mode 100644
index 000000000..16e304d99
--- /dev/null
+++ b/.github/DISCUSSION_TEMPLATE/translations.yml
@@ -0,0 +1,45 @@
+labels: [lang-all]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Thanks for your interest in helping translate the FastAPI docs! đ
+
+ Please follow these instructions carefully to propose a new language translation. đ
+
+ This structured process helps ensure translations can be properly maintained long-term.
+ - type: checkboxes
+ id: checks
+ attributes:
+ label: Initial Checks
+ description: Please confirm and check all the following options.
+ options:
+ - label: I checked that this language is not already being translated in FastAPI docs.
+ required: true
+ - label: I searched existing discussions to ensure no one else proposed this language.
+ required: true
+ - label: I am a native speaker of the language I want to help translate.
+ required: true
+ - type: input
+ id: language
+ attributes:
+ label: Target Language
+ description: What language do you want to translate the FastAPI docs into?
+ placeholder: e.g. Latin
+ validations:
+ required: true
+ - type: textarea
+ id: additional_info
+ attributes:
+ label: Additional Information
+ description: Any other relevant information about your translation proposal
+ - type: markdown
+ attributes:
+ value: |
+ Translations are automatized with AI and then reviewed by native speakers. đ¤ đ
+
+ This allows us to keep them consistent and up-to-date.
+
+ If there are several native speakers commenting on this discussion and
+ committing to help review new translations, the FastAPI team will review it
+ and potentially make it an official translation. đ
diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml
index 6ecdf487c..e84e4e4ab 100644
--- a/.github/workflows/build-docs.yml
+++ b/.github/workflows/build-docs.yml
@@ -53,7 +53,7 @@ jobs:
with:
python-version: "3.11"
- name: Setup uv
- uses: astral-sh/setup-uv@v5
+ uses: astral-sh/setup-uv@v6
with:
version: "0.4.15"
enable-cache: true
@@ -95,7 +95,7 @@ jobs:
with:
python-version: "3.11"
- name: Setup uv
- uses: astral-sh/setup-uv@v5
+ uses: astral-sh/setup-uv@v6
with:
version: "0.4.15"
enable-cache: true
diff --git a/.github/workflows/contributors.yml b/.github/workflows/contributors.yml
index 87abfe3a1..34b54b452 100644
--- a/.github/workflows/contributors.yml
+++ b/.github/workflows/contributors.yml
@@ -30,7 +30,7 @@ jobs:
with:
python-version: "3.11"
- name: Setup uv
- uses: astral-sh/setup-uv@v5
+ uses: astral-sh/setup-uv@v6
with:
version: "0.4.15"
enable-cache: true
diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml
index d9ed61910..9ca69b208 100644
--- a/.github/workflows/deploy-docs.yml
+++ b/.github/workflows/deploy-docs.yml
@@ -29,7 +29,7 @@ jobs:
with:
python-version: "3.11"
- name: Setup uv
- uses: astral-sh/setup-uv@v5
+ uses: astral-sh/setup-uv@v6
with:
version: "0.4.15"
enable-cache: true
@@ -62,10 +62,7 @@ jobs:
env:
PROJECT_NAME: fastapitiangolo
BRANCH: ${{ ( github.event.workflow_run.head_repository.full_name == github.repository && github.event.workflow_run.head_branch == 'master' && 'main' ) || ( github.event.workflow_run.head_sha ) }}
- # TODO: Use v3 when it's fixed, probably in v3.11
- # https://github.com/cloudflare/wrangler-action/issues/307
- uses: cloudflare/wrangler-action@v3.13
- # uses: cloudflare/wrangler-action@v3
+ uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
diff --git a/.github/workflows/label-approved.yml b/.github/workflows/label-approved.yml
index 02070146c..908a9453d 100644
--- a/.github/workflows/label-approved.yml
+++ b/.github/workflows/label-approved.yml
@@ -26,7 +26,7 @@ jobs:
with:
python-version: "3.11"
- name: Setup uv
- uses: astral-sh/setup-uv@v5
+ uses: astral-sh/setup-uv@v6
with:
version: "0.4.15"
enable-cache: true
diff --git a/.github/workflows/latest-changes.yml b/.github/workflows/latest-changes.yml
index b8b5c42ee..208ab0c65 100644
--- a/.github/workflows/latest-changes.yml
+++ b/.github/workflows/latest-changes.yml
@@ -34,7 +34,7 @@ jobs:
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }}
with:
limit-access-to-actor: true
- - uses: tiangolo/latest-changes@0.3.2
+ - uses: tiangolo/latest-changes@0.4.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
latest_changes_file: docs/en/docs/release-notes.md
diff --git a/.github/workflows/notify-translations.yml b/.github/workflows/notify-translations.yml
index c96992689..621d1253a 100644
--- a/.github/workflows/notify-translations.yml
+++ b/.github/workflows/notify-translations.yml
@@ -34,7 +34,7 @@ jobs:
with:
python-version: "3.11"
- name: Setup uv
- uses: astral-sh/setup-uv@v5
+ uses: astral-sh/setup-uv@v6
with:
version: "0.4.15"
enable-cache: true
diff --git a/.github/workflows/people.yml b/.github/workflows/people.yml
index 6ec3c1ad2..c1df3455e 100644
--- a/.github/workflows/people.yml
+++ b/.github/workflows/people.yml
@@ -30,7 +30,7 @@ jobs:
with:
python-version: "3.11"
- name: Setup uv
- uses: astral-sh/setup-uv@v5
+ uses: astral-sh/setup-uv@v6
with:
version: "0.4.15"
enable-cache: true
@@ -51,3 +51,4 @@ jobs:
run: python ./scripts/people.py
env:
GITHUB_TOKEN: ${{ secrets.FASTAPI_PEOPLE }}
+ SLEEP_INTERVAL: ${{ vars.PEOPLE_SLEEP_INTERVAL }}
diff --git a/.github/workflows/smokeshow.yml b/.github/workflows/smokeshow.yml
index a0ffd55e6..d8a5dfb30 100644
--- a/.github/workflows/smokeshow.yml
+++ b/.github/workflows/smokeshow.yml
@@ -26,7 +26,7 @@ jobs:
with:
python-version: '3.9'
- name: Setup uv
- uses: astral-sh/setup-uv@v5
+ uses: astral-sh/setup-uv@v6
with:
version: "0.4.15"
enable-cache: true
diff --git a/.github/workflows/sponsors.yml b/.github/workflows/sponsors.yml
index a5230c834..6da4d90e1 100644
--- a/.github/workflows/sponsors.yml
+++ b/.github/workflows/sponsors.yml
@@ -30,7 +30,7 @@ jobs:
with:
python-version: "3.11"
- name: Setup uv
- uses: astral-sh/setup-uv@v5
+ uses: astral-sh/setup-uv@v6
with:
version: "0.4.15"
enable-cache: true
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 793e789e2..c3940be01 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -29,7 +29,7 @@ jobs:
with:
python-version: "3.11"
- name: Setup uv
- uses: astral-sh/setup-uv@v5
+ uses: astral-sh/setup-uv@v6
with:
version: "0.4.15"
enable-cache: true
@@ -48,6 +48,7 @@ jobs:
strategy:
matrix:
python-version:
+ - "3.13"
- "3.12"
- "3.11"
- "3.10"
@@ -66,7 +67,7 @@ jobs:
with:
python-version: ${{ matrix.python-version }}
- name: Setup uv
- uses: astral-sh/setup-uv@v5
+ uses: astral-sh/setup-uv@v6
with:
version: "0.4.15"
enable-cache: true
@@ -111,7 +112,7 @@ jobs:
with:
python-version: '3.8'
- name: Setup uv
- uses: astral-sh/setup-uv@v5
+ uses: astral-sh/setup-uv@v6
with:
version: "0.4.15"
enable-cache: true
diff --git a/.github/workflows/topic-repos.yml b/.github/workflows/topic-repos.yml
index 3c5c881f1..433aeb00b 100644
--- a/.github/workflows/topic-repos.yml
+++ b/.github/workflows/topic-repos.yml
@@ -25,7 +25,7 @@ jobs:
with:
python-version: "3.11"
- name: Setup uv
- uses: astral-sh/setup-uv@v5
+ uses: astral-sh/setup-uv@v6
with:
version: "0.4.15"
enable-cache: true
diff --git a/.github/workflows/translate.yml b/.github/workflows/translate.yml
new file mode 100644
index 000000000..fc6b4d730
--- /dev/null
+++ b/.github/workflows/translate.yml
@@ -0,0 +1,77 @@
+name: Translate
+
+on:
+ workflow_dispatch:
+ inputs:
+ debug_enabled:
+ description: Run with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)
+ required: false
+ default: "false"
+ command:
+ description: Command to run
+ type: choice
+ options:
+ - translate-page
+ - translate-lang
+ - update-outdated
+ - add-missing
+ - update-and-add
+ - remove-all-removable
+ language:
+ description: Language to translate to as a letter code (e.g. "es" for Spanish)
+ type: string
+ required: false
+ default: ""
+ en_path:
+ description: File path in English to translate (e.g. docs/en/docs/index.md)
+ type: string
+ required: false
+ default: ""
+
+env:
+ UV_SYSTEM_PYTHON: 1
+
+jobs:
+ job:
+ if: github.repository_owner == 'fastapi'
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ steps:
+ - name: Dump GitHub context
+ env:
+ GITHUB_CONTEXT: ${{ toJson(github) }}
+ run: echo "$GITHUB_CONTEXT"
+ - uses: actions/checkout@v4
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: "3.11"
+ - name: Setup uv
+ uses: astral-sh/setup-uv@v6
+ with:
+ version: "0.4.15"
+ enable-cache: true
+ cache-dependency-glob: |
+ requirements**.txt
+ pyproject.toml
+ - name: Install Dependencies
+ run: uv pip install -r requirements-github-actions.txt -r requirements-translations.txt
+ # Allow debugging with tmate
+ - name: Setup tmate session
+ uses: mxschmitt/action-tmate@v3
+ if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }}
+ with:
+ limit-access-to-actor: true
+ env:
+ GITHUB_TOKEN: ${{ secrets.FASTAPI_TRANSLATIONS }}
+ OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
+ - name: FastAPI Translate
+ run: |
+ python ./scripts/translate.py ${{ github.event.inputs.command }}
+ python ./scripts/translate.py make-pr
+ env:
+ GITHUB_TOKEN: ${{ secrets.FASTAPI_TRANSLATIONS }}
+ OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
+ LANGUAGE: ${{ github.event.inputs.language }}
+ EN_PATH: ${{ github.event.inputs.en_path }}
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 767ef8d9e..0f882b221 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -14,7 +14,7 @@ repos:
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/astral-sh/ruff-pre-commit
- rev: v0.7.4
+ rev: v0.12.5
hooks:
- id: ruff
args:
diff --git a/README.md b/README.md
index 6492ad745..0e421c347 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
-
+
@@ -48,20 +48,22 @@ The key features are:
-
-
-
-
-
+
-
-
-
+
+
+
+
+
+
+
+
+
@@ -148,7 +150,7 @@ $ pip install "fastapi[standard]"
### Create it
-* Create a file `main.py` with:
+Create a file `main.py` with:
```Python
from typing import Union
@@ -470,15 +472,20 @@ Used by Starlette:
* jinja2
- Required if you want to use the default template configuration.
* python-multipart
- Required if you want to support form "parsing" , with `request.form()`.
-Used by FastAPI / Starlette:
+Used by FastAPI:
* uvicorn
- for the server that loads and serves your application. This includes `uvicorn[standard]`, which includes some dependencies (e.g. `uvloop`) needed for high performance serving.
-* `fastapi-cli` - to provide the `fastapi` command.
+* `fastapi-cli[standard]` - to provide the `fastapi` command.
+ * This includes `fastapi-cloud-cli`, which allows you to deploy your FastAPI application to FastAPI Cloud .
### Without `standard` Dependencies
If you don't want to include the `standard` optional dependencies, you can install with `pip install fastapi` instead of `pip install "fastapi[standard]"`.
+### Without `fastapi-cloud-cli`
+
+If you want to install FastAPI with the standard dependencies but without the `fastapi-cloud-cli`, you can install with `pip install "fastapi[standard-no-fastapi-cloud-cli]"`.
+
### Additional Optional Dependencies
There are some additional dependencies you might want to install.
diff --git a/docs/az/docs/index.md b/docs/az/docs/index.md
index ad78d7d06..fbbbce130 100644
--- a/docs/az/docs/index.md
+++ b/docs/az/docs/index.md
@@ -6,7 +6,7 @@
-
+
diff --git a/docs/bn/docs/about/index.md b/docs/bn/docs/about/index.md
new file mode 100644
index 000000000..b6d611ae9
--- /dev/null
+++ b/docs/bn/docs/about/index.md
@@ -0,0 +1,3 @@
+# āϏāĻŽā§āĻĒāϰā§āĻā§
+
+**FastAPI** āϏāĻŽā§āĻĒāϰā§āĻā§ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ â āĻāϰ āĻĄāĻŋāĻāĻžāĻāύ, āĻ
āύā§āĻĒā§āϰā§āϰāĻŖāĻž āĻ āĻāϰāĻ āĻ
āύā§āĻ āĻāĻŋāĻā§āĨ¤ đ¤
diff --git a/docs/bn/docs/environment-variables.md b/docs/bn/docs/environment-variables.md
new file mode 100644
index 000000000..9122ca5bf
--- /dev/null
+++ b/docs/bn/docs/environment-variables.md
@@ -0,0 +1,298 @@
+# āĻāύāĻāĻžāϝāĻŧāϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞāϏ
+
+/// tip
+
+āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ "āĻāύāĻāĻžāϝāĻŧāϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞāϏ" āĻā§ āĻāĻŦāĻ āϏā§āĻā§āϞ⧠āĻā§āĻāĻžāĻŦā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻšāϝāĻŧ āϏā§āĻāĻž āĻāĻžāύā§āύ, āϤāĻžāĻšāϞ⧠āĻāĻ āĻ
āĻāĻļāĻāĻŋ āϏā§āĻāĻŋāĻĒ āĻāϰ⧠āϝā§āϤ⧠āĻĒāĻžāϰā§āύāĨ¤
+
+///
+
+āĻāύāĻāĻžāϝāĻŧāϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ (āϏāĻāĻā§āώā§āĻĒā§ "**env var**" āύāĻžāĻŽā§āĻ āĻĒāϰāĻŋāĻāĻŋāϤ) āĻšāϞ⧠āĻāĻŽāύ āĻāĻāĻāĻŋ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ āϝāĻž āĻĒāĻžāĻāĻĨāύ āĻā§āĻĄā§āϰ **āĻŦāĻžāĻāϰā§**, **āĻ
āĻĒāĻžāϰā§āĻāĻŋāĻ āϏāĻŋāϏā§āĻā§āĻŽā§** āĻĨāĻžāĻā§ āĻāĻŦāĻ āĻāĻĒāύāĻžāϰ āĻĒāĻžāĻāĻĨāύ āĻā§āĻĄ (āĻŦāĻž āĻ
āύā§āϝāĻžāύā§āϝ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ) āĻĻā§āĻŦāĻžāϰāĻž āϝāĻžāĻā§ āϰāĻŋāĻĄ āĻāϰāĻž āϝāĻžāϝāĻŧāĨ¤
+
+āĻāύāĻāĻžāϝāĻŧāϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞāϏ āĻ
ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύā§āϰ **āϏā§āĻāĻŋāĻāϏ** āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰāϤā§, āĻĒāĻžāĻāĻĨāύā§āϰ **āĻāύāϏā§āĻāϞā§āĻļāύ** āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāϰ āĻ
āĻāĻļ āĻšāĻŋāϏā§āĻŦā§, āĻāϤā§āϝāĻžāĻĻāĻŋ āĻāĻžāĻā§ āĻāĻĒāϝā§āĻā§ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤
+
+## Env Vars āϤā§āϰ⧠āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ
+
+āĻāĻĒāύāĻŋ **āĻļā§āϞ (āĻāĻžāϰā§āĻŽāĻŋāύāĻžāϞ)**-āĻ, āĻĒāĻžāĻāĻĨāύā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻāĻžāĻĄāĻŧāĻžāĻ, āĻāύāĻāĻžāϝāĻŧāϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞāϏ **āϤā§āϰāĻŋ** āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύāĻ
+
+//// tab | āϞāĻŋāύāĻžāĻā§āϏ, āĻŽā§āϝāĻžāĻāĻāĻāϏ, āĻāĻāύā§āĻĄā§āĻ Bash
+
+
+
+```console
+// āĻāĻĒāύāĻŋ āĻāĻžāĻāϞ⧠MY_NAME āύāĻžāĻŽā§ āĻāĻāĻāĻŋ env var āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ
+$ export MY_NAME="Wade Wilson"
+
+// āϤāĻžāϰāĻĒāϰ⧠āĻāĻāĻŋāĻā§ āĻāĻžāĻāϞ⧠āĻ
āύā§āϝāĻžāύā§āϝ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ
+$ echo "Hello $MY_NAME"
+
+Hello Wade Wilson
+```
+
+
+
+////
+
+//// tab | āĻāĻāύā§āĻĄā§āĻ āĻĒāĻžāĻā§āĻžāϰāĻļā§āϞ
+
+
+
+```console
+// MY_NAME āύāĻžāĻŽā§ env var āϤā§āϰāĻŋ
+$ $Env:MY_NAME = "Wade Wilson"
+
+// āĻ
āύā§āϝāĻžāύā§āϝ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§ āĻāĻāĻŋāĻā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ
+$ echo "Hello $Env:MY_NAME"
+
+Hello Wade Wilson
+```
+
+
+
+////
+
+## āĻĒāĻžāĻāĻĨāύ⧠env vars āϰāĻŋāĻĄ āĻāϰāĻž
+
+āĻāĻĒāύāĻŋ āĻāĻžāĻāϞ⧠āĻĒāĻžāĻāĻĨāύā§āϰ **āĻŦāĻžāĻāϰā§**, āĻāĻžāϰā§āĻŽāĻŋāύāĻžāϞ⧠(āĻŦāĻž āĻ
āύā§āϝ āĻā§āύ⧠āĻāĻĒāĻžāϝāĻŧā§) āĻāύāĻāĻžāϝāĻŧāϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞāϏ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ, āĻāĻŦāĻ āĻĒāϰ⧠āϏā§āĻā§āϞ⧠**āĻĒāĻžāĻāĻĨāύ⧠āϰāĻŋāĻĄ** (āĻ
ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāϤā§) āĻĒāĻžāϰā§āύāĨ¤
+
+āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāĻĒāύāĻžāϰ `main.py` āύāĻžāĻŽā§ āĻāĻāĻāĻŋ āĻĢāĻžāĻāϞ āĻĨāĻžāĻāϤ⧠āĻĒāĻžāϰā§āĻ
+
+```Python hl_lines="3"
+import os
+
+name = os.getenv("MY_NAME", "World")
+print(f"Hello {name} from Python")
+```
+
+/// tip
+
+ `os.getenv()` āĻāϰ āĻĻā§āĻŦāĻŋāϤā§ā§ āĻāϰā§āĻā§āĻŽā§āύā§āĻāĻāĻŋ āĻšāϞ⧠āĻāϰ āĻĄāĻŋāĻĢāϞā§āĻ āĻā§āϝāĻžāϞ⧠āϝāĻž āϰāĻŋāĻāĻžāϰā§āύ āĻāϰāĻž āĻšāĻŦā§āĨ¤
+
+āϝāĻĻāĻŋ āĻāĻāĻŋ āĻĻā§āĻā§āĻž āύāĻž āĻšā§, āĻĄāĻŋāĻĢāϞā§āĻāĻāĻžāĻŦā§ `None` āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāĻŦā§, āĻāĻāĻžāύ⧠āĻāĻŽāϰāĻž āĻĄāĻŋāĻĢāϞā§āĻ āĻā§āϝāĻžāϞ⧠āĻšāĻŋāϏā§āĻŦā§ `"World"` āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āĻāĻŋāĨ¤
+
+///
+
+āϤāĻžāϰāĻĒāϰ⧠āĻĒāĻžāĻāĻĨāύ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋāĻā§ āύāĻŋāĻŽā§āύā§āĻā§āϤāĻāĻžāĻŦā§ āĻāϞ āĻāϰāĻž āϝāĻžāĻŦā§āĻ
+
+//// tab | āϞāĻŋāύāĻžāĻā§āϏ, āĻŽā§āϝāĻžāĻāĻāĻāϏ, āĻāĻāύā§āĻĄā§āĻ Bash
+
+
+
+```console
+// āĻāĻāύ⧠āĻāĻŽāϰāĻž āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ āϏā§āĻ āĻāϰāĻŋāύāĻŋ
+$ python main.py
+
+// āϝā§āĻšā§āϤ⧠env var āϏā§āĻ āĻāϰāĻž āĻšā§āύāĻŋ, āϤāĻžāĻ āĻāĻŽāϰāĻž āĻĄāĻŋāĻĢāϞā§āĻ āĻā§āϝāĻžāϞ⧠āĻĒāĻžāĻā§āĻāĻŋ
+
+Hello World from Python
+
+// āĻāĻŋāύā§āϤ⧠āĻāĻŽāϰāĻž āĻĒā§āϰāĻĨāĻŽā§ āϝāĻĻāĻŋ āĻāĻāĻāĻž āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻāĻžāϰāĻŋā§ā§āĻŦāϞ āϤā§āϰāĻŋ āĻāϰ⧠āύā§āĻ
+$ export MY_NAME="Wade Wilson"
+
+// āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ āĻāĻŦāĻžāϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻāĻŋāĻā§ āĻāϞ āĻāϰāĻŋ
+$ python main.py
+
+// āĻāĻāύ āĻāĻāĻŋ āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ āϰāĻŋāĻĄ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§
+
+Hello Wade Wilson from Python
+```
+
+
+
+////
+
+//// tab | āĻāĻāύā§āĻĄā§āĻ āĻĒāĻžāĻā§āĻžāϰāĻļā§āϞ
+
+
+
+```console
+// āĻāĻāύ⧠āĻāĻŽāϰāĻž āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ āϏā§āĻ āĻāϰāĻŋāύāĻŋ
+$ python main.py
+
+// āϝā§āĻšā§āϤ⧠env var āϏā§āĻ āĻāϰāĻž āĻšā§āύāĻŋ, āϤāĻžāĻ āĻāĻŽāϰāĻž āĻĄāĻŋāĻĢāϞā§āĻ āĻā§āϝāĻžāϞ⧠āĻĒāĻžāĻā§āĻāĻŋ
+
+Hello World from Python
+
+// āĻāĻŋāύā§āϤ⧠āĻāĻŽāϰāĻž āĻĒā§āϰāĻĨāĻŽā§ āϝāĻĻāĻŋ āĻāĻāĻāĻž āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻāĻžāϰāĻŋā§ā§āĻŦāϞ āϤā§āϰāĻŋ āĻāϰ⧠āύā§āĻ
+$ $Env:MY_NAME = "Wade Wilson"
+
+// āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ āĻāĻŦāĻžāϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻāĻŋāĻā§ āĻāϞ āĻāϰāĻŋ
+$ python main.py
+
+// āĻāĻāύ āĻāĻāĻŋ āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ āϰāĻŋāĻĄ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§
+
+Hello Wade Wilson from Python
+```
+
+
+
+////
+
+āϝā§āĻšā§āϤ⧠āĻāύāĻāĻžāϝāĻŧāϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞāϏ āĻā§āĻĄā§āϰ āĻŦāĻžāĻāϰ⧠āϏā§āĻ āĻāϰāĻž āϝāĻžāϝāĻŧ, āĻāĻŋāύā§āϤ⧠āĻĒāϰāĻŦāϰā§āϤā§āϤ⧠āĻā§āĻĄ āĻĻā§āĻŦāĻžāϰāĻž āϰāĻŋāĻĄ āĻāϰāĻž āϝāĻžāϝāĻŧ, āĻāĻŦāĻ āĻŦāĻžāĻāĻŋ āĻĢāĻžāĻāϞāĻā§āϞā§āϰ āϏāĻžāĻĨā§ āϰāĻžāĻāϤ⧠(`git` āĻ āĻāĻŽāĻŋāĻ) āĻšā§ āύāĻž, āϤāĻžāĻ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύāϏ āĻŦāĻž **āϏā§āĻāĻŋāĻāϏ** āĻāϰ āĻāύā§āϝ āĻāĻā§āϞ⧠āϏāĻžāϧāĻžāϰāĻŖāϤ āĻŦā§āϝāĻŦāĻšā§āϤ āĻšā§ā§ āĻĨāĻžāĻā§āĨ¤
+
+āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āĻāύāĻāĻžāϝāĻŧāϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻāĻāĻŋ **āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāύāĻā§āĻā§āĻļāύā§āϰ** āĻāύā§āϝāĻ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ, āϝāĻž āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āϏā§āĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻāύā§āϝāĻ āĻāĻā§āĻāϞā§āĻŦāϞ āĻĨāĻžāĻāĻŦā§ āĻāĻŦāĻ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āϤāĻžāϰ āĻāϞāĻžāĻāĻžāϞā§āύ āϏāĻŽāϝāĻŧ āĻĒāϰā§āϝāύā§āϤāĻ āϏāĻā§āϰāĻŋāϝāĻŧ āĻĨāĻžāĻāĻŦā§āĨ¤
+
+āĻāĻāĻŋ āĻāϰāϤā§, āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āϰāĻžāύ āĻāϰāĻžāϰ āĻ āĻŋāĻ āĻāĻā§āĻ, āĻāĻāĻ āϞāĻžāĻāύ⧠āĻāύāĻāĻžāϝāĻŧāϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ āϤā§āϰāĻŋ āĻāϰā§āύ:
+
+
+
+```console
+// āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻāϞ āĻāϰāĻžāϰ āϏāĻŽā§ āĻāĻāĻ āϞāĻžāĻāύ⧠MY_NAME āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋā§ā§āĻŦāϞ āϤā§āϰāĻŋ āĻāϰā§āύ
+$ MY_NAME="Wade Wilson" python main.py
+
+// āĻāĻāύ āĻāĻāĻŋ āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻā§āϝāϰāĻŋā§ā§āĻŦāϞāĻāĻŋāĻā§ āϰāĻŋāĻĄ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§
+
+Hello Wade Wilson from Python
+
+// āĻĒāϰāĻŦāϰā§āϤā§āϤ⧠āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞāĻāĻŋāĻā§ āĻāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝāĻžāĻā§āĻā§ āύāĻž
+$ python main.py
+
+Hello World from Python
+```
+
+
+
+/// tip
+
+āĻāĻāĻŋ āύāĻŋā§ā§ āĻāϰ⧠āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āĻĒā§āϤ⧠āĻĒāĻžāϰā§āύ āĻāĻāĻžāύ⧠The Twelve-Factor App: Config āĨ¤
+
+///
+
+## āĻāĻžāĻāĻĒāϏ āĻāĻŦāĻ āĻā§āϝāĻžāϞāĻŋāĻĄā§āĻļāύ
+
+āĻāĻ āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞāĻā§āϞ⧠āĻļā§āϧā§āĻŽāĻžāϤā§āϰ **āĻā§āĻā§āϏāĻ āϏā§āĻā§āϰāĻŋāĻāϏ** āĻšā§āϝāĻžāύā§āĻĄā§āϞ āĻāϰāϤ⧠āĻĒāĻžāϰā§, āϝā§āĻšā§āϤ⧠āĻāĻā§āϞ⧠āĻĒāĻžāĻāĻĨāύā§āϰ āĻŦāĻžāĻāϰ⧠āĻ
āĻŦāϏā§āĻĨāĻŋāϤ āĻāĻŦāĻ āĻ
āύā§āϝāĻžāύā§āϝ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻŦāĻ āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āĻŦāĻžāĻāĻŋ āĻ
āĻāĻļā§āϰ (āĻāĻŽāύāĻāĻŋ āĻŦāĻŋāĻāĻŋāύā§āύ āĻ
āĻĒāĻžāϰā§āĻāĻŋāĻ āϏāĻŋāϏā§āĻā§āĻŽ āϝā§āĻŽāύ āϞāĻŋāύāĻžāĻā§āϏ, āĻāĻāύā§āĻĄā§āĻ, āĻŽā§āϝāĻžāĻāĻāĻāϏ) āϏāĻžāĻĨā§ āϏāĻžāĻŽāĻā§āĻāϏā§āϝāĻĒā§āϰā§āĻŖ āĻšāϤ⧠āĻšāϝāĻŧāĨ¤
+
+āĻāϰ āĻ
āϰā§āĻĨ āĻšāĻā§āĻā§ āĻĒāĻžāĻāĻĨāύ⧠āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ āĻĨā§āĻā§ āϰāĻŋāĻĄ āĻāϰāĻž **āϝā§āĻā§āύ⧠āĻā§āϝāĻžāϞā§** āĻāĻāĻāĻŋ `str` āĻšāĻŦā§, āĻāĻŦāĻ āĻ
āύā§āϝ āĻā§āύ⧠āĻāĻžāĻāĻĒā§ āĻāύāĻāĻžāϰā§āϏāύ āĻŦāĻž āϝā§āĻā§āύ⧠āĻā§āϞāĻŋāĻĄā§āĻļāύ āĻā§āĻĄā§ āĻāϞāĻžāĻĻāĻžāĻāĻžāĻŦā§ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤
+
+āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠**āĻāĻĒā§āϞāĻŋāĻā§āĻļāύ āϏā§āĻāĻŋāĻāϏ** āĻšā§āϝāĻžāύā§āĻĄā§āϞ āĻāϰāĻž āύāĻŋā§ā§ āĻāϰ⧠āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āĻāĻžāύāĻž āϝāĻžāĻŦā§ [Advanced User Guide - Settings and Environment Variables](./advanced/settings.md){.internal-link target=_blank}.
+
+## `PATH` āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋā§ā§āĻŦāϞ
+
+**`PATH`** āύāĻžāĻŽā§ āĻāĻāĻāĻŋ **āĻŦāĻŋāĻļā§āώ** āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋā§ā§āĻŦāϞ āϰā§ā§āĻā§, āϝā§āĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϰāĻžāύ āĻāϰāĻžāϰ āĻāύā§āϝ āĻ
āĻĒāĻžāϰā§āĻāĻŋāĻ āϏāĻŋāϏā§āĻā§āĻŽāϏ (āϞāĻŋāύāĻžāĻā§āϏ, āĻŽā§āϝāĻžāĻāĻāĻāϏ, āĻāĻāύā§āĻĄā§āĻ) āĻĻā§āĻŦāĻžāϰāĻž āĻŦā§āϝāĻŦāĻšā§āϤ āĻšā§āĨ¤
+
+`PATH` āĻā§āϰāĻŋā§ā§āĻŦāϞ āĻāϰ āĻā§āϝāĻžāϞ⧠āĻšāĻā§āĻā§ āĻāĻāĻāĻŋ āĻŦāĻŋāĻļāĻžāϞ āϏā§āĻā§āϰāĻŋāĻ āϝāĻž āĻĄāĻŋāϰā§āĻā§āĻāϰāĻŋāĻā§ āĻā§āϞāύ `:` āĻĻāĻŋā§ā§ āĻāϞāĻžāĻĻāĻž āĻāϰāĻžāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āϞāĻŋāύāĻžāĻā§āϏ⧠āĻ āĻŽā§āϝāĻžāĻāĻāĻāϏ āĻ, āĻāĻŦāĻ āϏā§āĻŽāĻŋāĻā§āϞāύ `;` āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāĻāύā§āĻĄā§āĻ āĻ āϤā§āϰāĻŋ āĻāϰāĻž āĻĨāĻžāĻā§āĨ¤
+
+āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, `PATH` āĻā§āϰāĻŋā§ā§āĻŦāϞ āύāĻŋāĻā§āϰ āĻŽāϤ⧠āĻĻā§āĻāϤ⧠āĻšāϤ⧠āĻĒāĻžāϰā§āĻ
+
+//// tab | āϞāĻŋāύāĻžāĻā§āϏ, āĻŽā§āϝāĻžāĻāĻāĻāϏ
+
+```plaintext
+/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
+```
+
+āϤāĻžāϰāĻŽāĻžāύ⧠āĻšāϞ⧠āϏāĻŋāϏā§āĻā§āĻŽ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞā§āĻā§ āύāĻŋāĻā§āϰ āĻĄāĻŋāϰā§āĻā§āĻāϰāĻŋāĻā§āϞā§āϤ⧠āĻā§āĻāĻāĻŦā§āĻ
+
+* `/usr/local/bin`
+* `/usr/bin`
+* `/bin`
+* `/usr/sbin`
+* `/sbin`
+
+////
+
+//// tab | āĻāĻāύā§āĻĄā§āĻ
+
+```plaintext
+C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32
+```
+
+āϤāĻžāϰāĻŽāĻžāύ⧠āĻšāϞ⧠āϏāĻŋāϏā§āĻā§āĻŽ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞā§āĻā§ āύāĻŋāĻā§āϰ āĻĄāĻŋāϰā§āĻā§āĻāϰāĻŋāĻā§āϞā§āϤ⧠āĻā§āĻāĻāĻŦā§āĻ
+
+* `C:\Program Files\Python312\Scripts`
+* `C:\Program Files\Python312`
+* `C:\Windows\System32`
+
+////
+
+āϝāĻāύ āĻāĻĒāύāĻŋ āĻāĻžāϰā§āĻŽāĻŋāύāĻžāϞ⧠āĻā§āύ⧠**āĻāĻŽāĻžāύā§āĻĄ** āϞāĻŋāĻāĻŦā§āύ, āĻ
āĻĒāĻžāϰā§āĻāĻŋāĻ āϏāĻŋāϏā§āĻā§āĻŽ **āĻĒā§āϰāϤā§āϝā§āĻāĻāĻŋ āĻĄāĻŋāϰā§āĻā§āĻāϰāĻŋāϤā§** āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ **āĻā§āĻāĻāĻŦā§** āϝā§āĻā§āϞ⧠`PATH` āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋā§ā§āĻŦāϞ āĻ āϞāĻŋāϏā§āĻ āĻāϰāĻž āĻāĻā§āĨ¤
+
+āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āϝāĻāύ āĻāĻĒāύāĻŋ āĻāĻžāϰā§āĻŽāĻŋāύāĻžāϞ⧠`python` āĻāĻžāĻāĻĒ āĻāϰāĻŦā§āύ, āĻ
āĻĒāĻžāϰā§āĻāĻŋāĻ āϏāĻŋāϏā§āĻā§āĻŽ āĻāĻ āϞāĻŋāϏā§āĻ āĻāϰ **āĻĒā§āϰāĻĨāĻŽ āĻĄāĻŋāϰā§āĻā§āĻāϰāĻŋāϤā§** `python` āύāĻžāĻŽā§āϰ āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻā§āĻāĻāĻŦā§āĨ¤
+
+āϝāĻĻāĻŋ āĻāĻāĻŋ āĻā§āĻāĻā§ āĻĒāĻžā§, āϤāĻžāĻšāϞ⧠āĻāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋāĻā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§āĨ¤ āĻ
āύā§āϝāĻĨāĻžā§ āĻāĻāĻŋ **āĻ
āύā§āϝāĻžāύā§āϝ āĻĄāĻŋāϰā§āĻā§āĻāϰāĻŋāĻā§āϞā§āϤā§** āĻāĻāĻŋāĻā§ āĻā§āĻāĻāϤ⧠āĻĨāĻžāĻāĻŦā§āĨ¤
+
+### āĻĒāĻžāĻāĻĨāύ āĻāύāϏā§āĻāϞ āĻāĻŦāĻ `PATH` āĻāĻĒāĻĄā§āĻ
+
+āϝāĻāύ āĻāĻĒāύāĻŋ āĻĒāĻžāĻāĻĨāύ āĻāύāϏā§āĻāϞ āĻāϰā§āύ, āĻāĻĒāύāĻŋ `PATH` āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋā§ā§āĻŦāϞ āĻāĻĒāĻĄā§āĻ āĻāϰāϤ⧠āĻāĻžāύ āĻāĻŋāύāĻž āϏā§āĻāĻž āĻāĻŋāĻā§āĻā§āϏ āĻāϰāĻž āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤
+
+//// tab | āϞāĻŋāύāĻžāĻā§āϏ, āĻŽā§āϝāĻžāĻāĻāĻāϏ
+
+āϧāϰāĻž āϝāĻžāĻ āĻāĻĒāύāĻŋ āĻĒāĻžāĻāĻĨāύ āĻāύāϏā§āĻāϞ āĻāϰāϞā§āύ āĻāĻŦāĻ āĻāĻāĻŋ `/opt/custompython/bin` āĻĄāĻŋāϰā§āĻā§āĻāϰāĻŋāϤ⧠āĻāύāϏā§āĻāϞ āĻšāĻā§āĻā§āĨ¤
+
+āϝāĻĻāĻŋ āĻāĻĒāύāĻŋ "Yes" āϏāĻŋāϞā§āĻā§āĻ āĻāϰ⧠`PATH` āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋā§ā§āĻŦāϞ āĻāĻĒāĻĄā§āĻ āĻāϰāϤ⧠āĻāĻžāύ, āϤāĻžāĻšāϞ⧠āĻāύāϏā§āĻāϞāĻžāϰ `/opt/custompython/bin` āĻā§ `PATH` āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋā§ā§āĻŦāϞ āĻ āĻāĻĄ āĻāϰ⧠āĻĻāĻŋāĻŦā§āĨ¤
+
+āĻāĻāĻž āĻĻā§āĻāϤ⧠āĻāĻŽāύāĻāĻž āĻšāϤ⧠āĻĒāĻžāϰā§āĻ
+
+```plaintext
+/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/custompython/bin
+```
+
+āĻāĻāĻāĻžāĻŦā§, āĻāĻĒāύāĻŋ āϝāĻāύ āĻāĻžāϰā§āĻŽāĻŋāύāĻžāϞ⧠`python` āĻāĻžāĻāĻĒ āĻāϰā§āύ, āϏāĻŋāϏā§āĻā§āĻŽ āĻĒāĻžāĻāĻĨāύ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋāĻā§ `/opt/custompython/bin` (āϏāϰā§āĻŦāĻļā§āώ āĻĄāĻŋāϰā§āĻā§āĻāϰāĻŋ) āϤ⧠āĻā§āĻāĻā§ āĻĒāĻžāĻŦā§ āĻāĻŦāĻ āĻāĻāĻžāĻā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§āĨ¤
+
+////
+
+//// tab | āĻāĻāύā§āĻĄā§āĻ
+
+āϧāϰāĻž āϝāĻžāĻ āĻāĻĒāύāĻŋ āĻĒāĻžāĻāĻĨāύ āĻāύāϏā§āĻāϞ āĻāϰāϞā§āύ āĻāĻŦāĻ āĻāĻāĻŋ `C:\opt\custompython\bin` āĻĄāĻŋāϰā§āĻā§āĻāϰāĻŋāϤ⧠āĻāύāϏā§āĻāϞ āĻšāĻā§āĻā§āĨ¤
+
+āϝāĻĻāĻŋ āĻāĻĒāύāĻŋ "Yes" āϏāĻŋāϞā§āĻā§āĻ āĻāϰ⧠`PATH` āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋā§ā§āĻŦāϞ āĻāĻĒāĻĄā§āĻ āĻāϰāϤ⧠āĻāĻžāύ, āϤāĻžāĻšāϞ⧠āĻāύāϏā§āĻāϞāĻžāϰ `C:\opt\custompython\bin` āĻā§ `PATH` āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋā§ā§āĻŦāϞ āĻ āĻāĻĄ āĻāϰ⧠āĻĻāĻŋāĻŦā§āĨ¤
+
+```plaintext
+C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32;C:\opt\custompython\bin
+```
+
+āĻāĻāĻāĻžāĻŦā§, āĻāĻĒāύāĻŋ āϝāĻāύ āĻāĻžāϰā§āĻŽāĻŋāύāĻžāϞ⧠`python` āĻāĻžāĻāĻĒ āĻāϰā§āύ, āϏāĻŋāϏā§āĻā§āĻŽ āĻĒāĻžāĻāĻĨāύ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋāĻā§ `C:\opt\custompython\bin` (āϏāϰā§āĻŦāĻļā§āώ āĻĄāĻŋāϰā§āĻā§āĻāϰāĻŋ) āϤ⧠āĻā§āĻāĻā§ āĻĒāĻžāĻŦā§ āĻāĻŦāĻ āĻāĻāĻžāĻā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§āĨ¤
+
+////
+
+āϤāĻžāĻ, āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻžāĻāĻĒ āĻāϰā§āύāĻ
+
+
+
+```console
+$ python
+```
+
+
+
+//// tab | āϞāĻŋāύāĻžāĻā§āϏ, āĻŽā§āϝāĻžāĻāĻāĻāϏ
+
+āϏāĻŋāϏā§āĻā§āĻŽ `python` āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§ `/opt/custompython/bin` āĻ **āĻā§āĻāĻā§ āĻĒāĻžāĻŦā§** āĻāĻŦāĻ āĻāĻāĻžāĻā§ āϰāĻžāύ āĻāϰāĻŦā§āĨ¤
+
+āĻāĻāĻž āĻŽā§āĻāĻžāĻŽā§āĻāĻŋāĻāĻžāĻŦā§ āύāĻŋāĻā§āϰ āĻŽāϤ⧠āĻāϰ⧠āϞā§āĻāĻžāϰ āϏāĻŽāĻžāύ āĻšāĻŦā§āĻ
+
+
+
+```console
+$ /opt/custompython/bin/python
+```
+
+
+
+////
+
+//// tab | āĻāĻāύā§āĻĄā§āĻ
+
+āϏāĻŋāϏā§āĻā§āĻŽ `python` āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§ `C:\opt\custompython\bin\python` āĻ **āĻā§āĻāĻā§ āĻĒāĻžāĻŦā§** āĻāĻŦāĻ āĻāĻāĻžāĻā§ āϰāĻžāύ āĻāϰāĻŦā§āĨ¤
+
+āĻāĻāĻž āĻŽā§āĻāĻžāĻŽā§āĻāĻŋāĻāĻžāĻŦā§ āύāĻŋāĻā§āϰ āĻŽāϤ⧠āĻāϰ⧠āϞā§āĻāĻžāϰ āϏāĻŽāĻžāύ āĻšāĻŦā§āĻ
+
+
+
+```console
+$ C:\opt\custompython\bin\python
+```
+
+
+
+////
+
+āĻāĻ āϤāĻĨā§āϝāĻā§āϞ⧠[āĻāĻžāϰā§āĻā§ā§āĻžāϞ āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻāϏ](virtual-environments.md){.internal-link target=_blank} āĻļā§āĻāĻžāϰ āĻā§āώā§āϤā§āϰ⧠āϏāĻšāĻžā§āĻ āĻšāĻŦā§āĨ¤
+
+## āĻāĻĒāϏāĻāĻšāĻžāϰ
+
+āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāĻĒāύāĻŋ **āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋā§ā§āĻŦāϞāϏ** āĻāĻŋ āĻāĻŦāĻ āĻāĻāĻŋāĻā§ āĻĒāĻžāĻāĻĨāύ⧠āĻāĻŋāĻāĻžāĻŦā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻšā§ āϤāĻžāϰ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻŦā§āϏāĻŋāĻ āϧāĻžāϰāύāĻž āĻĒā§āϞā§āύāĨ¤
+
+āĻāĻžāĻāϞ⧠āĻāĻ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāϰ⧠āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āĻĒā§āϤ⧠āĻĒāĻžāϰā§āύ Wikipedia for Environment Variable āĻāĨ¤
+
+āĻ
āύā§āĻ āĻā§āώā§āϤā§āϰā§, āĻĻā§āĻāĻž āĻŽāĻžāϤā§āϰāĻ āĻāύāĻāĻžāϝāĻŧāϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ āĻā§āĻāĻžāĻŦā§ āĻĒā§āϰā§ā§āĻāύ āĻšāĻŦā§ āϤāĻž āϏā§āĻĒāώā§āĻ āĻšā§ āύāĻžāĨ¤ āĻāĻŋāύā§āϤ⧠āĻĄā§āĻā§āϞāĻĒāĻŽā§āύā§āĻā§āϰ āϏāĻŽāϝāĻŧ āĻāĻĒāύāĻŋ āύāĻžāύāĻž āϰāĻāĻŽ āĻĒāϰāĻŋāϏā§āĻĨāĻŋāϤāĻŋāϤ⧠āĻāĻā§āϞā§āϰ āϏāĻŽā§āĻŽā§āĻā§āύ āĻšāĻŦā§āύ, āϤāĻžāĻ āĻāĻā§āϞ⧠āϏāĻŽā§āĻĒāϰā§āĻā§ āĻā§āύ⧠āϰāĻžāĻāĻž āĻāĻžāϞā§āĨ¤
+
+āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāĻĒāύāĻžāϰ āĻāĻ āĻāύāĻĢāϰāĻŽā§āĻļāύāĻāĻŋ āĻĒāϰāĻŦāϰā§āϤā§, [āĻāĻžāϰā§āĻā§ā§āĻžāϞ āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻāϏ](virtual-environments.md) āĻ
āĻāĻļā§ āĻĻāϰāĻāĻžāϰ āĻšāĻŦā§āĨ¤
diff --git a/docs/bn/docs/index.md b/docs/bn/docs/index.md
index 678ac9ca9..74ee230a1 100644
--- a/docs/bn/docs/index.md
+++ b/docs/bn/docs/index.md
@@ -5,15 +5,18 @@
FastAPI āĻāĻā§āĻāĻā§āώāĻŽāϤāĻž āϏāĻŽā§āĻĒāύā§āύ, āϏāĻšāĻā§ āĻļā§āĻāĻžāϰ āĻāĻŦāĻ āĻĻā§āϰā§āϤ āĻā§āĻĄ āĻāϰ⧠āĻĒā§āϰā§āĻĄāĻžāĻāĻļāύā§āϰ āĻāύā§āϝ āĻĢā§āϰāĻžāĻŽāĻā§āĻžāϰā§āĻāĨ¤
-
-
+
+
-
-
+
+
+
+
+
---
diff --git a/docs/de/docs/advanced/generate-clients.md b/docs/de/docs/advanced/generate-clients.md
index 38a69031c..f491d29af 100644
--- a/docs/de/docs/advanced/generate-clients.md
+++ b/docs/de/docs/advanced/generate-clients.md
@@ -20,7 +20,7 @@ Einige von diesen ⨠[**sponsern FastAPI**](../help-fastapi.md#den-autor-sponse
Und es zeigt deren wahres Engagement fÃŧr FastAPI und seine **Community** (Sie), da diese Ihnen nicht nur einen **guten Service** bieten mÃļchten, sondern auch sicherstellen mÃļchten, dass Sie Ãŧber ein **gutes und gesundes Framework** verfÃŧgen, FastAPI. đ
-Beispielsweise kÃļnnten Sie Speakeasy ausprobieren.
+Beispielsweise kÃļnnten Sie Speakeasy ausprobieren.
Es gibt auch mehrere andere Unternehmen, welche ähnliche Dienste anbieten und die Sie online suchen und finden kÃļnnen. đ¤
diff --git a/docs/de/docs/deployment/concepts.md b/docs/de/docs/deployment/concepts.md
index 97ad854e2..907598e54 100644
--- a/docs/de/docs/deployment/concepts.md
+++ b/docs/de/docs/deployment/concepts.md
@@ -216,7 +216,7 @@ Dieser Manager-Prozess wäre wahrscheinlich derjenige, welcher der IP am **Port*
Diese Workerprozesse wÃŧrden Ihre Anwendung ausfÃŧhren, sie wÃŧrden die Hauptberechnungen durchfÃŧhren, um einen **Request** entgegenzunehmen und eine **Response** zurÃŧckzugeben, und sie wÃŧrden alles, was Sie in Variablen einfÃŧgen, in den RAM laden.
-
+
Und natÃŧrlich wÃŧrden auf derselben Maschine neben Ihrer Anwendung wahrscheinlich auch **andere Prozesse** laufen.
diff --git a/docs/de/docs/deployment/https.md b/docs/de/docs/deployment/https.md
index 630582995..a216f44af 100644
--- a/docs/de/docs/deployment/https.md
+++ b/docs/de/docs/deployment/https.md
@@ -85,7 +85,7 @@ Zuerst wÃŧrde der Browser mithilfe der **DNS-Server** herausfinden, welches die
Die DNS-Server geben dem Browser eine bestimmte **IP-Adresse** zurÃŧck. Das wäre die von Ihrem Server verwendete Ãļffentliche IP-Adresse, die Sie in den DNS-Servern konfiguriert haben.
-
+
### TLS-Handshake-Start
@@ -93,7 +93,7 @@ Der Browser kommuniziert dann mit dieser IP-Adresse Ãŧber **Port 443** (den HTTP
Der erste Teil der Kommunikation besteht lediglich darin, die Verbindung zwischen dem Client und dem Server herzustellen und die zu verwendenden kryptografischen SchlÃŧssel usw. zu vereinbaren.
-
+
Diese Interaktion zwischen dem Client und dem Server zum Aufbau der TLS-Verbindung wird als **TLS-Handshake ** bezeichnet.
@@ -111,7 +111,7 @@ Mithilfe der oben beschriebenen **SNI-Erweiterung** wÃŧrde der TLS-Terminierungs
In diesem Fall wÃŧrde er das Zertifikat fÃŧr `someapp.example.com` verwenden.
-
+
Der Client **vertraut** bereits der Entität, die das TLS-Zertifikat generiert hat (in diesem Fall Let's Encrypt, aber wir werden später mehr darÃŧber erfahren), sodass er **verifizieren** kann, dass das Zertifikat gÃŧltig ist.
@@ -133,19 +133,19 @@ Da Client und Server (sprich, der Browser und der TLS-Terminierungsproxy) nun Ãŧ
Der Client sendet also einen **HTTPS-Request**. Das ist einfach ein HTTP-Request Ãŧber eine verschlÃŧsselte TLS-Verbindung.
-
+
### Den Request entschlÃŧsseln
Der TLS-Terminierungsproxy wÃŧrde die vereinbarte VerschlÃŧsselung zum **EntschlÃŧsseln des Requests** verwenden und den **einfachen (entschlÃŧsselten) HTTP-Request** an den Prozess weiterleiten, der die Anwendung ausfÃŧhrt (z. B. einen Prozess, bei dem Uvicorn die FastAPI-Anwendung ausfÃŧhrt).
-
+
### HTTP-Response
Die Anwendung wÃŧrde den Request verarbeiten und eine **einfache (unverschlÃŧsselte) HTTP-Response** an den TLS-Terminierungsproxy senden.
-
+
### HTTPS-Response
@@ -153,7 +153,7 @@ Der TLS-Terminierungsproxy wÃŧrde dann die Response mithilfe der zuvor vereinbar
Als Nächstes ÃŧberprÃŧft der Browser, ob die Response gÃŧltig und mit dem richtigen kryptografischen SchlÃŧssel usw. verschlÃŧsselt ist. AnschlieÃend **entschlÃŧsselt er die Response** und verarbeitet sie.
-
+
Der Client (Browser) weiÃ, dass die Response vom richtigen Server kommt, da dieser die Kryptografie verwendet, die zuvor mit dem **HTTPS-Zertifikat** vereinbart wurde.
@@ -163,7 +163,7 @@ Auf demselben Server (oder denselben Servern) kÃļnnten sich **mehrere Anwendunge
Nur ein Prozess kann diese spezifische IP und den Port verarbeiten (in unserem Beispiel der TLS-Terminierungsproxy), aber die anderen Anwendungen/Prozesse kÃļnnen auch auf dem/den Server(n) ausgefÃŧhrt werden, solange sie nicht versuchen, dieselbe **Kombination aus Ãļffentlicher IP und Port** zu verwenden.
-
+
Auf diese Weise kÃļnnte der TLS-Terminierungsproxy HTTPS und Zertifikate fÃŧr **mehrere Domains**, fÃŧr mehrere Anwendungen, verarbeiten und die Requests dann jeweils an die richtige Anwendung weiterleiten.
@@ -173,7 +173,7 @@ Irgendwann in der Zukunft wÃŧrde jedes Zertifikat **ablaufen** (etwa 3 Monate na
Und dann gäbe es ein anderes Programm (in manchen Fällen ist es ein anderes Programm, in manchen Fällen ist es derselbe TLS-Terminierungsproxy), das mit Let's Encrypt kommuniziert und das/die Zertifikat(e) erneuert.
-
+
Die **TLS-Zertifikate** sind **einem Domainnamen zugeordnet**, nicht einer IP-Adresse.
diff --git a/docs/de/docs/how-to/custom-docs-ui-assets.md b/docs/de/docs/how-to/custom-docs-ui-assets.md
index ab8cd9f6b..f68902b99 100644
--- a/docs/de/docs/how-to/custom-docs-ui-assets.md
+++ b/docs/de/docs/how-to/custom-docs-ui-assets.md
@@ -98,7 +98,7 @@ Sie kÃļnnen wahrscheinlich mit der rechten Maustaste auf jeden Link klicken und
Und **ReDoc** verwendet diese Datei:
-* `redoc.standalone.js`
+* `redoc.standalone.js`
Danach kÃļnnte Ihre Dateistruktur wie folgt aussehen:
@@ -129,14 +129,8 @@ Sie sollten eine sehr lange JavaScript-Datei fÃŧr **ReDoc** sehen.
Sie kÃļnnte beginnen mit etwas wie:
```JavaScript
-/*!
- * ReDoc - OpenAPI/Swagger-generated API Reference Documentation
- * -------------------------------------------------------------
- * Version: "2.0.0-rc.18"
- * Repo: https://github.com/Redocly/redoc
- */
-!function(e,t){"object"==typeof exports&&"object"==typeof m
-
+/*! For license information please see redoc.standalone.js.LICENSE.txt */
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("null")):
...
```
diff --git a/docs/de/docs/index.md b/docs/de/docs/index.md
index 411c8e969..d239f0815 100644
--- a/docs/de/docs/index.md
+++ b/docs/de/docs/index.md
@@ -12,7 +12,7 @@
-
+
diff --git a/docs/de/docs/tutorial/bigger-applications.md b/docs/de/docs/tutorial/bigger-applications.md
index 59e91bdcc..514e3fd3a 100644
--- a/docs/de/docs/tutorial/bigger-applications.md
+++ b/docs/de/docs/tutorial/bigger-applications.md
@@ -52,7 +52,7 @@ from app.routers import items
* Es gibt auch ein Unterverzeichnis `app/internal/` mit einer weiteren Datei `__init__.py`, es handelt sich also um ein weiteres âPython-Subpackageâ: `app.internal`.
* Und die Datei `app/internal/admin.py` ist ein weiteres Submodul: `app.internal.admin`.
-
+
Die gleiche Dateistruktur mit Kommentaren:
@@ -270,7 +270,7 @@ Aber diese Datei existiert nicht, unsere Abhängigkeiten befinden sich in einer
Erinnern Sie sich, wie unsere Anwendungs-/Dateistruktur aussieht:
-
+
---
diff --git a/docs/de/docs/tutorial/query-params-str-validations.md b/docs/de/docs/tutorial/query-params-str-validations.md
index f181d501c..de8879ce8 100644
--- a/docs/de/docs/tutorial/query-params-str-validations.md
+++ b/docs/de/docs/tutorial/query-params-str-validations.md
@@ -315,22 +315,6 @@ Wenn Sie einen Parameter erforderlich machen wollen, während Sie `Query` verwen
{* ../../docs_src/query_params_str_validations/tutorial006_an_py39.py hl[9] *}
-### Erforderlich mit Ellipse (`...`)
-
-Es gibt eine Alternative, die explizit deklariert, dass ein Wert erforderlich ist. Sie kÃļnnen als Default das Literal `...` setzen:
-
-{* ../../docs_src/query_params_str_validations/tutorial006b_an_py39.py hl[9] *}
-
-/// info
-
-Falls Sie das `...` bisher noch nicht gesehen haben: Es ist ein spezieller einzelner Wert, Teil von Python und wird âEllipsisâ genannt (Deutsch: Ellipse).
-
-Es wird von Pydantic und FastAPI verwendet, um explizit zu deklarieren, dass ein Wert erforderlich ist.
-
-///
-
-Dies wird **FastAPI** wissen lassen, dass dieser Parameter erforderlich ist.
-
### Erforderlich, kann `None` sein
Sie kÃļnnen deklarieren, dass ein Parameter `None` akzeptiert, aber dennoch erforderlich ist. Das zwingt Clients, den Wert zu senden, selbst wenn er `None` ist.
diff --git a/docs/em/docs/deployment/concepts.md b/docs/em/docs/deployment/concepts.md
index 019703296..bbb017277 100644
--- a/docs/em/docs/deployment/concepts.md
+++ b/docs/em/docs/deployment/concepts.md
@@ -216,7 +216,7 @@
đ đ¨âđ đ ī¸ đ đ đââ đ đ¸, đĢ đ đ đ đ đ¨ **đ¨** & đ¨ **đ¨**, & đĢ đ đ đŗ đ đŽ đĸ đž.
-
+
& âī¸, đ đ° đ đ˛ âī¸ **đ đ ī¸** đ đ, âī¸ âĒī¸âĄī¸ đ đ¸.
diff --git a/docs/em/docs/deployment/https.md b/docs/em/docs/deployment/https.md
index 31cf99001..6d2641a92 100644
--- a/docs/em/docs/deployment/https.md
+++ b/docs/em/docs/deployment/https.md
@@ -85,7 +85,7 @@
đ đŊ đ đŦ đĨ âī¸ đ¯ **đĸ đĸ**. đ đ đĸ đĸ đĸ âī¸ đ đŊ, đ đ đ đ đŊ.
-
+
### đ¤ đ¤ âļī¸
@@ -93,7 +93,7 @@
đĨ đ đģ đ ī¸ đ đ đŠâđģ & đŊ & đ đ đ đĢ đ âī¸, âī¸.
-
+
đ đ đ đŠâđģ & đŊ đ ī¸ đ¤ đ đ¤ **đ¤ đ¤**.
@@ -111,7 +111,7 @@
đ đŧ, âĢī¸ đ âī¸ đ `someapp.example.com`.
-
+
đŠâđģ âĒ **đ** đ¨âđŧ đ đ đ đ¤ đ (đ đŧ âĄī¸ đ, âī¸ đĨ đ đ đ đ âĒ), âĢī¸ đĒ **â** đ đ â.
@@ -133,19 +133,19 @@
, đŠâđģ đ¨ **đēđ¸đ đ¨**. đ đēđ¸đ đ¨ đ đ đ¤ đ.
-
+
### đ đ¨
đ¤ â đŗ đ âī¸ đ â **đ đ¨**, & đ đļ **â
(đ) đēđ¸đ đ¨** đ ī¸ đ đ¸ (đŧ đ ī¸ âŽī¸ Uvicorn đââ FastAPI đ¸).
-
+
### đēđ¸đ đ¨
đ¸ đ đ ī¸ đ¨ & đ¨ **â
(đŊ) đēđ¸đ đ¨** đ¤ â đŗ.
-
+
### đēđ¸đ đ¨
@@ -153,7 +153,7 @@
â, đĨ đ â đ đ¨ â & đ âŽī¸ âļī¸ī¸ đ đ, âī¸. âĢī¸ đ â¤´ī¸ **đ đ¨** & đ ī¸ âĢī¸.
-
+
đŠâđģ (đĨ) đ đ đ đ¨ đ âĒī¸âĄī¸ â đŊ âŠī¸ âĢī¸ âī¸ â đĢ â âī¸ **đēđ¸đ đ** â.
@@ -163,7 +163,7 @@
đ´ 1ī¸âŖ đ ī¸ đĒ đ đ¯ đĸ & â´ (đ¤ â đŗ đ đŧ) âī¸ đ đ¸/đ ī¸ đĒ đ đ đŊ(â) đââī¸, đ đĢ đĢ đ âī¸ đ **đ đĸ đĸ & â´**.
-
+
đ đ, đ¤ â đŗ đĒ đĩ đēđ¸đ & đ **đ đ**, đ đ¸, & â¤´ī¸ đļ đ¨ âļī¸ī¸ đ¸ đ đŧ.
@@ -173,7 +173,7 @@
& ⤴ī¸, đ¤ đ â1ī¸âŖ đ (đŧ âĢī¸ â1ī¸âŖ đ, đŧ âĢī¸ đĒ đ đ¤ â đŗ) đ đ đŦ âĄī¸ đ, & âģ đ(â).
-
+
**đ¤ đ** **đ âŽī¸ đ đ**, đĢ âŽī¸ đĸ đĸ.
diff --git a/docs/em/docs/index.md b/docs/em/docs/index.md
index 16b2019d3..57be59b07 100644
--- a/docs/em/docs/index.md
+++ b/docs/em/docs/index.md
@@ -12,7 +12,7 @@
-
+
diff --git a/docs/em/docs/tutorial/bigger-applications.md b/docs/em/docs/tutorial/bigger-applications.md
index 68f506f27..78a321ae6 100644
--- a/docs/em/docs/tutorial/bigger-applications.md
+++ b/docs/em/docs/tutorial/bigger-applications.md
@@ -52,7 +52,7 @@ from app.routers import items
* đ¤ đ `app/internal/` âŽī¸ â1ī¸âŖ đ `__init__.py`, âĢī¸ â1ī¸âŖ "đ đĻ": `app.internal`.
* & đ `app/internal/admin.py` â1ī¸âŖ đ: `app.internal.admin`.
-
+
đ đ đ âŽī¸ đ¤:
@@ -244,7 +244,7 @@ from .dependencies import get_token_header
đ â đ đą/đ đ đ đ:
-
+
---
diff --git a/docs/em/docs/tutorial/query-params-str-validations.md b/docs/em/docs/tutorial/query-params-str-validations.md
index dbaab5735..fd077bf8f 100644
--- a/docs/em/docs/tutorial/query-params-str-validations.md
+++ b/docs/em/docs/tutorial/query-params-str-validations.md
@@ -148,22 +148,6 @@ q: Union[str, None] = Query(default=None, min_length=3)
{* ../../docs_src/query_params_str_validations/tutorial006.py hl[7] *}
-### â âŽī¸ â (`...`)
-
-đ¤ đ đ đ¯ đŖ đ đ˛ â. đ đĒ â `default` đĸ đ đ˛ `...`:
-
-{* ../../docs_src/query_params_str_validations/tutorial006b.py hl[7] *}
-
-/// info
-
-đĨ đ đĢ đ đ `...` â: âĢī¸ đ đ đ˛, âĢī¸ đ đ & đ¤ "â" .
-
-âĢī¸ âī¸ Pydantic & FastAPI đ¯ đŖ đ đ˛ â.
-
-///
-
-đ đ âĄī¸ **FastAPI** đ đ đ đĸ â.
-
### â âŽī¸ `None`
đ đĒ đŖ đ đĸ đĒ đĢ `None`, âī¸ đ âĢī¸ â. đ đ ⥠đŠâđģ đ¨ đ˛, đĨ đ˛ `None`.
@@ -178,18 +162,6 @@ Pydantic, â âĢī¸â đī¸ đ đŊ đŦ & đ ī¸ FastAPI, âī¸
///
-### âī¸ Pydantic `Required` âŠī¸ â (`...`)
-
-đĨ đ đ đŦ âī¸ `...`, đ đĒ đ & âī¸ `Required` âĒī¸âĄī¸ Pydantic:
-
-{* ../../docs_src/query_params_str_validations/tutorial006d.py hl[2,8] *}
-
-/// tip
-
-đ đ đ
đŧ, đâ đŗ đ, đ đĒ đ¯ đĢ `default` đĸ, đ đ đĢ âī¸ âī¸ `...` đĢ `Required`.
-
-///
-
## đĸ đĸ đ / đ đ˛
đâ đ đŦ đĸ đĸ đ¯ âŽī¸ `Query` đ đĒ đŖ âĢī¸ đ¨ đ đ˛, âī¸ đââ đ đ, đ¨ đ đ˛.
diff --git a/docs/en/data/contributors.yml b/docs/en/data/contributors.yml
index f679d7286..05ff0c7d4 100644
--- a/docs/en/data/contributors.yml
+++ b/docs/en/data/contributors.yml
@@ -1,13 +1,23 @@
tiangolo:
login: tiangolo
- count: 697
+ count: 768
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
url: https://github.com/tiangolo
dependabot:
login: dependabot
- count: 89
+ count: 106
avatarUrl: https://avatars.githubusercontent.com/in/29110?v=4
url: https://github.com/apps/dependabot
+alejsdev:
+ login: alejsdev
+ count: 48
+ avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=638c65283ac9e9e2c3a0f9d1e3370db4b8a2c58d&v=4
+ url: https://github.com/alejsdev
+pre-commit-ci:
+ login: pre-commit-ci
+ count: 37
+ avatarUrl: https://avatars.githubusercontent.com/in/68672?v=4
+ url: https://github.com/apps/pre-commit-ci
github-actions:
login: github-actions
count: 26
@@ -15,19 +25,9 @@ github-actions:
url: https://github.com/apps/github-actions
Kludex:
login: Kludex
- count: 22
+ count: 23
avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4
url: https://github.com/Kludex
-pre-commit-ci:
- login: pre-commit-ci
- count: 22
- avatarUrl: https://avatars.githubusercontent.com/in/68672?v=4
- url: https://github.com/apps/pre-commit-ci
-alejsdev:
- login: alejsdev
- count: 21
- avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=356f39ff3f0211c720b06d3dbb060e98884085e3&v=4
- url: https://github.com/alejsdev
dmontagu:
login: dmontagu
count: 17
@@ -68,6 +68,11 @@ vishnuvskvkl:
count: 8
avatarUrl: https://avatars.githubusercontent.com/u/84698110?u=8af5de0520dd4fa195f53c2850a26f57c0f6bc64&v=4
url: https://github.com/vishnuvskvkl
+svlandeg:
+ login: svlandeg
+ count: 7
+ avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4
+ url: https://github.com/svlandeg
alissadb:
login: alissadb
count: 6
@@ -88,16 +93,16 @@ waynerv:
count: 5
avatarUrl: https://avatars.githubusercontent.com/u/39515546?u=ec35139777597cdbbbddda29bf8b9d4396b429a9&v=4
url: https://github.com/waynerv
-svlandeg:
- login: svlandeg
- count: 5
- avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4
- url: https://github.com/svlandeg
krishnamadhavan:
login: krishnamadhavan
count: 5
avatarUrl: https://avatars.githubusercontent.com/u/31798870?u=950693b28f3ae01105fd545c046e46ca3d31ab06&v=4
url: https://github.com/krishnamadhavan
+alv2017:
+ login: alv2017
+ count: 5
+ avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4
+ url: https://github.com/alv2017
jekirl:
login: jekirl
count: 4
@@ -108,6 +113,11 @@ hitrust:
count: 4
avatarUrl: https://avatars.githubusercontent.com/u/3360631?u=5fa1f475ad784d64eb9666bdd43cc4d285dcc773&v=4
url: https://github.com/hitrust
+ShahriyarR:
+ login: ShahriyarR
+ count: 4
+ avatarUrl: https://avatars.githubusercontent.com/u/3852029?u=631b2ae59360ab380c524b32bc3d245aff1165af&v=4
+ url: https://github.com/ShahriyarR
adriangb:
login: adriangb
count: 4
@@ -116,7 +126,7 @@ adriangb:
iudeen:
login: iudeen
count: 4
- avatarUrl: https://avatars.githubusercontent.com/u/10519440?u=2843b3303282bff8b212dcd4d9d6689452e4470c&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/10519440?u=f09cdd745e5bf16138f29b42732dd57c7f02bee1&v=4
url: https://github.com/iudeen
philipokiokio:
login: philipokiokio
@@ -128,6 +138,11 @@ AlexWendland:
count: 4
avatarUrl: https://avatars.githubusercontent.com/u/3949212?u=c4c0c615e0ea33d00bfe16b779cf6ebc0f58071c&v=4
url: https://github.com/AlexWendland
+YuriiMotov:
+ login: YuriiMotov
+ count: 4
+ avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=b9b13d598dddfab529a52d264df80a900bfe7060&v=4
+ url: https://github.com/YuriiMotov
divums:
login: divums
count: 3
@@ -161,7 +176,7 @@ hukkin:
marcosmmb:
login: marcosmmb
count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/6181089?u=b8567a842b38c5570c315b2b7ca766fa7be6721e&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/6181089?u=03c50eec631857d84df5232890780d00a3f76903&v=4
url: https://github.com/marcosmmb
Serrones:
login: Serrones
@@ -173,11 +188,11 @@ uriyyo:
count: 3
avatarUrl: https://avatars.githubusercontent.com/u/32038156?u=a27b65a9ec3420586a827a0facccbb8b6df1ffb3&v=4
url: https://github.com/uriyyo
-amacfie:
- login: amacfie
+andrew222651:
+ login: andrew222651
count: 3
avatarUrl: https://avatars.githubusercontent.com/u/889657?u=d70187989940b085bcbfa3bedad8dbc5f3ab1fe7&v=4
- url: https://github.com/amacfie
+ url: https://github.com/andrew222651
rkbeatss:
login: rkbeatss
count: 3
@@ -206,13 +221,8 @@ TeoZosa:
graingert:
login: graingert
count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/413772?u=64b77b6aa405c68a9c6bcf45f84257c66eea5f32&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/413772?v=4
url: https://github.com/graingert
-ShahriyarR:
- login: ShahriyarR
- count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/3852029?u=c9a1691e5ebdc94cbf543086099a6ed705cdb873&v=4
- url: https://github.com/ShahriyarR
jaystone776:
login: jaystone776
count: 3
@@ -233,6 +243,11 @@ papb:
count: 3
avatarUrl: https://avatars.githubusercontent.com/u/20914054?u=890511fae7ea90d887e2a65ce44a1775abba38d5&v=4
url: https://github.com/papb
+musicinmybrain:
+ login: musicinmybrain
+ count: 3
+ avatarUrl: https://avatars.githubusercontent.com/u/6898909?u=9010312053e7141383b9bdf538036c7f37fbaba0&v=4
+ url: https://github.com/musicinmybrain
gitworkflows:
login: gitworkflows
count: 3
@@ -301,7 +316,7 @@ dconathan:
Jamim:
login: Jamim
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/5607572?u=0cf3027bec78ba4f0b89802430c136bc69847d7a&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/5607572?u=9ce0b6a6d1a5124e28b3c04d8d26827ca328713a&v=4
url: https://github.com/Jamim
svalouch:
login: svalouch
@@ -356,7 +371,7 @@ sattosan:
michaeloliverx:
login: michaeloliverx
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/55017335?u=e606eb5cc397c07523be47637b1ee796904fbb59&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/55017335?u=efb0cb6e261ff64d862fafb91ee80fc2e1f8a2ed&v=4
url: https://github.com/michaeloliverx
voegtlel:
login: voegtlel
@@ -411,7 +426,7 @@ davidefiocco:
adriencaccia:
login: adriencaccia
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/19605940?u=980b0b366a02791a5600b2e9f9ac2037679acaa8&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/19605940?u=9a59081f46bfc9d839886a49d5092cf572879049&v=4
url: https://github.com/adriencaccia
jamescurtin:
login: jamescurtin
@@ -433,6 +448,11 @@ imba-tjd:
count: 2
avatarUrl: https://avatars.githubusercontent.com/u/24759802?u=01e901a4fe004b4b126549d3ff1c4000fe3720b5&v=4
url: https://github.com/imba-tjd
+johnthagen:
+ login: johnthagen
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/10340167?u=47147fc4e4db1f573bee3fe428deeacb3197bc5f&v=4
+ url: https://github.com/johnthagen
paxcodes:
login: paxcodes
count: 2
@@ -443,6 +463,11 @@ kaustubhgupta:
count: 2
avatarUrl: https://avatars.githubusercontent.com/u/43691873?u=8dd738718ac7ffad4ef31e86b5d780a1141c695d&v=4
url: https://github.com/kaustubhgupta
+kinuax:
+ login: kinuax
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/13321374?u=22dc9873d6d9f2c7e4fc44c6480c3505efb1531f&v=4
+ url: https://github.com/kinuax
wakabame:
login: wakabame
count: 2
@@ -458,11 +483,6 @@ yezz123:
count: 2
avatarUrl: https://avatars.githubusercontent.com/u/52716203?u=d7062cbc6eb7671d5dc9cc0e32a24ae335e0f225&v=4
url: https://github.com/yezz123
-musicinmybrain:
- login: musicinmybrain
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/6898909?u=9010312053e7141383b9bdf538036c7f37fbaba0&v=4
- url: https://github.com/musicinmybrain
softwarebloat:
login: softwarebloat
count: 2
@@ -473,6 +493,11 @@ Lancetnik:
count: 2
avatarUrl: https://avatars.githubusercontent.com/u/44573917?u=f9a18be7324333daf9cc314c35c3051f0a20a7a6&v=4
url: https://github.com/Lancetnik
+joakimnordling:
+ login: joakimnordling
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/6637576?u=df5d99db9b899b399effd429f4358baaa6f7199c&v=4
+ url: https://github.com/joakimnordling
yogabonito:
login: yogabonito
count: 2
@@ -493,6 +518,11 @@ tamird:
count: 2
avatarUrl: https://avatars.githubusercontent.com/u/1535036?v=4
url: https://github.com/tamird
+ndimares:
+ login: ndimares
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/6267663?u=cfb27efde7a7212be8142abb6c058a1aeadb41b1&v=4
+ url: https://github.com/ndimares
rabinlamadong:
login: rabinlamadong
count: 2
@@ -503,3 +533,28 @@ AyushSinghal1794:
count: 2
avatarUrl: https://avatars.githubusercontent.com/u/89984761?v=4
url: https://github.com/AyushSinghal1794
+gsheni:
+ login: gsheni
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/8726321?u=ee3bd9ff6320f4715d1dd9671a3d55cccb65b984&v=4
+ url: https://github.com/gsheni
+DanielKusyDev:
+ login: DanielKusyDev
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/36250676?u=2ea6114ff751fc48b55f231987a0e2582c6b1bd2&v=4
+ url: https://github.com/DanielKusyDev
+DanielYang59:
+ login: DanielYang59
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/80093591?u=63873f701c7c74aac83c906800a1dddc0bc8c92f&v=4
+ url: https://github.com/DanielYang59
+valentinDruzhinin:
+ login: valentinDruzhinin
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4
+ url: https://github.com/valentinDruzhinin
+blueswen:
+ login: blueswen
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/1564148?u=6d6b8cc8f2b5cef715e68d6175154a8a94d518ee&v=4
+ url: https://github.com/blueswen
diff --git a/docs/en/data/external_links.yml b/docs/en/data/external_links.yml
index 9e411a631..50f84ecbf 100644
--- a/docs/en/data/external_links.yml
+++ b/docs/en/data/external_links.yml
@@ -411,3 +411,8 @@ Talks:
author_link: https://twitter.com/chriswithers13
link: https://www.youtube.com/watch?v=3DLwPcrE5mA
title: 'PyCon UK 2019: FastAPI from the ground up'
+ Taiwanese:
+ - author: Blueswen
+ author_link: https://github.com/blueswen
+ link: https://www.youtube.com/watch?v=y3sumuoDq4w
+ title: 'PyCon TW 2024: å
¨æšäŊåŧˇå Python æåå¯č§æ¸Ŧæ§īŧäģĨ FastAPI å Grafana Stack įēäž'
diff --git a/docs/en/data/github_sponsors.yml b/docs/en/data/github_sponsors.yml
index 55fe3dda9..778ec6a95 100644
--- a/docs/en/data/github_sponsors.yml
+++ b/docs/en/data/github_sponsors.yml
@@ -1,38 +1,38 @@
sponsors:
-- - login: bump-sh
- avatarUrl: https://avatars.githubusercontent.com/u/33217836?v=4
- url: https://github.com/bump-sh
- - login: Nixtla
- avatarUrl: https://avatars.githubusercontent.com/u/79945230?v=4
- url: https://github.com/Nixtla
+- - login: renderinc
+ avatarUrl: https://avatars.githubusercontent.com/u/36424661?v=4
+ url: https://github.com/renderinc
- login: andrew-propelauth
- avatarUrl: https://avatars.githubusercontent.com/u/89474256?u=1188c27cb744bbec36447a2cfd4453126b2ddb5c&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/89474256?u=c98993dec8553c09d424ede67bbe86e5c35f48c9&v=4
url: https://github.com/andrew-propelauth
- - login: liblaber
- avatarUrl: https://avatars.githubusercontent.com/u/100821118?v=4
- url: https://github.com/liblaber
- - login: zanfaruqui
- avatarUrl: https://avatars.githubusercontent.com/u/104461687?v=4
- url: https://github.com/zanfaruqui
- login: blockbee-io
avatarUrl: https://avatars.githubusercontent.com/u/115143449?u=1b8620c2d6567c4df2111a371b85a51f448f9b85&v=4
url: https://github.com/blockbee-io
- login: zuplo
avatarUrl: https://avatars.githubusercontent.com/u/85497839?v=4
url: https://github.com/zuplo
- - login: render-sponsorships
- avatarUrl: https://avatars.githubusercontent.com/u/189296666?v=4
- url: https://github.com/render-sponsorships
- - login: porter-dev
- avatarUrl: https://avatars.githubusercontent.com/u/62078005?v=4
- url: https://github.com/porter-dev
+ - login: coderabbitai
+ avatarUrl: https://avatars.githubusercontent.com/u/132028505?v=4
+ url: https://github.com/coderabbitai
+ - login: madisonredtfeldt
+ avatarUrl: https://avatars.githubusercontent.com/u/152656511?v=4
+ url: https://github.com/madisonredtfeldt
+ - login: subtotal
+ avatarUrl: https://avatars.githubusercontent.com/u/176449348?v=4
+ url: https://github.com/subtotal
+ - login: railwayapp
+ avatarUrl: https://avatars.githubusercontent.com/u/66716858?v=4
+ url: https://github.com/railwayapp
+ - login: Nixtla
+ avatarUrl: https://avatars.githubusercontent.com/u/79945230?v=4
+ url: https://github.com/Nixtla
- login: scalar
avatarUrl: https://avatars.githubusercontent.com/u/301879?v=4
url: https://github.com/scalar
-- - login: ObliviousAI
- avatarUrl: https://avatars.githubusercontent.com/u/65656077?v=4
- url: https://github.com/ObliviousAI
-- - login: svix
+- - login: dribia
+ avatarUrl: https://avatars.githubusercontent.com/u/41189616?v=4
+ url: https://github.com/dribia
+ - login: svix
avatarUrl: https://avatars.githubusercontent.com/u/80175132?v=4
url: https://github.com/svix
- login: stainless-api
@@ -44,18 +44,21 @@ sponsors:
- login: databento
avatarUrl: https://avatars.githubusercontent.com/u/64141749?v=4
url: https://github.com/databento
-- - login: mercedes-benz
- avatarUrl: https://avatars.githubusercontent.com/u/34240465?v=4
- url: https://github.com/mercedes-benz
- - login: xoflare
- avatarUrl: https://avatars.githubusercontent.com/u/74335107?v=4
- url: https://github.com/xoflare
- - login: marvin-robot
+ - login: permitio
+ avatarUrl: https://avatars.githubusercontent.com/u/71775833?v=4
+ url: https://github.com/permitio
+- - login: marvin-robot
avatarUrl: https://avatars.githubusercontent.com/u/41086007?u=b9fcab402d0cd0aec738b6574fe60855cb0cd36d&v=4
url: https://github.com/marvin-robot
+ - login: mercedes-benz
+ avatarUrl: https://avatars.githubusercontent.com/u/34240465?v=4
+ url: https://github.com/mercedes-benz
- login: Ponte-Energy-Partners
avatarUrl: https://avatars.githubusercontent.com/u/114745848?v=4
url: https://github.com/Ponte-Energy-Partners
+ - login: LambdaTest-Inc
+ avatarUrl: https://avatars.githubusercontent.com/u/171592363?u=96606606a45fa170427206199014f2a5a2a4920b&v=4
+ url: https://github.com/LambdaTest-Inc
- login: BoostryJP
avatarUrl: https://avatars.githubusercontent.com/u/57932412?v=4
url: https://github.com/BoostryJP
@@ -68,68 +71,44 @@ sponsors:
- - login: takashi-yoneya
avatarUrl: https://avatars.githubusercontent.com/u/33813153?u=2d0522bceba0b8b69adf1f2db866503bd96f944e&v=4
url: https://github.com/takashi-yoneya
+ - login: Doist
+ avatarUrl: https://avatars.githubusercontent.com/u/2565372?v=4
+ url: https://github.com/Doist
- - login: mainframeindustries
avatarUrl: https://avatars.githubusercontent.com/u/55092103?v=4
url: https://github.com/mainframeindustries
- - login: CanoaPBC
- avatarUrl: https://avatars.githubusercontent.com/u/64223768?v=4
- url: https://github.com/CanoaPBC
- login: yasyf
avatarUrl: https://avatars.githubusercontent.com/u/709645?u=f36736b3c6a85f578886ecc42a740e7b436e7a01&v=4
url: https://github.com/yasyf
-- - login: genzou9201
- avatarUrl: https://avatars.githubusercontent.com/u/42960762?u=1ca6c18c59e8b327ae584c545b72de31ebc05275&v=4
- url: https://github.com/genzou9201
+- - login: alixlahuec
+ avatarUrl: https://avatars.githubusercontent.com/u/29543316?u=44357eb2a93bccf30fb9d389b8befe94a3d00985&v=4
+ url: https://github.com/alixlahuec
- - login: primer-io
avatarUrl: https://avatars.githubusercontent.com/u/62146168?v=4
url: https://github.com/primer-io
- - login: povilasb
- avatarUrl: https://avatars.githubusercontent.com/u/1213442?u=b11f58ed6ceea6e8297c9b310030478ebdac894d&v=4
- url: https://github.com/povilasb
- - login: upciti
avatarUrl: https://avatars.githubusercontent.com/u/43346262?v=4
url: https://github.com/upciti
- - login: freddiev4
- avatarUrl: https://avatars.githubusercontent.com/u/8339018?u=1aad5b4f5a04cb750852b843d5e1d8f4ce339c2e&v=4
- url: https://github.com/freddiev4
- - login: samuelcolvin
avatarUrl: https://avatars.githubusercontent.com/u/4039449?u=42eb3b833047c8c4b4f647a031eaef148c16d93f&v=4
url: https://github.com/samuelcolvin
- - login: vincentkoc
- avatarUrl: https://avatars.githubusercontent.com/u/25068?u=cbf098fc04c0473523d373b0dd2145b4ec99ef93&v=4
- url: https://github.com/vincentkoc
- - login: ProteinQure
- avatarUrl: https://avatars.githubusercontent.com/u/33707203?v=4
- url: https://github.com/ProteinQure
- - login: ddilidili
- avatarUrl: https://avatars.githubusercontent.com/u/42176885?u=c0a849dde06987434653197b5f638d3deb55fc6c&v=4
- url: https://github.com/ddilidili
- login: otosky
avatarUrl: https://avatars.githubusercontent.com/u/42260747?u=69d089387c743d89427aa4ad8740cfb34045a9e0&v=4
url: https://github.com/otosky
- - login: mjohnsey
- avatarUrl: https://avatars.githubusercontent.com/u/16784016?u=38fad2e6b411244560b3af99c5f5a4751bc81865&v=4
- url: https://github.com/mjohnsey
- - login: ashi-agrawal
- avatarUrl: https://avatars.githubusercontent.com/u/17105294?u=99c7a854035e5398d8e7b674f2d42baae6c957f8&v=4
- url: https://github.com/ashi-agrawal
- - login: sepsi77
- avatarUrl: https://avatars.githubusercontent.com/u/18682303?v=4
- url: https://github.com/sepsi77
- - login: RaamEEIL
- avatarUrl: https://avatars.githubusercontent.com/u/20320552?v=4
- url: https://github.com/RaamEEIL
- - login: jhundman
- avatarUrl: https://avatars.githubusercontent.com/u/24263908?v=4
- url: https://github.com/jhundman
- - login: b-rad-c
- avatarUrl: https://avatars.githubusercontent.com/u/25362581?u=5bb10629f4015b62bec1f9a366675d5085551af9&v=4
- url: https://github.com/b-rad-c
+ - login: ramonalmeidam
+ avatarUrl: https://avatars.githubusercontent.com/u/45269580?u=3358750b3a5854d7c3ed77aaca7dd20a0f529d32&v=4
+ url: https://github.com/ramonalmeidam
+ - login: roboflow
+ avatarUrl: https://avatars.githubusercontent.com/u/53104118?v=4
+ url: https://github.com/roboflow
+ - login: dudikbender
+ avatarUrl: https://avatars.githubusercontent.com/u/53487583?u=3a57542938ebfd57579a0111db2b297e606d9681&v=4
+ url: https://github.com/dudikbender
- login: ehaca
avatarUrl: https://avatars.githubusercontent.com/u/25950317?u=cec1a3e0643b785288ae8260cc295a85ab344995&v=4
url: https://github.com/ehaca
- login: raphaellaude
- avatarUrl: https://avatars.githubusercontent.com/u/28026311?u=28faad3e62250ef91a0c3c5d0faba39592d9ab39&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/28026311?u=91e1c00d9ac4f8045527e13de8050d504531cbc0&v=4
url: https://github.com/raphaellaude
- login: timlrx
avatarUrl: https://avatars.githubusercontent.com/u/28362229?u=9a745ca31372ee324af682715ae88ce8522f9094&v=4
@@ -137,12 +116,9 @@ sponsors:
- login: Leay15
avatarUrl: https://avatars.githubusercontent.com/u/32212558?u=c4aa9c1737e515959382a5515381757b1fd86c53&v=4
url: https://github.com/Leay15
- - login: ygorpontelo
- avatarUrl: https://avatars.githubusercontent.com/u/32963605?u=35f7103f9c4c4c2589ae5737ee882e9375ef072e&v=4
- url: https://github.com/ygorpontelo
- - login: chickenandstats
- avatarUrl: https://avatars.githubusercontent.com/u/79477966?v=4
- url: https://github.com/chickenandstats
+ - login: ProteinQure
+ avatarUrl: https://avatars.githubusercontent.com/u/33707203?v=4
+ url: https://github.com/ProteinQure
- login: kaoru0310
avatarUrl: https://avatars.githubusercontent.com/u/80977929?u=1b61d10142b490e56af932ddf08a390fae8ee94f&v=4
url: https://github.com/kaoru0310
@@ -152,27 +128,12 @@ sponsors:
- login: Karine-Bauch
avatarUrl: https://avatars.githubusercontent.com/u/90465103?u=7feb1018abb1a5631cfd9a91fea723d1ceb5f49b&v=4
url: https://github.com/Karine-Bauch
- - login: eruditis
- avatarUrl: https://avatars.githubusercontent.com/u/95244703?v=4
- url: https://github.com/eruditis
- login: jugeeem
avatarUrl: https://avatars.githubusercontent.com/u/116043716?u=ae590d79c38ac79c91b9c5caa6887d061e865a3d&v=4
url: https://github.com/jugeeem
- login: logic-automation
avatarUrl: https://avatars.githubusercontent.com/u/144732884?v=4
url: https://github.com/logic-automation
- - login: Torqsight-Labs
- avatarUrl: https://avatars.githubusercontent.com/u/169598176?v=4
- url: https://github.com/Torqsight-Labs
- - login: ramonalmeidam
- avatarUrl: https://avatars.githubusercontent.com/u/45269580?u=3358750b3a5854d7c3ed77aaca7dd20a0f529d32&v=4
- url: https://github.com/ramonalmeidam
- - login: roboflow
- avatarUrl: https://avatars.githubusercontent.com/u/53104118?v=4
- url: https://github.com/roboflow
- - login: dudikbender
- avatarUrl: https://avatars.githubusercontent.com/u/53487583?u=3a57542938ebfd57579a0111db2b297e606d9681&v=4
- url: https://github.com/dudikbender
- login: patsatsia
avatarUrl: https://avatars.githubusercontent.com/u/61111267?u=3271b85f7a37b479c8d0ae0a235182e83c166edf&v=4
url: https://github.com/patsatsia
@@ -182,12 +143,9 @@ sponsors:
- login: patricioperezv
avatarUrl: https://avatars.githubusercontent.com/u/73832292?u=5f471f156e19ee7920e62ae0f4a47b95580e61cf&v=4
url: https://github.com/patricioperezv
- - login: mintuhouse
- avatarUrl: https://avatars.githubusercontent.com/u/769950?u=ecfbd79a97d33177e0d093ddb088283cf7fe8444&v=4
- url: https://github.com/mintuhouse
- - login: tcsmith
- avatarUrl: https://avatars.githubusercontent.com/u/989034?u=7d8d741552b3279e8f4d3878679823a705a46f8f&v=4
- url: https://github.com/tcsmith
+ - login: chickenandstats
+ avatarUrl: https://avatars.githubusercontent.com/u/79477966?u=ae2b894aa954070db1d7830dab99b49eba4e4567&v=4
+ url: https://github.com/chickenandstats
- login: dodo5522
avatarUrl: https://avatars.githubusercontent.com/u/1362607?u=9bf1e0e520cccc547c046610c468ce6115bbcf9f&v=4
url: https://github.com/dodo5522
@@ -197,9 +155,6 @@ sponsors:
- login: knallgelb
avatarUrl: https://avatars.githubusercontent.com/u/2358812?u=c48cb6362b309d74cbf144bd6ad3aed3eb443e82&v=4
url: https://github.com/knallgelb
- - login: Shark009
- avatarUrl: https://avatars.githubusercontent.com/u/3163309?u=0c6f4091b0eda05c44c390466199826e6dc6e431&v=4
- url: https://github.com/Shark009
- login: dblackrun
avatarUrl: https://avatars.githubusercontent.com/u/3528486?v=4
url: https://github.com/dblackrun
@@ -215,6 +170,21 @@ sponsors:
- login: anomaly
avatarUrl: https://avatars.githubusercontent.com/u/3654837?v=4
url: https://github.com/anomaly
+ - login: mj0331
+ avatarUrl: https://avatars.githubusercontent.com/u/3890353?u=1c627ac1a024515b4871de5c3ebbfaa1a57f65d4&v=4
+ url: https://github.com/mj0331
+ - login: gorhack
+ avatarUrl: https://avatars.githubusercontent.com/u/4141690?u=ec119ebc4bdf00a7bc84657a71aa17834f4f27f3&v=4
+ url: https://github.com/gorhack
+ - login: Ryandaydev
+ avatarUrl: https://avatars.githubusercontent.com/u/4292423?u=679ff84cb7b988c5795a5fa583857f574a055763&v=4
+ url: https://github.com/Ryandaydev
+ - login: jaredtrog
+ avatarUrl: https://avatars.githubusercontent.com/u/4381365?v=4
+ url: https://github.com/jaredtrog
+ - login: vincentkoc
+ avatarUrl: https://avatars.githubusercontent.com/u/25068?u=fbd5b2d51142daa4bdbc21e21953a3b8b8188a4a&v=4
+ url: https://github.com/vincentkoc
- login: jstanden
avatarUrl: https://avatars.githubusercontent.com/u/63288?u=c3658d57d2862c607a0e19c2101c3c51876e36ad&v=4
url: https://github.com/jstanden
@@ -230,30 +200,21 @@ sponsors:
- login: pamelafox
avatarUrl: https://avatars.githubusercontent.com/u/297042?v=4
url: https://github.com/pamelafox
- - login: ericof
- avatarUrl: https://avatars.githubusercontent.com/u/306014?u=cf7c8733620397e6584a451505581c01c5d842d7&v=4
- url: https://github.com/ericof
- login: wshayes
avatarUrl: https://avatars.githubusercontent.com/u/365303?u=07ca03c5ee811eb0920e633cc3c3db73dbec1aa5&v=4
url: https://github.com/wshayes
- - login: gaetanBloch
- avatarUrl: https://avatars.githubusercontent.com/u/583199?u=50c49e83d6b4feb78a091901ea02ead1462f442b&v=4
- url: https://github.com/gaetanBloch
- login: koxudaxi
avatarUrl: https://avatars.githubusercontent.com/u/630670?u=507d8577b4b3670546b449c4c2ccbc5af40d72f7&v=4
url: https://github.com/koxudaxi
- login: falkben
avatarUrl: https://avatars.githubusercontent.com/u/653031?u=ad9838e089058c9e5a0bab94c0eec7cc181e0cd0&v=4
url: https://github.com/falkben
- - login: TrevorBenson
- avatarUrl: https://avatars.githubusercontent.com/u/9167887?u=dccbea3327a57750923333d8ebf1a0b3f1948949&v=4
- url: https://github.com/TrevorBenson
+ - login: mintuhouse
+ avatarUrl: https://avatars.githubusercontent.com/u/769950?u=ecfbd79a97d33177e0d093ddb088283cf7fe8444&v=4
+ url: https://github.com/mintuhouse
- login: wdwinslow
- avatarUrl: https://avatars.githubusercontent.com/u/11562137?u=dc01daafb354135603a263729e3d26d939c0c452&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/11562137?u=371272f2c69e680e0559a7b0a57385e83a5dc728&v=4
url: https://github.com/wdwinslow
- - login: catherinenelson1
- avatarUrl: https://avatars.githubusercontent.com/u/11951946?u=fe11bc35d36b6038cd46a946e4e46ef8aa5688ab&v=4
- url: https://github.com/catherinenelson1
- login: jsoques
avatarUrl: https://avatars.githubusercontent.com/u/12414216?u=620921d94196546cc8b9eae2cc4cbc3f95bab42f&v=4
url: https://github.com/jsoques
@@ -266,18 +227,18 @@ sponsors:
- login: khadrawy
avatarUrl: https://avatars.githubusercontent.com/u/13686061?u=59f25ef42ecf04c22657aac4238ce0e2d3d30304&v=4
url: https://github.com/khadrawy
- - login: Ryandaydev
- avatarUrl: https://avatars.githubusercontent.com/u/4292423?u=48f68868db8886fce31a1d802c1003914c6cd7c6&v=4
- url: https://github.com/Ryandaydev
- - login: jaredtrog
- avatarUrl: https://avatars.githubusercontent.com/u/4381365?v=4
- url: https://github.com/jaredtrog
+ - login: mjohnsey
+ avatarUrl: https://avatars.githubusercontent.com/u/16784016?u=38fad2e6b411244560b3af99c5f5a4751bc81865&v=4
+ url: https://github.com/mjohnsey
+ - login: ashi-agrawal
+ avatarUrl: https://avatars.githubusercontent.com/u/17105294?u=99c7a854035e5398d8e7b674f2d42baae6c957f8&v=4
+ url: https://github.com/ashi-agrawal
+ - login: RaamEEIL
+ avatarUrl: https://avatars.githubusercontent.com/u/20320552?v=4
+ url: https://github.com/RaamEEIL
- login: oliverxchen
avatarUrl: https://avatars.githubusercontent.com/u/4471774?u=534191f25e32eeaadda22dfab4b0a428733d5489&v=4
url: https://github.com/oliverxchen
- - login: ennui93
- avatarUrl: https://avatars.githubusercontent.com/u/5300907?u=5b5452725ddb391b2caaebf34e05aba873591c3a&v=4
- url: https://github.com/ennui93
- login: ternaus
avatarUrl: https://avatars.githubusercontent.com/u/5481618?u=513a26b02a39e7a28d587cd37c6cc877ea368e6e&v=4
url: https://github.com/ternaus
@@ -285,26 +246,20 @@ sponsors:
avatarUrl: https://avatars.githubusercontent.com/u/5920492?u=208d419cf667b8ac594c82a8db01932c7e50d057&v=4
url: https://github.com/eseglem
- login: FernandoCelmer
- avatarUrl: https://avatars.githubusercontent.com/u/6262214?u=d29fff3fd862fda4ca752079f13f32e84c762ea4&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/6262214?u=58ba6d5888fa7f355934e52db19f950e20b38162&v=4
url: https://github.com/FernandoCelmer
- - login: simw
- avatarUrl: https://avatars.githubusercontent.com/u/6322526?v=4
- url: https://github.com/simw
- login: Rehket
avatarUrl: https://avatars.githubusercontent.com/u/7015688?u=3afb0ba200feebbc7f958950e92db34df2a3c172&v=4
url: https://github.com/Rehket
- login: hiancdtrsnm
avatarUrl: https://avatars.githubusercontent.com/u/7343177?v=4
url: https://github.com/hiancdtrsnm
+- - login: manoelpqueiroz
+ avatarUrl: https://avatars.githubusercontent.com/u/23669137?u=b12e84b28a84369ab5b30bd5a79e5788df5a0756&v=4
+ url: https://github.com/manoelpqueiroz
- - login: pawamoy
avatarUrl: https://avatars.githubusercontent.com/u/3999221?u=b030e4c89df2f3a36bc4710b925bdeb6745c9856&v=4
url: https://github.com/pawamoy
- - login: engineerjoe440
- avatarUrl: https://avatars.githubusercontent.com/u/33275230?u=eb223cad27017bb1e936ee9b429b450d092d0236&v=4
- url: https://github.com/engineerjoe440
- - login: bnkc
- avatarUrl: https://avatars.githubusercontent.com/u/34930566?u=db5e6f4f87836cad26c2aa90ce390ce49041c5a9&v=4
- url: https://github.com/bnkc
- login: petercool
avatarUrl: https://avatars.githubusercontent.com/u/37613029?u=81c525232bb35780945a68e88afd96bb2cdad9c4&v=4
url: https://github.com/petercool
@@ -317,12 +272,12 @@ sponsors:
- login: ArtyomVancyan
avatarUrl: https://avatars.githubusercontent.com/u/44609997?v=4
url: https://github.com/ArtyomVancyan
- - login: TheR1D
- avatarUrl: https://avatars.githubusercontent.com/u/16740832?u=b0dfdbdb27b79729430c71c6128962f77b7b53f7&v=4
- url: https://github.com/TheR1D
- - login: joshuatz
- avatarUrl: https://avatars.githubusercontent.com/u/17817563?u=f1bf05b690d1fc164218f0b420cdd3acb7913e21&v=4
- url: https://github.com/joshuatz
+ - login: caviri
+ avatarUrl: https://avatars.githubusercontent.com/u/45425937?u=4e14bd64282bad8f385eafbdb004b5a279366d6e&v=4
+ url: https://github.com/caviri
+ - login: hgalytoby
+ avatarUrl: https://avatars.githubusercontent.com/u/50397689?u=62c7ff3519858423579676cd0efbd7e3f1ffe63a&v=4
+ url: https://github.com/hgalytoby
- login: SebTota
avatarUrl: https://avatars.githubusercontent.com/u/25122511?v=4
url: https://github.com/SebTota
@@ -338,51 +293,33 @@ sponsors:
- login: rlnchow
avatarUrl: https://avatars.githubusercontent.com/u/28018479?u=a93ca9cf1422b9ece155784a72d5f2fdbce7adff&v=4
url: https://github.com/rlnchow
- - login: dvlpjrs
- avatarUrl: https://avatars.githubusercontent.com/u/32254642?u=fbd6ad0324d4f1eb6231cf775be1c7bd4404e961&v=4
- url: https://github.com/dvlpjrs
- - login: caviri
- avatarUrl: https://avatars.githubusercontent.com/u/45425937?u=4e14bd64282bad8f385eafbdb004b5a279366d6e&v=4
- url: https://github.com/caviri
- - login: hgalytoby
- avatarUrl: https://avatars.githubusercontent.com/u/50397689?u=62c7ff3519858423579676cd0efbd7e3f1ffe63a&v=4
- url: https://github.com/hgalytoby
- - login: conservative-dude
- avatarUrl: https://avatars.githubusercontent.com/u/55538308?u=f250c44942ea6e73a6bd90739b381c470c192c11&v=4
- url: https://github.com/conservative-dude
- - login: CR1337
- avatarUrl: https://avatars.githubusercontent.com/u/62649536?u=57a6aab10d2421a497306da8bcded01b826c54ae&v=4
- url: https://github.com/CR1337
+ - login: engineerjoe440
+ avatarUrl: https://avatars.githubusercontent.com/u/33275230?u=eb223cad27017bb1e936ee9b429b450d092d0236&v=4
+ url: https://github.com/engineerjoe440
+ - login: bnkc
+ avatarUrl: https://avatars.githubusercontent.com/u/34930566?u=db5e6f4f87836cad26c2aa90ce390ce49041c5a9&v=4
+ url: https://github.com/bnkc
+ - login: johnl28
+ avatarUrl: https://avatars.githubusercontent.com/u/54412955?u=47dd06082d1c39caa90c752eb55566e4f3813957&v=4
+ url: https://github.com/johnl28
- login: PunRabbit
avatarUrl: https://avatars.githubusercontent.com/u/70463212?u=1a835cfbc99295a60c8282f6aa6199d1b42241a5&v=4
url: https://github.com/PunRabbit
- login: PelicanQ
avatarUrl: https://avatars.githubusercontent.com/u/77930606?v=4
url: https://github.com/PelicanQ
- - login: tochikuji
- avatarUrl: https://avatars.githubusercontent.com/u/851759?v=4
- url: https://github.com/tochikuji
- - login: browniebroke
- avatarUrl: https://avatars.githubusercontent.com/u/861044?u=5abfca5588f3e906b31583d7ee62f6de4b68aa24&v=4
- url: https://github.com/browniebroke
- login: miguelgr
avatarUrl: https://avatars.githubusercontent.com/u/1484589?u=54556072b8136efa12ae3b6902032ea2a39ace4b&v=4
url: https://github.com/miguelgr
- login: WillHogan
- avatarUrl: https://avatars.githubusercontent.com/u/1661551?u=7036c064cf29781470573865264ec8e60b6b809f&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/1661551?u=8a80356e3e7d5a417157aba7ea565dabc8678327&v=4
url: https://github.com/WillHogan
- login: my3
avatarUrl: https://avatars.githubusercontent.com/u/1825270?v=4
url: https://github.com/my3
- - login: leobiscassi
- avatarUrl: https://avatars.githubusercontent.com/u/1977418?u=f9f82445a847ab479bd7223debd677fcac6c49a0&v=4
- url: https://github.com/leobiscassi
- login: Alisa-lisa
avatarUrl: https://avatars.githubusercontent.com/u/4137964?u=e7e393504f554f4ff15863a1e01a5746863ef9ce&v=4
url: https://github.com/Alisa-lisa
- - login: Graeme22
- avatarUrl: https://avatars.githubusercontent.com/u/4185684?u=498182a42300d7bcd4de1215190cb17eb501136c&v=4
- url: https://github.com/Graeme22
- login: ddanier
avatarUrl: https://avatars.githubusercontent.com/u/113563?u=ed1dc79de72f93bd78581f88ebc6952b62f472da&v=4
url: https://github.com/ddanier
@@ -395,23 +332,14 @@ sponsors:
- login: ceb10n
avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4
url: https://github.com/ceb10n
- - login: eteq
- avatarUrl: https://avatars.githubusercontent.com/u/346587?v=4
- url: https://github.com/eteq
- - login: securancy
- avatarUrl: https://avatars.githubusercontent.com/u/606673?v=4
- url: https://github.com/securancy
- - login: moonape1226
- avatarUrl: https://avatars.githubusercontent.com/u/8532038?u=d9f8b855a429fff9397c3833c2ff83849ebf989d&v=4
- url: https://github.com/moonape1226
- - login: msehnout
- avatarUrl: https://avatars.githubusercontent.com/u/9369632?u=8c988f1b008a3f601385a3616f9327820f66e3a5&v=4
- url: https://github.com/msehnout
+ - login: tochikuji
+ avatarUrl: https://avatars.githubusercontent.com/u/851759?v=4
+ url: https://github.com/tochikuji
- login: xncbf
avatarUrl: https://avatars.githubusercontent.com/u/9462045?u=a80a7bb349555b277645632ed66639ff43400614&v=4
url: https://github.com/xncbf
- login: DMantis
- avatarUrl: https://avatars.githubusercontent.com/u/9536869?v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/9536869?u=652dd0d49717803c0cbcbf44f7740e53cf2d4892&v=4
url: https://github.com/DMantis
- login: hard-coders
avatarUrl: https://avatars.githubusercontent.com/u/9651103?u=95db33927bbff1ed1c07efddeb97ac2ff33068ed&v=4
@@ -425,15 +353,15 @@ sponsors:
- login: pheanex
avatarUrl: https://avatars.githubusercontent.com/u/10408624?u=5b6bab6ee174aa6e991333e06eb29f628741013d&v=4
url: https://github.com/pheanex
- - login: dzoladz
- avatarUrl: https://avatars.githubusercontent.com/u/10561752?u=5ee314d54aa79592c18566827ad8914debd5630d&v=4
- url: https://github.com/dzoladz
- login: Zuzah
avatarUrl: https://avatars.githubusercontent.com/u/10934846?u=1ef43e075ddc87bd1178372bf4d95ee6175cae27&v=4
url: https://github.com/Zuzah
- - login: artempronevskiy
- avatarUrl: https://avatars.githubusercontent.com/u/12235104?u=03df6e1e55c9c6fe5d230adabb8dd7d43d8bbe8f&v=4
- url: https://github.com/artempronevskiy
+ - login: TheR1D
+ avatarUrl: https://avatars.githubusercontent.com/u/16740832?u=b0dfdbdb27b79729430c71c6128962f77b7b53f7&v=4
+ url: https://github.com/TheR1D
+ - login: joshuatz
+ avatarUrl: https://avatars.githubusercontent.com/u/17817563?u=f1bf05b690d1fc164218f0b420cdd3acb7913e21&v=4
+ url: https://github.com/joshuatz
- login: danielunderwood
avatarUrl: https://avatars.githubusercontent.com/u/4472301?v=4
url: https://github.com/danielunderwood
@@ -458,33 +386,54 @@ sponsors:
- login: harsh183
avatarUrl: https://avatars.githubusercontent.com/u/7780198?v=4
url: https://github.com/harsh183
- - login: hcristea
- avatarUrl: https://avatars.githubusercontent.com/u/7814406?u=61d7a4fcf846983a4606788eac25e1c6c1209ba8&v=4
- url: https://github.com/hcristea
-- - login: larsyngvelundin
- avatarUrl: https://avatars.githubusercontent.com/u/34173819?u=74958599695bf83ac9f1addd935a51548a10c6b0&v=4
- url: https://github.com/larsyngvelundin
- - login: andrecorumba
+ - login: moonape1226
+ avatarUrl: https://avatars.githubusercontent.com/u/8532038?u=d9f8b855a429fff9397c3833c2ff83849ebf989d&v=4
+ url: https://github.com/moonape1226
+- - login: andrecorumba
avatarUrl: https://avatars.githubusercontent.com/u/37807517?u=9b9be3b41da9bda60957da9ef37b50dbf65baa61&v=4
url: https://github.com/andrecorumba
+ - login: KOZ39
+ avatarUrl: https://avatars.githubusercontent.com/u/38822500?u=9dfc0a697df1c9628f08e20dc3fb17b1afc4e5a7&v=4
+ url: https://github.com/KOZ39
- login: rwxd
avatarUrl: https://avatars.githubusercontent.com/u/40308458?u=cd04a39e3655923be4f25c2ba8a5a07b3da3230a&v=4
url: https://github.com/rwxd
- - login: sadikkuzu
- avatarUrl: https://avatars.githubusercontent.com/u/23168063?u=d179c06bb9f65c4167fcab118526819f8e0dac17&v=4
- url: https://github.com/sadikkuzu
+ - login: morzan1001
+ avatarUrl: https://avatars.githubusercontent.com/u/47593005?u=c30ab7230f82a12a9b938dcb54f84a996931409a&v=4
+ url: https://github.com/morzan1001
- login: Olegt0rr
avatarUrl: https://avatars.githubusercontent.com/u/25399456?u=3e87b5239a2f4600975ba13be73054f8567c6060&v=4
url: https://github.com/Olegt0rr
- - login: FabulousCodingFox
- avatarUrl: https://avatars.githubusercontent.com/u/78906517?u=924a27cbee3db7e0ece5cc1509921402e1445e74&v=4
- url: https://github.com/FabulousCodingFox
- - login: anqorithm
- avatarUrl: https://avatars.githubusercontent.com/u/61029571?u=468256fa4e2d9ce2870b608299724bebb7a33f18&v=4
- url: https://github.com/anqorithm
- - login: ssbarnea
- avatarUrl: https://avatars.githubusercontent.com/u/102495?u=c7bd9ddf127785286fc939dd18cb02db0a453bce&v=4
- url: https://github.com/ssbarnea
+ - login: larsyngvelundin
+ avatarUrl: https://avatars.githubusercontent.com/u/34173819?u=74958599695bf83ac9f1addd935a51548a10c6b0&v=4
+ url: https://github.com/larsyngvelundin
+ - login: v4lerdon
+ avatarUrl: https://avatars.githubusercontent.com/u/98405746?u=10969728d51e8f08e203f5d65fda948c21545c73&v=4
+ url: https://github.com/v4lerdon
+ - login: hauanitech
+ avatarUrl: https://avatars.githubusercontent.com/u/211940501?u=48f70c3ef9b89c598d2dde528cda2d4f6468a135&v=4
+ url: https://github.com/hauanitech
+ - login: igor-kan
+ avatarUrl: https://avatars.githubusercontent.com/u/61065863?u=3bade33799d183510fd381e2e4f5e1b61af8631a&v=4
+ url: https://github.com/igor-kan
+ - login: 0ne-stone
+ avatarUrl: https://avatars.githubusercontent.com/u/62360849?u=746dd21c34e7e06eefb11b03e8bb01aaae3c2a4f&v=4
+ url: https://github.com/0ne-stone
+ - login: t3llscode
+ avatarUrl: https://avatars.githubusercontent.com/u/65864434?u=35df974cec16993343bf6494d60a14e71f66c5af&v=4
+ url: https://github.com/t3llscode
+ - login: nayasinghania
+ avatarUrl: https://avatars.githubusercontent.com/u/74111380?u=752e99a5e139389fdc0a0677122adc08438eb076&v=4
+ url: https://github.com/nayasinghania
+ - login: Toothwitch
+ avatarUrl: https://avatars.githubusercontent.com/u/1710406?u=5eebb23b46cd26e48643b9e5179536cad491c17a&v=4
+ url: https://github.com/Toothwitch
- login: andreagrandi
avatarUrl: https://avatars.githubusercontent.com/u/636391?u=13d90cb8ec313593a5b71fbd4e33b78d6da736f5&v=4
url: https://github.com/andreagrandi
+ - login: sadikkuzu
+ avatarUrl: https://avatars.githubusercontent.com/u/23168063?u=d179c06bb9f65c4167fcab118526819f8e0dac17&v=4
+ url: https://github.com/sadikkuzu
+ - login: roboman-tech
+ avatarUrl: https://avatars.githubusercontent.com/u/8183070?u=fdeaa2ed29f598eb7901693884c0ad32b16982e3&v=4
+ url: https://github.com/roboman-tech
diff --git a/docs/en/data/members.yml b/docs/en/data/members.yml
index cf016eae1..7ec16e917 100644
--- a/docs/en/data/members.yml
+++ b/docs/en/data/members.yml
@@ -17,3 +17,6 @@ members:
- login: patrick91
avatar_url: https://avatars.githubusercontent.com/u/667029
url: https://github.com/patrick91
+- login: luzzodev
+ avatar_url: https://avatars.githubusercontent.com/u/27291415
+ url: https://github.com/luzzodev
diff --git a/docs/en/data/people.yml b/docs/en/data/people.yml
index 112567778..714d2eac7 100644
--- a/docs/en/data/people.yml
+++ b/docs/en/data/people.yml
@@ -1,43 +1,43 @@
maintainers:
- login: tiangolo
- answers: 1894
+ answers: 1898
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
url: https://github.com/tiangolo
experts:
- login: tiangolo
- count: 1894
+ count: 1898
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
url: https://github.com/tiangolo
+- login: YuriiMotov
+ count: 952
+ avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=b9b13d598dddfab529a52d264df80a900bfe7060&v=4
+ url: https://github.com/YuriiMotov
- login: github-actions
- count: 770
+ count: 769
avatarUrl: https://avatars.githubusercontent.com/in/15368?v=4
url: https://github.com/apps/github-actions
- login: Kludex
- count: 644
+ count: 654
avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4
url: https://github.com/Kludex
- login: jgould22
- count: 250
+ count: 263
avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4
url: https://github.com/jgould22
- login: dmontagu
count: 240
avatarUrl: https://avatars.githubusercontent.com/u/35119617?u=540f30c937a6450812628b9592a1dfe91bbe148e&v=4
url: https://github.com/dmontagu
-- login: YuriiMotov
- count: 223
- avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4
- url: https://github.com/YuriiMotov
- login: Mause
count: 219
avatarUrl: https://avatars.githubusercontent.com/u/1405026?v=4
url: https://github.com/Mause
- login: ycd
- count: 217
- avatarUrl: https://avatars.githubusercontent.com/u/62724709?u=29682e4b6ac7d5293742ccf818188394b9a82972&v=4
+ count: 216
+ avatarUrl: https://avatars.githubusercontent.com/u/62724709?u=f1e7bae394a315da950912c92dc861a8eaf95d4c&v=4
url: https://github.com/ycd
- login: JarroVGIT
- count: 192
+ count: 190
avatarUrl: https://avatars.githubusercontent.com/u/13659033?u=e8bea32d07a5ef72f7dde3b2079ceb714923ca05&v=4
url: https://github.com/JarroVGIT
- login: euri10
@@ -46,48 +46,52 @@ experts:
url: https://github.com/euri10
- login: iudeen
count: 128
- avatarUrl: https://avatars.githubusercontent.com/u/10519440?u=2843b3303282bff8b212dcd4d9d6689452e4470c&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/10519440?u=f09cdd745e5bf16138f29b42732dd57c7f02bee1&v=4
url: https://github.com/iudeen
- login: phy25
count: 126
avatarUrl: https://avatars.githubusercontent.com/u/331403?v=4
url: https://github.com/phy25
- login: JavierSanchezCastro
- count: 85
+ count: 94
avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4
url: https://github.com/JavierSanchezCastro
+- login: luzzodev
+ count: 87
+ avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4
+ url: https://github.com/luzzodev
- login: raphaelauv
count: 83
avatarUrl: https://avatars.githubusercontent.com/u/10202690?u=e6f86f5c0c3026a15d6b51792fa3e532b12f1371&v=4
url: https://github.com/raphaelauv
-- login: ghandic
- count: 71
- avatarUrl: https://avatars.githubusercontent.com/u/23500353?u=e2e1d736f924d9be81e8bfc565b6d8836ba99773&v=4
- url: https://github.com/ghandic
- login: ArcLightSlavik
count: 71
avatarUrl: https://avatars.githubusercontent.com/u/31127044?u=b0f2c37142f4b762e41ad65dc49581813422bd71&v=4
url: https://github.com/ArcLightSlavik
+- login: ghandic
+ count: 71
+ avatarUrl: https://avatars.githubusercontent.com/u/23500353?u=e2e1d736f924d9be81e8bfc565b6d8836ba99773&v=4
+ url: https://github.com/ghandic
- login: n8sty
- count: 66
+ count: 67
avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4
url: https://github.com/n8sty
- login: falkben
count: 59
avatarUrl: https://avatars.githubusercontent.com/u/653031?u=ad9838e089058c9e5a0bab94c0eec7cc181e0cd0&v=4
url: https://github.com/falkben
-- login: acidjunk
+- login: yinziyan1206
count: 50
- avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4
- url: https://github.com/acidjunk
+ avatarUrl: https://avatars.githubusercontent.com/u/37829370?u=da44ca53aefd5c23f346fab8e9fd2e108294c179&v=4
+ url: https://github.com/yinziyan1206
- login: sm-Fifteen
count: 49
avatarUrl: https://avatars.githubusercontent.com/u/516999?u=437c0c5038558c67e887ccd863c1ba0f846c03da&v=4
url: https://github.com/sm-Fifteen
-- login: yinziyan1206
+- login: acidjunk
count: 49
- avatarUrl: https://avatars.githubusercontent.com/u/37829370?u=da44ca53aefd5c23f346fab8e9fd2e108294c179&v=4
- url: https://github.com/yinziyan1206
+ avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4
+ url: https://github.com/acidjunk
- login: adriangb
count: 46
avatarUrl: https://avatars.githubusercontent.com/u/1755071?u=612704256e38d6ac9cbed24f10e4b6ac2da74ecb&v=4
@@ -100,34 +104,30 @@ experts:
count: 45
avatarUrl: https://avatars.githubusercontent.com/u/16958893?u=f8be7088d5076d963984a21f95f44e559192d912&v=4
url: https://github.com/insomnes
-- login: odiseo0
- count: 43
- avatarUrl: https://avatars.githubusercontent.com/u/87550035?u=241a71f6b7068738b81af3e57f45ffd723538401&v=4
- url: https://github.com/odiseo0
- login: frankie567
count: 43
avatarUrl: https://avatars.githubusercontent.com/u/1144727?u=c159fe047727aedecbbeeaa96a1b03ceb9d39add&v=4
url: https://github.com/frankie567
+- login: odiseo0
+ count: 43
+ avatarUrl: https://avatars.githubusercontent.com/u/87550035?u=241a71f6b7068738b81af3e57f45ffd723538401&v=4
+ url: https://github.com/odiseo0
+- login: sinisaos
+ count: 41
+ avatarUrl: https://avatars.githubusercontent.com/u/30960668?v=4
+ url: https://github.com/sinisaos
- login: includeamin
count: 40
avatarUrl: https://avatars.githubusercontent.com/u/11836741?u=8bd5ef7e62fe6a82055e33c4c0e0a7879ff8cfb6&v=4
url: https://github.com/includeamin
-- login: sinisaos
- count: 39
- avatarUrl: https://avatars.githubusercontent.com/u/30960668?v=4
- url: https://github.com/sinisaos
-- login: chbndrhnns
- count: 37
- avatarUrl: https://avatars.githubusercontent.com/u/7534547?v=4
- url: https://github.com/chbndrhnns
- login: STeveShary
count: 37
avatarUrl: https://avatars.githubusercontent.com/u/5167622?u=de8f597c81d6336fcebc37b32dfd61a3f877160c&v=4
url: https://github.com/STeveShary
-- login: luzzodev
- count: 36
- avatarUrl: https://avatars.githubusercontent.com/u/27291415?v=4
- url: https://github.com/luzzodev
+- login: chbndrhnns
+ count: 37
+ avatarUrl: https://avatars.githubusercontent.com/u/7534547?v=4
+ url: https://github.com/chbndrhnns
- login: krishnardt
count: 35
avatarUrl: https://avatars.githubusercontent.com/u/31960541?u=47f4829c77f4962ab437ffb7995951e41eeebe9b&v=4
@@ -144,9 +144,13 @@ experts:
count: 27
avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4
url: https://github.com/hasansezertasan
+- login: alv2017
+ count: 26
+ avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4
+ url: https://github.com/alv2017
- login: dbanty
count: 26
- avatarUrl: https://avatars.githubusercontent.com/u/43723790?u=9bcce836bbce55835291c5b2ac93a4e311f4b3c3&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/43723790?u=9d726785d08e50b1e1cd96505800c8ea8405bce2&v=4
url: https://github.com/dbanty
- login: wshayes
count: 25
@@ -156,14 +160,14 @@ experts:
count: 23
avatarUrl: https://avatars.githubusercontent.com/u/9435877?u=719327b7d2c4c62212456d771bfa7c6b8dbb9eac&v=4
url: https://github.com/SirTelemak
+- login: connebs
+ count: 22
+ avatarUrl: https://avatars.githubusercontent.com/u/9054108?u=e151d5f545a3395136d711c227c22032fda67cfa&v=4
+ url: https://github.com/connebs
- login: nymous
count: 22
avatarUrl: https://avatars.githubusercontent.com/u/4216559?u=360a36fb602cded27273cbfc0afc296eece90662&v=4
url: https://github.com/nymous
-- login: acnebs
- count: 22
- avatarUrl: https://avatars.githubusercontent.com/u/9054108?v=4
- url: https://github.com/acnebs
- login: chrisK824
count: 22
avatarUrl: https://avatars.githubusercontent.com/u/79946379?u=03d85b22d696a58a9603e55fbbbe2de6b0f4face&v=4
@@ -172,10 +176,6 @@ experts:
count: 21
avatarUrl: https://avatars.githubusercontent.com/u/51059348?u=5fe59a56e1f2f9ccd8005d71752a8276f133ae1a&v=4
url: https://github.com/rafsaf
-- login: ebottos94
- count: 20
- avatarUrl: https://avatars.githubusercontent.com/u/100039558?u=8b91053b3abe4a9209375e3651e1c1ef192d884b&v=4
- url: https://github.com/ebottos94
- login: nsidnev
count: 20
avatarUrl: https://avatars.githubusercontent.com/u/22559461?u=a9cc3238217e21dc8796a1a500f01b722adb082c&v=4
@@ -184,26 +184,30 @@ experts:
count: 20
avatarUrl: https://avatars.githubusercontent.com/u/565544?v=4
url: https://github.com/chris-allnutt
+- login: ebottos94
+ count: 20
+ avatarUrl: https://avatars.githubusercontent.com/u/100039558?u=8b91053b3abe4a9209375e3651e1c1ef192d884b&v=4
+ url: https://github.com/ebottos94
- login: estebanx64
count: 19
avatarUrl: https://avatars.githubusercontent.com/u/10840422?u=45f015f95e1c0f06df602be4ab688d4b854cc8a8&v=4
url: https://github.com/estebanx64
-- login: zoliknemet
+- login: valentinDruzhinin
+ count: 19
+ avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4
+ url: https://github.com/valentinDruzhinin
+- login: sehraramiz
count: 18
- avatarUrl: https://avatars.githubusercontent.com/u/22326718?u=31ba446ac290e23e56eea8e4f0c558aaf0b40779&v=4
- url: https://github.com/zoliknemet
+ avatarUrl: https://avatars.githubusercontent.com/u/14166324?u=8fac65e84dfff24245d304a5b5b09f7b5bd69dc9&v=4
+ url: https://github.com/sehraramiz
- login: retnikt
count: 18
avatarUrl: https://avatars.githubusercontent.com/u/24581770?v=4
url: https://github.com/retnikt
-- login: sehraramiz
- count: 17
- avatarUrl: https://avatars.githubusercontent.com/u/14166324?u=8fac65e84dfff24245d304a5b5b09f7b5bd69dc9&v=4
- url: https://github.com/sehraramiz
-- login: caeser1996
- count: 17
- avatarUrl: https://avatars.githubusercontent.com/u/16540232?u=05d2beb8e034d584d0a374b99d8826327bd7f614&v=4
- url: https://github.com/caeser1996
+- login: zoliknemet
+ count: 18
+ avatarUrl: https://avatars.githubusercontent.com/u/22326718?u=31ba446ac290e23e56eea8e4f0c558aaf0b40779&v=4
+ url: https://github.com/zoliknemet
- login: Hultner
count: 17
avatarUrl: https://avatars.githubusercontent.com/u/2669034?u=115e53df959309898ad8dc9443fbb35fee71df07&v=4
@@ -212,207 +216,304 @@ experts:
count: 17
avatarUrl: https://avatars.githubusercontent.com/u/1765494?u=5b1ab7c582db4b4016fa31affe977d10af108ad4&v=4
url: https://github.com/harunyasar
+- login: caeser1996
+ count: 17
+ avatarUrl: https://avatars.githubusercontent.com/u/16540232?u=05d2beb8e034d584d0a374b99d8826327bd7f614&v=4
+ url: https://github.com/caeser1996
- login: nkhitrov
count: 17
avatarUrl: https://avatars.githubusercontent.com/u/28262306?u=e19427d8dc296d6950e9c424adacc92d37496fe9&v=4
url: https://github.com/nkhitrov
-- login: jonatasoli
- count: 16
- avatarUrl: https://avatars.githubusercontent.com/u/26334101?u=071c062d2861d3dd127f6b4a5258cd8ef55d4c50&v=4
- url: https://github.com/jonatasoli
- login: dstlny
count: 16
avatarUrl: https://avatars.githubusercontent.com/u/41964673?u=9f2174f9d61c15c6e3a4c9e3aeee66f711ce311f&v=4
url: https://github.com/dstlny
-- login: jorgerpo
- count: 15
- avatarUrl: https://avatars.githubusercontent.com/u/12537771?u=7444d20019198e34911082780cc7ad73f2b97cb3&v=4
- url: https://github.com/jorgerpo
-- login: simondale00
+- login: jonatasoli
+ count: 16
+ avatarUrl: https://avatars.githubusercontent.com/u/26334101?u=f601c3f111f2148bd9244c2cb3ebbd57b592e674&v=4
+ url: https://github.com/jonatasoli
+- login: abhint
count: 15
- avatarUrl: https://avatars.githubusercontent.com/u/33907262?u=2721fb37014d50daf473267c808aa678ecaefe09&v=4
- url: https://github.com/simondale00
+ avatarUrl: https://avatars.githubusercontent.com/u/25699289?u=b5d219277b4d001ac26fb8be357fddd88c29d51b&v=4
+ url: https://github.com/abhint
- login: ghost
count: 15
avatarUrl: https://avatars.githubusercontent.com/u/10137?u=b1951d34a583cf12ec0d3b0781ba19be97726318&v=4
url: https://github.com/ghost
-- login: abhint
+- login: jorgerpo
count: 15
- avatarUrl: https://avatars.githubusercontent.com/u/25699289?u=b5d219277b4d001ac26fb8be357fddd88c29d51b&v=4
- url: https://github.com/abhint
-- login: pythonweb2
- count: 14
- avatarUrl: https://avatars.githubusercontent.com/u/32141163?v=4
- url: https://github.com/pythonweb2
+ avatarUrl: https://avatars.githubusercontent.com/u/12537771?u=7444d20019198e34911082780cc7ad73f2b97cb3&v=4
+ url: https://github.com/jorgerpo
last_month_experts:
-- login: Kludex
- count: 15
- avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4
- url: https://github.com/Kludex
- login: YuriiMotov
- count: 10
- avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4
+ count: 69
+ avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=b9b13d598dddfab529a52d264df80a900bfe7060&v=4
url: https://github.com/YuriiMotov
-- login: sehraramiz
- count: 8
- avatarUrl: https://avatars.githubusercontent.com/u/14166324?u=8fac65e84dfff24245d304a5b5b09f7b5bd69dc9&v=4
- url: https://github.com/sehraramiz
- login: luzzodev
+ count: 8
+ avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4
+ url: https://github.com/luzzodev
+- login: valentinDruzhinin
+ count: 7
+ avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4
+ url: https://github.com/valentinDruzhinin
+- login: eqsdxr
count: 4
- avatarUrl: https://avatars.githubusercontent.com/u/27291415?v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/157279130?u=58fddf77ed76966eaa8c73eea9bea4bb0c53b673&v=4
+ url: https://github.com/eqsdxr
+- login: Jelle-tenB
+ count: 3
+ avatarUrl: https://avatars.githubusercontent.com/u/210023470?u=c25d66addf36a747bd9fab773c4a6e7b238f45d4&v=4
+ url: https://github.com/Jelle-tenB
+- login: Garrett-R
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/6614695?u=c128fd775002882f6e391bda5a89d1bdc5bdf45f&v=4
+ url: https://github.com/Garrett-R
+three_months_experts:
+- login: YuriiMotov
+ count: 736
+ avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=b9b13d598dddfab529a52d264df80a900bfe7060&v=4
+ url: https://github.com/YuriiMotov
+- login: luzzodev
+ count: 27
+ avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4
url: https://github.com/luzzodev
-- login: yokwejuste
+- login: valentinDruzhinin
+ count: 19
+ avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4
+ url: https://github.com/valentinDruzhinin
+- login: raceychan
+ count: 6
+ avatarUrl: https://avatars.githubusercontent.com/u/75417963?u=060c62870ec5a791765e63ac20d8885d11143786&v=4
+ url: https://github.com/raceychan
+- login: sachinh35
+ count: 6
+ avatarUrl: https://avatars.githubusercontent.com/u/21972708?u=8560b97b8b41e175f476270b56de8a493b84f302&v=4
+ url: https://github.com/sachinh35
+- login: DoctorJohn
+ count: 5
+ avatarUrl: https://avatars.githubusercontent.com/u/14076775?u=2913e70a6142772847e91e2aaa5b9152391715e9&v=4
+ url: https://github.com/DoctorJohn
+- login: eqsdxr
count: 4
- avatarUrl: https://avatars.githubusercontent.com/u/71908316?u=592c1e42aa0ee5cb94890e0b863e2acc78cc3bbc&v=4
- url: https://github.com/yokwejuste
-- login: alv2017
+ avatarUrl: https://avatars.githubusercontent.com/u/157279130?u=58fddf77ed76966eaa8c73eea9bea4bb0c53b673&v=4
+ url: https://github.com/eqsdxr
+- login: Jelle-tenB
count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4
- url: https://github.com/alv2017
-- login: PREPONDERANCE
+ avatarUrl: https://avatars.githubusercontent.com/u/210023470?u=c25d66addf36a747bd9fab773c4a6e7b238f45d4&v=4
+ url: https://github.com/Jelle-tenB
+- login: JavierSanchezCastro
+ count: 3
+ avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4
+ url: https://github.com/JavierSanchezCastro
+- login: purepani
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/7587353?v=4
+ url: https://github.com/purepani
+- login: tiangolo
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/112809059?u=30ab12dc9ddba2f94ab90e6ad4ad8bc5cfa7fccd&v=4
- url: https://github.com/PREPONDERANCE
-- login: nbx3
+ avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
+ url: https://github.com/tiangolo
+- login: TaigoFr
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/34649527?u=943812f69e0d40adbd3fa1c9b8ef50dd971a2a45&v=4
- url: https://github.com/nbx3
-- login: XiaoXinYo
+ avatarUrl: https://avatars.githubusercontent.com/u/17792131?u=372b27056ec82f1ae03d8b3f37ef55b04a7cfdd1&v=4
+ url: https://github.com/TaigoFr
+- login: Garrett-R
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/56395004?u=b3b7cb758997f283c271a581833e407229dab82c&v=4
- url: https://github.com/XiaoXinYo
-- login: iloveitaly
+ avatarUrl: https://avatars.githubusercontent.com/u/6614695?u=c128fd775002882f6e391bda5a89d1bdc5bdf45f&v=4
+ url: https://github.com/Garrett-R
+- login: henrymcl
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/150855?v=4
- url: https://github.com/iloveitaly
-three_months_experts:
-- login: luzzodev
- count: 34
- avatarUrl: https://avatars.githubusercontent.com/u/27291415?v=4
- url: https://github.com/luzzodev
+ avatarUrl: https://avatars.githubusercontent.com/u/26480299?v=4
+ url: https://github.com/henrymcl
+- login: jymchng
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/27895426?u=fb88c47775147d62a395fdb895d1af4148c7b566&v=4
+ url: https://github.com/jymchng
+- login: Brikas
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/80290187?v=4
+ url: https://github.com/Brikas
+- login: davidhuser
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/4357648?u=6ed702f8f6d49a8b2a0ed33cbd8ab59c2d7db7f7&v=4
+ url: https://github.com/davidhuser
+- login: Kludex
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4
+ url: https://github.com/Kludex
+six_months_experts:
- login: YuriiMotov
- count: 33
- avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4
+ count: 754
+ avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=b9b13d598dddfab529a52d264df80a900bfe7060&v=4
url: https://github.com/YuriiMotov
-- login: Kludex
+- login: luzzodev
+ count: 51
+ avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4
+ url: https://github.com/luzzodev
+- login: alv2017
count: 23
+ avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4
+ url: https://github.com/alv2017
+- login: valentinDruzhinin
+ count: 19
+ avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4
+ url: https://github.com/valentinDruzhinin
+- login: jgould22
+ count: 13
+ avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4
+ url: https://github.com/jgould22
+- login: Kludex
+ count: 11
avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4
url: https://github.com/Kludex
-- login: sehraramiz
+- login: JavierSanchezCastro
count: 10
- avatarUrl: https://avatars.githubusercontent.com/u/14166324?u=8fac65e84dfff24245d304a5b5b09f7b5bd69dc9&v=4
- url: https://github.com/sehraramiz
-- login: estebanx64
- count: 7
- avatarUrl: https://avatars.githubusercontent.com/u/10840422?u=45f015f95e1c0f06df602be4ab688d4b854cc8a8&v=4
- url: https://github.com/estebanx64
-- login: yvallois
+ avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4
+ url: https://github.com/JavierSanchezCastro
+- login: sachinh35
+ count: 9
+ avatarUrl: https://avatars.githubusercontent.com/u/21972708?u=8560b97b8b41e175f476270b56de8a493b84f302&v=4
+ url: https://github.com/sachinh35
+- login: yauhen-sobaleu
+ count: 9
+ avatarUrl: https://avatars.githubusercontent.com/u/51629535?u=fc1817060daf2df438bfca86c44f33da5cd667db&v=4
+ url: https://github.com/yauhen-sobaleu
+- login: tiangolo
+ count: 8
+ avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
+ url: https://github.com/tiangolo
+- login: raceychan
count: 6
- avatarUrl: https://avatars.githubusercontent.com/u/36999744?v=4
- url: https://github.com/yvallois
-- login: yokwejuste
- count: 4
- avatarUrl: https://avatars.githubusercontent.com/u/71908316?u=592c1e42aa0ee5cb94890e0b863e2acc78cc3bbc&v=4
- url: https://github.com/yokwejuste
-- login: jgould22
+ avatarUrl: https://avatars.githubusercontent.com/u/75417963?u=060c62870ec5a791765e63ac20d8885d11143786&v=4
+ url: https://github.com/raceychan
+- login: DoctorJohn
+ count: 5
+ avatarUrl: https://avatars.githubusercontent.com/u/14076775?u=2913e70a6142772847e91e2aaa5b9152391715e9&v=4
+ url: https://github.com/DoctorJohn
+- login: eqsdxr
count: 4
- avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4
- url: https://github.com/jgould22
-- login: alv2017
+ avatarUrl: https://avatars.githubusercontent.com/u/157279130?u=58fddf77ed76966eaa8c73eea9bea4bb0c53b673&v=4
+ url: https://github.com/eqsdxr
+- login: Jelle-tenB
count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4
- url: https://github.com/alv2017
-- login: viniciusCalcantara
+ avatarUrl: https://avatars.githubusercontent.com/u/210023470?u=c25d66addf36a747bd9fab773c4a6e7b238f45d4&v=4
+ url: https://github.com/Jelle-tenB
+- login: SobikXexe
count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/108818737?u=3d7ffe5808843ee4372f9cc5a559ff1674cf1792&v=4
- url: https://github.com/viniciusCalcantara
-- login: PREPONDERANCE
+ avatarUrl: https://avatars.githubusercontent.com/u/87701130?v=4
+ url: https://github.com/SobikXexe
+- login: purepani
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/112809059?u=30ab12dc9ddba2f94ab90e6ad4ad8bc5cfa7fccd&v=4
- url: https://github.com/PREPONDERANCE
-- login: nbx3
+ avatarUrl: https://avatars.githubusercontent.com/u/7587353?v=4
+ url: https://github.com/purepani
+- login: WilliamDEdwards
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/34649527?u=943812f69e0d40adbd3fa1c9b8ef50dd971a2a45&v=4
- url: https://github.com/nbx3
-- login: XiaoXinYo
+ avatarUrl: https://avatars.githubusercontent.com/u/12184311?u=9b29d5d1d71f5f1a7ef9e439963ad3529e3b33a4&v=4
+ url: https://github.com/WilliamDEdwards
+- login: TaigoFr
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/56395004?u=b3b7cb758997f283c271a581833e407229dab82c&v=4
- url: https://github.com/XiaoXinYo
-- login: JavierSanchezCastro
+ avatarUrl: https://avatars.githubusercontent.com/u/17792131?u=372b27056ec82f1ae03d8b3f37ef55b04a7cfdd1&v=4
+ url: https://github.com/TaigoFr
+- login: Garrett-R
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4
- url: https://github.com/JavierSanchezCastro
-- login: iloveitaly
+ avatarUrl: https://avatars.githubusercontent.com/u/6614695?u=c128fd775002882f6e391bda5a89d1bdc5bdf45f&v=4
+ url: https://github.com/Garrett-R
+- login: EverStarck
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/150855?v=4
- url: https://github.com/iloveitaly
-- login: LincolnPuzey
+ avatarUrl: https://avatars.githubusercontent.com/u/51029456?u=343409b7cb6b3ea6a59359f4e8370d9c3f140ecd&v=4
+ url: https://github.com/EverStarck
+- login: henrymcl
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/18750802?v=4
- url: https://github.com/LincolnPuzey
-- login: Knighthawk-Leo
+ avatarUrl: https://avatars.githubusercontent.com/u/26480299?v=4
+ url: https://github.com/henrymcl
+- login: jymchng
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/72437494?u=27c68db94a3107b605e603cc136f4ba83f0106d5&v=4
- url: https://github.com/Knighthawk-Leo
-- login: gelezo43
+ avatarUrl: https://avatars.githubusercontent.com/u/27895426?u=fb88c47775147d62a395fdb895d1af4148c7b566&v=4
+ url: https://github.com/jymchng
+- login: adsouza
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/40732698?u=611f39d3c1d2f4207a590937a78c1f10eed6232c&v=4
- url: https://github.com/gelezo43
-- login: dbfreem
+ avatarUrl: https://avatars.githubusercontent.com/u/275832?v=4
+ url: https://github.com/adsouza
+- login: Brikas
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/9778569?u=f2f1e9135b5e4f1b0c6821a548b17f97572720fc&v=4
- url: https://github.com/dbfreem
-- login: AliYmn
+ avatarUrl: https://avatars.githubusercontent.com/u/80290187?v=4
+ url: https://github.com/Brikas
+- login: JacobHayes
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/18416653?u=98c1fca46c7e4dabe8c39d17b5e55d1511d41cf9&v=4
- url: https://github.com/AliYmn
-- login: RichieB2B
+ avatarUrl: https://avatars.githubusercontent.com/u/2555532?u=354a525847a276bbb4426b0c95791a8ba5970f9b&v=4
+ url: https://github.com/JacobHayes
+- login: davidhuser
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/1461970?u=edaa57d1077705244ea5c9244f4783d94ff11f12&v=4
- url: https://github.com/RichieB2B
-- login: Synrom
+ avatarUrl: https://avatars.githubusercontent.com/u/4357648?u=6ed702f8f6d49a8b2a0ed33cbd8ab59c2d7db7f7&v=4
+ url: https://github.com/davidhuser
+- login: PidgeyBE
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/30272537?v=4
- url: https://github.com/Synrom
-- login: iiotsrc
+ avatarUrl: https://avatars.githubusercontent.com/u/19860056?u=47b584eb1c1ab45e31c1b474109a962d7e82be49&v=4
+ url: https://github.com/PidgeyBE
+- login: KianAnbarestani
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/131771119?u=bcaf2559ef6266af70b151b7fda31a1ee3dbecb3&v=4
- url: https://github.com/iiotsrc
-- login: Kfir-G
+ avatarUrl: https://avatars.githubusercontent.com/u/145364424?u=dcc3d8fb4ca07d36fb52a17f38b6650565de40be&v=4
+ url: https://github.com/KianAnbarestani
+- login: sinisaos
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/57500876?u=0cd29db046a17f12f382d398141319fca7ff230a&v=4
- url: https://github.com/Kfir-G
-six_months_experts:
+ avatarUrl: https://avatars.githubusercontent.com/u/30960668?v=4
+ url: https://github.com/sinisaos
+- login: Ale-Cas
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/64859146?u=d52a6ecf8d83d2927e2ae270bdfcc83495dba8c9&v=4
+ url: https://github.com/Ale-Cas
+- login: marsboy02
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/86903678?u=04cc319d6605f8d1ba3a0bed9f4f55a582719ae6&v=4
+ url: https://github.com/marsboy02
+- login: vtgn
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/112889052?v=4
+ url: https://github.com/vtgn
+one_year_experts:
- login: YuriiMotov
- count: 72
- avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4
+ count: 820
+ avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=b9b13d598dddfab529a52d264df80a900bfe7060&v=4
url: https://github.com/YuriiMotov
+- login: luzzodev
+ count: 87
+ avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4
+ url: https://github.com/luzzodev
- login: Kludex
- count: 39
+ count: 51
avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4
url: https://github.com/Kludex
- login: sinisaos
- count: 37
+ count: 39
avatarUrl: https://avatars.githubusercontent.com/u/30960668?v=4
url: https://github.com/sinisaos
-- login: luzzodev
- count: 36
- avatarUrl: https://avatars.githubusercontent.com/u/27291415?v=4
- url: https://github.com/luzzodev
- login: JavierSanchezCastro
- count: 16
+ count: 26
avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4
url: https://github.com/JavierSanchezCastro
+- login: alv2017
+ count: 26
+ avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4
+ url: https://github.com/alv2017
- login: tiangolo
- count: 13
+ count: 21
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
url: https://github.com/tiangolo
+- login: valentinDruzhinin
+ count: 19
+ avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4
+ url: https://github.com/valentinDruzhinin
+- login: jgould22
+ count: 17
+ avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4
+ url: https://github.com/jgould22
- login: Kfir-G
count: 13
avatarUrl: https://avatars.githubusercontent.com/u/57500876?u=0cd29db046a17f12f382d398141319fca7ff230a&v=4
url: https://github.com/Kfir-G
- login: sehraramiz
- count: 10
+ count: 11
avatarUrl: https://avatars.githubusercontent.com/u/14166324?u=8fac65e84dfff24245d304a5b5b09f7b5bd69dc9&v=4
url: https://github.com/sehraramiz
- login: estebanx64
@@ -420,57 +521,93 @@ six_months_experts:
avatarUrl: https://avatars.githubusercontent.com/u/10840422?u=45f015f95e1c0f06df602be4ab688d4b854cc8a8&v=4
url: https://github.com/estebanx64
- login: ceb10n
- count: 9
+ count: 10
avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4
url: https://github.com/ceb10n
-- login: yvallois
- count: 6
- avatarUrl: https://avatars.githubusercontent.com/u/36999744?v=4
- url: https://github.com/yvallois
+- login: sachinh35
+ count: 9
+ avatarUrl: https://avatars.githubusercontent.com/u/21972708?u=8560b97b8b41e175f476270b56de8a493b84f302&v=4
+ url: https://github.com/sachinh35
+- login: yauhen-sobaleu
+ count: 9
+ avatarUrl: https://avatars.githubusercontent.com/u/51629535?u=fc1817060daf2df438bfca86c44f33da5cd667db&v=4
+ url: https://github.com/yauhen-sobaleu
- login: n8sty
- count: 6
+ count: 7
avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4
url: https://github.com/n8sty
+- login: yvallois
+ count: 7
+ avatarUrl: https://avatars.githubusercontent.com/u/36999744?v=4
+ url: https://github.com/yvallois
+- login: raceychan
+ count: 6
+ avatarUrl: https://avatars.githubusercontent.com/u/75417963?u=060c62870ec5a791765e63ac20d8885d11143786&v=4
+ url: https://github.com/raceychan
+- login: DoctorJohn
+ count: 5
+ avatarUrl: https://avatars.githubusercontent.com/u/14076775?u=2913e70a6142772847e91e2aaa5b9152391715e9&v=4
+ url: https://github.com/DoctorJohn
+- login: eqsdxr
+ count: 4
+ avatarUrl: https://avatars.githubusercontent.com/u/157279130?u=58fddf77ed76966eaa8c73eea9bea4bb0c53b673&v=4
+ url: https://github.com/eqsdxr
- login: TomFaulkner
count: 4
avatarUrl: https://avatars.githubusercontent.com/u/14956620?v=4
url: https://github.com/TomFaulkner
- login: yokwejuste
count: 4
- avatarUrl: https://avatars.githubusercontent.com/u/71908316?u=592c1e42aa0ee5cb94890e0b863e2acc78cc3bbc&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/71908316?u=4ba43bd63c169b5c015137d8916752a44001445a&v=4
url: https://github.com/yokwejuste
-- login: jgould22
+- login: svlandeg
count: 4
- avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4
- url: https://github.com/jgould22
-- login: alv2017
+ avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4
+ url: https://github.com/svlandeg
+- login: mattmess1221
count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4
- url: https://github.com/alv2017
-- login: viniciusCalcantara
+ avatarUrl: https://avatars.githubusercontent.com/u/3409962?u=d22ea18aa8ea688af25a45df306134d593621a44&v=4
+ url: https://github.com/mattmess1221
+- login: Jelle-tenB
count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/108818737?u=3d7ffe5808843ee4372f9cc5a559ff1674cf1792&v=4
- url: https://github.com/viniciusCalcantara
-- login: pawelad
+ avatarUrl: https://avatars.githubusercontent.com/u/210023470?u=c25d66addf36a747bd9fab773c4a6e7b238f45d4&v=4
+ url: https://github.com/Jelle-tenB
+- login: pythonweb2
count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/7062874?u=d27dc220545a8401ad21840590a97d474d7101e6&v=4
- url: https://github.com/pawelad
-- login: dbfreem
+ avatarUrl: https://avatars.githubusercontent.com/u/32141163?v=4
+ url: https://github.com/pythonweb2
+- login: viniciusCalcantara
count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/9778569?u=f2f1e9135b5e4f1b0c6821a548b17f97572720fc&v=4
- url: https://github.com/dbfreem
-- login: Isuxiz
+ avatarUrl: https://avatars.githubusercontent.com/u/108818737?u=80f3ec7427fa6a41d5896984d0c526432f2299fa&v=4
+ url: https://github.com/viniciusCalcantara
+- login: davidhuser
count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/48672727?u=34d7b4ade252687d22a27cf53037b735b244bfc1&v=4
- url: https://github.com/Isuxiz
+ avatarUrl: https://avatars.githubusercontent.com/u/4357648?u=6ed702f8f6d49a8b2a0ed33cbd8ab59c2d7db7f7&v=4
+ url: https://github.com/davidhuser
- login: bertomaniac
count: 3
avatarUrl: https://avatars.githubusercontent.com/u/10235051?u=14484a96833228a7b29fee4a7916d411c242c4f6&v=4
url: https://github.com/bertomaniac
+- login: dbfreem
+ count: 3
+ avatarUrl: https://avatars.githubusercontent.com/u/9778569?u=f2f1e9135b5e4f1b0c6821a548b17f97572720fc&v=4
+ url: https://github.com/dbfreem
- login: PhysicallyActive
count: 3
avatarUrl: https://avatars.githubusercontent.com/u/160476156?u=7a8e44f4a43d3bba636f795bb7d9476c9233b4d8&v=4
url: https://github.com/PhysicallyActive
+- login: SobikXexe
+ count: 3
+ avatarUrl: https://avatars.githubusercontent.com/u/87701130?v=4
+ url: https://github.com/SobikXexe
+- login: pawelad
+ count: 3
+ avatarUrl: https://avatars.githubusercontent.com/u/7062874?u=d27dc220545a8401ad21840590a97d474d7101e6&v=4
+ url: https://github.com/pawelad
+- login: Isuxiz
+ count: 3
+ avatarUrl: https://avatars.githubusercontent.com/u/48672727?u=34d7b4ade252687d22a27cf53037b735b244bfc1&v=4
+ url: https://github.com/Isuxiz
- login: Minibrams
count: 3
avatarUrl: https://avatars.githubusercontent.com/u/8108085?u=b028dbc308fa8485e0e2e9402b3d03d8deb22bf9&v=4
@@ -479,388 +616,99 @@ six_months_experts:
count: 3
avatarUrl: https://avatars.githubusercontent.com/u/88404339?u=2a80d80b054e9228391e32fb9bb39571509dab6a&v=4
url: https://github.com/AIdjis
-- login: svlandeg
- count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4
- url: https://github.com/svlandeg
-- login: PREPONDERANCE
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/112809059?u=30ab12dc9ddba2f94ab90e6ad4ad8bc5cfa7fccd&v=4
- url: https://github.com/PREPONDERANCE
-- login: nbx3
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/34649527?u=943812f69e0d40adbd3fa1c9b8ef50dd971a2a45&v=4
- url: https://github.com/nbx3
-- login: yanggeorge
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/2434407?v=4
- url: https://github.com/yanggeorge
-- login: XiaoXinYo
+- login: dolfinus
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/56395004?u=b3b7cb758997f283c271a581833e407229dab82c&v=4
- url: https://github.com/XiaoXinYo
-- login: pythonweb2
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/32141163?v=4
- url: https://github.com/pythonweb2
+ avatarUrl: https://avatars.githubusercontent.com/u/4661021?u=ed5ddadcf36d9b943ebe61febe0b96ee34e5425d&v=4
+ url: https://github.com/dolfinus
- login: slafs
count: 2
avatarUrl: https://avatars.githubusercontent.com/u/210173?v=4
url: https://github.com/slafs
-- login: AmirHmZz
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/38752106?u=07f80e451bda00a9492bbc764e49d24ad3ada8cc&v=4
- url: https://github.com/AmirHmZz
-- login: iloveitaly
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/150855?v=4
- url: https://github.com/iloveitaly
-- login: LincolnPuzey
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/18750802?v=4
- url: https://github.com/LincolnPuzey
-- login: alejsdev
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=356f39ff3f0211c720b06d3dbb060e98884085e3&v=4
- url: https://github.com/alejsdev
-- login: Knighthawk-Leo
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/72437494?u=27c68db94a3107b605e603cc136f4ba83f0106d5&v=4
- url: https://github.com/Knighthawk-Leo
-- login: gelezo43
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/40732698?u=611f39d3c1d2f4207a590937a78c1f10eed6232c&v=4
- url: https://github.com/gelezo43
-- login: christiansicari
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/29756552?v=4
- url: https://github.com/christiansicari
-- login: 1001pepi
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/82064861?u=8c6ffdf2275d6970a07294752c545cd2702c57d3&v=4
- url: https://github.com/1001pepi
-- login: AliYmn
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/18416653?u=98c1fca46c7e4dabe8c39d17b5e55d1511d41cf9&v=4
- url: https://github.com/AliYmn
-- login: RichieB2B
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/1461970?u=edaa57d1077705244ea5c9244f4783d94ff11f12&v=4
- url: https://github.com/RichieB2B
-- login: Synrom
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/30272537?v=4
- url: https://github.com/Synrom
-- login: ecly
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/8410422?v=4
- url: https://github.com/ecly
-- login: iiotsrc
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/131771119?u=bcaf2559ef6266af70b151b7fda31a1ee3dbecb3&v=4
- url: https://github.com/iiotsrc
-- login: simondale00
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/33907262?u=2721fb37014d50daf473267c808aa678ecaefe09&v=4
- url: https://github.com/simondale00
-- login: jd-solanki
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/47495003?u=6e225cb42c688d0cd70e65c6baedb9f5922b1178&v=4
- url: https://github.com/jd-solanki
-- login: AumGupta
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/86357151?u=7d05aa606c0611a18f4db16cf26361ce10a6e195&v=4
- url: https://github.com/AumGupta
-- login: DeoLeung
+- login: purepani
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/3764720?u=4c222ef513814de4c7fb3736d0a7adf11d953d43&v=4
- url: https://github.com/DeoLeung
-- login: Reemyos
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/44867003?v=4
- url: https://github.com/Reemyos
-- login: deight93
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/37678115?u=a608798b5bd0034183a9c430ebb42fb266db86ce&v=4
- url: https://github.com/deight93
-- login: Jkrox
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/83181939?u=d6a922d97129f7f3916d6a1c166bc011b3a72b7f&v=4
- url: https://github.com/Jkrox
-- login: mmzeynalli
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/33568903?u=19efd0c0722730b83a70b7c86c36e5b7d83e07d2&v=4
- url: https://github.com/mmzeynalli
+ avatarUrl: https://avatars.githubusercontent.com/u/7587353?v=4
+ url: https://github.com/purepani
- login: ddahan
count: 2
avatarUrl: https://avatars.githubusercontent.com/u/1933516?u=1d200a620e8d6841df017e9f2bb7efb58b580f40&v=4
url: https://github.com/ddahan
-- login: jfeaver
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/1091338?u=0bcba366447d8fadad63f6705a52d128da4c7ec2&v=4
- url: https://github.com/jfeaver
-- login: Wurstnase
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/8709415?u=f479af475a97aee9a1dab302cfc35d07e9ea245f&v=4
- url: https://github.com/Wurstnase
-- login: tristan
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/1412?u=aab8aaa4cc0f1210ac45fc93873a5909d314c965&v=4
- url: https://github.com/tristan
-- login: chandanch
+- login: yanggeorge
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/8663552?u=afc484bc0a952c83f1fb6a1583cda443f807cd66&v=4
- url: https://github.com/chandanch
-- login: rvishruth
+ avatarUrl: https://avatars.githubusercontent.com/u/2434407?v=4
+ url: https://github.com/yanggeorge
+- login: WilliamDEdwards
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/79176273?v=4
- url: https://github.com/rvishruth
-- login: mattmess1221
+ avatarUrl: https://avatars.githubusercontent.com/u/12184311?u=9b29d5d1d71f5f1a7ef9e439963ad3529e3b33a4&v=4
+ url: https://github.com/WilliamDEdwards
+- login: TaigoFr
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/3409962?u=723662989f2027755e67d200137c13c53ae154ac&v=4
- url: https://github.com/mattmess1221
-- login: meower1
+ avatarUrl: https://avatars.githubusercontent.com/u/17792131?u=372b27056ec82f1ae03d8b3f37ef55b04a7cfdd1&v=4
+ url: https://github.com/TaigoFr
+- login: Garrett-R
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/109747197?u=0a5cc2a6ae74e558f0afc2874da85132e5953d8b&v=4
- url: https://github.com/meower1
-one_year_experts:
-- login: YuriiMotov
- count: 223
- avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4
- url: https://github.com/YuriiMotov
-- login: Kludex
- count: 83
- avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4
- url: https://github.com/Kludex
-- login: JavierSanchezCastro
- count: 47
- avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4
- url: https://github.com/JavierSanchezCastro
-- login: jgould22
- count: 42
- avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4
- url: https://github.com/jgould22
-- login: sinisaos
- count: 39
- avatarUrl: https://avatars.githubusercontent.com/u/30960668?v=4
- url: https://github.com/sinisaos
-- login: luzzodev
- count: 36
- avatarUrl: https://avatars.githubusercontent.com/u/27291415?v=4
- url: https://github.com/luzzodev
-- login: tiangolo
- count: 24
- avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
- url: https://github.com/tiangolo
-- login: n8sty
- count: 23
- avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4
- url: https://github.com/n8sty
-- login: estebanx64
- count: 19
- avatarUrl: https://avatars.githubusercontent.com/u/10840422?u=45f015f95e1c0f06df602be4ab688d4b854cc8a8&v=4
- url: https://github.com/estebanx64
-- login: sehraramiz
- count: 14
- avatarUrl: https://avatars.githubusercontent.com/u/14166324?u=8fac65e84dfff24245d304a5b5b09f7b5bd69dc9&v=4
- url: https://github.com/sehraramiz
-- login: PhysicallyActive
- count: 14
- avatarUrl: https://avatars.githubusercontent.com/u/160476156?u=7a8e44f4a43d3bba636f795bb7d9476c9233b4d8&v=4
- url: https://github.com/PhysicallyActive
-- login: ceb10n
- count: 14
- avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4
- url: https://github.com/ceb10n
-- login: Kfir-G
- count: 13
- avatarUrl: https://avatars.githubusercontent.com/u/57500876?u=0cd29db046a17f12f382d398141319fca7ff230a&v=4
- url: https://github.com/Kfir-G
-- login: mattmess1221
- count: 11
- avatarUrl: https://avatars.githubusercontent.com/u/3409962?u=723662989f2027755e67d200137c13c53ae154ac&v=4
- url: https://github.com/mattmess1221
-- login: hasansezertasan
- count: 10
- avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4
- url: https://github.com/hasansezertasan
-- login: AIdjis
- count: 8
- avatarUrl: https://avatars.githubusercontent.com/u/88404339?u=2a80d80b054e9228391e32fb9bb39571509dab6a&v=4
- url: https://github.com/AIdjis
-- login: yvallois
- count: 6
- avatarUrl: https://avatars.githubusercontent.com/u/36999744?v=4
- url: https://github.com/yvallois
-- login: PREPONDERANCE
- count: 5
- avatarUrl: https://avatars.githubusercontent.com/u/112809059?u=30ab12dc9ddba2f94ab90e6ad4ad8bc5cfa7fccd&v=4
- url: https://github.com/PREPONDERANCE
-- login: pythonweb2
- count: 5
- avatarUrl: https://avatars.githubusercontent.com/u/32141163?v=4
- url: https://github.com/pythonweb2
-- login: acidjunk
- count: 5
- avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4
- url: https://github.com/acidjunk
-- login: gustavosett
- count: 5
- avatarUrl: https://avatars.githubusercontent.com/u/99373133?u=1739ca547c3d200f1b72450520bce46a97aab184&v=4
- url: https://github.com/gustavosett
-- login: binbjz
- count: 5
- avatarUrl: https://avatars.githubusercontent.com/u/8213913?u=22b68b7a0d5bf5e09c02084c0f5f53d7503114cd&v=4
- url: https://github.com/binbjz
-- login: chyok
- count: 5
- avatarUrl: https://avatars.githubusercontent.com/u/32629225?u=3b7c30e8a09426a1b9284f6e8a0ae53a525596bf&v=4
- url: https://github.com/chyok
-- login: TomFaulkner
- count: 4
- avatarUrl: https://avatars.githubusercontent.com/u/14956620?v=4
- url: https://github.com/TomFaulkner
-- login: yokwejuste
- count: 4
- avatarUrl: https://avatars.githubusercontent.com/u/71908316?u=592c1e42aa0ee5cb94890e0b863e2acc78cc3bbc&v=4
- url: https://github.com/yokwejuste
-- login: DeoLeung
- count: 4
- avatarUrl: https://avatars.githubusercontent.com/u/3764720?u=4c222ef513814de4c7fb3736d0a7adf11d953d43&v=4
- url: https://github.com/DeoLeung
-- login: flo-at
- count: 4
- avatarUrl: https://avatars.githubusercontent.com/u/564288?v=4
- url: https://github.com/flo-at
-- login: GodMoonGoodman
- count: 4
- avatarUrl: https://avatars.githubusercontent.com/u/29688727?u=7b251da620d999644c37c1feeb292d033eed7ad6&v=4
- url: https://github.com/GodMoonGoodman
-- login: bertomaniac
- count: 4
- avatarUrl: https://avatars.githubusercontent.com/u/10235051?u=14484a96833228a7b29fee4a7916d411c242c4f6&v=4
- url: https://github.com/bertomaniac
-- login: alv2017
- count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4
- url: https://github.com/alv2017
-- login: msehnout
- count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/9369632?u=8c988f1b008a3f601385a3616f9327820f66e3a5&v=4
- url: https://github.com/msehnout
-- login: viniciusCalcantara
- count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/108818737?u=3d7ffe5808843ee4372f9cc5a559ff1674cf1792&v=4
- url: https://github.com/viniciusCalcantara
-- login: pawelad
- count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/7062874?u=d27dc220545a8401ad21840590a97d474d7101e6&v=4
- url: https://github.com/pawelad
-- login: ThirVondukr
- count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/50728601?u=167c0bd655e52817082e50979a86d2f98f95b1a3&v=4
- url: https://github.com/ThirVondukr
-- login: dbfreem
- count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/9778569?u=f2f1e9135b5e4f1b0c6821a548b17f97572720fc&v=4
- url: https://github.com/dbfreem
-- login: Isuxiz
- count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/48672727?u=34d7b4ade252687d22a27cf53037b735b244bfc1&v=4
- url: https://github.com/Isuxiz
-- login: angely-dev
- count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/4362224?v=4
- url: https://github.com/angely-dev
-- login: deight93
- count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/37678115?u=a608798b5bd0034183a9c430ebb42fb266db86ce&v=4
- url: https://github.com/deight93
+ avatarUrl: https://avatars.githubusercontent.com/u/6614695?u=c128fd775002882f6e391bda5a89d1bdc5bdf45f&v=4
+ url: https://github.com/Garrett-R
- login: mmzeynalli
- count: 3
+ count: 2
avatarUrl: https://avatars.githubusercontent.com/u/33568903?u=19efd0c0722730b83a70b7c86c36e5b7d83e07d2&v=4
url: https://github.com/mmzeynalli
-- login: Minibrams
- count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/8108085?u=b028dbc308fa8485e0e2e9402b3d03d8deb22bf9&v=4
- url: https://github.com/Minibrams
-- login: ryanisn
- count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/53449841?v=4
- url: https://github.com/ryanisn
-- login: svlandeg
- count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4
- url: https://github.com/svlandeg
-- login: alexandercronin
- count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/8014288?u=69580504c51a0cdd756fc47b23bb7f404bd694e7&v=4
- url: https://github.com/alexandercronin
-- login: aanchlia
- count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/2835374?u=3c3ed29aa8b09ccaf8d66def0ce82bc2f7e5aab6&v=4
- url: https://github.com/aanchlia
-- login: chrisK824
- count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/79946379?u=03d85b22d696a58a9603e55fbbbe2de6b0f4face&v=4
- url: https://github.com/chrisK824
-- login: omarcruzpantoja
- count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/15116058?u=4b64c643fad49225d854e1aaecd1ffc6f9071a1b&v=4
- url: https://github.com/omarcruzpantoja
-- login: ahmedabdou14
- count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/104530599?u=d87b866e7c1db970d6f8e8031643818349b046d5&v=4
- url: https://github.com/ahmedabdou14
-- login: nbx3
+- login: jd-solanki
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/34649527?u=943812f69e0d40adbd3fa1c9b8ef50dd971a2a45&v=4
- url: https://github.com/nbx3
-- login: yanggeorge
+ avatarUrl: https://avatars.githubusercontent.com/u/47495003?u=6e225cb42c688d0cd70e65c6baedb9f5922b1178&v=4
+ url: https://github.com/jd-solanki
+- login: EverStarck
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/2434407?v=4
- url: https://github.com/yanggeorge
-- login: XiaoXinYo
+ avatarUrl: https://avatars.githubusercontent.com/u/51029456?u=343409b7cb6b3ea6a59359f4e8370d9c3f140ecd&v=4
+ url: https://github.com/EverStarck
+- login: henrymcl
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/56395004?u=b3b7cb758997f283c271a581833e407229dab82c&v=4
- url: https://github.com/XiaoXinYo
-- login: anantgupta129
+ avatarUrl: https://avatars.githubusercontent.com/u/26480299?v=4
+ url: https://github.com/henrymcl
+- login: jymchng
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/66518357?u=6e25dcd84638f17d2c6df5dc26f07fd7c6dc118e&v=4
- url: https://github.com/anantgupta129
-- login: slafs
+ avatarUrl: https://avatars.githubusercontent.com/u/27895426?u=fb88c47775147d62a395fdb895d1af4148c7b566&v=4
+ url: https://github.com/jymchng
+- login: adsouza
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/210173?v=4
- url: https://github.com/slafs
-- login: CarlosOliveira-23
+ avatarUrl: https://avatars.githubusercontent.com/u/275832?v=4
+ url: https://github.com/adsouza
+- login: Synrom
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/102637302?u=cf350a4db956f30cbb2c27d3be0d15c282e32b14&v=4
- url: https://github.com/CarlosOliveira-23
-- login: monchin
+ avatarUrl: https://avatars.githubusercontent.com/u/30272537?v=4
+ url: https://github.com/Synrom
+- login: gaby
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/18521800?v=4
- url: https://github.com/monchin
-- login: AmirHmZz
+ avatarUrl: https://avatars.githubusercontent.com/u/835733?u=8c72dec16fa560bdc81113354f2ffd79ad062bde&v=4
+ url: https://github.com/gaby
+- login: christiansicari
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/38752106?u=07f80e451bda00a9492bbc764e49d24ad3ada8cc&v=4
- url: https://github.com/AmirHmZz
-- login: Leon0824
+ avatarUrl: https://avatars.githubusercontent.com/u/29756552?v=4
+ url: https://github.com/christiansicari
+- login: Brikas
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/1922026?v=4
- url: https://github.com/Leon0824
+ avatarUrl: https://avatars.githubusercontent.com/u/80290187?v=4
+ url: https://github.com/Brikas
+- login: JacobHayes
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/2555532?u=354a525847a276bbb4426b0c95791a8ba5970f9b&v=4
+ url: https://github.com/JacobHayes
+- login: rlimberger
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/4841242?u=6a13252caf3cedceb07b6e2775b6592445d13b70&v=4
+ url: https://github.com/rlimberger
- login: iloveitaly
count: 2
avatarUrl: https://avatars.githubusercontent.com/u/150855?v=4
url: https://github.com/iloveitaly
-- login: msukmanowsky
+- login: iiotsrc
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/362755?u=782e6bf5b9f0356c3f74b4d894fda9f179252086&v=4
- url: https://github.com/msukmanowsky
-- login: shurshilov
+ avatarUrl: https://avatars.githubusercontent.com/u/131771119?u=bcaf2559ef6266af70b151b7fda31a1ee3dbecb3&v=4
+ url: https://github.com/iiotsrc
+- login: AmirHmZz
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/11828278?u=6bcadc5ce4f2f56a514331c9f68eb987d4afe29a&v=4
- url: https://github.com/shurshilov
-- login: LincolnPuzey
+ avatarUrl: https://avatars.githubusercontent.com/u/38752106?u=07f80e451bda00a9492bbc764e49d24ad3ada8cc&v=4
+ url: https://github.com/AmirHmZz
+- login: PidgeyBE
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/18750802?v=4
- url: https://github.com/LincolnPuzey
+ avatarUrl: https://avatars.githubusercontent.com/u/19860056?u=47b584eb1c1ab45e31c1b474109a962d7e82be49&v=4
+ url: https://github.com/PidgeyBE
diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml
index 4231452e4..2b3cd282d 100644
--- a/docs/en/data/sponsors.yml
+++ b/docs/en/data/sponsors.yml
@@ -5,26 +5,14 @@ gold:
- url: https://platform.sh/try-it-now/?utm_source=fastapi-signup&utm_medium=banner&utm_campaign=FastAPI-signup-June-2023
title: "Build, run and scale your apps on a modern, reliable, and secure PaaS."
img: https://fastapi.tiangolo.com/img/sponsors/platform-sh.png
- - url: https://www.porter.run
- title: Deploy FastAPI on AWS with a few clicks
- img: https://fastapi.tiangolo.com/img/sponsors/porter.png
- - url: https://bump.sh/fastapi?utm_source=fastapi&utm_medium=referral&utm_campaign=sponsor
- title: Automate FastAPI documentation generation with Bump.sh
- img: https://fastapi.tiangolo.com/img/sponsors/bump-sh.svg
- url: https://github.com/scalar/scalar/?utm_source=fastapi&utm_medium=website&utm_campaign=main-badge
title: "Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files"
img: https://fastapi.tiangolo.com/img/sponsors/scalar.svg
- url: https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=mainbadge
title: Auth, user management and more for your B2B product
img: https://fastapi.tiangolo.com/img/sponsors/propelauth.png
- - url: https://www.withcoherence.com/?utm_medium=advertising&utm_source=fastapi&utm_campaign=website
- title: Coherence
- img: https://fastapi.tiangolo.com/img/sponsors/coherence.png
- - url: https://www.mongodb.com/developer/languages/python/python-quickstart-fastapi/?utm_campaign=fastapi_framework&utm_source=fastapi_sponsorship&utm_medium=web_referral
- title: Simplify Full Stack Development with FastAPI & MongoDB
- img: https://fastapi.tiangolo.com/img/sponsors/mongodb.png
- url: https://zuplo.link/fastapi-gh
- title: 'Zuplo: Scale, Protect, Document, and Monetize your FastAPI'
+ title: 'Zuplo: Deploy, Secure, Document, and Monetize your FastAPI'
img: https://fastapi.tiangolo.com/img/sponsors/zuplo.png
- url: https://liblab.com?utm_source=fastapi
title: liblab - Generate SDKs from FastAPI
@@ -32,14 +20,23 @@ gold:
- url: https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi
title: Deploy & scale any full-stack web app on Render. Focus on building apps, not infra.
img: https://fastapi.tiangolo.com/img/sponsors/render.svg
+ - url: https://www.coderabbit.ai/?utm_source=fastapi&utm_medium=badge&utm_campaign=fastapi
+ title: Cut Code Review Time & Bugs in Half with CodeRabbit
+ img: https://fastapi.tiangolo.com/img/sponsors/coderabbit.png
+ - url: https://subtotal.com/?utm_source=fastapi&utm_medium=sponsorship&utm_campaign=open-source
+ title: The Gold Standard in Retail Account Linking
+ img: https://fastapi.tiangolo.com/img/sponsors/subtotal.svg
+ - url: https://vibe.mobb.ai/?utm_source=Fast+APi&utm_medium=Image&utm_campaign=MVS
+ title: Secure Your AI-Generated Code to Unlock Dev Productivity
+ img: https://fastapi.tiangolo.com/img/sponsors/mobbai.png
+ - url: https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi
+ title: Deploy enterprise applications at startup speed
+ img: https://fastapi.tiangolo.com/img/sponsors/railway.png
silver:
- - url: https://github.com/deepset-ai/haystack/
- title: Build powerful search from composable, open source building blocks
- img: https://fastapi.tiangolo.com/img/sponsors/haystack-fastapi.svg
- - url: https://databento.com/
+ - url: https://databento.com/?utm_source=fastapi&utm_medium=sponsor&utm_content=display
title: Pay as you go for market data
img: https://fastapi.tiangolo.com/img/sponsors/databento.svg
- - url: https://speakeasy.com?utm_source=fastapi+repo&utm_medium=github+sponsorship
+ - url: https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship
title: SDKs for your API | Speakeasy
img: https://fastapi.tiangolo.com/img/sponsors/speakeasy.png
- url: https://www.svix.com/
@@ -48,10 +45,22 @@ silver:
- url: https://www.stainlessapi.com/?utm_source=fastapi&utm_medium=referral
title: Stainless | Generate best-in-class SDKs
img: https://fastapi.tiangolo.com/img/sponsors/stainless.png
+ - url: https://www.permit.io/blog/implement-authorization-in-fastapi?utm_source=github&utm_medium=referral&utm_campaign=fastapi
+ title: Fine-Grained Authorization for FastAPI
+ img: https://fastapi.tiangolo.com/img/sponsors/permit.png
+ - url: https://www.interviewpal.com/?utm_source=fastapi&utm_medium=open-source&utm_campaign=dev-hiring
+ title: InterviewPal - AI Interview Coach for Engineers and Devs
+ img: https://fastapi.tiangolo.com/img/sponsors/interviewpal.png
+ - url: https://dribia.com/en/
+ title: Dribia - Data Science within your reach
+ img: https://fastapi.tiangolo.com/img/sponsors/dribia.png
bronze:
- url: https://www.exoflare.com/open-source/?utm_source=FastAPI&utm_campaign=open_source
title: Biosecurity risk assessments made easy.
img: https://fastapi.tiangolo.com/img/sponsors/exoflare.png
- - url: https://testdriven.io/courses/tdd-fastapi/
- title: Learn to build high-quality web apps with best practices
- img: https://fastapi.tiangolo.com/img/sponsors/testdriven.svg
+ # - url: https://testdriven.io/courses/tdd-fastapi/
+ # title: Learn to build high-quality web apps with best practices
+ # img: https://fastapi.tiangolo.com/img/sponsors/testdriven.svg
+ - url: https://lambdatest.com/?utm_source=fastapi&utm_medium=partner&utm_campaign=sponsor&utm_term=opensource&utm_content=webpage
+ title: LambdaTest, AI-Powered Cloud-based Test Orchestration Platform
+ img: https://fastapi.tiangolo.com/img/sponsors/lambdatest.png
diff --git a/docs/en/data/sponsors_badge.yml b/docs/en/data/sponsors_badge.yml
index d507a500f..62ba6a84c 100644
--- a/docs/en/data/sponsors_badge.yml
+++ b/docs/en/data/sponsors_badge.yml
@@ -38,3 +38,11 @@ logins:
- render-sponsorships
- renderinc
- stainless-api
+ - snapit-cypher
+ - coderabbitai
+ - permitio
+ - LambdaTest-Inc
+ - dribia
+ - madisonredtfeldt
+ - railwayapp
+ - subtotal
diff --git a/docs/en/data/topic_repos.yml b/docs/en/data/topic_repos.yml
index c1176e55c..631edbb77 100644
--- a/docs/en/data/topic_repos.yml
+++ b/docs/en/data/topic_repos.yml
@@ -1,495 +1,495 @@
- name: full-stack-fastapi-template
html_url: https://github.com/fastapi/full-stack-fastapi-template
- stars: 28796
+ stars: 35002
owner_login: fastapi
owner_html_url: https://github.com/fastapi
- name: Hello-Python
html_url: https://github.com/mouredev/Hello-Python
- stars: 27554
+ stars: 31317
owner_login: mouredev
owner_html_url: https://github.com/mouredev
- name: serve
html_url: https://github.com/jina-ai/serve
- stars: 21225
+ stars: 21680
owner_login: jina-ai
owner_html_url: https://github.com/jina-ai
-- name: sqlmodel
- html_url: https://github.com/fastapi/sqlmodel
- stars: 14921
- owner_login: fastapi
- owner_html_url: https://github.com/fastapi
- name: HivisionIDPhotos
html_url: https://github.com/Zeyi-Lin/HivisionIDPhotos
- stars: 14025
+ stars: 18700
owner_login: Zeyi-Lin
owner_html_url: https://github.com/Zeyi-Lin
+- name: sqlmodel
+ html_url: https://github.com/fastapi/sqlmodel
+ stars: 16469
+ owner_login: fastapi
+ owner_html_url: https://github.com/fastapi
- name: Douyin_TikTok_Download_API
html_url: https://github.com/Evil0ctal/Douyin_TikTok_Download_API
- stars: 10001
+ stars: 13663
owner_login: Evil0ctal
owner_html_url: https://github.com/Evil0ctal
- name: fastapi-best-practices
html_url: https://github.com/zhanymkanov/fastapi-best-practices
- stars: 9820
+ stars: 12716
owner_login: zhanymkanov
owner_html_url: https://github.com/zhanymkanov
- name: awesome-fastapi
html_url: https://github.com/mjhea0/awesome-fastapi
- stars: 8899
+ stars: 10099
owner_login: mjhea0
owner_html_url: https://github.com/mjhea0
- name: FastUI
html_url: https://github.com/pydantic/FastUI
- stars: 8400
+ stars: 8850
owner_login: pydantic
owner_html_url: https://github.com/pydantic
+- name: XHS-Downloader
+ html_url: https://github.com/JoeanAmier/XHS-Downloader
+ stars: 8305
+ owner_login: JoeanAmier
+ owner_html_url: https://github.com/JoeanAmier
+- name: FileCodeBox
+ html_url: https://github.com/vastsa/FileCodeBox
+ stars: 6936
+ owner_login: vastsa
+ owner_html_url: https://github.com/vastsa
- name: nonebot2
html_url: https://github.com/nonebot/nonebot2
- stars: 6235
+ stars: 6911
owner_login: nonebot
owner_html_url: https://github.com/nonebot
+- name: fastapi_mcp
+ html_url: https://github.com/tadata-org/fastapi_mcp
+ stars: 6767
+ owner_login: tadata-org
+ owner_html_url: https://github.com/tadata-org
+- name: SurfSense
+ html_url: https://github.com/MODSetter/SurfSense
+ stars: 6202
+ owner_login: MODSetter
+ owner_html_url: https://github.com/MODSetter
+- name: hatchet
+ html_url: https://github.com/hatchet-dev/hatchet
+ stars: 5878
+ owner_login: hatchet-dev
+ owner_html_url: https://github.com/hatchet-dev
+- name: polar
+ html_url: https://github.com/polarsource/polar
+ stars: 5872
+ owner_login: polarsource
+ owner_html_url: https://github.com/polarsource
- name: serge
html_url: https://github.com/serge-chat/serge
- stars: 5685
+ stars: 5740
owner_login: serge-chat
owner_html_url: https://github.com/serge-chat
- name: fastapi-users
html_url: https://github.com/fastapi-users/fastapi-users
- stars: 4787
+ stars: 5429
owner_login: fastapi-users
owner_html_url: https://github.com/fastapi-users
-- name: FileCodeBox
- html_url: https://github.com/vastsa/FileCodeBox
- stars: 4479
- owner_login: vastsa
- owner_html_url: https://github.com/vastsa
-- name: hatchet
- html_url: https://github.com/hatchet-dev/hatchet
- stars: 4413
- owner_login: hatchet-dev
- owner_html_url: https://github.com/hatchet-dev
+- name: strawberry
+ html_url: https://github.com/strawberry-graphql/strawberry
+ stars: 4345
+ owner_login: strawberry-graphql
+ owner_html_url: https://github.com/strawberry-graphql
- name: chatgpt-web-share
html_url: https://github.com/chatpire/chatgpt-web-share
- stars: 4322
+ stars: 4301
owner_login: chatpire
owner_html_url: https://github.com/chatpire
+- name: poem
+ html_url: https://github.com/poem-web/poem
+ stars: 4107
+ owner_login: poem-web
+ owner_html_url: https://github.com/poem-web
- name: atrilabs-engine
html_url: https://github.com/Atri-Labs/atrilabs-engine
- stars: 4115
+ stars: 4103
owner_login: Atri-Labs
owner_html_url: https://github.com/Atri-Labs
-- name: strawberry
- html_url: https://github.com/strawberry-graphql/strawberry
- stars: 4084
- owner_login: strawberry-graphql
- owner_html_url: https://github.com/strawberry-graphql
- name: dynaconf
html_url: https://github.com/dynaconf/dynaconf
- stars: 3844
+ stars: 4079
owner_login: dynaconf
owner_html_url: https://github.com/dynaconf
-- name: poem
- html_url: https://github.com/poem-web/poem
- stars: 3698
- owner_login: poem-web
- owner_html_url: https://github.com/poem-web
-- name: polar
- html_url: https://github.com/polarsource/polar
- stars: 3355
- owner_login: polarsource
- owner_html_url: https://github.com/polarsource
-- name: opyrator
- html_url: https://github.com/ml-tooling/opyrator
- stars: 3114
- owner_login: ml-tooling
- owner_html_url: https://github.com/ml-tooling
+- name: LitServe
+ html_url: https://github.com/Lightning-AI/LitServe
+ stars: 3430
+ owner_login: Lightning-AI
+ owner_html_url: https://github.com/Lightning-AI
+- name: logfire
+ html_url: https://github.com/pydantic/logfire
+ stars: 3420
+ owner_login: pydantic
+ owner_html_url: https://github.com/pydantic
- name: farfalle
html_url: https://github.com/rashadphz/farfalle
- stars: 3022
+ stars: 3391
owner_login: rashadphz
owner_html_url: https://github.com/rashadphz
+- name: Kokoro-FastAPI
+ html_url: https://github.com/remsky/Kokoro-FastAPI
+ stars: 3375
+ owner_login: remsky
+ owner_html_url: https://github.com/remsky
+- name: datamodel-code-generator
+ html_url: https://github.com/koxudaxi/datamodel-code-generator
+ stars: 3354
+ owner_login: koxudaxi
+ owner_html_url: https://github.com/koxudaxi
- name: fastapi-admin
html_url: https://github.com/fastapi-admin/fastapi-admin
- stars: 3002
+ stars: 3353
owner_login: fastapi-admin
owner_html_url: https://github.com/fastapi-admin
+- name: huma
+ html_url: https://github.com/danielgtaylor/huma
+ stars: 3277
+ owner_login: danielgtaylor
+ owner_html_url: https://github.com/danielgtaylor
+- name: opyrator
+ html_url: https://github.com/ml-tooling/opyrator
+ stars: 3131
+ owner_login: ml-tooling
+ owner_html_url: https://github.com/ml-tooling
- name: docarray
html_url: https://github.com/docarray/docarray
- stars: 2998
+ stars: 3085
owner_login: docarray
owner_html_url: https://github.com/docarray
-- name: datamodel-code-generator
- html_url: https://github.com/koxudaxi/datamodel-code-generator
- stars: 2845
- owner_login: koxudaxi
- owner_html_url: https://github.com/koxudaxi
+- name: tracecat
+ html_url: https://github.com/TracecatHQ/tracecat
+ stars: 2921
+ owner_login: TracecatHQ
+ owner_html_url: https://github.com/TracecatHQ
- name: fastapi-realworld-example-app
html_url: https://github.com/nsidnev/fastapi-realworld-example-app
- stars: 2832
+ stars: 2919
owner_login: nsidnev
owner_html_url: https://github.com/nsidnev
- name: uvicorn-gunicorn-fastapi-docker
html_url: https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker
- stars: 2727
+ stars: 2789
owner_login: tiangolo
owner_html_url: https://github.com/tiangolo
-- name: WrenAI
- html_url: https://github.com/Canner/WrenAI
- stars: 2699
- owner_login: Canner
- owner_html_url: https://github.com/Canner
-- name: LitServe
- html_url: https://github.com/Lightning-AI/LitServe
- stars: 2664
- owner_login: Lightning-AI
- owner_html_url: https://github.com/Lightning-AI
-- name: logfire
- html_url: https://github.com/pydantic/logfire
- stars: 2495
- owner_login: pydantic
- owner_html_url: https://github.com/pydantic
-- name: huma
- html_url: https://github.com/danielgtaylor/huma
- stars: 2479
- owner_login: danielgtaylor
- owner_html_url: https://github.com/danielgtaylor
-- name: tracecat
- html_url: https://github.com/TracecatHQ/tracecat
- stars: 2446
- owner_login: TracecatHQ
- owner_html_url: https://github.com/TracecatHQ
-- name: RasaGPT
- html_url: https://github.com/paulpierre/RasaGPT
- stars: 2378
- owner_login: paulpierre
- owner_html_url: https://github.com/paulpierre
- name: best-of-web-python
html_url: https://github.com/ml-tooling/best-of-web-python
- stars: 2374
+ stars: 2560
owner_login: ml-tooling
owner_html_url: https://github.com/ml-tooling
+- name: RasaGPT
+ html_url: https://github.com/paulpierre/RasaGPT
+ stars: 2434
+ owner_login: paulpierre
+ owner_html_url: https://github.com/paulpierre
- name: fastapi-react
html_url: https://github.com/Buuntu/fastapi-react
- stars: 2274
+ stars: 2419
owner_login: Buuntu
owner_html_url: https://github.com/Buuntu
+- name: FastAPI-template
+ html_url: https://github.com/s3rius/FastAPI-template
+ stars: 2369
+ owner_login: s3rius
+ owner_html_url: https://github.com/s3rius
- name: nextpy
html_url: https://github.com/dot-agent/nextpy
- stars: 2244
+ stars: 2304
owner_login: dot-agent
owner_html_url: https://github.com/dot-agent
+- name: sqladmin
+ html_url: https://github.com/aminalaee/sqladmin
+ stars: 2272
+ owner_login: aminalaee
+ owner_html_url: https://github.com/aminalaee
- name: 30-Days-of-Python
html_url: https://github.com/codingforentrepreneurs/30-Days-of-Python
- stars: 2154
+ stars: 2192
owner_login: codingforentrepreneurs
owner_html_url: https://github.com/codingforentrepreneurs
-- name: FastAPI-template
- html_url: https://github.com/s3rius/FastAPI-template
- stars: 2067
- owner_login: s3rius
- owner_html_url: https://github.com/s3rius
+- name: supabase-py
+ html_url: https://github.com/supabase/supabase-py
+ stars: 2141
+ owner_login: supabase
+ owner_html_url: https://github.com/supabase
- name: langserve
html_url: https://github.com/langchain-ai/langserve
- stars: 1980
+ stars: 2140
owner_login: langchain-ai
owner_html_url: https://github.com/langchain-ai
-- name: sqladmin
- html_url: https://github.com/aminalaee/sqladmin
- stars: 1980
- owner_login: aminalaee
- owner_html_url: https://github.com/aminalaee
- name: fastapi-utils
html_url: https://github.com/fastapiutils/fastapi-utils
- stars: 1970
+ stars: 2107
owner_login: fastapiutils
owner_html_url: https://github.com/fastapiutils
- name: solara
html_url: https://github.com/widgetti/solara
- stars: 1950
+ stars: 2063
owner_login: widgetti
owner_html_url: https://github.com/widgetti
-- name: python-week-2022
- html_url: https://github.com/rochacbruno/python-week-2022
- stars: 1836
- owner_login: rochacbruno
- owner_html_url: https://github.com/rochacbruno
-- name: supabase-py
- html_url: https://github.com/supabase/supabase-py
- stars: 1803
- owner_login: supabase
- owner_html_url: https://github.com/supabase
- name: mangum
html_url: https://github.com/Kludex/mangum
- stars: 1760
+ stars: 1943
owner_login: Kludex
owner_html_url: https://github.com/Kludex
+- name: python-week-2022
+ html_url: https://github.com/rochacbruno/python-week-2022
+ stars: 1819
+ owner_login: rochacbruno
+ owner_html_url: https://github.com/rochacbruno
+- name: agentkit
+ html_url: https://github.com/BCG-X-Official/agentkit
+ stars: 1774
+ owner_login: BCG-X-Official
+ owner_html_url: https://github.com/BCG-X-Official
- name: manage-fastapi
html_url: https://github.com/ycd/manage-fastapi
- stars: 1704
+ stars: 1769
owner_login: ycd
owner_html_url: https://github.com/ycd
- name: ormar
html_url: https://github.com/collerek/ormar
- stars: 1688
+ stars: 1761
owner_login: collerek
owner_html_url: https://github.com/collerek
-- name: agentkit
- html_url: https://github.com/BCG-X-Official/agentkit
- stars: 1615
- owner_login: BCG-X-Official
- owner_html_url: https://github.com/BCG-X-Official
+- name: piccolo
+ html_url: https://github.com/piccolo-orm/piccolo
+ stars: 1658
+ owner_login: piccolo-orm
+ owner_html_url: https://github.com/piccolo-orm
- name: langchain-serve
html_url: https://github.com/jina-ai/langchain-serve
- stars: 1615
+ stars: 1632
owner_login: jina-ai
owner_html_url: https://github.com/jina-ai
+- name: openapi-python-client
+ html_url: https://github.com/openapi-generators/openapi-python-client
+ stars: 1628
+ owner_login: openapi-generators
+ owner_html_url: https://github.com/openapi-generators
- name: termpair
html_url: https://github.com/cs01/termpair
- stars: 1613
+ stars: 1617
owner_login: cs01
owner_html_url: https://github.com/cs01
+- name: fastapi-cache
+ html_url: https://github.com/long2ice/fastapi-cache
+ stars: 1607
+ owner_login: long2ice
+ owner_html_url: https://github.com/long2ice
- name: coronavirus-tracker-api
html_url: https://github.com/ExpDev07/coronavirus-tracker-api
- stars: 1591
+ stars: 1580
owner_login: ExpDev07
owner_html_url: https://github.com/ExpDev07
-- name: piccolo
- html_url: https://github.com/piccolo-orm/piccolo
- stars: 1477
- owner_login: piccolo-orm
- owner_html_url: https://github.com/piccolo-orm
+- name: slowapi
+ html_url: https://github.com/laurentS/slowapi
+ stars: 1551
+ owner_login: laurentS
+ owner_html_url: https://github.com/laurentS
- name: fastapi-crudrouter
html_url: https://github.com/awtkns/fastapi-crudrouter
- stars: 1435
+ stars: 1522
owner_login: awtkns
owner_html_url: https://github.com/awtkns
-- name: fastapi-cache
- html_url: https://github.com/long2ice/fastapi-cache
- stars: 1412
- owner_login: long2ice
- owner_html_url: https://github.com/long2ice
-- name: openapi-python-client
- html_url: https://github.com/openapi-generators/openapi-python-client
- stars: 1398
- owner_login: openapi-generators
- owner_html_url: https://github.com/openapi-generators
+- name: vue-fastapi-admin
+ html_url: https://github.com/mizhexiaoxiao/vue-fastapi-admin
+ stars: 1505
+ owner_login: mizhexiaoxiao
+ owner_html_url: https://github.com/mizhexiaoxiao
- name: awesome-fastapi-projects
html_url: https://github.com/Kludex/awesome-fastapi-projects
- stars: 1386
+ stars: 1468
owner_login: Kludex
owner_html_url: https://github.com/Kludex
- name: awesome-python-resources
html_url: https://github.com/DjangoEx/awesome-python-resources
- stars: 1371
+ stars: 1403
owner_login: DjangoEx
owner_html_url: https://github.com/DjangoEx
-- name: budgetml
- html_url: https://github.com/ebhy/budgetml
- stars: 1342
- owner_login: ebhy
- owner_html_url: https://github.com/ebhy
-- name: slowapi
- html_url: https://github.com/laurentS/slowapi
- stars: 1289
- owner_login: laurentS
- owner_html_url: https://github.com/laurentS
- name: fastapi-pagination
html_url: https://github.com/uriyyo/fastapi-pagination
- stars: 1240
+ stars: 1396
owner_login: uriyyo
owner_html_url: https://github.com/uriyyo
+- name: FastAPI-boilerplate
+ html_url: https://github.com/benavlabs/FastAPI-boilerplate
+ stars: 1378
+ owner_login: benavlabs
+ owner_html_url: https://github.com/benavlabs
- name: fastapi-boilerplate
html_url: https://github.com/teamhide/fastapi-boilerplate
- stars: 1173
+ stars: 1373
owner_login: teamhide
owner_html_url: https://github.com/teamhide
-- name: fastapi-tutorial
- html_url: https://github.com/liaogx/fastapi-tutorial
- stars: 1162
- owner_login: liaogx
- owner_html_url: https://github.com/liaogx
+- name: bracket
+ html_url: https://github.com/evroon/bracket
+ stars: 1367
+ owner_login: evroon
+ owner_html_url: https://github.com/evroon
+- name: budgetml
+ html_url: https://github.com/ebhy/budgetml
+ stars: 1345
+ owner_login: ebhy
+ owner_html_url: https://github.com/ebhy
- name: fastapi-amis-admin
html_url: https://github.com/amisadmin/fastapi-amis-admin
- stars: 1118
+ stars: 1300
owner_login: amisadmin
owner_html_url: https://github.com/amisadmin
+- name: fastapi-tutorial
+ html_url: https://github.com/liaogx/fastapi-tutorial
+ stars: 1284
+ owner_login: liaogx
+ owner_html_url: https://github.com/liaogx
- name: fastapi-code-generator
html_url: https://github.com/koxudaxi/fastapi-code-generator
- stars: 1095
+ stars: 1232
owner_login: koxudaxi
owner_html_url: https://github.com/koxudaxi
+- name: fastcrud
+ html_url: https://github.com/benavlabs/fastcrud
+ stars: 1208
+ owner_login: benavlabs
+ owner_html_url: https://github.com/benavlabs
+- name: prometheus-fastapi-instrumentator
+ html_url: https://github.com/trallnag/prometheus-fastapi-instrumentator
+ stars: 1200
+ owner_login: trallnag
+ owner_html_url: https://github.com/trallnag
- name: bolt-python
html_url: https://github.com/slackapi/bolt-python
- stars: 1086
+ stars: 1197
owner_login: slackapi
owner_html_url: https://github.com/slackapi
-- name: odmantic
- html_url: https://github.com/art049/odmantic
- stars: 1085
- owner_login: art049
- owner_html_url: https://github.com/art049
-- name: langchain-extract
- html_url: https://github.com/langchain-ai/langchain-extract
- stars: 1068
- owner_login: langchain-ai
- owner_html_url: https://github.com/langchain-ai
+- name: bedrock-chat
+ html_url: https://github.com/aws-samples/bedrock-chat
+ stars: 1188
+ owner_login: aws-samples
+ owner_html_url: https://github.com/aws-samples
+- name: fastapi_best_architecture
+ html_url: https://github.com/fastapi-practices/fastapi_best_architecture
+ stars: 1178
+ owner_login: fastapi-practices
+ owner_html_url: https://github.com/fastapi-practices
- name: fastapi_production_template
html_url: https://github.com/zhanymkanov/fastapi_production_template
- stars: 1059
+ stars: 1173
owner_login: zhanymkanov
owner_html_url: https://github.com/zhanymkanov
+- name: langchain-extract
+ html_url: https://github.com/langchain-ai/langchain-extract
+ stars: 1148
+ owner_login: langchain-ai
+ owner_html_url: https://github.com/langchain-ai
- name: fastapi-alembic-sqlmodel-async
html_url: https://github.com/jonra1993/fastapi-alembic-sqlmodel-async
- stars: 1031
+ stars: 1134
owner_login: jonra1993
owner_html_url: https://github.com/jonra1993
-- name: prometheus-fastapi-instrumentator
- html_url: https://github.com/trallnag/prometheus-fastapi-instrumentator
- stars: 1013
- owner_login: trallnag
- owner_html_url: https://github.com/trallnag
+- name: odmantic
+ html_url: https://github.com/art049/odmantic
+ stars: 1122
+ owner_login: art049
+ owner_html_url: https://github.com/art049
+- name: restish
+ html_url: https://github.com/rest-sh/restish
+ stars: 1088
+ owner_login: rest-sh
+ owner_html_url: https://github.com/rest-sh
+- name: fastapi-scaf
+ html_url: https://github.com/atpuxiner/fastapi-scaf
+ stars: 1061
+ owner_login: atpuxiner
+ owner_html_url: https://github.com/atpuxiner
- name: runhouse
html_url: https://github.com/run-house/runhouse
- stars: 988
+ stars: 1041
owner_login: run-house
owner_html_url: https://github.com/run-house
+- name: fastapi-langgraph-agent-production-ready-template
+ html_url: https://github.com/wassim249/fastapi-langgraph-agent-production-ready-template
+ stars: 1037
+ owner_login: wassim249
+ owner_html_url: https://github.com/wassim249
+- name: autollm
+ html_url: https://github.com/viddexa/autollm
+ stars: 997
+ owner_login: viddexa
+ owner_html_url: https://github.com/viddexa
- name: lanarky
html_url: https://github.com/ajndkr/lanarky
- stars: 982
+ stars: 994
owner_login: ajndkr
owner_html_url: https://github.com/ajndkr
-- name: autollm
- html_url: https://github.com/viddexa/autollm
+- name: mcp-context-forge
+ html_url: https://github.com/IBM/mcp-context-forge
stars: 981
- owner_login: viddexa
- owner_html_url: https://github.com/viddexa
-- name: bedrock-claude-chat
- html_url: https://github.com/aws-samples/bedrock-claude-chat
- stars: 977
- owner_login: aws-samples
- owner_html_url: https://github.com/aws-samples
-- name: SurfSense
- html_url: https://github.com/MODSetter/SurfSense
- stars: 971
- owner_login: MODSetter
- owner_html_url: https://github.com/MODSetter
-- name: restish
- html_url: https://github.com/danielgtaylor/restish
- stars: 954
- owner_login: danielgtaylor
- owner_html_url: https://github.com/danielgtaylor
+ owner_login: IBM
+ owner_html_url: https://github.com/IBM
+- name: authx
+ html_url: https://github.com/yezz123/authx
+ stars: 967
+ owner_login: yezz123
+ owner_html_url: https://github.com/yezz123
- name: secure
html_url: https://github.com/TypeError/secure
- stars: 911
+ stars: 941
owner_login: TypeError
owner_html_url: https://github.com/TypeError
-- name: langcorn
- html_url: https://github.com/msoedov/langcorn
- stars: 909
- owner_login: msoedov
- owner_html_url: https://github.com/msoedov
+- name: flock
+ html_url: https://github.com/Onelevenvy/flock
+ stars: 937
+ owner_login: Onelevenvy
+ owner_html_url: https://github.com/Onelevenvy
- name: energy-forecasting
html_url: https://github.com/iusztinpaul/energy-forecasting
- stars: 884
+ stars: 934
owner_login: iusztinpaul
owner_html_url: https://github.com/iusztinpaul
-- name: vue-fastapi-admin
- html_url: https://github.com/mizhexiaoxiao/vue-fastapi-admin
- stars: 863
- owner_login: mizhexiaoxiao
- owner_html_url: https://github.com/mizhexiaoxiao
-- name: authx
- html_url: https://github.com/yezz123/authx
- stars: 850
- owner_login: yezz123
- owner_html_url: https://github.com/yezz123
+- name: langcorn
+ html_url: https://github.com/msoedov/langcorn
+ stars: 932
+ owner_login: msoedov
+ owner_html_url: https://github.com/msoedov
- name: titiler
html_url: https://github.com/developmentseed/titiler
- stars: 809
+ stars: 917
owner_login: developmentseed
owner_html_url: https://github.com/developmentseed
- name: marker-api
html_url: https://github.com/adithya-s-k/marker-api
- stars: 792
+ stars: 880
owner_login: adithya-s-k
owner_html_url: https://github.com/adithya-s-k
-- name: fastapi_best_architecture
- html_url: https://github.com/fastapi-practices/fastapi_best_architecture
- stars: 742
- owner_login: fastapi-practices
- owner_html_url: https://github.com/fastapi-practices
-- name: fastapi-mail
- html_url: https://github.com/sabuhish/fastapi-mail
- stars: 728
- owner_login: sabuhish
- owner_html_url: https://github.com/sabuhish
-- name: fastcrud
- html_url: https://github.com/igorbenav/fastcrud
- stars: 727
- owner_login: igorbenav
- owner_html_url: https://github.com/igorbenav
-- name: annotated-py-projects
- html_url: https://github.com/hhstore/annotated-py-projects
- stars: 722
- owner_login: hhstore
- owner_html_url: https://github.com/hhstore
-- name: FastAPI-boilerplate
- html_url: https://github.com/igorbenav/FastAPI-boilerplate
- stars: 716
- owner_login: igorbenav
- owner_html_url: https://github.com/igorbenav
-- name: lccn_predictor
- html_url: https://github.com/baoliay2008/lccn_predictor
- stars: 707
- owner_login: baoliay2008
- owner_html_url: https://github.com/baoliay2008
-- name: chatGPT-web
- html_url: https://github.com/mic1on/chatGPT-web
- stars: 706
- owner_login: mic1on
- owner_html_url: https://github.com/mic1on
+- name: httpdbg
+ html_url: https://github.com/cle-b/httpdbg
+ stars: 875
+ owner_login: cle-b
+ owner_html_url: https://github.com/cle-b
- name: fastapi-do-zero
html_url: https://github.com/dunossauro/fastapi-do-zero
- stars: 702
+ stars: 873
owner_login: dunossauro
owner_html_url: https://github.com/dunossauro
-- name: linbing
- html_url: https://github.com/taomujian/linbing
- stars: 699
- owner_login: taomujian
- owner_html_url: https://github.com/taomujian
- name: fastapi-observability
html_url: https://github.com/blueswen/fastapi-observability
- stars: 698
+ stars: 861
owner_login: blueswen
owner_html_url: https://github.com/blueswen
-- name: FastAPI-Backend-Template
- html_url: https://github.com/Aeternalis-Ingenium/FastAPI-Backend-Template
- stars: 682
- owner_login: Aeternalis-Ingenium
- owner_html_url: https://github.com/Aeternalis-Ingenium
-- name: learn-generative-ai
- html_url: https://github.com/panaverse/learn-generative-ai
- stars: 673
- owner_login: panaverse
- owner_html_url: https://github.com/panaverse
-- name: fastapi-jwt-auth
- html_url: https://github.com/IndominusByte/fastapi-jwt-auth
- stars: 668
- owner_login: IndominusByte
- owner_html_url: https://github.com/IndominusByte
-- name: pity
- html_url: https://github.com/wuranxu/pity
- stars: 660
- owner_login: wuranxu
- owner_html_url: https://github.com/wuranxu
-- name: starlette-admin
- html_url: https://github.com/jowilf/starlette-admin
- stars: 653
- owner_login: jowilf
- owner_html_url: https://github.com/jowilf
-- name: fastapi_login
- html_url: https://github.com/MushroomMaula/fastapi_login
- stars: 650
- owner_login: MushroomMaula
- owner_html_url: https://github.com/MushroomMaula
+- name: ludic
+ html_url: https://github.com/getludic/ludic
+ stars: 854
+ owner_login: getludic
+ owner_html_url: https://github.com/getludic
+- name: aktools
+ html_url: https://github.com/akfamily/aktools
+ stars: 839
+ owner_login: akfamily
+ owner_html_url: https://github.com/akfamily
+- name: RuoYi-Vue3-FastAPI
+ html_url: https://github.com/insistence/RuoYi-Vue3-FastAPI
+ stars: 836
+ owner_login: insistence
+ owner_html_url: https://github.com/insistence
diff --git a/docs/en/data/translation_reviewers.yml b/docs/en/data/translation_reviewers.yml
index 6cc09a7c1..8eaf93d9c 100644
--- a/docs/en/data/translation_reviewers.yml
+++ b/docs/en/data/translation_reviewers.yml
@@ -5,12 +5,17 @@ s111d:
url: https://github.com/s111d
Xewus:
login: Xewus
- count: 139
+ count: 140
avatarUrl: https://avatars.githubusercontent.com/u/85196001?u=f8e2dc7e5104f109cef944af79050ea8d1b8f914&v=4
url: https://github.com/Xewus
+sodaMelon:
+ login: sodaMelon
+ count: 127
+ avatarUrl: https://avatars.githubusercontent.com/u/66295123?u=be939db90f1119efee9e6110cc05066ff1f40f00&v=4
+ url: https://github.com/sodaMelon
ceb10n:
login: ceb10n
- count: 108
+ count: 116
avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4
url: https://github.com/ceb10n
tokusumi:
@@ -25,24 +30,24 @@ hasansezertasan:
url: https://github.com/hasansezertasan
hard-coders:
login: hard-coders
- count: 92
+ count: 93
avatarUrl: https://avatars.githubusercontent.com/u/9651103?u=95db33927bbff1ed1c07efddeb97ac2ff33068ed&v=4
url: https://github.com/hard-coders
+alv2017:
+ login: alv2017
+ count: 88
+ avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4
+ url: https://github.com/alv2017
+nazarepiedady:
+ login: nazarepiedady
+ count: 86
+ avatarUrl: https://avatars.githubusercontent.com/u/31008635?u=f69ddc4ea8bda3bdfac7aa0e2ea38de282e6ee2d&v=4
+ url: https://github.com/nazarepiedady
AlertRED:
login: AlertRED
count: 81
avatarUrl: https://avatars.githubusercontent.com/u/15695000?u=f5a4944c6df443030409c88da7d7fa0b7ead985c&v=4
url: https://github.com/AlertRED
-sodaMelon:
- login: sodaMelon
- count: 81
- avatarUrl: https://avatars.githubusercontent.com/u/66295123?u=be939db90f1119efee9e6110cc05066ff1f40f00&v=4
- url: https://github.com/sodaMelon
-nazarepiedady:
- login: nazarepiedady
- count: 78
- avatarUrl: https://avatars.githubusercontent.com/u/31008635?u=8dc25777dc9cb51fb0dbba2f137988953d330b78&v=4
- url: https://github.com/nazarepiedady
Alexandrhub:
login: Alexandrhub
count: 68
@@ -55,14 +60,19 @@ waynerv:
url: https://github.com/waynerv
cassiobotaro:
login: cassiobotaro
- count: 61
+ count: 62
avatarUrl: https://avatars.githubusercontent.com/u/3127847?u=a08022b191ddbd0a6159b2981d9d878b6d5bb71f&v=4
url: https://github.com/cassiobotaro
mattwang44:
login: mattwang44
- count: 58
+ count: 59
avatarUrl: https://avatars.githubusercontent.com/u/24987826?u=58e37fb3927b9124b458945ac4c97aa0f1062d85&v=4
url: https://github.com/mattwang44
+tiangolo:
+ login: tiangolo
+ count: 53
+ avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
+ url: https://github.com/tiangolo
Laineyzhang55:
login: Laineyzhang55
count: 48
@@ -78,16 +88,26 @@ komtaki:
count: 45
avatarUrl: https://avatars.githubusercontent.com/u/39375566?u=260ad6b1a4b34c07dbfa728da5e586f16f6d1824&v=4
url: https://github.com/komtaki
+rostik1410:
+ login: rostik1410
+ count: 42
+ avatarUrl: https://avatars.githubusercontent.com/u/11443899?u=e26a635c2ba220467b308a326a579b8ccf4a8701&v=4
+ url: https://github.com/rostik1410
+svlandeg:
+ login: svlandeg
+ count: 42
+ avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4
+ url: https://github.com/svlandeg
alperiox:
login: alperiox
count: 42
avatarUrl: https://avatars.githubusercontent.com/u/34214152?u=2c5acad3461d4dbc2d48371ba86cac56ae9b25cc&v=4
url: https://github.com/alperiox
-tiangolo:
- login: tiangolo
- count: 40
- avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
- url: https://github.com/tiangolo
+Rishat-F:
+ login: Rishat-F
+ count: 42
+ avatarUrl: https://avatars.githubusercontent.com/u/66554797?v=4
+ url: https://github.com/Rishat-F
Winand:
login: Winand
count: 40
@@ -103,6 +123,11 @@ JavierSanchezCastro:
count: 38
avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4
url: https://github.com/JavierSanchezCastro
+alejsdev:
+ login: alejsdev
+ count: 37
+ avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=638c65283ac9e9e2c3a0f9d1e3370db4b8a2c58d&v=4
+ url: https://github.com/alejsdev
stlucasgarcia:
login: stlucasgarcia
count: 36
@@ -113,11 +138,21 @@ SwftAlpc:
count: 36
avatarUrl: https://avatars.githubusercontent.com/u/52768429?u=6a3aa15277406520ad37f6236e89466ed44bc5b8&v=4
url: https://github.com/SwftAlpc
+timothy-jeong:
+ login: timothy-jeong
+ count: 36
+ avatarUrl: https://avatars.githubusercontent.com/u/53824764?u=db3d0cea2f5fab64d810113c5039a369699a2774&v=4
+ url: https://github.com/timothy-jeong
nilslindemann:
login: nilslindemann
count: 35
avatarUrl: https://avatars.githubusercontent.com/u/6892179?u=1dca6a22195d6cd1ab20737c0e19a4c55d639472&v=4
url: https://github.com/nilslindemann
+mezgoodle:
+ login: mezgoodle
+ count: 35
+ avatarUrl: https://avatars.githubusercontent.com/u/41520940?u=4a9c765af688389d54296845d18b8f6cd6ddf09a&v=4
+ url: https://github.com/mezgoodle
rjNemo:
login: rjNemo
count: 34
@@ -138,26 +173,21 @@ romashevchenko:
count: 32
avatarUrl: https://avatars.githubusercontent.com/u/132477732?v=4
url: https://github.com/romashevchenko
-wdh99:
- login: wdh99
- count: 31
- avatarUrl: https://avatars.githubusercontent.com/u/108172295?u=8a8fb95d5afe3e0fa33257b2aecae88d436249eb&v=4
- url: https://github.com/wdh99
-alv2017:
- login: alv2017
- count: 31
- avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4
- url: https://github.com/alv2017
LorhanSohaky:
login: LorhanSohaky
count: 30
avatarUrl: https://avatars.githubusercontent.com/u/16273730?u=095b66f243a2cd6a0aadba9a095009f8aaf18393&v=4
url: https://github.com/LorhanSohaky
-alejsdev:
- login: alejsdev
+YuriiMotov:
+ login: YuriiMotov
count: 30
- avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=356f39ff3f0211c720b06d3dbb060e98884085e3&v=4
- url: https://github.com/alejsdev
+ avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=b9b13d598dddfab529a52d264df80a900bfe7060&v=4
+ url: https://github.com/YuriiMotov
+Vincy1230:
+ login: Vincy1230
+ count: 30
+ avatarUrl: https://avatars.githubusercontent.com/u/81342412?u=ab5e256a4077a4a91f3f9cd2115ba80780454cbe&v=4
+ url: https://github.com/Vincy1230
black-redoc:
login: black-redoc
count: 29
@@ -181,7 +211,7 @@ dedkot01:
hsuanchi:
login: hsuanchi
count: 28
- avatarUrl: https://avatars.githubusercontent.com/u/24913710?u=0b094ae292292fee093818e37ceb645c114d2bff&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/24913710?u=7d25a398e478b6e63503bf6f26c54efa9e0da07b&v=4
url: https://github.com/hsuanchi
dpinezich:
login: dpinezich
@@ -208,11 +238,6 @@ junah201:
count: 26
avatarUrl: https://avatars.githubusercontent.com/u/75025529?u=2451c256e888fa2a06bcfc0646d09b87ddb6a945&v=4
url: https://github.com/junah201
-Vincy1230:
- login: Vincy1230
- count: 26
- avatarUrl: https://avatars.githubusercontent.com/u/81342412?u=ab5e256a4077a4a91f3f9cd2115ba80780454cbe&v=4
- url: https://github.com/Vincy1230
zy7y:
login: zy7y
count: 25
@@ -228,6 +253,11 @@ Aruelius:
count: 24
avatarUrl: https://avatars.githubusercontent.com/u/25380989?u=574f8cfcda3ea77a3f81884f6b26a97068e36a9d&v=4
url: https://github.com/Aruelius
+wisderfin:
+ login: wisderfin
+ count: 24
+ avatarUrl: https://avatars.githubusercontent.com/u/77553770?u=9a23740d520d65dc0051cdc1ecd87f31cb900313&v=4
+ url: https://github.com/wisderfin
OzgunCaglarArslan:
login: OzgunCaglarArslan
count: 24
@@ -243,16 +273,11 @@ axel584:
count: 23
avatarUrl: https://avatars.githubusercontent.com/u/1334088?u=9667041f5b15dc002b6f9665fda8c0412933ac04&v=4
url: https://github.com/axel584
-wisderfin:
- login: wisderfin
+DianaTrufanova:
+ login: DianaTrufanova
count: 23
- avatarUrl: https://avatars.githubusercontent.com/u/77553770?u=94478d3e1ef7d36d70479c5bd35d8de28b071c10&v=4
- url: https://github.com/wisderfin
-rostik1410:
- login: rostik1410
- count: 22
- avatarUrl: https://avatars.githubusercontent.com/u/11443899?u=e26a635c2ba220467b308a326a579b8ccf4a8701&v=4
- url: https://github.com/rostik1410
+ avatarUrl: https://avatars.githubusercontent.com/u/119067607?u=1cd55f841b68b4a187fa6d06a7dafa5f070195aa&v=4
+ url: https://github.com/DianaTrufanova
AGolicyn:
login: AGolicyn
count: 21
@@ -266,7 +291,7 @@ Attsun1031:
ycd:
login: ycd
count: 20
- avatarUrl: https://avatars.githubusercontent.com/u/62724709?u=29682e4b6ac7d5293742ccf818188394b9a82972&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/62724709?u=f1e7bae394a315da950912c92dc861a8eaf95d4c&v=4
url: https://github.com/ycd
delhi09:
login: delhi09
@@ -283,26 +308,21 @@ DevDae:
count: 20
avatarUrl: https://avatars.githubusercontent.com/u/87962045?u=08e10fa516e844934f4b3fc7c38b33c61697e4a1&v=4
url: https://github.com/DevDae
-svlandeg:
- login: svlandeg
- count: 20
- avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4
- url: https://github.com/svlandeg
sattosan:
login: sattosan
count: 19
avatarUrl: https://avatars.githubusercontent.com/u/20574756?u=b0d8474d2938189c6954423ae8d81d91013f80a8&v=4
url: https://github.com/sattosan
+yes0ng:
+ login: yes0ng
+ count: 19
+ avatarUrl: https://avatars.githubusercontent.com/u/25501794?u=3aed18b0d491e0220a167a1e9e58bea3638c6707&v=4
+ url: https://github.com/yes0ng
ComicShrimp:
login: ComicShrimp
count: 18
avatarUrl: https://avatars.githubusercontent.com/u/43503750?u=d2fbf412e7730183ce91686ca48d4147e1b7dc74&v=4
url: https://github.com/ComicShrimp
-mezgoodle:
- login: mezgoodle
- count: 18
- avatarUrl: https://avatars.githubusercontent.com/u/41520940?u=e871bc26734eb2436d98c19c3fb57a4773e13c24&v=4
- url: https://github.com/mezgoodle
simatheone:
login: simatheone
count: 18
@@ -313,6 +333,16 @@ ivan-abc:
count: 18
avatarUrl: https://avatars.githubusercontent.com/u/36765187?u=c6e0ba571c1ccb6db9d94e62e4b8b5eda811a870&v=4
url: https://github.com/ivan-abc
+Limsunoh:
+ login: Limsunoh
+ count: 18
+ avatarUrl: https://avatars.githubusercontent.com/u/90311848?u=f456e0c5709fd50c8cd2898b551558eda14e5f21&v=4
+ url: https://github.com/Limsunoh
+SofiiaTrufanova:
+ login: SofiiaTrufanova
+ count: 18
+ avatarUrl: https://avatars.githubusercontent.com/u/63260929?u=483e0b64fabc76343b3be39b7e1dcb930a95e1bb&v=4
+ url: https://github.com/SofiiaTrufanova
bezaca:
login: bezaca
count: 17
@@ -338,11 +368,6 @@ jeison-araya:
count: 17
avatarUrl: https://avatars.githubusercontent.com/u/57369279?u=17001e68af7d8e5b8c343e5e9df4050f419998d5&v=4
url: https://github.com/jeison-araya
-Limsunoh:
- login: Limsunoh
- count: 17
- avatarUrl: https://avatars.githubusercontent.com/u/90311848?u=f456e0c5709fd50c8cd2898b551558eda14e5f21&v=4
- url: https://github.com/Limsunoh
yanever:
login: yanever
count: 16
@@ -353,21 +378,21 @@ mastizada:
count: 16
avatarUrl: https://avatars.githubusercontent.com/u/1975818?u=0751a06d7271c8bf17cb73b1b845644ab4d2c6dc&v=4
url: https://github.com/mastizada
+Joao-Pedro-P-Holanda:
+ login: Joao-Pedro-P-Holanda
+ count: 16
+ avatarUrl: https://avatars.githubusercontent.com/u/110267046?u=331bd016326dac4cf3df4848f6db2dbbf8b5f978&v=4
+ url: https://github.com/Joao-Pedro-P-Holanda
JaeHyuckSa:
login: JaeHyuckSa
count: 16
- avatarUrl: https://avatars.githubusercontent.com/u/104830931?v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/104830931?u=6e352201714a05154e5d0ccf91b4715a951c622e&v=4
url: https://github.com/JaeHyuckSa
Jedore:
login: Jedore
count: 15
avatarUrl: https://avatars.githubusercontent.com/u/17944025?u=81d503e1c800eb666b3861ca47a3a773bbc3f539&v=4
url: https://github.com/Jedore
-Joao-Pedro-P-Holanda:
- login: Joao-Pedro-P-Holanda
- count: 15
- avatarUrl: https://avatars.githubusercontent.com/u/110267046?u=331bd016326dac4cf3df4848f6db2dbbf8b5f978&v=4
- url: https://github.com/Joao-Pedro-P-Holanda
kim-sangah:
login: kim-sangah
count: 15
@@ -383,11 +408,6 @@ dukkee:
count: 14
avatarUrl: https://avatars.githubusercontent.com/u/36825394?u=ccfd86e6a4f2d093dad6f7544cc875af67fa2df8&v=4
url: https://github.com/dukkee
-mkdir700:
- login: mkdir700
- count: 14
- avatarUrl: https://avatars.githubusercontent.com/u/56359329?u=0ba13427420e7f6e4c83947736de247326f2c292&v=4
- url: https://github.com/mkdir700
BORA040126:
login: BORA040126
count: 14
@@ -396,7 +416,7 @@ BORA040126:
mattkoehne:
login: mattkoehne
count: 14
- avatarUrl: https://avatars.githubusercontent.com/u/80362153?u=6e1439582715693407b86182eb66263bb578a761&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/80362153?v=4
url: https://github.com/mattkoehne
jovicon:
login: jovicon
@@ -438,16 +458,16 @@ oandersonmagalhaes:
count: 12
avatarUrl: https://avatars.githubusercontent.com/u/83456692?v=4
url: https://github.com/oandersonmagalhaes
+mkdir700:
+ login: mkdir700
+ count: 12
+ avatarUrl: https://avatars.githubusercontent.com/u/56359329?u=3d6ea8714f5000829b60dcf7b13a75b1e73aaf47&v=4
+ url: https://github.com/mkdir700
batlopes:
login: batlopes
count: 12
avatarUrl: https://avatars.githubusercontent.com/u/33462923?u=0fb3d7acb316764616f11e4947faf080e49ad8d9&v=4
url: https://github.com/batlopes
-Lenclove:
- login: Lenclove
- count: 12
- avatarUrl: https://avatars.githubusercontent.com/u/32355298?u=d0065e01650c63c2b2413f42d983634b2ea85481&v=4
- url: https://github.com/Lenclove
joonas-yoon:
login: joonas-yoon
count: 12
@@ -468,6 +488,11 @@ andersonrocha0:
count: 12
avatarUrl: https://avatars.githubusercontent.com/u/22346169?u=93a1359c8c5461d894802c0cc65bcd09217e7a02&v=4
url: https://github.com/andersonrocha0
+gitgernit:
+ login: gitgernit
+ count: 12
+ avatarUrl: https://avatars.githubusercontent.com/u/129539613?u=d04f10143ab32c93f563ea14bf242d1d2bc991b0&v=4
+ url: https://github.com/gitgernit
kwang1215:
login: kwang1215
count: 12
@@ -493,6 +518,11 @@ glsglsgls:
count: 11
avatarUrl: https://avatars.githubusercontent.com/u/76133879?v=4
url: https://github.com/glsglsgls
+k94-ishi:
+ login: k94-ishi
+ count: 11
+ avatarUrl: https://avatars.githubusercontent.com/u/32672580?u=bc7c5c07af0656be9fe4f1784a444af8d81ded89&v=4
+ url: https://github.com/k94-ishi
codespearhead:
login: codespearhead
count: 11
@@ -508,11 +538,21 @@ Lufa1u:
count: 11
avatarUrl: https://avatars.githubusercontent.com/u/112495876?u=087658920ed9e74311597bdd921d8d2de939d276&v=4
url: https://github.com/Lufa1u
+waketzheng:
+ login: waketzheng
+ count: 11
+ avatarUrl: https://avatars.githubusercontent.com/u/35413830?u=df19e4fd5bb928e7d086e053ef26a46aad23bf84&v=4
+ url: https://github.com/waketzheng
KNChiu:
login: KNChiu
count: 11
avatarUrl: https://avatars.githubusercontent.com/u/36751646?v=4
url: https://github.com/KNChiu
+maru0123-2004:
+ login: maru0123-2004
+ count: 11
+ avatarUrl: https://avatars.githubusercontent.com/u/43961566?u=16ed8603a4d6a4665cb6c53a7aece6f31379b769&v=4
+ url: https://github.com/maru0123-2004
mariacamilagl:
login: mariacamilagl
count: 10
@@ -538,6 +578,11 @@ RobotToI:
count: 10
avatarUrl: https://avatars.githubusercontent.com/u/44951382?u=e41dbc19191ce7abed86694b1a44ea0523e1c60e&v=4
url: https://github.com/RobotToI
+vitumenezes:
+ login: vitumenezes
+ count: 10
+ avatarUrl: https://avatars.githubusercontent.com/u/9680878?u=05fd25cfafdc09382bf8907c37293a696c205754&v=4
+ url: https://github.com/vitumenezes
fcrozetta:
login: fcrozetta
count: 10
@@ -563,16 +608,16 @@ nick-cjyx9:
count: 10
avatarUrl: https://avatars.githubusercontent.com/u/119087246?u=c35aab03f082430be8a1edd80f5625b44819a0d8&v=4
url: https://github.com/nick-cjyx9
-waketzheng:
- login: waketzheng
- count: 10
- avatarUrl: https://avatars.githubusercontent.com/u/35413830?u=df19e4fd5bb928e7d086e053ef26a46aad23bf84&v=4
- url: https://github.com/waketzheng
lucasbalieiro:
login: lucasbalieiro
count: 10
- avatarUrl: https://avatars.githubusercontent.com/u/37416577?u=5a395a69384e7fa0f9840ea32ef963d3f1cd9da4&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/37416577?u=dad91601ee4f40458d691774ec439aff308344d7&v=4
url: https://github.com/lucasbalieiro
+Zhongheng-Cheng:
+ login: Zhongheng-Cheng
+ count: 10
+ avatarUrl: https://avatars.githubusercontent.com/u/95612344?u=a0f7730a3cc7486827965e01a119ad610bda4b0a&v=4
+ url: https://github.com/Zhongheng-Cheng
RunningIkkyu:
login: RunningIkkyu
count: 9
@@ -586,18 +631,18 @@ JulianMaurin:
JeongHyeongKim:
login: JeongHyeongKim
count: 9
- avatarUrl: https://avatars.githubusercontent.com/u/26577800?u=fe653349051c0acf62cd984e74c4ff60ca8d2cb6&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/26577800?u=77f060f4686f32c248907b81b16ee2b3177ca44c&v=4
url: https://github.com/JeongHyeongKim
arthurio:
login: arthurio
count: 9
avatarUrl: https://avatars.githubusercontent.com/u/950449?u=76b997138273ce5e1990b971c4f27c9aff979fd5&v=4
url: https://github.com/arthurio
-mahone3297:
- login: mahone3297
+Lenclove:
+ login: Lenclove
count: 9
- avatarUrl: https://avatars.githubusercontent.com/u/1701379?u=20588ff0e456d13e8017333eb237595d11410234&v=4
- url: https://github.com/mahone3297
+ avatarUrl: https://avatars.githubusercontent.com/u/32355298?u=d0065e01650c63c2b2413f42d983634b2ea85481&v=4
+ url: https://github.com/Lenclove
eVery1337:
login: eVery1337
count: 9
@@ -613,6 +658,11 @@ riroan:
count: 9
avatarUrl: https://avatars.githubusercontent.com/u/33053284?u=2d18e3771506ee874b66d6aa2b3b1107fd95c38f&v=4
url: https://github.com/riroan
+MinLee0210:
+ login: MinLee0210
+ count: 9
+ avatarUrl: https://avatars.githubusercontent.com/u/57653278?u=8ca05a7efbc76048183da00da87d148b755a3ba8&v=4
+ url: https://github.com/MinLee0210
yodai-yodai:
login: yodai-yodai
count: 9
@@ -626,13 +676,13 @@ marcelomarkus:
JoaoGustavoRogel:
login: JoaoGustavoRogel
count: 9
- avatarUrl: https://avatars.githubusercontent.com/u/29525510?u=1dd3096c6c2be2576fd5e818b1be15b2c9768aa5&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/29525510?u=a0a91251f5e43e132608d55d28ccb8645c5ea405&v=4
url: https://github.com/JoaoGustavoRogel
-Zhongheng-Cheng:
- login: Zhongheng-Cheng
+Yarous:
+ login: Yarous
count: 9
- avatarUrl: https://avatars.githubusercontent.com/u/95612344?u=a0f7730a3cc7486827965e01a119ad610bda4b0a&v=4
- url: https://github.com/Zhongheng-Cheng
+ avatarUrl: https://avatars.githubusercontent.com/u/61277193?u=5b462347458a373b2d599c6f416d2b75eddbffad&v=4
+ url: https://github.com/Yarous
dimaqq:
login: dimaqq
count: 8
@@ -648,11 +698,6 @@ bnzone:
count: 8
avatarUrl: https://avatars.githubusercontent.com/u/39371503?u=c16f00c41d88479fa2d57b0d7d233b758eacce2d&v=4
url: https://github.com/bnzone
-ChuyuChoyeon:
- login: ChuyuChoyeon
- count: 8
- avatarUrl: https://avatars.githubusercontent.com/u/129537877?u=f0c76f3327817a8b86b422d62e04a34bf2827f2b&v=4
- url: https://github.com/ChuyuChoyeon
shamosishen:
login: shamosishen
count: 8
@@ -663,6 +708,11 @@ mertssmnoglu:
count: 8
avatarUrl: https://avatars.githubusercontent.com/u/61623638?u=59dd885b68ff1832f9ab3b4a4446896358c23442&v=4
url: https://github.com/mertssmnoglu
+mahone3297:
+ login: mahone3297
+ count: 8
+ avatarUrl: https://avatars.githubusercontent.com/u/1701379?u=20588ff0e456d13e8017333eb237595d11410234&v=4
+ url: https://github.com/mahone3297
KimJoonSeo:
login: KimJoonSeo
count: 8
@@ -673,11 +723,16 @@ camigomezdev:
count: 8
avatarUrl: https://avatars.githubusercontent.com/u/16061815?u=25b5ebc042fff53fa03dc107ded10e36b1b7a5b9&v=4
url: https://github.com/camigomezdev
-gitgernit:
- login: gitgernit
+minaton-ru:
+ login: minaton-ru
count: 8
- avatarUrl: https://avatars.githubusercontent.com/u/129539613?u=d04f10143ab32c93f563ea14bf242d1d2bc991b0&v=4
- url: https://github.com/gitgernit
+ avatarUrl: https://avatars.githubusercontent.com/u/53541518?u=67336ca11a85493f75031508aade588dad3b9910&v=4
+ url: https://github.com/minaton-ru
+sungchan1:
+ login: sungchan1
+ count: 8
+ avatarUrl: https://avatars.githubusercontent.com/u/28076127?u=a816d86ef3e60450a7225f128caf9a394c9320f9&v=4
+ url: https://github.com/sungchan1
Serrones:
login: Serrones
count: 7
@@ -698,11 +753,6 @@ anthonycepeda:
count: 7
avatarUrl: https://avatars.githubusercontent.com/u/72019805?u=60bdf46240cff8fca482ff0fc07d963fd5e1a27c&v=4
url: https://github.com/anthonycepeda
-vitumenezes:
- login: vitumenezes
- count: 7
- avatarUrl: https://avatars.githubusercontent.com/u/9680878?u=e7c6865aec49c3c94b8c8edc1198d1eac3e50b26&v=4
- url: https://github.com/vitumenezes
fabioueno:
login: fabioueno
count: 7
@@ -728,10 +778,20 @@ d2a-raudenaerde:
count: 7
avatarUrl: https://avatars.githubusercontent.com/u/5213150?v=4
url: https://github.com/d2a-raudenaerde
+valentinDruzhinin:
+ login: valentinDruzhinin
+ count: 7
+ avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4
+ url: https://github.com/valentinDruzhinin
+Zerohertz:
+ login: Zerohertz
+ count: 7
+ avatarUrl: https://avatars.githubusercontent.com/u/42334717?u=5ebf4d33e73b1ad373154f6cdee44f7cab4d05ba&v=4
+ url: https://github.com/Zerohertz
deniscapeto:
login: deniscapeto
count: 6
- avatarUrl: https://avatars.githubusercontent.com/u/12864353?u=dbc20c5c1171feab5df4db46488b675d53cb5b07&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/12864353?u=20c5b2300b264a585a8381acf3cef44bcfcc1ead&v=4
url: https://github.com/deniscapeto
bsab:
login: bsab
@@ -803,11 +863,6 @@ Kirilex:
count: 6
avatarUrl: https://avatars.githubusercontent.com/u/100281552?v=4
url: https://github.com/Kirilex
-Mordson:
- login: Mordson
- count: 6
- avatarUrl: https://avatars.githubusercontent.com/u/39025897?u=b94ea96ef35bbe43bc85359cfb31d28ac16d470c&v=4
- url: https://github.com/Mordson
arunppsg:
login: arunppsg
count: 6
@@ -818,11 +873,6 @@ dimastbk:
count: 6
avatarUrl: https://avatars.githubusercontent.com/u/3132181?u=66587398d43466a1dc75c238df5f048e0afc77ed&v=4
url: https://github.com/dimastbk
-lordqyxz:
- login: lordqyxz
- count: 6
- avatarUrl: https://avatars.githubusercontent.com/u/31722468?u=974553c0ba53526d9be7e9876544283291be3b0d&v=4
- url: https://github.com/lordqyxz
dudyaosuplayer:
login: dudyaosuplayer
count: 6
@@ -838,6 +888,11 @@ bankofsardine:
count: 6
avatarUrl: https://avatars.githubusercontent.com/u/44944207?u=0368e1b698ffab6bf29e202f9fd2dddd352429f1&v=4
url: https://github.com/bankofsardine
+Rekl0w:
+ login: Rekl0w
+ count: 6
+ avatarUrl: https://avatars.githubusercontent.com/u/91488737?u=3b62b04a3e6699eab9b1eea4e88c09a39b753a17&v=4
+ url: https://github.com/Rekl0w
rsip22:
login: rsip22
count: 5
@@ -851,7 +906,7 @@ jessicapaz:
mohsen-mahmoodi:
login: mohsen-mahmoodi
count: 5
- avatarUrl: https://avatars.githubusercontent.com/u/2872586?u=9274b3b13d8a992dba29b162fee48473a0fa142d&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/2872586?u=3a9fc1aa16a3a0ab93a1f8550de82a940592857d&v=4
url: https://github.com/mohsen-mahmoodi
jeesang7:
login: jeesang7
@@ -866,7 +921,7 @@ TemaSpb:
BugLight:
login: BugLight
count: 5
- avatarUrl: https://avatars.githubusercontent.com/u/13618366?u=57572e544e40c2a491db5bf7255bd24886d2cb09&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/13618366?u=7d733749f80e5f7e66a434cf42aedcfc60340f43&v=4
url: https://github.com/BugLight
0x4Dark:
login: 0x4Dark
@@ -881,13 +936,18 @@ Wuerike:
jvmazagao:
login: jvmazagao
count: 5
- avatarUrl: https://avatars.githubusercontent.com/u/22477816?u=f3b2d503b53e6ec8c808f0601b756a063a07f06e&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/22477816?u=2b57addf5830906bf6ae5f25cd4c8c2fa5c2d68e&v=4
url: https://github.com/jvmazagao
cun3yt:
login: cun3yt
count: 5
- avatarUrl: https://avatars.githubusercontent.com/u/24409240?u=39f651cdcc4991fb9fef5bbd9e9503db2174ac13&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/24409240?u=06abfd77786db859b0602d5369d2ae18c932c17c&v=4
url: https://github.com/cun3yt
+Mordson:
+ login: Mordson
+ count: 5
+ avatarUrl: https://avatars.githubusercontent.com/u/39025897?u=b94ea96ef35bbe43bc85359cfb31d28ac16d470c&v=4
+ url: https://github.com/Mordson
aminkhani:
login: aminkhani
count: 5
@@ -908,10 +968,15 @@ Chushine:
count: 5
avatarUrl: https://avatars.githubusercontent.com/u/135534400?v=4
url: https://github.com/Chushine
+ChuyuChoyeon:
+ login: ChuyuChoyeon
+ count: 5
+ avatarUrl: https://avatars.githubusercontent.com/u/129537877?u=f0c76f3327817a8b86b422d62e04a34bf2827f2b&v=4
+ url: https://github.com/ChuyuChoyeon
frwl404:
login: frwl404
count: 5
- avatarUrl: https://avatars.githubusercontent.com/u/42642656?u=572a5a33762e07eaa6ebd58d9d773abdb1de41c3&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/42642656?u=8395a3d991d9fac86901277d76f0f70857b56ec5&v=4
url: https://github.com/frwl404
esrefzeki:
login: esrefzeki
@@ -953,11 +1018,16 @@ devluisrodrigues:
count: 5
avatarUrl: https://avatars.githubusercontent.com/u/103431660?u=d9674a3249edc4601d2c712cdebf899918503c3a&v=4
url: https://github.com/devluisrodrigues
-timothy-jeong:
- login: timothy-jeong
+11kkw:
+ login: 11kkw
count: 5
- avatarUrl: https://avatars.githubusercontent.com/u/53824764?u=659311b6f6aeb0fbb8b527723fd4c83642f04327&v=4
- url: https://github.com/timothy-jeong
+ avatarUrl: https://avatars.githubusercontent.com/u/21125286?v=4
+ url: https://github.com/11kkw
+soroushgh1:
+ login: soroushgh1
+ count: 5
+ avatarUrl: https://avatars.githubusercontent.com/u/178516095?u=5e26f6a5f66cdb32d7b56e6ab362bf18ba7858b9&v=4
+ url: https://github.com/soroushgh1
lpdswing:
login: lpdswing
count: 4
@@ -971,7 +1041,7 @@ SepehrRasouli:
Zxilly:
login: Zxilly
count: 4
- avatarUrl: https://avatars.githubusercontent.com/u/31370133?u=122e23d6e974614736be606e4ea816f45e7745f8&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/31370133?u=c5359b8d9d80a7cdc23d5295d179ed90174996c8&v=4
url: https://github.com/Zxilly
eavv:
login: eavv
@@ -988,6 +1058,11 @@ FelipeSilva93:
count: 4
avatarUrl: https://avatars.githubusercontent.com/u/66804965?u=e7cb4b580e46f2e04ecb4cd4d7a12acdddd3c6c1&v=4
url: https://github.com/FelipeSilva93
+peacekimjapan:
+ login: peacekimjapan
+ count: 4
+ avatarUrl: https://avatars.githubusercontent.com/u/33534175?u=e4219bcebc3773a7068cc34c3eb268ef77cec31b&v=4
+ url: https://github.com/peacekimjapan
bas-baskara:
login: bas-baskara
count: 4
@@ -1011,18 +1086,23 @@ personage-hub:
aminalaee:
login: aminalaee
count: 4
- avatarUrl: https://avatars.githubusercontent.com/u/19784933?u=2f45a312b73e7fb29f3b6f8676e5be6f7220da25&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/19784933?v=4
url: https://github.com/aminalaee
erfan-rfmhr:
login: erfan-rfmhr
count: 4
- avatarUrl: https://avatars.githubusercontent.com/u/98986056?u=6c4f9218fe5bb04780dd92bfced360c55e2009f0&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/98986056?u=0acda1ff1df0989f3f3eb79977baa35da4cb6c8c&v=4
url: https://github.com/erfan-rfmhr
Scorpionchiques:
login: Scorpionchiques
count: 4
avatarUrl: https://avatars.githubusercontent.com/u/15703294?v=4
url: https://github.com/Scorpionchiques
+lordqyxz:
+ login: lordqyxz
+ count: 4
+ avatarUrl: https://avatars.githubusercontent.com/u/31722468?u=974553c0ba53526d9be7e9876544283291be3b0d&v=4
+ url: https://github.com/lordqyxz
heysaeid:
login: heysaeid
count: 4
@@ -1053,6 +1133,11 @@ matiasbertani:
count: 4
avatarUrl: https://avatars.githubusercontent.com/u/65260383?u=d5edd86a6e2ab4fb1aab7751931fe045a963afd7&v=4
url: https://github.com/matiasbertani
+thiennc254:
+ login: thiennc254
+ count: 4
+ avatarUrl: https://avatars.githubusercontent.com/u/97406628?u=1b2860679694b9a552764d0fa81dbd7a016322ec&v=4
+ url: https://github.com/thiennc254
javillegasna:
login: javillegasna
count: 4
@@ -1063,6 +1148,26 @@ javillegasna:
count: 4
avatarUrl: https://avatars.githubusercontent.com/u/174453744?v=4
url: https://github.com/9zimin9
+ilhamfadillah:
+ login: ilhamfadillah
+ count: 4
+ avatarUrl: https://avatars.githubusercontent.com/u/20577838?u=c56192cf99b55affcaad408b240259c62e633450&v=4
+ url: https://github.com/ilhamfadillah
+gerry-sabar:
+ login: gerry-sabar
+ count: 4
+ avatarUrl: https://avatars.githubusercontent.com/u/1120123?v=4
+ url: https://github.com/gerry-sabar
+cookie-byte217:
+ login: cookie-byte217
+ count: 4
+ avatarUrl: https://avatars.githubusercontent.com/u/57880178?v=4
+ url: https://github.com/cookie-byte217
+AbolfazlKameli:
+ login: AbolfazlKameli
+ count: 4
+ avatarUrl: https://avatars.githubusercontent.com/u/120686133?u=05d405115fc834d46260ec24ec7b28e23a13477e&v=4
+ url: https://github.com/AbolfazlKameli
tyronedamasceno:
login: tyronedamasceno
count: 3
@@ -1141,7 +1246,7 @@ RuslanTer:
FedorGN:
login: FedorGN
count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/66411909?u=1c6734e92f50c7d66f130ef7d394e72b53770fe6&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/66411909?u=22382380e7d66ee57ffbfc2ae6bd5efd0cdb672e&v=4
url: https://github.com/FedorGN
rafsaf:
login: rafsaf
@@ -1151,7 +1256,7 @@ rafsaf:
frnsimoes:
login: frnsimoes
count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/66239468?u=771c4b0c403a42ccf2676ac987ac4999e5ad09bc&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/66239468?u=fd8d408946633acc4bea057c207e6c0833871527&v=4
url: https://github.com/frnsimoes
lieryan:
login: lieryan
@@ -1243,6 +1348,11 @@ Sion99:
count: 3
avatarUrl: https://avatars.githubusercontent.com/u/82511301?v=4
url: https://github.com/Sion99
+nymous:
+ login: nymous
+ count: 3
+ avatarUrl: https://avatars.githubusercontent.com/u/4216559?u=360a36fb602cded27273cbfc0afc296eece90662&v=4
+ url: https://github.com/nymous
EpsilonRationes:
login: EpsilonRationes
count: 3
@@ -1263,6 +1373,11 @@ kohiry:
count: 3
avatarUrl: https://avatars.githubusercontent.com/u/57669492?u=f6ab0a062740261e882879269a41a47788c84043&v=4
url: https://github.com/kohiry
+ptt3199:
+ login: ptt3199
+ count: 3
+ avatarUrl: https://avatars.githubusercontent.com/u/51350651?u=2c3d947a80283e32bf616d4c3af139a6be69680f&v=4
+ url: https://github.com/ptt3199
arynoot:
login: arynoot
count: 3
@@ -1276,18 +1391,38 @@ GDemay:
maxscheijen:
login: maxscheijen
count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/47034840?u=eb98f37882528ea349ca4e5255fa64ac3fef0294&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/47034840?v=4
url: https://github.com/maxscheijen
celestywang:
login: celestywang
count: 3
avatarUrl: https://avatars.githubusercontent.com/u/184830753?v=4
url: https://github.com/celestywang
-ilhamfadillah:
- login: ilhamfadillah
+RyaWcksn:
+ login: RyaWcksn
count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/20577838?u=c56192cf99b55affcaad408b240259c62e633450&v=4
- url: https://github.com/ilhamfadillah
+ avatarUrl: https://avatars.githubusercontent.com/u/42831964?u=0cb4265faf3e3425a89e59b6fddd3eb2de180af0&v=4
+ url: https://github.com/RyaWcksn
+tienduong-21:
+ login: tienduong-21
+ count: 3
+ avatarUrl: https://avatars.githubusercontent.com/u/80129618?v=4
+ url: https://github.com/tienduong-21
+zbellos:
+ login: zbellos
+ count: 3
+ avatarUrl: https://avatars.githubusercontent.com/u/204500646?v=4
+ url: https://github.com/zbellos
+Mohammad222PR:
+ login: Mohammad222PR
+ count: 3
+ avatarUrl: https://avatars.githubusercontent.com/u/116789737?u=25810a5fe049d2f1618e2e7417cea011cc353ce4&v=4
+ url: https://github.com/Mohammad222PR
+EdmilsonRodrigues:
+ login: EdmilsonRodrigues
+ count: 3
+ avatarUrl: https://avatars.githubusercontent.com/u/62777025?u=217d6f3cd6cc750bb8818a3af7726c8d74eb7c2d&v=4
+ url: https://github.com/EdmilsonRodrigues
blaisep:
login: blaisep
count: 2
@@ -1361,7 +1496,7 @@ TimorChow:
ataberkciftlikli:
login: ataberkciftlikli
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/64265169?v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/64265169?u=ca7c1348242559f70bc1dc027a4be277c464676f&v=4
url: https://github.com/ataberkciftlikli
leandrodesouzadev:
login: leandrodesouzadev
@@ -1383,36 +1518,31 @@ its0x08:
count: 2
avatarUrl: https://avatars.githubusercontent.com/u/15280042?u=d7c2058f29d4e8fbdae09b194e04c5e410350211&v=4
url: https://github.com/its0x08
-lindsayzhou:
- login: lindsayzhou
+linsein:
+ login: linsein
count: 2
avatarUrl: https://avatars.githubusercontent.com/u/23748021?u=4db169ce262b69aa7292f82b785436544f69fb88&v=4
- url: https://github.com/lindsayzhou
+ url: https://github.com/linsein
0xflotus:
login: 0xflotus
count: 2
avatarUrl: https://avatars.githubusercontent.com/u/26602940?u=3c52ce6393bb547c97e6380ccdee03e0c64152c6&v=4
url: https://github.com/0xflotus
-peacekimjapan:
- login: peacekimjapan
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/33534175?u=e4219bcebc3773a7068cc34c3eb268ef77cec31b&v=4
- url: https://github.com/peacekimjapan
jonatasoli:
login: jonatasoli
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/26334101?u=071c062d2861d3dd127f6b4a5258cd8ef55d4c50&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/26334101?u=f601c3f111f2148bd9244c2cb3ebbd57b592e674&v=4
url: https://github.com/jonatasoli
tyzh-dev:
login: tyzh-dev
count: 2
avatarUrl: https://avatars.githubusercontent.com/u/51972581?u=ba3882da7c009918a8e2d6b9ead31c89f09c922d&v=4
url: https://github.com/tyzh-dev
-WaFeeAL:
- login: WaFeeAL
+yurkevich-dev:
+ login: yurkevich-dev
count: 2
avatarUrl: https://avatars.githubusercontent.com/u/45145188?u=db2de8c186073d95693279dcf085fcebffab57d0&v=4
- url: https://github.com/WaFeeAL
+ url: https://github.com/yurkevich-dev
emp7yhead:
login: emp7yhead
count: 2
@@ -1446,7 +1576,7 @@ felipebpl:
iudeen:
login: iudeen
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/10519440?u=2843b3303282bff8b212dcd4d9d6689452e4470c&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/10519440?u=f09cdd745e5bf16138f29b42732dd57c7f02bee1&v=4
url: https://github.com/iudeen
dwisulfahnur:
login: dwisulfahnur
@@ -1466,7 +1596,7 @@ raphaelauv:
Fahad-Md-Kamal:
login: Fahad-Md-Kamal
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/34704464?u=84abea85e59c30b2e3bc700ae42424f3fe704332&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/34704464?u=141086368c5557d5a1a533fe291f21f9fc584458&v=4
url: https://github.com/Fahad-Md-Kamal
zxcq544:
login: zxcq544
@@ -1548,6 +1678,11 @@ siavashyj:
count: 2
avatarUrl: https://avatars.githubusercontent.com/u/43583410?u=562005ddc7901cd27a1219a118a2363817b14977&v=4
url: https://github.com/siavashyj
+Ramin-RX7:
+ login: Ramin-RX7
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/52785580?u=b3678f779ad0ee9cd9dca9e50ccb804b5eb990a5&v=4
+ url: https://github.com/Ramin-RX7
DevSpace88:
login: DevSpace88
count: 2
@@ -1581,7 +1716,7 @@ zhiquanchi:
Jamim:
login: Jamim
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/5607572?u=0cf3027bec78ba4f0b89802430c136bc69847d7a&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/5607572?u=9ce0b6a6d1a5124e28b3c04d8d26827ca328713a&v=4
url: https://github.com/Jamim
alvinkhalil:
login: alvinkhalil
@@ -1591,13 +1726,18 @@ alvinkhalil:
leylaeminova:
login: leylaeminova
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/100516839?u=35a9ce14bb86d7d7faa25d432f61dec2984cb818&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/100516839?u=0b0dab9e31742076b22812b14a39b4e6d8f6de4a&v=4
url: https://github.com/leylaeminova
UN-9BOT:
login: UN-9BOT
count: 2
avatarUrl: https://avatars.githubusercontent.com/u/111110804?u=39e158937ed795972c2d0400fc521c50e9bfb9e7&v=4
url: https://github.com/UN-9BOT
+flasonme:
+ login: flasonme
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/30571019?v=4
+ url: https://github.com/flasonme
gustavoprezoto:
login: gustavoprezoto
count: 2
@@ -1621,25 +1761,95 @@ ZhibangYue:
saeye:
login: saeye
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/62229734?v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/62229734?u=312d619db2588b60d5d5bde65260a2f44fdc6c76&v=4
url: https://github.com/saeye
Heumhub:
login: Heumhub
count: 2
avatarUrl: https://avatars.githubusercontent.com/u/173761521?v=4
url: https://github.com/Heumhub
+manumolina:
+ login: manumolina
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/2404208?u=fdc5502910f8dec814b2477f89587b9e45fac846&v=4
+ url: https://github.com/manumolina
logan2d5:
login: logan2d5
count: 2
avatarUrl: https://avatars.githubusercontent.com/u/146642263?u=dbd6621f8b0330d6919f6a7131277b92e26fbe87&v=4
url: https://github.com/logan2d5
-RyaWcksn:
- login: RyaWcksn
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/42831964?u=0cb4265faf3e3425a89e59b6fddd3eb2de180af0&v=4
- url: https://github.com/RyaWcksn
-gerry-sabar:
- login: gerry-sabar
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/1120123?v=4
- url: https://github.com/gerry-sabar
+guspan-tanadi:
+ login: guspan-tanadi
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/36249910?v=4
+ url: https://github.com/guspan-tanadi
+tiaggo16:
+ login: tiaggo16
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/62227573?u=359f4e2c51a4b13c8553ac5af405d635b07bb61f&v=4
+ url: https://github.com/tiaggo16
+kiharito:
+ login: kiharito
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/38311245?v=4
+ url: https://github.com/kiharito
+t4f1d:
+ login: t4f1d
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/4054172?u=463d5ce0ec8ad8582f6e9351bb8c9a5105b39bb7&v=4
+ url: https://github.com/t4f1d
+J-Fuji:
+ login: J-Fuji
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/101452903?v=4
+ url: https://github.com/J-Fuji
+MrL8199:
+ login: MrL8199
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/39489075?u=3fc4f89c86973e40b5970d838c801bdbc13ac828&v=4
+ url: https://github.com/MrL8199
+ivintoiu:
+ login: ivintoiu
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/1853336?u=5e3d0977f44661fb9712fa297cc8f7608ea6ce48&v=4
+ url: https://github.com/ivintoiu
+TechnoService2:
+ login: TechnoService2
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/142113388?v=4
+ url: https://github.com/TechnoService2
+EgorOnishchuk:
+ login: EgorOnishchuk
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/120256301?v=4
+ url: https://github.com/EgorOnishchuk
+iamantonreznik:
+ login: iamantonreznik
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/112612414?u=bf6de9a1ab17326fe14de0709719fff3826526d0&v=4
+ url: https://github.com/iamantonreznik
+Azazul123:
+ login: Azazul123
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/102759111?u=b48ce6e30a81a23467cc30e0c011bcc57f0326ab&v=4
+ url: https://github.com/Azazul123
+ykertytsky:
+ login: ykertytsky
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/83857001?u=1172902656ee604cf37f5e36abe938cd34a97a32&v=4
+ url: https://github.com/ykertytsky
+NavesSapnis:
+ login: NavesSapnis
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/79222417?u=b5b10291b8e9130ca84fd20f0a641e04ed94b6b1&v=4
+ url: https://github.com/NavesSapnis
+eqsdxr:
+ login: eqsdxr
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/157279130?u=58fddf77ed76966eaa8c73eea9bea4bb0c53b673&v=4
+ url: https://github.com/eqsdxr
+syedasamina56:
+ login: syedasamina56
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/183273097?v=4
+ url: https://github.com/syedasamina56
diff --git a/docs/en/data/translators.yml b/docs/en/data/translators.yml
index 7b199dc08..410c9c826 100644
--- a/docs/en/data/translators.yml
+++ b/docs/en/data/translators.yml
@@ -8,6 +8,16 @@ jaystone776:
count: 46
avatarUrl: https://avatars.githubusercontent.com/u/11191137?u=299205a95e9b6817a43144a48b643346a5aac5cc&v=4
url: https://github.com/jaystone776
+valentinDruzhinin:
+ login: valentinDruzhinin
+ count: 29
+ avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4
+ url: https://github.com/valentinDruzhinin
+ceb10n:
+ login: ceb10n
+ count: 27
+ avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4
+ url: https://github.com/ceb10n
tokusumi:
login: tokusumi
count: 23
@@ -23,11 +33,6 @@ hasansezertasan:
count: 22
avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4
url: https://github.com/hasansezertasan
-ceb10n:
- login: ceb10n
- count: 22
- avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4
- url: https://github.com/ceb10n
waynerv:
login: waynerv
count: 20
@@ -43,6 +48,11 @@ hard-coders:
count: 15
avatarUrl: https://avatars.githubusercontent.com/u/9651103?u=95db33927bbff1ed1c07efddeb97ac2ff33068ed&v=4
url: https://github.com/hard-coders
+Joao-Pedro-P-Holanda:
+ login: Joao-Pedro-P-Holanda
+ count: 14
+ avatarUrl: https://avatars.githubusercontent.com/u/110267046?u=331bd016326dac4cf3df4848f6db2dbbf8b5f978&v=4
+ url: https://github.com/Joao-Pedro-P-Holanda
codingjenny:
login: codingjenny
count: 14
@@ -53,11 +63,11 @@ Xewus:
count: 13
avatarUrl: https://avatars.githubusercontent.com/u/85196001?u=f8e2dc7e5104f109cef944af79050ea8d1b8f914&v=4
url: https://github.com/Xewus
-Joao-Pedro-P-Holanda:
- login: Joao-Pedro-P-Holanda
- count: 12
- avatarUrl: https://avatars.githubusercontent.com/u/110267046?u=331bd016326dac4cf3df4848f6db2dbbf8b5f978&v=4
- url: https://github.com/Joao-Pedro-P-Holanda
+Zhongheng-Cheng:
+ login: Zhongheng-Cheng
+ count: 13
+ avatarUrl: https://avatars.githubusercontent.com/u/95612344?u=a0f7730a3cc7486827965e01a119ad610bda4b0a&v=4
+ url: https://github.com/Zhongheng-Cheng
Smlep:
login: Smlep
count: 11
@@ -93,11 +103,16 @@ pablocm83:
count: 8
avatarUrl: https://avatars.githubusercontent.com/u/28315068?u=3310fbb05bb8bfc50d2c48b6cb64ac9ee4a14549&v=4
url: https://github.com/pablocm83
-Zhongheng-Cheng:
- login: Zhongheng-Cheng
- count: 8
- avatarUrl: https://avatars.githubusercontent.com/u/95612344?u=a0f7730a3cc7486827965e01a119ad610bda4b0a&v=4
- url: https://github.com/Zhongheng-Cheng
+ptt3199:
+ login: ptt3199
+ count: 7
+ avatarUrl: https://avatars.githubusercontent.com/u/51350651?u=2c3d947a80283e32bf616d4c3af139a6be69680f&v=4
+ url: https://github.com/ptt3199
+NinaHwang:
+ login: NinaHwang
+ count: 6
+ avatarUrl: https://avatars.githubusercontent.com/u/79563565?u=241f2cb6d38a2d379536608a8ea5a22ed4b1a3ea&v=4
+ url: https://github.com/NinaHwang
batlopes:
login: batlopes
count: 6
@@ -106,7 +121,7 @@ batlopes:
lucasbalieiro:
login: lucasbalieiro
count: 6
- avatarUrl: https://avatars.githubusercontent.com/u/37416577?u=5a395a69384e7fa0f9840ea32ef963d3f1cd9da4&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/37416577?u=dad91601ee4f40458d691774ec439aff308344d7&v=4
url: https://github.com/lucasbalieiro
Alexandrhub:
login: Alexandrhub
@@ -128,11 +143,6 @@ Attsun1031:
count: 5
avatarUrl: https://avatars.githubusercontent.com/u/1175560?v=4
url: https://github.com/Attsun1031
-NinaHwang:
- login: NinaHwang
- count: 5
- avatarUrl: https://avatars.githubusercontent.com/u/79563565?u=241f2cb6d38a2d379536608a8ea5a22ed4b1a3ea&v=4
- url: https://github.com/NinaHwang
tiangolo:
login: tiangolo
count: 5
@@ -143,6 +153,11 @@ rostik1410:
count: 5
avatarUrl: https://avatars.githubusercontent.com/u/11443899?u=e26a635c2ba220467b308a326a579b8ccf4a8701&v=4
url: https://github.com/rostik1410
+alv2017:
+ login: alv2017
+ count: 5
+ avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4
+ url: https://github.com/alv2017
komtaki:
login: komtaki
count: 4
@@ -188,6 +203,21 @@ kwang1215:
count: 4
avatarUrl: https://avatars.githubusercontent.com/u/74170199?u=2a63ff6692119dde3f5e5693365b9fcd6f977b08&v=4
url: https://github.com/kwang1215
+k94-ishi:
+ login: k94-ishi
+ count: 4
+ avatarUrl: https://avatars.githubusercontent.com/u/32672580?u=bc7c5c07af0656be9fe4f1784a444af8d81ded89&v=4
+ url: https://github.com/k94-ishi
+Mohammad222PR:
+ login: Mohammad222PR
+ count: 4
+ avatarUrl: https://avatars.githubusercontent.com/u/116789737?u=25810a5fe049d2f1618e2e7417cea011cc353ce4&v=4
+ url: https://github.com/Mohammad222PR
+NavesSapnis:
+ login: NavesSapnis
+ count: 4
+ avatarUrl: https://avatars.githubusercontent.com/u/79222417?u=b5b10291b8e9130ca84fd20f0a641e04ed94b6b1&v=4
+ url: https://github.com/NavesSapnis
jfunez:
login: jfunez
count: 3
@@ -196,7 +226,7 @@ jfunez:
ycd:
login: ycd
count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/62724709?u=29682e4b6ac7d5293742ccf818188394b9a82972&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/62724709?u=f1e7bae394a315da950912c92dc861a8eaf95d4c&v=4
url: https://github.com/ycd
mariacamilagl:
login: mariacamilagl
@@ -233,11 +263,6 @@ Zssaer:
count: 3
avatarUrl: https://avatars.githubusercontent.com/u/45691504?u=4c0c195f25cb5ac6af32acfb0ab35427682938d2&v=4
url: https://github.com/Zssaer
-wdh99:
- login: wdh99
- count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/108172295?u=8a8fb95d5afe3e0fa33257b2aecae88d436249eb&v=4
- url: https://github.com/wdh99
ChuyuChoyeon:
login: ChuyuChoyeon
count: 3
@@ -256,12 +281,12 @@ mojtabapaso:
hsuanchi:
login: hsuanchi
count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/24913710?u=0b094ae292292fee093818e37ceb645c114d2bff&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/24913710?u=7d25a398e478b6e63503bf6f26c54efa9e0da07b&v=4
url: https://github.com/hsuanchi
alejsdev:
login: alejsdev
count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=356f39ff3f0211c720b06d3dbb060e98884085e3&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=638c65283ac9e9e2c3a0f9d1e3370db4b8a2c58d&v=4
url: https://github.com/alejsdev
riroan:
login: riroan
@@ -281,7 +306,7 @@ pe-brian:
maxscheijen:
login: maxscheijen
count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/47034840?u=eb98f37882528ea349ca4e5255fa64ac3fef0294&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/47034840?v=4
url: https://github.com/maxscheijen
ilacftemp:
login: ilacftemp
@@ -313,11 +338,26 @@ nahyunkeem:
count: 3
avatarUrl: https://avatars.githubusercontent.com/u/174440096?u=e12401d492eee58570f8914d0872b52e421a776e&v=4
url: https://github.com/nahyunkeem
-alv2017:
- login: alv2017
+timothy-jeong:
+ login: timothy-jeong
count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4
- url: https://github.com/alv2017
+ avatarUrl: https://avatars.githubusercontent.com/u/53824764?u=db3d0cea2f5fab64d810113c5039a369699a2774&v=4
+ url: https://github.com/timothy-jeong
+gerry-sabar:
+ login: gerry-sabar
+ count: 3
+ avatarUrl: https://avatars.githubusercontent.com/u/1120123?v=4
+ url: https://github.com/gerry-sabar
+Rishat-F:
+ login: Rishat-F
+ count: 3
+ avatarUrl: https://avatars.githubusercontent.com/u/66554797?v=4
+ url: https://github.com/Rishat-F
+ruzia:
+ login: ruzia
+ count: 3
+ avatarUrl: https://avatars.githubusercontent.com/u/24503?v=4
+ url: https://github.com/ruzia
izaguerreiro:
login: izaguerreiro
count: 2
@@ -446,8 +486,13 @@ choi-haram:
imtiaz101325:
login: imtiaz101325
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/54007087?u=7a210ee38a0a30b7536226419b3b799620ad57d9&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/54007087?u=194d972b501b9ea9d2ddeaed757c492936e0121a&v=4
url: https://github.com/imtiaz101325
+fabianfalon:
+ login: fabianfalon
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/3700760?u=95f69e31280b17ac22299cdcd345323b142fe0af&v=4
+ url: https://github.com/fabianfalon
waketzheng:
login: waketzheng
count: 2
@@ -476,15 +521,25 @@ andersonrocha0:
saeye:
login: saeye
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/62229734?v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/62229734?u=312d619db2588b60d5d5bde65260a2f44fdc6c76&v=4
url: https://github.com/saeye
-timothy-jeong:
- login: timothy-jeong
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/53824764?u=659311b6f6aeb0fbb8b527723fd4c83642f04327&v=4
- url: https://github.com/timothy-jeong
-gerry-sabar:
- login: gerry-sabar
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/1120123?v=4
- url: https://github.com/gerry-sabar
+11kkw:
+ login: 11kkw
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/21125286?v=4
+ url: https://github.com/11kkw
+yes0ng:
+ login: yes0ng
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/25501794?u=3aed18b0d491e0220a167a1e9e58bea3638c6707&v=4
+ url: https://github.com/yes0ng
+EgorOnishchuk:
+ login: EgorOnishchuk
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/120256301?v=4
+ url: https://github.com/EgorOnishchuk
+EdmilsonRodrigues:
+ login: EdmilsonRodrigues
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/62777025?u=217d6f3cd6cc750bb8818a3af7726c8d74eb7c2d&v=4
+ url: https://github.com/EdmilsonRodrigues
diff --git a/docs/en/docs/advanced/generate-clients.md b/docs/en/docs/advanced/generate-clients.md
index 3b9dc83f0..55e6a08b1 100644
--- a/docs/en/docs/advanced/generate-clients.md
+++ b/docs/en/docs/advanced/generate-clients.md
@@ -22,9 +22,9 @@ And it shows their true commitment to FastAPI and its **community** (you), as th
For example, you might want to try:
-* Speakeasy
+* Speakeasy
* Stainless
-* liblab
+* liblab
There are also several other companies offering similar services that you can search and find online. đ¤
diff --git a/docs/en/docs/advanced/index.md b/docs/en/docs/advanced/index.md
index 36f0720c0..47385e2c6 100644
--- a/docs/en/docs/advanced/index.md
+++ b/docs/en/docs/advanced/index.md
@@ -19,18 +19,3 @@ And it's possible that for your use case, the solution is in one of them.
You could still use most of the features in **FastAPI** with the knowledge from the main [Tutorial - User Guide](../tutorial/index.md){.internal-link target=_blank}.
And the next sections assume you already read it, and assume that you know those main ideas.
-
-## External Courses
-
-Although the [Tutorial - User Guide](../tutorial/index.md){.internal-link target=_blank} and this **Advanced User Guide** are written as a guided tutorial (like a book) and should be enough for you to **learn FastAPI**, you might want to complement it with additional courses.
-
-Or it might be the case that you just prefer to take other courses because they adapt better to your learning style.
-
-Some course providers ⨠[**sponsor FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} â¨, this ensures the continued and healthy **development** of FastAPI and its **ecosystem**.
-
-And it shows their true commitment to FastAPI and its **community** (you), as they not only want to provide you a **good learning experience** but also want to make sure you have a **good and healthy framework**, FastAPI. đ
-
-You might want to try their courses:
-
-* Talk Python Training
-* Test-Driven Development
diff --git a/docs/en/docs/advanced/response-directly.md b/docs/en/docs/advanced/response-directly.md
index 691b1e7cd..759b762b5 100644
--- a/docs/en/docs/advanced/response-directly.md
+++ b/docs/en/docs/advanced/response-directly.md
@@ -58,7 +58,7 @@ You could put your XML content in a string, put that in a `Response`, and return
## Notes
-When you return a `Response` directly its data is not validated, converted (serialized), nor documented automatically.
+When you return a `Response` directly its data is not validated, converted (serialized), or documented automatically.
But you can still document it as described in [Additional Responses in OpenAPI](additional-responses.md){.internal-link target=_blank}.
diff --git a/docs/en/docs/async.md b/docs/en/docs/async.md
index 63bd8ca68..8207ec480 100644
--- a/docs/en/docs/async.md
+++ b/docs/en/docs/async.md
@@ -40,7 +40,7 @@ def results():
---
-If your application (somehow) doesn't have to communicate with anything else and wait for it to respond, use `async def`.
+If your application (somehow) doesn't have to communicate with anything else and wait for it to respond, use `async def`, even if you don't need to use `await` inside.
---
diff --git a/docs/en/docs/contributing.md b/docs/en/docs/contributing.md
index 1b70a0ea9..2583fd1fb 100644
--- a/docs/en/docs/contributing.md
+++ b/docs/en/docs/contributing.md
@@ -181,6 +181,28 @@ as Uvicorn by default will use the port `8000`, the documentation on port `8008`
### Translations
+/// warning | Attention
+
+**Update on Translations**
+
+We're updating the way we handle documentation translations.
+
+Until now, we invited community members to translate pages via pull requests, which were then reviewed by at least two native speakers. While this has helped bring FastAPI to many more users, weâve also run into several challenges - some languages have only a few translated pages, others are outdated and hard to maintain over time.
+To improve this, weâre working on automation tools đ¤ to manage translations more efficiently. Once ready, documentation will be machine-translated and still reviewed by at least two native speakers â
before publishing. This will allow us to keep translations up-to-date while reducing the review burden on maintainers.
+
+Whatâs changing now:
+
+* đĢ Weâre no longer accepting new community-submitted translation PRs.
+
+* âŗ Existing open PRs will be reviewed and can still be merged if completed within the next 3 weeks (since July 11 2025).
+
+* đ In the future, we will only support languages where at least three active native speakers are available to review and maintain translations.
+
+This transition will help us keep translations more consistent and timely while better supporting our contributors đ. Thank you to everyone who has contributed so far â your help has been invaluable! đ
+
+///
+
+
Help with translations is VERY MUCH appreciated! And it can't be done without the help from the community. đ đ
Here are the steps to help with translations.
@@ -293,30 +315,47 @@ Now you can translate it all and see how it looks as you save the file.
Some of these files are updated very frequently and a translation would always be behind, or they include the main content from English source files, etc.
+#### Request a New Language
+
+Let's say that you want to request translations for a language that is not yet translated, not even some pages. For example, Latin.
+
+If there is no discussion for that language, you can start by requesting the new language. For that, you can follow these steps:
+
+* Create a new discussion following the template.
+* Get a few native speakers to comment on the discussion and commit to help review translations for that language.
+
+Once there are several people in the discussion, the FastAPI team can evaluate it and can make it an official translation.
+
+Then the docs will be automatically translated using AI, and the team of native speakers can review the translation, and help tweak the AI prompts.
+
+Once there's a new translation, for example if docs are updated or there's a new section, there will be a comment in the same discussion with the link to the new translation to review.
+
#### New Language
-Let's say that you want to add translations for a language that is not yet translated, not even some pages.
+/// note
-Let's say you want to add translations for Creole, and it's not yet there in the docs.
+These steps will be performed by the FastAPI team.
+
+///
-Checking the link from above, the code for "Creole" is `ht`.
+Checking the link from above (List of ISO 639-1 codes), you can see that the 2-letter code for Latin is `la`.
-The next step is to run the script to generate a new translation directory:
+Now you can create a new directory for the new language, running the following script:
```console
// Use the command new-lang, pass the language code as a CLI argument
-$ python ./scripts/docs.py new-lang ht
+$ python ./scripts/docs.py new-lang la
-Successfully initialized: docs/ht
+Successfully initialized: docs/la
```
-Now you can check in your code editor the newly created directory `docs/ht/`.
+Now you can check in your code editor the newly created directory `docs/la/`.
-That command created a file `docs/ht/mkdocs.yml` with a simple config that inherits everything from the `en` version:
+That command created a file `docs/la/mkdocs.yml` with a simple config that inherits everything from the `en` version:
```yaml
INHERIT: ../en/mkdocs.yml
@@ -328,11 +367,11 @@ You could also simply create that file with those contents manually.
///
-That command also created a dummy file `docs/ht/index.md` for the main page, you can start by translating that one.
+That command also created a dummy file `docs/la/index.md` for the main page, you can start by translating that one.
You can continue with the previous instructions for an "Existing Language" for that process.
-You can make the first pull request with those two files, `docs/ht/mkdocs.yml` and `docs/ht/index.md`. đ
+You can make the first pull request with those two files, `docs/la/mkdocs.yml` and `docs/la/index.md`. đ
#### Preview the result
diff --git a/docs/en/docs/deployment/cloud.md b/docs/en/docs/deployment/cloud.md
index 471808851..c6d408f8c 100644
--- a/docs/en/docs/deployment/cloud.md
+++ b/docs/en/docs/deployment/cloud.md
@@ -14,5 +14,5 @@ You might want to try their services and follow their guides:
* Platform.sh
* Porter
-* Coherence
* Render
+* Railway
diff --git a/docs/en/docs/deployment/concepts.md b/docs/en/docs/deployment/concepts.md
index e71a7487a..ed635a920 100644
--- a/docs/en/docs/deployment/concepts.md
+++ b/docs/en/docs/deployment/concepts.md
@@ -65,7 +65,7 @@ The word **program** is commonly used to describe many things:
* The **code** that you write, the **Python files**.
* The **file** that can be **executed** by the operating system, for example: `python`, `python.exe` or `uvicorn`.
-* A particular program while it is **running** on the operating system, using the CPU, and storing things on memory. This is also called a **process**.
+* A particular program while it is **running** on the operating system, using the CPU, and storing things in memory. This is also called a **process**.
### What is a Process
@@ -216,7 +216,7 @@ This Manager Process would probably be the one listening on the **port** in the
Those worker processes would be the ones running your application, they would perform the main computations to receive a **request** and return a **response**, and they would load anything you put in variables in RAM.
-
+
And of course, the same machine would probably have **other processes** running as well, apart from your application.
diff --git a/docs/en/docs/deployment/https.md b/docs/en/docs/deployment/https.md
index 46eda791e..8b4a08dbe 100644
--- a/docs/en/docs/deployment/https.md
+++ b/docs/en/docs/deployment/https.md
@@ -85,7 +85,7 @@ First, the browser would check with the **DNS servers** what is the **IP for the
The DNS servers would tell the browser to use some specific **IP address**. That would be the public IP address used by your server, that you configured in the DNS servers.
-
+
### TLS Handshake Start
@@ -93,7 +93,7 @@ The browser would then communicate with that IP address on **port 443** (the HTT
The first part of the communication is just to establish the connection between the client and the server and to decide the cryptographic keys they will use, etc.
-
+
This interaction between the client and the server to establish the TLS connection is called the **TLS handshake**.
@@ -111,7 +111,7 @@ Using the **SNI extension** discussed above, the TLS Termination Proxy would che
In this case, it would use the certificate for `someapp.example.com`.
-
+
The client already **trusts** the entity that generated that TLS certificate (in this case Let's Encrypt, but we'll see about that later), so it can **verify** that the certificate is valid.
@@ -133,19 +133,19 @@ Now that the client and server (specifically the browser and the TLS Termination
So, the client sends an **HTTPS request**. This is just an HTTP request through an encrypted TLS connection.
-
+
### Decrypt the Request
The TLS Termination Proxy would use the encryption agreed to **decrypt the request**, and would transmit the **plain (decrypted) HTTP request** to the process running the application (for example a process with Uvicorn running the FastAPI application).
-
+
### HTTP Response
The application would process the request and send a **plain (unencrypted) HTTP response** to the TLS Termination Proxy.
-
+
### HTTPS Response
@@ -153,7 +153,7 @@ The TLS Termination Proxy would then **encrypt the response** using the cryptogr
Next, the browser would verify that the response is valid and encrypted with the right cryptographic key, etc. It would then **decrypt the response** and process it.
-
+
The client (browser) will know that the response comes from the correct server because it is using the cryptography they agreed using the **HTTPS certificate** before.
@@ -163,7 +163,7 @@ In the same server (or servers), there could be **multiple applications**, for e
Only one process can be handling the specific IP and port (the TLS Termination Proxy in our example) but the other applications/processes can be running on the server(s) too, as long as they don't try to use the same **combination of public IP and port**.
-
+
That way, the TLS Termination Proxy could handle HTTPS and certificates for **multiple domains**, for multiple applications, and then transmit the requests to the right application in each case.
@@ -173,7 +173,7 @@ At some point in the future, each certificate would **expire** (about 3 months a
And then, there would be another program (in some cases it's another program, in some cases it could be the same TLS Termination Proxy) that would talk to Let's Encrypt, and renew the certificate(s).
-
+
The **TLS certificates** are **associated with a domain name**, not with an IP address.
diff --git a/docs/en/docs/help-fastapi.md b/docs/en/docs/help-fastapi.md
index 81151032f..35d2e7b84 100644
--- a/docs/en/docs/help-fastapi.md
+++ b/docs/en/docs/help-fastapi.md
@@ -249,20 +249,7 @@ On the other side, there are thousands of users in the chat systems, so there's
## Sponsor the author
-You can also financially support the author (me) through GitHub sponsors .
-
-There you could buy me a coffee âī¸ to say thanks. đ
-
-And you can also become a Silver or Gold sponsor for FastAPI. đ
đ
-
-## Sponsor the tools that power FastAPI
-
-As you have seen in the documentation, FastAPI stands on the shoulders of giants, Starlette and Pydantic.
-
-You can also sponsor:
-
-* Samuel Colvin (Pydantic)
-* Encode (Starlette, Uvicorn)
+If your **product/company** depends on or is related to **FastAPI** and you want to reach its users, you can sponsor the author (me) through GitHub sponsors . Depending on the tier, you could get some extra benefits, like a badge in the docs. đ
---
diff --git a/docs/en/docs/how-to/custom-docs-ui-assets.md b/docs/en/docs/how-to/custom-docs-ui-assets.md
index f717c98fa..9d2238e4f 100644
--- a/docs/en/docs/how-to/custom-docs-ui-assets.md
+++ b/docs/en/docs/how-to/custom-docs-ui-assets.md
@@ -98,7 +98,7 @@ You can probably right-click each link and select an option similar to `Save lin
And **ReDoc** uses the file:
-* `redoc.standalone.js`
+* `redoc.standalone.js`
After that, your file structure could look like:
@@ -129,14 +129,8 @@ You should see a very long JavaScript file for **ReDoc**.
It could start with something like:
```JavaScript
-/*!
- * ReDoc - OpenAPI/Swagger-generated API Reference Documentation
- * -------------------------------------------------------------
- * Version: "2.0.0-rc.18"
- * Repo: https://github.com/Redocly/redoc
- */
-!function(e,t){"object"==typeof exports&&"object"==typeof m
-
+/*! For license information please see redoc.standalone.js.LICENSE.txt */
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("null")):
...
```
diff --git a/docs/en/docs/img/deployment/concepts/process-ram.drawio b/docs/en/docs/img/deployment/concepts/process-ram.drawio
deleted file mode 100644
index b29c8a342..000000000
--- a/docs/en/docs/img/deployment/concepts/process-ram.drawio
+++ /dev/null
@@ -1,106 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/en/docs/img/deployment/concepts/process-ram.drawio.svg b/docs/en/docs/img/deployment/concepts/process-ram.drawio.svg
new file mode 100644
index 000000000..a6a5c81d0
--- /dev/null
+++ b/docs/en/docs/img/deployment/concepts/process-ram.drawio.svg
@@ -0,0 +1,297 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ RAM
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CPU
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Process
+
+
+
+ Manager
+
+
+
+
+
+
+
+ Process Manager
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Worker Process
+
+
+
+
+
+
+
+ Worker Process
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Worker Process
+
+
+
+
+
+
+
+ Worker Process
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Another Process
+
+
+
+
+
+
+
+ Another Process
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 GB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 GB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Text is not SVG - cannot display
+
+
+
+
diff --git a/docs/en/docs/img/deployment/concepts/process-ram.svg b/docs/en/docs/img/deployment/concepts/process-ram.svg
deleted file mode 100644
index c1bf0d589..000000000
--- a/docs/en/docs/img/deployment/concepts/process-ram.svg
+++ /dev/null
@@ -1,59 +0,0 @@
-Server RAM
- CPU
- Process Manager Worker Process Worker Process Another Process 1 GB 1 GB Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https.drawio b/docs/en/docs/img/deployment/https/https.drawio
deleted file mode 100644
index c4c8a3628..000000000
--- a/docs/en/docs/img/deployment/https/https.drawio
+++ /dev/null
@@ -1,277 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/en/docs/img/deployment/https/https.drawio.svg b/docs/en/docs/img/deployment/https/https.drawio.svg
new file mode 100644
index 000000000..c2a65b69f
--- /dev/null
+++ b/docs/en/docs/img/deployment/https/https.drawio.svg
@@ -0,0 +1,907 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Server(s)
+
+
+
+
+
+
+
+ Server(s)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DNS Servers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TLS Termination Proxy
+
+
+
+
+
+
+
+
+ TLS Termination Proxy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Cert Renovation Program
+
+
+
+
+
+
+ Cert Renovation Program
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Let's Encrypt
+
+
+
+
+
+
+ Let's Encrypt
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FastAPI
+
+
+ app for: someapp.example.com
+
+
+
+
+
+
+
+ FastAPI app for: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Another app
+
+
+ : another.example.com
+
+
+
+
+
+
+
+ Another app: another.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ One more app
+
+
+ : onemore.example.com
+
+
+
+
+
+
+
+ One more app: onemore.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ A Database
+
+
+
+
+
+
+
+ A Database
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Plain response from: someapp.example.com
+
+
+
+
+
+
+
+ Plain response from: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Port 443 (HTTPS)
+
+
+
+
+
+
+ Port 443 (HTTPS)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Encrypted request for: someapp.example.com
+
+
+
+
+
+
+
+ Encrypted request for: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Who is: someapp.example.com
+
+
+
+
+
+
+
+ Who is: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IP:
+
+
+
+ 123.124.125.126
+
+
+
+
+
+
+
+ IP:...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Renew HTTPS cert for: someapp.example.com
+
+
+
+
+
+
+
+ Renew HTTPS cert for: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ New HTTPS cert for: someapp.example.com
+
+
+
+
+
+
+
+ New HTTPS cert for: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TLS Handshake
+
+
+
+
+
+
+
+ TLS Handshake
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Encrypted response from: someapp.example.com
+
+
+
+
+
+
+
+ Encrypted response from: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HTTPS certificates
+
+
+
+
+
+
+
+
+ HTTPS certificates
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ someapp.example.com
+
+
+
+
+
+
+
+
+
+ someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ another.example.net
+
+
+
+
+
+
+
+
+
+ another.example.net
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ onemore.example.org
+
+
+
+
+
+
+
+
+
+ onemore.example.org
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IP:
+
+
+
+ 123.124.125.126
+
+
+
+
+
+
+
+
+
+ IP:...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Decrypted request for: someapp.example.com
+
+
+
+
+
+
+
+ Decrypted request for: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ https://someapp.example.com
+
+
+
+
+
+
+ https://someapp.example.com
+
+
+
+
+
+
+
+
+
+ Text is not SVG - cannot display
+
+
+
+
diff --git a/docs/en/docs/img/deployment/https/https.svg b/docs/en/docs/img/deployment/https/https.svg
deleted file mode 100644
index 69497518a..000000000
--- a/docs/en/docs/img/deployment/https/https.svg
+++ /dev/null
@@ -1,62 +0,0 @@
-Server(s) https://someapp.example.com
https://someapp.example.com DNS Servers TLS Termination Proxy
- Cert Renovation Program Let's Encrypt FastAPI app for: someapp.example.com
FastAPI app for: someapp.example.com Another app : another.example.com
Another app: another.example.com One more app : onemore.example.com
One more app: onemore.example.com A Database Plain response from: someapp.example.com
Plain response from: someapp.example.com Port 443 (HTTPS) Encrypted request for: someapp.example.com
Encrypted request for: someapp.example.com Who is: someapp.example.com
Who is: someapp.example.com IP:... Renew HTTPS cert for: someapp.example.com
Renew HTTPS cert for: someapp.example.com New HTTPS cert for: someapp.example.com
New HTTPS cert for: someapp.example.com TLS Handshake Encrypted response from: someapp.example.com
Encrypted response from: someapp.example.com HTTPS certificates
- someapp.example.com
- another.example.net
- onemore.example.org
- IP:... Decrypted request for: someapp.example.com
Decrypted request for: someapp.example.com Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https01.drawio b/docs/en/docs/img/deployment/https/https01.drawio
deleted file mode 100644
index 181582f9b..000000000
--- a/docs/en/docs/img/deployment/https/https01.drawio
+++ /dev/null
@@ -1,78 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/en/docs/img/deployment/https/https01.drawio.svg b/docs/en/docs/img/deployment/https/https01.drawio.svg
new file mode 100644
index 000000000..ea128daf8
--- /dev/null
+++ b/docs/en/docs/img/deployment/https/https01.drawio.svg
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DNS Servers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Who is: someapp.example.com
+
+
+
+
+
+
+
+ Who is: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IP:
+
+
+
+ 123.124.125.126
+
+
+
+
+
+
+
+ IP:...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ https://someapp.example.com
+
+
+
+
+
+
+ https://someapp.example.com
+
+
+
+
+
+
+
+
+
+ Text is not SVG - cannot display
+
+
+
+
diff --git a/docs/en/docs/img/deployment/https/https01.svg b/docs/en/docs/img/deployment/https/https01.svg
deleted file mode 100644
index 2edbd0623..000000000
--- a/docs/en/docs/img/deployment/https/https01.svg
+++ /dev/null
@@ -1,57 +0,0 @@
-https://someapp.example.com
https://someapp.example.com DNS Servers Who is: someapp.example.com
Who is: someapp.example.com IP:... Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https02.drawio b/docs/en/docs/img/deployment/https/https02.drawio
deleted file mode 100644
index 650c06d1e..000000000
--- a/docs/en/docs/img/deployment/https/https02.drawio
+++ /dev/null
@@ -1,110 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/en/docs/img/deployment/https/https02.drawio.svg b/docs/en/docs/img/deployment/https/https02.drawio.svg
new file mode 100644
index 000000000..c29d59356
--- /dev/null
+++ b/docs/en/docs/img/deployment/https/https02.drawio.svg
@@ -0,0 +1,245 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Server(s)
+
+
+
+
+
+
+
+ Server(s)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DNS Servers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Port 443 (HTTPS)
+
+
+
+
+
+
+ Port 443 (HTTPS)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IP:
+
+
+
+ 123.124.125.126
+
+
+
+
+
+
+
+
+
+ IP:...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Who is: someapp.example.com
+
+
+
+
+
+
+
+ Who is: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IP:
+
+
+
+ 123.124.125.126
+
+
+
+
+
+
+
+ IP:...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TLS Handshake
+
+
+
+
+
+
+
+ TLS Handshake
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ https://someapp.example.com
+
+
+
+
+
+
+ https://someapp.example.com
+
+
+
+
+
+
+
+
+
+ Text is not SVG - cannot display
+
+
+
+
diff --git a/docs/en/docs/img/deployment/https/https02.svg b/docs/en/docs/img/deployment/https/https02.svg
deleted file mode 100644
index e16b7e94a..000000000
--- a/docs/en/docs/img/deployment/https/https02.svg
+++ /dev/null
@@ -1,57 +0,0 @@
-Server(s) https://someapp.example.com
https://someapp.example.com DNS Servers Port 443 (HTTPS) IP:... Who is: someapp.example.com
Who is: someapp.example.com IP:... TLS Handshake Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https03.drawio b/docs/en/docs/img/deployment/https/https03.drawio
deleted file mode 100644
index c178fd363..000000000
--- a/docs/en/docs/img/deployment/https/https03.drawio
+++ /dev/null
@@ -1,131 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/en/docs/img/deployment/https/https03.drawio.svg b/docs/en/docs/img/deployment/https/https03.drawio.svg
new file mode 100644
index 000000000..6971e4c9c
--- /dev/null
+++ b/docs/en/docs/img/deployment/https/https03.drawio.svg
@@ -0,0 +1,715 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Server(s)
+
+
+
+
+
+
+
+ Server(s)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DNS Servers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TLS Termination Proxy
+
+
+
+
+
+
+
+
+ TLS Termination Proxy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Port 443 (HTTPS)
+
+
+
+
+
+
+ Port 443 (HTTPS)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Who is: someapp.example.com
+
+
+
+
+
+
+
+ Who is: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IP:
+
+
+
+ 123.124.125.126
+
+
+
+
+
+
+
+ IP:...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TLS Handshake
+
+
+
+
+
+
+
+ TLS Handshake
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HTTPS certificates
+
+
+
+
+
+
+
+
+ HTTPS certificates
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ someapp.example.com
+
+
+
+
+
+
+
+
+
+ someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ another.example.net
+
+
+
+
+
+
+
+
+
+ another.example.net
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ onemore.example.org
+
+
+
+
+
+
+
+
+
+ onemore.example.org
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IP:
+
+
+
+ 123.124.125.126
+
+
+
+
+
+
+
+
+
+ IP:...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ https://someapp.example.com
+
+
+
+
+
+
+ https://someapp.example.com
+
+
+
+
+
+
+
+
+
+ Text is not SVG - cannot display
+
+
+
+
diff --git a/docs/en/docs/img/deployment/https/https03.svg b/docs/en/docs/img/deployment/https/https03.svg
deleted file mode 100644
index 2badd1c7d..000000000
--- a/docs/en/docs/img/deployment/https/https03.svg
+++ /dev/null
@@ -1,62 +0,0 @@
-Server(s) https://someapp.example.com
https://someapp.example.com DNS Servers TLS Termination Proxy
- Port 443 (HTTPS) Who is: someapp.example.com
Who is: someapp.example.com IP:... TLS Handshake HTTPS certificates
- someapp.example.com
- another.example.net
- onemore.example.org
- IP:... Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https04.drawio b/docs/en/docs/img/deployment/https/https04.drawio
deleted file mode 100644
index 78a6e919a..000000000
--- a/docs/en/docs/img/deployment/https/https04.drawio
+++ /dev/null
@@ -1,152 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/en/docs/img/deployment/https/https04.drawio.svg b/docs/en/docs/img/deployment/https/https04.drawio.svg
new file mode 100644
index 000000000..7e32bcdfe
--- /dev/null
+++ b/docs/en/docs/img/deployment/https/https04.drawio.svg
@@ -0,0 +1,419 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Server(s)
+
+
+
+
+
+
+
+ Server(s)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DNS Servers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TLS Termination Proxy
+
+
+
+
+
+
+
+
+ TLS Termination Proxy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Port 443 (HTTPS)
+
+
+
+
+
+
+ Port 443 (HTTPS)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Encrypted request for: someapp.example.com
+
+
+
+
+
+
+
+ Encrypted request for: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Who is: someapp.example.com
+
+
+
+
+
+
+
+ Who is: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IP:
+
+
+
+ 123.124.125.126
+
+
+
+
+
+
+
+ IP:...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TLS Handshake
+
+
+
+
+
+
+
+ TLS Handshake
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HTTPS certificates
+
+
+
+
+
+
+
+
+ HTTPS certificates
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ someapp.example.com
+
+
+
+
+
+
+
+
+
+ someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ another.example.net
+
+
+
+
+
+
+
+
+
+ another.example.net
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ onemore.example.org
+
+
+
+
+
+
+
+
+
+ onemore.example.org
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IP:
+
+
+
+ 123.124.125.126
+
+
+
+
+
+
+
+
+
+ IP:...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ https://someapp.example.com
+
+
+
+
+
+
+ https://someapp.example.com
+
+
+
+
+
+
+
+
+
+ Text is not SVG - cannot display
+
+
+
+
diff --git a/docs/en/docs/img/deployment/https/https04.svg b/docs/en/docs/img/deployment/https/https04.svg
deleted file mode 100644
index 4513ac76b..000000000
--- a/docs/en/docs/img/deployment/https/https04.svg
+++ /dev/null
@@ -1,62 +0,0 @@
-Server(s) https://someapp.example.com
https://someapp.example.com DNS Servers TLS Termination Proxy
- Port 443 (HTTPS) Encrypted request for: someapp.example.com
Encrypted request for: someapp.example.com Who is: someapp.example.com
Who is: someapp.example.com IP:... TLS Handshake HTTPS certificates
- someapp.example.com
- another.example.net
- onemore.example.org
- IP:... Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https05.drawio b/docs/en/docs/img/deployment/https/https05.drawio
deleted file mode 100644
index 236ecd841..000000000
--- a/docs/en/docs/img/deployment/https/https05.drawio
+++ /dev/null
@@ -1,166 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/en/docs/img/deployment/https/https05.drawio.svg b/docs/en/docs/img/deployment/https/https05.drawio.svg
new file mode 100644
index 000000000..fed2fad16
--- /dev/null
+++ b/docs/en/docs/img/deployment/https/https05.drawio.svg
@@ -0,0 +1,641 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Server(s)
+
+
+
+
+
+
+
+ Server(s)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DNS Servers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TLS Termination Proxy
+
+
+
+
+
+
+
+
+ TLS Termination Proxy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FastAPI
+
+
+ app for: someapp.example.com
+
+
+
+
+
+
+
+ FastAPI app for: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Decrypted request for: someapp.example.com
+
+
+
+
+
+
+
+ Decrypted request for: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Port 443 (HTTPS)
+
+
+
+
+
+
+ Port 443 (HTTPS)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Encrypted request for: someapp.example.com
+
+
+
+
+
+
+
+ Encrypted request for: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Who is: someapp.example.com
+
+
+
+
+
+
+
+ Who is: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IP:
+
+
+
+ 123.124.125.126
+
+
+
+
+
+
+
+ IP:...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TLS Handshake
+
+
+
+
+
+
+
+ TLS Handshake
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HTTPS certificates
+
+
+
+
+
+
+
+
+ HTTPS certificates
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ someapp.example.com
+
+
+
+
+
+
+
+
+
+ someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ another.example.net
+
+
+
+
+
+
+
+
+
+ another.example.net
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ onemore.example.org
+
+
+
+
+
+
+
+
+
+ onemore.example.org
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IP:
+
+
+
+ 123.124.125.126
+
+
+
+
+
+
+
+
+
+ IP:...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ https://someapp.example.com
+
+
+
+
+
+
+ https://someapp.example.com
+
+
+
+
+
+
+
+
+
+ Text is not SVG - cannot display
+
+
+
+
diff --git a/docs/en/docs/img/deployment/https/https05.svg b/docs/en/docs/img/deployment/https/https05.svg
deleted file mode 100644
index ddcd2760a..000000000
--- a/docs/en/docs/img/deployment/https/https05.svg
+++ /dev/null
@@ -1,62 +0,0 @@
-Server(s) https://someapp.example.com
https://someapp.example.com DNS Servers TLS Termination Proxy
- FastAPI app for: someapp.example.com
FastAPI app for: someapp.example.com Decrypted request for: someapp.example.com
Decrypted request for: someapp.example.com Port 443 (HTTPS) Encrypted request for: someapp.example.com
Encrypted request for: someapp.example.com Who is: someapp.example.com
Who is: someapp.example.com IP:... TLS Handshake HTTPS certificates
- someapp.example.com
- another.example.net
- onemore.example.org
- IP:... Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https06.drawio b/docs/en/docs/img/deployment/https/https06.drawio
deleted file mode 100644
index 9dec13184..000000000
--- a/docs/en/docs/img/deployment/https/https06.drawio
+++ /dev/null
@@ -1,183 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/en/docs/img/deployment/https/https06.drawio.svg b/docs/en/docs/img/deployment/https/https06.drawio.svg
new file mode 100644
index 000000000..e0bd9bc6e
--- /dev/null
+++ b/docs/en/docs/img/deployment/https/https06.drawio.svg
@@ -0,0 +1,673 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Server(s)
+
+
+
+
+
+
+
+ Server(s)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DNS Servers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TLS Termination Proxy
+
+
+
+
+
+
+
+
+ TLS Termination Proxy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FastAPI
+
+
+ app for: someapp.example.com
+
+
+
+
+
+
+
+ FastAPI app for: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Plain response from: someapp.example.com
+
+
+
+
+
+
+
+ Plain response from: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Decrypted request for: someapp.example.com
+
+
+
+
+
+
+
+ Decrypted request for: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Port 443 (HTTPS)
+
+
+
+
+
+
+ Port 443 (HTTPS)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Encrypted request for: someapp.example.com
+
+
+
+
+
+
+
+ Encrypted request for: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Who is: someapp.example.com
+
+
+
+
+
+
+
+ Who is: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IP:
+
+
+
+ 123.124.125.126
+
+
+
+
+
+
+
+ IP:...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TLS Handshake
+
+
+
+
+
+
+
+ TLS Handshake
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HTTPS certificates
+
+
+
+
+
+
+
+
+ HTTPS certificates
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ someapp.example.com
+
+
+
+
+
+
+
+
+
+ someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ another.example.net
+
+
+
+
+
+
+
+
+
+ another.example.net
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ onemore.example.org
+
+
+
+
+
+
+
+
+
+ onemore.example.org
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IP:
+
+
+
+ 123.124.125.126
+
+
+
+
+
+
+
+
+
+ IP:...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ https://someapp.example.com
+
+
+
+
+
+
+ https://someapp.example.com
+
+
+
+
+
+
+
+
+
+ Text is not SVG - cannot display
+
+
+
+
diff --git a/docs/en/docs/img/deployment/https/https06.svg b/docs/en/docs/img/deployment/https/https06.svg
deleted file mode 100644
index 3695de40c..000000000
--- a/docs/en/docs/img/deployment/https/https06.svg
+++ /dev/null
@@ -1,62 +0,0 @@
-Server(s) https://someapp.example.com
https://someapp.example.com DNS Servers TLS Termination Proxy
- FastAPI app for: someapp.example.com
FastAPI app for: someapp.example.com Plain response from: someapp.example.com
Plain response from: someapp.example.com Decrypted request for: someapp.example.com
Decrypted request for: someapp.example.com Port 443 (HTTPS) Encrypted request for: someapp.example.com
Encrypted request for: someapp.example.com Who is: someapp.example.com
Who is: someapp.example.com IP:... TLS Handshake HTTPS certificates
- someapp.example.com
- another.example.net
- onemore.example.org
- IP:... Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https07.drawio b/docs/en/docs/img/deployment/https/https07.drawio
deleted file mode 100644
index aa8f4d6be..000000000
--- a/docs/en/docs/img/deployment/https/https07.drawio
+++ /dev/null
@@ -1,203 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/en/docs/img/deployment/https/https07.drawio.svg b/docs/en/docs/img/deployment/https/https07.drawio.svg
new file mode 100644
index 000000000..b74b33807
--- /dev/null
+++ b/docs/en/docs/img/deployment/https/https07.drawio.svg
@@ -0,0 +1,540 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Server(s)
+
+
+
+
+
+
+
+ Server(s)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DNS Servers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TLS Termination Proxy
+
+
+
+
+
+
+
+
+ TLS Termination Proxy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FastAPI
+
+
+ app for: someapp.example.com
+
+
+
+
+
+
+
+ FastAPI app for: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Plain response from: someapp.example.com
+
+
+
+
+
+
+
+ Plain response from: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Decrypted request for: someapp.example.com
+
+
+
+
+
+
+
+ Decrypted request for: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Port 443 (HTTPS)
+
+
+
+
+
+
+ Port 443 (HTTPS)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Encrypted request for: someapp.example.com
+
+
+
+
+
+
+
+ Encrypted request for: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Who is: someapp.example.com
+
+
+
+
+
+
+
+ Who is: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IP:
+
+
+
+ 123.124.125.126
+
+
+
+
+
+
+
+ IP:...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TLS Handshake
+
+
+
+
+
+
+
+ TLS Handshake
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Encrypted response from: someapp.example.com
+
+
+
+
+
+
+
+ Encrypted response from: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HTTPS certificates
+
+
+
+
+
+
+
+
+ HTTPS certificates
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ someapp.example.com
+
+
+
+
+
+
+
+
+
+ someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ another.example.net
+
+
+
+
+
+
+
+
+
+ another.example.net
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ onemore.example.org
+
+
+
+
+
+
+
+
+
+ onemore.example.org
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IP:
+
+
+
+ 123.124.125.126
+
+
+
+
+
+
+
+
+
+ IP:...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ https://someapp.example.com
+
+
+
+
+
+
+ https://someapp.example.com
+
+
+
+
+
+
+
+
+
+ Text is not SVG - cannot display
+
+
+
+
diff --git a/docs/en/docs/img/deployment/https/https07.svg b/docs/en/docs/img/deployment/https/https07.svg
deleted file mode 100644
index 551354cef..000000000
--- a/docs/en/docs/img/deployment/https/https07.svg
+++ /dev/null
@@ -1,62 +0,0 @@
-Server(s) https://someapp.example.com
https://someapp.example.com DNS Servers TLS Termination Proxy
- FastAPI app for: someapp.example.com
FastAPI app for: someapp.example.com Plain response from: someapp.example.com
Plain response from: someapp.example.com Decrypted request for: someapp.example.com
Decrypted request for: someapp.example.com Port 443 (HTTPS) Encrypted request for: someapp.example.com
Encrypted request for: someapp.example.com Who is: someapp.example.com
Who is: someapp.example.com IP:... TLS Handshake Encrypted response from: someapp.example.com
Encrypted response from: someapp.example.com HTTPS certificates
- someapp.example.com
- another.example.net
- onemore.example.org
- IP:... Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https08.drawio b/docs/en/docs/img/deployment/https/https08.drawio
deleted file mode 100644
index 794b192df..000000000
--- a/docs/en/docs/img/deployment/https/https08.drawio
+++ /dev/null
@@ -1,217 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/en/docs/img/deployment/https/https08.drawio.svg b/docs/en/docs/img/deployment/https/https08.drawio.svg
new file mode 100644
index 000000000..8fc0b31ec
--- /dev/null
+++ b/docs/en/docs/img/deployment/https/https08.drawio.svg
@@ -0,0 +1,625 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Server(s)
+
+
+
+
+
+
+
+ Server(s)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DNS Servers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TLS Termination Proxy
+
+
+
+
+
+
+
+
+ TLS Termination Proxy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FastAPI
+
+
+ app for: someapp.example.com
+
+
+
+
+
+
+
+ FastAPI app for: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Another app
+
+
+ : another.example.com
+
+
+
+
+
+
+
+ Another app: another.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ One more app
+
+
+ : onemore.example.com
+
+
+
+
+
+
+
+ One more app: onemore.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ A Database
+
+
+
+
+
+
+
+ A Database
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Plain response from: someapp.example.com
+
+
+
+
+
+
+
+ Plain response from: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Decrypted request for: someapp.example.com
+
+
+
+
+
+
+
+ Decrypted request for: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Port 443 (HTTPS)
+
+
+
+
+
+
+ Port 443 (HTTPS)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Encrypted request for: someapp.example.com
+
+
+
+
+
+
+
+ Encrypted request for: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Who is: someapp.example.com
+
+
+
+
+
+
+
+ Who is: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IP:
+
+
+
+ 123.124.125.126
+
+
+
+
+
+
+
+ IP:...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TLS Handshake
+
+
+
+
+
+
+
+ TLS Handshake
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Encrypted response from: someapp.example.com
+
+
+
+
+
+
+
+ Encrypted response from: someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HTTPS certificates
+
+
+
+
+
+
+
+
+ HTTPS certificates
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ someapp.example.com
+
+
+
+
+
+
+
+
+
+ someapp.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ another.example.net
+
+
+
+
+
+
+
+
+
+ another.example.net
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ onemore.example.org
+
+
+
+
+
+
+
+
+
+ onemore.example.org
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IP:
+
+
+
+ 123.124.125.126
+
+
+
+
+
+
+
+
+
+ IP:...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ https://someapp.example.com
+
+
+
+
+
+
+ https://someapp.example.com
+
+
+
+
+
+
+
+
+
+ Text is not SVG - cannot display
+
+
+
+
diff --git a/docs/en/docs/img/deployment/https/https08.svg b/docs/en/docs/img/deployment/https/https08.svg
deleted file mode 100644
index 2d4680dcc..000000000
--- a/docs/en/docs/img/deployment/https/https08.svg
+++ /dev/null
@@ -1,62 +0,0 @@
-Server(s) https://someapp.example.com
https://someapp.example.com DNS Servers TLS Termination Proxy
- FastAPI app for: someapp.example.com
FastAPI app for: someapp.example.com Another app : another.example.com
Another app: another.example.com One more app : onemore.example.com
One more app: onemore.example.com A Database Plain response from: someapp.example.com
Plain response from: someapp.example.com Decrypted request for: someapp.example.com
Decrypted request for: someapp.example.com Port 443 (HTTPS) Encrypted request for: someapp.example.com
Encrypted request for: someapp.example.com Who is: someapp.example.com
Who is: someapp.example.com IP:... TLS Handshake Encrypted response from: someapp.example.com
Encrypted response from: someapp.example.com HTTPS certificates
- someapp.example.com
- another.example.net
- onemore.example.org
- IP:... Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/sponsors/coderabbit-banner.png b/docs/en/docs/img/sponsors/coderabbit-banner.png
new file mode 100644
index 000000000..da3bb3482
Binary files /dev/null and b/docs/en/docs/img/sponsors/coderabbit-banner.png differ
diff --git a/docs/en/docs/img/sponsors/coderabbit.png b/docs/en/docs/img/sponsors/coderabbit.png
new file mode 100644
index 000000000..1fb74569b
Binary files /dev/null and b/docs/en/docs/img/sponsors/coderabbit.png differ
diff --git a/docs/en/docs/img/sponsors/dribia.png b/docs/en/docs/img/sponsors/dribia.png
new file mode 100644
index 000000000..f40e14086
Binary files /dev/null and b/docs/en/docs/img/sponsors/dribia.png differ
diff --git a/docs/en/docs/img/sponsors/interviewpal.png b/docs/en/docs/img/sponsors/interviewpal.png
new file mode 100644
index 000000000..e40ed01fd
Binary files /dev/null and b/docs/en/docs/img/sponsors/interviewpal.png differ
diff --git a/docs/en/docs/img/sponsors/lambdatest.png b/docs/en/docs/img/sponsors/lambdatest.png
new file mode 100644
index 000000000..674cbcb89
Binary files /dev/null and b/docs/en/docs/img/sponsors/lambdatest.png differ
diff --git a/docs/en/docs/img/sponsors/mobbai-banner.png b/docs/en/docs/img/sponsors/mobbai-banner.png
new file mode 100644
index 000000000..1f59294ab
Binary files /dev/null and b/docs/en/docs/img/sponsors/mobbai-banner.png differ
diff --git a/docs/en/docs/img/sponsors/mobbai.png b/docs/en/docs/img/sponsors/mobbai.png
new file mode 100644
index 000000000..b519fd885
Binary files /dev/null and b/docs/en/docs/img/sponsors/mobbai.png differ
diff --git a/docs/en/docs/img/sponsors/permit.png b/docs/en/docs/img/sponsors/permit.png
new file mode 100644
index 000000000..4f07f22e2
Binary files /dev/null and b/docs/en/docs/img/sponsors/permit.png differ
diff --git a/docs/en/docs/img/sponsors/railway-banner.png b/docs/en/docs/img/sponsors/railway-banner.png
new file mode 100644
index 000000000..f6146a7c1
Binary files /dev/null and b/docs/en/docs/img/sponsors/railway-banner.png differ
diff --git a/docs/en/docs/img/sponsors/railway.png b/docs/en/docs/img/sponsors/railway.png
new file mode 100644
index 000000000..dc6ccacc4
Binary files /dev/null and b/docs/en/docs/img/sponsors/railway.png differ
diff --git a/docs/en/docs/img/sponsors/subtotal-banner.svg b/docs/en/docs/img/sponsors/subtotal-banner.svg
new file mode 100644
index 000000000..3d6c98dfc
--- /dev/null
+++ b/docs/en/docs/img/sponsors/subtotal-banner.svg
@@ -0,0 +1,133 @@
+
+
+
+
+ sponsorship-banner
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/en/docs/img/sponsors/subtotal.svg b/docs/en/docs/img/sponsors/subtotal.svg
new file mode 100644
index 000000000..b944c1b2c
--- /dev/null
+++ b/docs/en/docs/img/sponsors/subtotal.svg
@@ -0,0 +1,31 @@
+
+
+ sponsorship-badge
+
+
diff --git a/docs/en/docs/img/sponsors/zuplo.png b/docs/en/docs/img/sponsors/zuplo.png
index 7a7c16862..6a4ed233e 100644
Binary files a/docs/en/docs/img/sponsors/zuplo.png and b/docs/en/docs/img/sponsors/zuplo.png differ
diff --git a/docs/en/docs/img/tutorial/bigger-applications/package.drawio b/docs/en/docs/img/tutorial/bigger-applications/package.drawio
deleted file mode 100644
index cab3de2ca..000000000
--- a/docs/en/docs/img/tutorial/bigger-applications/package.drawio
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/en/docs/img/tutorial/bigger-applications/package.drawio.svg b/docs/en/docs/img/tutorial/bigger-applications/package.drawio.svg
new file mode 100644
index 000000000..7e28f4a68
--- /dev/null
+++ b/docs/en/docs/img/tutorial/bigger-applications/package.drawio.svg
@@ -0,0 +1,420 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Package app
+
+ app/__init__.py
+
+
+
+
+
+
+ Package app...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Module app.main
+
+
+
+ app/main.py
+
+
+
+
+
+
+
+ Module app.main...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Module app.dependencies
+
+
+
+ app/dependencies.py
+
+
+
+
+
+
+
+ Module app.dependencies...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Subpackage app.internal
+
+
+
+ app/internal/__init__.py
+
+
+
+
+
+
+
+
+
+
+ Subpackage app.internal...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Module app.internal.admin
+
+
+
+ app/internal/admin.py
+
+
+
+
+
+
+
+ Module app.internal.admin...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Subpackage app.routers
+
+ app/routers/__init__.py
+
+
+
+
+
+
+
+
+ Subpackage app.routers...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Module app.routers.items
+
+
+
+ app/routers/items.py
+
+
+
+
+
+
+
+ Module app.routers.items...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Module app.routers.users
+
+
+
+ app/routers/users.py
+
+
+
+
+
+
+
+ Module app.routers.users...
+
+
+
+
+
+
+
+
+
+ Text is not SVG - cannot display
+
+
+
+
diff --git a/docs/en/docs/img/tutorial/bigger-applications/package.svg b/docs/en/docs/img/tutorial/bigger-applications/package.svg
deleted file mode 100644
index 44da1dc30..000000000
--- a/docs/en/docs/img/tutorial/bigger-applications/package.svg
+++ /dev/null
@@ -1 +0,0 @@
-Package app app/__init__.py
Package app... Module app.main app/main.py
Module app.main... Module app.dependencies app/dependencies.py
Module app.dependencies... Subpackage app.internal app/internal/__init__.py
Subpackage app.internal... Module app.internal.admin app/internal/admin.py
Module app.internal.admin... Subpackage app.routers app/routers/__init__.py
Subpackage app.routers... Module app.routers.items app/routers/items.py
Module app.routers.items... Module app.routers.users app/routers/users.py
Module app.routers.users... Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/index.md b/docs/en/docs/index.md
index cbe71c87d..938882d7d 100644
--- a/docs/en/docs/index.md
+++ b/docs/en/docs/index.md
@@ -12,7 +12,7 @@
-
+
@@ -146,7 +146,7 @@ $ pip install "fastapi[standard]"
### Create it
-* Create a file `main.py` with:
+Create a file `main.py` with:
```Python
from typing import Union
@@ -468,15 +468,20 @@ Used by Starlette:
* jinja2
- Required if you want to use the default template configuration.
* python-multipart
- Required if you want to support form "parsing" , with `request.form()`.
-Used by FastAPI / Starlette:
+Used by FastAPI:
* uvicorn
- for the server that loads and serves your application. This includes `uvicorn[standard]`, which includes some dependencies (e.g. `uvloop`) needed for high performance serving.
-* `fastapi-cli` - to provide the `fastapi` command.
+* `fastapi-cli[standard]` - to provide the `fastapi` command.
+ * This includes `fastapi-cloud-cli`, which allows you to deploy your FastAPI application to FastAPI Cloud .
### Without `standard` Dependencies
If you don't want to include the `standard` optional dependencies, you can install with `pip install fastapi` instead of `pip install "fastapi[standard]"`.
+### Without `fastapi-cloud-cli`
+
+If you want to install FastAPI with the standard dependencies but without the `fastapi-cloud-cli`, you can install with `pip install "fastapi[standard-no-fastapi-cloud-cli]"`.
+
### Additional Optional Dependencies
There are some additional dependencies you might want to install.
diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md
index ad8b85d0e..b57ff80f0 100644
--- a/docs/en/docs/release-notes.md
+++ b/docs/en/docs/release-notes.md
@@ -9,6 +9,363 @@ hide:
### Docs
+* đ Add discussion template for new language translation requests. PR [#13535](https://github.com/fastapi/fastapi/pull/13535) by [@alejsdev](https://github.com/alejsdev).
+
+### Translations
+
+* đ Update Portuguese Translation for `docs/pt/docs/async.md`. PR [#13863](https://github.com/fastapi/fastapi/pull/13863) by [@EdmilsonRodrigues](https://github.com/EdmilsonRodrigues).
+* đ Fix highlight line in `docs/ja/docs/tutorial/body.md`. PR [#13927](https://github.com/fastapi/fastapi/pull/13927) by [@KoyoMiyazaki](https://github.com/KoyoMiyazaki).
+* đ Add Persian translation for `docs/fa/docs/environment-variables.md`. PR [#13923](https://github.com/fastapi/fastapi/pull/13923) by [@Mohammad222PR](https://github.com/Mohammad222PR).
+* đ Add Persian translation for `docs/fa/docs/python-types.md`. PR [#13524](https://github.com/fastapi/fastapi/pull/13524) by [@Mohammad222PR](https://github.com/Mohammad222PR).
+* đ Update Portuguese Translation for `docs/pt/docs/project-generation.md`. PR [#13875](https://github.com/fastapi/fastapi/pull/13875) by [@EdmilsonRodrigues](https://github.com/EdmilsonRodrigues).
+* đ Add Persian translation for `docs/fa/docs/async.md`. PR [#13541](https://github.com/fastapi/fastapi/pull/13541) by [@Mohammad222PR](https://github.com/Mohammad222PR).
+* đ Add Bangali translation for `docs/bn/about/index.md`. PR [#13882](https://github.com/fastapi/fastapi/pull/13882) by [@sajjadrahman56](https://github.com/sajjadrahman56).
+
+### Internal
+
+* đĨ Update FastAPI People - Experts. PR [#13963](https://github.com/fastapi/fastapi/pull/13963) by [@tiangolo](https://github.com/tiangolo).
+* âŦ Bump ruff from 0.11.2 to 0.12.7. PR [#13957](https://github.com/fastapi/fastapi/pull/13957) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* âŦ Bump cairosvg from 2.7.1 to 2.8.2. PR [#13959](https://github.com/fastapi/fastapi/pull/13959) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* âŦ Bump pydantic-ai from 0.0.30 to 0.4.10. PR [#13958](https://github.com/fastapi/fastapi/pull/13958) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* đĨ Update FastAPI GitHub topic repositories. PR [#13962](https://github.com/fastapi/fastapi/pull/13962) by [@tiangolo](https://github.com/tiangolo).
+* âŦ Bump mkdocs-material from 9.6.15 to 9.6.16. PR [#13961](https://github.com/fastapi/fastapi/pull/13961) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* âŦ Bump tiangolo/latest-changes from 0.3.2 to 0.4.0. PR [#13952](https://github.com/fastapi/fastapi/pull/13952) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* đĨ Update FastAPI People - Sponsors. PR [#13956](https://github.com/fastapi/fastapi/pull/13956) by [@tiangolo](https://github.com/tiangolo).
+* đĨ Update FastAPI People - Contributors and Translators. PR [#13955](https://github.com/fastapi/fastapi/pull/13955) by [@tiangolo](https://github.com/tiangolo).
+* đ§ Update sponsors: Databento link and sponsors_badge data. PR [#13954](https://github.com/fastapi/fastapi/pull/13954) by [@tiangolo](https://github.com/tiangolo).
+* đ§ Update sponsors: Add Railway. PR [#13953](https://github.com/fastapi/fastapi/pull/13953) by [@tiangolo](https://github.com/tiangolo).
+* âī¸ Update translate script, update prompt to minimize generated diff. PR [#13947](https://github.com/fastapi/fastapi/pull/13947) by [@YuriiMotov](https://github.com/YuriiMotov).
+* âŦ [pre-commit.ci] pre-commit autoupdate. PR [#13943](https://github.com/fastapi/fastapi/pull/13943) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
+* âī¸ Tweak translate script and CI. PR [#13939](https://github.com/fastapi/fastapi/pull/13939) by [@tiangolo](https://github.com/tiangolo).
+* đˇ Add CI to translate with LLMs. PR [#13937](https://github.com/fastapi/fastapi/pull/13937) by [@tiangolo](https://github.com/tiangolo).
+* âī¸ Update translate script, show and update outdated translations. PR [#13933](https://github.com/fastapi/fastapi/pull/13933) by [@tiangolo](https://github.com/tiangolo).
+* đ¨ Refactor translate script with extra feedback (prints). PR [#13932](https://github.com/fastapi/fastapi/pull/13932) by [@tiangolo](https://github.com/tiangolo).
+* đ¨ Update translations script to remove old (removed) files. PR [#13928](https://github.com/fastapi/fastapi/pull/13928) by [@tiangolo](https://github.com/tiangolo).
+* âŦ [pre-commit.ci] pre-commit autoupdate. PR [#13894](https://github.com/fastapi/fastapi/pull/13894) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
+* âŦ Update httpx requirement to >=0.23.0,<0.29.0. PR [#13114](https://github.com/fastapi/fastapi/pull/13114) by [@yan12125](https://github.com/yan12125).
+* đ§ Update sponsors: Add Mobb. PR [#13916](https://github.com/fastapi/fastapi/pull/13916) by [@tiangolo](https://github.com/tiangolo).
+* đĨ Update FastAPI People - Experts. PR [#13889](https://github.com/fastapi/fastapi/pull/13889) by [@tiangolo](https://github.com/tiangolo).
+* đ¨ Update FastAPI People sleep interval, use external settings. PR [#13888](https://github.com/fastapi/fastapi/pull/13888) by [@tiangolo](https://github.com/tiangolo).
+
+## 0.116.1
+
+### Upgrades
+
+* âŦī¸ Upgrade Starlette supported version range to `>=0.40.0,<0.48.0`. PR [#13884](https://github.com/fastapi/fastapi/pull/13884) by [@tiangolo](https://github.com/tiangolo).
+
+### Docs
+
+* đ Add notification about impending changes in Translations to `docs/en/docs/contributing.md`. PR [#13886](https://github.com/fastapi/fastapi/pull/13886) by [@YuriiMotov](https://github.com/YuriiMotov).
+
+### Internal
+
+* âŦ [pre-commit.ci] pre-commit autoupdate. PR [#13871](https://github.com/fastapi/fastapi/pull/13871) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
+
+## 0.116.0
+
+### Features
+
+* ⨠Add support for deploying to FastAPI Cloud with `fastapi deploy`. PR [#13870](https://github.com/fastapi/fastapi/pull/13870) by [@tiangolo](https://github.com/tiangolo).
+
+Installing `fastapi[standard]` now includes `fastapi-cloud-cli`.
+
+This will allow you to deploy to [FastAPI Cloud](https://fastapicloud.com) with the `fastapi deploy` command.
+
+If you want to install `fastapi` with the standard dependencies but without `fastapi-cloud-cli`, you can install instead `fastapi[standard-no-fastapi-cloud-cli]`.
+
+### Translations
+
+* đ Add Russian translation for `docs/ru/docs/advanced/response-directly.md`. PR [#13801](https://github.com/fastapi/fastapi/pull/13801) by [@NavesSapnis](https://github.com/NavesSapnis).
+* đ Add Russian translation for `docs/ru/docs/advanced/additional-status-codes.md`. PR [#13799](https://github.com/fastapi/fastapi/pull/13799) by [@NavesSapnis](https://github.com/NavesSapnis).
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/body-updates.md`. PR [#13804](https://github.com/fastapi/fastapi/pull/13804) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+
+### Internal
+
+* âŦ Bump pillow from 11.1.0 to 11.3.0. PR [#13852](https://github.com/fastapi/fastapi/pull/13852) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* đĨ Update FastAPI People - Sponsors. PR [#13846](https://github.com/fastapi/fastapi/pull/13846) by [@tiangolo](https://github.com/tiangolo).
+* đĨ Update FastAPI GitHub topic repositories. PR [#13848](https://github.com/fastapi/fastapi/pull/13848) by [@tiangolo](https://github.com/tiangolo).
+* âŦ Bump mkdocs-material from 9.6.1 to 9.6.15. PR [#13849](https://github.com/fastapi/fastapi/pull/13849) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* âŦ [pre-commit.ci] pre-commit autoupdate. PR [#13843](https://github.com/fastapi/fastapi/pull/13843) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
+* đĨ Update FastAPI People - Contributors and Translators. PR [#13845](https://github.com/fastapi/fastapi/pull/13845) by [@tiangolo](https://github.com/tiangolo).
+
+## 0.115.14
+
+### Fixes
+
+* đ Fix support for unions when using `Form`. PR [#13827](https://github.com/fastapi/fastapi/pull/13827) by [@patrick91](https://github.com/patrick91).
+
+### Docs
+
+* âī¸ Fix grammar mistake in `docs/en/docs/advanced/response-directly.md`. PR [#13800](https://github.com/fastapi/fastapi/pull/13800) by [@NavesSapnis](https://github.com/NavesSapnis).
+* đ Update Speakeasy URL to Speakeasy Sandbox. PR [#13697](https://github.com/fastapi/fastapi/pull/13697) by [@ndimares](https://github.com/ndimares).
+
+### Translations
+
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/response-model.md`. PR [#13792](https://github.com/fastapi/fastapi/pull/13792) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/security/index.md`. PR [#13805](https://github.com/fastapi/fastapi/pull/13805) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* âī¸ Fix typo in `docs/ja/docs/tutorial/encoder.md`. PR [#13815](https://github.com/fastapi/fastapi/pull/13815) by [@ruzia](https://github.com/ruzia).
+* âī¸ Fix typo in `docs/ja/docs/tutorial/handling-errors.md`. PR [#13814](https://github.com/fastapi/fastapi/pull/13814) by [@ruzia](https://github.com/ruzia).
+* âī¸ Fix typo in `docs/ja/docs/tutorial/body-fields.md`. PR [#13802](https://github.com/fastapi/fastapi/pull/13802) by [@ruzia](https://github.com/ruzia).
+* đ Add Russian translation for `docs/ru/docs/advanced/index.md`. PR [#13797](https://github.com/fastapi/fastapi/pull/13797) by [@NavesSapnis](https://github.com/NavesSapnis).
+
+### Internal
+
+* âŦ [pre-commit.ci] pre-commit autoupdate. PR [#13823](https://github.com/fastapi/fastapi/pull/13823) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
+
+## 0.115.13
+
+### Fixes
+
+* đ Fix truncating the model's description with form feed (`\f`) character for Pydantic V2. PR [#13698](https://github.com/fastapi/fastapi/pull/13698) by [@YuriiMotov](https://github.com/YuriiMotov).
+
+### Refactors
+
+* ⨠Add `refreshUrl` parameter in `OAuth2PasswordBearer`. PR [#11460](https://github.com/fastapi/fastapi/pull/11460) by [@snosratiershad](https://github.com/snosratiershad).
+* đ¸ Set format to password for fields `password` and `client_secret` in `OAuth2PasswordRequestForm`, make docs show password fields for passwords. PR [#11032](https://github.com/fastapi/fastapi/pull/11032) by [@Thodoris1999](https://github.com/Thodoris1999).
+* â
Simplify tests for `settings`. PR [#13505](https://github.com/fastapi/fastapi/pull/13505) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* â
Simplify tests for `validate_response_recursive`. PR [#13507](https://github.com/fastapi/fastapi/pull/13507) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+
+### Upgrades
+
+* âŦī¸ Update ReDoc to version 2.x. PR [#9700](https://github.com/fastapi/fastapi/pull/9700) by [@joakimnordling](https://github.com/joakimnordling).
+
+### Docs
+
+* đ Add annotations to HTTP middleware example. PR [#11530](https://github.com/fastapi/fastapi/pull/11530) by [@Kilo59](https://github.com/Kilo59).
+* đ Clarify in CORS docs that wildcards and credentials are mutually exclusive. PR [#9829](https://github.com/fastapi/fastapi/pull/9829) by [@dfioravanti](https://github.com/dfioravanti).
+* âī¸ Fix typo in docstring. PR [#13532](https://github.com/fastapi/fastapi/pull/13532) by [@comp64](https://github.com/comp64).
+* đ Clarify guidance on using `async def` without `await`. PR [#13642](https://github.com/fastapi/fastapi/pull/13642) by [@swastikpradhan1999](https://github.com/swastikpradhan1999).
+* đ Update exclude-parameters-from-openapi documentation links. PR [#13600](https://github.com/fastapi/fastapi/pull/13600) by [@timonrieger](https://github.com/timonrieger).
+* đ Clarify the middleware execution order in docs. PR [#13699](https://github.com/fastapi/fastapi/pull/13699) by [@YuriiMotov](https://github.com/YuriiMotov).
+* đą Update Drawio diagrams SVGs, single file per diagram, sans-serif font. PR [#13706](https://github.com/fastapi/fastapi/pull/13706) by [@tiangolo](https://github.com/tiangolo).
+* đ Update docs for "Help FastAPI", simplify and reduce "sponsor" section. PR [#13670](https://github.com/fastapi/fastapi/pull/13670) by [@tiangolo](https://github.com/tiangolo).
+* đ Remove unnecessary bullet from docs. PR [#13641](https://github.com/fastapi/fastapi/pull/13641) by [@Adamowoc](https://github.com/Adamowoc).
+* âī¸ Fix syntax error in `docs/en/docs/tutorial/handling-errors.md`. PR [#13623](https://github.com/fastapi/fastapi/pull/13623) by [@gsheni](https://github.com/gsheni).
+* đ Fix typo in documentation. PR [#13599](https://github.com/fastapi/fastapi/pull/13599) by [@Taoup](https://github.com/Taoup).
+* đ Fix liblab client generation doc link. PR [#13571](https://github.com/fastapi/fastapi/pull/13571) by [@EFord36](https://github.com/EFord36).
+* âī¸ Fix talk information typo. PR [#13544](https://github.com/fastapi/fastapi/pull/13544) by [@blueswen](https://github.com/blueswen).
+* đ Add External Link: Taiwanese talk on FastAPI with observability . PR [#13527](https://github.com/fastapi/fastapi/pull/13527) by [@blueswen](https://github.com/blueswen).
+
+### Translations
+
+* đ Add Russian Translation for `docs/ru/docs/advanced/response-change-status-code.md`. PR [#13791](https://github.com/fastapi/fastapi/pull/13791) by [@NavesSapnis](https://github.com/NavesSapnis).
+* đ Add Persian translation for `docs/fa/docs/learn/index.md`. PR [#13518](https://github.com/fastapi/fastapi/pull/13518) by [@Mohammad222PR](https://github.com/Mohammad222PR).
+* đ Add Korean translation for `docs/ko/docs/advanced/sub-applications.md`. PR [#4543](https://github.com/fastapi/fastapi/pull/4543) by [@NinaHwang](https://github.com/NinaHwang).
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/schema-extra-example.md`. PR [#13769](https://github.com/fastapi/fastapi/pull/13769) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* âī¸ Remove redundant words in docs/zh/docs/python-types.md. PR [#13774](https://github.com/fastapi/fastapi/pull/13774) by [@CharleeWa](https://github.com/CharleeWa).
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/query-param-models.md`. PR [#13748](https://github.com/fastapi/fastapi/pull/13748) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Add Bengali translation for `docs/bn/docs/environment-variables.md`. PR [#13629](https://github.com/fastapi/fastapi/pull/13629) by [@SakibSibly](https://github.com/SakibSibly).
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/query-params-str-validations.md` page. PR [#13546](https://github.com/fastapi/fastapi/pull/13546) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Add Russian translation for `docs/ru/docs/tutorial/cookie-param-models.md`. PR [#13616](https://github.com/fastapi/fastapi/pull/13616) by [@EgorOnishchuk](https://github.com/EgorOnishchuk).
+* đ Add Korean translation for `docs/ko/docs/tutorial/extra-models.md`. PR [#13063](https://github.com/fastapi/fastapi/pull/13063) by [@timothy-jeong](https://github.com/timothy-jeong).
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/path-params-numeric-validations.md` page. PR [#13548](https://github.com/fastapi/fastapi/pull/13548) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/middleware.md` page. PR [#13520](https://github.com/fastapi/fastapi/pull/13520) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/background-tasks.md` page. PR [#13502](https://github.com/fastapi/fastapi/pull/13502) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/cors.md` page. PR [#13519](https://github.com/fastapi/fastapi/pull/13519) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Update Korean translation for `docs/ko/docs/advanced/events.md`. PR [#13487](https://github.com/fastapi/fastapi/pull/13487) by [@bom1215](https://github.com/bom1215).
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/handling-errors.md` page. PR [#13420](https://github.com/fastapi/fastapi/pull/13420) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Add Russian translation for `docs/ru/docs/tutorial/request-form-models.md`. PR [#13552](https://github.com/fastapi/fastapi/pull/13552) by [@EgorOnishchuk](https://github.com/EgorOnishchuk).
+* đ Fix internal anchor link in Spanish deployment docs. PR [#13737](https://github.com/fastapi/fastapi/pull/13737) by [@fabianfalon](https://github.com/fabianfalon).
+* đ Update Korean translation for `docs/ko/docs/virtual-environments.md`. PR [#13630](https://github.com/fastapi/fastapi/pull/13630) by [@sungchan1](https://github.com/sungchan1).
+* đ Add Russian translation for `docs/ru/docs/tutorial/header-param-models.md`. PR [#13526](https://github.com/fastapi/fastapi/pull/13526) by [@minaton-ru](https://github.com/minaton-ru).
+* đ Update Chinese translation for `docs/zh/docs/tutorial/index.md`. PR [#13374](https://github.com/fastapi/fastapi/pull/13374) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng).
+* đ Update Chinese translation for `docs/zh/docs/deployment/manually.md`. PR [#13324](https://github.com/fastapi/fastapi/pull/13324) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng).
+* đ Update Chinese translation for `docs/zh/docs/deployment/server-workers.md`. PR [#13292](https://github.com/fastapi/fastapi/pull/13292) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng).
+* đ Update Chinese translation for `docs/zh/docs/tutorial/first-steps.md`. PR [#13348](https://github.com/fastapi/fastapi/pull/13348) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng).
+
+### Internal
+
+* đ¨ Resolve Pydantic deprecation warnings in internal script. PR [#13696](https://github.com/fastapi/fastapi/pull/13696) by [@emmanuel-ferdman](https://github.com/emmanuel-ferdman).
+* đ§ Update sponsors: remove Porter. PR [#13783](https://github.com/fastapi/fastapi/pull/13783) by [@tiangolo](https://github.com/tiangolo).
+* âŦ [pre-commit.ci] pre-commit autoupdate. PR [#13781](https://github.com/fastapi/fastapi/pull/13781) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
+* âŦ [pre-commit.ci] pre-commit autoupdate. PR [#13757](https://github.com/fastapi/fastapi/pull/13757) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
+* âŦ Bump griffe-typingdoc from 0.2.7 to 0.2.8. PR [#13751](https://github.com/fastapi/fastapi/pull/13751) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* đą Update sponsors: Dribia badge size. PR [#13773](https://github.com/fastapi/fastapi/pull/13773) by [@tiangolo](https://github.com/tiangolo).
+* đ§ Update sponsors: add Dribia. PR [#13771](https://github.com/fastapi/fastapi/pull/13771) by [@tiangolo](https://github.com/tiangolo).
+* âŦ Bump typer from 0.15.3 to 0.16.0. PR [#13752](https://github.com/fastapi/fastapi/pull/13752) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* đĨ Update FastAPI GitHub topic repositories. PR [#13754](https://github.com/fastapi/fastapi/pull/13754) by [@tiangolo](https://github.com/tiangolo).
+* đĨ Update FastAPI People - Sponsors. PR [#13750](https://github.com/fastapi/fastapi/pull/13750) by [@tiangolo](https://github.com/tiangolo).
+* đĨ Update FastAPI People - Contributors and Translators. PR [#13749](https://github.com/fastapi/fastapi/pull/13749) by [@tiangolo](https://github.com/tiangolo).
+* âŦ [pre-commit.ci] pre-commit autoupdate. PR [#13736](https://github.com/fastapi/fastapi/pull/13736) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
+* đ§ Update sponsors: Add InterviewPal. PR [#13728](https://github.com/fastapi/fastapi/pull/13728) by [@tiangolo](https://github.com/tiangolo).
+* đ§ Remove Google Analytics. PR [#13727](https://github.com/fastapi/fastapi/pull/13727) by [@tiangolo](https://github.com/tiangolo).
+* đ§ Update sponsors: remove MongoDB. PR [#13725](https://github.com/fastapi/fastapi/pull/13725) by [@tiangolo](https://github.com/tiangolo).
+* âŦ [pre-commit.ci] pre-commit autoupdate. PR [#13711](https://github.com/fastapi/fastapi/pull/13711) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
+* đ§ Update sponsors: add Subtotal. PR [#13701](https://github.com/fastapi/fastapi/pull/13701) by [@tiangolo](https://github.com/tiangolo).
+* đ§ Update sponsors: remove deepset / Haystack. PR [#13700](https://github.com/fastapi/fastapi/pull/13700) by [@tiangolo](https://github.com/tiangolo).
+* âŦ [pre-commit.ci] pre-commit autoupdate. PR [#13688](https://github.com/fastapi/fastapi/pull/13688) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
+* đĨ Update FastAPI People - Experts. PR [#13671](https://github.com/fastapi/fastapi/pull/13671) by [@tiangolo](https://github.com/tiangolo).
+* âŦ Bump typer from 0.12.5 to 0.15.3. PR [#13666](https://github.com/fastapi/fastapi/pull/13666) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* âŦ Bump sqlmodel from 0.0.23 to 0.0.24. PR [#13665](https://github.com/fastapi/fastapi/pull/13665) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* đ§ Update Sponsors: Zuplo logo and alt text. PR [#13645](https://github.com/fastapi/fastapi/pull/13645) by [@martyndavies](https://github.com/martyndavies).
+* đĨ Update FastAPI GitHub topic repositories. PR [#13667](https://github.com/fastapi/fastapi/pull/13667) by [@tiangolo](https://github.com/tiangolo).
+* đ§ Update links for LinkedIn and bottom. PR [#13669](https://github.com/fastapi/fastapi/pull/13669) by [@tiangolo](https://github.com/tiangolo).
+* đ§ Update sponsors: remove Bump.sh and Coherence. PR [#13668](https://github.com/fastapi/fastapi/pull/13668) by [@tiangolo](https://github.com/tiangolo).
+* đĨ Update FastAPI People - Sponsors. PR [#13664](https://github.com/fastapi/fastapi/pull/13664) by [@tiangolo](https://github.com/tiangolo).
+* đĨ Update FastAPI People - Contributors and Translators. PR [#13662](https://github.com/fastapi/fastapi/pull/13662) by [@tiangolo](https://github.com/tiangolo).
+* âŦ [pre-commit.ci] pre-commit autoupdate. PR [#13656](https://github.com/fastapi/fastapi/pull/13656) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
+* â
Use `inline-snapshot` to support different Pydantic versions in the test suite. PR [#12534](https://github.com/fastapi/fastapi/pull/12534) by [@15r10nk](https://github.com/15r10nk).
+* âŦ Bump astral-sh/setup-uv from 5 to 6. PR [#13648](https://github.com/fastapi/fastapi/pull/13648) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* âŦ [pre-commit.ci] pre-commit autoupdate. PR [#13634](https://github.com/fastapi/fastapi/pull/13634) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
+* âŦ [pre-commit.ci] pre-commit autoupdate. PR [#13619](https://github.com/fastapi/fastapi/pull/13619) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
+* âŦ [pre-commit.ci] pre-commit autoupdate. PR [#13594](https://github.com/fastapi/fastapi/pull/13594) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
+* đĨ Update FastAPI People - Experts. PR [#13568](https://github.com/fastapi/fastapi/pull/13568) by [@tiangolo](https://github.com/tiangolo).
+* đĨ Update FastAPI GitHub topic repositories. PR [#13565](https://github.com/fastapi/fastapi/pull/13565) by [@tiangolo](https://github.com/tiangolo).
+* đĨ Update FastAPI People - Sponsors. PR [#13559](https://github.com/fastapi/fastapi/pull/13559) by [@tiangolo](https://github.com/tiangolo).
+* đĨ Update FastAPI People - Contributors and Translators. PR [#13558](https://github.com/fastapi/fastapi/pull/13558) by [@tiangolo](https://github.com/tiangolo).
+* âŦ Bump dirty-equals from 0.8.0 to 0.9.0. PR [#13561](https://github.com/fastapi/fastapi/pull/13561) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* đ§ Clean up `docs/en/mkdocs.yml` configuration file. PR [#13542](https://github.com/fastapi/fastapi/pull/13542) by [@svlandeg](https://github.com/svlandeg).
+* âŦ [pre-commit.ci] pre-commit autoupdate. PR [#12986](https://github.com/fastapi/fastapi/pull/12986) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
+
+## 0.115.12
+
+### Fixes
+
+* đ Fix `convert_underscores=False` for header Pydantic models. PR [#13515](https://github.com/fastapi/fastapi/pull/13515) by [@tiangolo](https://github.com/tiangolo).
+
+### Docs
+
+* đ Update `docs/en/docs/tutorial/middleware.md`. PR [#13444](https://github.com/fastapi/fastapi/pull/13444) by [@Rishat-F](https://github.com/Rishat-F).
+* đĨ Update FastAPI People - Experts. PR [#13493](https://github.com/fastapi/fastapi/pull/13493) by [@tiangolo](https://github.com/tiangolo).
+
+### Translations
+
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/metadata.md` page. PR [#13459](https://github.com/fastapi/fastapi/pull/13459) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/response-status-code.md` page. PR [#13462](https://github.com/fastapi/fastapi/pull/13462) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/cookie-param-models.md` page. PR [#13460](https://github.com/fastapi/fastapi/pull/13460) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/header-param-models.md` page. PR [#13461](https://github.com/fastapi/fastapi/pull/13461) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Add Japanese translation for `docs/ja/docs/virtual-environments.md`. PR [#13304](https://github.com/fastapi/fastapi/pull/13304) by [@k94-ishi](https://github.com/k94-ishi).
+* đ Add Korean translation for `docs/ko/docs/tutorial/security/oauth2-jwt.md`. PR [#13333](https://github.com/fastapi/fastapi/pull/13333) by [@yes0ng](https://github.com/yes0ng).
+* đ Add Vietnamese translation for `docs/vi/docs/deployment/cloud.md`. PR [#13407](https://github.com/fastapi/fastapi/pull/13407) by [@ptt3199](https://github.com/ptt3199).
+
+### Internal
+
+* âŦ Bump pydantic-ai from 0.0.15 to 0.0.30. PR [#13438](https://github.com/fastapi/fastapi/pull/13438) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* âŦ Bump sqlmodel from 0.0.22 to 0.0.23. PR [#13437](https://github.com/fastapi/fastapi/pull/13437) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* âŦ Bump black from 24.10.0 to 25.1.0. PR [#13436](https://github.com/fastapi/fastapi/pull/13436) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* âŦ Bump ruff to 0.9.4. PR [#13299](https://github.com/fastapi/fastapi/pull/13299) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* đ§ Update sponsors: pause TestDriven. PR [#13446](https://github.com/fastapi/fastapi/pull/13446) by [@tiangolo](https://github.com/tiangolo).
+
+## 0.115.11
+
+### Fixes
+
+* đ Add docs examples and tests (support) for `Annotated` custom validations, like `AfterValidator`, revert [#13440](https://github.com/fastapi/fastapi/pull/13440). PR [#13442](https://github.com/fastapi/fastapi/pull/13442) by [@tiangolo](https://github.com/tiangolo).
+ * New docs: [Query Parameters and String Validations - Custom Validation](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#custom-validation).
+
+### Translations
+
+* đ Add Russian translation for `docs/ru/docs/tutorial/middleware.md`. PR [#13412](https://github.com/fastapi/fastapi/pull/13412) by [@alv2017](https://github.com/alv2017).
+
+### Internal
+
+* đĨ Update FastAPI GitHub topic repositories. PR [#13439](https://github.com/fastapi/fastapi/pull/13439) by [@tiangolo](https://github.com/tiangolo).
+* đĨ Update FastAPI People - Contributors and Translators. PR [#13432](https://github.com/fastapi/fastapi/pull/13432) by [@tiangolo](https://github.com/tiangolo).
+* đĨ Update FastAPI People - Sponsors. PR [#13433](https://github.com/fastapi/fastapi/pull/13433) by [@tiangolo](https://github.com/tiangolo).
+
+## 0.115.10
+
+### Fixes
+
+* âģī¸ Update internal annotation usage for compatibility with Pydantic 2.11. PR [#13314](https://github.com/fastapi/fastapi/pull/13314) by [@Viicos](https://github.com/Viicos).
+
+### Upgrades
+
+* âŦī¸ Bump Starlette to allow up to 0.46.0: `>=0.40.0,<0.47.0`. PR [#13426](https://github.com/fastapi/fastapi/pull/13426) by [@musicinmybrain](https://github.com/musicinmybrain).
+
+### Translations
+
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/debugging.md`. PR [#13370](https://github.com/fastapi/fastapi/pull/13370) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/query-params.md`. PR [#13362](https://github.com/fastapi/fastapi/pull/13362) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/path-params.md`. PR [#13354](https://github.com/fastapi/fastapi/pull/13354) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Add Japanese translation for `docs/ja/docs/tutorial/cookie-param-models.md`. PR [#13330](https://github.com/fastapi/fastapi/pull/13330) by [@k94-ishi](https://github.com/k94-ishi).
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/body-multiple-params.md`. PR [#13408](https://github.com/fastapi/fastapi/pull/13408) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Add Japanese translation for `docs/ja/docs/tutorial/query-param-models.md`. PR [#13323](https://github.com/fastapi/fastapi/pull/13323) by [@k94-ishi](https://github.com/k94-ishi).
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/body-nested-models.md`. PR [#13409](https://github.com/fastapi/fastapi/pull/13409) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Add Vietnamese translation for `docs/vi/docs/deployment/versions.md`. PR [#13406](https://github.com/fastapi/fastapi/pull/13406) by [@ptt3199](https://github.com/ptt3199).
+* đ Add Vietnamese translation for `docs/vi/docs/deployment/index.md`. PR [#13405](https://github.com/fastapi/fastapi/pull/13405) by [@ptt3199](https://github.com/ptt3199).
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/request-forms.md`. PR [#13383](https://github.com/fastapi/fastapi/pull/13383) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/testing.md`. PR [#13371](https://github.com/fastapi/fastapi/pull/13371) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+
+## 0.115.9
+
+### Fixes
+
+* đ Ensure that `HTTPDigest` only raises an exception when `auto_error is True`. PR [#2939](https://github.com/fastapi/fastapi/pull/2939) by [@arthurio](https://github.com/arthurio).
+
+### Refactors
+
+* â
Simplify tests for `query_params_str_validations`. PR [#13218](https://github.com/fastapi/fastapi/pull/13218) by [@alv2017](https://github.com/alv2017).
+* â
Simplify tests for `app_testing`. PR [#13220](https://github.com/fastapi/fastapi/pull/13220) by [@alv2017](https://github.com/alv2017).
+* â
Simplify tests for `dependency_testing`. PR [#13223](https://github.com/fastapi/fastapi/pull/13223) by [@alv2017](https://github.com/alv2017).
+
+### Docs
+
+* đą Update sponsors: CodeRabbit logo. PR [#13424](https://github.com/fastapi/fastapi/pull/13424) by [@tiangolo](https://github.com/tiangolo).
+* đŠē Unify the badges across all tutorial translations. PR [#13329](https://github.com/fastapi/fastapi/pull/13329) by [@svlandeg](https://github.com/svlandeg).
+* đ Fix typos in virtual environments documentation. PR [#13396](https://github.com/fastapi/fastapi/pull/13396) by [@bullet-ant](https://github.com/bullet-ant).
+* đ Fix issue with Swagger theme change example in the official tutorial. PR [#13289](https://github.com/fastapi/fastapi/pull/13289) by [@Zerohertz](https://github.com/Zerohertz).
+* đ Add more precise description of HTTP status code range in docs. PR [#13347](https://github.com/fastapi/fastapi/pull/13347) by [@DanielYang59](https://github.com/DanielYang59).
+* đĨ Remove manual type annotations in JWT tutorial to avoid typing expectations (JWT doesn't provide more types). PR [#13378](https://github.com/fastapi/fastapi/pull/13378) by [@tiangolo](https://github.com/tiangolo).
+* đ Update docs for Query Params and String Validations, remove obsolete Ellipsis docs (`...`). PR [#13377](https://github.com/fastapi/fastapi/pull/13377) by [@tiangolo](https://github.com/tiangolo).
+* âī¸ Remove duplicate title in docs `body-multiple-params`. PR [#13345](https://github.com/fastapi/fastapi/pull/13345) by [@DanielYang59](https://github.com/DanielYang59).
+* đ Fix test badge. PR [#13313](https://github.com/fastapi/fastapi/pull/13313) by [@esadek](https://github.com/esadek).
+
+### Translations
+
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/header-params.md`. PR [#13381](https://github.com/fastapi/fastapi/pull/13381) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/request-files.md`. PR [#13395](https://github.com/fastapi/fastapi/pull/13395) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/request-form-models.md`. PR [#13384](https://github.com/fastapi/fastapi/pull/13384) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/request-forms-and-files.md`. PR [#13386](https://github.com/fastapi/fastapi/pull/13386) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Update Korean translation for `docs/ko/docs/help-fastapi.md`. PR [#13262](https://github.com/fastapi/fastapi/pull/13262) by [@Zerohertz](https://github.com/Zerohertz).
+* đ Add Korean translation for `docs/ko/docs/advanced/custom-response.md`. PR [#13265](https://github.com/fastapi/fastapi/pull/13265) by [@11kkw](https://github.com/11kkw).
+* đ Update Korean translation for `docs/ko/docs/tutorial/security/simple-oauth2.md`. PR [#13335](https://github.com/fastapi/fastapi/pull/13335) by [@yes0ng](https://github.com/yes0ng).
+* đ Add Russian translation for `docs/ru/docs/advanced/response-cookies.md`. PR [#13327](https://github.com/fastapi/fastapi/pull/13327) by [@Stepakinoyan](https://github.com/Stepakinoyan).
+* đ Add Vietnamese translation for `docs/vi/docs/tutorial/static-files.md`. PR [#11291](https://github.com/fastapi/fastapi/pull/11291) by [@ptt3199](https://github.com/ptt3199).
+* đ Add Korean translation for `docs/ko/docs/tutorial/dependencies/dependencies-with-yield.md`. PR [#13257](https://github.com/fastapi/fastapi/pull/13257) by [@11kkw](https://github.com/11kkw).
+* đ Add Vietnamese translation for `docs/vi/docs/virtual-environments.md`. PR [#13282](https://github.com/fastapi/fastapi/pull/13282) by [@ptt3199](https://github.com/ptt3199).
+* đ Add Ukrainian translation for `docs/uk/docs/tutorial/static-files.md`. PR [#13285](https://github.com/fastapi/fastapi/pull/13285) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Add Vietnamese translation for `docs/vi/docs/environment-variables.md`. PR [#13287](https://github.com/fastapi/fastapi/pull/13287) by [@ptt3199](https://github.com/ptt3199).
+* đ Add Vietnamese translation for `docs/vi/docs/fastapi-cli.md`. PR [#13294](https://github.com/fastapi/fastapi/pull/13294) by [@ptt3199](https://github.com/ptt3199).
+* đ Add Ukrainian translation for `docs/uk/docs/features.md`. PR [#13308](https://github.com/fastapi/fastapi/pull/13308) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Add Ukrainian translation for `docs/uk/docs/learn/index.md`. PR [#13306](https://github.com/fastapi/fastapi/pull/13306) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
+* đ Update Portuguese Translation for `docs/pt/docs/deployment/https.md`. PR [#13317](https://github.com/fastapi/fastapi/pull/13317) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda).
+* đ Update Portuguese Translation for `docs/pt/docs/index.md`. PR [#13328](https://github.com/fastapi/fastapi/pull/13328) by [@ceb10n](https://github.com/ceb10n).
+* đ Add Russian translation for `docs/ru/docs/advanced/websockets.md`. PR [#13279](https://github.com/fastapi/fastapi/pull/13279) by [@Rishat-F](https://github.com/Rishat-F).
+
+### Internal
+
+* â
Fix a minor bug in the test `tests/test_modules_same_name_body/test_main.py`. PR [#13411](https://github.com/fastapi/fastapi/pull/13411) by [@alv2017](https://github.com/alv2017).
+* đˇ Use `wrangler-action` v3. PR [#13415](https://github.com/fastapi/fastapi/pull/13415) by [@joakimnordling](https://github.com/joakimnordling).
+* đ§ Update sponsors: add CodeRabbit. PR [#13402](https://github.com/fastapi/fastapi/pull/13402) by [@tiangolo](https://github.com/tiangolo).
+* đ§ Update team: Add Ludovico. PR [#13390](https://github.com/fastapi/fastapi/pull/13390) by [@tiangolo](https://github.com/tiangolo).
+* đ§ Update sponsors: Add LambdaTest. PR [#13389](https://github.com/fastapi/fastapi/pull/13389) by [@tiangolo](https://github.com/tiangolo).
+* âŦ Bump cloudflare/wrangler-action from 3.13 to 3.14. PR [#13350](https://github.com/fastapi/fastapi/pull/13350) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* âŦ Bump mkdocs-material from 9.5.18 to 9.6.1. PR [#13301](https://github.com/fastapi/fastapi/pull/13301) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* âŦ Bump pillow from 11.0.0 to 11.1.0. PR [#13300](https://github.com/fastapi/fastapi/pull/13300) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* đĨ Update FastAPI People - Sponsors. PR [#13295](https://github.com/fastapi/fastapi/pull/13295) by [@tiangolo](https://github.com/tiangolo).
+* đĨ Update FastAPI People - Experts. PR [#13303](https://github.com/fastapi/fastapi/pull/13303) by [@tiangolo](https://github.com/tiangolo).
+* đĨ Update FastAPI GitHub topic repositories. PR [#13302](https://github.com/fastapi/fastapi/pull/13302) by [@tiangolo](https://github.com/tiangolo).
+* đĨ Update FastAPI People - Contributors and Translators. PR [#13293](https://github.com/fastapi/fastapi/pull/13293) by [@tiangolo](https://github.com/tiangolo).
+* âŦ Bump inline-snapshot from 0.18.1 to 0.19.3. PR [#13298](https://github.com/fastapi/fastapi/pull/13298) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* đ§ Update sponsors, add Permit. PR [#13288](https://github.com/fastapi/fastapi/pull/13288) by [@tiangolo](https://github.com/tiangolo).
+
+## 0.115.8
+
+### Fixes
+
+* đ Fix `OAuth2PasswordRequestForm` and `OAuth2PasswordRequestFormStrict` fixed `grant_type` "password" RegEx. PR [#9783](https://github.com/fastapi/fastapi/pull/9783) by [@skarfie123](https://github.com/skarfie123).
+
+### Refactors
+
+* â
Simplify tests for body_multiple_params . PR [#13237](https://github.com/fastapi/fastapi/pull/13237) by [@alejsdev](https://github.com/alejsdev).
+* âģī¸ Move duplicated code portion to a static method in the `APIKeyBase` super class. PR [#3142](https://github.com/fastapi/fastapi/pull/3142) by [@ShahriyarR](https://github.com/ShahriyarR).
+* â
Simplify tests for request_files. PR [#13182](https://github.com/fastapi/fastapi/pull/13182) by [@alejsdev](https://github.com/alejsdev).
+
+### Docs
+
+* đ Change the word "unwrap" to "unpack" in `docs/en/docs/tutorial/extra-models.md`. PR [#13061](https://github.com/fastapi/fastapi/pull/13061) by [@timothy-jeong](https://github.com/timothy-jeong).
+* đ Update Request Body's `tutorial002` to deal with `tax=0` case. PR [#13230](https://github.com/fastapi/fastapi/pull/13230) by [@togogh](https://github.com/togogh).
* đĨ Update FastAPI People - Experts. PR [#13269](https://github.com/fastapi/fastapi/pull/13269) by [@tiangolo](https://github.com/tiangolo).
### Translations
@@ -20,6 +377,7 @@ hide:
### Internal
+* âŦī¸ Add support for Python 3.13. PR [#13274](https://github.com/fastapi/fastapi/pull/13274) by [@tiangolo](https://github.com/tiangolo).
* âŦī¸ Upgrade AnyIO max version for tests, new range: `>=3.2.1,<5.0.0`. PR [#13273](https://github.com/fastapi/fastapi/pull/13273) by [@tiangolo](https://github.com/tiangolo).
* đ§ Update Sponsors badges. PR [#13271](https://github.com/fastapi/fastapi/pull/13271) by [@tiangolo](https://github.com/tiangolo).
* âģī¸ Fix `notify_translations.py` empty env var handling for PR label events vs workflow_dispatch. PR [#13272](https://github.com/fastapi/fastapi/pull/13272) by [@tiangolo](https://github.com/tiangolo).
diff --git a/docs/en/docs/tutorial/bigger-applications.md b/docs/en/docs/tutorial/bigger-applications.md
index 605ced0d3..f5f29a173 100644
--- a/docs/en/docs/tutorial/bigger-applications.md
+++ b/docs/en/docs/tutorial/bigger-applications.md
@@ -52,7 +52,7 @@ from app.routers import items
* There's also a subdirectory `app/internal/` with another file `__init__.py`, so it's another "Python subpackage": `app.internal`.
* And the file `app/internal/admin.py` is another submodule: `app.internal.admin`.
-
+
The same file structure with comments:
@@ -270,7 +270,7 @@ But that file doesn't exist, our dependencies are in a file at `app/dependencies
Remember how our app/file structure looks like:
-
+
---
diff --git a/docs/en/docs/tutorial/body-multiple-params.md b/docs/en/docs/tutorial/body-multiple-params.md
index 9fced9652..71b308bb4 100644
--- a/docs/en/docs/tutorial/body-multiple-params.md
+++ b/docs/en/docs/tutorial/body-multiple-params.md
@@ -10,8 +10,6 @@ And you can also declare body parameters as optional, by setting the default to
{* ../../docs_src/body_multiple_params/tutorial001_an_py310.py hl[18:20] *}
-## Multiple body parameters
-
/// note
Notice that, in this case, the `item` that would be taken from the body is optional. As it has a `None` default value.
diff --git a/docs/en/docs/tutorial/cors.md b/docs/en/docs/tutorial/cors.md
index cf31cfcf5..5ca4437b3 100644
--- a/docs/en/docs/tutorial/cors.md
+++ b/docs/en/docs/tutorial/cors.md
@@ -57,7 +57,10 @@ The following arguments are supported:
* `allow_origin_regex` - A regex string to match against origins that should be permitted to make cross-origin requests. e.g. `'https://.*\.example\.org'`.
* `allow_methods` - A list of HTTP methods that should be allowed for cross-origin requests. Defaults to `['GET']`. You can use `['*']` to allow all standard methods.
* `allow_headers` - A list of HTTP request headers that should be supported for cross-origin requests. Defaults to `[]`. You can use `['*']` to allow all headers. The `Accept`, `Accept-Language`, `Content-Language` and `Content-Type` headers are always allowed for simple CORS requests .
-* `allow_credentials` - Indicate that cookies should be supported for cross-origin requests. Defaults to `False`. Also, `allow_origins` cannot be set to `['*']` for credentials to be allowed, origins must be specified.
+* `allow_credentials` - Indicate that cookies should be supported for cross-origin requests. Defaults to `False`.
+
+ None of `allow_origins`, `allow_methods` and `allow_headers` can be set to `['*']` if `allow_credentials` is set to `True`. All of them must be explicitly specified .
+
* `expose_headers` - Indicate any response headers that should be made accessible to the browser. Defaults to `[]`.
* `max_age` - Sets a maximum time in seconds for browsers to cache CORS responses. Defaults to `600`.
diff --git a/docs/en/docs/tutorial/extra-models.md b/docs/en/docs/tutorial/extra-models.md
index 5fac3f69e..ed1590ece 100644
--- a/docs/en/docs/tutorial/extra-models.md
+++ b/docs/en/docs/tutorial/extra-models.md
@@ -70,9 +70,9 @@ we would get a Python `dict` with:
}
```
-#### Unwrapping a `dict`
+#### Unpacking a `dict`
-If we take a `dict` like `user_dict` and pass it to a function (or class) with `**user_dict`, Python will "unwrap" it. It will pass the keys and values of the `user_dict` directly as key-value arguments.
+If we take a `dict` like `user_dict` and pass it to a function (or class) with `**user_dict`, Python will "unpack" it. It will pass the keys and values of the `user_dict` directly as key-value arguments.
So, continuing with the `user_dict` from above, writing:
@@ -117,11 +117,11 @@ would be equivalent to:
UserInDB(**user_in.dict())
```
-...because `user_in.dict()` is a `dict`, and then we make Python "unwrap" it by passing it to `UserInDB` prefixed with `**`.
+...because `user_in.dict()` is a `dict`, and then we make Python "unpack" it by passing it to `UserInDB` prefixed with `**`.
So, we get a Pydantic model from the data in another Pydantic model.
-#### Unwrapping a `dict` and extra keywords
+#### Unpacking a `dict` and extra keywords
And then adding the extra keyword argument `hashed_password=hashed_password`, like in:
diff --git a/docs/en/docs/tutorial/handling-errors.md b/docs/en/docs/tutorial/handling-errors.md
index 4d969747f..5b8e677e4 100644
--- a/docs/en/docs/tutorial/handling-errors.md
+++ b/docs/en/docs/tutorial/handling-errors.md
@@ -35,7 +35,7 @@ Because it's a Python exception, you don't `return` it, you `raise` it.
This also means that if you are inside a utility function that you are calling inside of your *path operation function*, and you raise the `HTTPException` from inside of that utility function, it won't run the rest of the code in the *path operation function*, it will terminate that request right away and send the HTTP error from the `HTTPException` to the client.
-The benefit of raising an exception over `return`ing a value will be more evident in the section about Dependencies and Security.
+The benefit of raising an exception over returning a value will be more evident in the section about Dependencies and Security.
In this example, when the client requests an item by an ID that doesn't exist, raise an exception with a status code of `404`:
@@ -252,4 +252,4 @@ If you want to use the exception along with the same default exception handlers
{* ../../docs_src/handling_errors/tutorial006.py hl[2:5,15,21] *}
-In this example you are just `print`ing the error with a very expressive message, but you get the idea. You can use the exception and then just reuse the default exception handlers.
+In this example you are just printing the error with a very expressive message, but you get the idea. You can use the exception and then just reuse the default exception handlers.
diff --git a/docs/en/docs/tutorial/header-param-models.md b/docs/en/docs/tutorial/header-param-models.md
index 73950a668..4cdf09705 100644
--- a/docs/en/docs/tutorial/header-param-models.md
+++ b/docs/en/docs/tutorial/header-param-models.md
@@ -51,6 +51,22 @@ For example, if the client tries to send a `tool` header with a value of `plumbu
}
```
+## Disable Convert Underscores
+
+The same way as with regular header parameters, when you have underscore characters in the parameter names, they are **automatically converted to hyphens**.
+
+For example, if you have a header parameter `save_data` in the code, the expected HTTP header will be `save-data`, and it will show up like that in the docs.
+
+If for some reason you need to disable this automatic conversion, you can do it as well for Pydantic models for header parameters.
+
+{* ../../docs_src/header_param_models/tutorial003_an_py310.py hl[19] *}
+
+/// warning
+
+Before setting `convert_underscores` to `False`, bear in mind that some HTTP proxies and servers disallow the usage of headers with underscores.
+
+///
+
## Summary
You can use **Pydantic models** to declare **headers** in **FastAPI**. đ
diff --git a/docs/en/docs/tutorial/index.md b/docs/en/docs/tutorial/index.md
index 4fe38256c..17f6fb685 100644
--- a/docs/en/docs/tutorial/index.md
+++ b/docs/en/docs/tutorial/index.md
@@ -76,10 +76,12 @@ $ pip install "fastapi[standard]"
/// note
-When you install with `pip install "fastapi[standard]"` it comes with some default optional standard dependencies.
+When you install with `pip install "fastapi[standard]"` it comes with some default optional standard dependencies, including `fastapi-cloud-cli`, which allows you to deploy to FastAPI Cloud .
If you don't want to have those optional dependencies, you can instead install `pip install fastapi`.
+If you want to install the standard dependencies but without the `fastapi-cloud-cli`, you can install with `pip install "fastapi[standard-no-fastapi-cloud-cli]"`.
+
///
## Advanced User Guide
diff --git a/docs/en/docs/tutorial/middleware.md b/docs/en/docs/tutorial/middleware.md
index 53c47a085..b7c03a319 100644
--- a/docs/en/docs/tutorial/middleware.md
+++ b/docs/en/docs/tutorial/middleware.md
@@ -15,7 +15,7 @@ A "middleware" is a function that works with every **request** before it is proc
If you have dependencies with `yield`, the exit code will run *after* the middleware.
-If there were any background tasks (documented later), they will run *after* all the middleware.
+If there were any background tasks (covered in the [Background Tasks](background-tasks.md){.internal-link target=_blank} section, you will see it later), they will run *after* all the middleware.
///
@@ -65,6 +65,29 @@ Here we use ../../docs_src/query_params_str_validations/tutorial002_an_py310.py!}
-```
-
-////
-
-//// tab | Python 3.8+
-
-In versions of Python below Python 3.9 you import `Annotated` from `typing_extensions`.
-
-It will already be installed with FastAPI.
-
-```Python hl_lines="3-4"
-{!> ../../docs_src/query_params_str_validations/tutorial002_an.py!}
-```
-
-////
+{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
/// info
@@ -145,54 +125,23 @@ As in this case (without using `Annotated`) we have to replace the default value
So:
-```Python
-q: Union[str, None] = Query(default=None)
-```
-
-...makes the parameter optional, with a default value of `None`, the same as:
-
-```Python
-q: Union[str, None] = None
-```
-
-And in Python 3.10 and above:
-
```Python
q: str | None = Query(default=None)
```
...makes the parameter optional, with a default value of `None`, the same as:
-```Python
-q: str | None = None
-```
-
-But the `Query` versions declare it explicitly as being a query parameter.
-
-/// info
-
-Keep in mind that the most important part to make a parameter optional is the part:
```Python
-= None
-```
-
-or the:
-
-```Python
-= Query(default=None)
+q: str | None = None
```
-as it will use that `None` as the default value, and that way make the parameter **not required**.
-
-The `Union[str, None]` part allows your editor to provide better support, but it is not what tells FastAPI that this parameter is not required.
-
-///
+But the `Query` version declares it explicitly as being a query parameter.
Then, we can pass more parameters to `Query`. In this case, the `max_length` parameter that applies to strings:
```Python
-q: Union[str, None] = Query(default=None, max_length=50)
+q: str | None = Query(default=None, max_length=50)
```
This will validate the data, show a clear error when the data is not valid, and document the parameter in the OpenAPI schema *path operation*.
@@ -201,7 +150,7 @@ This will validate the data, show a clear error when the data is not valid, and
Keep in mind that when using `Query` inside of `Annotated` you cannot use the `default` parameter for `Query`.
-Instead use the actual default value of the function parameter. Otherwise, it would be inconsistent.
+Instead, use the actual default value of the function parameter. Otherwise, it would be inconsistent.
For example, this is not allowed:
@@ -255,7 +204,7 @@ This specific regular expression pattern checks that the received parameter valu
If you feel lost with all these **"regular expression"** ideas, don't worry. They are a hard topic for many people. You can still do a lot of stuff without needing regular expressions yet.
-But whenever you need them and go and learn them, know that you can already use them directly in **FastAPI**.
+Now you know that whenever you need them you can use them in **FastAPI**.
### Pydantic v1 `regex` instead of `pattern`
@@ -296,7 +245,7 @@ q: str
instead of:
```Python
-q: Union[str, None] = None
+q: str | None = None
```
But we are now declaring it with `Query`, for example like:
@@ -304,15 +253,7 @@ But we are now declaring it with `Query`, for example like:
//// tab | Annotated
```Python
-q: Annotated[Union[str, None], Query(min_length=3)] = None
-```
-
-////
-
-//// tab | non-Annotated
-
-```Python
-q: Union[str, None] = Query(default=None, min_length=3)
+q: Annotated[str | None, Query(min_length=3)] = None
```
////
@@ -321,42 +262,14 @@ So, when you need to declare a value as required while using `Query`, you can si
{* ../../docs_src/query_params_str_validations/tutorial006_an_py39.py hl[9] *}
-### Required with Ellipsis (`...`)
-
-There's an alternative way to explicitly declare that a value is required. You can set the default to the literal value `...`:
-
-{* ../../docs_src/query_params_str_validations/tutorial006b_an_py39.py hl[9] *}
-
-/// info
-
-If you hadn't seen that `...` before: it is a special single value, it is part of Python and is called "Ellipsis" .
-
-It is used by Pydantic and FastAPI to explicitly declare that a value is required.
-
-///
-
-This will let **FastAPI** know that this parameter is required.
-
### Required, can be `None`
You can declare that a parameter can accept `None`, but that it's still required. This would force clients to send a value, even if the value is `None`.
-To do that, you can declare that `None` is a valid type but still use `...` as the default:
+To do that, you can declare that `None` is a valid type but simply do not declare a default value:
{* ../../docs_src/query_params_str_validations/tutorial006c_an_py310.py hl[9] *}
-/// tip
-
-Pydantic, which is what powers all the data validation and serialization in FastAPI, has a special behavior when you use `Optional` or `Union[Something, None]` without a default value, you can read more about it in the Pydantic docs about Required fields .
-
-///
-
-/// tip
-
-Remember that in most of the cases, when something is required, you can simply omit the default, so you normally don't have to use `...`.
-
-///
-
## Query parameter list / multiple values
When you define a query parameter explicitly with `Query` you can also declare it to receive a list of values, or said in another way, to receive multiple values.
@@ -396,7 +309,7 @@ The interactive API docs will update accordingly, to allow multiple values:
### Query parameter list / multiple values with defaults
-And you can also define a default `list` of values if none are provided:
+You can also define a default `list` of values if none are provided:
{* ../../docs_src/query_params_str_validations/tutorial012_an_py39.py hl[9] *}
@@ -419,7 +332,7 @@ the default of `q` will be: `["foo", "bar"]` and your response will be:
#### Using just `list`
-You can also use `list` directly instead of `List[str]` (or `list[str]` in Python 3.9+):
+You can also use `list` directly instead of `list[str]`:
{* ../../docs_src/query_params_str_validations/tutorial013_an_py39.py hl[9] *}
@@ -427,7 +340,7 @@ You can also use `list` directly instead of `List[str]` (or `list[str]` in Pytho
Keep in mind that in this case, FastAPI won't check the contents of the list.
-For example, `List[int]` would check (and document) that the contents of the list are integers. But `list` alone wouldn't.
+For example, `list[int]` would check (and document) that the contents of the list are integers. But `list` alone wouldn't.
///
@@ -493,6 +406,68 @@ To exclude a query parameter from the generated OpenAPI schema (and thus, from t
{* ../../docs_src/query_params_str_validations/tutorial014_an_py310.py hl[10] *}
+## Custom Validation
+
+There could be cases where you need to do some **custom validation** that can't be done with the parameters shown above.
+
+In those cases, you can use a **custom validator function** that is applied after the normal validation (e.g. after validating that the value is a `str`).
+
+You can achieve that using Pydantic's `AfterValidator` inside of `Annotated`.
+
+/// tip
+
+Pydantic also has `BeforeValidator` and others. đ¤
+
+///
+
+For example, this custom validator checks that the item ID starts with `isbn-` for an ISBN book number or with `imdb-` for an IMDB movie URL ID:
+
+{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
+
+/// info
+
+This is available with Pydantic version 2 or above. đ
+
+///
+
+/// tip
+
+If you need to do any type of validation that requires communicating with any **external component**, like a database or another API, you should instead use **FastAPI Dependencies**, you will learn about them later.
+
+These custom validators are for things that can be checked with **only** the **same data** provided in the request.
+
+///
+
+### Understand that Code
+
+The important point is just using **`AfterValidator` with a function inside `Annotated`**. Feel free to skip this part. đ¤¸
+
+---
+
+But if you're curious about this specific code example and you're still entertained, here are some extra details.
+
+#### String with `value.startswith()`
+
+Did you notice? a string using `value.startswith()` can take a tuple, and it will check each value in the tuple:
+
+{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[16:19] hl[17] *}
+
+#### A Random Item
+
+With `data.items()` we get an iterable object with tuples containing the key and value for each dictionary item.
+
+We convert this iterable object into a proper `list` with `list(data.items())`.
+
+Then with `random.choice()` we can get a **random value** from the list, so, we get a tuple with `(id, name)`. It will be something like `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`.
+
+Then we **assign those two values** of the tuple to the variables `id` and `name`.
+
+So, if the user didn't provide an item ID, they will still receive a random suggestion.
+
+...we do all this in a **single simple line**. đ¤¯ Don't you love Python? đ
+
+{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[22:30] hl[29] *}
+
## Recap
You can declare additional validations and metadata for your parameters.
@@ -510,6 +485,8 @@ Validations specific for strings:
* `max_length`
* `pattern`
+Custom validations using `AfterValidator`.
+
In these examples you saw how to declare validations for `str` values.
See the next chapters to learn how to declare validations for other types, like numbers.
diff --git a/docs/en/docs/tutorial/response-status-code.md b/docs/en/docs/tutorial/response-status-code.md
index 711042a46..41bf02a8f 100644
--- a/docs/en/docs/tutorial/response-status-code.md
+++ b/docs/en/docs/tutorial/response-status-code.md
@@ -53,16 +53,16 @@ These status codes have a name associated to recognize them, but the important p
In short:
-* `100` and above are for "Information". You rarely use them directly. Responses with these status codes cannot have a body.
-* **`200`** and above are for "Successful" responses. These are the ones you would use the most.
+* `100 - 199` are for "Information". You rarely use them directly. Responses with these status codes cannot have a body.
+* **`200 - 299`** are for "Successful" responses. These are the ones you would use the most.
* `200` is the default status code, which means everything was "OK".
* Another example would be `201`, "Created". It is commonly used after creating a new record in the database.
* A special case is `204`, "No Content". This response is used when there is no content to return to the client, and so the response must not have a body.
-* **`300`** and above are for "Redirection". Responses with these status codes may or may not have a body, except for `304`, "Not Modified", which must not have one.
-* **`400`** and above are for "Client error" responses. These are the second type you would probably use the most.
+* **`300 - 399`** are for "Redirection". Responses with these status codes may or may not have a body, except for `304`, "Not Modified", which must not have one.
+* **`400 - 499`** are for "Client error" responses. These are the second type you would probably use the most.
* An example is `404`, for a "Not Found" response.
* For generic errors from the client, you can just use `400`.
-* `500` and above are for server errors. You almost never use them directly. When something goes wrong at some part in your application code, or server, it will automatically return one of these status codes.
+* `500 - 599` are for server errors. You almost never use them directly. When something goes wrong at some part in your application code, or server, it will automatically return one of these status codes.
/// tip
diff --git a/docs/en/docs/virtual-environments.md b/docs/en/docs/virtual-environments.md
index b75be18c3..4f65b3b80 100644
--- a/docs/en/docs/virtual-environments.md
+++ b/docs/en/docs/virtual-environments.md
@@ -668,7 +668,7 @@ After activating the virtual environment, the `PATH` variable would look somethi
/home/user/code/awesome-project/.venv/bin:/usr/bin:/bin:/usr/sbin:/sbin
```
-That means that the system will now start looking first look for programs in:
+That means that the system will now start looking first for programs in:
```plaintext
/home/user/code/awesome-project/.venv/bin
@@ -692,7 +692,7 @@ and use that one.
C:\Users\user\code\awesome-project\.venv\Scripts;C:\Windows\System32
```
-That means that the system will now start looking first look for programs in:
+That means that the system will now start looking first for programs in:
```plaintext
C:\Users\user\code\awesome-project\.venv\Scripts
diff --git a/docs/en/mkdocs.yml b/docs/en/mkdocs.yml
index e9a639d0b..8a5ea13e0 100644
--- a/docs/en/mkdocs.yml
+++ b/docs/en/mkdocs.yml
@@ -6,7 +6,7 @@ theme:
name: material
custom_dir: ../en/overrides
palette:
- - media: "(prefers-color-scheme)"
+ - media: (prefers-color-scheme)
toggle:
icon: material/lightbulb-auto
name: Switch to light mode
@@ -27,7 +27,6 @@ theme:
features:
- content.code.annotate
- content.code.copy
- # - content.code.select
- content.footnote.tooltips
- content.tabs.link
- content.tooltips
@@ -35,7 +34,6 @@ theme:
- navigation.indexes
- navigation.instant
- navigation.instant.prefetch
- # - navigation.instant.preview
- navigation.instant.progress
- navigation.path
- navigation.tabs
@@ -46,7 +44,6 @@ theme:
- search.share
- search.suggest
- toc.follow
-
icon:
repo: fontawesome/brands/github-alt
logo: img/icon-white.svg
@@ -55,11 +52,7 @@ theme:
repo_name: fastapi/fastapi
repo_url: https://github.com/fastapi/fastapi
plugins:
- # Material for MkDocs
- search:
- # Configured in mkdocs.insiders.yml
- # social:
- # Other plugins
+ search: null
macros:
include_yaml:
- external_links: ../en/data/external_links.yml
@@ -103,7 +96,6 @@ plugins:
signature_crossrefs: true
show_symbol_type_heading: true
show_symbol_type_toc: true
-
nav:
- FastAPI: index.md
- features.md
@@ -258,33 +250,27 @@ nav:
- benchmarks.md
- management.md
- release-notes.md
-
markdown_extensions:
- # Python Markdown
- abbr:
- attr_list:
- footnotes:
- md_in_html:
- tables:
+ abbr: null
+ attr_list: null
+ footnotes: null
+ md_in_html: null
+ tables: null
toc:
permalink: true
-
- # Python Markdown Extensions
- pymdownx.betterem:
- pymdownx.caret:
+ pymdownx.betterem: null
+ pymdownx.caret: null
pymdownx.highlight:
line_spans: __span
- pymdownx.inlinehilite:
- pymdownx.keys:
- pymdownx.mark:
+ pymdownx.inlinehilite: null
+ pymdownx.keys: null
+ pymdownx.mark: null
pymdownx.superfences:
custom_fences:
- name: mermaid
class: mermaid
- format: !!python/name:pymdownx.superfences.fence_code_format
- pymdownx.tilde:
-
- # pymdownx blocks
+ format: !!python/name:pymdownx.superfences.fence_code_format ''
+ pymdownx.tilde: null
pymdownx.blocks.admonition:
types:
- note
@@ -295,34 +281,14 @@ markdown_extensions:
- tip
- hint
- warning
- # Custom types
- info
- check
- pymdownx.blocks.details:
+ pymdownx.blocks.details: null
pymdownx.blocks.tab:
- alternate_style: True
-
- # Other extensions
- mdx_include:
- markdown_include_variants:
-
+ alternate_style: true
+ mdx_include: null
+ markdown_include_variants: null
extra:
- analytics:
- provider: google
- property: G-YNEVN69SC3
- feedback:
- title: Was this page helpful?
- ratings:
- - icon: material/emoticon-happy-outline
- name: This page was helpful
- data: 1
- note: >-
- Thanks for your feedback!
- - icon: material/emoticon-sad-outline
- name: This page could be improved
- data: 0
- note: >-
- Thanks for your feedback!
social:
- icon: fontawesome/brands/github-alt
link: https://github.com/fastapi/fastapi
@@ -331,14 +297,9 @@ extra:
- icon: fontawesome/brands/twitter
link: https://twitter.com/fastapi
- icon: fontawesome/brands/linkedin
- link: https://www.linkedin.com/in/tiangolo
- - icon: fontawesome/brands/dev
- link: https://dev.to/tiangolo
- - icon: fontawesome/brands/medium
- link: https://medium.com/@tiangolo
+ link: https://www.linkedin.com/company/fastapi
- icon: fontawesome/solid/globe
link: https://tiangolo.com
-
alternate:
- link: /
name: en - English
@@ -390,14 +351,11 @@ extra:
name: zh-hant - įšéĢ䏿
- link: /em/
name: đ
-
extra_css:
- css/termynal.css
- css/custom.css
-
extra_javascript:
- js/termynal.js
- js/custom.js
-
hooks:
- ../../scripts/mkdocs_hooks.py
diff --git a/docs/en/overrides/main.html b/docs/en/overrides/main.html
index b58ed8818..12585507d 100644
--- a/docs/en/overrides/main.html
+++ b/docs/en/overrides/main.html
@@ -10,6 +10,13 @@
Follow @fastapi on Twitter to stay updated
+
-
diff --git a/docs/es/docs/advanced/generate-clients.md b/docs/es/docs/advanced/generate-clients.md
index bf2e5cb4f..b664bceac 100644
--- a/docs/es/docs/advanced/generate-clients.md
+++ b/docs/es/docs/advanced/generate-clients.md
@@ -22,7 +22,7 @@ Y muestra su verdadero compromiso con FastAPI y su **comunidad** (tÃē), ya que n
Por ejemplo, podrÃas querer probar:
-* Speakeasy
+* Speakeasy
* Stainless
* liblab
diff --git a/docs/es/docs/deployment/concepts.md b/docs/es/docs/deployment/concepts.md
index f5725c5dc..bcc7948bc 100644
--- a/docs/es/docs/deployment/concepts.md
+++ b/docs/es/docs/deployment/concepts.md
@@ -216,7 +216,7 @@ Este Proceso Administrador probablemente serÃa el que escuche en el **puerto**
Esos worker processes serÃan los que ejecutan tu aplicaciÃŗn, realizarÃan los cÃĄlculos principales para recibir un **request** y devolver un **response**, y cargarÃan cualquier cosa que pongas en variables en RAM.
-
+
Y por supuesto, la misma mÃĄquina probablemente tendrÃa **otros procesos** ejecutÃĄndose tambiÊn, aparte de tu aplicaciÃŗn.
diff --git a/docs/es/docs/deployment/docker.md b/docs/es/docs/deployment/docker.md
index ff204f078..3a39d3661 100644
--- a/docs/es/docs/deployment/docker.md
+++ b/docs/es/docs/deployment/docker.md
@@ -6,7 +6,7 @@ Usar contenedores de Linux tiene varias ventajas, incluyendo **seguridad**, **re
/// tip | Consejo
-ÂŋTienes prisa y ya conoces esto? Salta al [`Dockerfile` mÃĄs abajo đ](#build-a-docker-image-for-fastapi).
+ÂŋTienes prisa y ya conoces esto? Salta al [`Dockerfile` mÃĄs abajo đ](#construir-una-imagen-de-docker-para-fastapi).
///
diff --git a/docs/es/docs/deployment/https.md b/docs/es/docs/deployment/https.md
index f2871ac03..3ccb5dc47 100644
--- a/docs/es/docs/deployment/https.md
+++ b/docs/es/docs/deployment/https.md
@@ -85,7 +85,7 @@ Primero, el navegador consultarÃa con los **servidores DNS** cuÃĄl es la **IP d
Los servidores DNS le dirÃan al navegador que use una **direcciÃŗn IP** especÃfica. Esa serÃa la direcciÃŗn IP pÃēblica utilizada por tu servidor, que configuraste en los servidores DNS.
-
+
### Inicio del Handshake TLS
@@ -93,7 +93,7 @@ El navegador luego se comunicarÃa con esa direcciÃŗn IP en el **puerto 443** (e
La primera parte de la comunicaciÃŗn es solo para establecer la conexiÃŗn entre el cliente y el servidor y decidir las claves criptogrÃĄficas que usarÃĄn, etc.
-
+
Esta interacciÃŗn entre el cliente y el servidor para establecer la conexiÃŗn TLS se llama **handshake TLS**.
@@ -111,7 +111,7 @@ Usando la **extensiÃŗn SNI** discutida anteriormente, el TLS Termination Proxy v
En este caso, usarÃa el certificado para `someapp.example.com`.
-
+
El cliente ya **confÃa** en la entidad que generÃŗ ese certificado TLS (en este caso Let's Encrypt, pero lo veremos mÃĄs adelante), por lo que puede **verificar** que el certificado sea vÃĄlido.
@@ -133,19 +133,19 @@ Ahora que el cliente y el servidor (especÃficamente el navegador y el TLS Termi
Asà que, el cliente envÃa un **request HTTPS**. Esto es simplemente un request HTTP a travÊs de una conexiÃŗn TLS encriptada.
-
+
### Desencriptar el Request
El TLS Termination Proxy usarÃa la encriptaciÃŗn acordada para **desencriptar el request**, y transmitirÃa el **request HTTP simple (desencriptado)** al proceso que ejecuta la aplicaciÃŗn (por ejemplo, un proceso con Uvicorn ejecutando la aplicaciÃŗn FastAPI).
-
+
### Response HTTP
La aplicaciÃŗn procesarÃa el request y enviarÃa un **response HTTP simple (sin encriptar)** al TLS Termination Proxy.
-
+
### Response HTTPS
@@ -153,7 +153,7 @@ El TLS Termination Proxy entonces **encriptarÃa el response** usando la criptog
Luego, el navegador verificarÃa que el response sea vÃĄlido y encriptado con la clave criptogrÃĄfica correcta, etc. Entonces **desencriptarÃa el response** y lo procesarÃa.
-
+
El cliente (navegador) sabrÃĄ que el response proviene del servidor correcto porque estÃĄ utilizando la criptografÃa que acordaron usando el **certificado HTTPS** anteriormente.
@@ -163,7 +163,7 @@ En el mismo servidor (o servidores), podrÃan haber **mÃēltiples aplicaciones**,
Solo un proceso puede estar gestionando la IP y puerto especÃfica (el TLS Termination Proxy en nuestro ejemplo) pero las otras aplicaciones/procesos pueden estar ejecutÃĄndose en el/los servidor(es) tambiÊn, siempre y cuando no intenten usar la misma **combinaciÃŗn de IP pÃēblica y puerto**.
-
+
De esa manera, el TLS Termination Proxy podrÃa gestionar HTTPS y certificados para **mÃēltiples dominios**, para mÃēltiples aplicaciones, y luego transmitir los requests a la aplicaciÃŗn correcta en cada caso.
@@ -173,7 +173,7 @@ En algÃēn momento en el futuro, cada certificado **expirarÃa** (alrededor de 3
Y entonces, habrÃa otro programa (en algunos casos es otro programa, en algunos casos podrÃa ser el mismo TLS Termination Proxy) que hablarÃa con Let's Encrypt y renovarÃa el/los certificado(s).
-
+
Los **certificados TLS** estÃĄn **asociados con un nombre de dominio**, no con una direcciÃŗn IP.
diff --git a/docs/es/docs/how-to/custom-docs-ui-assets.md b/docs/es/docs/how-to/custom-docs-ui-assets.md
index 444cf167e..0a03ff330 100644
--- a/docs/es/docs/how-to/custom-docs-ui-assets.md
+++ b/docs/es/docs/how-to/custom-docs-ui-assets.md
@@ -98,7 +98,7 @@ Probablemente puedas hacer clic derecho en cada enlace y seleccionar una opciÃŗn
Y **ReDoc** utiliza el archivo:
-* `redoc.standalone.js`
+* `redoc.standalone.js`
DespuÊs de eso, tu estructura de archivos podrÃa verse asÃ:
@@ -129,14 +129,8 @@ DeberÃas ver un archivo JavaScript muy largo de **ReDoc**.
PodrÃa comenzar con algo como:
```JavaScript
-/*!
- * ReDoc - OpenAPI/Swagger-generated API Reference Documentation
- * -------------------------------------------------------------
- * Version: "2.0.0-rc.18"
- * Repo: https://github.com/Redocly/redoc
- */
-!function(e,t){"object"==typeof exports&&"object"==typeof m
-
+/*! For license information please see redoc.standalone.js.LICENSE.txt */
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("null")):
...
```
diff --git a/docs/es/docs/index.md b/docs/es/docs/index.md
index db8da6933..c1da5d633 100644
--- a/docs/es/docs/index.md
+++ b/docs/es/docs/index.md
@@ -12,7 +12,7 @@
-
+
diff --git a/docs/es/docs/tutorial/bigger-applications.md b/docs/es/docs/tutorial/bigger-applications.md
index 78165ef05..c3d8f0686 100644
--- a/docs/es/docs/tutorial/bigger-applications.md
+++ b/docs/es/docs/tutorial/bigger-applications.md
@@ -52,7 +52,7 @@ from app.routers import items
* TambiÊn hay un subdirectorio `app/internal/` con otro archivo `__init__.py`, por lo que es otro "subpaquete de Python": `app.internal`.
* Y el archivo `app/internal/admin.py` es otro submÃŗdulo: `app.internal.admin`.
-
+
La misma estructura de archivos con comentarios:
@@ -270,7 +270,7 @@ Pero ese archivo no existe, nuestras dependencias estÃĄn en un archivo en `app/d
Recuerda cÃŗmo se ve nuestra estructura de aplicaciÃŗn/archivo:
-
+
---
diff --git a/docs/es/docs/tutorial/query-params-str-validations.md b/docs/es/docs/tutorial/query-params-str-validations.md
index f378b9dce..9cb76156f 100644
--- a/docs/es/docs/tutorial/query-params-str-validations.md
+++ b/docs/es/docs/tutorial/query-params-str-validations.md
@@ -321,22 +321,6 @@ Asà que, cuando necesites declarar un valor como requerido mientras usas `Query
{* ../../docs_src/query_params_str_validations/tutorial006_an_py39.py hl[9] *}
-### Requerido con Puntos suspensivos (`...`)
-
-Hay una manera alternativa de declarar explÃcitamente que un valor es requerido. Puedes establecer el valor por defecto al valor literal `...`:
-
-{* ../../docs_src/query_params_str_validations/tutorial006b_an_py39.py hl[9] *}
-
-/// info | InformaciÃŗn
-
-Si no habÃas visto eso `...` antes: es un valor especial Ãēnico, es parte de Python y se llama "Ellipsis" .
-
-Se usa por Pydantic y FastAPI para declarar explÃcitamente que un valor es requerido.
-
-///
-
-Esto le permitirÃĄ a **FastAPI** saber que este parÃĄmetro es requerido.
-
### Requerido, puede ser `None`
Puedes declarar que un parÃĄmetro puede aceptar `None`, pero que aÃēn asà es requerido. Esto obligarÃa a los clientes a enviar un valor, incluso si el valor es `None`.
diff --git a/docs/es/llm-prompt.md b/docs/es/llm-prompt.md
index 3340dbc99..936ed9bba 100644
--- a/docs/es/llm-prompt.md
+++ b/docs/es/llm-prompt.md
@@ -4,56 +4,6 @@ Use the informal grammar (use "tÃē" instead of "usted").
For instructions or titles in imperative, keep them in imperative, for example "Edit it" to "EdÃtalo".
-There are special blocks of notes, tips and others that look like:
-
-/// note
-
-To translate it, keep the same line and add the translation after a vertical bar:
-
-/// note | Nota
-
-Some examples:
-
-Source:
-
-/// tip
-
-Result:
-
-/// tip | Consejo
-
-Source:
-
-/// details | Preview
-
-Result:
-
-/// details | Vista previa
-
-Source:
-
-/// warning
-
-Result:
-
-/// warning | Advertencia
-
-Source:
-
-/// info
-
-Result:
-
-/// info | InformaciÃŗn
-
-Source:
-
-/// note | Technical Details
-
-Result:
-
-/// note | Detalles TÊcnicos
-
---
For the next terms, use the following translations:
diff --git a/docs/fa/docs/async.md b/docs/fa/docs/async.md
new file mode 100644
index 000000000..e07374862
--- /dev/null
+++ b/docs/fa/docs/async.md
@@ -0,0 +1,444 @@
+# ŲŲ
âØ˛Ų
اŲÛ Ų async / await
+
+ØŦØ˛ØĻÛØ§ØĒ Ø¯Øą Ų
بਝ ØŗÛŲØĒÚŠØŗ `async def` Ø¨ØąØ§Û *ØĒŲØ§Ø¨Øš ØšŲ
ŲÛØ§ØĒ Ų
ØŗÛØą* Ų ÛŲ ÚŠŲ
ŲžÛØ´âØ˛Ų
ÛŲŲ Ø¯Øą Ų
بਝ ڊد ŲØ§ŲŲ
âØ˛Ų
Ø§ŲØ ŲŲ
âØ˛Ų
اŲÛ Ų Ų
ŲØ§Ø˛ÛâØŗØ§Ø˛Û.
+
+## ØšØŦŲŲ Ø¯Ø§ØąÛØ
+
+TL;DR:
+
+Ø§Ú¯Ų Ø§Ø˛ ÚŠØĒاب؎ŲŲŲâŲØ§Û ØŗŲŲ
âØ´ØŽØĩÛ Ø§ØŗØĒŲØ§Ø¯Ų Ų
ÛâÚŠŲÛ ÚŠŲ Ø¨ŲØĒ Ų
ÛâÚ¯Ų Ø¨Ø§ `await` ØĩداشŲŲ ÚŠŲÛØ Ų
ØĢŲ:
+
+```Python
+results = await some_library()
+```
+
+اŲŲ ŲŲØĒØ *ØĒŲØ§Ø¨Øš ØšŲ
ŲÛØ§ØĒ Ų
ØŗÛØąØĒ* ØąŲ Ø¨Ø§ `async def` ØĒØšØąÛŲ ÚŠŲØ اÛŲØŦŲØąÛ:
+
+```Python hl_lines="2"
+@app.get('/')
+async def read_results():
+ results = await some_library()
+ return results
+```
+
+/// note
+
+ŲŲØˇ ØĒŲÛ ØĒŲØ§Ø¨ØšÛ ÚŠŲ Ø¨Ø§ `async def` ØŗØ§ØŽØĒŲ Ø´Ø¯Ų Ų
ÛâØĒŲŲÛ Ø§Ø˛ `await` Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲÛ.
+
+///
+
+---
+
+Ø§Ú¯Ų Ø§Ø˛ ÛŲ ÚŠØĒاب؎ŲŲŲ ØŗŲŲ
âØ´ØŽØĩ Ø§ØŗØĒŲØ§Ø¯Ų Ų
ÛâÚŠŲÛ ÚŠŲ Ø¨Ø§ ÛŲ ÚÛØ˛Û (Ų
ØĢŲ Ø¯ÛØĒØ§Ø¨ÛØŗØ APIØ ØŗÛØŗØĒŲ
ŲØ§ÛŲ Ų ØēÛØąŲ) Ø§ØąØĒØ¨Ø§Øˇ Ø¯Ø§ØąŲ Ų Ø§Ø˛ `await` ŲžØ´ØĒÛØ¨Ø§ŲÛ ŲŲ
ÛâÚŠŲŲ (ÚŠŲ Ø§ŲØ§Ų Ø¨ØąØ§Û Ø¨ÛØ´ØĒØą ÚŠØĒاب؎ŲŲŲâŲØ§Û Ø¯ÛØĒØ§Ø¨ÛØŗ اÛŲØŦŲØąÛŲ)Ø Ø§ŲŲ ŲŲØĒ *ØĒŲØ§Ø¨Øš ØšŲ
ŲÛØ§ØĒ Ų
ØŗÛØąØĒ* ØąŲ ØšØ§Ø¯ÛØ ŲŲØˇ با `def` ØĒØšØąÛŲ ÚŠŲØ اÛŲØŦŲØąÛ:
+
+```Python hl_lines="2"
+@app.get('/')
+def results():
+ results = some_library()
+ return results
+```
+
+---
+
+Ø§Ú¯Ų Ø¨ØąŲØ§Ų
ŲâØ§ØĒ (Ø¨Ų ŲØą Ø¯ŲÛŲÛ) ŲØ§Ø˛Ų
ŲÛØŗØĒ با ÚÛØ˛ دÛÚ¯ŲâØ§Û Ø§ØąØĒØ¨Ø§Øˇ Ø¨ØąŲØąØ§Øą ÚŠŲŲ Ų Ų
ŲØĒØ¸Øą ØŦŲØ§Ø¨Ø´ بŲ
ŲŲŲØ Ø§Ø˛ `async def` Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲ.
+
+---
+
+Ø§Ú¯Ų ŲŲ
ÛâØ¯ŲŲÛ ÚÛÚŠØ§Øą ÚŠŲÛØ Ø§Ø˛ `def` Ų
ØšŲ
ŲŲÛ Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲ.
+
+---
+
+**ØĒŲØŦŲ**: Ų
ÛâØĒŲŲÛ ØĒŲÛ *ØĒŲØ§Ø¨Øš ØšŲ
ŲÛØ§ØĒ Ų
ØŗÛØąØĒ* ŲØą ÚŲØ¯Øą ÚŠŲ ŲØ§Ø˛Ų
Ø¯Ø§ØąÛ `def` Ų `async def` ØąŲ ŲØ§ØˇÛ ÚŠŲÛ Ų ŲØą ڊدŲŲ
ØąŲ Ø¨Ø§ Ø¨ŲØĒØąÛŲ Ú¯Ø˛ÛŲŲ Ø¨ØąØ§ØĒ ØĒØšØąÛŲ ÚŠŲÛ. FastAPI ØŽŲØ¯Ø´ ÚŠØ§Øą Ø¯ØąØŗØĒ ØąŲ Ø¨Ø§ŲØ§Ø´ŲŲ Ø§ŲØŦاŲ
Ų
ÛâØ¯Ų.
+
+Ø¨Ų ŲØą ØØ§ŲØ ØĒŲÛ ŲØą ڊدŲŲ
Ø§Ø˛ Ų
ŲŲØšÛØĒâŲØ§Û Ø¨Ø§ŲØ§Ø FastAPI ŲŲŲØ˛ ŲØ§ŲŲ
âØ˛Ų
Ø§Ų ÚŠØ§Øą Ų
ÛâÚŠŲŲ Ų ØŽÛŲÛ ØŽÛŲÛ ØŗØąÛØš ŲØŗØĒ.
+
+ŲŲÛ Ø¨Ø§ Ø¯ŲØ¨Ø§Ų ÚŠØąØ¯Ų Ų
ØąØ§ØŲ Ø¨Ø§ŲØ§Ø Ų
ÛâØĒŲŲŲ ÛŲ ØŗØąÛ Ø¨ŲÛŲŲâØŗØ§Ø˛Û ØšŲ
ŲÚŠØąØ¯ ŲŲ
بڊŲŲ.
+
+## ØŦØ˛ØĻÛØ§ØĒ ŲŲÛ
+
+ŲØŗØŽŲâŲØ§Û Ų
Ø¯ØąŲ ŲžØ§ÛØĒŲŲ Ø§Ø˛ **"ڊد ŲØ§ŲŲ
âØ˛Ų
اŲ"** با ÚÛØ˛Û ÚŠŲ Ø¨ŲØ´ **"ÚŠØąŲØĒÛŲ"** Ų
ÛâÚ¯Ų ŲžØ´ØĒÛØ¨Ø§ŲÛ Ų
ÛâÚŠŲŲØ با ØŗÛŲØĒÚŠØŗ **`async` Ų `await`**.
+
+Ø¨ÛØ§Ûد اÛŲ ØŦŲ
ŲŲ ØąŲ ØĒÚŠŲâØĒÚŠŲ ØĒŲÛ Ø¨ØŽØ´âŲØ§Û Ø˛ÛØą Ø¨Ø¨ÛŲÛŲ
:
+
+* **ڊد ŲØ§ŲŲ
âØ˛Ų
اŲ**
+* **`async` Ų `await`**
+* **ÚŠØąŲØĒÛŲâŲØ§**
+
+## ڊد ŲØ§ŲŲ
âØ˛Ų
اŲ
+
+ڊد ŲØ§ŲŲ
âØ˛Ų
Ø§Ų ÛØšŲÛ Ø˛Ø¨ŲŲ đŦ ÛŲ ØąØ§ŲÛ Ø¯Ø§ØąŲ ÚŠŲ Ø¨Ų ÚŠØ§Ų
ŲžÛŲØĒØą / Ø¨ØąŲØ§Ų
Ų đ¤ Ø¨Ú¯Ų ØĒŲÛ ÛŲ ØŦØ§Û ÚŠØ¯Ø Ø¨Ø§ÛØ¯ Ų
ŲØĒØ¸Øą بŲ
ŲŲŲ ØĒا *ÛŲ ÚÛØ˛ دÛÚ¯Ų* ÛŲ ØŦØ§Û Ø¯ÛÚ¯Ų ØĒŲ
ŲŲ
بشŲ. ŲØąØļ ÚŠŲ Ø§ŲŲ *ÛŲ ÚÛØ˛ دÛÚ¯Ų* Ø§ØŗŲ
Ø´ "ŲØ§ÛŲ-ØĸØąŲŲ
" đ Ø¨Ø§Ø´Ų.
+
+ŲžØŗØ ØĒŲÛ Ø§ŲŲ Ų
دØĒØ ÚŠØ§Ų
ŲžÛŲØĒØą Ų
ÛâØĒŲŲŲ Ø¨ØąŲ ÛŲ ÚŠØ§Øą دÛÚ¯Ų Ø¨ÚŠŲŲØ ØĒا ŲŲØĒÛ "ŲØ§ÛŲ-ØĸØąŲŲ
" đ ØĒŲ
ŲŲ
بشŲ.
+
+بؚدش ڊاŲ
ŲžÛŲØĒØą / Ø¨ØąŲØ§Ų
Ų đ¤ ŲØą ŲŲØĒ ŲØąØĩØĒÛ Ø¯Ø§Ø´ØĒŲ Ø¨Ø§Ø´Ų Ø¨ØąŲ
ÛâÚ¯ØąØ¯ŲØ ÚŲŲ Ø¯ŲØ¨Ø§ØąŲ Ų
ŲØĒØ¸ØąŲØ ÛØ§ ŲØą ŲŲØĒ ŲŲ
Ų ÚŠØ§ØąÛ ÚŠŲ Ø§ŲŲ ŲØØ¸Ų Ø¯Ø§Ø´ØĒŲ ØĒŲ
ŲŲ
ÚŠØąØ¯Ų. Ų Ų
ÛâØ¨ÛŲŲ ØĸÛØ§ ÚŠØ§ØąØ§ÛÛ ÚŠŲ Ų
ŲØĒØ¸ØąØ´ŲŲ Ø¨ŲØ¯Ų ØĒŲ
ŲŲ
Ø´Ø¯Ų ÛØ§ ŲŲØ Ų ŲØą ÚŠØ§ØąÛ ÚŠŲ Ø¨Ø§ÛØ¯ بڊŲŲ ØąŲ Ø§ŲØŦاŲ
Ų
ÛâØ¯Ų.
+
+Ø¨ØšØ¯Ø Ø§ŲŲ đ¤ Ø§ŲŲÛŲ ÚŠØ§ØąÛ ÚŠŲ ØĒŲ
ŲŲ
Ø´Ø¯Ų (Ų
ØĢŲØ§Ų "ŲØ§ÛŲ-ØĸØąŲŲ
" đ Ų
ا) ØąŲ Ø¨ØąŲ
ÛâØ¯Ø§ØąŲ Ų ŲØą ÚŠØ§ØąÛ ÚŠŲ Ø¨Ø§ÛØ¯ Ø¨Ø§ŲØ§Ø´ بڊŲŲ ØąŲ Ø§Ø¯Ø§Ų
Ų Ų
ÛâØ¯Ų.
+
+اÛŲ "Ų
ŲØĒØ¸Øą ÛŲ ÚÛØ˛ دÛÚ¯Ų Ø¨ŲØ¯Ų" Ų
ØšŲ
ŲŲØ§Ų Ø¨Ų ØšŲ
ŲÛØ§ØĒ I/O Ø§Ø´Ø§ØąŲ Ø¯Ø§ØąŲ ÚŠŲ ŲØŗØ¨ØĒØ§Ų "ØĸØąŲŲ
" ŲØŗØĒŲ (ŲØŗØ¨ØĒ Ø¨Ų ØŗØąØšØĒ ŲžØąØ¯Ø§Ø˛ŲØ¯Ų Ų ØØ§ŲØ¸Ų RAM)Ø Ų
ØĢŲ Ų
ŲØĒØ¸Øą Ų
ŲŲØ¯Ų Ø¨ØąØ§Û:
+
+* دادŲâŲØ§ÛÛ ÚŠŲ Ø§Ø˛ ÚŠŲØ§ÛŲØĒ Ø§Ø˛ ØˇØąÛŲ Ø´Ø¨ÚŠŲ ŲØąØŗØĒØ§Ø¯Ų Ų
ÛâØ´Ų
+* دادŲâŲØ§ÛÛ ÚŠŲ Ø¨ØąŲØ§Ų
ŲâØ§ØĒ ب਺ØĒØ§Ø¯Ų ØĒا Ø§Ø˛ ØˇØąÛŲ Ø´Ø¨ÚŠŲ Ø¨Ų ÚŠŲØ§ÛŲØĒ Ø¨ØąØŗŲ
+* Ų
ØØĒŲØ§Û ÛŲ ŲØ§ÛŲ ØĒŲÛ Ø¯ÛØŗÚŠ ÚŠŲ ØŗÛØŗØĒŲ
ب؎ŲŲØ¯Ø´ Ų Ø¨Ų Ø¨ØąŲØ§Ų
ŲâØ§ØĒ بدŲ
+* Ų
ØØĒŲØ§ÛÛ ÚŠŲ Ø¨ØąŲØ§Ų
ŲâØ§ØĒ Ø¨Ų ØŗÛØŗØĒŲ
Ø¯Ø§Ø¯Ų ØĒا ØĒŲÛ Ø¯ÛØŗÚŠ Ø¨ŲŲÛØŗŲ
+* ÛŲ ØšŲ
ŲÛØ§ØĒ API Ø§Ø˛ ØąØ§Ų Ø¯ŲØą
+* ÛŲ ØšŲ
ŲÛØ§ØĒ Ø¯ÛØĒØ§Ø¨ÛØŗ ÚŠŲ ØĒŲ
ŲŲ
بشŲ
+* ÛŲ ÚŠŲØĻØąÛ Ø¯ÛØĒØ§Ø¨ÛØŗ ÚŠŲ ŲØĒØ§ÛØŦØ´ Ø¨ØąÚ¯ØąØ¯Ų
+* Ų ØēÛØąŲ.
+
+ÚŲŲ Ø˛Ų
Ø§Ų Ø§ØŦØąØ§ Ø¨ÛØ´ØĒØą ØĩØąŲ Ø§ŲØĒØ¸Ø§Øą Ø¨ØąØ§Û ØšŲ
ŲÛØ§ØĒ I/O Ų
ÛâØ´ŲØ Ø¨ŲØ´ŲŲ Ų
ÛâÚ¯Ų ØšŲ
ŲÛØ§ØĒ "I/O bound".
+
+Ø¨ŲØ´ "ŲØ§ŲŲ
âØ˛Ų
اŲ" Ų
ÛâÚ¯Ų ÚŲŲ ÚŠØ§Ų
ŲžÛŲØĒØą / Ø¨ØąŲØ§Ų
Ų ŲØ§Ø˛Ų
ŲÛØŗØĒ با ÚŠØ§Øą ØĸØąŲŲ
"ŲŲ
âØ˛Ų
اŲ" Ø¨Ø§Ø´ŲØ Ų
ŲØĒØ¸Øą ŲØØ¸Ų Ø¯ŲÛŲ ØĒŲ
ŲŲ
Ø´Ø¯Ų ÚŠØ§Øą بŲ
ŲŲŲØ Ø¯Øą ØØ§ŲÛ ÚŠŲ ŲÛÚ ÚŠØ§ØąÛ ŲŲ
ÛâÚŠŲŲØ ØĒا ŲØĒÛØŦŲ ØąŲ Ø¨Ú¯ÛØąŲ Ų ÚŠØ§ØąØ´ ØąŲ Ø§Ø¯Ø§Ų
Ų Ø¨Ø¯Ų.
+
+Ø¨Ų ØŦØ§Ø´Ø ÚŲŲ ÛŲ ØŗÛØŗØĒŲ
"ŲØ§ŲŲ
âØ˛Ų
اŲ" ŲØŗØĒØ ŲŲØĒÛ ÚŠØ§Øą ØĒŲ
ŲŲ
Ø´Ø¯Ø Ų
ÛâØĒŲŲŲ ÛŲ ÚŠŲ
ØĒŲÛ ØĩŲ Ų
ŲØĒØ¸Øą بŲ
ŲŲŲ (ÚŲØ¯ Ų
ÛÚŠØąŲØĢØ§ŲÛŲ) ØĒا ڊاŲ
ŲžÛŲØĒØą / Ø¨ØąŲØ§Ų
Ų ŲØą ÚŠØ§ØąÛ ÚŠŲ ØąŲØĒŲ Ø¨ÚŠŲŲ ØąŲ ØĒŲ
ŲŲ
ÚŠŲŲØ Ų Ø¨ØšØ¯ Ø¨ØąÚ¯ØąØ¯Ų ŲØĒÛØŦŲ ØąŲ Ø¨Ú¯ÛØąŲ Ų Ø¨Ø§ŲØ§Ø´ ÚŠØ§Øą ÚŠŲŲ.
+
+Ø¨ØąØ§Û "ŲŲ
âØ˛Ų
اŲ" (Ø¨ØąØŽŲØ§Ų "ŲØ§ŲŲ
âØ˛Ų
اŲ") Ų
ØšŲ
ŲŲØ§Ų Ø§Ø˛ اØĩØˇŲØ§Ø "ØĒØąØĒÛØ¨Û" ŲŲ
Ø§ØŗØĒŲØ§Ø¯Ų Ų
ÛâÚŠŲŲØ ÚŲŲ ÚŠØ§Ų
ŲžÛŲØĒØą / Ø¨ØąŲØ§Ų
Ų ŲŲ
Ų Ų
ØąØ§ØŲ ØąŲ Ø¨Ų ØĒØąØĒÛØ¨ Ø¯ŲØ¨Ø§Ų Ų
ÛâÚŠŲŲ ŲØ¨Ų Ø§Ø˛ اÛŲÚŠŲ Ø¨ØąŲ ØŗØąØ§Øē ÛŲ ÚŠØ§Øą دÛÚ¯ŲØ ØØĒÛ Ø§Ú¯Ų Ø§ŲŲ Ų
ØąØ§ØŲ شاŲ
Ų Ø§ŲØĒØ¸Ø§Øą باشŲ.
+
+### ŲŲ
âØ˛Ų
اŲÛ Ų Ø¨ØąÚ¯ØąŲØ§
+
+اÛŲ Ø§ÛØ¯Ų **ŲØ§ŲŲ
âØ˛Ų
اŲ** ÚŠŲ Ø¨Ø§ŲØ§ ØĒŲØļÛØ دادŲ
گاŲÛ Ø¨ŲØ´ **"ŲŲ
âØ˛Ų
اŲÛ"** ŲŲ
Ų
ÛâÚ¯Ų. با **"Ų
ŲØ§Ø˛ÛâØŗØ§Ø˛Û"** ŲØąŲ Ø¯Ø§ØąŲ.
+
+**ŲŲ
âØ˛Ų
اŲÛ** Ų **Ų
ŲØ§Ø˛ÛâØŗØ§Ø˛Û** ŲØą Ø¯Ų Ø¨Ų "اØĒŲØ§Ų Ø§ŲØĒØ§Ø¯Ų ÚÛØ˛Ø§Û Ų
ØŽØĒŲŲ ÚŠŲ
âŲØ¨ÛØ´ ŲŲ
Ø˛Ų
اŲ" ØąØ¨Øˇ Ø¯Ø§ØąŲ.
+
+ŲŲÛ ØŦØ˛ØĻÛØ§ØĒ بÛŲ *ŲŲ
âØ˛Ų
اŲÛ* Ų *Ų
ŲØ§Ø˛ÛâØŗØ§Ø˛Û* ØŽÛŲÛ Ų
ØĒŲØ§ŲØĒŲ.
+
+Ø¨ØąØ§Û Ø¯ÛØ¯Ų ŲØąŲØ´Ø Ø§ÛŲ Ø¯Ø§ØŗØĒØ§Ų Ø¯Øą Ų
بਝ Ø¨ØąÚ¯ØąŲØ§ ØąŲ ØĒØĩŲØą ÚŠŲ:
+
+### Ø¨ØąÚ¯ØąŲØ§Û ŲŲ
âØ˛Ų
اŲ
+
+با ØšØ´ŲØĒ Ų
ÛâØąÛ ŲØŗØĒâŲŲØ¯ Ø¨Ú¯ÛØąÛŲØ ØĒŲÛ ØĩŲ ŲØ§ÛŲ
ÛØŗØĒÛ Ø¯Øą ØØ§ŲÛ ÚŠŲ ØĩŲØ¯ŲŲØ¯Ø§Øą ØŗŲØ§ØąØ´ ØĸدŲ
Ø§Û ØŦŲŲÛ ØĒŲ ØąŲ Ų
ÛâÚ¯ÛØąŲ. đ
+
+
+
+بؚد ŲŲØ¨ØĒ ØĒŲ Ų
ÛâØ´ŲØ ØŗŲØ§ØąØ´ Ø¯Ų ØĒا Ø¨ØąÚ¯Øą ØŽÛŲÛ Ø´ÛÚŠ Ø¨ØąØ§Û ØŽŲØ¯ØĒ Ų ØšØ´ŲØĒ Ų
ÛâØ¯Û. đđ
+
+
+
+ØĩŲØ¯ŲŲØ¯Ø§Øą ÛŲ ÚÛØ˛Û Ø¨Ų ØĸØ´ŲžØ˛ ØĒŲÛ ØĸØ´ŲžØ˛ØŽŲŲŲ Ų
ÛâÚ¯Ų ØĒا بدŲŲŲ Ø¨Ø§ÛØ¯ Ø¨ØąÚ¯ØąŲØ§Û ØĒŲ ØąŲ ØĸŲ
Ø§Ø¯Ų ÚŠŲŲ (Ú¯ØąÚŲ Ø§ŲØ§Ų Ø¯Ø§ØąŲ Ø¨ØąÚ¯ØąŲØ§Û Ų
Ø´ØĒØąÛØ§Û ŲØ¨ŲÛ ØąŲ Ø¯ØąØŗØĒ Ų
ÛâÚŠŲŲ).
+
+
+
+ŲžŲŲ ØąŲ Ų
ÛâØ¯Û. đ¸
+
+ØĩŲØ¯ŲŲØ¯Ø§Øą Ø´Ų
Ø§ØąŲ ŲŲØ¨ØĒØĒ ØąŲ Ø¨ŲØĒ Ų
ÛâØ¯Ų.
+
+
+
+ŲŲØĒÛ Ų
ŲØĒØ¸ØąÛØ Ø¨Ø§ ØšØ´ŲØĒ Ų
ÛâØąÛ ÛŲ Ų
ÛØ˛ Ø§ŲØĒØŽØ§Ø¨ Ų
ÛâÚŠŲÛØ Ų
ÛâØ´ÛŲÛ Ų ÚŠŲÛ Ø¨Ø§ ØšØ´ŲØĒ ØØąŲ Ų
ÛâØ˛ŲÛ (ÚŲŲ Ø¨ØąÚ¯ØąŲØ§ØĒ ØŽÛŲÛ Ø´ÛÚŠŲ Ų ØĸŲ
Ø§Ø¯Ų ÚŠØąØ¯ŲØ´ŲŲ ÛŲ ÚŠŲ
ØˇŲŲ Ų
ÛâÚŠØ´Ų).
+
+ŲŲØĒÛ ŲžØ´ØĒ Ų
ÛØ˛ با ØšØ´ŲØĒ ŲØ´ØŗØĒÛØ Ø¯Øą ØØ§ŲÛ ÚŠŲ Ų
ŲØĒØ¸Øą Ø¨ØąÚ¯ØąŲØ§ÛÛØ Ų
ÛâØĒŲŲÛ Ø§ŲŲ Ø˛Ų
Ø§Ų ØąŲ ØĩØąŲ ØĒØØŗÛŲ Ø§ÛŲ ÚŠŲÛ ÚŠŲ ØšØ´ŲØĒ ÚŲØ¯Øą Ø¨Ø§ØØ§ŲØ ŲØ§Ø˛ Ų Ø¨Ø§ŲŲØ´Ų â¨đâ¨.
+
+
+
+ŲŲØĒÛ Ų
ŲØĒØ¸ØąÛ Ų Ø¨Ø§ ØšØ´ŲØĒ ØØąŲ Ų
ÛâØ˛ŲÛØ ŲØą Ø§Ø˛ گاŲÛ Ø´Ų
Ø§ØąŲâØ§Û ÚŠŲ ØąŲ ŲžÛØ´ØŽŲŲ ŲØ´ŲŲ Ø¯Ø§Ø¯Ų Ų
ÛâØ´Ų ØąŲ ÚÚŠ Ų
ÛâÚŠŲÛ ÚŠŲ Ø¨Ø¨ÛŲÛ ŲŲØ¨ØĒØĒ Ø´Ø¯Ų ÛØ§ ŲŲ.
+
+بؚد ÛŲ ØŦاÛÛ Ø¨Ø§ŲØ§ØŽØąŲ ŲŲØ¨ØĒØĒ Ų
ÛâØ´Ų. Ų
ÛâØąÛ ŲžÛØ´ØŽŲŲØ Ø¨ØąÚ¯ØąŲØ§ØĒ ØąŲ Ų
ÛâÚ¯ÛØąÛ Ų Ø¨ØąŲ
ÛâÚ¯ØąØ¯Û ØŗØą Ų
ÛØ˛.
+
+
+
+ØĒŲ Ų ØšØ´ŲØĒ Ø¨ØąÚ¯ØąŲØ§ ØąŲ Ų
ÛâØŽŲØąÛŲ Ų ÛŲ ŲŲØĒ ØŽŲØ¨ باŲŲ
Ø¯Ø§ØąÛŲ. â¨
+
+
+
+/// info
+
+ØĒØĩاŲÛØą ŲØ´ŲÚ¯ Ø§Ø˛ ÚŠØĒØąÛŲØ§ ØĒاŲ
ŲžØŗŲŲ . đ¨
+
+///
+
+---
+
+ØĒØĩŲØą ÚŠŲ ØĒŲ ØĒŲÛ Ø§ÛŲ Ø¯Ø§ØŗØĒØ§Ų ÚŠØ§Ų
ŲžÛŲØĒØą / Ø¨ØąŲØ§Ų
Ų đ¤ ŲØŗØĒÛ.
+
+ŲŲØĒÛ ØĒŲÛ ØĩŲ ŲØŗØĒÛØ ŲŲØˇ بÛÚŠØ§ØąÛ đ´Ø Ų
ŲØĒØ¸Øą ŲŲØ¨ØĒØĒ ŲØŗØĒÛØ ÚŠØ§Øą ØŽÛŲÛ "Ų
ŲÛØ¯Û" ŲŲ
ÛâÚŠŲÛ. ŲŲÛ ØĩŲ ØŗØąÛØš ŲžÛØ´ Ų
ÛâØąŲ ÚŲŲ ØĩŲØ¯ŲŲØ¯Ø§Øą ŲŲØˇ ØŗŲØ§ØąØ´ Ų
ÛâÚ¯ÛØąŲ (ØĸŲ
ادشŲŲ ŲŲ
ÛâÚŠŲŲ)Ø ŲžØŗ اÛŲ ØŽŲØ¨Ų.
+
+Ø¨ØšØ¯Ø ŲŲØĒÛ ŲŲØ¨ØĒØĒ Ų
ÛâØ´ŲØ ÚŠØ§Øą "Ų
ŲÛØ¯" ŲØ§ŲØšÛ Ų
ÛâÚŠŲÛØ Ų
ŲŲ ØąŲ ŲžØąØ¯Ø§Ø˛Ø´ Ų
ÛâÚŠŲÛØ ØĒØĩŲ
ÛŲ
Ų
ÛâÚ¯ÛØąÛ ÚÛ Ų
ÛâØŽŲØ§ÛØ Ø§ŲØĒØŽØ§Ø¨ ØšØ´ŲØĒ ØąŲ Ų
ÛâÚ¯ÛØąÛØ ŲžŲŲ Ų
ÛâØ¯ÛØ ÚÚŠ Ų
ÛâÚŠŲÛ Ø§ØŗÚŠŲØ§Øŗ ÛØ§ ÚŠØ§ØąØĒ Ø¯ØąØŗØĒ ØąŲ Ø¯Ø§Ø¯ÛØ ÚÚŠ Ų
ÛâÚŠŲÛ Ø¯ØąØŗØĒ ØØŗØ§Ø¨ Ø´Ø¯ŲØ ÚÚŠ Ų
ÛâÚŠŲÛ ØŗŲØ§ØąØ´ ØĸÛØĒŲ
Ø§Û Ø¯ØąØŗØĒ ØąŲ Ø¯Ø§ØąŲ Ų ØēÛØąŲ.
+
+ŲŲÛ Ø¨ØšØ¯Ø Ú¯ØąÚŲ ŲŲŲØ˛ Ø¨ØąÚ¯ØąŲØ§ØĒ ØąŲ ŲØ¯Ø§ØąÛØ ÚŠØ§ØąØĒ با ØĩŲØ¯ŲŲØ¯Ø§Øą "Ų
ŲŲØĒØ§Ų Ų
ØĒŲŲŲ" ⸠Ų
ÛâØ´ŲØ ÚŲŲ Ø¨Ø§ÛØ¯ Ų
ŲØĒØ¸Øą بŲ
ŲŲÛ đ ØĒا Ø¨ØąÚ¯ØąŲØ§ØĒ ØĸŲ
Ø§Ø¯Ų Ø¨Ø´Ų.
+
+ŲŲÛ ŲŲØĒÛ Ø§Ø˛ ŲžÛØ´ØŽŲŲ Ø¯ŲØą Ų
ÛâØ´Û Ų Ø¨Ø§ Ø´Ų
Ø§ØąŲ ŲŲØ¨ØĒØĒ ØŗØą Ų
ÛØ˛ Ų
ÛâØ´ÛŲÛØ Ų
ÛâØĒŲŲÛ ØĒŲØŦŲØĒ ØąŲ đ Ø¨Ų ØšØ´ŲØĒ Ø¨Ø¯Û Ų "ÚŠØ§Øą" â¯ đ¤ ØąŲ اŲŲ Ø¨ÚŠŲÛ. بؚدش Ø¯ŲØ¨Ø§ØąŲ Ø¯Ø§ØąÛ ÛŲ ÚÛØ˛ ØŽÛŲÛ "Ų
ŲÛØ¯" Ø§ŲØŦاŲ
Ų
ÛâØ¯ÛØ Ų
ØĢŲ ŲØ§Øŗ Ø˛Ø¯Ų Ø¨Ø§ ØšØ´ŲØĒ đ.
+
+بؚد ØĩŲØ¯ŲŲØ¯Ø§Øą đ Ø¨Ø§ گذاشØĒŲ Ø´Ų
Ø§ØąŲâØ§ØĒ ØąŲ ŲŲ
Ø§ÛØ´Ú¯Øą ŲžÛØ´ØŽŲŲ Ų
ÛâÚ¯Ų "Ų
Ų Ø¨Ø§ Ø¯ØąØŗØĒ ÚŠØąØ¯Ų Ø¨ØąÚ¯ØąŲØ§ ØĒŲ
ŲŲ
ÚŠØąØ¯Ų
"Ø ŲŲÛ ØĒŲ Ų
ØĢŲ Ø¯ÛŲŲŲŲâŲØ§ ŲŲØĒÛ Ø´Ų
Ø§ØąŲâØ§ØĒ ØąŲ ŲŲ
Ø§ÛØ´Ú¯Øą Ų
ÛØ§Ø¯ ŲŲØąÛ ŲŲ
ÛâŲžØąÛ. Ų
ÛâØ¯ŲŲÛ ÚŠØŗÛ Ø¨ØąÚ¯ØąŲØ§ØĒ ØąŲ ŲŲ
ÛâØ¯Ø˛Ø¯Ų ÚŲŲ Ø´Ų
Ø§ØąŲ ŲŲØ¨ØĒØĒ ØąŲ Ø¯Ø§ØąÛØ Ų Ø§ŲŲØ§ ŲŲ
Ų
Ø§Ų ØŽŲØ¯Ø´ŲŲ ØąŲ Ø¯Ø§ØąŲ.
+
+ŲžØŗ Ų
ŲØĒØ¸Øą Ų
ÛâŲ
ŲŲÛ ØĒا ØšØ´ŲØĒ Ø¯Ø§ØŗØĒØ§ŲØ´ ØąŲ ØĒŲ
ŲŲ
ÚŠŲŲ (ÚŠØ§Øą ŲØšŲÛ â¯ / ŲØ¸ÛŲŲâØ§Û ÚŠŲ Ø¯Ø§ØąŲ ŲžØąØ¯Ø§Ø˛Ø´ Ų
ÛâØ´Ų đ¤)Ø ØĸØąŲŲ
ŲØ¨ØŽŲد Ų
ÛâØ˛ŲÛ Ų Ų
ÛâÚ¯Û ÚŠŲ Ų
ÛâØąÛ Ø¨ØąÚ¯ØąŲØ§ ØąŲ Ø¨ÛØ§ØąÛ â¸.
+
+بؚد Ų
ÛâØąÛ ŲžÛØ´ØŽŲŲ đØ Ø¨Ų ÚŠØ§Øą اŲŲÛŲ ÚŠŲ ØØ§Ųا ØĒŲ
ŲŲ
Ø´Ø¯Ų â¯Ø Ø¨ØąÚ¯ØąŲØ§ ØąŲ Ų
ÛâÚ¯ÛØąÛØ ØĒØ´ÚŠØą Ų
ÛâÚŠŲÛ Ų Ų
ÛâØ¨ØąØ´ŲŲ ØŗØą Ų
ÛØ˛. اÛŲ Ų
ØąØŲŲ / ŲØ¸ÛŲŲ ØĒؚاŲ
Ų Ø¨Ø§ ŲžÛØ´ØŽŲŲ ØąŲ ØĒŲ
ŲŲ
Ų
ÛâÚŠŲŲ âš. اÛŲ Ø¨Ų ŲŲØ¨Ų ØŽŲØ¯Ø´ ÛŲ ŲØ¸ÛŲŲ ØŦØ¯ÛØ¯Ø "ØŽŲØąØ¯Ų Ø¨ØąÚ¯ØąŲØ§" đ â¯Ø Ų
ÛâØŗØ§Ø˛ŲØ ŲŲÛ Ø§ŲŲ ŲØ¨ŲÛ ÚŠŲ "Ú¯ØąŲØĒŲ Ø¨ØąÚ¯ØąŲØ§" Ø¨ŲØ¯ ØĒŲ
ŲŲ
Ø´Ø¯Ų âš.
+
+### Ø¨ØąÚ¯ØąŲØ§Û Ų
ŲØ§Ø˛Û
+
+ØØ§Ųا ŲØąØļ ÚŠŲ Ø§ÛŲØ§ "Ø¨ØąÚ¯ØąŲØ§Û ŲŲ
âØ˛Ų
اŲ" ŲÛØŗØĒŲØ بŲÚŠŲ "Ø¨ØąÚ¯ØąŲØ§Û Ų
ŲØ§Ø˛Û" ŲØŗØĒŲ.
+
+با ØšØ´ŲØĒ Ų
ÛâØąÛ ŲØŗØĒâŲŲØ¯ Ų
ŲØ§Ø˛Û Ø¨Ú¯ÛØąÛ.
+
+ØĒŲÛ ØĩŲ ŲØ§ÛŲ
ÛØŗØĒÛ Ø¯Øą ØØ§ŲÛ ÚŠŲ ÚŲØ¯ ØĒا (Ų
ØĢŲØ§Ų 8 ØĒا) ØĩŲØ¯ŲŲØ¯Ø§Øą ÚŠŲ ŲŲ
Ø˛Ų
Ø§Ų ØĸØ´ŲžØ˛ ŲŲ
ŲØŗØĒŲ ØŗŲØ§ØąØ´ ØĸدŲ
Ø§Û ØŦŲŲÛ ØĒŲ ØąŲ Ų
ÛâÚ¯ÛØąŲ.
+
+ŲŲ
Ų ŲØ¨Ų ØĒŲ Ų
ŲØĒØ¸ØąŲ Ø¨ØąÚ¯ØąŲØ§Ø´ŲŲ ØĸŲ
Ø§Ø¯Ų Ø¨Ø´Ų ŲØ¨Ų Ø§Ø˛ اÛŲÚŠŲ ŲžÛØ´ØŽŲŲ ØąŲ ØĒØąÚŠ ÚŠŲŲØ ÚŲŲ ŲØą ڊدŲŲ
Ø§Ø˛ 8 ØĒا ØĩŲØ¯ŲŲØ¯Ø§Øą Ų
ÛâØąŲ Ų Ø¨ØąÚ¯Øą ØąŲ ŲŲ
ŲŲ Ų
ŲŲØš Ø¯ØąØŗØĒ Ų
ÛâÚŠŲŲ ŲØ¨Ų Ø§Ø˛ اÛŲÚŠŲ ØŗŲØ§ØąØ´ Ø¨ØšØ¯Û ØąŲ Ø¨Ú¯ÛØąŲ.
+
+
+
+Ø¨Ø§ŲØ§ØŽØąŲ ŲŲØ¨ØĒ ØĒŲ Ų
ÛâØ´ŲØ ØŗŲØ§ØąØ´ Ø¯Ų ØĒا Ø¨ØąÚ¯Øą ØŽÛŲÛ Ø´ÛÚŠ Ø¨ØąØ§Û ØŽŲØ¯ØĒ Ų ØšØ´ŲØĒ Ų
ÛâØ¯Û.
+
+ŲžŲŲ ØąŲ Ų
ÛâØ¯Û đ¸.
+
+
+
+ØĩŲØ¯ŲŲØ¯Ø§Øą Ų
ÛâØąŲ ØĸØ´ŲžØ˛ØŽŲŲŲ.
+
+Ų
ŲØĒØ¸Øą Ų
ÛâŲ
ŲŲÛØ ØŦŲŲÛ ŲžÛØ´ØŽŲŲ ŲØ§ÛØŗØĒØ§Ø¯Û đØ ÚŠŲ ÚŠØŗÛ ŲØ¨Ų Ø§Ø˛ ØĒŲ Ø¨ØąÚ¯ØąŲØ§ØĒ ØąŲ ŲÚ¯ÛØąŲØ ÚŲŲ Ø´Ų
Ø§ØąŲ ŲŲØ¨ØĒ ŲÛØŗØĒ.
+
+
+
+ÚŲŲ ØĒŲ Ų ØšØ´ŲØĒ Ų
Ø´ØēŲŲ Ø§ÛŲ ŲØŗØĒÛŲ ÚŠŲ ŲØ°Ø§ØąÛŲ ÚŠØŗÛ ØŦŲŲØĒŲŲ Ø¨ÛØ§Ø¯ Ų ŲØą ŲŲØĒ Ø¨ØąÚ¯ØąŲØ§ ØąØŗÛØ¯Ų اŲŲØ§ ØąŲ Ø¨Ú¯ÛØąŲØ ŲŲ
ÛâØĒŲŲÛ Ø¨Ų ØšØ´ŲØĒ ØĒŲØŦŲ ÚŠŲÛ. đ
+
+اÛŲ ÚŠØ§Øą "ŲŲ
âØ˛Ų
اŲ" ŲØŗØĒØ ØĒŲ Ø¨Ø§ ØĩŲØ¯ŲŲØ¯Ø§Øą/ØĸØ´ŲžØ˛ đ¨âđŗ "ŲŲ
âØ˛Ų
اŲ" ŲØŗØĒÛ. Ø¨Ø§ÛØ¯ Ų
ŲØĒØ¸Øą بŲ
ŲŲÛ đ Ų Ø¯ØąØŗØĒ ŲŲ
ŲŲ ŲØØ¸Ų ÚŠŲ ØĩŲØ¯ŲŲØ¯Ø§Øą/ØĸØ´ŲžØ˛ đ¨âđŗ Ø¨ØąÚ¯ØąŲا ØąŲ ØĒŲ
ŲŲ
Ų
ÛâÚŠŲŲ Ų Ø¨ŲØĒ Ų
ÛâØ¯Ų Ø§ŲŲØŦا Ø¨Ø§Ø´ÛØ ŲÚ¯ØąŲŲ Ų
Ų
ÚŠŲŲ ÛÚŠÛ Ø¯ÛÚ¯Ų Ø§ŲŲØ§ ØąŲ Ø¨Ú¯ÛØąŲ.
+
+
+
+بؚد ØĩŲØ¯ŲŲØ¯Ø§Øą/ØĸØ´ŲžØ˛ØĒ đ¨âđŗ Ø¨Ø§ŲØ§ØŽØąŲ Ø¨ØšØ¯ Ø§Ø˛ ÛŲ Ų
دØĒ ØˇŲŲØ§ŲÛ Ø§ŲØĒØ¸Ø§Øą đ ØŦŲŲÛ ŲžÛØ´ØŽŲŲ Ø¨Ø§ Ø¨ØąÚ¯ØąŲØ§ØĒ Ø¨ØąŲ
ÛâÚ¯ØąØ¯Ų.
+
+
+
+Ø¨ØąÚ¯ØąŲØ§ØĒ ØąŲ Ų
ÛâÚ¯ÛØąÛ Ų Ø¨Ø§ ØšØ´ŲØĒ Ų
ÛâØąÛ ØŗØą Ų
ÛØ˛.
+
+ŲŲØˇ Ų
ÛâØŽŲØąÛŲØ´ŲŲØ Ų ØĒŲ
ŲŲ
Ų. âš
+
+
+
+ØØąŲ Ø˛Ø¯Ų ÛØ§ ŲØ§Øŗ Ø˛Ø¯Ų Ø˛ÛØ§Ø¯ ŲØ¨Ųد ÚŲŲ Ø¨ÛØ´ØĒØą ŲŲØĒ ØĩØąŲ Ø§ŲØĒØ¸Ø§Øą đ ØŦŲŲÛ ŲžÛØ´ØŽŲŲ Ø´Ø¯. đ
+
+/// info
+
+ØĒØĩاŲÛØą ŲØ´ŲÚ¯ Ø§Ø˛ ÚŠØĒØąÛŲØ§ ØĒاŲ
ŲžØŗŲŲ . đ¨
+
+///
+
+---
+
+ØĒŲÛ Ø§ÛŲ ØŗŲØ§ØąÛŲÛ Ø¨ØąÚ¯ØąŲØ§Û Ų
ŲØ§Ø˛ÛØ ØĒŲ ÛŲ ÚŠØ§Ų
ŲžÛŲØĒØą / Ø¨ØąŲØ§Ų
Ų đ¤ Ø¨Ø§ Ø¯Ų ØĒا ŲžØąØ¯Ø§Ø˛ŲØ¯Ų (ØĒŲ Ų ØšØ´ŲØĒ) ŲØŗØĒÛØ ŲØą Ø¯Ų Ų
ŲØĒØ¸Øą đ Ų ØĒŲØŦŲØ´ŲŲ â¯ ØąŲ Ø¨ØąØ§Û Ų
دØĒ ØˇŲŲØ§ŲÛ "Ø§ŲØĒØ¸Ø§Øą ØŦŲŲÛ ŲžÛØ´ØŽŲŲ" đ گذاشØĒŲ.
+
+ŲØŗØĒâŲŲØ¯ 8 ØĒا ŲžØąØ¯Ø§Ø˛ŲØ¯Ų (ØĩŲØ¯ŲŲØ¯Ø§Øą/ØĸØ´ŲžØ˛) Ø¯Ø§ØąŲ. Ø¯Øą ØØ§ŲÛ ÚŠŲ ŲØŗØĒâŲŲØ¯ Ø¨ØąÚ¯ØąŲØ§Û ŲŲ
âØ˛Ų
Ø§Ų Ø´Ø§ÛØ¯ ŲŲØˇ 2 ØĒا داشØĒŲ (ÛŲ ØĩŲØ¯ŲŲØ¯Ø§Øą Ų ÛŲ ØĸØ´ŲžØ˛).
+
+ŲŲÛ Ø¨Ø§ اÛŲ ØØ§ŲØ ØĒØŦØąØ¨Ų ŲŲØ§ÛÛ Ø¨ŲØĒØąÛŲ ŲÛØŗØĒ. đ
+
+---
+
+اÛŲ Ų
ØšØ§Ø¯Ų Ų
ŲØ§Ø˛Û Ø¯Ø§ØŗØĒØ§Ų Ø¨ØąÚ¯ØąŲØ§ Ø¨ŲØ¯. đ
+
+Ø¨ØąØ§Û ÛŲ Ų
ØĢØ§Ų "ŲØ§ŲØšÛâØĒØą" Ø§Ø˛ Ø˛ŲØ¯Ú¯ÛØ ÛŲ Ø¨Ø§ŲÚŠ ØąŲ ØĒØĩŲØą ÚŠŲ.
+
+ØĒا ŲŲ
ÛŲ ÚŲØ¯ ŲŲØĒ ŲžÛØ´Ø Ø¨ÛØ´ØĒØą باŲÚŠâŲØ§ ÚŲØ¯ ØĒا ØĩŲØ¯ŲŲØ¯Ø§Øą đ¨âđŧđ¨âđŧđ¨âđŧđ¨âđŧ داشØĒŲ Ų ÛŲ ØĩŲ Ø¨Ø˛ØąÚ¯ đđđđđđđđ.
+
+ŲŲ
Ų ØĩŲØ¯ŲŲØ¯Ø§ØąŲا ÚŠØ§Øą ØąŲ Ø¨Ø§ ÛŲ Ų
Ø´ØĒØąÛ Ø¨ØšØ¯ Ø§Ø˛ اŲŲ ÛÚŠÛ đ¨âđŧâ¯ Ø§ŲØŦاŲ
Ų
ÛâØ¯Ø§Ø¯Ų.
+
+Ų Ø¨Ø§ÛØ¯ ØĒŲÛ ØĩŲ đ Ų
دØĒ Ø˛ÛØ§Ø¯Û Ų
ŲØĒØ¸Øą بŲ
ŲŲÛ ŲÚ¯ØąŲŲ ŲŲØ¨ØĒØĒ ØąŲ Ø§Ø˛ Ø¯ØŗØĒ Ų
ÛâØ¯Û.
+
+Ø§ØØĒŲ
Ø§ŲØ§Ų ŲŲ
ÛâØŽŲØ§Û ØšØ´ŲØĒ đ ØąŲ Ø¨Ø§ ØŽŲØ¯ØĒ Ø¨Ø¨ØąÛ Ø¨Ø§ŲÚŠ đĻ Ø¨ØąØ§Û ÚŠØ§ØąØ§Û ØąŲØ˛Ų
ØąŲ.
+
+### ŲØĒÛØŦŲâÚ¯ÛØąÛ Ø¨ØąÚ¯ØąŲØ§
+
+ØĒŲÛ Ø§ÛŲ ØŗŲØ§ØąÛŲÛ "Ø¨ØąÚ¯ØąŲØ§Û ŲØŗØĒâŲŲØ¯ با ØšØ´ŲØĒ"Ø ÚŲŲ ÚŠŲÛ Ø§ŲØĒØ¸Ø§Øą đ ŲØŗØĒØ ØŽÛŲÛ Ų
ŲØˇŲÛâØĒØąŲ ÚŠŲ ÛŲ ØŗÛØŗØĒŲ
ŲŲ
âØ˛Ų
Ø§Ų â¸đ⯠داشØĒŲ Ø¨Ø§Ø´Û.
+
+اÛŲ Ø¨ØąØ§Û Ø¨ÛØ´ØĒØą Ø¨ØąŲØ§Ų
ŲâŲØ§Û ŲØ¨ ŲŲ
ØĩØ¯Ų Ų
ÛâÚŠŲŲ.
+
+ØŽÛŲÛ ØŽÛŲÛ ÚŠØ§ØąØ¨ØąØ ŲŲÛ ØŗØąŲØąØĒ Ų
ŲØĒØ¸Øą đ Ø§ØĒØĩØ§Ų ŲŲâÚŲØ¯Ø§Ų ØŽŲØ¨Ø´ŲŲ ŲØŗØĒ ØĒا Ø¯ØąØŽŲØ§ØŗØĒâŲØ§Ø´ŲŲ ØąŲ Ø¨ŲØąØŗØĒŲ.
+
+Ų Ø¨ØšØ¯ Ø¯ŲØ¨Ø§ØąŲ Ų
ŲØĒØ¸Øą đ ÚŠŲ ØŦŲØ§Ø¨âŲØ§ Ø¨ØąÚ¯ØąØ¯Ų.
+
+اÛŲ "Ø§ŲØĒØ¸Ø§Øą" đ ØĒŲÛ Ų
ÛÚŠØąŲØĢØ§ŲÛŲâŲØ§ Ø§ŲØ¯Ø§Ø˛ŲâÚ¯ÛØąÛ Ų
ÛâØ´ŲØ ŲŲÛ Ø¨Ø§ اÛŲ ØØ§ŲØ ØŦŲ
ؚش ÚŠŲ Ø¨ÚŠŲÛ ØĸØŽØąØ´ ÚŠŲÛ Ø§ŲØĒØ¸Ø§Øą Ų
ÛâØ´Ų.
+
+Ø¨ØąØ§Û ŲŲ
ÛŲ Ø§ØŗØĒŲØ§Ø¯Ų Ø§Ø˛ ڊد ŲØ§ŲŲ
âØ˛Ų
Ø§Ų â¸đâ¯ Ø¨ØąØ§Û APIŲØ§Û ŲØ¨ ØŽÛŲÛ Ų
ŲØˇŲÛŲ.
+
+اÛŲ ŲŲØš ŲØ§ŲŲ
âØ˛Ų
اŲÛ ÚÛØ˛ÛŲ ÚŠŲ NodeJS ØąŲ Ų
ØØ¨Ųب ÚŠØąØ¯ (Ú¯ØąÚŲ NodeJS Ų
ŲØ§Ø˛Û ŲÛØŗØĒ) Ų ŲŲØˇŲ ŲŲØĒ Go بŲâØšŲŲØ§Ų ÛŲ Ø˛Ø¨ŲŲ Ø¨ØąŲØ§Ų
ŲâŲŲÛØŗÛŲ.
+
+Ų ŲŲ
ŲŲ ØŗØˇØ ØšŲ
ŲÚŠØąØ¯Û ŲØŗØĒ ÚŠŲ Ø¨Ø§ **FastAPI** Ų
ÛâÚ¯ÛØąÛ.
+
+Ų ÚŲŲ Ų
ÛâØĒŲŲÛ ŲŲ
âØ˛Ų
اŲÛ Ų Ų
ŲØ§Ø˛ÛâØŗØ§Ø˛Û ØąŲ ŲŲ
Ø˛Ų
Ø§Ų Ø¯Ø§Ø´ØĒŲ Ø¨Ø§Ø´ÛØ ØšŲ
ŲÚŠØąØ¯ Ø¨Ø§ŲØ§ØĒØąÛ Ø§Ø˛ Ø¨ÛØ´ØĒØą ŲØąÛŲ
âŲØąÚŠâŲØ§Û ØĒØŗØĒâØ´Ø¯Ų NodeJS Ų
ÛâÚ¯ÛØąÛ Ų ŲŲ
âØĒØąØ§Ø˛ با GoØ ÚŠŲ ÛŲ Ø˛Ø¨ŲŲ ÚŠØ§Ų
ŲžØ§ÛŲâØ´Ø¯Ų ŲØ˛Ø¯ÛÚŠ Ø¨Ų C ŲØŗØĒ (ŲŲ
Ų Ø§ÛŲØ§ Ø¨Ų ŲØˇŲ Starlette) .
+
+### ØĸÛØ§ ŲŲ
âØ˛Ų
اŲÛ Ø§Ø˛ Ų
ŲØ§Ø˛ÛâØŗØ§Ø˛Û Ø¨ŲØĒØąŲØ
+
+ŲŲ! اÛŲ ŲØĒÛØŦŲ Ø¯Ø§ØŗØĒØ§Ų ŲÛØŗØĒ.
+
+ŲŲ
âØ˛Ų
اŲÛ Ø¨Ø§ Ų
ŲØ§Ø˛ÛâØŗØ§Ø˛Û ŲØąŲ Ø¯Ø§ØąŲ. Ų ØĒŲÛ **ØŗŲØ§ØąÛŲŲØ§Û ؎اØĩ** ÚŠŲ ÚŠŲÛ Ø§ŲØĒØ¸Ø§Øą Ø¯Ø§ØąŲ Ø¨ŲØĒØąŲ. Ø¨Ų ŲŲ
ÛŲ ØŽØ§ØˇØąØ Ų
ØšŲ
ŲŲØ§Ų Ø¨ØąØ§Û ØĒŲØŗØšŲ Ø¨ØąŲØ§Ų
ŲâŲØ§Û ŲØ¨ ØŽÛŲÛ Ø§Ø˛ Ų
ŲØ§Ø˛ÛâØŗØ§Ø˛Û Ø¨ŲØĒØąŲ. ŲŲÛ ŲŲ Ø¨ØąØ§Û ŲŲ
ŲâÚÛØ˛.
+
+Ø¨ØąØ§Û Ø§ÛŲÚŠŲ ÛŲ ØĒØšØ§Ø¯Ų Ø¨Ø°Ø§ØąÛŲ
Ø Ø§ÛŲ Ø¯Ø§ØŗØĒØ§Ų ÚŠŲØĒØ§Ų ØąŲ ØĒØĩŲØą ÚŠŲ:
+
+> Ø¨Ø§ÛØ¯ ÛŲ ØŽŲŲŲ Ø¨Ø˛ØąÚ¯ Ų ÚŠØĢÛŲ ØąŲ ØĒŲ
ÛØ˛ ÚŠŲÛ.
+
+*ØĸØąŲØ ÚŠŲ Ø¯Ø§ØŗØĒØ§Ų ŲŲ
ÛŲŲ*.
+
+---
+
+ŲÛÚ Ø§ŲØĒØ¸Ø§ØąÛ đ Ø§ŲŲØŦا ŲÛØŗØĒØ ŲŲØˇ ÚŠŲÛ ÚŠØ§Øą Ø¨ØąØ§Û Ø§ŲØŦاŲ
Ø¯Ø§Ø¯Ų ØĒŲÛ ØŦØ§ŲØ§Û Ų
ØŽØĒŲŲ ØŽŲŲŲ.
+
+Ų
ÛâØĒŲŲÛ Ų
ØĢŲ Ų
ØĢØ§Ų Ø¨ØąÚ¯ØąŲØ§ ŲŲØ¨ØĒ Ø¨Ø°Ø§ØąÛØ اŲŲ ŲžØ°ÛØąØ§ÛÛØ بؚد ØĸØ´ŲžØ˛ØŽŲŲŲØ ŲŲÛ ÚŲŲ Ų
ŲØĒØ¸Øą ÚÛØ˛Û ŲÛØŗØĒÛ đØ ŲŲØˇ Ø¯Ø§ØąÛ ØĒŲ
ÛØ˛ Ų
ÛâÚŠŲÛ Ų ØĒŲ
ÛØ˛ Ų
ÛâÚŠŲÛØ ŲŲØ¨ØĒâŲØ§ ŲÛÚ ØĒØŖØĢÛØąÛ ŲØ¯Ø§ØąŲ.
+
+با ŲŲØ¨ØĒ ÛØ§ بدŲŲ ŲŲØ¨ØĒ (ŲŲ
âØ˛Ų
اŲÛ) ŲŲ
ŲŲ ŲØ¯Øą ØˇŲŲ Ų
ÛâÚŠØ´Ų ØĒا ØĒŲ
ŲŲ
Ø´ ÚŠŲÛ Ų ŲŲ
ŲŲ Ų
ŲØ¯Ø§Øą ÚŠØ§Øą ØąŲ ÚŠØąØ¯Û.
+
+ŲŲÛ ØĒŲÛ Ø§ÛŲ Ų
ŲŲØšÛØĒØ Ø§Ú¯Ų Ø¨ØĒŲŲÛ Ø§ŲŲ 8 ØĒا ØĩŲØ¯ŲŲØ¯Ø§Øą/ØĸØ´ŲžØ˛/ØØ§Ųا-ØĒŲ
ÛØ˛ÚŠØ§Øą ØąŲ Ø¨ÛØ§ØąÛØ Ų ŲØą ڊدŲŲ
Ø´ŲŲ (بŲâØšŲØ§ŲŲ ØŽŲØ¯ØĒ) ÛŲ ŲØŗŲ
ØĒ Ø§Ø˛ ØŽŲŲŲ ØąŲ ØĒŲ
ÛØ˛ ÚŠŲŲØ Ų
ÛâØĒŲŲÛ ŲŲ
Ų ÚŠØ§Øą ØąŲ **Ų
ŲØ§Ø˛Û** Ø§ŲØŦاŲ
Ø¨Ø¯ÛØ با ÚŠŲ
ÚŠ اØļاŲÛØ Ų ØŽÛŲÛ Ø˛ŲØ¯ØĒØą ØĒŲ
ŲŲ
Ø´ ÚŠŲÛ.
+
+ØĒŲÛ Ø§ÛŲ ØŗŲØ§ØąÛŲØ ŲØą ڊدŲŲ
Ø§Ø˛ ØĒŲ
ÛØ˛ÚŠØ§ØąŲا (Ø§Ø˛ ØŦŲ
ŲŲ ØŽŲØ¯ØĒ) ÛŲ ŲžØąØ¯Ø§Ø˛ŲØ¯ŲâØŗØĒ ÚŠŲ ÚŠØ§Øą ØŽŲØ¯Ø´ ØąŲ Ų
ÛâÚŠŲŲ.
+
+Ų ÚŲŲ Ø¨ÛØ´ØĒØą Ø˛Ų
Ø§Ų Ø§ØŦØąØ§ ØĩØąŲ ÚŠØ§Øą ŲØ§ŲØšÛ Ų
ÛâØ´Ų (Ø¨Ų ØŦØ§Û Ø§ŲØĒØ¸Ø§Øą)Ø Ų ÚŠØ§Øą ØĒŲÛ ÚŠØ§Ų
ŲžÛŲØĒØą Ø¨Ø§ CPU Ø§ŲØŦاŲ
Ų
ÛâØ´ŲØ Ø¨Ų Ø§ÛŲ Ų
Ø´ÚŠŲØ§ØĒ Ų
ÛâÚ¯Ų "CPU bound".
+
+---
+
+Ų
ØĢاŲâŲØ§Û ØąØ§ÛØŦ ØšŲ
ŲÛØ§ØĒ CPU bound ÚÛØ˛Ø§ÛÛ ŲØŗØĒŲ ÚŠŲ ŲÛØ§Ø˛ Ø¨Ų ŲžØąØ¯Ø§Ø˛Ø´ ØąÛØ§ØļÛ ŲžÛÚÛØ¯Ų Ø¯Ø§ØąŲ.
+
+Ų
ØĢŲØ§Ų:
+
+* ŲžØąØ¯Ø§Ø˛Ø´ **Øĩدا** ÛØ§ **ØĒØĩŲÛØą**.
+* **بÛŲØ§ÛÛ ÚŠØ§Ų
ŲžÛŲØĒØąÛ**: ÛŲ ØĒØĩŲÛØą Ø§Ø˛ Ų
ÛŲÛŲŲâŲØ§ ŲžÛÚŠØŗŲ ØĒØ´ÚŠÛŲ Ø´Ø¯ŲØ ŲØą ŲžÛÚŠØŗŲ 3 ØĒا Ų
ŲØ¯Ø§Øą / ØąŲÚ¯ Ø¯Ø§ØąŲØ ŲžØąØ¯Ø§Ø˛Ø´Ø´ Ų
ØšŲ
ŲŲØ§Ų ŲÛØ§Ø˛ Ø¯Ø§ØąŲ ÚÛØ˛Û ØąŲ ØąŲ Ø§ŲŲ ŲžÛÚŠØŗŲâŲØ§ ŲŲ
Ø˛Ų
Ø§Ų ØØŗØ§Ø¨ ÚŠŲÛ.
+* **ÛØ§Ø¯Ú¯ÛØąÛ Ų
اشÛŲ**: Ų
ØšŲ
ŲŲØ§Ų ÚŠŲÛ ØļØąØ¨ "Ų
اØĒØąÛØŗ" Ų "Ø¨ØąØ¯Ø§Øą" ŲØ§Ø˛Ų
Ø¯Ø§ØąŲ. ÛŲ ØŦدŲŲ Ø¨Ø˛ØąÚ¯ ŲžØą Ø§Ø˛ ؚدد ØąŲ ØĒØĩŲØą ÚŠŲ ÚŠŲ ŲŲ
ŲâØ´ŲŲ ØąŲ ŲŲ
Ø˛Ų
Ø§Ų ØļØąØ¨ Ų
ÛâÚŠŲÛ.
+* **ÛØ§Ø¯Ú¯ÛØąÛ ØšŲ
ÛŲ**: اÛŲ ÛŲ Ø˛ÛØąØ´Ø§ØŽŲ Ø§Ø˛ ÛØ§Ø¯Ú¯ÛØąÛ Ų
اشÛŲŲØ ŲžØŗ ŲŲ
ŲŲ ŲØļÛŲ ØĩØ¯Ų Ų
ÛâÚŠŲŲ. ŲŲØˇ اÛŲ ÚŠŲ ÛŲ ØŦدŲŲ ØšØ¯Ø¯ Ø¨ØąØ§Û ØļØąØ¨ ÚŠØąØ¯Ų ŲÛØŗØĒØ Ø¨ŲÚŠŲ ÛŲ Ų
ØŦŲ
ŲØšŲ Ø¨Ø˛ØąÚ¯ Ø§Ø˛ اŲŲØ§ ŲØŗØĒØ Ų ØĒŲÛ ØŽÛŲÛ Ų
ŲØ§ØąØ¯ Ø§Ø˛ ÛŲ ŲžØąØ¯Ø§Ø˛ŲØ¯Ų ؎اØĩ Ø¨ØąØ§Û ØŗØ§ØŽØĒ Ų / ÛØ§ Ø§ØŗØĒŲØ§Ø¯Ų Ø§Ø˛ اÛŲ Ų
دŲâŲØ§ Ø§ØŗØĒŲØ§Ø¯Ų Ų
ÛâÚŠŲÛ.
+
+### ŲŲ
âØ˛Ų
اŲÛ + Ų
ŲØ§Ø˛ÛâØŗØ§Ø˛Û: ŲØ¨ + ÛØ§Ø¯Ú¯ÛØąÛ Ų
اشÛŲ
+
+با **FastAPI** Ų
ÛâØĒŲŲÛ Ø§Ø˛ ŲŲ
âØ˛Ų
اŲÛ ÚŠŲ Ø¨ØąØ§Û ØĒŲØŗØšŲ ŲØ¨ ØŽÛŲÛ ØąØ§ÛØŦŲ (ŲŲ
ŲŲ ØŦØ°Ø§Ø¨ÛØĒ Ø§ØĩŲÛ NodeJS) Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲÛ.
+
+ŲŲÛ Ų
ÛâØĒŲŲÛ Ø§Ø˛ ŲŲØ§Ûد Ų
ŲØ§Ø˛ÛâØŗØ§Ø˛Û Ų ÚŲØ¯ŲžØąØ¯Ø§Ø˛Ø´Û (اØŦØąØ§Û ÚŲØ¯ ŲžØąŲØŗŲ بŲâØĩŲØąØĒ Ų
ŲØ§Ø˛Û) Ø¨ØąØ§Û ÚŠØ§ØąØ§Û **CPU bound** Ų
ØĢŲ ØŗÛØŗØĒŲ
âŲØ§Û ÛØ§Ø¯Ú¯ÛØąÛ Ų
اشÛŲ ŲŲ
Ø¨ŲØąŲ Ø¨Ø¨ØąÛ.
+
+اÛŲØ بŲâØšŲØ§ŲŲ Ø§ÛŲ ŲØ§ŲØšÛØĒ ØŗØ§Ø¯Ų ÚŠŲ ŲžØ§ÛØĒŲŲ Ø˛Ø¨ŲŲ Ø§ØĩŲÛ Ø¨ØąØ§Û **ØšŲŲ
دادŲ**Ø ÛØ§Ø¯Ú¯ÛØąÛ Ų
اشÛŲ Ų Ø¨ŲâØŽØĩŲØĩ ÛØ§Ø¯Ú¯ÛØąÛ ØšŲ
ÛŲŲØ باؚØĢ Ų
ÛâØ´Ų FastAPI ÛŲ Ø§ŲØĒØŽØ§Ø¨ ØŽÛŲÛ ØŽŲØ¨ Ø¨ØąØ§Û APIŲØ§ Ų Ø¨ØąŲØ§Ų
ŲâŲØ§Û ŲØ¨ ØšŲŲ
Ø¯Ø§Ø¯Ų / ÛØ§Ø¯Ú¯ÛØąÛ Ų
اشÛŲ Ø¨Ø§Ø´Ų (بÛŲ ØŽÛŲÛ ÚÛØ˛Ø§Û دÛÚ¯Ų).
+
+Ø¨ØąØ§Û Ø¯ÛØ¯Ų اÛŲÚŠŲ ÚØˇŲØą ØĒŲÛ Ų
ØÛØˇ ŲØ§ŲØšÛ Ø¨Ų Ø§ÛŲ Ų
ŲØ§Ø˛ÛâØŗØ§Ø˛Û Ø¨ØąØŗÛØ ب؎ش [Ø§ØŗØĒŲØąØ§Øą](deployment/index.md){.internal-link target=_blank} ØąŲ Ø¨Ø¨ÛŲ.
+
+## `async` Ų `await`
+
+ŲØŗØŽŲâŲØ§Û Ų
Ø¯ØąŲ ŲžØ§ÛØĒŲŲ ÛŲ ØąØ§Ų ØŽÛŲÛ ØŗØ§Ø¯Ų Ų ŲØ§Ø¨ŲâŲŲŲ
Ø¨ØąØ§Û ØĒØšØąÛŲ ÚŠØ¯ ŲØ§ŲŲ
âØ˛Ų
Ø§Ų Ø¯Ø§ØąŲ. اÛŲ Ø¨Ø§ØšØĢ Ų
ÛâØ´Ų Ų
ØĢŲ ÚŠØ¯ "ØĒØąØĒÛØ¨Û" Ų
ØšŲ
ŲŲÛ Ø¨Ų ŲØ¸Øą Ø¨ÛØ§Ø¯ Ų ØĒŲÛ ŲØØ¸ŲâŲØ§Û Ø¯ØąØŗØĒ "Ø§ŲØĒØ¸Ø§Øą" ØąŲ Ø¨ØąØ§ØĒ Ø§ŲØŦاŲ
بدŲ.
+
+ŲŲØĒÛ ÛŲ ØšŲ
ŲÛØ§ØĒÛ ŲØŗØĒ ÚŠŲ ŲØ¨Ų Ø§Ø˛ Ø¯Ø§Ø¯Ų ŲØĒÛØŦŲâŲØ§ ŲÛØ§Ø˛ Ø¨Ų Ø§ŲØĒØ¸Ø§Øą Ø¯Ø§ØąŲ Ų Ø§Ø˛ اÛŲ ŲØ§Ø¨ŲÛØĒâŲØ§Û ØŦØ¯ÛØ¯ ŲžØ§ÛØĒŲŲ ŲžØ´ØĒÛØ¨Ø§ŲÛ Ų
ÛâÚŠŲŲØ Ų
ÛâØĒŲŲÛ Ø§ÛŲØŦŲØąÛ ڊدŲŲÛØŗÛØ´ ÚŠŲÛ:
+
+```Python
+burgers = await get_burgers(2)
+```
+
+ŲÚŠØĒŲ ÚŠŲÛØ¯Û اÛŲØŦا `await` ŲØŗØĒ. Ø¨Ų ŲžØ§ÛØĒŲŲ Ų
ÛâÚ¯Ų ÚŠŲ Ø¨Ø§ÛØ¯ ⸠Ų
ŲØĒØ¸Øą بŲ
ŲŲŲ ØĒا `get_burgers(2)` ÚŠØ§ØąØ´ đ ØĒŲ
ŲŲ
Ø¨Ø´Ų ŲØ¨Ų Ø§Ø˛ اÛŲÚŠŲ ŲØĒÛØŦŲâŲØ§ ØąŲ ØĒŲÛ `burgers` Ø°ØŽÛØąŲ ÚŠŲŲ. با اÛŲØ ŲžØ§ÛØĒŲŲ Ų
ÛâØ¯ŲŲŲ ÚŠŲ Ų
ÛâØĒŲŲŲ Ø¨ØąŲ ÛŲ ÚŠØ§Øą دÛÚ¯Ų đ ⯠ØĒŲÛ Ø§ÛŲ Ų
دØĒ بڊŲŲ (Ų
ØĢŲ Ú¯ØąŲØĒŲ ÛŲ Ø¯ØąØŽŲØ§ØŗØĒ دÛÚ¯Ų).
+
+Ø¨ØąØ§Û Ø§ÛŲÚŠŲ `await` ÚŠØ§Øą ÚŠŲŲØ Ø¨Ø§ÛØ¯ ØĒŲÛ ÛŲ ØĒابؚ Ø¨Ø§Ø´Ų ÚŠŲ Ø§Ø˛ اÛŲ ŲØ§ŲŲ
âØ˛Ų
اŲÛ ŲžØ´ØĒÛØ¨Ø§ŲÛ ÚŠŲŲ. Ø¨ØąØ§Û Ø§ÛŲ ÚŠØ§ØąØ ŲŲØˇ با `async def` ØĒØšØąÛŲØ´ Ų
ÛâÚŠŲÛ:
+
+```Python hl_lines="1"
+async def get_burgers(number: int):
+ # ÛŲ ØŗØąÛ ÚŠØ§Øą ŲØ§ŲŲ
âØ˛Ų
Ø§Ų Ø¨ØąØ§Û ØŗØ§ØŽØĒŲ Ø¨ØąÚ¯ØąŲØ§ Ø§ŲØŦاŲ
بدŲ
+ return burgers
+```
+
+...Ø¨Ų ØŦØ§Û `def`:
+
+```Python hl_lines="2"
+# اÛŲ ŲØ§ŲŲ
âØ˛Ų
Ø§Ų ŲÛØŗØĒ
+def get_sequential_burgers(number: int):
+ # ÛŲ ØŗØąÛ ÚŠØ§Øą ØĒØąØĒÛØ¨Û Ø¨ØąØ§Û ØŗØ§ØŽØĒŲ Ø¨ØąÚ¯ØąŲØ§ Ø§ŲØŦاŲ
بدŲ
+ return burgers
+```
+
+با `async def`Ø ŲžØ§ÛØĒŲŲ Ų
ÛâØ¯ŲŲŲ ÚŠŲ ØĒŲÛ Ø§ŲŲ ØĒابؚ Ø¨Ø§ÛØ¯ ØŲØ§ØŗØ´ Ø¨Ų ØšØ¨Ø§ØąØĒâŲØ§Û `await` Ø¨Ø§Ø´ŲØ Ų Ų
ÛâØĒŲŲŲ Ø§ØŦØąØ§Û Ø§ŲŲ ØĒابؚ ØąŲ "Ų
ŲŲØĒØ§Ų Ų
ØĒŲŲŲ" ⸠ڊŲŲ Ų Ø¨ØąŲ ÛŲ ÚŠØ§Øą دÛÚ¯Ų đ ŲØ¨Ų Ø§Ø˛ Ø¨ØąÚ¯Ø´ØĒŲ Ø¨ÚŠŲŲ.
+
+ŲŲØĒÛ Ų
ÛâØŽŲØ§Û ÛŲ ØĒابؚ `async def` ØąŲ Øĩدا ÚŠŲÛØ Ø¨Ø§ÛØ¯ "Ų
ŲØĒØ¸ØąØ´" بŲ
ŲŲÛ. ŲžØŗ اÛŲ ÚŠØ§Øą ŲŲ
ÛâÚŠŲŲ:
+
+```Python
+# اÛŲ ÚŠØ§Øą ŲŲ
ÛâÚŠŲŲØ ÚŲŲ get_burgers با async def ØĒØšØąÛŲ Ø´Ø¯Ų
+burgers = get_burgers(2)
+```
+
+---
+
+ŲžØŗØ Ø§Ú¯Ų Ø§Ø˛ ÛŲ ÚŠØĒاب؎ŲŲŲ Ø§ØŗØĒŲØ§Ø¯Ų Ų
ÛâÚŠŲÛ ÚŠŲ Ø¨ŲØĒ Ų
ÛâÚ¯Ų Ų
ÛâØĒŲŲÛ Ø¨Ø§ `await` Øĩداش ÚŠŲÛØ Ø¨Ø§ÛØ¯ *ØĒŲØ§Ø¨Øš ØšŲ
ŲÛØ§ØĒ Ų
ØŗÛØąØĒ* ÚŠŲ Ø§Ø˛Ø´ Ø§ØŗØĒŲØ§Ø¯Ų Ų
ÛâÚŠŲŲ ØąŲ Ø¨Ø§ `async def` Ø¨ØŗØ§Ø˛ÛØ Ų
ØĢŲ:
+
+```Python hl_lines="2-3"
+@app.get('/burgers')
+async def read_burgers():
+ burgers = await get_burgers(2)
+ return burgers
+```
+
+### ØŦØ˛ØĻÛØ§ØĒ ŲŲÛâØĒØą
+
+Ø´Ø§ÛØ¯ Ų
ØĒŲØŦŲ Ø´Ø¯Ų Ø¨Ø§Ø´Û ÚŠŲ `await` ŲŲØˇ ØĒŲÛ ØĒŲØ§Ø¨ØšÛ ÚŠŲ Ø¨Ø§ `async def` ØĒØšØąÛŲ Ø´Ø¯Ų Ų
ÛâØĒŲŲŲ Ø§ØŗØĒŲØ§Ø¯Ų بشŲ.
+
+ŲŲÛ Ø¯Øą ØšÛŲ ØØ§ŲØ ØĒŲØ§Ø¨ØšÛ ÚŠŲ Ø¨Ø§ `async def` ØĒØšØąÛŲ Ø´Ø¯Ų Ø¨Ø§ÛØ¯ "Ų
ŲØĒØ¸Øą"Ø´ŲŲ Ø¨Ų
ŲŲÛ. ŲžØŗ ØĒŲØ§Ø¨Øš با `async def` ŲŲØˇ ØĒŲÛ ØĒŲØ§Ø¨ØšÛ ÚŠŲ Ø¨Ø§ `async def` ØĒØšØąÛŲ Ø´Ø¯Ų Ų
ÛâØĒŲŲŲ Øĩدا Ø˛Ø¯Ų Ø¨Ø´Ų.
+
+ØØ§ŲØ§Ø ŲØļÛŲ Ų
ØąØē Ų ØĒØŽŲ
âŲ
ØąØē ÚÛŲØ ÚØˇŲØą اŲŲÛŲ ØĒابؚ `async` ØąŲ Øĩدا Ų
ÛâÚŠŲÛØ
+
+Ø§Ú¯Ų Ø¨Ø§ **FastAPI** ÚŠØ§Øą Ų
ÛâÚŠŲÛØ ŲØ§Ø˛Ų
ŲÛØŗØĒ ŲÚ¯ØąØ§Ų Ø§ÛŲ Ø¨Ø§Ø´ÛØ ÚŲŲ Ø§ŲŲ "اŲŲÛŲ" ØĒØ§Ø¨ØšØ *ØĒابؚ ØšŲ
ŲÛØ§ØĒ Ų
ØŗÛØąØĒ* ŲØŗØĒØ Ų FastAPI Ų
ÛâØ¯ŲŲŲ ÚØˇŲØą ÚŠØ§Øą Ø¯ØąØŗØĒ ØąŲ Ø¨ÚŠŲŲ.
+
+ŲŲÛ Ø§Ú¯Ų Ø¨ØŽŲØ§Û بدŲŲ FastAPI Ø§Ø˛ `async` / `await` Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲÛØ اÛŲŲ
Ų
Ų
ÚŠŲŲ.
+
+### ڊد ŲØ§ŲŲ
âØ˛Ų
Ø§Ų ØŽŲØ¯ØĒ ØąŲ Ø¨ŲŲÛØŗ
+
+Starlette (Ų **FastAPI**) Ø¨Øą ŲžØ§ÛŲ AnyIO ŲØŗØĒŲØ ÚŠŲ Ø¨Ø§ØšØĢ Ų
ÛâØ´Ų Ø¨Ø§ ÚŠØĒاب؎ŲŲŲ Ø§ØŗØĒØ§ŲØ¯Ø§ØąØ¯ ŲžØ§ÛØĒŲŲ asyncio Ų Trio ØŗØ§Ø˛Ú¯Ø§Øą باشŲ.
+
+بŲâØŽØĩŲØĩØ Ų
ÛâØĒŲŲÛ Ų
ØŗØĒŲÛŲ
Ø§Ų Ø§Ø˛ AnyIO Ø¨ØąØ§Û Ų
ŲØ§ØąØ¯ Ø§ØŗØĒŲØ§Ø¯Ų ŲžÛØ´ØąŲØĒŲ ŲŲ
âØ˛Ų
اŲÛ ÚŠŲ ŲÛØ§Ø˛ Ø¨Ų Ø§ŲÚ¯ŲŲØ§Û ŲžÛÚÛØ¯ŲâØĒØą ØĒŲÛ ÚŠØ¯ ØŽŲØ¯ØĒ Ø¯Ø§ØąŲ Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲÛ.
+
+Ų ØØĒÛ Ø§Ú¯Ų Ø§Ø˛ FastAPI Ø§ØŗØĒŲØ§Ø¯Ų ŲÚŠŲÛØ Ų
ÛâØĒŲŲÛ Ø¨ØąŲØ§Ų
ŲâŲØ§Û ŲØ§ŲŲ
âØ˛Ų
Ø§Ų ØŽŲØ¯ØĒ ØąŲ Ø¨Ø§ AnyIO بŲŲÛØŗÛ ØĒا ØŽÛŲÛ ØŗØ§Ø˛Ú¯Ø§Øą Ø¨Ø§Ø´Ų Ų ŲŲØ§Ûدش ØąŲ Ø¨Ú¯ÛØąÛ (Ų
ØĢŲ *ŲŲ
âØ˛Ų
اŲÛ ØŗØ§ØŽØĒØ§ØąÛØ§ŲØĒŲ*).
+
+Ų
Ų ÛŲ ÚŠØĒاب؎ŲŲŲ Ø¯ÛÚ¯Ų ØąŲÛ AnyIO ØŗØ§ØŽØĒŲ
Ø ÛŲ ŲØ§ÛŲ ŲØ§Ø˛ÚŠ ØąŲØ´Ø ØĒا ÛŲ ÚŠŲ
annotationŲØ§Û ŲŲØš ØąŲ Ø¨ŲØĒØą ÚŠŲŲ
Ų **ØĒÚŠŲ
ÛŲ ØŽŲØ¯ÚŠØ§Øą** Ø¨ŲØĒØąØ **ØŽØˇØ§ŲØ§Û Ø¯ØąŲŲâØŽØˇÛ** Ų ØēÛØąŲ Ø¨Ú¯ÛØąŲ
. ÛŲ Ų
ŲØ¯Ų
Ų Ų ØĸŲ
ŲØ˛Ø´ ØŗØ§Ø¯Ų ŲŲ
Ø¯Ø§ØąŲ ÚŠŲ Ø¨ŲØĒ ÚŠŲ
ÚŠ Ų
ÛâÚŠŲŲ **بŲŲŲ
Û** Ų **ڊد ŲØ§ŲŲ
âØ˛Ų
Ø§Ų ØŽŲØ¯ØĒ ØąŲ Ø¨ŲŲÛØŗÛ**: Asyncer . Ø§Ú¯Ų Ø¨ØŽŲØ§Û **ڊد ŲØ§ŲŲ
âØ˛Ų
Ø§Ų ØąŲ Ø¨Ø§ ڊد Ų
ØšŲ
ŲŲÛ** (Ø¨ŲØ§ÚŠâÚŠŲŲØ¯Ų/ŲŲ
âØ˛Ų
اŲ) ØĒØąÚŠÛØ¨ ÚŠŲÛ ØŽÛŲÛ Ø¨ŲâØ¯ØąØ¯ØĒ Ų
ÛâØŽŲØąŲ.
+
+### Ø´ÚŠŲâŲØ§Û دÛÚ¯Ų ÚŠØ¯ ŲØ§ŲŲ
âØ˛Ų
اŲ
+
+اÛŲ ØŗØ¨ÚŠ Ø§ØŗØĒŲØ§Ø¯Ų Ø§Ø˛ `async` Ų `await` ØĒŲÛ Ø˛Ø¨ŲŲ ŲØŗØ¨ØĒØ§Ų ØŦØ¯ÛØ¯Ų.
+
+ŲŲÛ ÚŠØ§Øą با ڊد ŲØ§ŲŲ
âØ˛Ų
Ø§Ų ØąŲ ØŽÛŲÛ ØŗØ§Ø¯ŲâØĒØą Ų
ÛâÚŠŲŲ.
+
+ŲŲ
ÛŲ ØŗÛŲØĒÚŠØŗ (ÛØ§ ØĒŲØąÛØ¨Ø§Ų ÛÚŠØŗØ§Ų) Ø§ØŽÛØąØ§Ų ØĒŲÛ ŲØŗØŽŲâŲØ§Û Ų
Ø¯ØąŲ ØŦØ§ŲØ§Ø§ØŗÚŠØąÛŲžØĒ (ØĒŲÛ Ų
ØąŲØąÚ¯Øą Ų NodeJS) ŲŲ
اØļاŲŲ Ø´Ø¯Ų.
+
+ŲŲÛ ŲØ¨Ų Ø§Ø˛ اŲŲØ Ų
Ø¯ÛØąÛØĒ ڊد ŲØ§ŲŲ
âØ˛Ų
Ø§Ų ØŽÛŲÛ ŲžÛÚÛØ¯ŲâØĒØą Ų ØŗØŽØĒâØĒØą Ø¨ŲØ¯.
+
+ØĒŲÛ ŲØŗØŽŲâŲØ§Û ŲØ¨ŲÛ ŲžØ§ÛØĒŲŲØ Ų
ÛâØĒŲŲØŗØĒÛ Ø§Ø˛ ŲØŽâŲØ§ ÛØ§ Gevent Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲÛ. ŲŲÛ ÚŠØ¯ ØŽÛŲÛ ŲžÛÚÛØ¯ŲâØĒØą Ų
ÛâØ´Ų Ø¨ØąØ§Û ŲŲŲ
ÛØ¯ŲØ Ø¯ÛØ¨Ø§Ú¯ ÚŠØąØ¯Ų Ų ŲÚŠØą ÚŠØąØ¯Ų Ø¨ŲØ´.
+
+ØĒŲÛ ŲØŗØŽŲâŲØ§Û ŲØ¨ŲÛ NodeJS / ØŦØ§ŲØ§Ø§ØŗÚŠØąÛŲžØĒ Ų
ØąŲØąÚ¯ØąØ Ø§Ø˛ "ڊاŲâØ¨ÚŠâŲØ§" Ø§ØŗØĒŲØ§Ø¯Ų Ų
ÛâÚŠØąØ¯Û. ÚŠŲ Ų
ÛâØąØŗÛØ¯ Ø¨Ų ØŦŲØ§Ų ڊاŲâØ¨ÚŠâŲØ§ .
+
+## ÚŠØąŲØĒÛŲâŲØ§
+
+**ÚŠØąŲØĒÛŲ** ŲŲØˇ ÛŲ Ø§ØĩØˇŲØ§Ø ØŽÛŲÛ Ø´ÛÚŠ Ø¨ØąØ§Û ÚÛØ˛ÛŲ ÚŠŲ ÛŲ ØĒابؚ `async def` Ø¨ØąŲ
ÛâÚ¯ØąØ¯ŲŲŲ. ŲžØ§ÛØĒŲŲ Ų
ÛâØ¯ŲŲŲ ÚŠŲ Ø§ÛŲ ÛŲ ÚÛØ˛Û Ų
ØĢŲ ØĒابؚ ŲØŗØĒØ Ų
ÛâØĒŲŲŲ Ø´ØąŲØš Ø¨Ø´Ų Ų ÛŲ ØŦاÛÛ ØĒŲ
ŲŲ
Ø¨Ø´ŲØ ŲŲÛ Ų
Ų
ÚŠŲŲ Ø¯Ø§ØŽŲØ´ ŲŲ
Ų
ŲŲŲ â¸ Ø¨Ø´ŲØ ŲØą ŲŲØĒ ÛŲ `await` ØĒŲØ´ باشŲ.
+
+ŲŲÛ ŲŲ
Ų Ø§ÛŲ ŲØ§Ø¨ŲÛØĒ Ø§ØŗØĒŲØ§Ø¯Ų Ø§Ø˛ ڊد ŲØ§ŲŲ
âØ˛Ų
Ø§Ų Ø¨Ø§ `async` Ų `await` ØŽÛŲÛ ŲŲØĒØ§ ØŽŲØ§ØĩŲ Ų
ÛâØ´Ų Ø¨Ų Ø§ØŗØĒŲØ§Ø¯Ų Ø§Ø˛ "ÚŠØąŲØĒÛŲâŲØ§". اÛŲ ŲØ§Ø¨Ų Ų
ŲØ§ÛØŗŲ Ø¨Ø§ ŲÛÚÚ¯Û Ø§ØĩŲÛ GoØ ÛØšŲÛ "GoroutineŲØ§" ŲØŗØĒ.
+
+## ŲØĒÛØŦŲâÚ¯ÛØąÛ
+
+Ø¨ÛØ§Ûد ŲŲ
ŲŲ ØŦŲ
ŲŲ Ø§Ø˛ Ø¨Ø§ŲØ§ ØąŲ Ø¨Ø¨ÛŲÛŲ
:
+
+> ŲØŗØŽŲâŲØ§Û Ų
Ø¯ØąŲ ŲžØ§ÛØĒŲŲ Ø§Ø˛ **"ڊد ŲØ§ŲŲ
âØ˛Ų
اŲ"** با ÚÛØ˛Û ÚŠŲ Ø¨ŲØ´ **"ÚŠØąŲØĒÛŲ"** Ų
ÛâÚ¯Ų ŲžØ´ØĒÛØ¨Ø§ŲÛ Ų
ÛâÚŠŲŲØ با ØŗÛŲØĒÚŠØŗ **`async` Ų `await`**.
+
+ØØ§Ųا Ø¨Ø§ÛØ¯ Ø¨ÛØ´ØĒØą Ø¨ØąØ§ØĒ Ų
ØšŲÛ Ø¨Ø¯Ų. â¨
+
+ŲŲ
Ų Ø§ÛŲØ§ ÚÛØ˛ÛŲ ÚŠŲ Ø¨Ų FastAPI (Ø§Ø˛ ØˇØąÛŲ Starlette) ŲØ¯ØąØĒ Ų
ÛâØ¯Ų Ų Ø¨Ø§ØšØĢ Ų
ÛâØ´Ų ØšŲ
ŲÚŠØąØ¯ ÚØ´Ų
Ú¯ÛØąÛ داشØĒŲ Ø¨Ø§Ø´Ų.
+
+## ØŦØ˛ØĻÛØ§ØĒ ØŽÛŲÛ ŲŲÛ
+
+/// warning
+
+Ø§ØØĒŲ
Ø§ŲØ§Ų Ų
ÛâØĒŲŲÛ Ø§ÛŲŲ ØąØ¯ ÚŠŲÛ.
+
+اÛŲØ§ ØŦØ˛ØĻÛØ§ØĒ ØŽÛŲÛ ŲŲÛ Ø§Ø˛ ŲØŲŲ ÚŠØ§Øą **FastAPI** Ø˛ÛØą ŲžŲØŗØĒŲâØŗØĒ.
+
+Ø§Ú¯Ų ÛŲ ÚŠŲ
Ø¯Ø§ŲØ´ ŲŲÛ (ÚŠØąŲØĒÛŲâŲØ§Ø ŲØŽâŲØ§Ø Ø¨ŲØ§ÚŠ ÚŠØąØ¯Ų Ų ØēÛØąŲ) Ø¯Ø§ØąÛ Ų ÚŠŲØŦڊاŲÛ ÚŠŲ FastAPI ÚØˇŲØą `async def` ØąŲ Ø¯Øą Ų
ŲØ§Ø¨Ų `def` Ų
ØšŲ
ŲŲÛ Ų
Ø¯ÛØąÛØĒ Ų
ÛâÚŠŲŲØ اداŲ
Ų Ø¨Ø¯Ų.
+
+///
+
+### ØĒŲØ§Ø¨Øš ØšŲ
ŲÛØ§ØĒ Ų
ØŗÛØą
+
+ŲŲØĒÛ ÛŲ *ØĒابؚ ØšŲ
ŲÛØ§ØĒ Ų
ØŗÛØą* ØąŲ Ø¨Ø§ `def` Ų
ØšŲ
ŲŲÛ Ø¨Ų ØŦØ§Û `async def` ØĒØšØąÛŲ Ų
ÛâÚŠŲÛØ ØĒŲÛ ÛŲ Ø§ØŗØĒØŽØą ŲØŽ ØŽØ§ØąØŦÛ Ø§ØŦØąØ§ Ų
ÛâØ´Ų ÚŠŲ Ø¨ØšØ¯Ø´ Ų
ŲØĒØ¸ØąØ´ Ų
ÛâŲ
ŲŲŲØ Ø¨Ų ØŦØ§Û Ø§ÛŲÚŠŲ Ų
ØŗØĒŲÛŲ
Øĩداش ÚŠŲŲ (ÚŲŲ ØŗØąŲØą ØąŲ Ø¨ŲØ§ÚŠ Ų
ÛâÚŠŲŲ).
+
+Ø§Ú¯Ų Ø§Ø˛ ÛŲ ŲØąÛŲ
âŲØąÚŠ ŲØ§ŲŲ
âØ˛Ų
Ø§Ų Ø¯ÛÚ¯Ų Ų
ÛØ§Û ÚŠŲ Ø¨Ų ØąŲØ´ Ø¨Ø§ŲØ§ ÚŠØ§Øą ŲŲ
ÛâÚŠŲŲ Ų ØšØ§Ø¯ØĒ Ø¯Ø§ØąÛ *ØĒŲØ§Ø¨Øš ØšŲ
ŲÛØ§ØĒ Ų
ØŗÛØą* ØŗØ§Ø¯Ų ŲŲØˇ Ų
ØØ§ØŗØ¨Ø§ØĒÛ ØąŲ Ø¨Ø§ `def` Ų
ØšŲ
ŲŲÛ Ø¨ØąØ§Û ÛŲ ØŗŲØ¯ ÚŠŲÚÛÚŠ ØšŲ
ŲÚŠØąØ¯ (ØØ¯Ųد 100 ŲØ§ŲŲØĢØ§ŲÛŲ) ØĒØšØąÛŲ ÚŠŲÛØ ØĒŲØŦŲ ÚŠŲ ÚŠŲ ØĒŲÛ **FastAPI** اØĢØąØ´ ڊاŲ
ŲØ§Ų Ø¨ØąØšÚŠØŗŲ. ØĒŲÛ Ø§ÛŲ Ų
ŲØ§ØąØ¯Ø Ø¨ŲØĒØąŲ Ø§Ø˛ `async def` Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲÛ Ų
Ú¯Ų Ø§ÛŲÚŠŲ *ØĒŲØ§Ø¨Øš ØšŲ
ŲÛØ§ØĒ Ų
ØŗÛØąØĒ* ÚŠØ¯Û Ø¯Ø§Ø´ØĒŲ Ø¨Ø§Ø´Ų ÚŠŲ ØšŲ
ŲÛØ§ØĒ I/O Ø¨ŲØ§ÚŠâÚŠŲŲØ¯Ų Ø§ŲØŦاŲ
بدŲ.
+
+با اÛŲ ØØ§ŲØ ØĒŲÛ ŲØą Ø¯Ų Ų
ŲŲØšÛØĒØ Ø§ØØĒŲ
Ø§ŲØ´ Ø˛ÛØ§Ø¯Ų ÚŠŲ **FastAPI** ŲŲŲØ˛ [ØŗØąÛØšâØĒØą](index.md#performance){.internal-link target=_blank} Ø§Ø˛ ŲØąÛŲ
âŲØąÚŠ ŲØ¨ŲÛâØ§ØĒ Ø¨Ø§Ø´Ų (ÛØ§ ØØ¯Ø§ŲŲ ŲØ§Ø¨Ų Ų
ŲØ§ÛØŗŲ Ø¨Ø§ŲØ§Ø´).
+
+### ŲØ§Ø¨ØŗØĒÚ¯ÛâŲØ§
+
+ŲŲ
ÛŲ Ø¨ØąØ§Û [ŲØ§Ø¨ØŗØĒÚ¯ÛâŲØ§](tutorial/dependencies/index.md){.internal-link target=_blank} ŲŲ
ØĩØ¯Ų Ų
ÛâÚŠŲŲ. Ø§Ú¯Ų ÛŲ ŲØ§Ø¨ØŗØĒÚ¯Û ÛŲ ØĒابؚ `def` Ų
ØšŲ
ŲŲÛ Ø¨Ų ØŦØ§Û `async def` Ø¨Ø§Ø´ŲØ ØĒŲÛ Ø§ØŗØĒØŽØą ŲØŽ ØŽØ§ØąØŦÛ Ø§ØŦØąØ§ Ų
ÛâØ´Ų.
+
+### Ø˛ÛØąŲØ§Ø¨ØŗØĒÚ¯ÛâŲØ§
+
+Ų
ÛâØĒŲŲÛ ÚŲØ¯ ØĒا ŲØ§Ø¨ØŗØĒÚ¯Û Ų [Ø˛ÛØąŲØ§Ø¨ØŗØĒÚ¯Û](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank} داشØĒŲ Ø¨Ø§Ø´Û ÚŠŲ ŲŲ
دÛÚ¯Ų ØąŲ ŲÛØ§Ø˛ Ø¯Ø§ØąŲ (بŲâØšŲŲØ§Ų ŲžØ§ØąØ§Ų
ØĒØąŲØ§Û ØĒØšØąÛŲ ØĒابؚ)Ø Ø¨ØšØļÛâŲØ§Ø´ŲŲ Ų
Ų
ÚŠŲŲ Ø¨Ø§ `async def` ØŗØ§ØŽØĒŲ Ø¨Ø´Ų Ų Ø¨ØšØļÛâŲØ§ با `def` Ų
ØšŲ
ŲŲÛ. Ø¨Ø§Ø˛Ų
ÚŠØ§Øą Ų
ÛâÚŠŲŲØ Ų Ø§ŲŲØ§ÛÛ ÚŠŲ Ø¨Ø§ `def` Ų
ØšŲ
ŲŲÛ ØŗØ§ØŽØĒŲ Ø´Ø¯Ų ØĒŲÛ ÛŲ ŲØŽ ØŽØ§ØąØŦÛ (Ø§Ø˛ Ø§ØŗØĒØŽØą ŲØŽ) Øĩدا Ø˛Ø¯Ų Ų
ÛâØ´Ų Ø¨Ų ØŦØ§Û Ø§ÛŲÚŠŲ "Ų
ŲØĒØ¸ØąØ´ŲŲ" بŲ
ŲŲŲ.
+
+### ØĒŲØ§Ø¨Øš ÚŠØ§ØąØ¨ØąØ¯Û Ø¯ÛÚ¯Ų
+
+ŲØą ØĒØ§Ø¨Øš ÚŠØ§ØąØ¨ØąØ¯Û Ø¯ÛÚ¯ŲâØ§Û ÚŠŲ Ų
ØŗØĒŲÛŲ
ØŽŲØ¯ØĒ Øĩداش Ų
ÛâÚŠŲÛ Ų
ÛâØĒŲŲŲ Ø¨Ø§ `def` Ų
ØšŲ
ŲŲÛ ÛØ§ `async def` ØŗØ§ØŽØĒŲ Ø¨Ø´Ų Ų FastAPI ØąŲ ŲØŲŲ ØĩØ¯Ø§Ø˛Ø¯ŲØ´ ØĒØŖØĢÛØą ŲŲ
ÛâØ°Ø§ØąŲ.
+
+اÛŲ Ø¨ØąØŽŲØ§Ų ØĒŲØ§Ø¨ØšÛ ŲØŗØĒ ÚŠŲ FastAPI Ø¨ØąØ§ØĒ ØĩداشŲŲ Ų
ÛâÚŠŲŲ: *ØĒŲØ§Ø¨Øš ØšŲ
ŲÛØ§ØĒ Ų
ØŗÛØą* Ų ŲØ§Ø¨ØŗØĒÚ¯ÛâŲØ§.
+
+Ø§Ú¯Ų ØĒابؚ ÚŠØ§ØąØ¨ØąØ¯ÛØĒ ÛŲ ØĒابؚ Ų
ØšŲ
ŲŲÛ Ø¨Ø§ `def` Ø¨Ø§Ø´ŲØ Ų
ØŗØĒŲÛŲ
Øĩداش Ų
ÛâÚŠŲŲ (ŲŲ
ŲŲâØˇŲØą ÚŠŲ ØĒŲÛ ÚŠØ¯ØĒ ŲŲØ´ØĒÛ)Ø ŲŲ ØĒŲÛ Ø§ØŗØĒØŽØą ŲØŽØ Ø§Ú¯Ų ØĒابؚ با `async def` ØŗØ§ØŽØĒŲ Ø´Ø¯Ų Ø¨Ø§Ø´ŲØ Ø¨Ø§ÛØ¯ ŲŲØĒÛ ØĒŲÛ ÚŠØ¯ØĒ Øĩداش Ų
ÛâÚŠŲÛ `await`Ø´ ÚŠŲÛ.
+
+---
+
+Ø¯ŲØ¨Ø§ØąŲØ Ø§ÛŲØ§ ØŦØ˛ØĻÛØ§ØĒ ØŽÛŲÛ ŲŲÛ ŲØŗØĒŲ ÚŠŲ Ø§ØØĒŲ
Ø§ŲØ§Ų Ø§Ú¯Ų Ø¯ŲØ¨Ø§ŲØ´ŲŲ Ø§ŲŲ
Ø¯Ų Ø¨Ø§Ø´Û Ø¨ØąØ§ØĒ Ų
ŲÛØ¯ باشŲ.
+
+ŲÚ¯ØąŲŲØ با ØąØ§ŲŲŲ
اÛÛâŲØ§Û ب؎ش Ø¨Ø§ŲØ§ Ø¨Ø§ÛØ¯ ØŽŲØ¨ باشÛ: ØšØŦŲŲ Ø¯Ø§ØąÛØ .
diff --git a/docs/fa/docs/environment-variables.md b/docs/fa/docs/environment-variables.md
new file mode 100644
index 000000000..75309ce1f
--- /dev/null
+++ b/docs/fa/docs/environment-variables.md
@@ -0,0 +1,298 @@
+# Ų
ØĒØēÛØąŲØ§Û Ų
ØÛØˇÛ
+
+/// tip
+
+Ø§Ú¯Ų Ø§Ø˛ ŲØ¨Ų Ų
ÛâØ¯ŲŲÛ Ų
ØĒØēÛØąŲØ§Û Ų
ØÛØˇÛ ÚÛ ŲØŗØĒŲ Ų ÚØˇŲØą Ø§Ø˛Ø´ŲŲ Ø§ØŗØĒŲØ§Ø¯Ų Ų
ÛâØ´ŲØ Ų
ÛâØĒŲŲÛ Ø§ÛŲ Ø¨ØŽØ´ ØąŲ ØąØ¯ ÚŠŲÛ.
+
+///
+
+ÛŲ Ų
ØĒØēÛØą Ų
ØÛØˇÛ (ÚŠŲ Ø¨ŲØ´ "**env var**" ŲŲ
Ų
ÛâÚ¯Ų) ÛŲ Ų
ØĒØēÛØąÛŲ ÚŠŲ **ØŽØ§ØąØŦ** Ø§Ø˛ ڊد ŲžØ§ÛØĒŲŲØ ØĒŲÛ **ØŗÛØŗØĒŲ
âØšØ§Ų
Ų** Ø˛ŲØ¯Ú¯Û Ų
ÛâÚŠŲŲ Ų Ų
ÛâØĒŲŲŲ ØĒŲØŗØˇ ڊد ŲžØ§ÛØĒŲŲØĒ (ÛØ§ Ø¨ØąŲØ§Ų
ŲâŲØ§Û دÛÚ¯Ų) ØŽŲŲØ¯Ų بشŲ.
+
+Ų
ØĒØēÛØąŲØ§Û Ų
ØÛØˇÛ Ų
ÛâØĒŲŲŲ Ø¨ØąØ§Û Ų
Ø¯ÛØąÛØĒ **ØĒŲØ¸ÛŲ
اØĒ** Ø¨ØąŲØ§Ų
ŲØ بŲâØšŲŲØ§Ų Ø¨ØŽØ´Û Ø§Ø˛ **ŲØĩب** ŲžØ§ÛØĒŲŲ Ų ØēÛØąŲ Ų
ŲÛØ¯ باشŲ.
+
+## ØŗØ§ØŽØĒ Ų Ø§ØŗØĒŲØ§Ø¯Ų Ø§Ø˛ Ų
ØĒØēÛØąŲØ§Û Ų
ØÛØˇÛ
+
+Ų
ÛâØĒŲŲÛ Ų
ØĒØēÛØąŲØ§Û Ų
ØÛØˇÛ ØąŲ ØĒŲÛ **Ø´Ų (ØĒØąŲ
ÛŲØ§Ų)** **Ø¨ØŗØ§Ø˛Û** Ų Ø§Ø˛Ø´ŲŲ Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲÛØ بدŲŲ Ø§ÛŲÚŠŲ Ø¨Ų ŲžØ§ÛØĒŲŲ ŲÛØ§Ø˛ داشØĒŲ Ø¨Ø§Ø´Û:
+
+//// tab | ŲÛŲŲÚŠØŗØ Ų
ÚŠâØ§ŲØ§ØŗØ ŲÛŲØ¯ŲØ˛ بش
+
+
+
+```console
+// Ų
ÛâØĒŲŲÛ ÛŲ Ų
ØĒØēÛØą Ų
ØÛØˇÛ Ø¨Ų Ø§ØŗŲ
MY_NAME Ø¨ØŗØ§Ø˛Û Ø¨Ø§
+$ export MY_NAME="Wade Wilson"
+
+// بؚد Ų
ÛâØĒŲŲÛ Ø¨Ø§ Ø¨ØąŲØ§Ų
ŲâŲØ§Û دÛÚ¯Ų Ø§Ø˛Ø´ Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲÛØ Ų
ØĢŲ
+$ echo "Hello $MY_NAME"
+
+Hello Wade Wilson
+```
+
+
+
+////
+
+//// tab | ŲÛŲØ¯ŲØ˛ ŲžØ§ŲØąØ´Ų
+
+
+
+```console
+// ÛŲ Ų
ØĒØēÛØą Ų
ØÛØˇÛ Ø¨Ų Ø§ØŗŲ
MY_NAME Ø¨ØŗØ§Ø˛
+$ $Env:MY_NAME = "Wade Wilson"
+
+// با Ø¨ØąŲØ§Ų
ŲâŲØ§Û دÛÚ¯Ų Ø§Ø˛Ø´ Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲØ Ų
ØĢŲ
+$ echo "Hello $Env:MY_NAME"
+
+Hello Wade Wilson
+```
+
+
+
+////
+
+## ØŽŲŲØ¯Ų Ų
ØĒØēÛØąŲØ§Û Ų
ØÛØˇÛ ØĒŲÛ ŲžØ§ÛØĒŲŲ
+
+Ų
ÛâØĒŲŲÛ Ų
ØĒØēÛØąŲØ§Û Ų
ØÛØˇÛ ØąŲ **ØŽØ§ØąØŦ** Ø§Ø˛ ŲžØ§ÛØĒŲŲØ ØĒŲÛ ØĒØąŲ
ÛŲØ§Ų (ÛØ§ با ŲØą ØąŲØ´ دÛÚ¯Ų) Ø¨ØŗØ§Ø˛ÛØ Ų Ø¨ØšØ¯ ØĒŲÛ **ŲžØ§ÛØĒŲŲ** اŲŲØ§ ØąŲ Ø¨ØŽŲŲÛ.
+
+Ų
ØĢŲØ§Ų Ų
ÛâØĒŲŲÛ ÛŲ ŲØ§ÛŲ `main.py` داشØĒŲ Ø¨Ø§Ø´Û Ø¨Ø§:
+
+```Python hl_lines="3"
+import os
+
+name = os.getenv("MY_NAME", "World")
+print(f"Hello {name} from Python")
+```
+
+/// tip
+
+ØĸØąÚ¯ŲŲ
Ø§Ų Ø¯ŲŲ
`os.getenv()` Ų
ŲØ¯Ø§Øą ŲžÛØ´âŲØąØļÛŲ ÚŠŲ Ø¨ØąŲ
ÛâÚ¯ØąØ¯ŲŲŲ.
+
+Ø§Ú¯Ų ŲØ¯ÛØ Ø¨ŲâØĩŲØąØĒ ŲžÛØ´âŲØąØļ `None` ŲØŗØĒØ Ø§ÛŲØŦا Ų
ا `"World"` ØąŲ Ø¨ŲâØšŲŲØ§Ų Ų
ŲØ¯Ø§Øą ŲžÛØ´âŲØąØļ گذاشØĒÛŲ
.
+
+///
+
+بؚد Ų
ÛâØĒŲŲÛ Ø§ŲŲ Ø¨ØąŲØ§Ų
Ų ŲžØ§ÛØĒŲŲ ØąŲ Øĩدا ÚŠŲÛ:
+
+//// tab | ŲÛŲŲÚŠØŗØ Ų
ÚŠâØ§ŲØ§ØŗØ ŲÛŲØ¯ŲØ˛ بش
+
+
+
+```console
+// اÛŲØŦا ŲŲŲØ˛ Ų
ØĒØēÛØą Ų
ØÛØˇÛ ØąŲ ØĒŲØ¸ÛŲ
ŲÚŠØąØ¯ÛŲ
+$ python main.py
+
+// ÚŲŲ Ų
ØĒØēÛØą Ų
ØÛØˇÛ ØąŲ ØĒŲØ¸ÛŲ
ŲÚŠØąØ¯ÛŲ
Ø Ų
ŲØ¯Ø§Øą ŲžÛØ´âŲØąØļ ØąŲ Ų
ÛâÚ¯ÛØąÛŲ
+
+Hello World from Python
+
+// ŲŲÛ Ø§Ú¯Ų Ø§ŲŲ ÛŲ Ų
ØĒØēÛØą Ų
ØÛØˇÛ Ø¨ØŗØ§Ø˛ÛŲ
+$ export MY_NAME="Wade Wilson"
+
+// Ų Ø¨ØšØ¯ Ø¯ŲØ¨Ø§ØąŲ Ø¨ØąŲØ§Ų
Ų ØąŲ Øĩدا ÚŠŲÛŲ
+$ python main.py
+
+// ØØ§Ųا Ų
ÛâØĒŲŲŲ Ų
ØĒØēÛØą Ų
ØÛØˇÛ ØąŲ Ø¨ØŽŲŲŲ
+
+Hello Wade Wilson from Python
+```
+
+
+
+////
+
+//// tab | ŲÛŲØ¯ŲØ˛ ŲžØ§ŲØąØ´Ų
+
+
+
+```console
+// اÛŲØŦا ŲŲŲØ˛ Ų
ØĒØēÛØą Ų
ØÛØˇÛ ØąŲ ØĒŲØ¸ÛŲ
ŲÚŠØąØ¯ÛŲ
+$ python main.py
+
+// ÚŲŲ Ų
ØĒØēÛØą Ų
ØÛØˇÛ ØąŲ ØĒŲØ¸ÛŲ
ŲÚŠØąØ¯ÛŲ
Ø Ų
ŲØ¯Ø§Øą ŲžÛØ´âŲØąØļ ØąŲ Ų
ÛâÚ¯ÛØąÛŲ
+
+Hello World from Python
+
+// ŲŲÛ Ø§Ú¯Ų Ø§ŲŲ ÛŲ Ų
ØĒØēÛØą Ų
ØÛØˇÛ Ø¨ØŗØ§Ø˛ÛŲ
+$ $Env:MY_NAME = "Wade Wilson"
+
+// Ų Ø¨ØšØ¯ Ø¯ŲØ¨Ø§ØąŲ Ø¨ØąŲØ§Ų
Ų ØąŲ Øĩدا ÚŠŲÛŲ
+$ python main.py
+
+// ØØ§Ųا Ų
ÛâØĒŲŲŲ Ų
ØĒØēÛØą Ų
ØÛØˇÛ ØąŲ Ø¨ØŽŲŲŲ
+
+Hello Wade Wilson from Python
+```
+
+
+
+////
+
+ÚŲŲ Ų
ØĒØēÛØąŲØ§Û Ų
ØÛØˇÛ Ų
ÛâØĒŲŲŲ ØŽØ§ØąØŦ Ø§Ø˛ ڊد ØĒŲØ¸ÛŲ
Ø¨Ø´ŲØ ŲŲÛ ÚŠØ¯ Ų
ÛâØĒŲŲŲ Ø§ŲŲØ§ ØąŲ Ø¨ØŽŲŲŲØ Ų ŲØ§Ø˛Ų
ŲÛØŗØĒ با بŲÛŲ ŲØ§ÛŲâŲØ§ Ø°ØŽÛØąŲ (ÚŠŲ
ÛØĒÛ Ø¨Ų `git`) Ø¨Ø´ŲØ Ų
ØšŲ
ŲŲØ§Ų Ø¨ØąØ§Û ŲžÛÚŠØąØ¨ŲØ¯Û ÛØ§ **ØĒŲØ¸ÛŲ
اØĒ** Ø§ØŗØĒŲØ§Ø¯Ų Ų
ÛâØ´Ų.
+
+ŲŲ
ÚŲÛŲ Ų
ÛâØĒŲŲÛ ÛŲ Ų
ØĒØēÛØą Ų
ØÛØˇÛ ØąŲ ŲŲØˇ Ø¨ØąØ§Û **ÛŲ Ø§ØŦØąØ§Û ØŽØ§Øĩ Ø¨ØąŲØ§Ų
Ų** Ø¨ØŗØ§Ø˛ÛØ ÚŠŲ ŲŲØˇ Ø¨ØąØ§Û Ø§ŲŲ Ø¨ØąŲØ§Ų
Ų Ų ŲŲØˇ Ø¨ØąØ§Û Ų
دØĒ Ø˛Ų
Ø§Ų Ø§ØŦØąØ§Ø´ Ø¯Øą Ø¯ØŗØĒØąØŗŲ.
+
+Ø¨ØąØ§Û Ø§ÛŲ ÚŠØ§ØąØ Ø¯ØąØŗØĒ ŲØ¨Ų Ø§Ø˛ ØŽŲØ¯ Ø¨ØąŲØ§Ų
ŲØ ØĒŲÛ ŲŲ
ŲŲ ØŽØˇ Ø¨ØŗØ§Ø˛Ø´:
+
+
+
+```console
+// ÛŲ Ų
ØĒØēÛØą Ų
ØÛØˇÛ MY_NAME ØąŲ ØĒŲÛ ØŽØˇ Ø¨ØąØ§Û Ø§ÛŲ Ø§ØŦØąØ§Û Ø¨ØąŲØ§Ų
Ų Ø¨ØŗØ§Ø˛
+$ MY_NAME="Wade Wilson" python main.py
+
+// ØØ§Ųا Ų
ÛâØĒŲŲŲ Ų
ØĒØēÛØą Ų
ØÛØˇÛ ØąŲ Ø¨ØŽŲŲŲ
+
+Hello Wade Wilson from Python
+
+// Ų
ØĒØēÛØą Ų
ØÛØˇÛ Ø¨ØšØ¯Ø´ دÛÚ¯Ų ŲØŦŲØ¯ ŲØ¯Ø§ØąŲ
+$ python main.py
+
+Hello World from Python
+```
+
+
+
+/// tip
+
+Ų
ÛâØĒŲŲÛ Ø¨ÛØ´ØĒØą Ø¯Øą Ų
ŲØąØ¯Ø´ ØĒŲÛ Ø¨ØąŲØ§Ų
Ų Ø¯ŲØ§Ø˛Ø¯ŲâŲØ§ÚŠØĒŲØąÛ: ŲžÛÚŠØąØ¨ŲØ¯Û ب؎ŲŲÛ.
+
+///
+
+## ŲŲØšâŲØ§ Ų Ø§ØšØĒØ¨Ø§ØąØŗŲØŦÛ
+
+اÛŲ Ų
ØĒØēÛØąŲØ§Û Ų
ØÛØˇÛ ŲŲØˇ Ų
ÛâØĒŲŲŲ **ØąØ´ØĒŲâŲØ§Û Ų
ØĒŲÛ** ØąŲ ŲÚ¯Ų Ø¯Ø§ØąŲØ ÚŲŲ ØŽØ§ØąØŦ Ø§Ø˛ ŲžØ§ÛØĒŲŲ ŲØŗØĒŲ Ų Ø¨Ø§ÛØ¯ با Ø¨ØąŲØ§Ų
ŲâŲØ§Û دÛÚ¯Ų Ų Ø¨ŲÛŲ ØŗÛØŗØĒŲ
(Ų ØØĒÛ ØŗÛØŗØĒŲ
âØšØ§Ų
ŲâŲØ§Û Ų
ØŽØĒŲŲ Ų
ØĢŲ ŲÛŲŲÚŠØŗØ ŲÛŲØ¯ŲØ˛Ø Ų
ÚŠâØ§ŲØ§Øŗ) ØŗØ§Ø˛Ú¯Ø§Øą باشŲ.
+
+ÛØšŲÛ **ŲØą Ų
ŲØ¯Ø§ØąÛ** ÚŠŲ ØĒŲÛ ŲžØ§ÛØĒŲŲ Ø§Ø˛ ÛŲ Ų
ØĒØēÛØą Ų
ØÛØˇÛ ØŽŲŲØ¯Ų Ų
ÛâØ´Ų ÛŲ `str` ŲØŗØĒØ Ų ŲØą ØĒØ¨Ø¯ÛŲ Ø¨Ų Ųب𠨝ÛÚ¯Ų ÛØ§ ŲØą Ø§ØšØĒØ¨Ø§ØąØŗŲØŦÛ Ø¨Ø§ÛØ¯ ØĒŲÛ ÚŠØ¯ Ø§ŲØŦاŲ
بشŲ.
+
+ØĒŲÛ [ØąØ§ŲŲŲ
Ø§Û ÚŠØ§ØąØ¨Øą ŲžÛØ´ØąŲØĒŲ - ØĒŲØ¸ÛŲ
اØĒ Ų Ų
ØĒØēÛØąŲØ§Û Ų
ØÛØˇÛ](./advanced/settings.md){.internal-link target=_blank} Ø¨ÛØ´ØĒØą Ø¯Øą Ų
بਝ Ø§ØŗØĒŲØ§Ø¯Ų Ø§Ø˛ Ų
ØĒØēÛØąŲØ§Û Ų
ØÛØˇÛ Ø¨ØąØ§Û Ų
Ø¯ÛØąÛØĒ **ØĒŲØ¸ÛŲ
اØĒ Ø¨ØąŲØ§Ų
Ų** ÛØ§Ø¯ Ų
ÛâÚ¯ÛØąÛ.
+
+## Ų
ØĒØēÛØą Ų
ØÛØˇÛ `PATH`
+
+ÛŲ Ų
ØĒØēÛØą Ų
ØÛØˇÛ **؎اØĩ** Ø¨Ų Ø§ØŗŲ
**`PATH`** ŲØŦŲØ¯ Ø¯Ø§ØąŲ ÚŠŲ ØŗÛØŗØĒŲ
âØšØ§Ų
ŲâŲØ§ (ŲÛŲŲÚŠØŗØ Ų
ÚŠâØ§ŲØ§ØŗØ ŲÛŲØ¯ŲØ˛) Ø§Ø˛Ø´ Ø¨ØąØ§Û ŲžÛØ¯Ø§ ÚŠØąØ¯Ų Ø¨ØąŲØ§Ų
ŲâŲØ§ÛÛ ÚŠŲ ŲØąØ§ØąŲ Ø§ØŦØąØ§ Ø¨Ø´Ų Ø§ØŗØĒŲØ§Ø¯Ų Ų
ÛâÚŠŲŲ.
+
+Ų
ŲØ¯Ø§Øą Ų
ØĒØēÛØą `PATH` ÛŲ ØąØ´ØĒŲ ØˇŲŲØ§ŲÛ Ø§Ø˛ ŲžŲØ´ŲâŲØ§ØŗØĒ ÚŠŲ ØĒŲÛ ŲÛŲŲÚŠØŗ Ų Ų
ÚŠâØ§ŲØ§Øŗ با دŲŲŲØˇŲ `:` Ų ØĒŲÛ ŲÛŲØ¯ŲØ˛ با ŲŲØˇŲâŲÛØąÚ¯ŲŲ `;` Ø§Ø˛ ŲŲ
ØŦدا شدŲ.
+
+Ų
ØĢŲØ§ŲØ Ų
ØĒØēÛØą Ų
ØÛØˇÛ `PATH` Ų
ÛâØĒŲŲŲ Ø§ÛŲØŦŲØąÛ باشŲ:
+
+//// tab | ŲÛŲŲÚŠØŗØ Ų
ÚŠâØ§ŲØ§Øŗ
+
+```plaintext
+/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
+```
+
+ÛØšŲÛ ØŗÛØŗØĒŲ
Ø¨Ø§ÛØ¯ Ø¯ŲØ¨Ø§Ų Ø¨ØąŲØ§Ų
ŲâŲØ§ ØĒŲÛ Ø§ÛŲ ŲžŲØ´ŲâŲØ§ Ø¨Ú¯ØąØ¯Ų:
+
+* `/usr/local/bin`
+* `/usr/bin`
+* `/bin`
+* `/usr/sbin`
+* `/sbin`
+
+////
+
+//// tab | ŲÛŲØ¯ŲØ˛
+
+```plaintext
+C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32
+```
+
+ÛØšŲÛ ØŗÛØŗØĒŲ
Ø¨Ø§ÛØ¯ Ø¯ŲØ¨Ø§Ų Ø¨ØąŲØ§Ų
ŲâŲØ§ ØĒŲÛ Ø§ÛŲ ŲžŲØ´ŲâŲØ§ Ø¨Ú¯ØąØ¯Ų:
+
+* `C:\Program Files\Python312\Scripts`
+* `C:\Program Files\Python312`
+* `C:\Windows\System32`
+
+////
+
+ŲŲØĒÛ ÛŲ **Ø¯ØŗØĒŲØą** ØĒŲÛ ØĒØąŲ
ÛŲØ§Ų ØĒاÛŲž Ų
ÛâÚŠŲÛØ ØŗÛØŗØĒŲ
âØšØ§Ų
Ų **Ø¯ŲØ¨Ø§Ų** Ø¨ØąŲØ§Ų
Ų ØĒŲÛ **ŲØą ڊدŲŲ
Ø§Ø˛ اÛŲ ŲžŲØ´ŲâŲØ§** ÚŠŲ ØĒŲÛ Ų
ØĒØēÛØą Ų
ØÛØˇÛ `PATH` ŲÛØŗØĒ Ø´Ø¯Ų Ų
ÛâÚ¯ØąØ¯Ų.
+
+Ų
ØĢŲØ§ŲØ ŲŲØĒÛ ØĒŲÛ ØĒØąŲ
ÛŲØ§Ų `python` ØĒاÛŲž Ų
ÛâÚŠŲÛØ ØŗÛØŗØĒŲ
âØšØ§Ų
Ų Ø¯ŲØ¨Ø§Ų ÛŲ Ø¨ØąŲØ§Ų
Ų Ø¨Ų Ø§ØŗŲ
`python` ØĒŲÛ **اŲŲÛŲ ŲžŲØ´Ų** ØĒŲÛ Ø§ŲŲ ŲÛØŗØĒ Ų
ÛâÚ¯ØąØ¯Ų.
+
+Ø§Ú¯Ų ŲžÛØ¯Ø§Ø´ ÚŠŲŲØ **Ø§ØŗØĒŲØ§Ø¯ŲâØ´ Ų
ÛâÚŠŲŲ**. ŲÚ¯ØąŲŲ ØĒŲÛ **ŲžŲØ´ŲâŲØ§Û بؚدÛ** Ø¯ŲØ¨Ø§ŲØ´ Ų
ÛâÚ¯ØąØ¯Ų.
+
+### ŲØĩب ŲžØ§ÛØĒŲŲ Ų Ø¨ŲâØąŲØ˛ØąØŗØ§ŲÛ `PATH`
+
+ŲŲØĒÛ ŲžØ§ÛØĒŲŲ ØąŲ ŲØĩب Ų
ÛâÚŠŲÛØ Ų
Ų
ÚŠŲŲ Ø§Ø˛ØĒ Ø¨ŲžØąØŗŲ ØĸÛØ§ Ų
ÛâØŽŲØ§Û Ų
ØĒØēÛØą Ų
ØÛØˇÛ `PATH` ØąŲ Ø¨ŲâØąŲØ˛ØąØŗØ§ŲÛ ÚŠŲÛ.
+
+//// tab | ŲÛŲŲÚŠØŗØ Ų
ÚŠâØ§ŲØ§Øŗ
+
+ŲØąØļ ÚŠŲ ŲžØ§ÛØĒŲŲ ØąŲ ŲØĩب ÚŠØąØ¯Û Ų ØĒŲÛ ÛŲ ŲžŲØ´Ų `/opt/custompython/bin` ŲØąØ§Øą Ú¯ØąŲØĒŲ.
+
+Ø§Ú¯Ų Ø¨Ú¯Û Ø¨ŲŲ Ø¨ØąØ§Û Ø¨ŲâØąŲØ˛ØąØŗØ§ŲÛ Ų
ØĒØēÛØą Ų
ØÛØˇÛ `PATH`Ø ŲØĩاب `/opt/custompython/bin` ØąŲ Ø¨Ų Ų
ØĒØēÛØą Ų
ØÛØˇÛ `PATH` اØļاŲŲ Ų
ÛâÚŠŲŲ.
+
+Ų
Ų
ÚŠŲŲ Ø§ÛŲØŦŲØąÛ بشŲ:
+
+```plaintext
+/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/custompython/bin
+```
+
+اÛŲâØŦŲØąÛØ ŲŲØĒÛ ØĒŲÛ ØĒØąŲ
ÛŲØ§Ų `python` ØĒاÛŲž Ų
ÛâÚŠŲÛØ ØŗÛØŗØĒŲ
Ø¨ØąŲØ§Ų
Ų ŲžØ§ÛØĒŲŲ ØąŲ ØĒŲÛ `/opt/custompython/bin` (ØĸØŽØąÛŲ ŲžŲØ´Ų) ŲžÛØ¯Ø§ Ų
ÛâÚŠŲŲ Ų Ø§Ø˛ اŲŲ Ø§ØŗØĒŲØ§Ø¯Ų Ų
ÛâÚŠŲŲ.
+
+////
+
+//// tab | ŲÛŲØ¯ŲØ˛
+
+ŲØąØļ ÚŠŲ ŲžØ§ÛØĒŲŲ ØąŲ ŲØĩب ÚŠØąØ¯Û Ų ØĒŲÛ ÛŲ ŲžŲØ´Ų `C:\opt\custompython\bin` ŲØąØ§Øą Ú¯ØąŲØĒŲ.
+
+Ø§Ú¯Ų Ø¨Ú¯Û Ø¨ŲŲ Ø¨ØąØ§Û Ø¨ŲâØąŲØ˛ØąØŗØ§ŲÛ Ų
ØĒØēÛØą Ų
ØÛØˇÛ `PATH`Ø ŲØĩاب `C:\opt\custompython\bin` ØąŲ Ø¨Ų Ų
ØĒØēÛØą Ų
ØÛØˇÛ `PATH` اØļاŲŲ Ų
ÛâÚŠŲŲ.
+
+```plaintext
+C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32;C:\opt\custompython\bin
+```
+
+اÛŲâØŦŲØąÛØ ŲŲØĒÛ ØĒŲÛ ØĒØąŲ
ÛŲØ§Ų `python` ØĒاÛŲž Ų
ÛâÚŠŲÛØ ØŗÛØŗØĒŲ
Ø¨ØąŲØ§Ų
Ų ŲžØ§ÛØĒŲŲ ØąŲ ØĒŲÛ `C:\opt\custompython\bin` (ØĸØŽØąÛŲ ŲžŲØ´Ų) ŲžÛØ¯Ø§ Ų
ÛâÚŠŲŲ Ų Ø§Ø˛ اŲŲ Ø§ØŗØĒŲØ§Ø¯Ų Ų
ÛâÚŠŲŲ.
+
+////
+
+ŲžØŗØ Ø§Ú¯Ų ØĒاÛŲž ÚŠŲÛ:
+
+
+
+```console
+$ python
+```
+
+
+
+//// tab | ŲÛŲŲÚŠØŗØ Ų
ÚŠâØ§ŲØ§Øŗ
+
+ØŗÛØŗØĒŲ
Ø¨ØąŲØ§Ų
Ų `python` ØąŲ ØĒŲÛ `/opt/custompython/bin` **ŲžÛØ¯Ø§** Ų
ÛâÚŠŲŲ Ų Ø§ØŦØąØ§Ø´ Ų
ÛâÚŠŲŲ.
+
+ØĒŲØąÛØ¨Ø§Ų Ų
ØšØ§Ø¯Ų Ø§ÛŲŲ ÚŠŲ ØĒاÛŲž ÚŠŲÛ:
+
+
+
+```console
+$ /opt/custompython/bin/python
+```
+
+
+
+////
+
+//// tab | ŲÛŲØ¯ŲØ˛
+
+ØŗÛØŗØĒŲ
Ø¨ØąŲØ§Ų
Ų `python` ØąŲ ØĒŲÛ `C:\opt\custompython\bin\python` **ŲžÛØ¯Ø§** Ų
ÛâÚŠŲŲ Ų Ø§ØŦØąØ§Ø´ Ų
ÛâÚŠŲŲ.
+
+ØĒŲØąÛØ¨Ø§Ų Ų
ØšØ§Ø¯Ų Ø§ÛŲŲ ÚŠŲ ØĒاÛŲž ÚŠŲÛ:
+
+
+
+```console
+$ C:\opt\custompython\bin\python
+```
+
+
+
+////
+
+اÛŲ Ø§ØˇŲØ§ØšØ§ØĒ ŲŲØĒÛ Ø¯Øą Ų
بਝ [Ų
ØÛØˇâŲØ§Û Ų
ØŦØ§Ø˛Û](virtual-environments.md){.internal-link target=_blank} ÛØ§Ø¯ Ų
ÛâÚ¯ÛØąÛ بŲâØ¯ØąØ¯ØĒ Ų
ÛâØŽŲØąŲ.
+
+## ŲØĒÛØŦŲâÚ¯ÛØąÛ
+
+با اÛŲ Ø¨Ø§ÛØ¯ ÛŲ Ø¯ØąÚŠ ŲžØ§ÛŲâØ§Û Ø§Ø˛ **Ų
ØĒØēÛØąŲØ§Û Ų
ØÛØˇÛ** Ų ŲØŲŲ Ø§ØŗØĒŲØ§Ø¯ŲâØ´ŲŲ ØĒŲÛ ŲžØ§ÛØĒŲŲ Ø¯Ø§Ø´ØĒŲ Ø¨Ø§Ø´Û.
+
+Ų
ÛâØĒŲŲÛ Ø¨ÛØ´ØĒØą Ø¯Øą Ų
ŲØąØ¯Ø´ŲŲ ØĒŲÛ ŲÛÚŠÛâŲžØ¯ÛØ§ Ø¨ØąØ§Û Ų
ØĒØēÛØą Ų
ØÛØˇÛ Ø¨ØŽŲŲÛ.
+
+ØĒŲÛ ØŽÛŲÛ Ų
ŲØ§ØąØ¯ Ų
Ø´ØŽØĩ ŲÛØŗØĒ ÚŠŲ Ų
ØĒØēÛØąŲØ§Û Ų
ØÛØˇÛ ÚØˇŲØą Ų
ÛâØĒŲŲŲ ŲŲØąÛ Ų
ŲÛØ¯ Ų ÚŠØ§ØąØ¨ØąØ¯Û Ø¨Ø§Ø´Ų. ŲŲÛ ØĒŲÛ Ų
ŲŲØšÛØĒâŲØ§Û Ų
ØŽØĒŲŲ ØĒŲØŗØšŲ Ų
داŲ
ŲžÛØ¯Ø§Ø´ŲŲ Ų
ÛâØ´ŲØ ŲžØŗ ØŽŲØ¨Ų ÚŠŲ Ø¯Øą Ų
ŲØąØ¯Ø´ŲŲ Ø¨Ø¯ŲŲÛ.
+
+Ų
ØĢŲØ§ŲØ ØĒŲÛ Ø¨ØŽØ´ Ø¨ØšØ¯Û Ø¯Øą Ų
بਝ [Ų
ØÛØˇâŲØ§Û Ų
ØŦØ§Ø˛Û](virtual-environments.md) Ø¨Ų Ø§ÛŲ Ø§ØˇŲØ§ØšØ§ØĒ ŲÛØ§Ø˛ Ø¯Ø§ØąÛ.
diff --git a/docs/fa/docs/index.md b/docs/fa/docs/index.md
index 6addce763..0aa0bec36 100644
--- a/docs/fa/docs/index.md
+++ b/docs/fa/docs/index.md
@@ -11,11 +11,11 @@
ŲØąÛŲ
âŲØąÚŠ FastAPIØ ÚŠØ§ØąØ§ÛÛ Ø¨Ø§ŲØ§Ø ÛØ§Ø¯Ú¯ÛØąÛ ØĸØŗØ§ŲØ ڊدŲŲÛØŗÛ ØŗØąÛØšØ ØĸŲ
Ø§Ø¯Ų Ø¨ØąØ§Û Ø§ØŗØĒŲØ§Ø¯Ų Ø¯Øą Ų
ØÛØˇ ŲžØąŲØ¯Ø§ÚŠØ´Ų
-
-
+
+
-
-
+
+
diff --git a/docs/fa/docs/learn/index.md b/docs/fa/docs/learn/index.md
new file mode 100644
index 000000000..06aa7f00e
--- /dev/null
+++ b/docs/fa/docs/learn/index.md
@@ -0,0 +1,5 @@
+# ÛØ§Ø¯Ú¯ÛØąÛ
+
+اÛŲØŦا ب؎شâŲØ§Û Ų
ŲØ¯Ų
اØĒÛ Ų ØĸŲ
ŲØ˛Ø´âŲØ§ÛÛ ŲØŗØĒŲ ÚŠŲ Ø¨ØąØ§Û ÛØ§Ø¯Ú¯ÛØąÛ **FastAPI** Ø¨ŲØĒ ÚŠŲ
ÚŠ Ų
ÛâÚŠŲŲ.
+
+Ų
ÛâØĒŲŲÛ Ø§ÛŲŲ ÛŲ **ÚŠØĒاب**Ø ÛŲ **Ø¯ŲØąŲ ØĸŲ
ŲØ˛Ø´Û**Ø ÛØ§ ØąØ§Ų **ØąØŗŲ
Û** Ų ŲžÛØ´ŲŲØ§Ø¯Û Ø¨ØąØ§Û ÛØ§Ø¯Ú¯ÛØąÛ FastAPI Ø¯Øą ŲØ¸Øą Ø¨Ú¯ÛØąÛ. đ
diff --git a/docs/fa/docs/python-types.md b/docs/fa/docs/python-types.md
new file mode 100644
index 000000000..c428acbf7
--- /dev/null
+++ b/docs/fa/docs/python-types.md
@@ -0,0 +1,578 @@
+# Ų
ŲØ¯Ų
ŲâØ§Û Ø¨Øą اŲŲØ§Øš ŲŲØš Ø¯Øą ŲžØ§ÛØĒŲŲ
+
+ŲžØ§ÛØĒŲŲ Ø§Ø˛ "ŲŲØšâŲŲ
ا"ŲØ§Û ا؎ØĒÛØ§ØąÛ (ÚŠŲ Ø¨ŲØ´ŲŲ "type hints" ÛØ§ "type annotations" ŲŲ
Ų
ÛâÚ¯Ų) ŲžØ´ØĒÛØ¨Ø§ŲÛ Ų
ÛâÚŠŲŲ.
+
+اÛŲ **"ŲŲØšâŲŲ
Ø§ŲØ§"** ÛØ§ annotationŲØ§ ÛŲ ØŗÛŲØĒÚŠØŗ ؎اØĩ ŲØŗØĒŲ ÚŠŲ Ø¨ŲØĒ Ø§ØŦØ§Ø˛Ų Ų
ÛâØ¯Ų ŲŲØš ÛŲ Ų
ØĒØēÛØą ØąŲ Ų
Ø´ØŽØĩ ÚŠŲÛ.
+
+با Ų
Ø´ØŽØĩ ÚŠØąØ¯Ų ŲŲØš Ų
ØĒØēÛØąŲØ§Ø ŲÛØąØ§ÛØ´Ú¯ØąŲا Ų Ø§Ø¨Ø˛Ø§ØąŲØ§ Ų
ÛâØĒŲŲŲ ŲžØ´ØĒÛØ¨Ø§ŲÛ Ø¨ŲØĒØąÛ Ø¨ŲØĒ Ø¨Ø¯Ų.
+
+اÛŲ ŲŲØˇ ÛŲ **ØĸŲ
ŲØ˛Ø´ ØŗØąÛØš / ÛØ§Ø¯ØĸŲØąÛ** Ø¯Øą Ų
بਝ ŲŲØšâŲŲ
Ø§ŲØ§Û ŲžØ§ÛØĒŲŲŲ. ŲŲØˇ ØØ¯Ø§ŲŲ ÚÛØ˛Ø§ÛÛ ÚŠŲ Ø¨ØąØ§Û Ø§ØŗØĒŲØ§Ø¯Ų Ø§Ø˛Ø´ŲŲ Ø¨Ø§ **FastAPI** ŲØ§Ø˛Ų
Ų ØąŲ ŲžŲØ´Ø´ Ų
ÛâØ¯Ų... ÚŠŲ Ø¯Øą ŲØ§ŲØš ØŽÛŲÛ ÚŠŲ
Ų.
+
+**FastAPI** ڊاŲ
ŲØ§Ų Ø¨Øą ŲžØ§ÛŲ Ø§ÛŲ ŲŲØšâŲŲ
Ø§ŲØ§ØŗØĒ Ų Ø§ÛŲ Ø¨ŲØ´ ÚŠŲÛ Ų
Ø˛ÛØĒ Ų ŲØ§ÛØ¯Ų Ų
ÛâØ¯Ų.
+
+ŲŲÛ ØØĒÛ Ø§Ú¯Ų ŲÛÚâŲŲØĒ Ø§Ø˛ **FastAPI** Ø§ØŗØĒŲØ§Ø¯Ų ŲÚŠŲÛØ Ø¨Ø§Ø˛Ų
ÛØ§Ø¯Ú¯ÛØąÛ ÛŲ ÚŠŲ
Ø¯Øą Ų
ŲØąØ¯Ø´ŲŲ Ø¨Ų ŲŲØšØĒŲ.
+
+/// note
+
+Ø§Ú¯Ų ØØąŲŲâØ§Û ŲžØ§ÛØĒŲŲÛ Ų ŲŲ
ŲâÚÛØ˛ ØąŲ Ø¯Øą Ų
بਝ ŲŲØšâŲŲ
Ø§ŲØ§ Ų
ÛâØ¯ŲŲÛØ Ø¨ØąŲ ØŗØąØ§Øē ŲØĩŲ Ø¨ØšØ¯Û.
+
+///
+
+## اŲÚ¯ÛØ˛Ų
+
+Ø¨ÛØ§Ûد با ÛŲ Ų
ØĢØ§Ų ØŗØ§Ø¯Ų Ø´ØąŲØš ÚŠŲÛŲ
:
+
+{* ../../docs_src/python_types/tutorial001.py *}
+
+ŲŲØĒÛ Ø§ÛŲ Ø¨ØąŲØ§Ų
Ų ØąŲ Ø§ØŦØąØ§ ÚŠŲÛØ ØŽØąŲØŦÛ Ø§ÛŲŲ:
+
+```
+John Doe
+```
+
+اÛŲ ØĒابؚ اÛŲ ÚŠØ§ØąØ§ ØąŲ Ų
ÛâÚŠŲŲ:
+
+* ÛŲ `first_name` Ų `last_name` Ų
ÛâÚ¯ÛØąŲ.
+* ØØąŲ اŲŲ ŲØą ڊدŲŲ
ØąŲ Ø¨Ø§ `title()` Ø¨Ø˛ØąÚ¯ Ų
ÛâÚŠŲŲ.
+* ØĒØąÚŠÛØ¨Ø´ŲŲ Ų
ÛâÚŠŲŲ Ø¨Ø§ ÛŲ ŲØ§ØĩŲŲ ŲØŗØˇØ´ŲŲ.
+
+{* ../../docs_src/python_types/tutorial001.py hl[2] *}
+
+### ŲÛØąØ§ÛØ´Ø´ ÚŠŲ
+
+اÛŲ ÛŲ Ø¨ØąŲØ§Ų
Ų ØŽÛŲÛ ØŗØ§Ø¯ŲâØŗØĒ.
+
+ŲŲÛ ØØ§Ųا ØĒØĩŲØą ÚŠŲ Ø¯Ø§ØąÛ Ø§Ø˛ ØĩŲØą Ų
ÛâŲŲÛØŗÛØ´.
+
+ÛŲ ØŦاÛÛ Ø´ØąŲØš ÚŠØąØ¯Û Ø¨Ų ØĒØšØąÛŲ ØĒØ§Ø¨ØšØ ŲžØ§ØąØ§Ų
ØĒØąŲØ§ØĒ ØĸŲ
ادŲâØŗØĒ...
+
+ŲŲÛ Ø¨ØšØ¯ Ø¨Ø§ÛØ¯ "اŲŲ Ų
ØĒØ¯Û ÚŠŲ ØØąŲ اŲŲ ØąŲ Ø¨Ø˛ØąÚ¯ Ų
ÛâÚŠŲŲ" ØąŲ Øĩدا ÚŠŲÛ.
+
+ØĸÛØ§ Ø§ØŗŲ
Ø´ `upper` Ø¨ŲØ¯Ø ÛØ§ `uppercase`Ø Ø´Ø§ÛØ¯ `first_uppercase`Ø ÛØ§ `capitalize`Ø
+
+Ø¨ØšØ¯Ø Ø¨Ø§ Ø¯ŲØŗØĒ ŲØ¯ÛŲ
Û Ø¨ØąŲØ§Ų
ŲâŲŲÛØŗØ§Ø ØĒÚŠŲ
ÛŲ ØŽŲØ¯ÚŠØ§Øą ŲÛØąØ§ÛØ´Ú¯ØąØ اŲ
ØĒØØ§Ų Ų
ÛâÚŠŲÛ.
+
+ŲžØ§ØąØ§Ų
ØĒØą اŲŲ ØĒØ§Ø¨ØšØ `first_name` ØąŲ ØĒاÛŲž Ų
ÛâÚŠŲÛØ بؚد ÛŲ ŲŲØˇŲ (`.`) Ų
ÛâØ°Ø§ØąÛ Ų `Ctrl+Space` ØąŲ Ų
ÛâØ˛ŲÛ ØĒا ØĒÚŠŲ
ÛŲ ØŽŲØ¯ÚŠØ§Øą Ø¨ÛØ§Ø¯.
+
+ŲŲÛ Ų
ØĒØŖØŗŲØ§ŲŲØ ÚÛØ˛ Ų
ŲÛØ¯Û ŲŲ
ÛâÚ¯ÛØąÛ:
+
+
+
+### Ųب𠨧ØļاŲŲ ÚŠŲ
+
+Ø¨ÛØ§ ŲŲØˇ ÛŲ ØŽØˇ Ø§Ø˛ ŲØŗØŽŲ ŲØ¨ŲÛ ØąŲ ØĒØēÛÛØą Ø¨Ø¯ÛŲ
.
+
+دŲÛŲØ§Ų اÛŲ Ø¨ØŽØ´Ø ŲžØ§ØąØ§Ų
ØĒØąŲØ§Û ØĒابؚ ØąŲØ Ø§Ø˛:
+
+```Python
+ first_name, last_name
+```
+
+بŲ:
+
+```Python
+ first_name: str, last_name: str
+```
+
+ØšŲØļ Ų
ÛâÚŠŲÛŲ
.
+
+ŲŲ
ÛŲŲ.
+
+اÛŲØ§ ŲŲ
ŲŲ "ŲŲØšâŲŲ
Ø§ŲØ§" ŲØŗØĒŲ:
+
+{* ../../docs_src/python_types/tutorial002.py hl[1] *}
+
+اÛŲ Ø¨Ø§ ØĒØšØąÛŲ Ų
ŲØ¯Ø§Øą ŲžÛØ´âŲØąØļ ŲØąŲ Ø¯Ø§ØąŲØ Ų
ØĢŲ:
+
+```Python
+ first_name="john", last_name="doe"
+```
+
+ÛŲ ÚÛØ˛ Ų
ØĒŲØ§ŲØĒŲ.
+
+Ų
ا Ø§Ø˛ دŲŲŲØˇŲ (`:`) Ø§ØŗØĒŲØ§Ø¯Ų Ų
ÛâÚŠŲÛŲ
Ø ŲŲ ØšŲØ§Ų
ØĒ Ų
ØŗØ§ŲÛ (`=`)â.
+
+Ų Ø§ØļاŲŲ ÚŠØąØ¯Ų ŲŲØšâŲŲ
Ø§ŲØ§ Ų
ØšŲ
ŲŲØ§Ų ÚÛØ˛Û ÚŠŲ Ø§ØĒŲØ§Ų Ų
ÛâØ§ŲØĒŲ ØąŲ Ø§Ø˛ ÚÛØ˛Û ÚŠŲ Ø¨Ø¯ŲŲ Ø§ŲŲØ§ Ų
ÛâØ§ŲØĒØ§Ø¯ ØĒØēÛÛØą ŲŲ
ÛâØ¯Ų.
+
+ŲŲÛ ØØ§ŲØ§Ø Ø¯ŲØ¨Ø§ØąŲ ØĒØĩŲØą ÚŠŲ ŲØŗØˇ ØŗØ§ØŽØĒŲ Ø§ŲŲ ØĒابؚ ŲØŗØĒÛØ ŲŲÛ Ø§ÛŲ Ø¨Ø§Øą با ŲŲØšâŲŲ
Ø§ŲØ§.
+
+ØĒŲÛ ŲŲ
ŲŲ ŲŲØˇŲØ ØŗØšÛ Ų
ÛâÚŠŲÛ ØĒÚŠŲ
ÛŲ ØŽŲØ¯ÚŠØ§Øą ØąŲ Ø¨Ø§ `Ctrl+Space` ŲØšØ§Ų ÚŠŲÛ Ų Ø§ÛŲŲ Ų
ÛâØ¨ÛŲÛ:
+
+
+
+با اÛŲØ Ų
ÛâØĒŲŲÛ Ø§ØŗÚŠØąŲŲ ÚŠŲÛØ Ú¯Ø˛ÛŲŲâŲØ§ ØąŲ Ø¨Ø¨ÛŲÛØ ØĒا ŲŲØĒÛ ÚŠŲ Ø§ŲŲ ÚÛØ˛Û ÚŠŲ "Ø¨Ų ŲØ¸ØąØĒ ØĸØ´ŲØ§ Ų
ÛØ§Ø¯" ØąŲ ŲžÛØ¯Ø§ ÚŠŲÛ:
+
+
+
+## اŲÚ¯ÛØ˛Ų Ø¨ÛØ´ØĒØą
+
+اÛŲ ØĒابؚ ØąŲ ÚÚŠ ÚŠŲØ Ø§ŲØ§Ų ŲŲØšâŲŲ
ا Ø¯Ø§ØąŲ:
+
+{* ../../docs_src/python_types/tutorial003.py hl[1] *}
+
+ÚŲŲ ŲÛØąØ§ÛØ´Ú¯Øą ŲŲØš Ų
ØĒØēÛØąŲا ØąŲ Ų
ÛâØ¯ŲŲŲØ ŲŲØˇ ØĒÚŠŲ
ÛŲ ØŽŲØ¯ÚŠØ§Øą ŲŲ
ÛâÚ¯ÛØąÛØ Ø¨ŲÚŠŲ ÚÚŠ ØŽØˇØ§ŲØ§ ŲŲ
Ø¯Ø§ØąÛ:
+
+
+
+ØØ§Ųا Ų
ÛâØ¯ŲŲÛ ÚŠŲ Ø¨Ø§ÛØ¯ Ø¯ØąØŗØĒØ´ ÚŠŲÛØ `age` ØąŲ Ø¨Ø§ `str(age)` Ø¨Ų ÛŲ ØąØ´ØĒŲ ØĒبدÛŲ ÚŠŲÛ:
+
+{* ../../docs_src/python_types/tutorial004.py hl[2] *}
+
+## ØĒØšØąÛŲ ŲŲØšâŲØ§
+
+ØĒØ§Ø˛Ų Ø§ØĩŲÛâØĒØąÛŲ ØŦا Ø¨ØąØ§Û ØĒØšØąÛŲ ŲŲØšâŲŲ
Ø§ŲØ§ ØąŲ Ø¯ÛØ¯Û. بŲâØšŲŲØ§Ų ŲžØ§ØąØ§Ų
ØĒØąŲØ§Û ØĒابؚ.
+
+اÛŲ ŲŲ
اØĩŲÛâØĒØąÛŲ ØŦاÛÛŲ ÚŠŲ Ø¨Ø§ **FastAPI** Ø§Ø˛Ø´ŲŲ Ø§ØŗØĒŲØ§Ø¯Ų Ų
ÛâÚŠŲÛ.
+
+### ŲŲØšâŲØ§Û ØŗØ§Ø¯Ų
+
+Ų
ÛâØĒŲŲÛ ŲŲ
Ų ŲŲØšâŲØ§Û Ø§ØŗØĒØ§ŲØ¯Ø§ØąØ¯ ŲžØ§ÛØĒŲŲ ØąŲ ØĒØšØąÛŲ ÚŠŲÛØ ŲŲ ŲŲØˇ `str`.
+
+Ų
ØĢŲØ§Ų Ų
ÛâØĒŲŲÛ Ø§Ø˛ اÛŲØ§ Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲÛ:
+
+* `int`
+* `float`
+* `bool`
+* `bytes`
+
+{* ../../docs_src/python_types/tutorial005.py hl[1] *}
+
+### ŲŲØšâŲØ§Û ØšŲ
ŲŲ
Û Ø¨Ø§ ŲžØ§ØąØ§Ų
ØĒØąŲØ§Û ŲŲØš
+
+ÛŲ ØŗØąÛ ØŗØ§ØŽØĒØ§Øą Ø¯Ø§Ø¯Ų ŲØŗØĒŲ ÚŠŲ Ų
ÛâØĒŲŲŲ Ų
ŲØ¯Ø§ØąŲØ§Û Ø¯ÛÚ¯Ų ØąŲ ŲÚ¯Ų Ø¯Ø§ØąŲØ Ų
ØĢŲ `dict`Ø `list`Ø `set` Ų `tuple`. Ų Ų
ŲØ¯Ø§ØąŲØ§Û Ø¯Ø§ØŽŲÛØ´ŲŲ ŲŲ
Ų
ÛâØĒŲŲŲ ŲŲØš ØŽŲØ¯Ø´ŲŲ ØąŲ Ø¯Ø§Ø´ØĒŲ Ø¨Ø§Ø´Ų.
+
+Ø¨Ų Ø§ÛŲ ŲŲØšâŲØ§ ÚŠŲ ŲŲØšâŲØ§Û دا؎ŲÛ Ø¯Ø§ØąŲ Ų
ÛâÚ¯Ų "**ØšŲ
ŲŲ
Û**" ÛØ§ "generic". Ų Ų
ÛâØ´Ų Ø§ŲŲØ§ ØąŲ ØĒØšØąÛŲ ÚŠØąØ¯Ø ØØĒÛ Ø¨Ø§ ŲŲØšâŲØ§Û دا؎ŲÛØ´ŲŲ.
+
+Ø¨ØąØ§Û ØĒØšØąÛŲ Ø§ÛŲ ŲŲØšâŲØ§ Ų ŲŲØšâŲØ§Û دا؎ŲÛØ´ŲŲØ Ų
ÛâØĒŲŲÛ Ø§Ø˛ Ų
اÚŲŲ Ø§ØŗØĒØ§ŲØ¯Ø§ØąØ¯ ŲžØ§ÛØĒŲŲ `typing` Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲÛ. اÛŲ Ų
اÚŲŲ Ų
ØŽØĩŲØĩ ŲžØ´ØĒÛØ¨Ø§ŲÛ Ø§Ø˛ ŲŲØšâŲŲ
Ø§ŲØ§ØŗØĒ.
+
+#### ŲØŗØŽŲâŲØ§Û ØŦØ¯ÛØ¯ØĒØą ŲžØ§ÛØĒŲŲ
+
+ØŗÛŲØĒÚŠØŗ با Ø§ØŗØĒŲØ§Ø¯Ų Ø§Ø˛ `typing` با ŲŲ
Ų ŲØŗØŽŲâŲØ§Ø Ø§Ø˛ ŲžØ§ÛØĒŲŲ 3.6 ØĒا ØŦØ¯ÛØ¯ØĒØąÛŲâŲØ§Ø Ø§Ø˛ ØŦŲ
ŲŲ ŲžØ§ÛØĒŲŲ 3.9Ø 3.10 Ų ØēÛØąŲ **ØŗØ§Ø˛Ú¯Ø§ØąŲ**.
+
+با ŲžÛØ´ØąŲØĒ ŲžØ§ÛØĒŲŲØ **ŲØŗØŽŲâŲØ§Û ØŦØ¯ÛØ¯ØĒØą** ŲžØ´ØĒÛØ¨Ø§ŲÛ Ø¨ŲØĒØąÛ Ø¨ØąØ§Û Ø§ÛŲ ŲŲØšâŲŲ
Ø§ŲØ§ Ø¯Ø§ØąŲ Ų ØĒŲÛ ØŽÛŲÛ Ų
ŲØ§ØąØ¯ ØØĒÛ ŲØ§Ø˛Ų
ŲÛØŗØĒ Ų
اÚŲŲ `typing` ØąŲ ŲØ§ØąØ¯ ÚŠŲÛ Ų Ø§Ø˛Ø´ Ø¨ØąØ§Û ØĒØšØąÛŲ ŲŲØšâŲŲ
Ø§ŲØ§ Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲÛ.
+
+Ø§Ú¯Ų Ø¨ØĒŲŲÛ Ø¨ØąØ§Û ŲžØąŲÚŲâØ§ØĒ Ø§Ø˛ ÛŲ ŲØŗØŽŲ ØŦØ¯ÛØ¯ØĒØą ŲžØ§ÛØĒŲŲ Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲÛØ Ų
ÛâØĒŲŲÛ Ø§Ø˛ اÛŲ ØŗØ§Ø¯Ú¯Û Ø§ØļاŲŲ Ø¨ŲØąŲ Ø¨Ø¨ØąÛ.
+
+ØĒŲÛ ŲŲ
Ų Ų
ØŗØĒŲØ¯Ø§ØĒØ Ų
ØĢاŲâŲØ§ÛÛ ŲØŗØĒŲ ÚŠŲ Ø¨Ø§ ŲØą ŲØŗØŽŲ ŲžØ§ÛØĒŲŲ ØŗØ§Ø˛Ú¯Ø§ØąŲ (ŲŲØĒÛ ØĒŲØ§ŲØĒÛ ŲØŗØĒ).
+
+Ų
ØĢŲØ§Ų "**Python 3.6+**" ÛØšŲÛ Ø¨Ø§ ŲžØ§ÛØĒŲŲ 3.6 ÛØ§ Ø¨Ø§ŲØ§ØĒØą (Ų
ØĢŲ 3.7Ø 3.8Ø 3.9Ø 3.10 Ų ØēÛØąŲ) ØŗØ§Ø˛Ú¯Ø§ØąŲ. Ų "**Python 3.9+**" ÛØšŲÛ Ø¨Ø§ ŲžØ§ÛØĒŲŲ 3.9 ÛØ§ Ø¨Ø§ŲØ§ØĒØą (Ų
ØĢŲ 3.10 Ų ØēÛØąŲ) ØŗØ§Ø˛Ú¯Ø§ØąŲ.
+
+Ø§Ú¯Ų Ø¨ØĒŲŲÛ Ø§Ø˛ **ØŦØ¯ÛØ¯ØĒØąÛŲ ŲØŗØŽŲâŲØ§Û ŲžØ§ÛØĒŲŲ** Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲÛØ Ø§Ø˛ Ų
ØĢاŲâŲØ§Û ŲØŗØŽŲ ØĸØŽØą Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲØ ÚŲŲ Ø§ŲŲØ§ **Ø¨ŲØĒØąÛŲ Ų ØŗØ§Ø¯ŲâØĒØąÛŲ ØŗÛŲØĒÚŠØŗ** ØąŲ Ø¯Ø§ØąŲØ Ų
ØĢŲØ§Ų "**Python 3.10+**".
+
+#### ŲÛØŗØĒ
+
+Ų
ØĢŲØ§ŲØ Ø¨ÛØ§ÛŲ
ÛŲ Ų
ØĒØēÛØą ØĒØšØąÛŲ ÚŠŲÛŲ
ÚŠŲ ÛŲ `list` Ø§Ø˛ `str` باشŲ.
+
+//// tab | Python 3.9+
+
+Ų
ØĒØēÛØą ØąŲ با ŲŲ
ŲŲ ØŗÛŲØĒÚŠØŗ دŲŲŲØˇŲ (`:`) ØĒØšØąÛŲ ÚŠŲ.
+
+بŲâØšŲŲØ§Ų ŲŲØšØ `list` ØąŲ Ø¨Ø°Ø§Øą.
+
+ÚŲŲ ŲÛØŗØĒ ÛŲ ŲŲØšŲ ÚŠŲ ŲŲØšâŲØ§Û دا؎ŲÛ Ø¯Ø§ØąŲØ اŲŲØ§ ØąŲ ØĒŲÛ ÚŠØąŲØ´ŲâŲØ§ Ų
ÛâØ°Ø§ØąÛ:
+
+```Python hl_lines="1"
+{!> ../../docs_src/python_types/tutorial006_py39.py!}
+```
+
+////
+
+//// tab | Python 3.8+
+
+Ø§Ø˛ `typing`Ø `List` ØąŲ (با `L` Ø¨Ø˛ØąÚ¯) ŲØ§ØąØ¯ ÚŠŲ:
+
+```Python hl_lines="1"
+{!> ../../docs_src/python_types/tutorial006.py!}
+```
+
+Ų
ØĒØēÛØą ØąŲ با ŲŲ
ŲŲ ØŗÛŲØĒÚŠØŗ دŲŲŲØˇŲ (`:`) ØĒØšØąÛŲ ÚŠŲ.
+
+بŲâØšŲŲØ§Ų ŲŲØšØ `List` ØąŲ ÚŠŲ Ø§Ø˛ `typing` ŲØ§ØąØ¯ ÚŠØąØ¯Û Ø¨Ø°Ø§Øą.
+
+ÚŲŲ ŲÛØŗØĒ ÛŲ ŲŲØšŲ ÚŠŲ ŲŲØšâŲØ§Û دا؎ŲÛ Ø¯Ø§ØąŲØ اŲŲØ§ ØąŲ ØĒŲÛ ÚŠØąŲØ´ŲâŲØ§ Ų
ÛâØ°Ø§ØąÛ:
+
+```Python hl_lines="4"
+{!> ../../docs_src/python_types/tutorial006.py!}
+```
+
+////
+
+/// info
+
+اŲŲ ŲŲØšâŲØ§Û دا؎ŲÛ ØĒŲÛ ÚŠØąŲØ´ŲâŲØ§ Ø¨ŲØ´ŲŲ "ŲžØ§ØąØ§Ų
ØĒØąŲØ§Û ŲŲØš" Ų
ÛâÚ¯Ų.
+
+ØĒŲÛ Ø§ÛŲ Ų
ŲØąØ¯Ø `str` ŲžØ§ØąØ§Ų
ØĒØą ŲŲØšÛŲ ÚŠŲ Ø¨Ų `List` (ÛØ§ `list` ØĒŲÛ ŲžØ§ÛØĒŲŲ 3.9 Ų Ø¨Ø§ŲØ§ØĒØą) ŲžØ§Øŗ Ø¯Ø§Ø¯Ų Ø´Ø¯Ų.
+
+///
+
+ÛØšŲÛ: "Ų
ØĒØēÛØą `items` ÛŲ `list` ŲØŗØĒØ Ų ŲØą ڊدŲŲ
Ø§Ø˛ ØĸÛØĒŲ
âŲØ§Û اÛŲ ŲÛØŗØĒ ÛŲ `str` ŲØŗØĒŲ".
+
+/// tip
+
+Ø§Ú¯Ų Ø§Ø˛ ŲžØ§ÛØĒŲŲ 3.9 ÛØ§ Ø¨Ø§ŲØ§ØĒØą Ø§ØŗØĒŲØ§Ø¯Ų Ų
ÛâÚŠŲÛØ ŲØ§Ø˛Ų
ŲÛØŗØĒ `List` ØąŲ Ø§Ø˛ `typing` ŲØ§ØąØ¯ ÚŠŲÛØ Ų
ÛâØĒŲŲÛ ŲŲ
ŲŲ ŲŲØš Ų
ØšŲ
ŲŲÛ `list` ØąŲ Ø¨Ų ØŦاش Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲÛ.
+
+///
+
+با اÛŲ ÚŠØ§ØąØ ŲÛØąØ§ÛØ´Ú¯ØąØĒ ØØĒÛ ŲŲØĒÛ Ø¯Ø§ØąÛ ØĸÛØĒŲ
âŲØ§Û ŲÛØŗØĒ ØąŲ ŲžØąØ¯Ø§Ø˛Ø´ Ų
ÛâÚŠŲÛ Ø¨ŲØĒ ÚŠŲ
ÚŠ Ų
ÛâÚŠŲŲ:
+
+
+
+بدŲŲ ŲŲØšâŲØ§Ø ØąØŗÛØ¯Ų Ø¨Ų Ø§ÛŲ ØĒŲØąÛØ¨Ø§Ų ØēÛØąŲ
Ų
ÚŠŲŲ.
+
+ØĒŲØŦŲ ÚŠŲ ÚŠŲ Ų
ØĒØēÛØą `item` ÛÚŠÛ Ø§Ø˛ ØšŲØ§ØĩØą ØĒŲÛ ŲÛØŗØĒ `items` ŲØŗØĒ.
+
+Ų Ø¨Ø§ اÛŲ ØØ§ŲØ ŲÛØąØ§ÛØ´Ú¯Øą Ų
ÛâØ¯ŲŲŲ ÚŠŲ ÛŲ `str` ŲØŗØĒ Ų Ø¨ØąØ§Ø´ ŲžØ´ØĒÛØ¨Ø§ŲÛ Ų
ÛâØ¯Ų.
+
+#### ØĒØ§ŲžŲ Ų ØŗØĒ
+
+Ø¨ØąØ§Û ØĒØšØąÛŲ `tuple`ŲØ§ Ų `set`ŲØ§ ŲŲ
ŲŲ
ÛŲ ÚŠØ§Øą ØąŲ Ų
ÛâÚŠŲÛ:
+
+//// tab | Python 3.9+
+
+```Python hl_lines="1"
+{!> ../../docs_src/python_types/tutorial007_py39.py!}
+```
+
+////
+
+//// tab | Python 3.8+
+
+```Python hl_lines="1 4"
+{!> ../../docs_src/python_types/tutorial007.py!}
+```
+
+////
+
+ÛØšŲÛ:
+
+* Ų
ØĒØēÛØą `items_t` ÛŲ `tuple` با 3 ØĒا ØĸÛØĒŲ
ŲØ ÛŲ `int`Ø ÛŲ `int` دÛÚ¯ŲØ Ų ÛŲ `str`.
+* Ų
ØĒØēÛØą `items_s` ÛŲ `set` ŲØŗØĒØ Ų ŲØą ڊدŲŲ
Ø§Ø˛ ØĸÛØĒŲ
âŲØ§Ø´ Ø§Ø˛ ŲŲØš `bytes` ŲØŗØĒŲ.
+
+#### دÛÚŠØ´ŲØąÛ
+
+Ø¨ØąØ§Û ØĒØšØąÛŲ ÛŲ `dict`Ø 2 ØĒا ŲžØ§ØąØ§Ų
ØĒØą ŲŲØš Ų
ÛâØ¯ÛØ ÚŠŲ Ø¨Ø§ ڊاŲ
ا Ø§Ø˛ ŲŲ
ØŦدا شدŲ.
+
+ŲžØ§ØąØ§Ų
ØĒØą Ųب𠨧ŲŲ Ø¨ØąØ§Û ÚŠŲÛØ¯ŲØ§Û `dict` ŲØŗØĒ.
+
+ŲžØ§ØąØ§Ų
ØĒØą Ųب𠨝ŲŲ
Ø¨ØąØ§Û Ų
ŲØ¯Ø§ØąŲØ§Û `dict` ŲØŗØĒ:
+
+//// tab | Python 3.9+
+
+```Python hl_lines="1"
+{!> ../../docs_src/python_types/tutorial008_py39.py!}
+```
+
+////
+
+//// tab | Python 3.8+
+
+```Python hl_lines="1 4"
+{!> ../../docs_src/python_types/tutorial008.py!}
+```
+
+////
+
+ÛØšŲÛ:
+
+* Ų
ØĒØēÛØą `prices` ÛŲ `dict` ŲØŗØĒ:
+ * ÚŠŲÛØ¯ŲØ§Û Ø§ÛŲ `dict` Ø§Ø˛ ŲŲØš `str` ŲØŗØĒŲ (Ų
ØĢŲØ§Ų Ø§ØŗŲ
ŲØą ØĸÛØĒŲ
).
+ * Ų
ŲØ¯Ø§ØąŲØ§Û Ø§ÛŲ `dict` Ø§Ø˛ ŲŲØš `float` ŲØŗØĒŲ (Ų
ØĢŲØ§Ų ŲÛŲ
ØĒ ŲØą ØĸÛØĒŲ
).
+
+#### اØĒØØ§Ø¯ÛŲ
+
+Ų
ÛâØĒŲŲÛ ØĒØšØąÛŲ ÚŠŲÛ ÚŠŲ ÛŲ Ų
ØĒØēÛØą Ų
ÛâØĒŲŲŲ ŲØą ڊدŲŲ
Ø§Ø˛ **ÚŲØ¯ ØĒا ŲŲØš** Ø¨Ø§Ø´ŲØ Ų
ØĢŲØ§Ų ÛŲ `int` ÛØ§ ÛŲ `str`.
+
+ØĒŲÛ ŲžØ§ÛØĒŲŲ 3.6 Ų Ø¨Ø§ŲØ§ØĒØą (Ø§Ø˛ ØŦŲ
ŲŲ ŲžØ§ÛØĒŲŲ 3.10) Ų
ÛâØĒŲŲÛ Ø§Ø˛ ŲŲØš `Union` ØĒŲÛ `typing` Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲÛ Ų ŲŲØšâŲØ§Û Ų
Ų
ÚŠŲ ØąŲ ØĒŲÛ ÚŠØąŲØ´ŲâŲØ§ Ø¨Ø°Ø§ØąÛ.
+
+ØĒŲÛ ŲžØ§ÛØĒŲŲ 3.10 ÛŲ **ØŗÛŲØĒÚŠØŗ ØŦØ¯ÛØ¯** ŲŲ
ŲØŗØĒ ÚŠŲ Ų
ÛâØĒŲŲÛ ŲŲØšâŲØ§Û Ų
Ų
ÚŠŲ ØąŲ Ø¨Ø§ ÛŲ ØŽØˇ ØšŲ
ŲØ¯Û (`|`) ØŦدا ÚŠŲÛ.
+
+//// tab | Python 3.10+
+
+```Python hl_lines="1"
+{!> ../../docs_src/python_types/tutorial008b_py310.py!}
+```
+
+////
+
+//// tab | Python 3.8+
+
+```Python hl_lines="1 4"
+{!> ../../docs_src/python_types/tutorial008b.py!}
+```
+
+////
+
+ØĒŲÛ ŲØą Ø¯Ų ØØ§ŲØĒ ÛØšŲÛ `item` Ų
ÛâØĒŲŲŲ ÛŲ `int` ÛØ§ ÛŲ `str` باشŲ.
+
+#### Ø´Ø§ÛØ¯ `None`
+
+Ų
ÛâØĒŲŲÛ ØĒØšØąÛŲ ÚŠŲÛ ÚŠŲ ÛŲ Ų
ŲØ¯Ø§Øą Ų
ÛâØĒŲŲŲ ÛŲ ŲŲØš Ø¨Ø§Ø´ŲØ Ų
ØĢŲØ§Ų `str`Ø ŲŲÛ Ų
ÛâØĒŲŲŲ `None` ŲŲ
باشŲ.
+
+ØĒŲÛ ŲžØ§ÛØĒŲŲ 3.6 Ų Ø¨Ø§ŲØ§ØĒØą (Ø§Ø˛ ØŦŲ
ŲŲ ŲžØ§ÛØĒŲŲ 3.10) Ų
ÛâØĒŲŲÛ Ø¨Ø§ ŲØ§ØąØ¯ ÚŠØąØ¯Ų Ų Ø§ØŗØĒŲØ§Ø¯Ų Ø§Ø˛ `Optional` Ø§Ø˛ Ų
اÚŲŲ `typing` اÛŲŲ ØĒØšØąÛŲ ÚŠŲÛ.
+
+```Python hl_lines="1 4"
+{!../../docs_src/python_types/tutorial009.py!}
+```
+
+Ø§ØŗØĒŲØ§Ø¯Ų Ø§Ø˛ `Optional[str]` Ø¨Ų ØŦØ§Û ŲŲØˇ `str` Ø¨Ų ŲÛØąØ§ÛØ´Ú¯Øą ÚŠŲ
ÚŠ Ų
ÛâÚŠŲŲ ØŽØˇØ§ŲØ§ÛÛ ÚŠŲ Ų
Ų
ÚŠŲŲ ŲÚŠØą ÚŠŲÛ ÛŲ Ų
ŲØ¯Ø§Øą ŲŲ
ÛØ´Ų `str` ŲØŗØĒ ØąŲ ŲžÛØ¯Ø§ ÚŠŲŲØ Ø¯Øą ØØ§ŲÛ ÚŠŲ Ų
ÛâØĒŲŲŲ `None` ŲŲ
باشŲ.
+
+`Optional[Something]` Ø¯Øą ŲØ§ŲØš Ų
ÛØ§ŲâØ¨Øą Ø¨ØąØ§Û `Union[Something, None]` ŲØŗØĒØ Ø§ÛŲ Ø¯Ų ØĒا Ų
ؚادŲŲ.
+
+ÛØšŲÛ ØĒŲÛ ŲžØ§ÛØĒŲŲ 3.10Ø Ų
ÛâØĒŲŲÛ Ø§Ø˛ `Something | None` Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲÛ:
+
+//// tab | Python 3.10+
+
+```Python hl_lines="1"
+{!> ../../docs_src/python_types/tutorial009_py310.py!}
+```
+
+////
+
+//// tab | Python 3.8+
+
+```Python hl_lines="1 4"
+{!> ../../docs_src/python_types/tutorial009.py!}
+```
+
+////
+
+//// tab | Python 3.8+ ØŦاÛÚ¯Ø˛ÛŲ
+
+```Python hl_lines="1 4"
+{!> ../../docs_src/python_types/tutorial009b.py!}
+```
+
+////
+
+#### Ø§ØŗØĒŲØ§Ø¯Ų Ø§Ø˛ `Union` ÛØ§ `Optional`
+
+Ø§Ú¯Ų Ø§Ø˛ ŲØŗØŽŲ ŲžØ§ÛØĒŲŲ Ø˛ÛØą 3.10 Ø§ØŗØĒŲØ§Ø¯Ų Ų
ÛâÚŠŲÛØ ÛŲ ŲÚŠØĒŲ Ø§Ø˛ Ø¯ÛØ¯ ØŽÛŲÛ **Ø´ØŽØĩÛ** ØŽŲØ¯Ų
:
+
+* đ¨ Ø§Ø˛ `Optional[SomeType]` Ø§ØŗØĒŲØ§Ø¯Ų ŲÚŠŲ
+* Ø¨Ų ØŦاش ⨠**Ø§Ø˛ `Union[SomeType, None]` Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲ** â¨.
+
+ŲØą Ø¯Ų Ų
ؚادŲŲ Ų Ø˛ÛØą ŲžŲØŗØĒŲ ÛÚŠÛâØ§ŲØ ŲŲÛ Ų
Ų `Union` ØąŲ Ø¨Ų `Optional` ØĒØąØŦÛØ Ų
ÛâØ¯Ų
ÚŲŲ ÚŠŲŲ
Ų "**ا؎ØĒÛØ§ØąÛ**" اŲÚ¯Ø§Øąæį¤ē Ų
ÛâÚŠŲŲ ÚŠŲ Ų
ŲØ¯Ø§Øą ا؎ØĒÛØ§ØąÛŲØ Ø¯Øą ØØ§ŲÛ ÚŠŲ Ø¯Øą ŲØ§ŲØš ÛØšŲÛ "Ų
ÛâØĒŲŲŲ `None` باشŲ"Ø ØØĒÛ Ø§Ú¯Ų Ø§ØŽØĒÛØ§ØąÛ ŲØ¨Ø§Ø´Ų Ų ŲŲŲØ˛ ŲØ§Ø˛Ų
باشŲ.
+
+ŲÚŠØą Ų
ÛâÚŠŲŲ
`Union[SomeType, None]` ŲØ§ØļØâØĒØą ŲØ´ŲŲ Ų
ÛâØ¯Ų ÚÛ Ų
ØšŲÛ Ų
ÛâØ¯Ų.
+
+ŲŲØˇ Ø¨ØØĢ ÚŠŲŲ
اØĒ Ų Ø§ØŗŲ
âŲØ§ØŗØĒ. ŲŲÛ Ø§ÛŲ ÚŠŲŲ
اØĒ Ų
ÛâØĒŲŲŲ ØąŲ ØˇØąØ˛ ŲÚŠØą ØĒŲ Ų ØĒÛŲ
ØĒ ŲØŗØ¨ØĒ Ø¨Ų ÚŠØ¯ ØĒØŖØĢÛØą Ø¨Ø°Ø§ØąŲ.
+
+بŲâØšŲŲØ§Ų Ų
ØĢØ§ŲØ اÛŲ ØĒابؚ ØąŲ Ø¨Ø¨ÛŲ:
+
+{* ../../docs_src/python_types/tutorial009c.py hl[1,4] *}
+
+ŲžØ§ØąØ§Ų
ØĒØą `name` بŲâØšŲŲØ§Ų `Optional[str]` ØĒØšØąÛŲ Ø´Ø¯ŲØ ŲŲÛ **ا؎ØĒÛØ§ØąÛ ŲÛØŗØĒ**Ø ŲŲ
ÛâØĒŲŲÛ ØĒابؚ ØąŲ Ø¨Ø¯ŲŲ ŲžØ§ØąØ§Ų
ØĒØą Øĩدا ÚŠŲÛ:
+
+```Python
+say_hi() # اŲŲ ŲŲØ اÛŲ ØŽØˇØ§ Ų
ÛâØ¯Ų! đą
+```
+
+ŲžØ§ØąØ§Ų
ØĒØą `name` **ŲŲŲØ˛ ŲØ§Ø˛Ų
Ų** (ŲŲ *ا؎ØĒÛØ§ØąÛ*) ÚŲŲ Ų
ŲØ¯Ø§Øą ŲžÛØ´âŲØąØļ ŲØ¯Ø§ØąŲ. با اÛŲ ØØ§ŲØ `name` Ų
ŲØ¯Ø§Øą `None` ØąŲ ŲØ¨ŲŲ Ų
ÛâÚŠŲŲ:
+
+```Python
+say_hi(name=None) # اÛŲ ÚŠØ§Øą Ų
ÛâÚŠŲŲØ None Ų
ØšØĒØ¨ØąŲ đ
+```
+
+ØŽØ¨Øą ØŽŲØ¨ اÛŲŲ ÚŠŲ ŲŲØĒÛ ØąŲ ŲžØ§ÛØĒŲŲ 3.10 Ø¨Ø§Ø´ÛØ ŲØ§Ø˛Ų
ŲÛØŗØĒ ŲÚ¯ØąØ§Ų Ø§ÛŲ Ø¨Ø§Ø´ÛØ ÚŲŲ Ų
ÛâØĒŲŲÛ Ø¨ŲâØŗØ§Ø¯Ú¯Û Ø§Ø˛ `|` Ø¨ØąØ§Û ØĒØšØąÛŲ Ø§ØĒØØ§Ø¯ÛŲ ŲŲØšâŲØ§ Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲÛ:
+
+{* ../../docs_src/python_types/tutorial009c_py310.py hl[1,4] *}
+
+اŲŲ Ų
Ųب𠨝ÛÚ¯Ų ŲØ§Ø˛Ų
ŲÛØŗØĒ ŲÚ¯ØąØ§Ų Ø§ØŗŲ
âŲØ§ÛÛ Ų
ØĢŲ `Optional` Ų `Union` باشÛ. đ
+
+#### ŲŲØšâŲØ§Û ØšŲ
ŲŲ
Û
+
+اÛŲ ŲŲØšâŲØ§ÛÛ ÚŠŲ ŲžØ§ØąØ§Ų
ØĒØąŲØ§Û ŲŲØš ØąŲ ØĒŲÛ ÚŠØąŲØ´ŲâŲØ§ Ų
ÛâÚ¯ÛØąŲ Ø¨ŲØ´ŲŲ **ŲŲØšâŲØ§Û ØšŲ
ŲŲ
Û** ÛØ§ **Generics** Ų
ÛâÚ¯ŲØ Ų
ØĢŲØ§Ų:
+
+//// tab | Python 3.10+
+
+Ų
ÛâØĒŲŲÛ Ø§Ø˛ ŲŲ
ŲŲ ŲŲØšâŲØ§Û دا؎ŲÛ Ø¨ŲâØšŲŲØ§Ų ŲŲØšâŲØ§Û ØšŲ
ŲŲ
Û Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲÛ (با ÚŠØąŲØ´ŲâŲØ§ Ų ŲŲØšâŲØ§ Ø¯Ø§ØŽŲØ´ŲŲ):
+
+* `list`
+* `tuple`
+* `set`
+* `dict`
+
+Ų ŲŲ
ŲŲâØˇŲØą ÚŠŲ ØĒŲÛ ŲžØ§ÛØĒŲŲ 3.8 Ø¨ŲØ¯Ø Ø§Ø˛ Ų
اÚŲŲ `typing`:
+
+* `Union`
+* `Optional` (ŲŲ
ŲŲâØˇŲØą ÚŠŲ ØĒŲÛ ŲžØ§ÛØĒŲŲ 3.8 Ø¨ŲØ¯)
+* ...Ų Ø¨ŲÛŲ.
+
+ØĒŲÛ ŲžØ§ÛØĒŲŲ 3.10Ø Ø¨ŲâØšŲŲØ§Ų ØŦاÛÚ¯Ø˛ÛŲ Ø¨ØąØ§Û Ø§ØŗØĒŲØ§Ø¯Ų Ø§Ø˛ ŲŲØšâŲØ§Û ØšŲ
ŲŲ
Û `Union` Ų `Optional`Ø Ų
ÛâØĒŲŲÛ Ø§Ø˛ ØŽØˇ ØšŲ
ŲØ¯Û (`|`) Ø¨ØąØ§Û ØĒØšØąÛŲ Ø§ØĒØØ§Ø¯ÛŲ ŲŲØšâŲØ§ Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲÛØ ÚŠŲ ØŽÛŲÛ Ø¨ŲØĒØą Ų ØŗØ§Ø¯ŲâØĒØąŲ.
+
+////
+
+//// tab | Python 3.9+
+
+Ų
ÛâØĒŲŲÛ Ø§Ø˛ ŲŲ
ŲŲ ŲŲØšâŲØ§Û دا؎ŲÛ Ø¨ŲâØšŲŲØ§Ų ŲŲØšâŲØ§Û ØšŲ
ŲŲ
Û Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲÛ (با ÚŠØąŲØ´ŲâŲØ§ Ų ŲŲØšâŲØ§ Ø¯Ø§ØŽŲØ´ŲŲ):
+
+* `list`
+* `tuple`
+* `set`
+* `dict`
+
+Ų ŲŲ
ŲŲâØˇŲØą ÚŠŲ ØĒŲÛ ŲžØ§ÛØĒŲŲ 3.8 Ø¨ŲØ¯Ø Ø§Ø˛ Ų
اÚŲŲ `typing`:
+
+* `Union`
+* `Optional`
+* ...Ų Ø¨ŲÛŲ.
+
+////
+
+//// tab | Python 3.8+
+
+* `List`
+* `Tuple`
+* `Set`
+* `Dict`
+* `Union`
+* `Optional`
+* ...Ų Ø¨ŲÛŲ.
+
+////
+
+### ÚŠŲØ§ØŗâŲØ§ بŲâØšŲŲØ§Ų ŲŲØš
+
+Ų
ÛâØĒŲŲÛ ÛŲ ÚŠŲØ§Øŗ ØąŲ ŲŲ
بŲâØšŲŲØ§Ų ŲŲØš ÛŲ Ų
ØĒØēÛØą ØĒØšØąÛŲ ÚŠŲÛ.
+
+ŲØąØļ ÚŠŲ ÛŲ ÚŠŲØ§Øŗ `Person` Ø¯Ø§ØąÛØ با ÛŲ ŲØ§Ų
:
+
+{* ../../docs_src/python_types/tutorial010.py hl[1:3] *}
+
+بؚد Ų
ÛâØĒŲŲÛ ÛŲ Ų
ØĒØēÛØą ØąŲ Ø§Ø˛ ŲŲØš `Person` ØĒØšØąÛŲ ÚŠŲÛ:
+
+{* ../../docs_src/python_types/tutorial010.py hl[6] *}
+
+Ų Ø¨ØšØ¯Ø Ø¯ŲØ¨Ø§ØąŲØ ŲŲ
Ų ŲžØ´ØĒÛØ¨Ø§ŲÛ ŲÛØąØ§ÛØ´Ú¯Øą ØąŲ Ø¯Ø§ØąÛ:
+
+
+
+ØĒŲØŦŲ ÚŠŲ ÚŠŲ Ø§ÛŲ ÛØšŲÛ "`one_person` ÛŲ **ŲŲ
ŲŲŲ** Ø§Ø˛ ÚŠŲØ§Øŗ `Person` ŲØŗØĒ".
+
+ÛØšŲÛ "`one_person` ØŽŲØ¯ **ÚŠŲØ§Øŗ** Ø¨Ų Ø§ØŗŲ
`Person` ŲÛØŗØĒ".
+
+## Ų
دŲâŲØ§Û Pydantic
+
+ Pydantic ÛŲ ÚŠØĒاب؎ŲŲŲ ŲžØ§ÛØĒŲŲŲ Ø¨ØąØ§Û Ø§ØšØĒØ¨Ø§ØąØŗŲØŦÛ Ø¯Ø§Ø¯ŲâŲØ§.
+
+"Ø´ÚŠŲ" دادŲâŲØ§ ØąŲ Ø¨ŲâØšŲŲØ§Ų ÚŠŲØ§ØŗâŲØ§ÛÛ Ø¨Ø§ ŲÛÚÚ¯ÛâŲØ§ ØĒØšØąÛŲ Ų
ÛâÚŠŲÛ.
+
+Ų ŲØą ŲÛÚÚ¯Û ÛŲ ŲŲØš Ø¯Ø§ØąŲ.
+
+بؚد ÛŲ ŲŲ
ŲŲŲ Ø§Ø˛ اŲŲ ÚŠŲØ§Øŗ ØąŲ Ø¨Ø§ ÛŲ ØŗØąÛ Ų
ŲØ¯Ø§Øą Ų
ÛâØŗØ§Ø˛Û Ų Ø§ŲŲ Ų
ŲØ¯Ø§ØąŲا ØąŲ Ø§ØšØĒØ¨Ø§ØąØŗŲØŦÛ Ų
ÛâÚŠŲŲØ Ø¨Ų ŲŲØš Ų
ŲØ§ØŗØ¨ ØĒبدÛŲØ´ŲŲ Ų
ÛâÚŠŲŲ (Ø§Ú¯Ų ŲØ§Ø˛Ų
باشŲ) Ų ÛŲ Ø´ÛØĄ با ŲŲ
Ų Ø¯Ø§Ø¯ŲâŲØ§ Ø¨ŲØĒ Ų
ÛâØ¯Ų.
+
+Ų Ø¨Ø§ اŲŲ Ø´ÛØĄ ŲŲØ§ÛÛ ŲŲ
Ų ŲžØ´ØĒÛØ¨Ø§ŲÛ ŲÛØąØ§ÛØ´Ú¯Øą ØąŲ Ų
ÛâÚ¯ÛØąÛ.
+
+ÛŲ Ų
ØĢØ§Ų Ø§Ø˛ Ų
ØŗØĒŲØ¯Ø§ØĒ ØąØŗŲ
Û Pydantic:
+
+//// tab | Python 3.10+
+
+```Python
+{!> ../../docs_src/python_types/tutorial011_py310.py!}
+```
+
+////
+
+//// tab | Python 3.9+
+
+```Python
+{!> ../../docs_src/python_types/tutorial011_py39.py!}
+```
+
+////
+
+//// tab | Python 3.8+
+
+```Python
+{!> ../../docs_src/python_types/tutorial011.py!}
+```
+
+////
+
+/// info
+
+Ø¨ØąØ§Û Ø§ØˇŲØ§ØšØ§ØĒ Ø¨ÛØ´ØĒØą Ø¯Øą Ų
بਝ PydanticØ Ų
ØŗØĒŲØ¯Ø§ØĒØ´ ØąŲ ÚÚŠ ÚŠŲ .
+
+///
+
+**FastAPI** ڊاŲ
ŲØ§Ų Ø¨Øą ŲžØ§ÛŲ Pydantic ŲØŗØĒ.
+
+ØĒŲÛ [ØĸŲ
ŲØ˛Ø´ - ØąØ§ŲŲŲ
Ø§Û ÚŠØ§ØąØ¨Øą](tutorial/index.md){.internal-link target=_blank} ØŽÛŲÛ Ø¨ÛØ´ØĒØą Ø§Ø˛ اÛŲØ§ ØąŲ ØĒŲÛ ØšŲ
Ų Ų
ÛâØ¨ÛŲÛ.
+
+/// tip
+
+Pydantic ÛŲ ØąŲØĒØ§Øą ؎اØĩ Ø¯Ø§ØąŲ ŲŲØĒÛ Ø§Ø˛ `Optional` ÛØ§ `Union[Something, None]` بدŲŲ Ų
ŲØ¯Ø§Øą ŲžÛØ´âŲØąØļ Ø§ØŗØĒŲØ§Ø¯Ų Ų
ÛâÚŠŲÛØ Ų
ÛâØĒŲŲÛ ØĒŲÛ Ų
ØŗØĒŲØ¯Ø§ØĒ Pydantic Ø¯Øą Ų
بਝ ŲÛŲØ¯ŲØ§Û Ø§ØŽØĒÛØ§ØąÛ ŲØ§Ø˛Ų
Ø¨ÛØ´ØĒØą ب؎ŲŲÛ.
+
+///
+
+## ŲŲØšâŲŲ
Ø§ŲØ§ با AnnotationŲØ§Û Ų
ØĒØ§Ø¯ÛØĒØ§
+
+ŲžØ§ÛØĒŲŲ ÛŲ ŲØ§Ø¨ŲÛØĒ ŲŲ
Ø¯Ø§ØąŲ ÚŠŲ Ø¨ŲØĒ Ø§ØŦØ§Ø˛Ų Ų
ÛâØ¯Ų **Ų
ØĒØ§Ø¯ÛØĒØ§ اØļاŲÛ** ØąŲ ØĒŲÛ Ø§ÛŲ ŲŲØšâŲŲ
Ø§ŲØ§ Ø¨Ø°Ø§ØąÛ Ø¨Ø§ Ø§ØŗØĒŲØ§Ø¯Ų Ø§Ø˛ `Annotated`.
+
+//// tab | Python 3.9+
+
+ØĒŲÛ ŲžØ§ÛØĒŲŲ 3.9Ø `Annotated` Ø¨ØŽØ´Û Ø§Ø˛ ÚŠØĒاب؎ŲŲŲ Ø§ØŗØĒØ§ŲØ¯Ø§ØąØ¯ŲØ ŲžØŗ Ų
ÛâØĒŲŲÛ Ø§Ø˛ `typing` ŲØ§ØąØ¯Ø´ ÚŠŲÛ.
+
+```Python hl_lines="1 4"
+{!> ../../docs_src/python_types/tutorial013_py39.py!}
+```
+
+////
+
+//// tab | Python 3.8+
+
+ØĒŲÛ ŲØŗØŽŲâŲØ§Û Ø˛ÛØą ŲžØ§ÛØĒŲŲ 3.9Ø `Annotated` ØąŲ Ø§Ø˛ `typing_extensions` ŲØ§ØąØ¯ Ų
ÛâÚŠŲÛ.
+
+با **FastAPI** Ø§Ø˛ ŲØ¨Ų ŲØĩب شدŲ.
+
+```Python hl_lines="1 4"
+{!> ../../docs_src/python_types/tutorial013.py!}
+```
+
+////
+
+ØŽŲØ¯ ŲžØ§ÛØĒŲŲ Ø¨Ø§ اÛŲ `Annotated` ÚŠØ§ØąÛ ŲŲ
ÛâÚŠŲŲ. Ų Ø¨ØąØ§Û ŲÛØąØ§ÛØ´Ú¯ØąŲا Ų Ø§Ø¨Ø˛Ø§ØąŲØ§Û دÛÚ¯ŲØ ŲŲØš ŲŲŲØ˛ `str` ŲØŗØĒ.
+
+ŲŲÛ Ų
ÛâØĒŲŲÛ Ø§Ø˛ اÛŲ ŲØļØ§ ØĒŲÛ `Annotated` Ø§ØŗØĒŲØ§Ø¯Ų ÚŠŲÛ ØĒا Ø¨Ų **FastAPI** Ų
ØĒØ§Ø¯ÛØĒØ§Û اØļاŲÛ Ø¯Øą Ų
بਝ اÛŲÚŠŲ ÚØˇŲØą Ų
ÛâØŽŲØ§Û Ø¨ØąŲØ§Ų
ŲâØ§ØĒ ØąŲØĒØ§Øą ÚŠŲŲ Ø¨Ø¯Û.
+
+ŲÚŠØĒŲ Ų
ŲŲ
اÛŲŲ ÚŠŲ **اŲŲÛŲ *ŲžØ§ØąØ§Ų
ØĒØą ŲŲØš*** ÚŠŲ Ø¨Ų `Annotated` Ų
ÛâØ¯ÛØ **ŲŲØš ŲØ§ŲØšÛ** ŲØŗØĒ. بŲÛØ´ ŲŲØˇ Ų
ØĒØ§Ø¯ÛØĒØ§ Ø¨ØąØ§Û Ø§Ø¨Ø˛Ø§ØąŲØ§Û دÛÚ¯ŲâØŗØĒ.
+
+Ø§ŲØ§Ų ŲŲØˇ Ø¨Ø§ÛØ¯ بدŲŲÛ ÚŠŲ `Annotated` ŲØŦŲØ¯ Ø¯Ø§ØąŲØ Ų Ø§ÛŲÚŠŲ ŲžØ§ÛØĒŲŲ Ø§ØŗØĒØ§ŲØ¯Ø§ØąØ¯Ų. đ
+
+Ø¨ØšØ¯Ø§Ų Ų
ÛâØ¨ÛŲÛ ÚŠŲ ÚŲØ¯Øą **ŲŲÛ** Ų
ÛâØĒŲŲŲ Ø¨Ø§Ø´Ų.
+
+/// tip
+
+اÛŲÚŠŲ Ø§ÛŲ **ŲžØ§ÛØĒŲŲ Ø§ØŗØĒØ§ŲØ¯Ø§ØąØ¯Ų** ÛØšŲÛ ŲŲŲØ˛ **Ø¨ŲØĒØąÛŲ ØĒØŦØąØ¨Ų ØĒŲØŗØšŲâØ¯ŲŲØ¯Ų** ØąŲ ØĒŲÛ ŲÛØąØ§ÛØ´Ú¯ØąØĒØ Ø¨Ø§ Ø§Ø¨Ø˛Ø§ØąŲØ§ÛÛ ÚŠŲ Ø¨ØąØ§Û ØĒØŲÛŲ Ų Ø¨Ø§Ø˛ØŗØ§Ø˛Û ÚŠØ¯ØĒ Ø§ØŗØĒŲØ§Ø¯Ų Ų
ÛâÚŠŲÛ Ų ØēÛØąŲ Ų
ÛâÚ¯ÛØąÛ. â¨
+
+Ų ŲŲ
ÛŲâØˇŲØą ڊدØĒ با ØŽÛŲÛ Ø§Ø˛ Ø§Ø¨Ø˛Ø§ØąŲØ§ Ų ÚŠØĒاب؎ŲŲŲâŲØ§Û دÛÚ¯Ų ŲžØ§ÛØĒŲŲ ØŽÛŲÛ ØŗØ§Ø˛Ú¯Ø§Øą Ų
ÛâŲ
ŲŲŲ. đ
+
+///
+
+## ŲŲØšâŲŲ
Ø§ŲØ§ ØĒŲÛ **FastAPI**
+
+**FastAPI** Ø§Ø˛ اÛŲ ŲŲØšâŲŲ
Ø§ŲØ§ Ø§ØŗØĒŲØ§Ø¯Ų Ų
ÛâÚŠŲŲ ØĒا ÚŲØ¯ ØĒا ÚŠØ§Øą بڊŲŲ.
+
+با **FastAPI** ŲžØ§ØąØ§Ų
ØĒØąŲØ§ ØąŲ Ø¨Ø§ ŲŲØšâŲŲ
Ø§ŲØ§ ØĒØšØąÛŲ Ų
ÛâÚŠŲÛ Ų Ø§ÛŲØ§ ØąŲ Ų
ÛâÚ¯ÛØąÛ:
+
+* **ŲžØ´ØĒÛØ¨Ø§ŲÛ ŲÛØąØ§ÛØ´Ú¯Øą**.
+* **ÚÚŠ ŲŲØšâŲØ§**.
+
+...Ų **FastAPI** Ø§Ø˛ ŲŲ
ŲŲ ØĒØšØąÛŲâŲØ§ Ø¨ØąØ§Û Ø§ÛŲØ§ Ø§ØŗØĒŲØ§Ø¯Ų Ų
ÛâÚŠŲŲ:
+
+* **ØĒØšØąÛŲ ŲÛØ§Ø˛Ųا**: Ø§Ø˛ ŲžØ§ØąØ§Ų
ØĒØąŲØ§Û Ų
ØŗÛØą Ø¯ØąØŽŲØ§ØŗØĒØ ŲžØ§ØąØ§Ų
ØĒØąŲØ§Û ÚŠŲØĻØąÛØ ŲØ¯ØąŲØ§Ø Ø¨Ø¯ŲŲâŲØ§Ø ŲØ§Ø¨ØŗØĒÚ¯ÛâŲØ§ Ų ØēÛØąŲ.
+* **ØĒبدÛŲ Ø¯Ø§Ø¯Ų**: Ø§Ø˛ Ø¯ØąØŽŲØ§ØŗØĒ Ø¨Ų ŲŲØš Ų
بਝ ŲÛØ§Ø˛.
+* **اؚØĒØ¨Ø§ØąØŗŲØŦÛ Ø¯Ø§Ø¯Ų**: ÚŠŲ Ø§Ø˛ ŲØą Ø¯ØąØŽŲØ§ØŗØĒ Ų
ÛØ§Ø¯:
+ * ØĒŲŲÛØ¯ **ØŽØˇØ§ŲØ§Û ØŽŲØ¯ÚŠØ§Øą** ÚŠŲ Ø¨Ų ÚŠŲØ§ÛŲØĒ Ø¨ØąŲ
ÛâÚ¯ØąØ¯Ų ŲŲØĒÛ Ø¯Ø§Ø¯Ų ŲØ§Ų
ØšØĒØ¨ØąŲ.
+* **Ų
ØŗØĒŲØ¯ØŗØ§Ø˛Û** API با Ø§ØŗØĒŲØ§Ø¯Ų Ø§Ø˛ OpenAPI:
+ * ÚŠŲ Ø¨ØšØ¯Ø´ ØĒŲØŗØˇ ØąØ§Ø¨ØˇâŲØ§Û ÚŠØ§ØąØ¨ØąÛ Ų
ØŗØĒŲØ¯Ø§ØĒ ØĒؚاŲ
ŲÛ ØŽŲØ¯ÚŠØ§Øą Ø§ØŗØĒŲØ§Ø¯Ų Ų
ÛâØ´Ų.
+
+اÛŲØ§ Ø´Ø§ÛØ¯ ŲŲ
ŲâØ´ Ø§ŲØĒØ˛Ø§ØšÛ Ø¨Ų ŲØ¸Øą Ø¨ÛØ§Ø¯. ŲÚ¯ØąØ§Ų ŲØ¨Ø§Ø´. ŲŲ
Ų Ø§ÛŲØ§ ØąŲ ØĒŲÛ ØšŲ
Ų ØĒŲÛ [ØĸŲ
ŲØ˛Ø´ - ØąØ§ŲŲŲ
Ø§Û ÚŠØ§ØąØ¨Øą](tutorial/index.md){.internal-link target=_blank} Ų
ÛâØ¨ÛŲÛ.
+
+ŲÚŠØĒŲ Ų
ŲŲ
اÛŲŲ ÚŠŲ Ø¨Ø§ Ø§ØŗØĒŲØ§Ø¯Ų Ø§Ø˛ ŲŲØšâŲØ§Û Ø§ØŗØĒØ§ŲØ¯Ø§ØąØ¯ ŲžØ§ÛØĒŲŲØ ØĒŲÛ ÛŲ ØŦا (Ø¨Ų ØŦØ§Û Ø§ØļاŲŲ ÚŠØąØ¯Ų ÚŠŲØ§ØŗâŲØ§Û Ø¨ÛØ´ØĒØąØ Ø¯ÚŠŲØąØ§ØĒŲØąŲا Ų ØēÛØąŲ)Ø **FastAPI** ÚŠŲÛ Ø§Ø˛ ÚŠØ§Øą ØąŲ Ø¨ØąØ§ØĒ Ø§ŲØŦاŲ
Ų
ÛâØ¯Ų.
+
+/// info
+
+Ø§Ú¯Ų ŲŲ
Ų ØĸŲ
ŲØ˛Ø´ ØąŲ Ú¯Ø°ØąŲŲØ¯Û Ų Ø¨ØąÚ¯Ø´ØĒÛ ÚŠŲ Ø¨ÛØ´ØĒØą Ø¯Øą Ų
بਝ ŲŲØšâŲØ§ ببÛŲÛØ ÛŲ Ų
ŲØ¨Øš ØŽŲØ¨ "ØĒŲŲØ¨âŲØ§Ų
Ų" Ø§Ø˛ `mypy` ŲØŗØĒ.
+
+///
diff --git a/docs/fr/docs/index.md b/docs/fr/docs/index.md
index 695429008..d25f7a939 100644
--- a/docs/fr/docs/index.md
+++ b/docs/fr/docs/index.md
@@ -12,7 +12,7 @@
-
+
diff --git a/docs/he/docs/index.md b/docs/he/docs/index.md
index 6498d15e1..bd166f205 100644
--- a/docs/he/docs/index.md
+++ b/docs/he/docs/index.md
@@ -12,10 +12,10 @@
-
+
-
-
+
+
diff --git a/docs/hu/docs/index.md b/docs/hu/docs/index.md
index c6f596650..45ff49c3b 100644
--- a/docs/hu/docs/index.md
+++ b/docs/hu/docs/index.md
@@ -6,7 +6,7 @@
-
+
diff --git a/docs/id/docs/index.md b/docs/id/docs/index.md
index 7fdd1cc7a..5fb0c4c9c 100644
--- a/docs/id/docs/index.md
+++ b/docs/id/docs/index.md
@@ -12,7 +12,7 @@
-
+
diff --git a/docs/it/docs/index.md b/docs/it/docs/index.md
index 8a1039bc5..dc8f5b846 100644
--- a/docs/it/docs/index.md
+++ b/docs/it/docs/index.md
@@ -4,15 +4,19 @@
FastAPI framework, alte prestazioni, facile da imparare, rapido da implementare, pronto per il rilascio in produzione
+
-
-
+
+
+
+
+
-
-
+
+
-
+
diff --git a/docs/ja/docs/deployment/concepts.md b/docs/ja/docs/deployment/concepts.md
index c6b21fd1b..a0d4fb35b 100644
--- a/docs/ja/docs/deployment/concepts.md
+++ b/docs/ja/docs/deployment/concepts.md
@@ -219,7 +219,7 @@ FastAPI ãĸããĒãąãŧãˇã§ãŗã§ã¯ãUvicorn ãŽãããĒãĩãŧããŧãã
ããããŽã¯ãŧãĢãŧãģãããģãšã¯ããĸããĒãąãŧãˇã§ãŗãåŽčĄããããŽã§ããã**ãĒã¯ã¨ãšã**ãåããĻ**ãŦãšããŗãš**ãčŋããããŽä¸ģčĻãĒč¨įŽãčĄããããĒãã夿°ãĢå
ĨããããŽã¯äŊã§ãRAMãĢããŧãããžãã
-
+
ãããĻããĄãããåãããˇãŗã§ã¯ãããĒããŽãĸããĒãąãŧãˇã§ãŗã¨ã¯åĨãĢã**äģãŽãããģãš**ãåŽčĄãããĻããã§ãããã
diff --git a/docs/ja/docs/deployment/https.md b/docs/ja/docs/deployment/https.md
index ac40b0982..7b0f567aa 100644
--- a/docs/ja/docs/deployment/https.md
+++ b/docs/ja/docs/deployment/https.md
@@ -92,7 +92,7 @@ DNSãĩãŧããŧã§ã¯ã**ååžããããĄã¤ãŗ**ãããĒããŽãĩãŧããŧ
DNSãĩãŧããŧã¯ãããŠãĻãļãĢįšåŽãŽ**IPãĸããŦãš**ãäŊŋį¨ãããããĢæį¤ēããžããããŽIPãĸããŦãšã¯ãDNSãĩãŧããŧã§č¨åŽãããããĒããŽãĩãŧããŧãäŊŋį¨ãããããĒãã¯IPãĸããŦãšãĢãĒããžãã
-
+
### TLS Handshake ãŽéå§
@@ -100,7 +100,7 @@ DNSãĩãŧããŧã¯ãããŠãĻãļãĢįšåŽãŽ**IPãĸããŦãš**ãäŊŋį¨ãã
éäŋĄãŽæåãŽé¨åã¯ãã¯ãŠã¤ãĸãŗãã¨ãĩãŧããŧéãŽæĨįļãįĸēįĢããäŊŋį¨ããæåˇéĩãĒãŠãæąēããã ãã§ãã
-
+
TLSæĨįļãįĸēįĢãããããŽã¯ãŠã¤ãĸãŗãã¨ãĩãŧããŧéãŽããŽããã¨ãã¯ã**TLSããŗããˇã§ã¤ã¯**ã¨åŧã°ããžãã
@@ -120,7 +120,7 @@ TLS Termination Proxyã¯ã1ã¤äģĨä¸ãŽ**TLSč¨ŧææ¸**īŧHTTPSč¨ŧææ¸īŧãĢ
äģåã¯ã`someapp.example.com`ãŽč¨ŧææ¸ãäŊŋããã¨ãĢãĒããžãã
-
+
ã¯ãŠã¤ãĸãŗãã¯ãããŽTLSč¨ŧææ¸ãįæããã¨ãŗããŖããŖīŧããŽå ´åã¯Let's Encryptã§ããããããĢã¤ããĻã¯åžčŋ°ããžãīŧããã§ãĢ**äŋĄé ŧ**ããĻãããããããŽč¨ŧææ¸ãæåšã§ãããã¨ã**æ¤č¨ŧ**ãããã¨ãã§ããžãã
@@ -142,19 +142,19 @@ TLS Termination Proxyã¯ã1ã¤äģĨä¸ãŽ**TLSč¨ŧææ¸**īŧHTTPSč¨ŧææ¸īŧãĢ
ããã§ãã¯ãŠã¤ãĸãŗãã¯**HTTPSãĒã¯ã¨ãšã**ãéäŋĄããžããããã¯ãæåˇåãããTLSãŗãã¯ãˇã§ãŗãäģããåãĒãHTTPãĒã¯ã¨ãšãã§ãã
-
+
### ãĒã¯ã¨ãšããŽåžŠåˇå
TLS Termination Proxy ã¯ãåæãåããĻããæåˇåãäŊŋį¨ããĻã**ãĒã¯ã¨ãšãã垊åˇå**ãã**ããŦãŧãŗ (垊åˇåããã) HTTP ãĒã¯ã¨ãšã** ããĸããĒãąãŧãˇã§ãŗãåŽčĄããĻãããããģãš (äžãã°ãFastAPI ãĸããĒãąãŧãˇã§ãŗãåŽčĄããĻãã Uvicorn ãæã¤ãããģãš) ãĢéäŋĄããžãã
-
+
### HTTP ãŦãšããŗãš
ãĸããĒãąãŧãˇã§ãŗã¯ãĒã¯ã¨ãšããåĻįãã**ããŦãŧãŗ(æåˇåãããĻããĒã)HTTPãŦãšããŗãš** ãTLS Termination ProxyãĢéäŋĄããžãã
-
+
### HTTPS ãŦãšããŗãš
@@ -162,7 +162,7 @@ TLS Termination Proxyã¯æŦĄãĢãäēåãĢåæãåããĻããæåˇ(`someap
ããŽåžããŠãĻãļã§ã¯ããŦãšããŗãšãæåšã§æŖããæåˇããŧã§æåˇåãããĻãããã¨ãĒãŠãæ¤č¨ŧããžãããããĻãããŠãĻãļã¯ãŦãšããŗãšã**垊åˇå**ããĻåĻįããžãã
-
+
ã¯ãŠã¤ãĸãŗãīŧããŠãĻãļīŧã¯ããŦãšããŗãšãæŖãããĩãŧããŧããæĨããã¨ãįĨããã¨ãã§ããžãã ãĒããĒããããŽãĩãŧããŧã¯ãäģĨåãĢ**HTTPSč¨ŧææ¸**ãäŊŋãŖãĻåæããæåˇãäŊŋãŖãĻããããã§ãã
@@ -172,7 +172,7 @@ TLS Termination Proxyã¯æŦĄãĢãäēåãĢåæãåããĻããæåˇ(`someap
įšåŽãŽIPã¨ããŧãīŧããŽäžã§ã¯TLS Termination Proxyīŧãæąããã¨ãã§ãããŽã¯1ã¤ãŽãããģãšã ãã§ãããäģãŽãĸããĒãąãŧãˇã§ãŗ/ãããģãšããåã**ãããĒãã¯IPã¨ããŧã**ãŽįĩãŋåãããäŊŋį¨ãããã¨ããĒãéãããĩãŧããŧä¸ã§åŽčĄãããã¨ãã§ããžãã
-
+
ããããã°ãTLS Termination Proxy ã¯ã**褿°ãŽããĄã¤ãŗ**ã褿°ãŽãĸããĒãąãŧãˇã§ãŗãŽHTTPSã¨č¨ŧææ¸ãåĻįãããããããŽãąãŧãšã§éŠåãĒãĸããĒãąãŧãˇã§ãŗãĢãĒã¯ã¨ãšããéäŋĄãããã¨ãã§ããžãã
@@ -182,7 +182,7 @@ TLS Termination Proxyã¯æŦĄãĢãäēåãĢåæãåããĻããæåˇ(`someap
ããŽåžãLet's Encryptã¨éäŋĄããåĨãŽããã°ãŠã īŧåĨãŽããã°ãŠã ã§ããå ´åãããã°ãåãTLS Termination Proxyã§ããå ´åãããīŧãĢããŖãĻãč¨ŧææ¸ãæ´æ°ããžãã
-
+
**TLSč¨ŧææ¸**ã¯ãIPãĸããŦãšã§ã¯ãĒãã**ããĄã¤ãŗåãĢéĸéŖäģããããĻ**ããžãã
diff --git a/docs/ja/docs/index.md b/docs/ja/docs/index.md
index 682c94e83..1ba85f8e0 100644
--- a/docs/ja/docs/index.md
+++ b/docs/ja/docs/index.md
@@ -11,14 +11,17 @@
FastAPI framework, high performance, easy to learn, fast to code, ready for production
-
-
+
+
-
-
+
+
-
+
+
+
+
diff --git a/docs/ja/docs/tutorial/body-fields.md b/docs/ja/docs/tutorial/body-fields.md
index 0466320f1..ce5630351 100644
--- a/docs/ja/docs/tutorial/body-fields.md
+++ b/docs/ja/docs/tutorial/body-fields.md
@@ -44,7 +44,7 @@
čŋŊå æ
å ąã¯`Field`ã`Query`ã`Body`ãĒãŠã§åŽŖč¨ãããã¨ãã§ããžãããããĻããã¯įæãããJSONãšããŧããĢåĢãžããžãã
-åžãĢäžãį¨ããĻåŽŖč¨ãåĻãļéãĢãčŋŊå æ
å ąãåĨæĒæšæŗãåĻãšãžãã
+åžãĢäžãį¨ããĻåŽŖč¨ãåĻãļéãĢãčŋŊå æ
å ąãčŋŊå ããæšæŗãåĻãšãžãã
## ãžã¨ã
diff --git a/docs/ja/docs/tutorial/body.md b/docs/ja/docs/tutorial/body.md
index 8376959d5..1298eec7e 100644
--- a/docs/ja/docs/tutorial/body.md
+++ b/docs/ja/docs/tutorial/body.md
@@ -22,7 +22,7 @@ GET ãĒã¯ã¨ãšãã§ãããŖãéäŋĄãããã¨ã¯ãäģæ§ã§ã¯æĒåŽįžŠ
ãžãåããĢã `pydantic` ãã `BaseModel` ãã¤ãŗããŧãããåŋ
čĻããããžã:
-{* ../../docs_src/body/tutorial001.py hl[2] *}
+{* ../../docs_src/body/tutorial001.py hl[4] *}
## ããŧãŋãĸããĢãŽäŊæ
@@ -30,7 +30,7 @@ GET ãĒã¯ã¨ãšãã§ãããŖãéäŋĄãããã¨ã¯ãäģæ§ã§ã¯æĒåŽįžŠ
ããšãĻãŽåąæ§ãĢpythonæ¨æēãŽåãäŊŋį¨ããžã:
-{* ../../docs_src/body/tutorial001.py hl[5:9] *}
+{* ../../docs_src/body/tutorial001.py hl[7:11] *}
ã¯ã¨ãĒããŠãĄãŧãŋãŽåŽŖč¨ã¨åæ§ãĢããĸããĢåąæ§ããããŠãĢãå¤ããã¤ã¨ããåŋ
é ãĒåąæ§ã§ã¯ãĒããĒããžããããäģĨå¤ã¯åŋ
é ãĢãĒããžãããĒããˇã§ããĢãĒåąæ§ãĢãããå ´å㯠`None` ãäŊŋį¨ããĻãã ããã
@@ -58,7 +58,7 @@ GET ãĒã¯ã¨ãšãã§ãããŖãéäŋĄãããã¨ã¯ãäģæ§ã§ã¯æĒåŽįžŠ
*ããšãĒããŦãŧãˇã§ãŗ* ãĢå ãããããĢãããšããŠãĄãŧãŋãã¯ã¨ãĒããŠãĄãŧãŋã¨åãæ§ãĢåŽŖč¨ããžã:
-{* ../../docs_src/body/tutorial001.py hl[16] *}
+{* ../../docs_src/body/tutorial001.py hl[18] *}
...ãããĻãäŊæãããĸããĢ `Item` ã§åãåŽŖč¨ããžãã
@@ -125,7 +125,7 @@ GET ãĒã¯ã¨ãšãã§ãããŖãéäŋĄãããã¨ã¯ãäģæ§ã§ã¯æĒåŽįžŠ
éĸæ°å
é¨ã§ããĸããĢãŽå
¨ãĻãŽåąæ§ãĢį´æĨãĸã¯ãģãšã§ããžã:
-{* ../../docs_src/body/tutorial002.py hl[19] *}
+{* ../../docs_src/body/tutorial002.py hl[21] *}
## ãĒã¯ã¨ãšããããŖ + ããšããŠãĄãŧãŋ
@@ -133,7 +133,7 @@ GET ãĒã¯ã¨ãšãã§ãããŖãéäŋĄãããã¨ã¯ãäģæ§ã§ã¯æĒåŽįžŠ
**FastAPI** ã¯ããšããŠãĄãŧãŋã§ããéĸæ°ããŠãĄãŧãŋã¯**ããšããåãåã**ãPydanticãĸããĢãĢããŖãĻåŽŖč¨ãããéĸæ°ããŠãĄãŧãŋã¯**ãĒã¯ã¨ãšããããŖããåãåã**ã¨ãããã¨ãčĒčããžãã
-{* ../../docs_src/body/tutorial003.py hl[15:16] *}
+{* ../../docs_src/body/tutorial003.py hl[17:18] *}
## ãĒã¯ã¨ãšããããŖ + ããšããŠãĄãŧãŋ + ã¯ã¨ãĒããŠãĄãŧãŋ
@@ -141,7 +141,7 @@ GET ãĒã¯ã¨ãšãã§ãããŖãéäŋĄãããã¨ã¯ãäģæ§ã§ã¯æĒåŽįžŠ
**FastAPI** ã¯ãããããčĒčããéŠåãĒå ´æããããŧãŋãååžããžãã
-{* ../../docs_src/body/tutorial004.py hl[16] *}
+{* ../../docs_src/body/tutorial004.py hl[18] *}
éĸæ°ããŠãĄãŧãŋã¯äģĨä¸ãŽæ§ãĢčĒčãããžã:
diff --git a/docs/ja/docs/tutorial/cookie-param-models.md b/docs/ja/docs/tutorial/cookie-param-models.md
new file mode 100644
index 000000000..8285f44ef
--- /dev/null
+++ b/docs/ja/docs/tutorial/cookie-param-models.md
@@ -0,0 +1,77 @@
+# ã¯ãããŧããŠãĄãŧãŋãĸããĢ
+
+ããéĸéŖãã**褿°ãŽã¯ãããŧ**ããæãã°ãĢãŧãããããĒããããããåŽŖč¨ãããããĢã**PydanticãĸããĢ**ãäŊæã§ããžããđĒ
+
+ãããããã¨ã§ã**褿°ãŽå ´æ**ã§**ããŽPydanticãĸããĢãååŠį¨**ã§ããããĒããŧãˇã§ãŗããĄãŋããŧãŋããããšãĻãŽã¯ãããŧããŠãĄãŧãŋãĢ寞ããĻä¸åēĻãĢåŽŖč¨ã§ããžããđ
+
+/// note | åč
+
+ããŽæŠčŊã¯ãFastAPIãŽããŧã¸ã§ãŗ `0.115.0` ãããĩããŧããããĻããžããđ¤
+
+///
+
+/// tip | čąįĨč
+
+ããã¨åããã¯ããã¯ã¯ `Query` ã `Cookie` ã `Header` ãĢãéŠį¨ã§ããžãã đ
+
+///
+
+## ã¯ãããŧãĢPydanticãĸããĢãäŊŋį¨ãã
+
+åŋ
čĻãĒ褿°ãŽ**ã¯ãããŧ**ããŠãĄãŧãŋã**PydanticãĸããĢ**ã§åŽŖč¨ãããããĢãããã `Cookie` ã¨ããĻåŽŖč¨ããžããã:
+
+{* ../../docs_src/cookie_param_models/tutorial001_an_py310.py hl[9:12,16] *}
+
+**FastAPI**ã¯ããĒã¯ã¨ãšããŽ**ã¯ãããŧ**ãã**ãããããŽããŖãŧãĢã**ãŽããŧãŋã**æŊåē**ããåŽįžŠããã**PydanticãĸããĢ**ãæäžããžãã
+
+## ãããĨãĄãŗããŽįĸēčĒ
+
+å¯žčŠąįAPIãããĨãĄãŗãUI `/docs` ã§ãåŽįžŠãããĻããã¯ãããŧãįĸēčĒã§ããžã:
+
+
+
+
+
+/// info | åč
+
+
+**ããŠãĻãļãã¯ãããŧãåĻįã**ãĻããžãããįšåĨãĒæšæŗã§å
é¨įãĢåĻįãčĄãŖãĻãããããĢã**JavaScript**ããã¯į°ĄåãĢæäŊ**ã§ããĒã**ãã¨ãĢįæããĻãã ããã
+
+**å¯žčŠąįAPIãããĨãĄãŗãUI** `/docs` ãĢãĸã¯ãģãšããã°ã*ããšãĒããŦãŧãˇã§ãŗ*ãĢéĸããã¯ãããŧãŽ**ãããĨãĄãŗããŧãˇã§ãŗ**ãįĸēčĒã§ããžãã
+
+ãããããã¨ã**ã¯ãããŧããŧãŋãå
ĨåããĻ**ãExecuteããã¯ãĒãã¯ããĻããå¯žčŠąįAPIãããĨãĄãŗãUIã¯**JavaScript**ã§åäŊããĻããããã¯ãããŧã¯éäŋĄãããããžãã§å¤ãå
ĨåããĒããŖãããŽãããĒ**ã¨ãŠãŧ**ãĄããģãŧã¸ã襨į¤ēãããžãã
+
+///
+
+## äŊåãĒã¯ãããŧãįĻæĸãã
+
+įšåŽãŽīŧããžãä¸čŦįã§ã¯ãĒããããããĒãīŧãąãŧãšã§ãåãäģããã¯ãããŧã**åļé**ããåŋ
čĻããããããããžããã
+
+ããĒããŽAPIã¯įŦčĒ㎠ã¯ãããŧåæ ãįŽĄįããčŊåãæãŖãĻããžãã đ¤ĒđĒ
+
+PydanticãŽãĸããĢ㎠Configuration ãåŠį¨ããĻã `extra` ããŖãŧãĢãã `forbid` ã¨ãããã¨ãã§ããžãã
+
+{* ../../docs_src/cookie_param_models/tutorial002_an_py39.py hl[10] *}
+
+ããã¯ãŠã¤ãĸãŗãã**äŊåãĒã¯ãããŧ**ãéããã¨ããã¨ã**ã¨ãŠãŧ**ãŦãšããŗãšãčŋãããžãã
+
+ãŠããAPIãĢæåĻããããŽãĢ ããĒããŽåæãåžããã¨į˛žä¸æ¯åĒåããå¯åæŗãĒã¯ãããŧãããŧããĄ... đĒ
+
+äžãã°ãã¯ãŠã¤ãĸãŗããã¯ãããŧ `santa_tracker` ã `good-list-please` ã¨ããå¤ã§éããã¨ããã¨ã`santa_tracker` ã¨ãã ã¯ãããŧã訹å¯ãããĻããĒã ãã¨ãéįĨãã**ã¨ãŠãŧ**ãŦãšããŗãšãčŋãããžã:
+
+```json
+{
+ "detail": [
+ {
+ "type": "extra_forbidden",
+ "loc": ["cookie", "santa_tracker"],
+ "msg": "Extra inputs are not permitted",
+ "input": "good-list-please",
+ }
+ ]
+}
+```
+
+## ãžã¨ã
+
+**FastAPI**ã§ã¯ã**ã¯ãããŧ** ãåŽŖč¨ãããããĢã**PydanticãĸããĢ**ãäŊŋį¨ã§ããžããđ
diff --git a/docs/ja/docs/tutorial/encoder.md b/docs/ja/docs/tutorial/encoder.md
index 409ebeec6..309cf8857 100644
--- a/docs/ja/docs/tutorial/encoder.md
+++ b/docs/ja/docs/tutorial/encoder.md
@@ -8,7 +8,7 @@
## `jsonable_encoder`ãŽäŊŋį¨
-JSONäēæãŽããŧãŋãŽãŋãåäŋĄããããŧãŋããŧãš`fase_db`ãããã¨ããžãããã
+JSONäēæãŽããŧãŋãŽãŋãåäŋĄããããŧãŋããŧãš`fake_db`ãããã¨ããžãããã
äžãã°ã`datetime`ãĒãã¸ã§ã¯ãã¯JSONã¨äēææ§ããĒããŽã§ãããŽããŧãŋãŧããŧãšãĢã¯åãåãããžããã
diff --git a/docs/ja/docs/tutorial/handling-errors.md b/docs/ja/docs/tutorial/handling-errors.md
index 9a46cc738..37315b087 100644
--- a/docs/ja/docs/tutorial/handling-errors.md
+++ b/docs/ja/docs/tutorial/handling-errors.md
@@ -63,7 +63,7 @@ PythonãŽäžå¤ãĒãŽã§ã`return`ã§ã¯ãĒãã`raise`ã§ãã
`HTTPException`ãįēįãããéãĢã¯ã`str`ã ãã§ãĒããJSONãĢ夿ã§ããäģģæãŽå¤ã`detail`ããŠãĄãŧãŋã¨ããĻæ¸Ąããã¨ãã§ããžãã
-`dist`ã`list`ãĒãŠãæ¸Ąããã¨ãã§ããžãã
+`dict`ã`list`ãĒãŠãæ¸Ąããã¨ãã§ããžãã
ããã㯠**FastAPI** ãĢããŖãĻčĒåįãĢåĻįãããJSONãĢ夿ãããžãã
diff --git a/docs/ja/docs/tutorial/query-param-models.md b/docs/ja/docs/tutorial/query-param-models.md
new file mode 100644
index 000000000..053d0740b
--- /dev/null
+++ b/docs/ja/docs/tutorial/query-param-models.md
@@ -0,0 +1,68 @@
+# ã¯ã¨ãĒããŠãĄãŧãŋãĸããĢ
+
+ããéĸéŖãã**褿°ãŽã¯ã¨ãĒããŠãĄãŧãŋ**ããæãã°ãĢãŧãããããĒããããããåŽŖč¨ãããããĢã**PydanticãĸããĢ**ãäŊæã§ããžãã
+
+ãããããã¨ã§ã**褿°ãŽå ´æ**ã§**ããŽPydanticãĸããĢãååŠį¨**ã§ããããĒããŧãˇã§ãŗããĄãŋããŧãŋããããšãĻãŽã¯ã¨ãĒããŠãĄãŧãŋãĢ寞ããĻä¸åēĻãĢåŽŖč¨ã§ããžããđ
+
+/// note | åč
+
+ããŽæŠčŊã¯ãFastAPIãŽããŧã¸ã§ãŗ `0.115.0` ãããĩããŧããããĻããžããđ¤
+
+///
+
+## ã¯ã¨ãĒããŠãĄãŧãŋãĢPydanticãĸããĢãäŊŋį¨ãã
+
+åŋ
čĻãĒ**褿°ãŽã¯ã¨ãĒããŠãĄãŧãŋ**ã**PydanticãĸããĢ**ã§åŽŖč¨ãããããĢãããã `Query` ã¨ããĻåŽŖč¨ããžããã:
+
+{* ../../docs_src/query_param_models/tutorial001_an_py310.py hl[9:13,17] *}
+
+**FastAPI**ã¯ããĒã¯ã¨ãšããŽ**ã¯ã¨ãĒããŠãĄãŧãŋ**ãããããããŽ**ããŖãŧãĢã**ãŽããŧãŋã**æŊåē**ããåŽįžŠããã**PydanticãĸããĢ**ãæäžããžãã
+
+## ãããĨãĄãŗããŽįĸēčĒ
+
+å¯žčŠąįAPIãããĨãĄãŗã `/docs` ã§ã¯ã¨ãĒããŠãĄãŧãŋãįĸēčĒã§ããžã:
+
+
+
+
+
+## äŊåãĒã¯ã¨ãĒããŠãĄãŧãŋãįĻæĸãã
+
+įšåŽãŽīŧããžãä¸čŦįã§ã¯ãĒããããããĒãīŧãąãŧãšã§ãåãäģããã¯ã¨ãĒããŠãĄãŧãŋã**åļé**ããåŋ
čĻããããããããžããã
+
+PydanticãŽãĸããĢ㎠Configuration ãåŠį¨ããĻã `extra` ããŖãŧãĢãã `forbid` ã¨ãããã¨ãã§ããžãã
+
+{* ../../docs_src/query_param_models/tutorial002_an_py310.py hl[10] *}
+
+ããã¯ãŠã¤ãĸãŗãã**ã¯ã¨ãĒããŠãĄãŧãŋ**ã¨ããĻ**äŊåãĒ**ããŧãŋãéããã¨ããã¨ã**ã¨ãŠãŧ**ãŦãšããŗãšãčŋãããžãã
+
+äžãã°ãã¯ãŠã¤ãĸãŗããã¯ã¨ãĒããŠãĄãŧãŋ `tool` ãĢãå¤ `plumbus` ãč¨åŽããĻéããã¨ããã¨:
+
+```http
+https://example.com/items/?limit=10&tool=plumbus
+```
+
+ã¯ã¨ãĒããŠãĄãŧãŋ `tool` ã訹å¯ãããĻããĒããã¨ãéįĨãã**ã¨ãŠãŧ**ãŦãšããŗãšãčŋãããžãã
+
+```json
+{
+ "detail": [
+ {
+ "type": "extra_forbidden",
+ "loc": ["query", "tool"],
+ "msg": "Extra inputs are not permitted",
+ "input": "plumbus"
+ }
+ ]
+}
+```
+
+## ãžã¨ã
+
+**FastAPI**ã§ã¯ã**ã¯ã¨ãĒããŠãĄãŧãŋ**ãåŽŖč¨ãããããĢã**PydanticãĸããĢ**ãäŊŋį¨ã§ããžããđ
+
+/// tip | čąįĨč
+
+ããŋããŦæŗ¨æ: PydanticãĸããĢã¯ã¯ãããŧãããããŧãŽåŽŖč¨ãĢãäŊŋį¨ã§ããžãããããŽå
厚ãĢã¤ããĻã¯åžãŽããĨãŧããĒãĸãĢã§åĻãŗãžããđ¤Ģ
+
+///
diff --git a/docs/ja/docs/virtual-environments.md b/docs/ja/docs/virtual-environments.md
new file mode 100644
index 000000000..791cf64a8
--- /dev/null
+++ b/docs/ja/docs/virtual-environments.md
@@ -0,0 +1,831 @@
+# äģŽæŗį°åĸ
+
+Pythonããã¸ã§ã¯ããŽäŊæĨã§ã¯ã**äģŽæŗį°åĸ**īŧãžãã¯éĄäŧŧãŽäģįĩãŋīŧãäŊŋį¨ããããã¸ã§ã¯ããã¨ãĢã¤ãŗãšããŧãĢãããããąãŧã¸ãåéĸãããšãã§ãããã
+
+/// info | æ
å ą
+
+ãããäģŽæŗį°åĸãŽæĻčĻãäŊææšæŗãäŊŋ፿šæŗãĢã¤ããĻæĸãĢãåįĨãĒããããŽãģã¯ãˇã§ãŗããšããããããã¨ãã§ããžããđ¤
+
+///
+
+/// tip | čąįĨč
+
+**äģŽæŗį°åĸ**ã¯ã**į°åĸ夿°**ã¨ã¯į°ãĒããžãã
+
+**į°åĸ夿°**ã¯ãããã°ãŠã ãäŊŋį¨ã§ãããˇãšãã å
ãŽå¤æ°ã§ãã
+
+**äģŽæŗį°åĸ**ã¯ãããĄã¤ãĢããžã¨ããããŖãŦã¯ããĒãŽãã¨ã§ãã
+
+///
+
+/// info | æ
å ą
+ããŽããŧã¸ã§ã¯ã**äģŽæŗį°åĸ**ãŽäŊŋ፿šæŗã¨ãããŽã¯ããããĢã¤ããĻčĒŦæããžãã
+
+ãã**ããšãĻãįŽĄįããããŧãĢ**īŧPythonãŽã¤ãŗãšããŧãĢãåĢãīŧãå°å
Ĩããæēåãã§ããĻãããĒããuv ããčŠĻããã ããã
+
+///
+
+## ããã¸ã§ã¯ããŽäŊæ
+
+ãžããããã¸ã§ã¯ãį¨ãŽããŖãŦã¯ããĒãäŊæããžãã
+
+į§ã¯é常 home/user ããŖãŦã¯ããĒãŽä¸ãĢ `code` ã¨ããããŖãŦã¯ããĒã፿ããĻããĻãããã¸ã§ã¯ããã¨ãĢ1ã¤ãŽããŖãŦã¯ããĒãããŽä¸ãĢäŊæããĻããžãã
+
+
+
+```console
+// Go to the home directory
+$ cd
+// Create a directory for all your code projects
+$ mkdir code
+// Enter into that code directory
+$ cd code
+// Create a directory for this project
+$ mkdir awesome-project
+// Enter into that project directory
+$ cd awesome-project
+```
+
+
+
+## äģŽæŗį°åĸãŽäŊæ
+
+Pythonããã¸ã§ã¯ãã§ãŽ**åããĻãŽ**äŊæĨãéå§ããéãĢã¯ã**ããã¸ã§ã¯ãå
**ãĢäģŽæŗį°åĸãäŊæããĻãã ããã
+
+/// tip | čąįĨč
+
+ãããčĄããŽã¯ã**ããã¸ã§ã¯ããã¨ãĢ1åã ã**ã§ããäŊæĨãŽããŗãĢčĄãåŋ
čĻã¯ãããžããã
+
+///
+
+//// tab | `venv`
+
+äģŽæŗį°åĸãäŊæãããĢã¯ãPythonãĢäģåąããĻãã `venv` ãĸã¸ãĨãŧãĢãäŊŋį¨ã§ããžãã
+
+
+
+```console
+$ python -m venv .venv
+```
+
+
+
+/// details | ããŽãŗããŗããŽæåŗ
+
+- `python` : `python` ã¨ããããã°ãŠã ãåŧãŗåēããžã
+- `-m` : ãĸã¸ãĨãŧãĢããšã¯ãĒããã¨ããĻåŧãŗåēããžãããŠãŽãĸã¸ãĨãŧãĢãåŧãŗåēããŽããããŽæŦĄãĢæåŽããžã
+- `venv` : é常PythonãĢäģéããĻã¤ãŗãšããŧãĢããã `venv`ãĸã¸ãĨãŧãĢãäŊŋį¨ããžã
+- `.venv` : äģŽæŗį°åĸã`.venv`ã¨ããæ°ããããŖãŦã¯ããĒãĢäŊæããžã
+
+///
+
+////
+
+//// tab | `uv`
+
+ãã `uv` ãã¤ãŗãšããŧãĢæ¸ãŋãĒããäģŽæŗį°åĸãäŊæãããããĢ `uv` ãäŊŋããã¨ãã§ããžãã
+
+
+
+```console
+$ uv venv
+```
+
+
+
+/// tip | čąįĨč
+
+ãããŠãĢãã§ã¯ã `uv` 㯠`.venv` ã¨ããããŖãŦã¯ããĒãĢäģŽæŗį°åĸãäŊæããžãã
+
+ãã ããčŋŊå ãŽåŧæ°ãĢããŖãŦã¯ããĒåãä¸ããĻãĢãšãŋãã¤ãēãããã¨ãã§ããžãã
+
+///
+
+////
+
+ããŽãŗããŗã㯠`.venv` ã¨ããããŖãŦã¯ããĒãĢæ°ããäģŽæŗį°åĸãäŊæããžãã
+
+/// details | `.venv` ãžãã¯ããŽäģãŽåå
+
+äģŽæŗį°åĸãåĨãŽããŖãŦã¯ããĒãĢäŊæãããã¨ãå¯čŊã§ããã `.venv` ã¨åäģãããŽãä¸čŦįãĒæ
Ŗįŋã§ãã
+
+///
+
+## äģŽæŗį°åĸãŽæåšå
+
+åŽčĄãããPythonãŗããŗããã¤ãŗãšããŧãĢããããããąãŧã¸ãæ°ããäŊæããäģŽæŗį°åĸãäŊŋį¨ãããããããŽäģŽæŗį°åĸãæåšåããžãããã
+
+/// tip | čąįĨč
+
+ããŽããã¸ã§ã¯ããŽäŊæĨã§**æ°ãããŋãŧãããĢãģããˇã§ãŗ**ãéå§ããéãĢã¯ã**æ¯å**æåšåãåŋ
čĻã§ãã
+
+///
+
+//// tab | Linux, macOS
+
+
+
+```console
+$ source .venv/bin/activate
+```
+
+
+
+////
+
+//// tab | Windows PowerShell
+
+
+
+```console
+$ .venv\Scripts\Activate.ps1
+```
+
+
+
+////
+
+//// tab | Windows Bash
+
+ããWindowsã§BashãäŊŋį¨ããĻããå ´å (Git Bash ãĒãŠ):
+
+
+
+```console
+$ source .venv/Scripts/activate
+```
+
+
+
+////
+
+/// tip | čąįĨč
+
+**æ°ãããããąãŧã¸**ãäģŽæŗį°åĸãĢã¤ãŗãšããŧãĢããã¨ããĢã¯ãååēĻ**æåšå**ããĻãã ããã
+
+ãããããã¨ã§ãããŽãããąãŧã¸ãã¤ãŗãšããŧãĢãã**ãŋãŧãããĢīŧCLI īŧããã°ãŠã **ãäŊŋį¨ããå ´åãĢãäģŽæŗį°åĸå
ãŽããŽãįĸēåŽãĢäŊŋãããã°ããŧããĢį°åĸãĢã¤ãŗãšããŧãĢãããĻããåĨãŽããŽīŧããããåŋ
čĻãĒããŽã¨ã¯į°ãĒãããŧã¸ã§ãŗīŧãčǤãŖãĻäŊŋį¨ãããã¨ãé˛ããžãã
+
+///
+
+## äģŽæŗį°åĸãæåšã§ãããã¨ãįĸēčĒãã
+
+äģŽæŗį°åĸãæåšã§ããīŧåãŽãŗããŗããæŖå¸¸ãĢæŠčŊããīŧãã¨ãįĸēčĒããžãã
+
+/// tip | čąįĨč
+
+ããã¯**äģģæ**ã§ãããããšãĻãæåž
éããĢæŠčŊããæåŗããäģŽæŗį°åĸãäŊŋį¨ããĻãããã¨ã**įĸēčĒãã**č¯ãæšæŗã§ãã
+
+///
+
+//// tab | Linux, macOS, Windows Bash
+
+
+
+```console
+$ which python
+
+/home/user/code/awesome-project/.venv/bin/python
+```
+
+
+
+`.venv/bin/python` ãĢãã `python` ãã¤ããĒããããã¸ã§ã¯ãīŧããŽå ´å㯠`awesome-project` īŧå
ãĢ襨į¤ēãããĻããã°ãæŖå¸¸ãĢåäŊããĻããžã đã
+
+////
+
+//// tab | Windows PowerShell
+
+
+
+``` console
+$ Get-Command python
+
+C:\Users\user\code\awesome-project\.venv\Scripts\python
+```
+
+
+
+`.venv\Scripts\python` ãĢãã `python` ãã¤ããĒããããã¸ã§ã¯ãīŧããŽå ´å㯠`awesome-project` īŧå
ãĢ襨į¤ēãããĻããã°ãæŖå¸¸ãĢåäŊããĻããžã đã
+
+////
+
+## `pip` ããĸããã°ãŦãŧããã
+
+/// tip | čąįĨč
+
+ãã `uv` ãäŊŋį¨ããĻããå ´åã¯ã `pip` ãŽäģŖãããĢ `uv` ãäŊŋãŖãĻã¤ãŗãšããŧãĢãčĄãããã `pip` ããĸããã°ãŦãŧãããåŋ
čĻã¯ãããžãã đã
+
+///
+
+ãããããąãŧã¸ãŽã¤ãŗãšããŧãĢãĢ `pip`īŧPythonãĢæ¨æēã§äģåąããĻããžãīŧãäŊŋį¨ããĻãããĒãã `pip` ãææ°ããŧã¸ã§ãŗãĢ**ãĸããã°ãŦãŧã**ããžãããã
+
+ãããąãŧã¸ãŽã¤ãŗãšããŧãĢä¸ãĢįēįããæŗåŽå¤ãŽã¨ãŠãŧãŽå¤ãã¯ãæåãĢ `pip` ããĸããã°ãŦãŧãããĻããã ãã§č§Ŗæąēãããžãã
+
+/// tip | čąįĨč
+
+é常ãããã¯äģŽæŗį°åĸãäŊæããį´åžãĢ**ä¸åēĻã ã**åŽčĄããžãã
+
+///
+
+äģŽæŗį°åĸãæåšã§ãããã¨ãīŧä¸ã§čĒŦæãããŗããŗãã§īŧįĸēčĒãããĸããã°ãŦãŧããåŽčĄããžãããīŧ
+
+
+
+```console
+$ python -m pip install --upgrade pip
+
+---> 100%
+```
+
+
+
+## `.gitignore` ãčŋŊå ãã
+
+**Git**ãäŊŋį¨ããĻããå ´åīŧäŊŋį¨ãããšãã§ãããīŧã `.gitignore` ããĄã¤ãĢãčŋŊå ããĻã `.venv` å
ãŽããããããĄã¤ãĢãGitãŽįŽĄįå¯žčąĄããé¤å¤ããžãã
+
+/// tip | čąįĨč
+
+ãã `uv` ãäŊŋį¨ããĻäģŽæŗį°åĸãäŊæããå ´åããã§ãĢããŽäŊæĨã¯æ¸ãã§ãããŽã§ãããŽæé ããšãããã§ããžã đã
+
+///
+
+/// tip | čąįĨč
+
+ããããäģŽæŗį°åĸãäŊæããį´åžãĢ**ä¸åēĻã ã**åŽčĄããžãã
+
+///
+
+
+
+```console
+$ echo "*" > .venv/.gitignore
+```
+
+
+
+/// details | ããŽãŗããŗããŽæåŗ
+
+- `echo "*"` : ãŋãŧãããĢãĢ `*` ã¨ãããããšããã襨į¤ēããããã¨ããžããīŧæŦĄãŽé¨åãĢããŖãĻããŽåäŊãå°ãå¤ãããžãīŧ
+- `>` : `>` ãŽåˇĻå´ãŽãŗããŗãããŋãŧãããĢãĢ襨į¤ēãããã¨ããå
厚ãããŋãŧãããĢãĢã¯čĄ¨į¤ēããã `>` ãŽåŗå´ãŽããĄã¤ãĢãĢæ¸ãčžŧãŋãžãã
+- `.gitignore` : `*` ãæ¸ãčžŧãããĄã¤ãĢåã
+
+ããã§ãGitãĢããã `*` ã¯ãããšãĻããæåŗãããŽã§ãããŽãŗããŗããĢããŖãĻ `.venv` ããŖãŦã¯ããĒå
ãŽããšãĻãGitãĢįĄčĻããããããĢãĒããžãã
+
+ããŽãŗããŗãã¯äģĨä¸ãŽãããšããæã¤ `.gitignore` ããĄã¤ãĢãäŊæããžãīŧ
+
+```gitignore
+*
+```
+
+///
+
+## ãããąãŧã¸ãŽã¤ãŗãšããŧãĢ
+
+äģŽæŗį°åĸãæåšåããåžãããŽä¸ã§ãããąãŧã¸ãã¤ãŗãšããŧãĢã§ããžãã
+
+/// tip | čąįĨč
+
+ããã¸ã§ã¯ããĢåŋ
čĻãĒãããąãŧã¸ãã¤ãŗãšããŧãĢãžãã¯ãĸããã°ãŦãŧãããå ´åãããã**ä¸åēĻ**åŽčĄããžãã
+
+ããæ°ãããããąãŧã¸ãčŋŊå ããããããŧã¸ã§ãŗããĸããã°ãŦãŧãããåŋ
čĻãããå ´åã¯ããã**ä¸åēĻããŽæé ãįš°ãčŋã**ãžãã
+
+///
+
+### ãããąãŧã¸ãį´æĨã¤ãŗãšããŧãĢãã
+
+æĨãã§ããĻãããã¸ã§ã¯ããŽãããąãŧã¸čĻäģļãåŽŖč¨ããããĄã¤ãĢãäŊŋããããĒãå ´åããããąãŧã¸ãį´æĨã¤ãŗãšããŧãĢã§ããžãã
+
+/// tip | čąįĨč
+
+ããã°ãŠã ãåŋ
čĻã¨ãããããąãŧã¸ã¨ããŧã¸ã§ãŗãããĄã¤ãĢīŧäžãã° `requirements.txt` ã `pyproject.toml` īŧãĢč¨čŧããĻãããŽã¯ãīŧã¨ãĻãīŧč¯ãčãã§ãã
+
+///
+
+//// tab | `pip`
+
+
+
+```console
+$ pip install "fastapi[standard]"
+
+---> 100%
+```
+
+
+
+////
+
+//// tab | `uv`
+
+ãã `uv` ãäŊŋį¨ã§ãããĒã:
+
+
+
+```console
+$ uv pip install "fastapi[standard]"
+---> 100%
+```
+
+
+
+////
+
+### `requirements.txt` ããã¤ãŗãšããŧãĢãã
+
+ãã `requirements.txt` ããããĒãããããąãŧã¸ãŽã¤ãŗãšããŧãĢãĢäŊŋį¨ã§ããžãã
+
+//// tab | `pip`
+
+
+
+```console
+$ pip install -r requirements.txt
+---> 100%
+```
+
+
+
+////
+
+//// tab | `uv`
+
+ãã `uv` ãäŊŋį¨ã§ãããĒã:
+
+
+
+```console
+$ uv pip install -r requirements.txt
+---> 100%
+```
+
+
+
+////
+
+/// details | `requirements.txt`
+
+ãããąãŧã¸ãč¨čŧããã `requirements.txt` ã¯äģĨä¸ãŽãããĢãĒãŖãĻããžã:
+
+```requirements.txt
+fastapi[standard]==0.113.0
+pydantic==2.8.0
+```
+
+///
+
+## ããã°ãŠã ãåŽčĄãã
+
+äģŽæŗį°åĸãæåšåããåžãããã°ãŠã ãåŽčĄã§ããžããããŽéãäģŽæŗį°åĸå
ãŽPythonã¨ããããĢã¤ãŗãšããŧãĢãããããąãŧã¸ãäŊŋį¨ãããžãã
+
+
+
+```console
+$ python main.py
+
+Hello World
+```
+
+
+
+## ã¨ããŖãŋãŽč¨åŽ
+
+ããã¸ã§ã¯ãã§ã¯ããããã¨ããŖãŋãäŊŋį¨ããã§ãããããŗãŧãčŖåŽãã¤ãŗãŠã¤ãŗã¨ãŠãŧãŽčĄ¨į¤ēãã§ãããããĢãäŊæããäģŽæŗį°åĸãã¨ããŖãŋã§ãäŊŋããããč¨åŽããĻãã ãããīŧå¤ããŽå ´åãčĒ忤åēãããžãīŧ
+
+č¨åŽäž:
+
+* VS Code
+* PyCharm
+
+/// tip | čąįĨč
+
+ããŽč¨åŽã¯é常ãäģŽæŗį°åĸãäŊæããéãĢ**ä¸åēĻã ã**čĄããžãã
+
+///
+
+## äģŽæŗį°åĸãŽįĄåšå
+
+ããã¸ã§ã¯ããŽäŊæĨãįĩäēããããããŽäģŽæŗį°åĸã**įĄåšå**ã§ããžãã
+
+
+
+```console
+$ deactivate
+```
+
+
+
+ãããĢããã `python` ãŗããŗããåŽčĄããĻããããŽããã¸ã§ã¯ãį¨īŧãŽãããąãŧã¸ãã¤ãŗãšããŧãĢãããīŧäģŽæŗį°åĸãã `python` ããã°ãŠã ãåŧãŗåēããã¨ã¯ããĒããĒããžãã
+
+## äŊæĨæēååŽäē
+
+ãããžã§ã§ãããã¸ã§ã¯ããŽäŊæĨãå§ããæēåãæ´ããžããã
+
+/// tip | čąįĨč
+
+ä¸č¨ãŽå
厚ãįč§Ŗãããã§ããīŧ
+
+ãããããĒããäģĨä¸ãčĒãŋé˛ããĻãã ãããđđ¤
+
+///
+
+## ãĒãäģŽæŗį°åĸīŧ
+
+FastAPIãäŊŋãŖãäŊæĨããããĢã¯ã [Python](https://www.python.org/) ãŽã¤ãŗãšããŧãĢãåŋ
čĻã§ãã
+
+ãããããFastAPIããäŊŋį¨ãããããŽäģãŽ**ãããąãŧã¸**ã**ã¤ãŗãšããŧãĢ**ããåŋ
čĻããããžãã
+
+ãããąãŧã¸ãã¤ãŗãšããŧãĢãããĢã¯ãé常ãPython ãĢäģåąãã `pip` ãŗããŗã (ãžãã¯åæ§ãŽäģŖæŋãŗããŗã) ãäŊŋį¨ããžãã
+
+ãã ãã`pip` ãį´æĨäŊŋį¨ããã¨ããããąãŧã¸ã¯**ã°ããŧããĢãĒPythonį°åĸ**īŧOSå
¨äŊãĢã¤ãŗãšããŧãĢãããPythonį°åĸīŧãĢã¤ãŗãšããŧãĢãããžãã
+
+### åéĄįš
+
+ã§ã¯ãã°ããŧããĢPythonį°åĸãĢãããąãŧã¸ãã¤ãŗãšããŧãĢãããã¨ãŽåéĄįšã¯äŊã§ããããīŧ
+
+ããæįšã§ãããĒãã¯**į°ãĒããããąãŧã¸**ãĢäžåããå¤ããŽããã°ãŠã ãæ¸ããã¨ãĢãĒãã§ãããããããĻãããããŽä¸ãĢã¯åããããąãŧã¸ãŽ**į°ãĒãããŧã¸ã§ãŗ**ãĢäžåããããŽãåēãĻããã§ããããđą
+
+äžãã°ã `philosophers-stone` īŧčŗĸč
ãŽįŗīŧã¨ããããã¸ã§ã¯ããäŊæããã¨ããžããããŽããã°ãŠã 㯠**`harry` īŧããĒãŧīŧã¨ãããããąãŧã¸ãŽããŧã¸ã§ãŗ `1`**ãĢäžåããĻããžããããŽããã `harry` īŧããĒãŧīŧãã¤ãŗãšããŧãĢããåŋ
čĻããããžãã
+
+```mermaid
+flowchart LR
+ stone(philosophers-stone) -->|requires| harry-1[harry v1]
+```
+
+ããããã `prisoner-of-azkaban` īŧãĸãēãĢããŗãŽåäēēīŧã¨ããåĨãŽããã¸ã§ã¯ããäŊæããã¨ããžããããŽããã¸ã§ã¯ãã `harry` īŧããĒãŧīŧãĢäžåããĻããžããã**`harry` īŧããĒãŧīŧãŽããŧã¸ã§ãŗ `3`**ãåŋ
čĻã§ãã
+
+```mermaid
+flowchart LR
+ azkaban(prisoner-of-azkaban) --> |requires| harry-3[harry v3]
+```
+
+ããããããã§åéĄãĢãĒããŽã¯ãããããŧãĢãĢãŽ**äģŽæŗį°åĸ**ã§ã¯ãĒãã°ããŧããĢīŧį°åĸīŧãĢãããąãŧã¸ãã¤ãŗãšããŧãĢãããĒãã `harry` īŧããĒãŧīŧãŽãŠãŽããŧã¸ã§ãŗãã¤ãŗãšããŧãĢãããé¸ã°ãĒãã¨ãããĒããã¨ã§ãã
+
+äžãã°ã `philosophers-stone` īŧčŗĸč
ãŽįŗīŧãåŽčĄãããĢã¯ããžã `harry` īŧããĒãŧīŧãŽããŧã¸ã§ãŗ `1` ãã¤ãŗãšããŧãĢããåŋ
čĻããããžãīŧ
+
+
+
+```console
+$ pip install "harry==1"
+```
+
+
+
+ãããĢããã`harry` īŧããĒãŧīŧããŧã¸ã§ãŗ1ãã°ããŧããĢãĒPythonį°åĸãĢã¤ãŗãšããŧãĢãããžãã
+
+```mermaid
+flowchart LR
+ subgraph global[global env]
+ harry-1[harry v1]
+ end
+ subgraph stone-project[philosophers-stone project]
+ stone(philosophers-stone) -->|requires| harry-1
+ end
+```
+
+ãããã `prisoner-of-azkaban` īŧãĸãēãĢããŗãŽåäēēīŧãåŽčĄãããå ´åã¯ã`harry` īŧããĒãŧīŧãŽããŧã¸ã§ãŗ `1` ããĸãŗã¤ãŗãšããŧãĢãã`harry` īŧããĒãŧīŧãŽããŧã¸ã§ãŗ `3` ãã¤ãŗãšããŧãĢãį´ãåŋ
čĻããããžããīŧãããã¯ãåãĢ`harry` īŧããĒãŧīŧãŽããŧã¸ã§ãŗ `3` ãã¤ãŗãšããŧãĢãããã¨ã§ãčĒåįãĢããŧã¸ã§ãŗ `1` ããĸãŗã¤ãŗãšããŧãĢãããžãīŧ
+
+
+
+```console
+$ pip install "harry==3"
+```
+
+
+
+ããŽãããĢããĻãã°ããŧããĢį°åĸã¸ãŽ `harry` īŧããĒãŧīŧãŽããŧã¸ã§ãŗ `3` ãŽã¤ãŗãšããŧãĢãåŽäēããžãã
+
+ããããã `philosophers-stone` īŧčŗĸč
ãŽįŗīŧãåãŗåŽčĄãããã¨ããã¨ãããŽããã°ãŠã 㯠`harry` īŧããĒãŧīŧãŽããŧã¸ã§ãŗ `1` ãåŋ
čĻãĒããã**åäŊããĒããĒã**å¯čŊæ§ããããžãã
+
+```mermaid
+flowchart LR
+ subgraph global[global env]
+ harry-1[harry v1 ]
+ style harry-1 fill:#ccc,stroke-dasharray: 5 5
+ harry-3[harry v3]
+ end
+ subgraph stone-project[philosophers-stone project]
+ stone(philosophers-stone) -.-x|âī¸| harry-1
+ end
+ subgraph azkaban-project[prisoner-of-azkaban project]
+ azkaban(prisoner-of-azkaban) --> |requires| harry-3
+ end
+```
+
+/// tip | čąįĨč
+
+PythonãŽãããąãŧã¸ã§ã¯ã**æ°ããããŧã¸ã§ãŗ**ã§**äēææ§ãæãĒã夿´ãéŋãã**ããåĒãããŽãä¸čŦįã§ãããããã§ãæŗ¨æãåŋ
čĻã§ããããšãĻãæŖå¸¸ãĢåäŊãããã¨ãããšãã§įĸēčĒããĻãããæåŗįãĢæåŽããĻæ°ããããŧã¸ã§ãŗãã¤ãŗãšããŧãĢãããŽãč¯ãã§ãããã
+
+///
+
+ããĒããŽããšãĻãŽ**ããã¸ã§ã¯ããäžåããĻãã**ã**夿°ãŽ**äģãŽ**ãããąãŧã¸**ãä¸č¨ãŽåéĄãæąããĻããã¨æŗåããĻãã ãããããã¯įŽĄįãé常ãĢå°éŖã§ãããããĻã**äēææ§ãŽãĒãããŧã¸ã§ãŗ**ãŽãããąãŧã¸ãäŊŋãŖãĻããã¸ã§ã¯ããåŽčĄãããĒãåäŊããĒããŽãåãããĒããĒãã§ãããã
+
+ãžããäŊŋį¨ããĻããOSīŧLinuxãWindowsãmacOS ãĒãŠīŧãĢããŖãĻã¯ãPythonããã§ãĢã¤ãŗãšããŧãĢãããĻãããã¨ããããžããããŽå ´åãįšåŽãŽããŧã¸ã§ãŗãŽãããąãŧã¸ã**OSãŽåäŊãĢåŋ
čĻã§ãã**ãã¨ããããžããã°ããŧããĢį°åĸãĢãããąãŧã¸ãã¤ãŗãšããŧãĢããã¨ãOSãĢäģåąããããã°ãŠã ã**åŖããĻããžã**å¯čŊæ§ããããžãã
+
+## ãããąãŧã¸ãŽã¤ãŗãšããŧãĢå
+
+Pythonãã¤ãŗãšããŧãĢããã¨ããããĄã¤ãĢãåĢãã ããã¤ããŽããŖãŦã¯ããĒãäŊæãããžãã
+
+ããããŽä¸ãĢã¯ãã¤ãŗãšããŧãĢããããããąãŧã¸ãäŋåãããããŽããŽããããžãã
+
+äģĨä¸ãŽãŗããŗããåŽčĄããã¨ãīŧ
+
+
+
+```console
+// Don't run this now, it's just an example đ¤
+$ pip install "fastapi[standard]"
+---> 100%
+```
+
+
+
+FastAPIãŽãŗãŧããåĢãå§į¸ŽããĄã¤ãĢããé常㯠[PyPI](https://pypi.org/project/fastapi/) ããããĻãŗããŧããããžãã
+
+ãžããFastAPIãäžåããäģãŽãããąãŧã¸ã**ããĻãŗããŧã**ãããžãã
+
+ãããããããããŽããĄã¤ãĢã¯**č§Ŗå**ããããŗãŗããĨãŧãŋãŽããããŖãŦã¯ããĒãĢé
įŊŽãããžãã
+
+ãããŠãĢãã§ã¯ãããããŽããĄã¤ãĢã¯PythonãŽã¤ãŗãšããŧãĢæãĢäŊæãããããŖãŦã¯ããĒãã¤ãžã**ã°ããŧããĢį°åĸ**ãĢé
įŊŽãããžãã
+
+## äģŽæŗį°åĸã¨ã¯
+
+ããšãĻãŽãããąãŧã¸ãã°ããŧããĢį°åĸãĢé
įŊŽãããã¨ãĢããŖãĻįããåéĄãŽč§Ŗæąēįã¯ãäŊæĨãã**ããã¸ã§ã¯ããã¨ãŽäģŽæŗį°åĸ**ãäŊŋį¨ãããã¨ã§ãã
+
+äģŽæŗį°åĸã¯**ããŖãŦã¯ããĒ**ã§ãããã°ããŧããĢį°åĸã¨é常ãĢäŧŧãĻããĻãä¸ã¤ãŽããã¸ã§ã¯ãã§äŊŋãįšåŽãŽãããąãŧã¸įž¤ãã¤ãŗãšããŧãĢã§ããå ´æã§ãã
+
+ããŽãããĢããĻããããããŽããã¸ã§ã¯ããįŦčĒãŽäģŽæŗį°åĸīŧ`.venv` ããŖãŦã¯ããĒīŧãĢįŦčĒãŽãããąãŧã¸įž¤ãæã¤ãã¨ãã§ããžãã
+
+```mermaid
+flowchart TB
+ subgraph stone-project[philosophers-stone project]
+ stone(philosophers-stone) --->|requires| harry-1
+ subgraph venv1[.venv]
+ harry-1[harry v1]
+ end
+ end
+ subgraph azkaban-project[prisoner-of-azkaban project]
+ azkaban(prisoner-of-azkaban) --->|requires| harry-3
+ subgraph venv2[.venv]
+ harry-3[harry v3]
+ end
+ end
+ stone-project ~~~ azkaban-project
+```
+
+## äģŽæŗį°åĸãŽæåšåã¨ã¯
+
+äģŽæŗį°åĸãæåšãĢããã¨ããäžãã°æŦĄãŽãŗããŗããåŽčĄããå ´åãčããžãīŧ
+
+//// tab | Linux, macOS
+
+
+
+```console
+$ source .venv/bin/activate
+```
+
+
+
+////
+
+//// tab | Windows PowerShell
+
+
+
+```console
+$ .venv\Scripts\Activate.ps1
+```
+
+
+
+////
+
+//// tab | Windows Bash
+
+ãããã¯ãWindowsã§BashãäŊŋį¨ããĻããå ´å (Git Bash ãĒãŠ):
+
+
+
+```console
+$ source .venv/Scripts/activate
+```
+
+
+
+////
+
+ãããĢããŖãĻãããã¤ã㎠[į°åĸ夿°](environment-variables.md){.internal-link target=_blank} ãäŊæãģäŋŽæŖãããæŦĄãĢåŽčĄããããŗããŗãã§äŊŋį¨ã§ãããããĢãĒããžãã
+
+ããããŽį°åĸ夿°ãŽã˛ã¨ã¤ãĢã `PATH` 夿°ããããžãã
+
+/// tip | čąįĨč
+
+`PATH` 夿°ãĢã¤ããĻãŽčŠŗį´°ã¯ [į°åĸ夿°](environment-variables.md#pathį°åĸ夿°){.internal-link target=_blank} ãåį
§ããĻãã ããã
+
+///
+
+äģŽæŗį°åĸãæåšãĢããã¨ãããŽäģŽæŗį°åĸãŽããš `.venv/bin` īŧLinuxã¨macOSīŧãããã㯠`.venv\Scripts` īŧWindowsīŧã `PATH` 夿°ãĢčŋŊå ãããžãã
+
+ããŽį°åĸãæåšãĢããå㎠`PATH` 夿°ãæŦĄãŽãããĢãĒãŖãĻããã¨ããžãã
+
+//// tab | Linux, macOS
+
+```plaintext
+/usr/bin:/bin:/usr/sbin:/sbin
+```
+
+ããã¯ãOSãäģĨä¸ãŽããŖãŦã¯ããĒä¸ã§ããã°ãŠã ãæĸããã¨ãæåŗããžãīŧ
+
+* `/usr/bin`
+* `/bin`
+* `/usr/sbin`
+* `/sbin`
+
+////
+
+//// tab | Windows
+
+```plaintext
+C:\Windows\System32
+```
+
+ããã¯ãOSãäģĨä¸ãŽããŖãŦã¯ããĒä¸ã§ããã°ãŠã ãæĸããã¨ãæåŗããžãīŧ
+
+* `C:\Windows\System32`
+
+////
+
+äģŽæŗį°åĸãæåšãĢããã¨ã `PATH` 夿°ã¯æŦĄãŽãããĢãĒããžãã
+
+//// tab | Linux, macOS
+
+```plaintext
+/home/user/code/awesome-project/.venv/bin:/usr/bin:/bin:/usr/sbin:/sbin
+```
+
+ããã¯ãOSãäģãŽããŖãŦã¯ããĒãæĸãããåãĢãæåãĢäģĨä¸ãŽããŖãŦã¯ããĒä¸ã§ããã°ãŠã ãæĸãå§ãããã¨ãæåŗããžãīŧ
+
+```plaintext
+/home/user/code/awesome-project/.venv/bin
+```
+
+ããŽããããŋãŧãããĢã§ `python` ã¨å
ĨåããéãĢãOSã¯Pythonããã°ãŠã ãäģĨä¸ãŽããšã§įēčĻããäŊŋį¨ããžãã
+
+```plaintext
+/home/user/code/awesome-project/.venv/bin/python
+```
+
+////
+
+//// tab | Windows
+
+```plaintext
+C:\Users\user\code\awesome-project\.venv\Scripts;C:\Windows\System32
+```
+
+ããã¯ãOSãäģãŽããŖãŦã¯ããĒãæĸãããåãĢãæåãĢäģĨä¸ãŽããŖãŦã¯ããĒä¸ã§ããã°ãŠã ãæĸãå§ãããã¨ãæåŗããžãīŧ
+
+```plaintext
+C:\Users\user\code\awesome-project\.venv\Scripts
+```
+
+ããŽããããŋãŧãããĢã§ `python` ã¨å
ĨåããéãĢãOSã¯Pythonããã°ãŠã ãäģĨä¸ãŽããšã§įēčĻããäŊŋį¨ããžãã
+
+```plaintext
+C:\Users\user\code\awesome-project\.venv\Scripts\python
+```
+
+////
+
+éčĻãĒįšã¯ãäģŽæŗį°åĸãŽããšã `PATH` 夿°ãŽ**å
é **ãĢé
įŊŽãããã¨ã§ããOSã¯åŠį¨å¯čŊãĒäģãŽPythonãčĻã¤ãããã**åãĢ**ãããŽäģŽæŗį°åĸãŽPythonãčĻã¤ãããããĢãĒããžããããŽãããĢããĻã `python` ãåŽčĄããã¨ããĢãäģ㎠`python` īŧäžãã°ã°ããŧããĢį°åĸ㎠`python` īŧã§ã¯ãĒãã**ããŽäģŽæŗį°åĸãŽ**PythonãäŊŋį¨ãããããĢãĒããžãã
+
+äģŽæŗį°åĸãæåšãĢããĻ夿´ããããã¨ã¯äģãĢããããžããããããæãéčĻãĒ夿´ãŽã˛ã¨ã¤ã§ãã
+
+## äģŽæŗį°åĸãŽįĸēčĒ
+
+äģŽæŗį°åĸãæåšããŠãããäžãã°æŦĄãŽãããĢįĸēčĒã§ããžããīŧ
+
+//// tab | Linux, macOS, Windows Bash
+
+
+
+```console
+$ which python
+
+/home/user/code/awesome-project/.venv/bin/python
+```
+
+
+
+////
+
+//// tab | Windows PowerShell
+
+
+
+```console
+$ Get-Command python
+
+C:\Users\user\code\awesome-project\.venv\Scripts\python
+```
+
+
+
+////
+
+ããã¯ãäŊŋį¨ããã `python` ããã°ãŠã ã**ããŽäģŽæŗį°åĸãŽ**ããŽã§ãããã¨ãæåŗããžãã
+
+LinuxãmacOSã§ã¯ `which` ããWindows PowerShellã§ã¯ `Get-Command` ãäŊŋį¨ããžãã
+
+ããŽãŗããŗããŽåäŊã¯ã `PATH`夿°ãĢč¨åŽããã**ãããããŽããšãé ãĢ**įĸēčĒããĻãããåŧã°ããĻãã `python` ããã°ãŠã ãæĸããžãããããĻãčĻã¤ããæŦĄįŦŦããŽããã°ãŠã ã¸ãŽ**ããšã襨į¤ēããžã**ã
+
+æãéčĻãĒãã¨ã¯ã `python` ãåŧã°ããã¨ããĢããžããĢããŽãŗããŗãã§įĸēčĒãã "`python`" ãåŽčĄããããã¨ã§ãã
+
+ããããĻãčĒåãæŗåŽéããŽäģŽæŗį°åĸãĢããããįĸēčĒã§ããžãã
+
+/// tip | čąįĨč
+
+ããäģŽæŗį°åĸãæåšãĢããããŽPythonãäŊŋį¨ãããžãž**äģãŽããã¸ã§ã¯ããĢį§ģåããĻ**ããžããã¨ã¯į°ĄåãĢčĩˇããåžãžãã
+
+ãããĻãããŽįŦŦäēãŽããã¸ã§ã¯ãã¯åäŊããĒãã§ãããããĒããĒãåĨãŽããã¸ã§ã¯ããŽäģŽæŗį°åĸãŽ**čǤãŖãPython**ãäŊŋį¨ããĻããããã§ãã
+
+ããŽããããŠãŽ `python` ãäŊŋį¨ãããĻãããŽãįĸēčĒã§ãããã¨ã¯åŊšįĢãĄãžããđ¤
+
+///
+
+## ãĒãäģŽæŗį°åĸãįĄåšåãããŽã
+
+äžãã°ã`philosophers-stone` īŧčŗĸč
ãŽįŗīŧã¨ããããã¸ã§ã¯ãã§äŊæĨãããĻããĻã**ããŽäģŽæŗį°åĸãæåšãĢã**ãåŋ
čĻãĒãããąãŧã¸ãã¤ãŗãšããŧãĢããĻããŽį°åĸå
ã§äŊæĨãé˛ããĻããã¨ããžãã
+
+ããããã**åĨãŽããã¸ã§ã¯ã**ã `prisoner-of-azkaban` īŧãĸãēãĢããŗãŽåäēēīŧãĢåãæãããã¨ããžãã
+
+ããŽããã¸ã§ã¯ãããŖãŦã¯ããĒã¸į§ģåããžãīŧ
+
+
+
+```console
+$ cd ~/code/prisoner-of-azkaban
+```
+
+
+
+ãã `philosophers-stone` īŧčŗĸč
ãŽįŗīŧãŽäģŽæŗį°åĸãįĄåšåããĻããĒãã¨ã`python` ãåŽčĄããã¨ãã ãŋãŧãããĢ㯠`philosophers-stone` īŧčŗĸč
ãŽįŗīŧãŽPythonãäŊŋį¨ãããã¨ããžãã
+
+
+
+```console
+$ cd ~/code/prisoner-of-azkaban
+
+$ python main.py
+
+// Error importing sirius, it's not installed đą
+Traceback (most recent call last):
+ File "main.py", line 1, in
+ import sirius
+```
+
+
+
+ããããããŽäģŽæŗį°åĸãįĄåšåãã `prisoner-of-azkaban` īŧãĸãēãĢããŗãŽåäēēīŧãŽãããŽæ°ããäģŽæŗį°åĸãæåšãĢããã°ã `python` ãåŽčĄããã¨ããĢ `prisoner-of-azkaban` īŧãĸãēãĢããŗãŽåäēēīŧãŽäģŽæŗį°åĸ㎠Python ãäŊŋį¨ããããããĢãĒããžãã
+
+
+
+```console
+$ cd ~/code/prisoner-of-azkaban
+
+// You don't need to be in the old directory to deactivate, you can do it wherever you are, even after going to the other project đ
+$ deactivate
+
+// Activate the virtual environment in prisoner-of-azkaban/.venv đ
+$ source .venv/bin/activate
+
+// Now when you run python, it will find the package sirius installed in this virtual environment â¨
+$ python main.py
+
+I solemnly swear đē
+```
+
+
+
+## äģŖæŋææŽĩ
+
+ããã¯ãããããäģįĩãŋã**æ šæŦãã**åĻãļãããŽãˇãŗããĢãĒå
ĨéãŦã¤ãã§ãã
+
+äģŽæŗį°åĸããããąãŧã¸ãŽäžåéĸäŋīŧrequirementsīŧãããã¸ã§ã¯ããŽįŽĄįãĢã¯ãå¤ããŽ**äģŖæŋææŽĩ**ããããžãã
+
+æēåãæ´ãããããąãŧã¸ãŽäžåéĸäŋãäģŽæŗį°åĸãĒãŠ**ããã¸ã§ã¯ãå
¨äŊãŽįŽĄį**ããŧãĢãäŊŋãããã¨čããããuv ãčŠĻããĻãŋããã¨ãããããããžãã
+
+`uv` ã§ã¯äģĨä¸ãŽãããĒå¤ããŽãã¨ãã§ããžãīŧ
+
+* į°ãĒãããŧã¸ã§ãŗãåĢãã**Python ãŽã¤ãŗãšããŧãĢ**
+* ããã¸ã§ã¯ããã¨ãŽ**äģŽæŗį°åĸ**ãŽįŽĄį
+* **ãããąãŧã¸**ãŽã¤ãŗãšããŧãĢ
+* ããã¸ã§ã¯ããŽãããąãŧã¸ãŽ**äžåéĸäŋãããŧã¸ã§ãŗ**ãŽįŽĄį
+* ãããąãŧã¸ã¨ããŽããŧã¸ã§ãŗãŽãäžåéĸäŋãåĢãã**åŗå¯ãĒ**įĩãŋåãããäŋæãããããĢããŖãĻãæŦįĒį°åĸã§ãéįēį°åĸã¨å
¨ãåããããĢããã¸ã§ã¯ããåŽčĄã§ããīŧããã¯**locking**ã¨åŧã°ããžãīŧ
+* ããŽäģãŽããžããžãĒæŠčŊ
+
+## ãžã¨ã
+
+ãããžã§čĒãŋããšãĻįč§ŖãããĒããä¸éãŽå¤ããŽéįēč
ã¨æ¯ãšãĻãäģŽæŗį°åĸãĢã¤ããĻ**ããĒãã¯ããå¤ããŽãã¨ãįĨãŖãĻããžã**ãđ¤
+
+ããããŽčŠŗį´°ãįĨããã¨ã¯ãå°æĨãč¤éãĢčĻããäŊããŽãããã°ãĢããŖã¨åŊšįĢã¤ã§ããããããããããŽé ãĢã¯ãããĒãã¯**ããŽããšãĻãŽåäŊãæ šæŦãã**įč§ŖããĻããã§ããããđ
diff --git a/docs/ko/docs/advanced/custom-response.md b/docs/ko/docs/advanced/custom-response.md
new file mode 100644
index 000000000..2001956fa
--- /dev/null
+++ b/docs/ko/docs/advanced/custom-response.md
@@ -0,0 +1,313 @@
+# ėŦėŠė ė ė ėëĩ - HTML, Stream, íėŧ, 기í
+
+ę¸°ëŗ¸ė ėŧëĄ, **FastAPI** ėëĩė `JSONResponse`ëĨŧ ėŦėŠíėŦ ë°ííŠëë¤.
+
+ė´ëĨŧ ėŦė ė íë ¤ëŠ´ [ėëĩė ė§ė ë°íí기](response-directly.md){.internal-link target=_blank}ėė ëŗ¸ ę˛ė˛ëŧ `Response`ëĨŧ ė§ė ë°íí늴 ëŠëë¤.
+
+꡸ëŦë `Response` (ëë `JSONResponse`ė ę°ė íė í´ëė¤)ëĨŧ ė§ė ë°íí늴, ë°ė´í°ę° ėëėŧëĄ ëŗíëė§ ėėŧ늰 (ėŦė§ė´ `response_model`ė ė ė¸íëëŧë), ëŦ¸ėíę° ėëėŧëĄ ėėąëė§ ėėĩëë¤(ėëĨŧ ë¤ė´, ėėąë OpenAPIė ėŧëļëĄ HTTP í¤ë `Content-Type`ė íšė "미ëė´ íė
"ė íŦí¨íë ę˛Ŋė°).
+
+íė§ë§ *ę˛ŊëĄ ėė
ë°ėŊë ė´í°*ėė `response_class` 매ę°ëŗėëĨŧ ėŦėŠíėŦ ėíë `Response`(ė: ëǍë `Response` íė í´ëė¤)ëĨŧ ė ė¸í ėë ėėĩëë¤.
+
+*ę˛ŊëĄ ėė
í¨ė*ėė ë°ííë ë´ėŠė í´ëš `Response`ėė íŦí¨ëŠëë¤.
+
+꡸ëĻŦęŗ ë§ėŊ ꡸ `Response`ę° `JSONResponse`ė `UJSONResponse`ė ę˛Ŋė° ė˛ëŧ JSON 미ëė´ íė
(`application/json`)ė ę°ė§ęŗ ėë¤ëŠ´, *ę˛ŊëĄ ėė
ë°ėŊë ė´í°*ėė ė ė¸í Pydanticė `response_model`ė ėŦėŠí´ ėëėŧëĄ ëŗí(ë° íí°ë§) ëŠëë¤.
+
+/// note | ė°¸ęŗ
+
+미ëė´ íė
ė´ ėë ėëĩ í´ëė¤ëĨŧ ėŦėŠíë ę˛Ŋė°, FastAPIë ėëĩė ë´ėŠė´ ėė ę˛ėŧëĄ ėėíë¯ëĄ ėėąë OpenAPI ëŦ¸ėėė ėëĩ íėė ëŦ¸ėííė§ ėėĩëë¤.
+
+///
+
+## `ORJSONResponse` ėŦėŠí기
+
+ėëĨŧ ë¤ė´, ėąëĨė ꡚëííë ¤ë ę˛Ŋė°, orjson ė ė¤ėšíėŦ ėŦėŠíęŗ ėëĩė `ORJSONResponse`ëĄ ė¤ė í ė ėėĩëë¤.
+
+ėŦėŠíęŗ ė íë `Response` í´ëė¤(íė í´ëė¤)ëĨŧ ėíŦí¸í í, **ę˛ŊëĄ ėė
ë°ėŊë ė´í°*ėė ė ė¸íė¸ė.
+
+ëęˇëǍ ėëĩė ę˛Ŋė°, ëė
ëëĻŦëĨŧ ë°ííë ę˛ëŗ´ë¤ `Response`ëĨŧ ë°ííë ę˛ė´ í¨ėŦ ëš ëĻ
ëë¤.
+
+ė´ė ë ę¸°ëŗ¸ė ėŧëĄ, FastAPIę° ë´ëļė ëǍë íëĒŠė ę˛ėŦíęŗ JSONėŧëĄ ė§ë Ŧíí ė ėëė§ íė¸í기 ëëŦ¸ė
ëë¤. ė´ë ėŦėŠė ėë´ėėė ė¤ëĒ
ë [JSON í¸í ę°ëĨ ė¸ėŊë](../tutorial/encoder.md){.internal-link target=_blank}ëĨŧ ėŦėŠíë ë°Šėęŗŧ ëėŧíŠëë¤. ė´ëĨŧ íĩí´ ë°ė´í°ë˛ ė´ė¤ ëǍë¸ęŗŧ ę°ė **ėėė ę°ė˛´**ëĨŧ ë°íí ė ėėĩëë¤.
+
+íė§ë§ ë°ííë ë´ėŠė´ **JSONėŧëĄ ė§ë Ŧí ę°ëĨ**íë¤ęŗ íė íë ę˛Ŋė°, í´ëš ë´ėŠė ėëĩ í´ëė¤ė ė§ė ė ëŦí ė ėėŧ늰, FastAPIę° ë°í ë´ėŠė `jsonable_encoder`ëĨŧ íĩí´ ė˛ëĻŦí ë¤ ėëĩ í´ëė¤ė ė ëŦíë ė¤ë˛í¤ëëĨŧ íŧí ė ėėĩëë¤.
+
+{* ../../docs_src/custom_response/tutorial001b.py hl[2,7] *}
+
+/// info | ė ëŗ´
+
+`response_class` 매ę°ëŗėë ėëĩė "미ëė´ íė
"ė ė ėíë ë°ėë ėŦėŠëŠëë¤.
+
+ė´ ę˛Ŋė°, HTTP í¤ë `Content-Type`ė `application/json`ėŧëĄ ė¤ė ëŠëë¤.
+
+꡸ëĻŦęŗ ė´ë OpenAPIė ꡸ëëĄ ëŦ¸ėíëŠëë¤.
+
+///
+
+/// tip | í
+
+`ORJSONResponse`ë FastAPIėėë§ ėŦėŠí ė ėęŗ Starletteėėë ėŦėŠí ė ėėĩëë¤.
+
+///
+
+## HTML ėëĩ
+
+**FastAPI**ėė HTML ėëĩė ė§ė ë°ííë ¤ëŠ´ `HTMLResponse`ëĨŧ ėŦėŠíė¸ė.
+
+* `HTMLResponse`ëĨŧ ėíŦí¸ íŠëë¤.
+* *ę˛ŊëĄ ėė
ë°ėŊë ė´í°*ė `response_class` 매ę°ëŗėëĄ `HTMLResponse`ëĨŧ ė ëŦíŠëë¤.
+
+{* ../../docs_src/custom_response/tutorial002.py hl[2,7] *}
+
+/// info | ė ëŗ´
+
+`response_class` 매ę°ëŗėë ėëĩė "미ëė´ íė
"ė ė ėíë ë°ėë ėŦėŠëŠëë¤.
+
+ė´ ę˛Ŋė°, HTTP í¤ë `Content-Type`ė `text/html`ëĄ ė¤ė ëŠëë¤.
+
+꡸ëĻŦęŗ ė´ë OpenAPIė ꡸ëëĄ ëŦ¸ėí ëŠëë¤.
+
+///
+
+### `Response` ë°íí기
+
+[ėëĩė ė§ė ë°íí기](response-directly.md){.internal-link target=_blank}ėė ëŗ¸ ę˛ ė˛ëŧ, *ę˛ŊëĄ ėė
*ėė ėëĩė ė§ė ë°ííėŦ ėŦė ėí ėë ėėĩëë¤.
+
+ėė ėė ė ëėŧíę˛ `HTMLResponse`ëĨŧ ë°ííë ėŊëë ë¤ėęŗŧ ę°ė ė ėėĩëë¤:
+
+{* ../../docs_src/custom_response/tutorial003.py hl[2,7,19] *}
+
+/// warning | ę˛Ŋęŗ
+
+*ę˛ŊëĄ ėė
í¨ė*ėė ė§ė ë°íë `Response`ë OpenAPIė ëŦ¸ėíëė§ ėėĩëë¤(ėëĨŧë¤ė´, `Content-Type`ė´ ëŦ¸ėíëė§ ėė) ėë ëíí ëŦ¸ėėėë íėëė§ ėėĩëë¤.
+
+///
+
+/// info | ė ëŗ´
+
+ëŦŧëĄ ė¤ė `Content-Type` í¤ë, ėí ėŊë ëąė ë°íë `Response` ę°ė˛´ėė ę°ė ¸ėĩëë¤.
+
+///
+
+### OpenAPIė ëŦ¸ėííęŗ `Response` ėŦė ė í기
+
+í¨ė ë´ëļėė ėëĩė ėŦė ėí늴ė ëėė OpenAPIėė "미ëė´ íė
"ė ëŦ¸ėííęŗ ėļë¤ëŠ´, `response_class` 매ę˛ëŗėëĨŧ ėŦėŠí늴ė `Response` ę°ė˛´ëĨŧ ë°íí ė ėėĩëë¤.
+
+ė´ ę˛Ŋė° `response_class`ë OpenAPI *ę˛ŊëĄ ėė
*ė ëŦ¸ėííë ë°ë§ ėŦėŠëęŗ , ė¤ė ëĄë ėŦëŦëļė´ ë°íí `Response`ę° ęˇ¸ëëĄ ėŦėŠëŠëë¤.
+
+### `HTMLResponse`ė§ė ë°íí기
+
+ėëĨŧ ë¤ė´, ë¤ėęŗŧ ę°ė´ ėėąí ė ėėĩëë¤:
+
+{* ../../docs_src/custom_response/tutorial004.py hl[7,21,23] *}
+
+ė´ ėė ėė, `generate_html_response()` í¨ėë HTMLė `str`ëĄ ë°ííë ëė ė´ë¯¸ `Response`ëĨŧ ėėąíęŗ ë°ííŠëë¤.
+
+`generate_html_response()`ëĨŧ í¸ėļí 결ęŗŧëĨŧ ë°íí¨ėŧëĄė¨, ę¸°ëŗ¸ė ė¸ **FastAPI** ę¸°ëŗ¸ ëėė ėŦė ė íë `Response`ëĨŧ ė´ë¯¸ ë°ííęŗ ėėĩëë¤.
+
+íė§ë§ `response_class`ė `HTMLResponse`ëĨŧ í¨ęģ ė ëŦí기 ëëŦ¸ė, FastAPIë ė´ëĨŧ OpenAPI ë° ëíí ëŦ¸ėėė `text/html`ëĄ HTMLė ëŦ¸ėí íë ë°Šë˛ė ė ė ėėĩëë¤.
+
+
+
+## ėŦėŠ ę°ëĨí ėëĩë¤
+
+ë¤ėė ėŦėŠí ė ėë ëĒę°ė§ ėëĩë¤ ė
ëë¤.
+
+`Response`ëĨŧ ėŦėŠíėŦ ë¤ëĨ¸ ė´ë¤ ę˛ë ë°í í ė ėėŧ늰, ė§ė íė í´ëė¤ëĨŧ ë§ë¤ ėë ėėĩëë¤.
+
+/// note | 기ė ė¸ëļėŦí
+
+`from starlette.responses import HTMLResponse`ëĨŧ ėŦėŠí ėë ėėĩëë¤.
+
+**FastAPI**ë ę°ë°ėė¸ ėŦëŦëļė í¸ėëĨŧ ėí´ `starlette.responses`ëĨŧ `fastapi.responses`ëĄ ė ęŗĩ íė§ë§, ëëļëļė ėŦėŠ ę°ëĨí ėëĩė Starletteėė ė§ė ę°ė ¸ėĩëë¤.
+
+///
+
+### `Response`
+
+ę¸°ëŗ¸ `Response` í´ëė¤ë ë¤ëĨ¸ ëǍë ėëĩ í´ëė¤ė ëļëǍ í´ëė¤ ė
ëë¤.
+
+ė´ í´ëė¤ëĨŧ ė§ė ë°íí ė ėėĩëë¤.
+
+ë¤ė 매ę°ëŗėëĨŧ ë°ė ė ėėĩëë¤:
+
+* `content` - `str` ëë `bytes`.
+* `status_code` - HTTP ėíėŊëëĨŧ ëíë´ë `int`.
+* `headers` - ëŦ¸ėė´ëĄ ė´ëŖ¨ė´ė§ `dict`.
+* `media_type` - 미ëė´ íė
ė ëíë´ë `str` ė: `"text/html"`.
+
+FastAPI (ė¤ė ëĄë Starlette)ę° ėëėŧëĄ `Content-Length` í¤ëëĨŧ íŦí¨ėíĩëë¤. ëí `media_type`ė 기ë°íėŦ `Content-Type` í¤ëëĨŧ íŦí¨í늰, í
ė¤í¸ íė
ė ę˛Ŋė° ëŦ¸ė ė§íŠė ėļę° íŠëë¤.
+
+{* ../../docs_src/response_directly/tutorial002.py hl[1,18] *}
+
+### `HTMLResponse`
+
+í
ė¤í¸ ëë ë°ė´í¸ëĨŧ ë°ė HTML ėëĩė ë°ííŠëë¤. ėėė ė¤ëĒ
í ë´ėŠęŗŧ ę°ėĩëë¤.
+
+### `PlainTextResponse`
+
+í
ė¤í¸ ëë ë°ė´í¸ëĨŧ ë°ė ėŧë° í
ė¤í¸ ėëĩė ë°ííŠëë¤.
+
+{* ../../docs_src/custom_response/tutorial005.py hl[2,7,9] *}
+
+### `JSONResponse`
+
+ë°ė´í°ëĨŧ ë°ė `application/json`ėŧëĄ ė¸ėŊëŠë ėëĩė ë°ííŠëë¤.
+
+ė´ë ėėė ė¤ëĒ
íë¯ė´ **FastAPI**ėė ę¸°ëŗ¸ė ėŧëĄ ėŦėŠëë ėëĩ íėė
ëë¤.
+
+### `ORJSONResponse`
+
+ `orjson` ė ėŦėŠíėŦ ëš ëĨ¸ JSON ėëĩė ė ęŗĩíë ëėė
ëë¤. ėėė ė¤ëĒ
í ë´ėŠęŗŧ ę°ėĩëë¤.
+
+/// info | ė ëŗ´
+
+ė´ëĨŧ ėŦėŠíë ¤ëŠ´ `orjson`ė ė¤ėší´ėŧíŠëë¤. ė: `pip install orjson`.
+
+///
+
+### `UJSONResponse`
+
+`ujson` ė ėŦėŠí ë ë¤ëĨ¸ JSON ėëĩ íėė
ëë¤.
+
+/// info | ė ëŗ´
+
+ė´ ėëĩė ėŦėŠíë ¤ëŠ´ `ujson`ė ė¤ėší´ėŧíŠëë¤. ė: 'pip install ujson`.
+
+///
+
+/// warning | ę˛Ŋęŗ
+
+`ujson` ė ėŧëļ ėė¸ ę˛Ŋė°ëĨŧ ė˛ëĻŦíë ë° ėė´ Python ë´ėĨ ęĩŦíëŗ´ë¤ ë ė겊íŠëë¤.
+
+///
+
+{* ../../docs_src/custom_response/tutorial001.py hl[2,7] *}
+
+/// tip | í
+
+`ORJSONResponse`ę° ë ëš ëĨ¸ ëėėŧ ę°ëĨėąė´ ėėĩëë¤.
+
+///
+
+### `RedirectResponse`
+
+HTTP ëĻŦëë ė
ėëĩė ë°ííŠëë¤. ę¸°ëŗ¸ė ėŧëĄ ėí ėŊëë 307(ėė ëĻŦëë ė
)ėŧëĄ ė¤ė ëŠëë¤.
+
+`RedirectResponse`ëĨŧ ė§ė ë°íí ė ėėĩëë¤.
+
+{* ../../docs_src/custom_response/tutorial006.py hl[2,9] *}
+
+---
+
+ëë `response_class` 매ę°ëŗėėė ėŦėŠí ėë ėėĩëë¤:
+
+
+{* ../../docs_src/custom_response/tutorial006b.py hl[2,7,9] *}
+
+ė´ ę˛Ŋė°, *ę˛ŊëĄ ėė
* í¨ėėė URLė ė§ė ë°íí ė ėėĩëë¤.
+
+ė´ ę˛Ŋė°, ėŦėŠëë `status_code`ë `RedirectResponse`ė ę¸°ëŗ¸ę°ė¸ `307` ė
ëë¤.
+
+---
+
+`status_code` 매ę°ëŗėëĨŧ `response_class` 매ę°ëŗėė í¨ęģ ėŦėŠí ėë ėėĩëë¤:
+
+{* ../../docs_src/custom_response/tutorial006c.py hl[2,7,9] *}
+
+### `StreamingResponse`
+
+ëšë기 ė ëë ė´í° ëë ėŧë° ė ëë ė´í°/ė´í°ë ė´í°ëĨŧ ë°ė ėëĩ ëŗ¸ëŦ¸ė ė¤í¸ëĻŦë° íŠëë¤.
+
+{* ../../docs_src/custom_response/tutorial007.py hl[2,14] *}
+
+#### íėŧęŗŧ ę°ė ę°ė˛´ëĨŧ ėŦėŠí `StreamingResponse`
+
+íėŧęŗŧ ę°ė ę°ė˛´(ė: `open()`ėŧëĄ ë°íë ę°ė˛´)ę° ėë ę˛Ŋė°, í´ëš íėŧęŗŧ ę°ė ę°ė˛´ëĨŧ ë°ëŗĩ(iterate)íë ė ëë ė´í° í¨ėëĨŧ ë§ë¤ ė ėėĩëë¤.
+
+ė´ ë°ŠėėŧëĄ, íėŧ ė 랴ëĨŧ ëŠëǍëĻŦė ë¨ŧė ėŊė´ë¤ėŧ íė ėė´, ė ëë ė´í° í¨ėëĨŧ `StreamingResponse`ė ė ëŦíėŦ ë°íí ė ėėĩëë¤.
+
+ė´ ë°Šėė í´ëŧė°ë ė¤í ëĻŦė§, ëšëė¤ ė˛ëĻŦ ëąė ë¤ėí ëŧė´ë¸ëŦëĻŦė í¨ęģ ėŦėŠí ė ėėĩëë¤.
+
+{* ../../docs_src/custom_response/tutorial008.py hl[2,10:12,14] *}
+
+1. ė´ę˛ė´ ė ëë ė´í° í¨ėė
ëë¤. `yield` ëŦ¸ė íŦí¨íęŗ ėėŧë¯ëĄ "ė ëë ė´í° í¨ė"ė
ëë¤.
+2. `with` ë¸ëĄė ėŦėŠí¨ėŧëĄė¨, ė ëë ė´í° í¨ėę° ėëŖë í íėŧęŗŧ ę°ė ę°ė˛´ę° ëĢíëëĄ íŠëë¤. ėĻ, ėëĩ ė ėĄė´ ëë í ëĢíëë¤.
+3. ė´ `yield from`ė í¨ėę° `file_like`ëŧë ę°ė˛´ëĨŧ ë°ëŗĩ(iterate)íëëĄ íŠëë¤. ë°ëŗĩë ę° ëļëļė ė´ ė ëë ė´í° í¨ė(`iterfile`)ėė ėėąë ę˛ė˛ëŧ `yield` ëŠëë¤.
+
+ ė´ë ę˛ í늴 "ėėą(generating)" ėė
ė ë´ëļė ėŧëĄ ë¤ëĨ¸ ëŦ´ė¸ę°ė ėėíë ė ëë ė´í° í¨ėę° ëŠëë¤.
+
+ ė´ ë°Šėė ėŦėŠí늴 `with` ë¸ëĄ ėėė íėŧė ė´ ė ėė´, ėė
ė´ ėëŖë í íėŧęŗŧ ę°ė ę°ė˛´ę° ëĢíë ę˛ė ëŗ´ėĨí ė ėėĩëë¤.
+
+/// tip | í
+
+ėŦ기ė íė¤ `open()`ė ėŦėŠíęŗ ė기 ëëŦ¸ė `async`ė `await`ëĨŧ ė§ėíė§ ėėĩëë¤. ë°ëŧė ę˛ŊëĄ ėė
ė ėŧë° `def`ëĄ ė ė¸íŠëë¤.
+
+///
+
+### `FileResponse`
+
+íėŧė ëšëę¸°ëĄ ė¤í¸ëĻŦë°íėŦ ėëĩíŠëë¤.
+
+ë¤ëĨ¸ ėëĩ ė íęŗŧë ë¤ëĨ¸ ė¸ėëĨŧ ėŦėŠíėŦ ę°ė˛´ëĨŧ ėėąíŠëë¤:
+
+* `path` - ė¤í¸ëĻŦë°í íėŧė ę˛ŊëĄ.
+* `headers` - ëė
ëëĻŦ íėė ėŦėŠė ė ė í¤ë.
+* `media_type` - 미ëė´ íė
ė ëíë´ë ëŦ¸ėė´. ė¤ė ëė§ ėė ę˛Ŋė° íėŧ ė´ëĻė´ë ę˛ŊëĄëĨŧ ėŦėŠíėŦ ėļëĄ íŠëë¤.
+* `filename` - ė¤ė ë ę˛Ŋė° ėëĩė `Content-Disposition`ė íŦí¨ëŠëë¤.
+
+íėŧ ėëĩėë ė ė í `Content-Length`, `Last-Modified`, ë° `ETag` í¤ëę° íŦí¨ëŠëë¤.
+
+{* ../../docs_src/custom_response/tutorial009.py hl[2,10] *}
+
+ëí `response_class` 매ę°ëŗėëĨŧ ėŦėŠí ėë ėėĩëë¤:
+
+{* ../../docs_src/custom_response/tutorial009b.py hl[2,8,10] *}
+
+ė´ ę˛Ŋė°, ę˛ŊëĄ ėė
í¨ėėė íėŧ ę˛ŊëĄëĨŧ ė§ė ë°íí ė ėėĩëë¤.
+
+## ėŦėŠė ė ė ėëĩ í´ëė¤
+
+`Response`ëĨŧ ėėë°ė ėŦėŠė ė ė ėëĩ í´ëė¤ëĨŧ ėėąíęŗ ėŦėŠí ė ėėĩëë¤.
+
+ėëĨŧ ë¤ė´, íŦí¨ë `ORJSONResponse` í´ëė¤ėė ėŦėŠëė§ ėë ė¤ė ėŧëĄ orjson ė ėŦėŠíęŗ ėļë¤ęŗ ę°ė í´ë´
ėë¤.
+
+ë§ėŊ ë¤ėŦė°ę¸° ë° íŦ맡ë JSONė ë°ííęŗ ėļë¤ëŠ´, `orjson.OPT_INDENT_2` ėĩė
ė ėŦėŠí ė ėėĩëë¤.
+
+`CustomORJSONResponse`ëĨŧ ėėąí ė ėėĩëë¤. ėŦ기ė íĩėŦė `Response.render(content)` ëŠėëëĨŧ ėėąíėŦ ë´ėŠė `bytes`ëĄ ë°ííë ę˛ė
ëë¤:
+
+{* ../../docs_src/custom_response/tutorial009c.py hl[9:14,17] *}
+
+ė´ė ë¤ė ëė :
+
+```json
+{"message": "Hello World"}
+```
+
+ė´ ėëĩė ė´ë ę˛ ë°íëŠëë¤:
+
+```json
+{
+ "message": "Hello World"
+}
+```
+
+ëŦŧëĄ JSON íŦ맡í
ëŗ´ë¤ ë ė ėŠíę˛ íėŠí ë°Šë˛ė ė°žė ė ėė ę˛ė
ëë¤. đ
+
+## ę¸°ëŗ¸ ėëĩ í´ëė¤
+
+**FastAPI** í´ëė¤ ę°ė˛´ ëë `APIRouter`ëĨŧ ėėąí ë ę¸°ëŗ¸ė ėŧëĄ ėŦėŠí ėëĩ í´ëė¤ëĨŧ ė§ė í ė ėėĩëë¤.
+
+ė´ëĨŧ ė ėíë 매ę°ëŗėë `default_response_class`ė
ëë¤.
+
+ėë ėė ėė **FastAPI**ë ëǍë ę˛ŊëĄ ėė
ėė ę¸°ëŗ¸ė ėŧëĄ `JSONResponse` ëė `ORJSONResponse`ëĨŧ ėŦėŠíŠëë¤.
+
+{* ../../docs_src/custom_response/tutorial010.py hl[2,4] *}
+
+/// tip | í
+
+ėŦė í ė´ė ė˛ëŧ *ę˛ŊëĄ ėė
*ėė `response_class`ëĨŧ ėŦė ėí ė ėėĩëë¤.
+
+///
+
+## ėļę° ëŦ¸ėí
+
+OpenAPIėė `responses`ëĨŧ ėŦėŠíėŦ 미ëė´ íė
ë° ę¸°í ė¸ëļ ė ëŗ´ëĨŧ ė ė¸í ėë ėėĩëë¤: [OpenAPIėė ėļę° ėëĩ](additional-responses.md){.internal-link target=_blank}.
diff --git a/docs/ko/docs/advanced/events.md b/docs/ko/docs/advanced/events.md
index ae349e7be..5f8fe0f1e 100644
--- a/docs/ko/docs/advanced/events.md
+++ b/docs/ko/docs/advanced/events.md
@@ -1,53 +1,165 @@
-# ė´ë˛¤í¸: startupęŗŧ shutdown
+# Lifespan ė´ë˛¤í¸
-íėė ë°ëŧ ėėŠ íëĄęˇ¸ë¨ė´ ėėë기 ė ė´ë ėĸ
ëŖë ë ė¤íëë ė´ë˛¤í¸ í¸ë¤ëŦ(í¨ė)ëĨŧ ė ėí ė ėėĩëë¤.
+ė íëĻŦėŧė´ė
**ėė ė **ė ė¤íëė´ėŧ íë ëĄė§(ėŊë)ė ė ėí ė ėėĩëë¤. ė´ë ė´ ėŊëę° **í ë˛**ë§ ė¤íë늰, **ė íëĻŦėŧė´ė
ė´ ėė˛ė ë°ę¸° ėėí기 ė **ė ė¤íëë¤ë ė미ė
ëë¤.
-ė´ í¨ėë¤ė `async def` ëë íë˛íę˛ `def`ėŧëĄ ė ė¸í ė ėėĩëë¤.
+ë§ė°Ŧę°ė§ëĄ, ė íëĻŦėŧė´ė
ė´ **ėĸ
ëŖë ë** ė¤íëė´ėŧ íë ëĄė§(ėŊë)ė ė ėí ė ėėĩëë¤. ė´ ę˛Ŋė°, ė´ ėŊëë **í ë˛**ë§ ė¤íë늰, **ėŦëŦ ėė˛ė ė˛ëĻŦí í**ė ė¤íëŠëë¤.
+
+ė´ ėŊëę° ė íëĻŦėŧė´ė
ė´ **ėė˛ė ë°ę¸° ėėí기 ė ė** ė¤íëęŗ , ėė˛ ė˛ëĻŦę° ëë í **ėĸ
ëŖ ė§ė ė** ė¤íë기 ëëŦ¸ė ė 랴 ė íëĻŦėŧė´ė
ė **ėëĒ
(Lifespan)**ė ë¤ëŖšëë¤. (ė ė í "ėëĒ
"ė´ëŧë ë¨ė´ę° ė¤ėí´ė§ëë¤ đ)
+
+ė´ ë°Šë˛ė ė 랴 ė íëĻŦėŧė´ė
ėė ėŦėŠí´ėŧ íë **ėė**ė ė¤ė íęą°ë ėė˛ ę°ė **ęŗĩė ëë** ėėė ė¤ė íęŗ , ëë ꡸ íė **ė ëĻŦ**íë ë° ë§¤ė° ė ėŠí ė ėėĩëë¤. ėëĨŧ ë¤ė´, ë°ė´í°ë˛ ė´ė¤ ė°ę˛° í ëë ęŗĩė ëë 머ė ëŦë ëǍë¸ė ëĄëíë ę˛Ŋė°ė
ëë¤.
+
+
+## ėŦėŠ ėŦëĄ
+
+ë¨ŧė **ėŦėŠ ėŦëĄ**ëĨŧ ėëĄ ë¤ė´ëŗ´ęŗ , ė´ëĨŧ ė´ëģę˛ í´ę˛°í ė ėëė§ ė´í´ëŗ´ę˛ ėĩëë¤.
+
+ė°ëĻŦę° ėė˛ė ė˛ëĻŦí기 ėí´ ėŦėŠíęŗ ėļė **머ė ëŦë ëǍë¸**ė´ ėë¤ęŗ ėėí´ ë´
ėë¤. đ¤
+
+ė´ ëǍë¸ë¤ė ėė˛ ę°ė ęŗĩė ëë¯ëĄ, ėė˛ë§ë¤ ëǍë¸ė´ íëėŠ ėë ę˛ė´ ėëëŧ, ėŦëŦ ėė˛ėė ëėŧí ëǍë¸ė ėŦėŠíŠëë¤.
+
+ëǍë¸ė ëĄëíë ë° **ėëší ėę°ė´ 깸ëϰë¤ęŗ ėėí´ ë´
ėë¤**, ėëí늴 ëǍë¸ė´ **ëė¤íŦėė ë§ė ë°ė´í°ëĨŧ ėŊė´ėŧ** í기 ëëŦ¸ė
ëë¤. ë°ëŧė ëǍë ėė˛ė ëí´ ëǍë¸ė ë§¤ë˛ ëĄëíęŗ ėļė§ ėėĩëë¤.
+
+ëǍë/íėŧė ėĩėėėė ëǍë¸ė ëĄëí ėë ėė§ë§, ꡸ëŦ늴 **ëǍë¸ė ëĄëíëë°** ėę°ė´ 깸ëĻŦ기 ëëŦ¸ė, ë¨ėí ėëíë í
ė¤í¸ëĨŧ ė¤íí ëë ëǍë¸ė´ ëĄëë ëęšė§ 기ë¤ë ¤ėŧ í´ė **í
ė¤í¸ ėëę° ëë ¤ė§ëë¤**.
+
+ė´ ëŦ¸ė ëĨŧ í´ę˛°íë ¤ęŗ íë ę˛ė
ëë¤. ėė˛ė ė˛ëĻŦí기 ė ė ëǍë¸ė ëĄëíë, ė íëĻŦėŧė´ė
ė´ ėė˛ė ë°ę¸° ėėí기 ė§ė ėë§ ëĄëíęŗ , ėŊëę° ëĄëëë ëėė ëĄëíė§ ėëëĄ íę˛ ėĩëë¤.
+
+## Lifespan
+
+`FastAPI` ė íëĻŦėŧė´ė
ė `lifespan` 매ę°ëŗėė "ėģ¨í
ė¤í¸ 매ëė "ëĨŧ ėŦėŠíėŦ *ėė*ęŗŧ *ėĸ
ëŖ* ëĄė§ė ė ėí ė ėėĩëë¤. (ėģ¨í
ė¤í¸ 매ëė ę° ëŦ´ėė¸ė§ ė ė íė ė¤ëĒ
ëëĻŦę˛ ėĩëë¤.)
+
+ėė ëĨŧ íĩí´ ėėíęŗ , ꡸ íė ėė¸í ė´í´ëŗ´ę˛ ėĩëë¤.
+
+ė°ëĻŦë `yield`ëĨŧ ėŦėŠíėŦ ëšë기 í¨ė `lifespan()`ė ë¤ėęŗŧ ę°ė´ ėėąíŠëë¤:
+
+{* ../../docs_src/events/tutorial003.py hl[16,19] *}
+
+ėŦ기ė ė°ëĻŦë ëǍë¸ė ëĄëíë ëšėŧ *ėė* ėė
ė ėëŽŦë ė´ė
íęŗ ėėĩëë¤. `yield` ėėė (ę°ė§) ëĒ¨ë¸ í¨ėëĨŧ 머ė ëŦë ëǍë¸ė´ ë´ę¸´ ëė
ëëĻŦė ëŖėĩëë¤. ė´ ėŊëë **ė íëĻŦėŧė´ė
ė´ ėė˛ė ë°ę¸° ėėí기 ė **, *ėė* ëėė ė¤íëŠëë¤.
+
+꡸ëĻŦęŗ `yield` ė§íėë ëǍë¸ė ė¸ëĄëíŠëë¤. ė´ ėŊëë **ė íëĻŦėŧė´ė
ė´ ėė˛ ė˛ëĻŦ ėëŖ í**, *ėĸ
ëŖ* ė§ė ė ė¤íëŠëë¤. ėëĨŧ ë¤ė´, ëŠëǍëĻŦë GPUė ę°ė ėėė í´ė íë ėė
ė í ė ėėĩëë¤.
+
+/// tip | í
+
+`shutdown`ė ė íëĻŦėŧė´ė
ė **ėĸ
ëŖ**í ë ë°ėíŠëë¤.
+
+ėëĄė´ ë˛ė ė ėėí´ėŧ íęą°ë, ꡸ëĨ ė¤íė ëŠėļęŗ ėļė ėë ėėĩëë¤. đ¤ˇ
+
+///
+
+### Lifespan í¨ė
+
+ë¨ŧė ėŖŧëĒŠí ė ė, `yield`ëĨŧ ėŦėŠíėŦ ëšë기 í¨ė(async function)ëĨŧ ė ėíęŗ ėë¤ë ę˛ė
ëë¤. ė´ë `yield`ëĨŧ ėŦėŠí ėėĄ´ėąęŗŧ ë§¤ė° ė ėŦíŠëë¤.
+
+{* ../../docs_src/events/tutorial003.py hl[14:19] *}
+
+í¨ėė ė˛Ģ ë˛ė§¸ ëļëļ, ėĻ `yield` ė´ė ė ėŊëë ė íëĻŦėŧė´ė
ė´ ėėë기 **ė ė** ė¤íëŠëë¤.
+
+꡸ëĻŦęŗ `yield` ė´íė ëļëļė ė íëĻŦėŧė´ė
ė´ ėëŖë í **ëė¤ė** ė¤íëŠëë¤.
+
+### ëšë기 ėģ¨í
ė¤í¸ 매ëė
+
+í¨ėëĨŧ íė¸í´ëŗ´ëŠ´, `@asynccontextmanager`ëĄ ėĨėëė´ ėėĩëë¤.
+
+ė´ę˛ė í¨ėëĨŧ "**ëšë기 ėģ¨í
ė¤í¸ 매ëė **"ëŧęŗ ëļëĻŦë ę˛ėŧëĄ ëŗíėíĩëë¤.
+
+{* ../../docs_src/events/tutorial003.py hl[1,13] *}
+
+íė´ėŦėė **ėģ¨í
ė¤í¸ 매ëė **ë `with` ëŦ¸ėė ėŦėŠí ė ėë ę˛ė
ëë¤. ėëĨŧ ë¤ė´, `open()`ė ėģ¨í
ė¤í¸ 매ëė ëĄ ėŦėŠí ė ėėĩëë¤:
+
+```Python
+with open("file.txt") as file:
+ file.read()
+```
+ėĩęˇŧ ë˛ė ė íė´ėŦėėë **ëšë기 ėģ¨í
ė¤í¸ 매ëė **ë ėėĩëë¤. ė´ëĨŧ `async with`ė í¨ęģ ėŦėŠíŠëë¤:
+
+```Python
+async with lifespan(app):
+ await do_stuff()
+```
+
+ėģ¨í
ė¤í¸ 매ëė ë ėė ę°ė ëšë기 ėģ¨í
ė¤í¸ 매ëė ëĨŧ ë§ë¤ëŠ´, `with` ë¸ëĄė ë¤ė´ę°ę¸° ė ė `yield` ė´ė ė ėŊëę° ė¤íëęŗ , `with` ë¸ëĄė ë˛ė´ë íėë `yield` ė´íė ėŊëę° ė¤íëŠëë¤.
+
+ėė ėŊë ėė ėėë ė§ė ėŦėŠíė§ ėęŗ , FastAPIė ė ëŦíėŦ ėŦėŠíëëĄ íŠëë¤.
+
+`FastAPI` ė íëĻŦėŧė´ė
ė `lifespan` 매ę°ëŗėë **ëšë기 ėģ¨í
ė¤í¸ 매ëė **ëĨŧ ë°ę¸° ëëŦ¸ė, ėëĄė´ `lifespan` ëšë기 ėģ¨í
ė¤í¸ 매ëė ëĨŧ FastAPIė ė ëŦí ė ėėĩëë¤.
+
+{* ../../docs_src/events/tutorial003.py hl[22] *}
+
+## ë랴 ė´ë˛¤í¸ (ėŦėŠ ė¤ë¨)
/// warning | ę˛Ŋęŗ
-ė´ë˛¤í¸ í¸ë¤ëŦë ėŖŧ ėėŠ íëĄęˇ¸ë¨ėėë§ ėëíŠëë¤. [íė ėėŠ íëĄęˇ¸ë¨ - ë§ė´í¸](./sub-applications.md){.internal-link target=_blank}ėėë ėëíė§ ėėĩëë¤.
+*ėė*ęŗŧ *ėĸ
ëŖ*ëĨŧ ė˛ëĻŦíë ęļėĨ ë°Šë˛ė ėėė ė¤ëĒ
í ëëĄ `FastAPI` ė íëĻŦėŧė´ė
ė `lifespan` 매ę°ëŗėëĨŧ ėŦėŠíë ę˛ė
ëë¤. `lifespan` 매ę°ëŗėëĨŧ ė ęŗĩí늴 `startup`ęŗŧ `shutdown` ė´ë˛¤í¸ í¸ë¤ëŦë ë ė´ė í¸ėļëė§ ėėĩëë¤. `lifespan`ė ėŦėŠí ė§, ëǍë ė´ë˛¤í¸ëĨŧ ėŦėŠí ė§ ė íí´ėŧ í늰 ë ë¤ ėŦėŠí ėë ėėĩëë¤.
+
+ė´ ëļëļė ęą´ëë°ė
ë ėĸėĩëë¤.
///
-## `startup` ė´ë˛¤í¸
+*ėė*ęŗŧ *ėĸ
ëŖ* ëė ė¤íë ė´ ëĄė§ė ė ėíë ë랴 ë°Šë˛ė´ ėėĩëë¤.
+
+ė íëĻŦėŧė´ė
ė´ ėėë기 ė ė ëë ėĸ
ëŖë ë ė¤íí´ėŧ íë ė´ë˛¤í¸ í¸ë¤ëŦ(í¨ė)ëĨŧ ė ėí ė ėėĩëë¤.
-ėėŠ íëĄęˇ¸ë¨ė ėėí기 ė ė ė¤ííë ¤ë í¨ėëĨŧ "startup" ė´ë˛¤í¸ëĄ ė ė¸íŠëë¤:
+ė´ í¨ėë¤ė `async def` ëë ėŧë° `def`ëĄ ė ė¸í ė ėėĩëë¤.
+
+### `startup` ė´ë˛¤í¸
+
+ė íëĻŦėŧė´ė
ė´ ėėë기 ė ė ė¤íëė´ėŧ íë í¨ėëĨŧ ėļę°íë ¤ëŠ´, `"startup"` ė´ë˛¤í¸ëĄ ė ė¸íŠëë¤:
{* ../../docs_src/events/tutorial001.py hl[8] *}
-ė´ ę˛Ŋė° `startup` ė´ë˛¤í¸ í¸ë¤ëŦ í¨ėë ë¨ėí ëĒ ę°ė§ ę°ėŧëĄ ęĩŦėąë `dict` íėė "ë°ė´í°ë˛ ė´ė¤"ëĨŧ ė´ę¸°ííŠëë¤.
+ė´ ę˛Ŋė°, `startup` ė´ë˛¤í¸ í¸ë¤ëŦ í¨ėë "database"ëŧë íëĒŠ(ë¨ė§ `dict`)ė ėŧëļ ę°ėŧëĄ ė´ę¸°ííŠëë¤.
-íë ė´ėė ė´ë˛¤í¸ í¸ë¤ëŦ í¨ėëĨŧ ėļę°í ėë ėėĩëë¤.
+ėŦëŦ ę°ė ė´ë˛¤í¸ í¸ë¤ëŦ í¨ėëĨŧ ėļę°í ė ėėĩëë¤.
-꡸ëĻŦęŗ ėėŠ íëĄęˇ¸ë¨ė ëǍë `startup` ė´ë˛¤í¸ í¸ë¤ëŦę° ėëŖë ëęšė§ ėė˛ė ë°ė§ ėėĩëë¤.
+ė íëĻŦėŧė´ė
ė ëǍë `startup` ė´ë˛¤í¸ í¸ë¤ëŦę° ėëŖë ëęšė§ ėė˛ė ë°ę¸° ėėíė§ ėėĩëë¤.
-## `shutdown` ė´ë˛¤í¸
+### `shutdown` ė´ë˛¤í¸
-ėėŠ íëĄęˇ¸ë¨ė´ ėĸ
ëŖë ë ė¤ííë ¤ë í¨ėëĨŧ ėļę°íë ¤ëŠ´ `"shutdown"` ė´ë˛¤í¸ëĄ ė ė¸íŠëë¤:
+ė íëĻŦėŧė´ė
ė´ ėĸ
ëŖë ë ė¤íëė´ėŧ íë í¨ėëĨŧ ėļę°íë ¤ëŠ´, `"shutdown"` ė´ë˛¤í¸ëĄ ė ė¸íŠëë¤:
{* ../../docs_src/events/tutorial002.py hl[6] *}
-ė´ ėė ėė `shutdown` ė´ë˛¤í¸ í¸ë¤ëŦ í¨ėë `"Application shutdown"`ė´ëŧë í
ė¤í¸ę° ė í `log.txt` íėŧė ėļę°í ę˛ė
ëë¤.
+ėŦ기ė, `shutdown` ė´ë˛¤í¸ í¸ë¤ëŦ í¨ėë `"Application shutdown"`ė´ëŧë í
ė¤í¸ëĨŧ `log.txt` íėŧė 기ëĄíŠëë¤.
/// info | ė ëŗ´
-`open()` í¨ėėė `mode="a"`ë "ėļę°"ëĨŧ ė미íŠëë¤. ë°ëŧė ė´ë¯¸ ėĄ´ėŦíë íėŧė ë´ėŠė ëŽė´ė°ė§ ėęŗ ėëĄė´ ė¤ė ėļę°íŠëë¤.
+`open()` í¨ėėė `mode="a"`ë "ėļę°"ëĨŧ ė미íë¯ëĄ, íėŧė ėë ę¸°ėĄ´ ë´ėŠė ëŽė´ė°ė§ ėęŗ ėëĄė´ ė¤ė´ ėļę°ëŠëë¤.
///
/// tip | í
-ė´ ėė ėėë íėŧęŗŧ ėí¸ėėŠ í기 ėí´ íė´ėŦ íė¤ í¨ėė¸ `open()`ė ėŦėŠíęŗ ėėĩëë¤.
+ė´ ę˛Ŋė°, ė°ëĻŦë íė¤ íė´ėŦ `open()` í¨ėëĨŧ ėŦėŠíėŦ íėŧęŗŧ ėí¸ėėŠíęŗ ėėĩëë¤.
-ë°ëŧė ëė¤íŦė ë°ė´í°ëĨŧ ė°ę¸° ėí´ "ë기"ę° íėí I/O (ė
ë Ĩ/ėļë Ĩ) ėė
ė ėííŠëë¤.
+ë°ëŧė I/O(ė
ėļë Ĩ) ėė
ė´ íŦí¨ëė´ ėė´ ëė¤íŦė 기ëĄëë ę˛ė "기ë¤ëĻŦë" ęŗŧė ė´ íėíŠëë¤.
-꡸ëŦë `open()`ė `async`ė `await`ė ėŦėŠíė§ ė기 ëëŦ¸ė ė´ë˛¤í¸ í¸ë¤ëŦ í¨ėë `async def`ę° ėë íė¤ `def`ëĄ ė ė¸íęŗ ėėĩëë¤.
+íė§ë§ `open()`ė `async`ė `await`ëĨŧ ėŦėŠíė§ ėėĩëë¤.
+
+꡸ëė ė°ëĻŦë ė´ë˛¤í¸ í¸ë¤ëŦ í¨ėëĨŧ `async def` ëė ėŧë° `def`ëĄ ė ė¸íŠëë¤.
///
+### `startup`ęŗŧ `shutdown`ė í¨ęģ ėŦėŠ
+
+*ėė*ęŗŧ *ėĸ
ëŖ* ëĄė§ė´ ė°ę˛°ë ę°ëĨėąė´ ëėĩëë¤. ėëĨŧ ë¤ė´, ëŦ´ė¸ę°ëĨŧ ėėí í ëë´ęą°ë, ėėė íëí í í´ė íë ëąė ėė
ė í ė ėėĩëë¤.
+
+ė´ëŦí ėė
ė ëŗëė í¨ėëĄ ė˛ëĻŦí늴 ėëĄ ëĄė§ė´ë ëŗėëĨŧ ęŗĩė íė§ ė기 ëëŦ¸ė ë ė´ë ¤ėė§ëë¤. ę°ë¤ė ė ė ëŗėė ė ėĨíęą°ë ëšėˇí í¸ëĻė ėŦėŠí´ėŧ í ė ėėĩëë¤.
+
+꡸ë 기 ëëŦ¸ė ėėė ė¤ëĒ
í ëëĄ `lifespan`ė ėŦėŠíë ę˛ė´ ęļėĨëŠëë¤.
+
+## 기ė ė ė¸ëļėŦí
+
+í¸ę¸°ėŦ ë§ė ëļë¤ė ėí 기ė ė ė¸ ė¸ëļėŦíė
ëë¤. đ¤
+
+ASGI 기ė ėŦėė ë°ëĨ´ëŠ´, ė´ë Lifespan Protocol ė ėŧëļė´ëа, `startup`ęŗŧ `shutdown`ė´ëŧë ė´ë˛¤í¸ëĨŧ ė ėíŠëë¤.
+
/// info | ė ëŗ´
-ė´ë˛¤í¸ í¸ë¤ëŦė ę´í ë´ėŠė Starlette ė´ë˛¤í¸ ëŦ¸ė ėė ėļę°ëĄ íė¸í ė ėėĩëë¤.
+Starletteė `lifespan` í¸ë¤ëŦė ëí´ ë ėŊęŗ ėļë¤ëŠ´ Starletteė Lifespan ëŦ¸ė ėė íė¸í ė ėėĩëë¤.
+
+ė´ ëŦ¸ėėë ėŊëė ë¤ëĨ¸ ėėėė ėŦėŠí ė ėë lifespan ėíëĨŧ ė˛ëĻŦíë ë°Šë˛ë íŦí¨ëė´ ėėĩëë¤.
///
+
+## ėë¸ ė íëĻŦėŧė´ė
+
+đ¨ ė´ lifespan ė´ë˛¤í¸(`startup`ęŗŧ `shutdown`)ë ëŠė¸ ė íëĻŦėŧė´ė
ė ëí´ėë§ ė¤íë늰, [ėë¸ ė íëĻŦėŧė´ė
- Mounts](sub-applications.md){.internal-link target=_blank}ėë ė¤íëė§ ėėė ė ėíė¸ė.
diff --git a/docs/ko/docs/advanced/sub-applications.md b/docs/ko/docs/advanced/sub-applications.md
new file mode 100644
index 000000000..c5835de15
--- /dev/null
+++ b/docs/ko/docs/advanced/sub-applications.md
@@ -0,0 +1,67 @@
+# íė ėėŠíëĄęˇ¸ë¨ - ë§ė´í¸
+
+ë§ėŊ ę°ę°ė ë
ëĻŊė ė¸ OpenAPIė ëŦ¸ė UIëĨŧ ę°ë ë ę°ė ë
ëĻŊė ė¸ FastAPI ėėŠíëĄęˇ¸ë¨ė´ íėíë¤ëŠ´, ëŠė¸ ė´íëĻŦėŧė´ė
ė íë (ëë ꡸ ė´ėė) íė-ėėŠíëĄęˇ¸ë¨(ë¤)ė âë§ė´í¸"í´ė ėŦėŠí ė ėėĩëë¤.
+
+## **FastAPI** ėėŠíëĄęˇ¸ë¨ ë§ė´í¸
+
+âë§ė´í¸"ė´ë ėė í âë
ëĻŊė ė¸" ėėŠíëĄęˇ¸ë¨ė íšė ę˛ŊëĄė ėļę°íėŦ í´ëš íė ėėŠíëĄęˇ¸ë¨ėė ė ė¸ë *ę˛ŊëĄ ëė*ė íĩí´ í´ëš ę˛ŊëĄ ėëė ėë ëǍë ėė
ë¤ė ė˛ëĻŦí ė ėëëĄ íë ę˛ė ė미íŠëë¤.
+
+### ėĩėë¨ ėėŠíëĄęˇ¸ë¨
+
+ë¨ŧė , ëŠė¸, ėĩėë¨ė **FastAPI** ėėŠíëĄęˇ¸ë¨ęŗŧ ė´ę˛ė *ę˛ŊëĄ ëė*ė ėėąíŠëë¤:
+
+{* ../../docs_src/sub_applications/tutorial001.py hl[3, 6:8] *}
+
+### íė ėėŠíëĄęˇ¸ë¨
+
+ë¤ėėŧëĄ, íė ėėŠíëĄęˇ¸ë¨ęŗŧ ė´ę˛ė *ę˛ŊëĄ ëė*ė ėėąíŠëë¤:
+
+ė´ íė ėėŠíëĄęˇ¸ë¨ė ë ë¤ëĨ¸ íė¤ FastAPI ėėŠíëĄęˇ¸ë¨ė
ëë¤. ë¤ë§ ė´ę˛ė âë§ė´í¸âë ę˛ė
ëë¤:
+
+{* ../../docs_src/sub_applications/tutorial001.py hl[11, 14:16] *}
+
+### íė ėėŠíëĄęˇ¸ë¨ ë§ė´í¸
+
+ėĩėë¨ ėėŠíëĄęˇ¸ë¨, `app`ė íė ėėŠíëĄęˇ¸ë¨, `subapi`ëĨŧ ë§ė´í¸íŠëë¤.
+
+ė´ ėėėė, íė ėėŠíëĄęˇ¸ë¨ė
ė `/subapi` ę˛ŊëĄė ë§ė´í¸ ë ę˛ė
ëë¤:
+
+{* ../../docs_src/sub_applications/tutorial001.py hl[11, 19] *}
+
+### ėëėŧëĄ ėėąë API ëŦ¸ė íė¸
+
+ė´ė , `uvicorn`ėŧëĄ ëŠė¸ ėėŠíëĄęˇ¸ë¨ė ė¤ííėėė¤. ëšė ė íėŧė´ `main.py`ëŧ늴, ė´ë ę˛ ė¤ííŠëë¤:
+
+
+
+```console
+$ uvicorn main:app --reload
+
+INFO : Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
+```
+
+
+
+꡸ëĻŦęŗ http://127.0.0.1:8000/docs ėė ëŦ¸ėëĨŧ ėŦėėė¤.
+
+ëŠė¸ ėėŠíëĄęˇ¸ë¨ė *ę˛ŊëĄ ëė*ë§ė íŦí¨íë, ëŠė¸ ėėŠíëĄęˇ¸ë¨ė ëí ėë API ëŦ¸ėëĨŧ íė¸í ė ėėĩëë¤:
+
+
+
+ë¤ėėŧëĄ, http://127.0.0.1:8000/subapi/docs ėė íė ėėŠíëĄęˇ¸ë¨ė ëŦ¸ėëĨŧ ėŦėėė¤.
+
+íė ę˛ŊëĄ ė ëėŦ `/subapi` ėëė ė ė¸ë *ę˛ŊëĄ ëė* ė íŦí¨íë, íė ėėŠíëĄęˇ¸ë¨ė ëí ėë API ëŦ¸ėëĨŧ íė¸í ė ėėĩëë¤:
+
+
+
+ë ėŦėŠė ė¸í°íė´ė¤ ė¤ ė´ë íëëĨŧ ėŦėŠí´ėŧíë ę˛Ŋė°, ë¸ëŧė°ė ë íšė ėėŠíëĄęˇ¸ë¨ ëë íė ėėŠíëĄęˇ¸ë¨ęŗŧ ę°ę° íĩė í ė ė기 ëëŦ¸ė ėŦë°ëĨ´ę˛ ëėí ę˛ė
ëë¤.
+
+### 기ė ė ė¸ëļėŦí: `root_path`
+
+ėė ė¤ëĒ
ë ę˛ęŗŧ ę°ė´ íė ėėŠíëĄęˇ¸ë¨ė ë§ė´í¸íë ę˛Ŋė°, FastAPIë `root_path`ëŧęŗ íë ASGI ëĒ
ė¸ė 매ėģ¤ëėĻė ėŦėŠíėŦ íė ėėŠíëĄęˇ¸ë¨ė ëí ë§ė´í¸ ę˛ŊëĄ íĩė ė ė˛ëĻŦíŠëë¤.
+
+ė´ëĨŧ íĩí´, íė ėėŠíëĄęˇ¸ë¨ė ëŦ¸ė UIëĨŧ ėí´ ę˛ŊëĄ ė ëėŦëĨŧ ėŦėŠí´ėŧ íë¤ë ėŦė¤ė ė¸ė§íŠëë¤.
+
+íė ėėŠíëĄęˇ¸ë¨ėë ėė ë¤ëĨ¸ íė ėėŠíëĄęˇ¸ë¨ė ë§ė´í¸íë ę˛ė´ ę°ëĨí늰 FastAPIę° ëǍë `root_path` ë¤ė ėëė ėŧëĄ ė˛ëĻŦí기 ëëŦ¸ė ëǍë ę˛ė ėŦë°ëĨ´ę˛ ëėí ę˛ė
ëë¤.
+
+`root_path`ė ė´ę˛ė ėŦėŠíë ë°Šë˛ė ëí´ėë [íëĄėė ëˇë¨](./behind-a-proxy.md){.internal-link target=_blank} ėšė
ėė ë°°ė¸ ė ėėĩëë¤.
diff --git a/docs/ko/docs/help-fastapi.md b/docs/ko/docs/help-fastapi.md
index 932952b4a..06435d4bb 100644
--- a/docs/ko/docs/help-fastapi.md
+++ b/docs/ko/docs/help-fastapi.md
@@ -1,162 +1,269 @@
-* # FastAPI ė§ė - ëėë§ ë°ę¸°
+# FastAPI ė§ė - ëė ë°ę¸°
- **FastAPI** ę° ë§ėė ëėëė?
+**FastAPI** ę° ë§ėė ëėëė?
- FastAPI, ë¤ëĨ¸ ėŦėŠė, ę°ë°ėëĨŧ ėėíęŗ ėļėŧė ę°ė?
+FastAPI, ë¤ëĨ¸ ėŦėŠė, ę°ë°ėëĨŧ ėėíęŗ ėļėŧė ę°ė?
- íšė **FastAPI** ė ëí´ ëėė´ íėíė ę°ė?
+íšė **FastAPI** ė ëí´ ëėė´ íėíė ę°ė?
- ėėŖŧ ę°ë¨íę˛ ėėí ė ėėĩëë¤ (ëĒ ë˛ė í´ëĻë§ėŧëĄ).
+ėėŖŧ ę°ë¨íę˛ ėėí ė ėėĩëë¤ (ëĒ ë˛ė í´ëĻë§ėŧëĄ).
- ëí ëėė ë°ė ė ėë ë°Šë˛ë ëĒ ę°ė§ ėėĩëë¤.
+ëí ëėė ë°ė ė ėë ë°Šë˛ë ëĒ ę°ė§ ėėĩëë¤.
- ## ë´ė¤ë í° ęĩŦë
+## ë´ė¤ë í° ęĩŦë
- [**FastAPIė ėšęĩŦ** ë´ė¤ë í°](https://github.com/fastapi/fastapi/blob/master/newsletter)ëĨŧ ęĩŦë
íėŦ ėĩė ė ëŗ´ëĨŧ ė ė§í ė ėėĩëë¤{.internal-link target=_blank}:
+[**FastAPI and friends** ë´ė¤ë í°](newsletter.md){.internal-link target=\_blank}ëĨŧ ęĩŦë
íėŦ ėĩė ė ëŗ´ëĨŧ ė ė§í ė ėėĩëë¤:
- - FastAPI ė ꡸ ėšęĩŦë¤ė ëí ë´ė¤ đ
- - ę°ė´ë đ
- - íšė§ â¨
- - í기ė ė¸ ëŗí đ¨
- - íęŗŧ ėë š â
+* FastAPI and friendsė ëí ë´ė¤ đ
+* ę°ė´ë đ
+* 기ëĨ â¨
+* í기ė ė¸ ëŗí đ¨
+* íęŗŧ ėë š â
- ## í¸ėí°ėė FastAPI íëĄė°í기
+## í¸ėí°ėė FastAPI íëĄė°í기
- [Follow @fastapi on **Twitter**](https://twitter.com/fastapi) ëĨŧ íëĄė°íėŦ **FastAPI** ė ëí ėĩė ë´ė¤ëĨŧ ėģė ė ėėĩëë¤. đĻ
+**Twitter**ė @fastapiëĨŧ íëĄė° íėŦ **FastAPI** ė ëí ėĩė ë´ė¤ëĨŧ ėģė ė ėėĩëë¤. đĻ
- ## Star **FastAPI** in GitHub
+## Star **FastAPI** in GitHub
- GitHubėė FastAPIė "star"ëĨŧ ëļėŧ ė ėėĩëë¤(ė¤ëĨ¸ėĒŊ ėë¨ė star ë˛íŧė í´ëĻ): https://github.com/fastapi/fastapi. âī¸
+GitHubėė FastAPIė "star"ëĨŧ ëļėŧ ė ėėĩëë¤ (ė¤ëĨ¸ėĒŊ ėë¨ė star ë˛íŧė í´ëĻ): https://github.com/fastapi/fastapi . âī¸
- ė¤íëĨŧ ëëĻŧėŧëĄė¨, ë¤ëĨ¸ ėŦėŠėë¤ė´ ėĸ ë ėŊę˛ ė°žė ė ėęŗ , ë§ė ėŦëë¤ėę˛ ė ėŠí ę˛ėė ëíëŧ ė ėėĩëë¤.
+ė¤íëĨŧ ëëĻŧėŧëĄė¨, ë¤ëĨ¸ ėŦėŠėë¤ė´ ėĸ ë ėŊę˛ ė°žė ė ėęŗ , ë§ė ėŦëë¤ėę˛ ė ėŠí ę˛ėė ëíëŧ ė ėėĩëë¤.
- ## GitHub ė ėĨėėė ëĻ´ëĻŦėĻ íė¸
+## GitHub ė ėĨėėė ëĻ´ëĻŦėĻ íė¸
- GitHubėė FastAPIëĨŧ "watch"í ė ėėĩëë¤ (ė¤ëĨ¸ėĒŊ ėë¨ watch ë˛íŧė í´ëĻ): https://github.com/fastapi/fastapi. đ
+GitHubėė FastAPIëĨŧ "watch"í ė ėėĩëë¤ (ė¤ëĨ¸ėĒŊ ėë¨ watch ë˛íŧė í´ëĻ): https://github.com/fastapi/fastapi . đ
- ėŦ기ė "Releases only"ė ė íí ė ėėĩëë¤.
+ėŦ기ė "Releases only"ė ė íí ė ėėĩëë¤.
- ė´ë ę˛í늴, **FastAPI** ė ë˛ęˇ¸ ėė ë° ėëĄė´ 기ëĨė ęĩŦí ëąė ėëĄė´ ėëŖ (ėĩė ë˛ė )ė´ ėė ëë§ë¤ (ė´ëŠėŧ) íĩė§ëĨŧ ë°ė ė ėėĩëë¤.
+ė´ë ę˛í늴, **FastAPI** ė ë˛ęˇ¸ ėė ë° ėëĄė´ 기ëĨė ęĩŦí ëąė ėëĄė´ ėëŖ (ėĩė ë˛ė )ė´ ėė ëë§ë¤ (ė´ëŠėŧ) íĩė§ëĨŧ ë°ė ė ėėĩëë¤.
- ## ę°ë°ėėė ė°ę˛°
+## ę°ë°ėėė ė°ę˛°
- ę°ë°ėė¸ [me (SebastiÃĄn RamÃrez / `tiangolo`)](https://tiangolo.com/) ė ė°ëŊė 뎍í ė ėėĩëë¤.
+ę°ë°ė(SebastiÃĄn RamÃrez / `tiangolo`) ė ė°ëŊė 뎍í ė ėėĩëë¤.
- ėŦëŦëļė í ė ėėĩëë¤:
+ėŦëŦëļė í ė ėėĩëë¤:
- - [**GitHub**ėė íëĄė°í기](https://github.com/tiangolo).
- - ëšė ėę˛ ëėė´ ë ė ė ë¤ëĨ¸ ė¤íėė¤ íëĄė í¸ëĨŧ íė¸íėėė¤.
- - ėëĄė´ ė¤íėė¤ íëĄė í¸ëĨŧ ë§ë¤ėė ë íė¸íë ¤ëŠ´ íëĄė° íėėė¤.
+* **GitHub**ėė íëĄė°í기. .
+ * ëšė ėę˛ ëėė´ ë ė ė ë¤ëĨ¸ ė¤íėė¤ íëĄė í¸ëĨŧ íė¸íėėė¤.
+ * ėëĄė´ ė¤íėė¤ íëĄė í¸ëĨŧ ë§ë¤ėė ë íė¸íë ¤ëŠ´ íëĄė° íėėė¤.
+* **Twitter** ëë Mastodon ėė íëĄė°í기.
+ * FastAPIė ėŦėŠ ėŠëëĨŧ ėë ¤ėŖŧė¸ė (꡸ę˛ė ëŖë ę˛ė ėĸėíŠëë¤).
+ * ë°íë ėëĄė´ í´ ėļė ėėė ë°ėëŗ´ėėė¤.
+ * **Twitter**ė @fastapiëĨŧ íëĄė° (ëŗë ęŗė ėė) í ė ėėĩëë¤.
+* **LinkedIn**ėė íëĄė°í기. .
+ * ėëĄė´ í´ė ë°íë ėļė ėėė ë°ėëŗ´ėėė¤. (ë¨, TwitterëĨŧ ë ėėŖŧ ėŦėŠíŠëë¤ đ¤ˇââ).
+* **Dev.to** ëë **Medium** ėė ė ę° ėėąí ë´ėŠė ėŊė´ ëŗ´ėėė¤ (ëë íëĄė°).
+ * ë¤ëĨ¸ 기ėŦë ėė´ëė´ë¤ė ėŊęŗ , ė ę° ë§ë¤ė´ėë í´ė ëí´ėë ėŊėŧėėė¤.
+ * ėëĄė´ 기ėŦëĨŧ ėŊ기 ėí´ íëĄė° íėėė¤.
- - [**Twitter**ėė íëĄė°í기](https://twitter.com/tiangolo).
- - FastAPIė ėŦėŠ ėŠëëĨŧ ėë ¤ėŖŧė¸ė (꡸ę˛ė ëŖë ę˛ė ėĸėíŠëë¤).
- - ë°í ëë ėëĄė´ í´ ėļėí ë ë¤ėŧėėė¤.
- - [follow @fastapi on Twitter](https://twitter.com/fastapi) (ëŗë ęŗė ėė) í ė ėėĩëë¤.
+## **FastAPI**ė ëí í¸ė
- - [**Linkedin**ėėė ė°ę˛°](https://www.linkedin.com/in/tiangolo/).
- - ėëĄė´ í´ė ë°íë ëĻ´ëĻŦė¤ëĨŧ ë¤ė ė ėėĩëë¤ (ë¨, TwitterëĨŧ ë ėėŖŧ ėŦėŠíŠëë¤ đ¤ˇââ).
+**FastAPI**ė ëí´ í¸ė íęŗ FastAPIę° ë§ėė ëë ė´ė ëĨŧ ėë ¤ėŖŧė¸ė. đ
- - [**Dev.to**](https://dev.to/tiangolo) ëë [**Medium**](https://medium.com/@tiangolo)ėė ė ę° ėėąí ë´ėŠė ėŊė´ ëŗ´ėėė¤(ëë íëĄė°).
- - ë¤ëĨ¸ 기ėŦë ėė´ëė´ë¤ė ėŊęŗ , ė ę° ë§ë¤ė´ėë í´ė ëí´ėë ėŊėŧėėė¤.
- - ėëĄė´ 기ėŦëĨŧ ėŊ기 ėí´ íëĄė° íėėė¤.
+**FastAPI**ę° ė´ëģę˛ ėŦėŠëęŗ ėëė§, ė´ë¤ ė ė´ ë§ėė ë¤ėëė§, ė´ë¤ íëĄė í¸/íėŦėė ėŦėŠíęŗ ėëė§ ëąė ëí´ ëŖęŗ ėļėĩëë¤.
- ## **FastAPI**ė ëí í¸ė
+## FastAPIė íŦíí기
- [**FastAPI**ė ëí´ í¸ė](https://twitter.com/compose/tweet?text=I'm loving @fastapi because... https://github.com/fastapi/fastapi) íęŗ FastAPIę° ë§ėė ëë ė´ė ëĨŧ ėë ¤ėŖŧė¸ė. đ
+* Slantėė **FastAPI** ė ëí´ íŦííėėė¤ .
+* AlternativeToėė **FastAPI** ė ëí´ íŦííėėė¤ .
+* StackShareėė **FastAPI** ė ëí´ íŦííėėė¤ .
- **FastAPI**ę° ė´ëģę˛ ėŦėŠëęŗ ėëė§, ė´ë¤ ė ė´ ë§ėė ë¤ėëė§, ė´ë¤ íëĄė í¸/íėŦėė ėŦėŠíęŗ ėëė§ ëąė ëí´ ëŖęŗ ėļėĩëë¤.
+## GitHubė ė´ėëĄ ë¤ëĨ¸ėŦë ë기
- ## FastAPIė íŦíí기
+ë¤ëĨ¸ ėŦëë¤ė ė§ëŦ¸ė ëėė ė¤ ė ėėĩëë¤:
- - [Slantėė **FastAPI** ė ëí´ íŦííėėė¤](https://www.slant.co/options/34241/~fastapi-review).
- - [AlternativeTo**FastAPI** ė ëí´ íŦííėėė¤](https://alternativeto.net/software/fastapi/).
+* GitHub ëė¤ėģ¤ė
+* GitHub ė´ė
- ## GitHubė ė´ėëĄ ë¤ëĨ¸ėŦë ë기
+ë§ė ę˛Ŋė°, ėŦëŦëļė ė´ë¯¸ ꡸ ė§ëŦ¸ė ëí ëĩė ėęŗ ėė ėë ėėĩëë¤. đ¤
- [ėĄ´ėŦíë ė´ė](https://github.com/fastapi/fastapi/issues)ëĨŧ íė¸íęŗ ęˇ¸ę˛ė ėëíęŗ ëėė¤ ė ėėĩëë¤. ëëļëļė ę˛Ŋė° ė´ë¯¸ ëĩė ėęŗ ėë ė§ëŦ¸ė
ëë¤. đ¤
+ë§ėŊ ë§ė ėŦëë¤ė ëŦ¸ė ëĨŧ ëėė¤ë¤ëŠ´, ęŗĩėė ė¸ [FastAPI ė ëŦ¸ę°](fastapi-people.md#fastapi-experts){.internal-link target=\_blank} ę° ë ę˛ė
ëë¤. đ
- ë§ė ėŦëë¤ė ëŦ¸ė ëĨŧ ëėė¤ë¤ëŠ´, ęŗĩėė ė¸ [FastAPI ė ëŦ¸ę°](https://github.com/fastapi/fastapi/blob/master/docs/en/docs/fastapi-people.md#experts) ę° ë ė ėėĩëë¤{.internal-link target=_blank}. đ
+ę°ėĨ ė¤ėí ė ė: ėšė íë ¤ęŗ ë
¸ë Ĩíë ę˛ė
ëë¤. ėŦëë¤ė ėĸė ę°ė ėęŗ ė¤ëа, ë§ė ę˛Ŋė° ėĩė ė ë°ŠėėŧëĄ ė§ëŦ¸íė§ ėė ėë ėėĩëë¤. íė§ë§ ėĩëí ėšė íę˛ ëíë ¤ęŗ ë
¸ë Ĩíė¸ė. đ¤
- ## GitHub ė ėĨė ëŗ´ę¸°
+**FastAPI** ėģ¤ëޤëí°ė ëĒŠíë ėšė íęŗ íėíë ę˛ė
ëë¤. ëėė, ę´´ëĄíė´ë ëŦ´ëĄí íëė ë°ėë¤ė´ė§ ë§ė¸ė. ė°ëĻŦë ėëĄëĨŧ ëë´ėŧ íŠëë¤.
- GitHubėė FastAPIëĨŧ "watch"í ė ėėĩëë¤ (ė¤ëĨ¸ėĒŊ ėë¨ watch ë˛íŧė í´ëĻ): https://github.com/fastapi/fastapi. đ
+---
- "Releases only" ëė "Watching"ė ė íí늴 ë¤ëĨ¸ ėŦėŠėę° ėëĄė´ issueëĨŧ ėėąí ë ėëĻŧė´ ėė ëŠëë¤.
+ë¤ëĨ¸ ėŦëë¤ė ė§ëŦ¸ (ëė¤ėģ¤ė
ëë ė´ėėė) í´ę˛°ė ëė¸ ė ėë ë°Šë˛ė ë¤ėęŗŧ ę°ėĩëë¤.
- ęˇ¸ë° ë¤ė ė´ë° issuesëĨŧ í´ę˛° í ė ėëëĄ ëėė ė¤ ė ėėĩëë¤.
+### ė§ëŦ¸ ė´í´í기
- ## ė´ė ėėąí기
+* ė§ëŦ¸íë ėŦëė´ ę°ė§ **ëĒŠė **ęŗŧ ėŦėŠ ėŦëĄëĨŧ ė´í´í ė ėëė§ íė¸íė¸ė.
- GitHub ė ėĨėė [ėëĄė´ ė´ė ėėą](https://github.com/fastapi/fastapi/issues/new/choose) ė í ė ėėĩëë¤, ėëĨŧë¤ëŠ´ ë¤ėęŗŧ ę°ėĩëë¤:
+* ė§ëŦ¸ (ëëļëļė ė§ëŦ¸ė
ëë¤)ė´ **ëĒ
í**íė§ íė¸íė¸ė.
- - **ė§ëŦ¸**ė íęą°ë **ëŦ¸ė **ė ëí´ ė§ëŦ¸íŠëë¤.
- - ėëĄė´ **기ëĨ**ė ė ė íŠëë¤.
+* ë§ė ę˛Ŋė°, ėŦėŠėę° ę°ė í í´ę˛°ėą
ė ëí ė§ëŦ¸ė íė§ë§, ë **ėĸė** í´ę˛°ėą
ė´ ėė ė ėėĩëë¤. ëŦ¸ė ė ėŦėŠ ėŦëĄëĨŧ ë ė ė´í´í늴 ë ëė **ëėė ė¸ í´ę˛°ėą
**ė ė ėí ė ėėĩëë¤.
- **ė°¸ęŗ **: ë§ėŊ ė´ėëĨŧ ėėąíë¤ëŠ´, ė ë ėŦëŦëļėę˛ ë¤ëĨ¸ ėŦëë¤ė ëėëŦëŧęŗ ëļíí ę˛ė
ëë¤. đ
+* ė§ëŦ¸ė ė´í´í ė ėë¤ëŠ´, ë **ėė¸í ė ëŗ´**ëĨŧ ėė˛íė¸ė.
- ## Pull RequestëĨŧ ë§ëėėė¤
+### ëŦ¸ė ėŦíí기
- Pull RequestsëĨŧ ė´ėŠíėŦ ėė¤ėŊëė [ėģ¨í¸ëĻŦ롰í¸](https://github.com/fastapi/fastapi/blob/master/docs/en/docs/contributing.md){.internal-link target=_blank} í ė ėėĩëë¤. ėëĨŧ ë¤ëŠ´ ë¤ėęŗŧ ę°ėĩëë¤:
+ëëļëļė ę˛Ŋė°, ė§ëŦ¸ė ė§ëŦ¸ėė **ėëŗ¸ ėŊë**ė ę´ë ¨ė´ ėėĩëë¤.
- - ëŦ¸ėėė ė°žė ė¤íëĨŧ ėė í ë.
+ë§ė ę˛Ŋė°, ėŊëė ėŧëļë§ ëŗĩėŦí´ė ėŦëĻŦė§ë§, ꡸ę˛ë§ėŧëĄë **ëŦ¸ė ëĨŧ ėŦí**í기ė ėļŠëļíė§ ėėĩëë¤.
- - FastAPIëĨŧ [í¸ė§íėŦ](https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml) ėėąíęą°ë ė°žė ëŦ¸ė, ëšëė¤ ëë íėēė¤í¸ëĨŧ ęŗĩė í ë.
+* ė§ëŦ¸ėėę˛ ėĩėíė ėŦí ę°ëĨí ėė ëĨŧ ė ęŗĩí´ëŦëŧęŗ ėė˛íė¸ė. ė´ë ę˛ í늴 ėŊëëĨŧ **ëŗĩėŦ-ëļėŦëŖę¸°**íėŦ ė§ė ė¤ííęŗ , ëėŧí ė¤ëĨë ëėė íė¸íęą°ë ėŦėŠ ėŦëĄëĨŧ ë ė ė´í´í ė ėėĩëë¤.
- - í´ëš ėšė
ė ėė ëļëļė ë§íŦëĨŧ ėļę°íëė§ íė¸íėėė¤.
+* ë꡸ëŦė´ ë§ėė´ ë ë¤ëŠ´, ëŦ¸ė ė¤ëĒ
ë§ė 기ë°ėŧëĄ ė§ė **ėė ëĨŧ ë§ë¤ė´**ëŗŧ ėë ėėĩëë¤. íė§ë§, ė´ë ėę°ė´ ë§ė´ 깸ëĻ´ ė ėėŧë¯ëĄ, ë¨ŧė ė§ëŦ¸ė ëĒ
íí í´ëŦëŧęŗ ėė˛íë ę˛ė´ ėĸėĩëë¤.
- - ëšė ė ė¸ė´ëĄ [ëŦ¸ė ë˛ėíëë°](https://github.com/fastapi/fastapi/blob/master/docs/en/docs/contributing.md#translations){.internal-link target=_blank} 기ėŦí ë.
+### í´ę˛°ėą
ė ėí기
- - ëí ë¤ëĨ¸ ėŦėŠėę° ë§ë ë˛ėė ę˛í íëë° ëėė ė¤ ėë ėėĩëë¤.
+* ė§ëŦ¸ė ėļŠëļí ė´í´í íėë ę°ëĨí **ëĩëŗ**ė ė ęŗĩí ė ėėĩëë¤.
- - ėëĄė´ ëŦ¸ėė ėšė
ė ė ėí ë.
+* ë§ė ę˛Ŋė°, ė§ëŦ¸ėė **ęˇŧëŗ¸ė ė¸ ëŦ¸ė ë ėŦėŠ ėŦëĄ**ëĨŧ ė´í´íë ę˛ė´ ė¤ėíŠëë¤. ꡸ë¤ė´ ėëíë ë°Šë˛ëŗ´ë¤ ë ëė í´ę˛°ėą
ė´ ėė ė ė기 ëëŦ¸ė
ëë¤.
- - ę¸°ėĄ´ ëŦ¸ė /ë˛ęˇ¸ëĨŧ ėė í ë.
+### í´ę˛° ėė˛í기
- - ėëĄė´ featureëĨŧ ėļę°í ë.
+ė§ëŦ¸ėę° ëĩëŗė íė¸íęŗ ë늴, ëšė ė´ ëŦ¸ė ëĨŧ í´ę˛°íė ę°ëĨėąė´ ëėĩëë¤. ėļííŠëë¤, **ëšė ė ėė
ė
ëë¤**! đϏ
- ## ėąí
ė ė°¸ėŦíėėė¤
+* ė´ė ëŦ¸ė ëĨŧ í´ę˛°íë¤ëŠ´, ė§ëŦ¸ėėę˛ ë¤ėė ėė˛í ė ėėĩëë¤.
- đĨ [ëė¤ėŊë ėąí
ėë˛](https://discord.gg/VQjSZaeJmf) đĨ ė ę°ė
íęŗ FastAPI ėģ¤ëޤëí°ėė ë¤ëĨ¸ ėŦëë¤ęŗŧ ė´ė¸ëĻŦė¸ė.
+ * GitHub ëė¤ėģ¤ė
ėė: ëę¸ė **ëĩëŗ**ėŧëĄ íėíëëĄ ėė˛íė¸ė.
+ * GitHub ė´ėėė: ė´ėëĨŧ **ëĢėëŦëŧęŗ ** ėė˛íė¸ė.
- /// tip
+## GitHub ė ėĨė ëŗ´ę¸°
- ė§ëŦ¸ė´ ėë ę˛Ŋė°, [GitHub ė´ė ](https://github.com/fastapi/fastapi/issues/new/choose) ėė ė§ëŦ¸íėėė¤, [FastAPI ė ëŦ¸ę°](https://github.com/fastapi/fastapi/blob/master/docs/en/docs/fastapi-people.md#experts) ė ëėė ë°ė ę°ëĨėąė´ ëėĩëë¤{.internal-link target=_blank} .
+GitHubėė FastAPIëĨŧ "watch"í ė ėėĩëë¤ (ė¤ëĨ¸ėĒŊ ėë¨ watch ë˛íŧė í´ëĻ): https://github.com/fastapi/fastapi . đ
- ///
+"Releases only" ëė "Watching"ė ė íí늴, ėëĄė´ ė´ėë ė§ëŦ¸ė´ ėėąë ë ėëĻŧė ë°ė ė ėėĩëë¤. ëí, íšė íę˛ ėëĄė´ ė´ė, ëė¤ėģ¤ė
, PR ëąë§ ėëĻŧ ë°ëëĄ ė¤ė í ėë ėėĩëë¤.
- ```
- ë¤ëĨ¸ ėŧë°ė ė¸ ëíėėë§ ėąí
ė ėŦėŠíėėė¤.
- ```
+ęˇ¸ë° ë¤ė ė´ë° ė´ėë¤ė í´ę˛° í ė ėëëĄ ëėė ė¤ ė ėėĩëë¤.
- ę¸°ėĄ´ [ė§í° ėąí
](https://gitter.im/fastapi/fastapi) ė´ ėė§ë§ ėąëęŗŧ ęŗ ę¸ę¸°ëĨė´ ėė´ė ëíëĨŧ íę¸°ę° ėĄ°ę¸ ė´ë ĩ기 ëëŦ¸ė ė§ę¸ė ëė¤ėŊëę° ęļėĨëë ėė¤í
ė
ëë¤.
+## ė´ė ėėąí기
- ### ė§ëŦ¸ė ėí´ ėąí
ė ėŦėŠíė§ ë§ėėė¤
+GitHub ė ėĨėė ėëĄė´ ė´ė ėėą ė í ė ėėĩëë¤, ėëĨŧë¤ëŠ´ ë¤ėęŗŧ ę°ėĩëë¤:
- ėąí
ė ë ë§ė "ėė ëĄė´ ëí"ëĨŧ íėŠí기 ëëŦ¸ė, ëëŦ´ ėŧë°ė ė¸ ė§ëŦ¸ė´ë ëëĩí기 ė´ë ¤ė´ ė§ëŦ¸ė ėŊę˛ ė§ëŦ¸ė í ė ėėŧë¯ëĄ, ëĩëŗė ë°ė§ ëĒģí ė ėėĩëë¤.
+* **ė§ëŦ¸**ė íęą°ë **ëŦ¸ė **ė ëí´ ė§ëŦ¸íŠëë¤.
+* ėëĄė´ **기ëĨ**ė ė ė íŠëë¤.
- GitHub ė´ėėėė í
íëĻŋė ėŦë°ëĨ¸ ė§ëŦ¸ė ėėąíëëĄ ėë´íėŦ ë ėŊę˛ ėĸė ëĩëŗė ėģęą°ë ė§ëŦ¸í기 ė ė ė¤ė¤ëĄ ëŦ¸ė ëĨŧ í´ę˛°í ėë ėėĩëë¤. ꡸ëĻŦęŗ GitHubėėë ėę°ė´ ėĄ°ę¸ ęą¸ëĻŦëëŧë íė ëǍë ę˛ė ëĩí ė ėėĩëë¤. ėąí
ėė¤í
ėėë ę°ė¸ė ėŧëĄ ęˇ¸ë ę˛ í ė ėėĩëë¤. đ
+**ė°¸ęŗ **: ë§ėŊ ė´ėëĨŧ ėėąíë¤ëŠ´, ė ë ėŦëŦëļėę˛ ë¤ëĨ¸ ėŦëë¤ė ëėëŦëŧęŗ ëļíí ę˛ė
ëë¤. đ
- ėąí
ėė¤í
ėėė ëí ëí GitHubėė ė˛ëŧ ėŊę˛ ę˛ėí ė ė기 ëëŦ¸ė ëí ė¤ė ė§ëŦ¸ęŗŧ ëĩëŗė´ ėė¤ë ė ėėĩëë¤. ꡸ëĻŦęŗ GitHub ė´ėė ėë ę˛ë§ [FastAPI ė ëŦ¸ę°](https://github.com/fastapi/fastapi/blob/master/docs/en/docs/fastapi-people.md#experts)ę° ëë ę˛ėŧëĄ ę°ėŖŧëë¯ëĄ{.internal-link target=_blank} , GitHub ė´ėėė ë ë§ė ę´ėŦė ë°ė ę˛ė
ëë¤.
+## Pull Requests ëĻŦ롰í기
- ë°ëŠ´, ėąí
ėė¤í
ėë ėė˛ ëĒ
ė ėŦėŠėę° ė기 ëëŦ¸ė, ęą°ė íė ëí ėëëĨŧ ė°žė ę°ëĨėąė´ ëėĩëë¤. đ
+ë¤ëĨ¸ ėŦëë¤ė pull requestëĨŧ ëĻŦ롰íë ë° ëėė ė¤ ė ėėĩëë¤.
- ## ę°ë°ė ė¤í°ėę° ëėėė¤
+ë¤ė íë˛ ë§íė§ë§, ėĩëí ėšė íę˛ ëĻŦëˇ°í´ ėŖŧė¸ė. đ¤
- [GitHub ė¤í°ė](https://github.com/sponsors/tiangolo) ëĨŧ íĩí´ ę°ë°ėëĨŧ ę˛Ŋė ė ėŧëĄ ė§ėí ė ėėĩëë¤.
+---
- ę°ėŦíë¤ë ë§ëĄ ėģ¤íŧëĨŧ âī¸ íė ėŦė¤ ė ėėĩëë¤. đ
+Pull RrquestëĨŧ ëĻŦ롰í ë ęŗ ë ¤í´ėŧ í ėŦíęŗŧ ë°Šë˛ė ë¤ėęŗŧ ę°ėĩëë¤:
- ëí FastAPIė ė¤ë˛ ëë ęŗ¨ë ė¤í°ėę° ë ė ėėĩëë¤. đ
đ
+### ëŦ¸ė ė´í´í기
- ## FastAPIëĨŧ ę°ííë ëęĩŦė ė¤í°ėę° ëėėė¤
+* ë¨ŧė , í´ëš pull requestę° í´ę˛°íë ¤ë **ëŦ¸ė ëĨŧ ė´í´íëė§** íė¸íė¸ė. GitHub ëė¤ėģ¤ė
ëë ė´ėėė ë 긴 ë
ŧėę° ėėė ėë ėėĩëë¤.
- ëŦ¸ėėė ëŗ´ėë¯ė´, FastAPIë Starletteęŗŧ Pydantic ëŧë ęą°ė¸ė ė´ęš¨ė íęŗ ėėĩëë¤.
+* Pull requestę° íėíė§ ėė ę°ëĨėąë ėėĩëë¤. **ë¤ëĨ¸ ë°Šė**ėŧëĄ ëŦ¸ė ëĨŧ í´ę˛°í ė ėë¤ëŠ´, ꡸ ë°Šë˛ė ė ėíęą°ë ė§ëŦ¸í ė ėėĩëë¤.
- ë¤ėė ė¤í°ėę° ë ė ėėĩëë¤
+### ė¤íėŧė ëëŦ´ ė ę˛Ŋ ė°ė§ ė기
- - [Samuel Colvin (Pydantic)](https://github.com/sponsors/samuelcolvin)
- - [Encode (Starlette, Uvicorn)](https://github.com/sponsors/encode)
+* ėģ¤ë° ëŠėė§ ė¤íėŧ ę°ė ę˛ė ëëŦ´ ė ę˛Ŋ ė°ė§ ėėë ëŠëë¤. ė ë ė§ė ėģ¤ë°ė ėė íėŦ squash and mergeëĨŧ ėíí ę˛ė
ëë¤.
- ------
+* ėŊë ė¤íėŧ ęˇėšë ęąąė í íė ėėĩëë¤. ė´ë¯¸ ėëíë ëęĩŦë¤ė´ ė´ëĨŧ ę˛ėŦíęŗ ėėĩëë¤.
- ę°ėŦíŠëë¤! đ
+ė¤íėŧė´ë ėŧę´ėą ę´ë ¨ ėė˛ė´ íėí ę˛Ŋė°, ė ę° ė§ė ėė˛íęą°ë íėí ëŗę˛Ŋ ėŦíė ėļę° ėģ¤ë°ėŧëĄ ėė í ę˛ė
ëë¤.
+
+### ėŊë íė¸í기
+
+* ėŊëëĨŧ ėŊęŗ , **ë
ŧëĻŦė ėŧëĄ íëš**íė§ íė¸í í ëĄėģŦėė ė¤ííėŦ ëŦ¸ė ę° í´ę˛°ëëė§ íė¸íė¸ė.
+
+* ęˇ¸ë° ë¤ė, íė¸íë¤ęŗ **ëę¸**ė ë¨ę˛¨ ėŖŧė¸ė. ꡸ëėŧ ė ę° ę˛í íėė ė ė ėėĩëë¤.
+
+/// info
+
+ëļííë, ė ę° ë¨ėí ėŦëŦ ę°ė ėšė¸ë§ėŧëĄ PRė ė ëĸ°í ėë ėėĩëë¤.
+
+3ę°, 5ę° ė´ėė ėšė¸ė´ ëŦëϰ PRė´ ė¤ė ëĄë ęš¨ė ¸ ėęą°ë, ë˛ęˇ¸ę° ėęą°ë, ėŖŧėĨíë ëŦ¸ė ëĨŧ í´ę˛°íė§ ëĒģíë ę˛Ŋė°ę° ėŦëŦ ë˛ ėėėĩëë¤. đ
+
+ë°ëŧė, ė ë§ëĄ ėŊëëĨŧ ėŊęŗ ė¤íí ë¤, ëę¸ëĄ íė¸ ë´ėŠė ë¨ę˛¨ ėŖŧë ę˛ė´ ë§¤ė° ė¤ėíŠëë¤. đ¤
+
+///
+
+* PRė ë ë¨ėíę˛ ë§ë¤ ė ėë¤ëŠ´ ꡸ë ę˛ ėė˛í ė ėė§ë§, ëëŦ´ ęšë¤ëĄė¸ íėë ėėĩëë¤. ėŖŧę´ė ė¸ ę˛Ŧí´ę° ë§ė´ ėė ė ė기 ëëŦ¸ė
ëë¤ (꡸ëĻŦęŗ ė ë ė ę˛Ŧí´ę° ėė ęą°ėė đ). ë°ëŧė íĩėŦė ė¸ ëļëļė ė§ė¤íë ę˛ė´ ėĸėĩëë¤.
+
+### í
ė¤í¸
+
+* PRė **í
ė¤í¸**ę° íŦí¨ëė´ ėëė§ íė¸íë ë° ëėė ėŖŧė¸ė.
+
+* PRė ė ėŠí기 ė ė í
ė¤í¸ę° **ė¤í¨**íëė§ íė¸íė¸ė. đ¨
+
+* PRė ė ėŠí í í
ė¤í¸ę° **íĩęŗŧ**íëė§ íė¸íė¸ė. â
+
+* ë§ė PRėë í
ė¤í¸ę° ėėĩëë¤. í
ė¤í¸ëĨŧ ėļę°íëëĄ **ė기**ėėŧė¤ ėë ėęŗ , ė§ė í
ė¤í¸ëĨŧ **ė ė**í ėë ėėĩëë¤. ė´ë ėę°ė´ ë§ė´ ėėëë ëļëļ ė¤ íëė´ëа, ꡸ ëļëļė ë§ė´ ëėė¤ ė ėėĩëë¤.
+
+* ꡸ëĻŦęŗ ėëí ë´ėŠė ëę¸ëĄ ë¨ę˛¨ėŖŧė¸ė. ꡸ëŦ늴 ė ę° íė¸íë¤ë 깸 ė ė ėėĩëë¤. đ¤
+
+## Pull RequestëĨŧ ë§ëėėė¤
+
+Pull RequestsëĨŧ ė´ėŠíėŦ ėė¤ėŊëė [ėģ¨í¸ëĻŦ롰í¸](contributing.md){.internal-link target=\_blank} í ė ėėĩëë¤. ėëĨŧ ë¤ëŠ´ ë¤ėęŗŧ ę°ėĩëë¤:
+
+* ëŦ¸ėėė ë°ę˛Ŧí ė¤íëĨŧ ėė í ë.
+* FastAPI ę´ë ¨ ëŦ¸ė, ëšëė¤ ëë íėēė¤í¸ëĨŧ ėėąíęą°ë ë°ę˛ŦíėŦ ė´ íėŧė í¸ė§íėŦ ęŗĩė í ë.
+ * í´ëš ėšė
ė ėė ëļëļė ë§íŦëĨŧ ėļę°í´ėŧ íŠëë¤.
+* ëšė ė ė¸ė´ëĄ [ëŦ¸ė ë˛ėíëë°](contributing.md#translations){.internal-link target=\_blank} 기ėŦí ë.
+ * ë¤ëĨ¸ ėŦëė´ ėėąí ë˛ėė ę˛í íë ę˛ë ëė¸ ė ėėĩëë¤.
+* ėëĄė´ ëŦ¸ėė ėšė
ė ė ėí ë.
+* ę¸°ėĄ´ ëŦ¸ė /ë˛ęˇ¸ëĨŧ ėė í ë.
+ * í
ė¤í¸ëĨŧ ë°ëė ėļę°í´ėŧ íŠëë¤.
+* ėëĄė´ featureëĨŧ ėļę°í ë.
+ * í
ė¤í¸ëĨŧ ë°ëė ėļę°í´ėŧ íŠëë¤.
+ * ę´ë ¨ ëŦ¸ėę° íėíë¤ëŠ´ ë°ëė ėļę°í´ėŧ íŠëë¤.
+
+## FastAPI ė ė§ ę´ëĻŦė ëė ėŖŧ기
+
+**FastAPI**ė ė ė§ ę´ëĻŦëĨŧ ëėėŖŧė¸ė! đ¤
+
+í ėŧė´ ë§ęŗ , ꡸ ė¤ ëëļëļė **ėŦëŦëļ**ė´ í ė ėėĩëë¤.
+
+ė§ę¸ í ė ėë ėŖŧė ėė
ė:
+
+* [GitHubėė ë¤ëĨ¸ ėŦëë¤ė ė§ëŦ¸ė ëė ėŖŧ기](#github_1){.internal-link target=_blank} (ėė ėšė
ė ė°¸ėĄ°íė¸ė).
+* [Pull Request ëĻŦ롰í기](#pull-requests){.internal-link target=_blank} (ėė ėšė
ė ė°¸ėĄ°íė¸ė).
+
+ė´ ë ėė
ė´ **ę°ėĨ ë§ė ėę°ė ėëǍ**íë ėŧė
ëë¤. ꡸ę˛ė´ FastAPI ė ė§ ę´ëĻŦė ėŖŧė ėė
ė
ëë¤.
+
+ė´ ėė
ė ëėėŖŧė ë¤ëŠ´, **FastAPI ė ė§ ę´ëĻŦė ëėė ėŖŧë ę˛**ė´ëа ꡸ę˛ė´ **ë ëš ëĨ´ęŗ ë ė ë°ė íë ę˛**ė ëŗ´ėĨíë ę˛ė
ëë¤. đ
+
+## ėąí
ė ė°¸ėŦíėėė¤
+
+đĨ ëė¤ėŊë ėąí
ėë˛ đĨ ė ę°ė
íęŗ FastAPI ėģ¤ëޤëí°ėė ë¤ëĨ¸ ėŦëë¤ęŗŧ ė´ė¸ëĻŦė¸ė.
+
+/// tip
+
+ė§ëŦ¸ė´ ėë ę˛Ŋė°, GitHub ëė¤ėģ¤ė
ėė ė§ëŦ¸íėėė¤, [FastAPI Experts](fastapi-people.md#fastapi-experts){.internal-link target=_blank} ė ëėė ë°ė ę°ëĨėąė´ ëėĩëë¤.
+
+ë¤ëĨ¸ ėŧë°ė ė¸ ëíėėë§ ėąí
ė ėŦėŠíėėė¤.
+
+///
+
+### ė§ëŦ¸ė ėí´ ėąí
ė ėŦėŠíė§ ë§ėėė¤
+
+ėąí
ė ë ë§ė "ėė ëĄė´ ëí"ëĨŧ íėŠí기 ëëŦ¸ė, ëëŦ´ ėŧë°ė ė¸ ė§ëŦ¸ė´ë ëëĩí기 ė´ë ¤ė´ ė§ëŦ¸ė ėŊę˛ ė§ëŦ¸ė í ė ėėŧë¯ëĄ, ëĩëŗė ë°ė§ ëĒģí ė ėėĩëë¤.
+
+GitHub ė´ėėėė í
íëĻŋė ėŦë°ëĨ¸ ė§ëŦ¸ė ėėąíëëĄ ėë´íėŦ ë ėŊę˛ ėĸė ëĩëŗė ėģęą°ë ė§ëŦ¸í기 ė ė ė¤ė¤ëĄ ëŦ¸ė ëĨŧ í´ę˛°í ėë ėėĩëë¤. ꡸ëĻŦęŗ GitHubėėë ėę°ė´ ėĄ°ę¸ ęą¸ëĻŦëëŧë íė ëǍë ę˛ė ëĩí ė ėėĩëë¤. ėąí
ėė¤í
ėėë ę°ė¸ė ėŧëĄ ęˇ¸ë ę˛ í ė ėėĩëë¤. đ
+
+ėąí
ėė¤í
ėėė ëí ëí GitHubėė ė˛ëŧ ėŊę˛ ę˛ėí ė ė기 ëëŦ¸ė ëí ė¤ė ė§ëŦ¸ęŗŧ ëĩëŗė´ ėė¤ë ė ėėĩëë¤. ꡸ëĻŦęŗ GitHub ė´ėė ėë ę˛ë§ [FastAPI Expert](fastapi-people.md#fastapi-experts){.internal-link target=_blank}ę° ëë ę˛ėŧëĄ ę°ėŖŧëë¯ëĄ, GitHub ė´ėėė ë ë§ė ę´ėŦė ë°ė ę˛ė
ëë¤.
+
+ë°ëŠ´, ėąí
ėė¤í
ėë ėė˛ ëĒ
ė ėŦėŠėę° ė기 ëëŦ¸ė, ęą°ė íė ëí ėëëĨŧ ė°žė ę°ëĨėąė´ ëėĩëë¤. đ
+
+## ę°ë°ė ė¤í°ėę° ëėėė¤
+
+GitHub ė¤í°ė ëĨŧ íĩí´ ę°ë°ėëĨŧ ę˛Ŋė ė ėŧëĄ ė§ėí ė ėėĩëë¤.
+
+ę°ėŦíë¤ë ë§ëĄ ėģ¤íŧëĨŧ âī¸ íė ėŦė¤ ė ėėĩëë¤. đ
+
+ëí FastAPIė ė¤ë˛ ëë ęŗ¨ë ė¤í°ėę° ë ė ėėĩëë¤. đ
đ
+
+## FastAPIëĨŧ ę°ííë ëęĩŦė ė¤í°ėę° ëėėė¤
+
+ëŦ¸ėėė ëŗ´ėë¯ė´, FastAPIë Starletteęŗŧ Pydantic ëŧë ęą°ė¸ė ė´ęš¨ė íęŗ ėėĩëë¤.
+
+ë¤ėė ė¤í°ėę° ë ė ėėĩëë¤
+
+* Samuel Colvin (Pydantic)
+* Encode (Starlette, Uvicorn)
+
+---
+
+ę°ėŦíŠëë¤! đ
diff --git a/docs/ko/docs/index.md b/docs/ko/docs/index.md
index 8b00d90bc..0df2000fa 100644
--- a/docs/ko/docs/index.md
+++ b/docs/ko/docs/index.md
@@ -11,15 +11,18 @@
FastAPI íë ėėíŦ, ęŗ ėąëĨ, ę°í¸í íėĩ, ëš ëĨ¸ ėŊë ėėą, ė¤ëšë íëĄëė
-
-
+
+
-
-
+
+
+
+
+
---
diff --git a/docs/ko/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/ko/docs/tutorial/dependencies/dependencies-with-yield.md
new file mode 100644
index 000000000..ff174937d
--- /dev/null
+++ b/docs/ko/docs/tutorial/dependencies/dependencies-with-yield.md
@@ -0,0 +1,275 @@
+# yieldëĨŧ ėŦėŠíë ėėĄ´ėą
+
+FastAPIë ėė
ėëŖ í ėļę° ë¨ęŗëĨŧ ėííë ėėĄ´ėąė ė§ėíŠëë¤.
+
+ė´ëĨŧ ęĩŦííë ¤ëŠ´ `return` ëė `yield`ëĨŧ ėŦėŠíęŗ , ėļę°ëĄ ė¤íí ë¨ęŗ (ėŊë)ëĨŧ ꡸ ë¤ė ėėąíė¸ė.
+
+/// tip | í
+
+ę° ėėĄ´ėąë§ë¤ `yield`ë í ë˛ë§ ėŦėŠí´ėŧ íŠëë¤.
+
+///
+
+/// note | 기ė ė¸ëļėŦí
+
+ë¤ėęŗŧ í¨ęģ ėŦėŠí ė ėë ëǍë í¨ė:
+
+* `@contextlib.contextmanager` ëë
+* `@contextlib.asynccontextmanager`
+
+ë **FastAPI**ė ėėĄ´ėąėŧëĄ ėŦėŠí ė ėėĩëë¤.
+
+ėŦė¤, FastAPIë ë´ëļė ėŧëĄ ė´ ë ë°ėŊë ė´í°ëĨŧ ėŦėŠíŠëë¤.
+
+///
+
+## `yield`ëĨŧ ėŦėŠíë ë°ė´í°ë˛ ė´ė¤ ėėĄ´ėą
+
+ėëĨŧ ë¤ė´, ė´ ę¸°ëĨė ėŦėŠí늴 ë°ė´í°ë˛ ė´ė¤ ė¸ė
ė ėėąíęŗ ėė
ė´ ëë íė ė¸ė
ė ėĸ
ëŖí ė ėėĩëë¤.
+
+ėëĩė ėėąí기 ė ėë `yield`ëŦ¸ė íŦí¨íėŦ ꡸ ė´ė ė ėŊëë§ė´ ė¤íëŠëë¤:
+
+{* ../../docs_src/dependencies/tutorial007.py hl[2:4] *}
+
+yieldë ę°ė *ę˛ŊëĄ ėė
* ë° ë¤ëĨ¸ ėėĄ´ėąë¤ė ėŖŧė
ëë ę° ė
ëë¤:
+
+{* ../../docs_src/dependencies/tutorial007.py hl[4] *}
+
+`yield`ëŦ¸ ë¤ėė ėŊëë ėëĩė ėėąí í ëŗ´ë´ę¸° ė ė ė¤íëŠëë¤:
+
+{* ../../docs_src/dependencies/tutorial007.py hl[5:6] *}
+
+/// tip | í
+
+`async` í¨ėė ėŧë° í¨ė ëǍë ėŦėŠí ė ėėĩëë¤.
+
+**FastAPI**ë ėŧë° ėėĄ´ėąęŗŧ ë§ė°Ŧę°ė§ëĄ ę°ę°ė í¨ėëĨŧ ėŦë°ëĨ´ę˛ ė˛ëĻŦí ę˛ė
ëë¤.
+
+///
+
+## `yield`ė `try`ëĨŧ ėŦėŠíë ėėĄ´ėą
+
+`yield`ëĨŧ ėŦėŠíë ėėĄ´ėąėė `try` ë¸ëĄė ėŦėŠíë¤ëŠ´, ėėĄ´ėąė ėŦėŠíë ëė¤ ë°ėí ëǍë ėė¸ëĨŧ ë°ė ė ėėĩëë¤.
+
+ėëĨŧ ë¤ė´, ë¤ëĨ¸ ėėĄ´ėąė´ë *ę˛ŊëĄ ėė
*ė ė¤ę°ė ë°ė´í°ë˛ ė´ė¤ í¸ëėė
"륤밹"ė´ ë°ėíęą°ë ë¤ëĨ¸ ė¤ëĨę° ë°ėíë¤ëŠ´, í´ëš ėė¸ëĨŧ ėėĄ´ėąėė ë°ė ė ėėĩëë¤.
+
+ë°ëŧė, ėėĄ´ėą ë´ėė `except SomeException`ė ėŦėŠíėŦ íšė ėė¸ëĨŧ ė˛ëĻŦí ė ėėĩëë¤.
+
+ë§ė°Ŧę°ė§ëĄ, `finally`ëĨŧ ėŦėŠíėŦ ėė¸ ë°ė ėŦëļė ę´ęŗ ėė´ ėĸ
ëŖ ë¨ęŗęš ė¤íëëëĄ í ė ėėĩëë¤.
+
+{* ../../docs_src/dependencies/tutorial007.py hl[3,5] *}
+
+## `yield`ëĨŧ ėŦėŠíë íė ėėĄ´ėą
+
+ëǍë íŦ기ė ííė íė ėėĄ´ėąęŗŧ íė ėėĄ´ėąė "í¸ëĻŦ"ë ę°ė§ ė ėėŧ늰, ė´ë¤ ëǍëę° `yield`ëĨŧ ėŦėŠí ė ėėĩëë¤.
+
+**FastAPI**ë `yield`ëĨŧ ėŦėŠíë ę° ėėĄ´ėąė "ėĸ
ëŖ ėŊë"ę° ėŦë°ëĨ¸ ėėëĄ ė¤íëëëĄ ëŗ´ėĨíŠëë¤.
+
+ėëĨŧ ë¤ė´, `dependency_c`ë `dependency_b`ė ėėĄ´í ė ėęŗ , `dependency_b`ë `dependency_a`ė ėėĄ´í ė ėėĩëë¤.
+
+{* ../../docs_src/dependencies/tutorial008_an_py39.py hl[6,14,22] *}
+
+ė´ë¤ ëǍëë `yield`ëĨŧ ėŦėŠí ė ėėĩëë¤.
+
+ė´ ę˛Ŋė° `dependency_c`ë ėĸ
ëŖ ėŊëëĨŧ ė¤íí기 ėí´, `dependency_b`ė ę° (ėŦ기ėë `dep_b`ëĄ ëĒ
ëĒ
)ė´ ėŦė í ėŦėŠ ę°ëĨí´ėŧ íŠëë¤.
+
+꡸ëĻŦęŗ , `dependency_b`ë ėĸ
ëŖ ėŊëëĨŧ ėí´ `dependency_a`ė ę° (ėŦ기ėë `dep_a`ëĄ ëĒ
ëĒ
) ė´ ėŦėŠ ę°ëĨí´ėŧ íŠëë¤.
+
+{* ../../docs_src/dependencies/tutorial008_an_py39.py hl[18:19,26:27] *}
+
+ę°ė ë°ŠėėŧëĄ, `yield`ëĨŧ ėŦėŠíë ėėĄ´ėąęŗŧ `return`ė ėŦėŠíë ėėĄ´ėąė í¨ęģ ėŦėŠí ė ėėŧ늰, ė´ë¤ ė¤ ėŧëļę° ë¤ëĨ¸ ę˛ë¤ė ėėĄ´í ė ėėĩëë¤.
+
+꡸ëĻŦęŗ `yield`ëĨŧ ėŦėŠíë ë¤ëĨ¸ ėŦëŦ ėėĄ´ėąė íėëĄ íë ë¨ėŧ ėėĄ´ėąė ę°ė§ ėë ėėĩëë¤.
+
+ėíë ėėĄ´ėąė ėíë ëëĄ ėĄ°íŠí ė ėėĩëë¤.
+
+**FastAPI**ë ëǍë ę˛ė´ ėŦë°ëĨ¸ ėėëĄ ė¤íëëëĄ ëŗ´ėĨíŠëë¤.
+
+/// note | 기ė ė¸ëļėŦí
+
+íė´ėŦė Context Managers ëëļė ė´ ę¸°ëĨė´ ėëíŠëë¤.
+
+**FastAPI**ë ė´ëĨŧ ë´ëļė ėŧëĄ ėģ¨í
ė¤í¸ ę´ëĻŦėëĨŧ ėŦėŠíėŦ ęĩŦííŠëë¤.
+
+///
+
+## `yield`ė `HTTPException`ëĨŧ ėŦėŠíë ėėĄ´ėą
+
+`yield`ė `try` ë¸ëĄė´ ėë ėėĄ´ėąė ėŦėŠíėŦ ėė¸ëĨŧ ė˛ëĻŦí ė ėë¤ë ę˛ė ėę˛ ëėėĩëë¤.
+
+ę°ė ë°ŠėėŧëĄ, `yield` ė´íė ėĸ
ëŖ ėŊëėė `HTTPException`ė´ë ė ėŦí ėė¸ëĨŧ ë°ėėíŦ ė ėėĩëë¤.
+
+/// tip | í
+
+ė´ë ë¤ė ęŗ ę¸ ę¸°ė ė´ëа, ëëļëļė ę˛Ŋė° ę˛ŊëĄ ė°ė° í¨ė ëą ëë¨¸ė§ ė íëĻŦėŧė´ė
ėŊë ë´ëļėė ėė¸ (`HTTPException` íŦí¨)ëĨŧ ë°ėėíŦ ė ėėŧë¯ëĄ ė¤ė ëĄë íėíė§ ėė ę˛ė
ëë¤.
+
+íė§ë§ íėí ę˛Ŋė° ėŦėŠí ė ėėĩëë¤. đ¤
+
+///
+
+{* ../../docs_src/dependencies/tutorial008b_an_py39.py hl[18:22,31] *}
+
+ėė¸ëĨŧ ė˛ëĻŦíęŗ (ëë ėļę°ëĄ ë¤ëĨ¸ `HTTPException`ė ë°ėėí¤ę¸° ėí´) ėŦėŠí ė ėë ë ë¤ëĨ¸ ë°Šë˛ė [ėŦėŠė ė ė ėė¸ ė˛ëĻŦ기](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank}ëĨŧ ėėąíë ę˛ ė
ëë¤.
+
+## `yield`ė `except`ëĨŧ ėŦėŠíë ėėĄ´ėą
+
+`yield`ëĨŧ ėŦėŠíë ėėĄ´ėąėė `except`ëĨŧ ėŦėŠíėŦ ėė¸ëĨŧ íŦė°Šíęŗ ėė¸ëĨŧ ë¤ė ë°ėėí¤ė§ ėęą°ë (ëë ė ėė¸ëĨŧ ë°ėėí¤ė§ ėėŧ늴), FastAPIë í´ëš ėė¸ę° ë°ėíëė§ ė ė ėėĩëë¤. ė´ë ėŧë°ė ė¸ Python ë°Šėęŗŧ ëėŧíŠëë¤:
+
+{* ../../docs_src/dependencies/tutorial008c_an_py39.py hl[15:16] *}
+
+ė´ ę˛Ŋė°, `HTTPException`ė´ë ė ėŦí ėė¸ëĨŧ ë°ėėí¤ė§ ė기 ëëŦ¸ė í´ëŧė´ė¸í¸ë HTTP 500 Internal Server Error ėëĩė ëŗ´ę˛ ëė§ë§, ėë˛ë ė´ë¤ ė¤ëĨę° ë°ėíëė§ė ëí **ëĄęˇ¸**ë ë¤ëĨ¸ íėëĨŧ ė í ę°ė§ė§ ėę˛ ëŠëë¤. đą
+
+### `yield`ė `except`ëĨŧ ėŦėŠíë ėėĄ´ėąėė íė `raise` í기
+
+`yield`ę° ėë ėėĄ´ėąėė ėė¸ëĨŧ ėĄėė ëë `HTTPException`ė´ë ė ėŦí ėė¸ëĨŧ ėëĄ ë°ėėí¤ė§ ėë í, ë°ëė ėëė ėė¸ëĨŧ ë¤ė ë°ėėėŧėŧ íŠëë¤.
+
+`raise`ëĨŧ ėŦėŠíėŦ ëėŧí ėė¸ëĨŧ ë¤ė ë°ėėíŦ ė ėėĩëë¤:
+
+{* ../../docs_src/dependencies/tutorial008d_an_py39.py hl[17] *}
+
+ė´ė í´ëŧė´ė¸í¸ë ëėŧí *HTTP 500 Internal Server Error* ė¤ëĨ ėëĩė ë°ę˛ ëė§ë§, ėë˛ ëĄęˇ¸ėë ėŦėŠė ė ė ėė¸ė¸ `InternalError"ę° ę¸°ëĄëŠëë¤. đ
+
+## `yield`ëĨŧ ėŦėŠíë ėėĄ´ėąė ė¤í ėė
+
+ė¤í ėėë ėë ë¤ė´ė´ęˇ¸ë¨ęŗŧ ęą°ė ëšėˇíŠëë¤. ėę°ė ėėė ėëëĄ íëĻ
ëë¤. ꡸ëĻŦęŗ ę° ė´ė ėí¸ ėėŠíęą°ë ėŊëëĨŧ ė¤ííë ëļëļ ė¤ íëė
ëë¤.
+
+```mermaid
+sequenceDiagram
+
+participant client as Client
+participant handler as Exception handler
+participant dep as Dep with yield
+participant operation as Path Operation
+participant tasks as Background tasks
+
+ Note over client,operation: Can raise exceptions, including HTTPException
+ client ->> dep: Start request
+ Note over dep: Run code up to yield
+ opt raise Exception
+ dep -->> handler: Raise Exception
+ handler -->> client: HTTP error response
+ end
+ dep ->> operation: Run dependency, e.g. DB session
+ opt raise
+ operation -->> dep: Raise Exception (e.g. HTTPException)
+ opt handle
+ dep -->> dep: Can catch exception, raise a new HTTPException, raise other exception
+ end
+ handler -->> client: HTTP error response
+ end
+
+ operation ->> client: Return response to client
+ Note over client,operation: Response is already sent, can't change it anymore
+ opt Tasks
+ operation -->> tasks: Send background tasks
+ end
+ opt Raise other exception
+ tasks -->> tasks: Handle exceptions in the background task code
+ end
+```
+
+/// info | ė ëŗ´
+
+í´ëŧė´ė¸í¸ė **íëė ėëĩ** ë§ ė ėĄëŠëë¤. ė´ë ė¤ëĨ ėëĩ ė¤ íëėŧ ėë ėęŗ ,*ę˛ŊëĄ ėė
*ėė ėėąë ėëĩėŧ ėë ėėĩëë¤.
+
+ė´ëŦí ėëĩ ė¤ íëę° ė ėĄë íėë ë¤ëĨ¸ ėëĩė ëŗ´ëŧ ė ėėĩëë¤.
+
+///
+
+/// tip | í
+
+ė´ ë¤ė´ė´ęˇ¸ë¨ė `HTTPException`ė ëŗ´ėŦėŖŧė§ë§, `yield`ëĨŧ ėŦėŠíë ėėĄ´ėąėė ė˛ëĻŦí ėė¸ë [ėŦėŠė ė ė ėė¸ė˛ëĻŦ기](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank}.ëĨŧ ėŦėŠíėŦ ė˛ëĻŦí ë¤ëĨ¸ ėė¸ë ë°ėėíŦ ė ėėĩëë¤.
+
+ė´ë¤ ėė¸ę° ë°ėíë , `HTTPException`ė íŦí¨íėŦ yieldëĨŧ ėŦėŠíë ėėĄ´ėąėŧëĄ ė ëŦëŠëë¤. ëëļëļė ę˛Ŋė° ėė¸ëĨŧ ë¤ė ë°ėėí¤ęą°ë ėëĄė´ ėė¸ëĨŧ ë°ėėėŧėŧ íŠëë¤.
+
+///
+
+## `yield`, `HTTPException`, `except` ë° ë°ąęˇ¸ëŧė´ë ėė
ė ėŦėŠíë ėėĄ´ėą
+
+/// warning | ę˛Ŋęŗ
+
+ė´ëŦí 기ė ė ė¸ëļ ėŦíė ëëļëļ íėíė§ ėėŧë¯ëĄ ė´ ėšė
ė ęą´ëë°ęŗ ėëėė ęŗė ė§íí´ë ëŠëë¤.
+
+ė´ëŦí ė¸ëļ ė ëŗ´ë ėŖŧëĄ FastAPI 0.106.0 ė´ė ë˛ė ėė `yield`ę° ėë ėėĄ´ėąė ëĻŦėė¤ëĨŧ 밹꡸ëŧė´ë ėė
ėė ėŦėŠíë ę˛Ŋė°ëŠ ė ėŠíŠëë¤.
+
+///
+
+### `yield`ė `except`ëĨŧ ėŦėŠíë ėėĄ´ėą, 기ė ė¸ëļėŦí
+
+FastAPI 0.110.0 ė´ė ėë `yield`ę° íŦí¨ë ėėĄ´ėąė ėŦėŠí í í´ëš ėėĄ´ėąėė `except`ę° íŦí¨ë ėė¸ëĨŧ ėēĄė˛íęŗ ë¤ė ėė¸ëĨŧ ë°ėėí¤ė§ ėėŧ늴 ėė¸ę° ėëėŧëĄ ėė¸ í¸ë¤ëŦ ëë ë´ëļ ėë˛ ė¤ëĨ í¸ë¤ëŦëĄ ë°ė/ė ëŦëėėĩëë¤.
+
+ė´ë ė˛ëĻŦ기 ėė´ ė ëŦë ėė¸(ë´ëļ ėë˛ ė¤ëĨ)ėė ė˛ëĻŦëė§ ėė ëŠëǍëĻŦ ėëšëĨŧ ėė íęŗ ėŧë° íė´ėŦ ėŊëė ëėęŗŧ ėŧėšíëëĄ í기 ėí´ 0.110.0 ë˛ė ėė ëŗę˛Ŋëėėĩëë¤.
+
+### 밹꡸ëŧė´ë ėė
ęŗŧ `yield`ëĨŧ ėŦėŠíë ėėĄ´ėą, 기ė ė¸ëļėŦí
+
+FastAPI 0.106.0 ė´ė ėë `yield` ė´íė ėė¸ëĨŧ ë°ėėí¤ë ę˛ė´ ëļę°ëĨíėĩëë¤. `yield`ę° ėë ėėĄ´ėą ėĸ
ëŖ ėŊëë ėëĩė´ ė ėĄë ė´íė ė¤íëė기 ëëŦ¸ė, [ėė¸ ė˛ëĻŦ기](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank}ę° ė´ë¯¸ ė¤íë ėíėėĩëë¤.
+
+ė´ë ėŖŧëĄ ë°ąęˇ¸ëŧė´ë ėė
ë´ėė ėėĄ´ėąėė "yieldë" ëėŧí ę°ė˛´ëĨŧ ėŦėŠí ė ėëëĄ í기 ėí´ ė´ë° ë°ŠėėŧëĄ ė¤ęŗëėėĩëë¤. ėĸ
ëŖ ėŊëë 밹꡸ëŧė´ë ėė
ė´ ėëŖë íė ė¤íëė기 ëëŦ¸ė
ëë¤
+
+íė§ë§ ė´ë ę˛ í늴 ëĻŦėė¤ëĨŧ ëļíėíę˛ ėëŗ´í ėėĄ´ėą(ė: ë°ė´í°ë˛ ė´ė¤ ė°ę˛°)ėė ëŗ´ė í늴ė ėëĩė´ ë¤í¸ėíŦëĨŧ íĩí´ ė´ëí ëęšė§ 기ë¤ëĻŦë ę˛ė ė미í기 ëëŦ¸ė FastAPI 0.106.0ėė ëŗę˛Ŋëėėĩëë¤.
+
+/// tip | í
+
+ëí 밹꡸ëŧė´ë ėė
ė ėŧë°ė ėŧëĄ ė랴 ëĻŦėė¤(ė: ė랴 ë°ė´í°ë˛ ė´ė¤ ė°ę˛°)ëĨŧ ėŦėŠíėŦ ëŗëëĄ ė˛ëĻŦí´ėŧ íë ë
ëĻŊė ė¸ ëĄė§ ė§íŠė
ëë¤.
+
+ë°ëŧė ė´ë ę˛ í늴 ėŊëę° ë ęšëí´ė§ëë¤.
+
+///
+
+ë§ėŊ ė´ė ė ė´ëŦí ëėė ėėĄ´íë¤ëŠ´, ė´ė ë 밹꡸ëŧė´ë ėė
ë´ëļėė 밹꡸ëŧė´ë ėė
ė ėí ëĻŦėė¤ëĨŧ ėėąíęŗ , `yield`ę° ėë ėėĄ´ėąė ëĻŦėė¤ė ėėĄ´íė§ ėë ë°ė´í°ë§ ë´ëļė ėŧëĄ ėŦėŠí´ėŧíŠëë¤.
+
+ėëĨŧ ë¤ė´, ëėŧí ë°ė´í°ë˛ ė´ė¤ ė¸ė
ė ėŦėŠíë ëė , 밹꡸ëŧė´ë ėė
ë´ëļėė ėëĄė´ ë°ė´í°ë˛ ė´ė¤ ė¸ė
ė ėėąíęŗ ė´ ėëĄė´ ė¸ė
ė ėŦėŠíėŦ ë°ė´í°ë˛ ė´ė¤ėė ę°ė˛´ëĨŧ ę°ė ¸ėėŧ íŠëë¤. ꡸ëĻŦęŗ ë°ė´í°ë˛ ė´ė¤ ę°ė˛´ëĨŧ 밹꡸ëŧė´ë ėė
í¨ėė 매ę°ëŗėëĄ ė§ė ė ëŦíë ëė , í´ëš ę°ė˛´ė IDëĨŧ ė ëŦí ë¤ė 밹꡸ëŧė´ë ėė
í¨ė ë´ëļėė ę°ė˛´ëĨŧ ë¤ė ę°ė ¸ėėŧ íŠëë¤
+
+## ėģ¨í
ė¤í¸ ę´ëĻŦė
+
+### "ėģ¨í
ė¤í¸ ę´ëĻŦė"ë?
+
+"ėģ¨í
ė¤í¸ ę´ëĻŦė"ë Pythonėė `with` ëŦ¸ėė ėŦėŠí ė ėë ëǍë ę°ė˛´ëĨŧ ė미íŠëë¤.
+
+ėëĨŧ ë¤ė´, `with`ëĨŧ ėŦėŠíėŦ íėŧė ėŊė ė ėėĩëë¤ :
+
+```Python
+with open("./somefile.txt") as f:
+ contents = f.read()
+ print(contents)
+```
+
+ë´ëļė ėŧëĄ `open("./somefile.txt")` ë "ėģ¨í
ė¤í¸ ę´ëĻŦė(Context Manager)"ëŧęŗ ëļëĻŦë ę°ė˛´ëĨŧ ėėąíŠëë¤.
+
+`with` ë¸ëĄė´ ëë늴, ėė¸ę° ë°ėíëëŧë íėŧė ëĢëëĄ ëŗ´ėĨíŠëë¤.
+
+`yield`ę° ėë ėėĄ´ėąė ėėąí늴 **FastAPI**ë ë´ëļė ėŧëĄ ė´ëĨŧ ėí ėģ¨í
ė¤í¸ 매ëė ëĨŧ ėėąíęŗ ë¤ëĨ¸ ę´ë ¨ ëęĩŦë¤ęŗŧ 결íŠíŠëë¤.
+
+### `yield`ëĨŧ ėŦėŠíë ėėĄ´ėąėė ėģ¨í
ė¤í¸ ę´ëĻŦė ėŦėŠí기
+
+/// warning | ę˛Ŋęŗ
+
+ė´ę˛ė ė´ë ė ë "ęŗ ę¸" ę°ë
ė
ëë¤.
+
+**FastAPI**ëĨŧ ė˛ė ėėíë ę˛Ŋė° ė§ę¸ė ė´ ëļëļė ęą´ëë°ė´ë ėĸėĩëë¤.
+
+///
+
+Pythonėėë ë¤ėė íĩí´ ėģ¨í
ė¤í¸ ę´ëĻŦėëĨŧ ėėąí ė ėėĩëë¤. ë ę°ė§ ëŠėëę° ėë í´ëė¤ëĨŧ ėėąíŠëë¤: `__enter__()` and `__exit__()` .
+
+**FastAPI**ė `yield`ę° ėë ėėĄ´ėą ë´ėė
+`with` ëë `async with`ëŦ¸ė ėŦėŠíėŦ ė´ë¤ė íėŠí ė ėėĩëë¤:
+
+{* ../../docs_src/dependencies/tutorial010.py hl[1:9,13] *}
+
+/// tip | í
+
+ėģ¨í
ė¤í¸ ę´ëĻŦėëĨŧ ėėąíë ë ë¤ëĨ¸ ë°Šë˛ė ë¤ėęŗŧ ę°ėĩëë¤:
+
+* `@contextlib.contextmanager` ëë
+* `@contextlib.asynccontextmanager`
+
+ė´ë¤ė ë¨ėŧ `yield`ę° ėë í¨ėëĨŧ ęž¸ë¯¸ë ë° ėŦėŠíŠëë¤.
+
+ė´ę˛ė´ **FastAPI**ę° `yield`ę° ėë ėėĄ´ėąė ėí´ ë´ëļė ėŧëĄ ėŦėŠíë ë°Šėė
ëë¤.
+
+íė§ë§ FastAPI ėėĄ´ėąėë ė´ëŦí ë°ėŊë ė´í°ëĨŧ ėŦėŠí íėę° ėėĩëë¤(꡸ëĻŦęŗ ėŦėŠí´ėë ėëŠëë¤).
+
+FastAPIę° ë´ëļė ėŧëĄ ė´ëĨŧ ė˛ëĻŦí´ ė¤ ę˛ė
ëë¤.
+
+///
diff --git a/docs/ko/docs/tutorial/extra-models.md b/docs/ko/docs/tutorial/extra-models.md
new file mode 100644
index 000000000..8e4559061
--- /dev/null
+++ b/docs/ko/docs/tutorial/extra-models.md
@@ -0,0 +1,223 @@
+# ėļę° ëǍë¸
+
+ė§ë ėė ė ė´ė´ė, ė°ę´ë ëǍë¸ė ėŦëŦę° ę°ë ę˛ė íí ėŧė
ëë¤.
+
+íší ėŦėŠė ëǍë¸ė ę˛Ŋė°ė ꡸ëŦíë°, ėëí늴:
+
+* **ė
ë Ĩ ëǍë¸** ė ëšë°ë˛í¸ëĨŧ ę°ė ¸ėŧ íŠëë¤.
+* **ėļë Ĩ ëǍë¸** ė ëšë°ë˛í¸ëĨŧ ę°ė§ëŠ´ ėëŠëë¤.
+* **ë°ė´í°ë˛ ė´ė¤ ëǍë¸** ė í´ėė˛ëĻŦë ëšë°ë˛í¸ëĨŧ ę°ė§ ę˛ė
ëë¤.
+
+/// danger | ėí
+
+ė ë ėŦėŠėė ëšë°ë˛í¸ëĨŧ íëŦ¸ėŧëĄ ė ėĨíė§ ë§ė¸ė. íė ė´íė ę˛ėĻ ę°ëĨí "ėė í í´ė(secure hash)"ëĄ ė ėĨíė¸ė.
+
+ë§ėŊ ė´ę˛ ëŦ´ėė¸ė§ ëǍëĨ´ę˛ ë¤ëŠ´, [security chapters](security/simple-oauth2.md#password-hashing){.internal-link target=_blank}.ėė ëšë°ë˛í¸ í´ėė ëí´ ë°°ė¸ ė ėėĩëë¤.
+
+///
+
+## ë¤ė¤ ëǍë¸
+
+ėëë ëšë°ë˛í¸ íëė í´ëš íëę° ėŦėŠëë ėėšëĨŧ íŦí¨íėŦ, ę° ëǍë¸ë¤ė´ ė´ë¤ ííëĨŧ ę°ė§ ė ėëė§ ė ë°ė ė¸ ėėė
ëë¤:
+
+{* ../../docs_src/extra_models/tutorial001_py310.py hl[7,9,14,20,22,27:28,31:33,38:39] *}
+
+
+/// info | ė ëŗ´
+
+Pydantic v1ėėë í´ëš ëŠėëę° `.dict()`ëĄ ëļë ¸ėŧ늰, Pydantic v2ėėë `.model_dump()`ëĄ ė´ëĻė´ ëŗę˛Ŋëėėĩëë¤. `.dict()`ë ėŦė í ė§ėëė§ë§ ë ė´ė ęļėĨëė§ ėėĩëë¤.
+
+ėŦ기ėė ėŦėŠíë ėė ë Pydantic v1ęŗŧė í¸íėąė ėí´ `.dict()`ëĨŧ ėŦėŠíė§ë§, Pydantic v2ëĨŧ ėŦėŠí ė ėë¤ëŠ´ `.model_dump()`ëĨŧ ėŦėŠíë ę˛ė´ ėĸėĩëë¤.
+
+///
+
+### `**user_in.dict()` ė ëíėŦ
+
+#### Pydanticė `.dict()`
+
+`user_in`ė Pydantic ëĒ¨ë¸ í´ëė¤ė¸ `UserIn`ė
ëë¤.
+
+Pydantic ëǍë¸ė ëĒ¨ë¸ ë°ė´í°ëĨŧ íŦí¨í `dict`ëĨŧ ë°ííë `.dict()` ëŠėëëĨŧ ė ęŗĩíŠëë¤.
+
+ë°ëŧė, ë¤ėęŗŧ ę°ė´ Pydantic ę°ė˛´ `user_in`ė ėėąí ė ėėĩëë¤:
+
+```Python
+user_in = UserIn(username="john", password="secret", email="john.doe@example.com")
+```
+
+꡸ ë¤ė, ë¤ėęŗŧ ę°ė´ í¸ėļíŠëë¤:
+
+```Python
+user_dict = user_in.dict()
+```
+
+ė´ė ëŗė `user_dict`ė ë°ė´í°ę° íŦí¨ë `dict`ëĨŧ ę°ė§ę˛ ëŠëë¤(ė´ë Pydantic ëĒ¨ë¸ ę°ė˛´ę° ėë `dict`ė
ëë¤).
+
+꡸ëĻŦęŗ ë¤ėęŗŧ ę°ė´ í¸ėļí늴:
+
+```Python
+print(user_dict)
+```
+
+Pythonė `dict`ę° ë¤ėęŗŧ ę°ė´ ėļë ĨëŠëë¤:
+
+```Python
+{
+ 'username': 'john',
+ 'password': 'secret',
+ 'email': 'john.doe@example.com',
+ 'full_name': None,
+}
+```
+
+#### `dict` ė¸í¨íš(Unpacking)
+
+`user_dict`ė ę°ė `dict`ëĨŧ í¨ė(ëë í´ëė¤)ė `**user_dict`ëĄ ė ëŦí늴, Pythonė ė´ëĨŧ "ė¸íŠ(unpack)"íŠëë¤. ė´ ęŗŧė ėė `user_dict`ė í¤ė ę°ė ę°ę° í¤-ę° ė¸ėëĄ ė§ė ė ëŦíŠëë¤.
+
+ë°ëŧė, ėėė ėėąí `user_dict`ëĨŧ ėŦėŠíėŦ ë¤ėęŗŧ ę°ė´ ėėąí늴:
+
+```Python
+UserInDB(**user_dict)
+```
+
+ë¤ėęŗŧ ę°ė 결ęŗŧëĨŧ ėėąíŠëë¤:
+
+```Python
+UserInDB(
+ username="john",
+ password="secret",
+ email="john.doe@example.com",
+ full_name=None,
+)
+```
+
+íšė ë ė íí ë§íė늴, `user_dict`ëĨŧ ė§ė ėŦėŠíë ę˛ė, ëė¤ė ė´ë¤ ę°ė´ ėļę°ëëëŧë ėëė ëėŧí í¨ęŗŧëĨŧ ë
ëë¤:
+
+```Python
+UserInDB(
+ username = user_dict["username"],
+ password = user_dict["password"],
+ email = user_dict["email"],
+ full_name = user_dict["full_name"],
+)
+```
+
+#### ë¤ëĨ¸ ëĒ¨ë¸ ë°ė´í°ëĄ ė Pydantic ëĒ¨ë¸ ėėą
+
+ėė ėė ėė `user_in.dict()`ëĄëļí° `user_dict`ëĨŧ ėėąí ę˛ė˛ëŧ, ėë ėŊëë:
+
+```Python
+user_dict = user_in.dict()
+UserInDB(**user_dict)
+```
+
+ë¤ėęŗŧ ëėŧíŠëë¤:
+
+```Python
+UserInDB(**user_in.dict())
+```
+
+...ėëí늴 `user_in.dict()`ë `dict`ė´ëа, ė´ëĨŧ `**`ëĄ Pythonė´ "ė¸íŠ(unpack)"íëëĄ íėŦ `UserInDB`ė ė ëŦí기 ëëŦ¸ė
ëë¤.
+
+ë°ëŧė, ë¤ëĨ¸ Pydantic ëǍë¸ė ë°ė´í°ëĨŧ ėŦėŠíėŦ ėëĄė´ Pydantic ëǍë¸ė ėėąí ė ėėĩëë¤.
+
+#### `dict` ė¸í¨íš(Unpacking)ęŗŧ ėļę° í¤ėë
+
+꡸ëĻŦęŗ ë¤ėęŗŧ ę°ė´ ėļę° í¤ėë ė¸ė `hashed_password=hashed_password`ëĨŧ ėļę°í늴:
+
+```Python
+UserInDB(**user_in.dict(), hashed_password=hashed_password)
+```
+
+ë¤ėęŗŧ ę°ė 결ęŗŧëĨŧ ėėąíŠëë¤:
+
+```Python
+UserInDB(
+ username = user_dict["username"],
+ password = user_dict["password"],
+ email = user_dict["email"],
+ full_name = user_dict["full_name"],
+ hashed_password = hashed_password,
+)
+```
+
+/// warning | ę˛Ŋęŗ
+
+ėļę°ė ėŧëĄ ė ęŗĩë í¨ė `fake_password_hasher`ė `fake_save_user`ë ë°ė´í° íëĻė ėė°í기 ėí ėė ėŧ ëŋė´ëа, ė¤ė ëŗ´ėė ė ęŗĩíė§ ėėĩëë¤.
+
+///
+
+## ė¤ëŗĩ ė¤ė´ę¸°
+
+ėŊë ė¤ëŗĩė ė¤ė´ë ę˛ė **FastAPI**ė íĩėŦ ėė´ëė´ ė¤ íëė
ëë¤.
+
+ėŊë ė¤ëŗĩė ë˛ęˇ¸, ëŗ´ė ëŦ¸ė , ėŊë ëšë기í ëŦ¸ė (í ęŗŗė ė
ë°ė´í¸ëėė§ë§ ë¤ëĨ¸ ęŗŗė ė
ë°ė´í¸ëė§ ėë ëŦ¸ė ) ëąė ę°ëĨėąė ėĻę°ėíĩëë¤.
+
+꡸ëĻŦęŗ ė´ ëǍë¸ë¤ė ë§ė ë°ė´í°ëĨŧ ęŗĩė í늴ė ėėą ė´ëĻęŗŧ íė
ė ė¤ëŗĩíęŗ ėėĩëë¤.
+
+ë ëė ë°Šë˛ė´ ėėĩëë¤.
+
+`UserBase` ëǍë¸ė ė ė¸íėŦ ë¤ëĨ¸ ëǍë¸ë¤ė ę¸°ëŗ¸(base)ėŧëĄ ėŦėŠí ė ėėĩëë¤. ęˇ¸ë° ë¤ė ė´ ëǍë¸ė ėėë°ė ėėąęŗŧ íė
ė ė¸(ė í ė ė¸, ę˛ėĻ ëą)ė ėėíë ėë¸í´ëė¤ëĨŧ ë§ë¤ ė ėėĩëë¤.
+
+ëǍë ë°ė´í° ëŗí, ę˛ėĻ, ëŦ¸ėí ëąė ė ėė ėŧëĄ ėëí ę˛ė
ëë¤.
+
+ė´ë ę˛ í늴 ę° ëĒ¨ë¸ ę°ė ė°¨ė´ė ë§ ė ė¸í ė ėėĩëë¤(íëŦ¸ `password`ę° ėë ę˛Ŋė°, `hashed_password`ë§ ėë ę˛Ŋė°, íšė ëšë°ë˛í¸ę° ėë ę˛Ŋė°):
+
+{* ../../docs_src/extra_models/tutorial002_py310.py hl[7,13:14,17:18,21:22] *}
+
+## `Union` ëë `anyOf`
+
+ë ę°ė§ ė´ėė íė
ė íŦí¨íë `Union`ėŧëĄ ėëĩė ė ė¸í ė ėėĩëë¤. ė´ë ėëĩė´ ęˇ¸ ė¤ íëė íė
ėŧ ė ėėė ė미íŠëë¤.
+
+OpenAPIėėë ė´ëĨŧ `anyOf`ëĄ ė ėíŠëë¤.
+
+ė´ëĨŧ ėí´ íė¤ Python íė
íí¸ė¸ `typing.Union` ė ėŦėŠí ė ėėĩëë¤:
+
+/// note | ė°¸ęŗ
+
+`Union` ė ė ėí ëë ë ęĩŦ랴ė ė¸ íė
ė ë¨ŧė íŦí¨íęŗ , ë ęĩŦ랴ė ė¸ íė
ė ꡸ ë¤ė ëė´í´ėŧíŠëë¤. ėë ėė ėėë `Union[PlaneItem, CarItem]` ëĨŧ ëŗ´ëŠ´, ë ęĩŦ랴ė ė¸ `PlaneItem`ė´ `CarItem`ëŗ´ë¤ ėė ėėšíŠëë¤.
+
+///
+
+{* ../../docs_src/extra_models/tutorial003_py310.py hl[1,14:15,18:20,33] *}
+
+
+### Python 3.10ėė `Union`
+
+ėė ėė ėėë `response_model` ė¸ė ę°ėŧëĄ `Union[PlaneItem, CarItem]`ė ė ëŦíŠëë¤.
+
+ė´ ę˛Ŋė°, ė´ëĨŧ **íė
ė´ë
¸í
ė´ė
(type annotation)** ė´ ėë **ė¸ė ę°(argument value)** ėŧëĄ ė ëŦíęŗ ė기 ëëŦ¸ė Python 3.10ėėë `Union`ė ėŦėŠí´ėŧ íŠëë¤.
+
+ë§ėŊ íė
ė´ë
¸í
ė´ė
ė ėŦėŠíë¤ëŠ´, ë¤ėęŗŧ ę°ė´ ėė§ ë§ë(|)ëĨŧ ėŦėŠí ė ėėĩëë¤:
+
+```Python
+some_variable: PlaneItem | CarItem
+```
+
+íė§ë§ ė´ëĨŧ `response_model=PlaneItem | CarItem`ęŗŧ ę°ė´ í ëší늴 ėëŦę° ë°ėíŠëë¤. ė´ë Pythonė´ ė´ëĨŧ íė
ė´ë
¸í
ė´ė
ėŧëĄ í´ėíė§ ėęŗ , `PlaneItem`ęŗŧ `CarItem` ėŦė´ė **ėëĒģë ė°ė°(invalid operation)**ė ėëí기 ëëŦ¸ė
ëë¤
+
+## ëĒ¨ë¸ ëĻŦė¤í¸
+
+ë§ė°Ŧę°ė§ëĄ, ę°ė˛´ ëĻŦė¤í¸ ííė ėëĩė ė ė¸í ėë ėėĩëë¤.
+
+ė´ëĨŧ ėí´ íė¤ Pythonė `typing.List`ëĨŧ ėŦėŠíė¸ė(ëë Python 3.9 ė´ėėėë ë¨ėí `list`ëĨŧ ėŦėŠí ė ėėĩëë¤):
+
+{* ../../docs_src/extra_models/tutorial004_py39.py hl[18] *}
+
+
+## ėėė `dict` ėëĩ
+
+Pydantic ëǍë¸ė ėŦėŠíė§ ėęŗ , í¤ė ę°ė íė
ë§ ė ė¸íėŦ íë˛í ėėė `dict`ëĄ ėëĩė ė ė¸í ėë ėėĩëë¤.
+
+ė´ë Pydantic ëǍë¸ė íėí ė í¨í íë/ėėą ė´ëĻė ėŦė ė ė ė ėë ę˛Ŋė°ė ė ėŠíŠëë¤.
+
+ė´ ę˛Ŋė°, `typing.Dict`ëĨŧ ėŦėŠí ė ėėĩëë¤(ëë Python 3.9 ė´ėėėë ë¨ėí `dict`ëĨŧ ėŦėŠí ė ėėĩëë¤):
+
+{* ../../docs_src/extra_models/tutorial005_py39.py hl[6] *}
+
+
+## ėėŊ
+
+ėŦëŦ Pydantic ëǍë¸ė ėŦėŠíęŗ , ę° ę˛Ŋė°ė ë§ę˛ ėė ëĄę˛ ėėíė¸ė.
+
+ėí°í°ę° ėëĄ ë¤ëĨ¸ "ėí"ëĨŧ ę°ė ¸ėŧ íë ę˛Ŋė°, ėí°í°ëš ë¨ėŧ ë°ė´í° ëǍë¸ė ėŦėŠí íėë ėėĩëë¤. ėëĨŧ ë¤ė´, ėŦėŠė "ėí°í°"ę° `password`, `password_hash`, ëë ëšë°ë˛í¸ę° ėë ėíëĨŧ íŦí¨í ė ėë ę˛Ŋė°ė˛ëŧ ë§ė
ëë¤.
diff --git a/docs/ko/docs/tutorial/security/oauth2-jwt.md b/docs/ko/docs/tutorial/security/oauth2-jwt.md
new file mode 100644
index 000000000..d8bac8346
--- /dev/null
+++ b/docs/ko/docs/tutorial/security/oauth2-jwt.md
@@ -0,0 +1,273 @@
+# í¨ė¤ėë í´ėąė ė´ėŠí OAuth2, JWT í í°ė ėŦėŠíë Bearer ė¸ėĻ
+
+ëǍë ëŗ´ė íëĻė ęĩŦėąíėŧë¯ëĄ, ė´ė JWT í í°ęŗŧ í¨ė¤ėë í´ėąė ėŦėŠí´ ė íëĻŦėŧė´ė
ė ėė íę˛ ë§ë¤ ę˛ė
ëë¤.
+
+ė´ ėŊëë ė¤ė ëĄ ė íëĻŦėŧė´ė
ėė í¨ė¤ėëëĨŧ í´ėąíėŦ DBė ė ėĨíë ëąė ėė
ė íėŠí ė ėėĩëë¤.
+
+ė´ė ėĨė ė´ė´ė ėėí´ ë´
ėë¤.
+
+## JWT
+
+JWT ë "JSON Web Tokens" ė ė미íŠëë¤.
+
+JSON ę°ė˛´ëĨŧ ęŗĩë°ąė´ ėë 긴 ëŦ¸ėė´ëĄ ė¸ėŊëŠíë íė¤ė´ëа, ë¤ėęŗŧ ę°ė ííė
ëë¤:
+
+```
+eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
+```
+
+JWTë ėí¸íëė§ ėė ëęĩŦë ė§ í í°ėė ė ëŗ´ëĨŧ ëŗĩėí ė ėėĩëë¤.
+
+íė§ë§ JWTë ėëĒ
ëė´ ėėĩëë¤. ꡸ëė ėė ė´ ë°ę¸í í í°ė ë°ėė ë, ė¤ė ëĄ ėė ė´ ë°ę¸íę˛ ë§ëė§ ę˛ėĻí ė ėėĩëë¤.
+
+ë§ëŖ 기ę°ė´ ėŧėŖŧėŧė¸ í í°ė ë°ííë¤ęŗ ę°ė í´ ë´
ėë¤. ë¤ė ë ėŦėŠėę° í í°ė ę°ė ¸ėė ë, ꡸ ėŦėŠėę° ėė¤í
ė ėŦė í ëĄęˇ¸ė¸ëė´ ėë¤ë ę˛ė ė ė ėėĩëë¤.
+
+ėŧėŖŧėŧ ë¤ėë í í°ė´ ë§ëŖë ę˛ė´ęŗ , ėŦėŠėë ė¸ę°ëė§ ėė ė í í°ė ë°ę¸° ėí´ ë¤ė ëĄęˇ¸ė¸í´ėŧ í ę˛ė
ëë¤. ë§ėŊ ėŦėŠė(ëë ė 3ė)ę° í í°ė ėė íęą°ë ë§ëŖėŧė ëŗę˛Ŋí늴, ėëĒ
ė´ ėŧėšíė§ ė기 ëëŦ¸ė ėėėą ė ėė ę˛ė
ëë¤.
+
+ë§ėŊ JWT í í°ė ë¤ë¤ëŗ´ęŗ , ėë ë°Šėë ėėëŗ´ęŗ ėļë¤ëŠ´ https://jwt.io ė íė¸íėėė¤.
+
+## `PyJWT` ė¤ėš
+
+íė´ėŦėŧëĄ JWT í í°ė ėėąíęŗ ę˛ėĻíë ¤ëŠ´ `PyJWT` ëĨŧ ė¤ėší´ėŧ íŠëë¤.
+
+[ę°ėíę˛Ŋ](../../virtual-environments.md){.internal-link target=_blank} ė ë§ë¤ęŗ íėąíí ë¤ė `pyjwt` ëĨŧ ė¤ėšíėėė¤:
+
+
+
+```console
+$ pip install pyjwt
+
+---> 100%
+```
+
+
+
+/// info | ė°¸ęŗ
+
+RSAë ECDSA ę°ė ė ė ėëĒ
ėęŗ ëĻŦėĻė ėŦėŠíë ¤ëŠ´, `pyjwt[crypto]`ëŧë ėí¸í ëŧė´ë¸ëŦëĻŦ ėėĄ´ėąė ė¤ėší´ėŧ íŠëë¤.
+
+ë ėė¸í ë´ėŠė PyJWT ė¤ėš ėė íė¸í ė ėėĩëë¤.
+
+///
+
+## í¨ė¤ėë í´ėą
+
+"í´ėą(Hashing)"ė ė´ë¤ ë´ėŠ(ėŦ기ėë í¨ė¤ėë)ė í´ėí ė ėë ėŧë ¨ė ë°ė´í¸ ė§íŠ(ë¨ė ëŦ¸ėė´)ėŧëĄ ëŗííë ę˛ė ė미íŠëë¤.
+
+ëėŧí ë´ėŠ(ëę°ė í¨ė¤ėë)ė í´ėąí늴 ëėŧí ëŦ¸ėė´ė ėģėĩëë¤.
+
+íė§ë§ ꡸ ëŦ¸ėė´ė ë¤ė í¨ė¤ėëëĄ ëëëĻ´ ėë ėėĩëë¤.
+
+### í¨ė¤ėëëĨŧ í´ėąíë ė´ė
+
+ë°ė´í°ë˛ ė´ė¤ëĨŧ í뎍ëšíëëŧë, ėš¨ė
ėë ėŦėŠėė íëŦ¸ í¨ė¤ėë ëė í´ė ę°ë§ ėģė ė ėėĩëë¤.
+
+ë°ëŧė ėš¨ė
ėë íėš ėŦėŠė í¨ė¤ėëëĨŧ ë¤ëĨ¸ ėė¤í
ėė íėŠí ė ėėĩëë¤. (ëë¤ė ėŦėŠėę° ėŦëŦ ėė¤í
ėė ëėŧí í¨ė¤ėëëĨŧ ėŦėŠí기 ëëŦ¸ė íëŦ¸ í¨ė¤ėëę° ė ėļë늴 ėííŠëë¤.)
+
+## `passlib` ė¤ėš
+
+PassLibë í¨ė¤ėë í´ėëĨŧ ë¤ëŖ¨ë íëĨí íė´ėŦ í¨í¤ė§ė
ëë¤.
+
+ë§ė ėė í í´ė ėęŗ ëĻŦėĻęŗŧ ëęĩŦë¤ė ė§ėíŠëë¤.
+
+ėļė˛íë ėęŗ ëĻŦėĻė "Bcrypt"ė
ëë¤.
+
+[ę°ėíę˛Ŋ](../../virtual-environments.md){.internal-link target=_blank} ė ë§ë¤ęŗ íėąíí ë¤ė PassLibė BcryptëĨŧ ė¤ėšíėėė¤:
+
+
+
+```console
+$ pip install "passlib[bcrypt]"
+
+---> 100%
+```
+
+
+
+/// tip | í
+
+`passlib`ëĨŧ ėŦėŠíėŦ, **Django**, **Flask** ė ëŗ´ė íëŦ꡸ė¸ė´ë ë¤ëĨ¸ ëęĩŦëĄ ėėąí í¨ė¤ėëëĨŧ ėŊė ė ėëëĄ ė¤ė í ėë ėėĩëë¤.
+
+ėëĨŧ ë¤ė늴, FastAPI ė íëĻŦėŧė´ė
ęŗŧ Django ė íëĻŦėŧė´ė
ė´ ę°ė ë°ė´í°ë˛ ė´ė¤ėė ë°ė´í°ëĨŧ ęŗĩė í ė ėėĩëë¤. ëë ę°ė ë°ė´í°ë˛ ė´ė¤ëĨŧ ėŦėŠíėŦ Django ė íëĻŦėŧė´ė
ė ė ė§ė ėŧëĄ ë§ė´ęˇ¸ë ė´ė
í ėë ėėĩëë¤.
+
+꡸ëĻŦęŗ ėŦėŠėë FastAPI ė íëĻŦėŧė´ė
ęŗŧ Django ė íëĻŦėŧė´ė
ė ëėė ëĄęˇ¸ė¸í ė ėėĩëë¤.
+
+///
+
+## í¨ė¤ėëė í´ėė ę˛ėĻ
+
+íėí ëęĩŦëĨŧ `passlib`ėė ėíŦí¸íŠëë¤.
+
+PassLib "ėģ¨í
ė¤í¸(context)"ëĨŧ ėėąíŠëë¤. ė´ę˛ė í¨ė¤ėëëĨŧ í´ėąíęŗ ę˛ėĻíëë° ėŦėŠíŠëë¤.
+
+/// tip | í
+
+PassLib ėģ¨í
ė¤í¸ë ë¤ėí í´ėą ėęŗ ëĻŦėĻė ėŦėŠí ė ėë 기ëĨė ė ęŗĩí늰, ë ė´ė ėŦėŠė´ ęļėĨëė§ ėë ė¤ëë í´ėą ėęŗ ëĻŦėĻė ę˛ėĻíë 기ëĨë íŦí¨ëė´ ėėĩëë¤.
+
+ėëĨŧ ë¤ė´, ë¤ëĨ¸ ėė¤í
(Django ę°ė)ėė ėėąí í¨ė¤ėëëĨŧ ėŊęŗ ę˛ėĻí ė ėėŧ늰, ėëĄė´ í¨ė¤ėëëĨŧ Bcrypt ę°ė ë¤ëĨ¸ ėęŗ ëĻŦėĻėŧëĄ í´ėąí ėë ėėĩëë¤.
+
+꡸ëĻŦęŗ ëėė ęˇ¸ë° ëǍë ėęŗ ëĻŦėĻęŗŧ í¸íėąė ė ė§íŠëë¤.
+
+///
+
+ėŦėŠėëĄëļí° ë°ė í¨ė¤ėëëĨŧ í´ėąíë ė í¸ëĻŦí° í¨ėëĨŧ ėėąíŠëë¤.
+
+꡸ëĻŦęŗ ë°ė í¨ė¤ėëę° ė ėĨë í´ėė ėŧėšíëė§ ę˛ėĻíë ë ë¤ëĨ¸ ė í¸ëĻŦí° í¨ėë ėėąíŠëë¤.
+
+꡸ëĻŦęŗ ėŦėŠėëĨŧ ė¸ėĻíęŗ ë°ííë ë ë¤ëĨ¸ í¨ėë ėėąíŠëë¤.
+
+{* ../../docs_src/security/tutorial004_an_py310.py hl[8,49,56:57,60:61,70:76] *}
+
+/// note
+
+ėëĄė´ (ę°ė§) ë°ė´í°ë˛ ė´ė¤ `fake_users_db`ëĨŧ íė¸í늴, í´ė ė˛ëĻŦë í¨ė¤ėëę° ė´ëģę˛ ėę˛ŧëė§ ëŗŧ ė ėėĩëë¤: `"$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW"`.
+
+///
+
+## JWT í í° ė˛ëĻŦ
+
+ė¤ėšë ëǍëė ėíŦí¸ íŠëë¤.
+
+JWT í í° ėëĒ
ė ėŦėŠë ėėė ëšë°í¤ëĨŧ ėėąíŠëë¤.
+
+ėė í ėėė ëšë°í¤ëĨŧ ėėąíë ¤ëŠ´ ë¤ė ëĒ
ë šė´ëĨŧ ėŦėŠíėėė¤:
+
+
+
+```console
+$ openssl rand -hex 32
+
+09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7
+```
+
+
+
+꡸ëĻŦęŗ ėėąí ëšë°í¤ëĨŧ ëŗĩėŦí´ ëŗė `SECRET_KEY`ė ëė
íŠëë¤. (ė´ ėė ė ëŗė ę°ė ꡸ëëĄ ėŦėŠíė§ ë§ėėė¤.)
+
+JWT í í°ė ėëĒ
íë ë° ėŦėŠë ėęŗ ëĻŦėĻė ėí ëŗė `ALGORITHM` ė ėėąíęŗ `"HS256"` ėŧëĄ ė¤ė íŠëë¤.
+
+í í° ë§ëŖ 기ę°ė ėí ëŗėëĨŧ ėėąíŠëë¤.
+
+ėëĩė ėí í í° ėëíŦė¸í¸ė ėŦėŠë Pydantic ëǍë¸ė ė ėíŠëë¤.
+
+ė ėĄė¸ė¤ í í°ė ėėąí기 ėí ė í¸ëĻŦí° í¨ėëĨŧ ėėąíŠëë¤.
+
+{* ../../docs_src/security/tutorial004_an_py310.py hl[4,7,13:15,29:31,79:87] *}
+
+## ėėĄ´ėą ėė
+
+`get_current_user` í¨ėëĨŧ ė´ė ęŗŧ ëėŧí í í°ė ë°ëëĄ ėė íë, ė´ë˛ėë JWT í í°ė ėŦėŠíëëĄ íŠëë¤.
+
+ë°ė í í°ė ëėŊëŠíėŦ ę˛ėĻí í íėŦ ėŦėŠėëĨŧ ë°ííŠëë¤.
+
+í í°ė´ ė í¨íė§ ėë¤ëŠ´ HTTP ė¤ëĨëĨŧ ë°ííŠëë¤.
+
+{* ../../docs_src/security/tutorial004_an_py310.py hl[90:107] *}
+
+## `/token` ę˛ŊëĄ ėė
ėė
+
+í í°ė ë§ëŖ ėę°ė ė¤ė í기 ėí´ `timedelta` ëĨŧ ėėąíŠëë¤.
+
+ė¤ė JWT ėĄė¸ė¤ í í°ė ėėąíėŦ ë°ííŠëë¤.
+
+{* ../../docs_src/security/tutorial004_an_py310.py hl[118:133] *}
+
+### JWT "ėŖŧ랴(subject)" `sub`ė ëí 기ė ė¸ëļ ėŦí
+
+JWT ëĒ
ė¸ė ë°ëĨ´ëŠ´ í í°ė ėŖŧ랴ëĨŧ íŦí¨íë `sub`ëŧë í¤ę° ėėĩëë¤.
+
+ėŦėŠ ėŦëļë ė íėŦíė´ė§ë§, ėŦėŠėė ėëŗ ė ëŗ´ëĨŧ ė ėĨí ė ėėŧë¯ëĄ ėŦ기ėë ė´ëĨŧ ėŦėŠíŠëë¤.
+
+JWTë ėŦėŠėëĨŧ ėëŗíęŗ ėŦėŠėę° APIëĨŧ ė§ė ėŦėŠí ė ėëëĄ íėŠíë ę˛ ė¸ėë ë¤ëĨ¸ ėŠëëĄ ėŦėŠë ėë ėėĩëë¤.
+
+ėëĨŧ ë¤ė´ "ėëė°¨"ë "ë¸ëĄęˇ¸ ę˛ėëŦŧ"ė ėëŗíë ë° ėŦėŠí ė ėėĩëë¤.
+
+꡸ëĻŦęŗ "ėëė°¨ëĨŧ ė´ė íë¤"ë "ë¸ëĄęˇ¸ ę˛ėëŦŧė ėė íë¤"ė˛ëŧ í´ëš ėí°í°ė ëí ęļíė ėļę°í ė ėėĩëë¤.
+
+꡸ í ė´ JWT í í°ė ėŦėŠė(ëë ë´)ėę˛ ė ęŗĩí늴, ꡸ë¤ė ęŗė ė ë°ëĄ ë§ë¤ íė ėė´ APIę° ėėąí JWT í í°ë§ėŧëĄ ėė
(ėëė°¨ ė´ė ëë ë¸ëĄęˇ¸ ę˛ėëŦŧ í¸ė§)ė ėíí ė ėėĩëë¤.
+
+ė´ëŦí ę°ë
ė íėŠí늴 JWTë í¨ėŦ ë ëŗĩėĄí ėëëĻŦė¤ėë ėŦėŠí ė ėėĩëë¤.
+
+ė´ ę˛Ŋė° ėŦëŦ ėí°í°ę° ëėŧí IDëĨŧ ę°ė§ ė ėėĩëë¤. ėëĨŧ ë¤ė´ fooëŧë IDëĨŧ ę°ė§ ėŦėŠė, ėëė°¨, ë¸ëĄęˇ¸ ę˛ėëŦŧė´ ėė ė ėėĩëë¤.
+
+꡸ëė ID ėļŠëė ë°Šė§í기 ėí´, ėŦėŠėė JWT í í°ė ėėąí ë ė ëėŦëĄ `sub` í¤ëĨŧ ėļę°í ė ėėĩëë¤. ėëĨŧ ë¤ė´ `username:` ė ëļė´ë ë°Šėė
ëë¤. ė´ ėė ėėë `sub` ę°ė´ `username:johndoe`ė´ ë ė ėėĩëë¤.
+
+ę°ėĨ ė¤ėí ė ė `sub` í¤ë ė 랴 ė íëĻŦėŧė´ė
ėė ęŗ ė í ėëŗėę° ëė´ėŧ í늰 ëŦ¸ėė´ė´ė´ėŧ íë¤ë ė ė
ëë¤.
+
+## íė¸í´ë´
ėë¤
+
+ėë˛ëĨŧ ė¤ííęŗ ëŦ¸ėëĄ ė´ëíėėė¤: http://127.0.0.1:8000/docs .
+
+ë¤ėęŗŧ ę°ė ėŦėŠė ė¸í°íė´ė¤ëĨŧ ëŗŧ ė ėėĩëë¤:
+
+
+
+ė´ė ęŗŧ ę°ė ë°Šë˛ėŧëĄ ė íëĻŦėŧė´ė
ė ė¸ėĻíėėė¤.
+
+ë¤ė ė¸ėĻ ė ëŗ´ëĨŧ ėŦėŠíėėė¤:
+
+Username: `johndoe`
+Password: `secret`
+
+/// check
+
+ėŊë ė´ëėë íëŦ¸ í¨ė¤ėë "`secret`" ė´ ėë¤ë ė ė ė ėíėėė¤. í´ėë ë˛ė ë§ ėėĩëë¤.
+
+///
+
+
+
+`/users/me/` ëĨŧ í¸ėļí늴 ë¤ėęŗŧ ę°ė ėëĩė ėģė ė ėėĩëë¤:
+
+```JSON
+{
+ "username": "johndoe",
+ "email": "johndoe@example.com",
+ "full_name": "John Doe",
+ "disabled": false
+}
+```
+
+
+
+ę°ë°ė ëęĩŦëĨŧ ė´ė´ëŗ´ëŠ´ ė ėĄë ë°ė´í°ė í í°ë§ íŦí¨ë ę˛ė íė¸í ė ėėĩëë¤. í¨ė¤ėëë ėŦėŠėëĨŧ ė¸ėĻíęŗ ėĄė¸ė¤ í í°ė ë°ę¸° ėí ė˛Ģ ë˛ė§¸ ėė˛ėë§ ė ėĄë늰, ė´íėë ė ėĄëė§ ėėĩëë¤:
+
+
+
+/// note
+
+`Bearer `ëĄ ėėíë `Authorization` í¤ëė ėŖŧëĒŠíėėė¤.
+
+///
+
+## `scopes` ė ęŗ ę¸ ėŦėŠë˛
+
+OAuth2ë "ė¤ėŊí(scopes)" ëŧë ę°ë
ė ę°ęŗ ėėĩëë¤.
+
+ė´ëĨŧ ėŦėŠíėŦ JWT í í°ė íšė ęļí ė§íŠė ėļę°í ė ėėĩëë¤.
+
+꡸ í ė´ í í°ė ėŦėŠėėę˛ ė§ė ė ęŗĩíęą°ë ė 3ėėę˛ ė ęŗĩíėŦ, íšė ė íėŦí íėėë APIė íĩė íëëĄ í ė ėėĩëë¤.
+
+**FastAPI** ėėė ėŦėŠ ë°Šë˛ęŗŧ íĩíŠ ë°Šėė **ėŦí ėŦėŠė ėë´ė** ėė ėė¸í ë°°ė¸ ė ėėĩëë¤.
+
+## ėėŊ
+
+ė§ę¸ęšė§ ė´í´ëŗ¸ ë´ėŠė ë°íėŧëĄ, OAuth2ė JWT ę°ė íė¤ė ėŦėŠíėŦ ėė í **FastAPI** ė íëĻŦėŧė´ė
ė ë§ë¤ ė ėėĩëë¤.
+
+ęą°ė ëǍë íë ėėíŦėė ëŗ´ė ė˛ëĻŦë ėëší ëŗĩėĄí ėŖŧė ė
ëë¤.
+
+ė´ëĨŧ ë¨ėííë ë§ė í¨í¤ė§ë ë°ė´í° ëǍë¸, ë°ė´í°ë˛ ė´ė¤, ėŦėŠ ę°ëĨí 기ëĨë¤ė ëí´ ėŦëŦ ė ėŊė´ ėėĩëë¤. ꡸ëĻŦęŗ ė§ëėšę˛ ë¨ėííë ėŧëļ í¨í¤ė§ë¤ė ėŦę°í ëŗ´ė 결í¨ė ę°ė§ ėë ėėĩëë¤.
+
+---
+
+**FastAPI** ë ė´ë¤ ë°ė´í°ë˛ ė´ė¤, ë°ė´í° ëǍë¸, ëęĩŦë ę°ėíė§ ėėĩëë¤.
+
+íëĄė í¸ė ę°ėĨ ė íŠí ę˛ė ė íí ė ėë ė ė°ėąė ė ęŗĩíŠëë¤.
+
+꡸ëĻŦęŗ `passlib` ė `PyJWT` ė˛ëŧ ė ę´ëĻŦëęŗ ëëĻŦ ėŦėŠëë í¨í¤ė§ë¤ė ë°ëĄ ėŦėŠí ė ėėĩëë¤. **FastAPI** ë ė¸ëļ í¨í¤ė§ íĩíŠė ėí´ ëŗĩėĄí ëŠėģ¤ëėĻė´ íėíė§ ė기 ëëŦ¸ė
ëë¤.
+
+꡸ëŦë ė ė°ėą, ę˛Ŧęŗ ėą, ëŗ´ėėąė í´ėšė§ ėėŧ늴ė ęŗŧė ė ë¨ėíí ė ėë ëęĩŦë¤ė ė ęŗĩíŠëë¤.
+
+꡸ëĻŦęŗ OAuth2ė ę°ė íė¤ íëĄí ėŊė ëšęĩė ę°ë¨í ë°Šë˛ėŧëĄ ęĩŦííęŗ ėŦėŠí ė ėėĩëë¤.
+
+ë ė¸ëļíë ęļí 랴ęŗëĨŧ ėí´ OAuth2ė "ė¤ėŊí"ëĨŧ ėŦėŠíë ë°Šë˛ė **ėŦí ėŦėŠė ėë´ė**ėė ë ėė¸í ë°°ė¸ ė ėėĩëë¤. OAuth2ė ė¤ėŊíë ė 3ė ė íëĻŦėŧė´ė
ė´ ėŦėŠėëĨŧ ëė í´ ęˇ¸ë¤ė APIė ėí¸ėėŠíëëĄ ęļíė ëļėŦí기 ėí´, Facebook, Google, GitHub, Microsoft, Twitter ëąė ë§ė ëí ė¸ėĻ ė ęŗĩė
랴ë¤ė´ ėŦėŠíë ëŠėģ¤ëėĻė
ëë¤.
diff --git a/docs/ko/docs/tutorial/security/simple-oauth2.md b/docs/ko/docs/tutorial/security/simple-oauth2.md
index ddc7430af..f10c4f588 100644
--- a/docs/ko/docs/tutorial/security/simple-oauth2.md
+++ b/docs/ko/docs/tutorial/security/simple-oauth2.md
@@ -32,7 +32,7 @@ OAuth2ë (ė°ëĻŦę° ėŦėŠíęŗ ėë) "í¨ė¤ėë íëĄė°"ė ėŦėŠí
* `instagram_basic`ė íė´ė¤ëļ/ė¸ė¤í꡸ë¨ėė ėŦėŠíŠëë¤.
* `https://www.googleapis.com/auth/drive`ë Googleėė ėŦėŠíŠëë¤.
-/// ė ëŗ´
+/// info | ė ëŗ´
OAuth2ėė "ë˛ė"ë íėí íšė ęļíė ė ė¸íë ëŦ¸ėė´ė
ëë¤.
@@ -61,7 +61,7 @@ OAuth2ė ę˛Ŋė° ëŦ¸ėė´ėŧ ëŋė
ëë¤.
* `scope`ë ė íė ė¸ íëëĄ ęŗĩë°ąėŧëĄ ęĩŦëļë ëŦ¸ėė´ëĄ ęĩŦėąë í° ëŦ¸ėė´ė
ëë¤.
* `grant_type`(ė íė ėŧëĄ ėŦėŠ).
-/// í
+/// tip | í
OAuth2 ėŦėė ė¤ė ëĄ `password`ëŧë ęŗ ė ę°ė´ ėë `grant_type` íëëĨŧ *ėęĩŦ*íė§ë§ `OAuth2PasswordRequestForm`ė ė´ëĨŧ ę°ėíė§ ėėĩëë¤.
@@ -72,7 +72,7 @@ OAuth2 ėŦėė ė¤ė ëĄ `password`ëŧë ęŗ ė ę°ė´ ėë `grant_type`
* `client_id`(ė íė ėŧëĄ ėŦėŠ) (ėė ėėë íėíė§ ėėĩëë¤).
* `client_secret`(ė íė ėŧëĄ ėŦėŠ) (ėė ėėë íėíė§ ėėĩëë¤).
-/// ė ëŗ´
+/// info | ė ëŗ´
`OAuth2PasswordRequestForm`ė `OAuth2PasswordBearer`ė ę°ė´ **FastAPI**ė ëí íšė í´ëė¤ę° ėëëë¤.
@@ -86,7 +86,7 @@ OAuth2 ėŦėė ė¤ė ëĄ `password`ëŧë ęŗ ė ę°ė´ ėë `grant_type`
### íŧ ë°ė´í° ėŦėŠí기
-/// í
+/// tip | í
ėĸ
ėėą í´ëė¤ `OAuth2PasswordRequestForm`ė ė¸ė¤í´ė¤ėë ęŗĩë°ąėŧëĄ ęĩŦëļë 긴 ëŦ¸ėė´ė´ ėë `scope` ėėąė´ ėęŗ ëė ė ėĄë ę° ë˛ėė ëí ė¤ė ëŦ¸ėė´ ëĒŠëĄė´ ėë `scopes` ėėąė´ ėėĩëë¤.
@@ -126,7 +126,7 @@ OAuth2 ėŦėė ė¤ė ëĄ `password`ëŧë ęŗ ė ę°ė´ ėë `grant_type`
ë°ëŧė í´ėģ¤ë ë¤ëĨ¸ ėė¤í
ėė ëėŧí ėí¸ëĨŧ ėŦėŠíë ¤ęŗ ėëí ė ėėĩëë¤(ë§ė ėŦėŠėę° ëǍë ęŗŗėė ëėŧí ėí¸ëĨŧ ėŦėŠíë¯ëĄ ė´ë ėíí ė ėėĩëë¤).
-//// tab | Píė´ėŦ 3.7 ė´ė
+//// tab | íė´ėŦ 3.7 ė´ė
{* ../../docs_src/security/tutorial003.py hl[80:83] *}
@@ -150,7 +150,7 @@ UserInDB(
)
```
-/// ė ëŗ´
+/// info | ė ëŗ´
`**user_dict`ė ëí ėė¸í ė¤ëĒ
ė [**ėļę° ëǍë¸** ëŦ¸ė](../extra-models.md#about-user_indict){.internal-link target=_blank}ëĨŧ ë¤ė ėŊė´ë´
ėë¤.
@@ -166,7 +166,7 @@ UserInDB(
ė´ ę°ë¨í ėė ėėë ėė í ėė íė§ ėęŗ , ëėŧí `username`ė í í°ėŧëĄ ë°ííŠëë¤.
-/// í
+/// tip | í
ë¤ė ėĨėėë í¨ė¤ėë í´ėą ë° JWT í í°ė ėŦėŠíėŦ ė¤ė ëŗ´ė ęĩŦíė ëŗŧ ė ėėĩëë¤.
@@ -176,7 +176,7 @@ UserInDB(
{* ../../docs_src/security/tutorial003.py hl[85] *}
-/// í
+/// tip | í
ėŦėė ë°ëŧ ė´ ėė ė ëėŧíę˛ `access_token` ë° `token_type`ė´ íŦí¨ë JSONė ë°íí´ėŧ íŠëë¤.
@@ -202,7 +202,7 @@ UserInDB(
{* ../../docs_src/security/tutorial003.py hl[58:66,69:72,90] *}
-/// ė ëŗ´
+/// info | ė ëŗ´
ėŦ기ė ë°ííë ę°ė´ `Bearer`ė¸ ėļę° í¤ë `WWW-Authenticate`ë ėŦėė ėŧëļė
ëë¤.
diff --git a/docs/ko/docs/virtual-environments.md b/docs/ko/docs/virtual-environments.md
new file mode 100644
index 000000000..0d10c3200
--- /dev/null
+++ b/docs/ko/docs/virtual-environments.md
@@ -0,0 +1,846 @@
+# ę°ė íę˛Ŋ
+
+Python íëĄė í¸ëĨŧ ėė
í ëë **ę°ė íę˛Ŋ** (ëë ė´ė ė ėŦí ëęĩŦ)ė ėŦėŠíë ę˛ė´ ėĸėĩëë¤. ę° íëĄė í¸ ë§ë¤ ė¤ėšíë í¨í¤ė§ëĨŧ ëļëĻŦíėŦ ę´ëĻŦí ė ėėĩëë¤.
+
+/// info | ė ëŗ´
+
+ė´ë¯¸ ę°ė íę˛Ŋė ëí´ ė ėęŗ ėë¤ëŠ´, ė´ ėšė
ė ęą´ë ë°ė´ë ę´ė°Žėĩëë¤. đ¤
+
+///
+
+/// tip | í
+
+**ę°ė íę˛Ŋ(Virtual Environment)** ė **íę˛Ŋ ëŗė(Environment Variable)** ė ë¤ëĻ
ëë¤.
+
+**íę˛Ŋ ëŗė**ë ėė¤í
ė ėĄ´ėŦí늰, íëĄęˇ¸ë¨ė´ ėŦėŠí ė ėë ëŗėė
ëë¤.
+
+**ę°ė íę˛Ŋ**ė ëĒëĒ íėŧëĄ ęĩŦėąë íëė ëë í°ëĻŦė
ëë¤.
+
+///
+
+/// info | ė ëŗ´
+
+ė´ íė´ė§ėėë **ę°ė íę˛Ŋ**ė ėŦėŠ ë°Šë˛ęŗŧ ėë ë°Šėė ė¤ëĒ
íŠëë¤.
+
+ë§ėŊ **ëǍë ę˛ė ę´ëĻŦí´ėŖŧë ëęĩŦ** (Python ė¤ėšęšė§ íŦí¨)ëĨŧ ėŦėŠíęŗ ėļë¤ëŠ´ uv ëĨŧ ėŦėŠí´ëŗ´ė¸ė.
+
+///
+
+## íëĄė í¸ ėėą
+
+ë¨ŧė , íëĄė í¸ëĨŧ ėí ëë í°ëĻŦëĨŧ íë ėėąíŠëë¤.
+
+ëŗ´íĩ ėŦėŠė í ëë í°ëĻŦ ėė `code`ëŧë ëë í°ëĻŦëĨŧ ë§ë¤ęŗ , ꡸ ėė íëĄė í¸ë§ë¤ íëėŠ ëë í°ëĻŦëĨŧ ë§ë¤ė´ ę´ëĻŦíŠëë¤.
+
+
+
+```console
+// í ëë í°ëĻŦëĄ ė´ë
+$ cd
+// ëǍë ėŊë íëĄė í¸ëĨŧ ėí ëë í°ëĻŦ ėėą
+$ mkdir code
+// code ëë í°ëĻŦëĄ ė´ë
+$ cd code
+// ė´ë˛ íëĄė í¸ëĨŧ ėí ëë í°ëĻŦ ėėą
+$ mkdir awesome-project
+// í´ëš íëĄė í¸ ëë í°ëĻŦëĄ ė´ë
+$ cd awesome-project
+```
+
+
+
+## ę°ė íę˛Ŋ ėėą
+
+Python íëĄė í¸ëĨŧ **ė˛ė ėėí ë**, ę°ė íę˛Ŋė **íëĄė í¸ ë´ëļ **ė ėėąíŠëë¤.
+
+/// tip | í
+
+ė´ ėė
ė **íëĄė í¸ëĨŧ ė˛ė ė¤ė í ë íë˛ë§** í´ėŖŧ늴 ëŠëë¤. ė´í ėė
í ë ë°ëŗĩí íėë ėėĩëë¤.
+
+///
+
+//// tab | `venv`
+
+Python íė¤ ëŧė´ë¸ëŦëĻŦė íŦí¨ë venv ëǍëė ėŦėŠí´ ę°ė íę˛Ŋė ėėąí ė ėėĩëë¤.
+
+
+
+```console
+$ python -m venv .venv
+```
+
+
+
+/// details | ëĒ
ë šė´ ėė¸ ė¤ëĒ
+
+* `python`: `python` íëĄęˇ¸ë¨ė ė¤ííŠëë¤.
+* `-m`: íšė ëǍëė ė¤íŦëĻŊí¸ė˛ëŧ ė¤ííŠëë¤. ëė ëǍëė ë°ëĄ ë¤ė ė§ė íŠëë¤.
+* `venv`: Python íė¤ ëŧė´ë¸ëŦëĻŦė íŦí¨ë `venv` ëǍëė ė¤ííŠëë¤.
+* `.venv`: ę°ė íę˛Ŋė `.venv` ëë í°ëĻŦė ėėąíŠëë¤.
+
+///
+
+////
+
+//// tab | `uv`
+
+`uv` ę° ė¤ėšëė´ ėë¤ëŠ´, uvëĨŧ íĩí´ ę°ė íę˛Ŋė ėėąí ė ėėĩëë¤.
+
+
+
+```console
+$ uv venv
+```
+
+
+
+/// tip | í
+
+`uv`ë ę¸°ëŗ¸ė ėŧëĄ `.venv` ëë í°ëĻŦė ę°ė íę˛Ŋė ėėąíŠëë¤.
+
+ëŗëëĄ ëë í°ëĻŦ ė´ëĻė ėļę° ė¸ėëĄ ë겨 ėŖŧ늴 ę˛ŊëĄëĨŧ ė§ė í ė ėėĩëë¤.
+
+///
+
+////
+
+í´ëš ëĒ
ë šė´ë `.venv` ëë í°ëĻŦė ėëĄė´ ę°ė íę˛Ŋė ėėąíŠëë¤.
+
+/// details | `.venv` ëë ë¤ëĨ¸ ė´ëĻ
+
+ę°ė íę˛Ŋė ë¤ëĨ¸ ëë í°ëĻŦė ėėąí ėë ėė§ë§, ę´ëĄė ėŧëĄ `.venv` ëë í°ëĻŦ ė´ëĻė ėŦėŠíŠëë¤.
+
+///
+
+## ę°ė íę˛Ŋ íėąí
+
+ė´í ė¤ííë Python ëĒ
ë šė´ė í¨í¤ė§ ė¤ėšę° ę°ė íę˛Ŋė ë°ëĨ´ëëĄ, ę°ė íę˛Ŋė íėąííė¸ė.
+
+/// tip | í
+
+**í°ë¯¸ëė ėëĄ ė´ęŗ ** íëĄė í¸ ėė
ė ėėí ëë, **íė ė´ ėė
ė** í´ėŖŧė¸ė.
+
+///
+
+//// tab | Linux, macOS
+
+
+
+```console
+$ source .venv/bin/activate
+```
+
+
+
+////
+
+//// tab | Windows PowerShell
+
+
+
+```console
+$ .venv\Scripts\Activate.ps1
+```
+
+
+
+////
+
+//// tab | Windows Bash
+
+Windowsėė Bash(ė: Git Bash )ëĨŧ ėŦėŠíë ę˛Ŋė°:
+
+
+
+```console
+$ source .venv/Scripts/activate
+```
+
+
+
+////
+
+/// tip | í
+
+ę°ė íę˛Ŋė ėëĄė´ í¨í¤ė§ëĨŧ ė¤ėší ëë§ë¤, í´ëš íę˛Ŋė ë¤ė íėąííė¸ė.
+
+ė´ë ę˛ í늴 í´ëš í¨í¤ė§ëĄ ė¤ėšë **í°ë¯¸ë(CLI ) íëĄęˇ¸ë¨**ė ėŦėŠí ë, ė ėė ė¤ėšë ë¤ëĨ¸ ë˛ė ė´ ėëëŧ, ę°ė íę˛Ŋ ėė ė¤ėšë ė íí ë˛ė ė ėŦėŠíŠëë¤.
+
+///
+
+## ę°ė íę˛Ŋė´ íėąí ėŦëļ íė¸
+
+ę°ė íę˛Ŋė´ íėąíëėëė§ íė¸íŠëë¤. (ė´ė ëĒ
ë šė´ę° ė ëëĄ ėëíëė§ íė¸íŠëë¤).
+
+/// tip | í
+
+ė´ ë¨ęŗë **ė í ėŦí**ė´ė§ë§, ëǍë ę˛ė´ ėėëëĄ ėëíęŗ ėëė§, ꡸ëĻŦęŗ ėëí ę°ė íę˛Ŋė´ íėąí ëėë ė§ **íė¸**íë ėĸė ë°Šë˛ė
ëë¤.
+
+///
+
+//// tab | Linux, macOS, Windows Bash
+
+
+
+```console
+$ which python
+
+/home/user/code/awesome-project/.venv/bin/python
+```
+
+
+
+`python` ėėšę° íëĄė í¸ ë´ëļ(ė´ ėėėėë `awesome-project`)ė `.venv/bin/python` ę˛ŊëĄëĄ íėëë¤ëŠ´ ėąęŗĩė
ëë¤. đ
+
+////
+
+//// tab | Windows PowerShell
+
+
+
+```console
+$ Get-Command python
+
+C:\Users\user\code\awesome-project\.venv\Scripts\python
+```
+
+
+
+`python` ėėšę° íëĄė í¸ ë´ëļ(ė´ ėėėėë `awesome-project`)ė `.venv\bin\python` ę˛ŊëĄëĄ íėëë¤ëŠ´ ėąęŗĩė
ëë¤. đ
+
+////
+
+## pip ė
꡸ë ė´ë
+
+/// tip | í
+
+`uv` ëĨŧ ėŦėŠíë¤ëŠ´, `pip` ëė `uv`ëĄ í¨í¤ė§ëĨŧ ė¤ėšíę˛ ëë¯ëĄ `pip`ė ė
꡸ë ė´ëí íėę° ėėĩëë¤. đ
+
+///
+
+`pip`ė ėŦėŠíėŦ í¨í¤ė§ëĨŧ ė¤ėšíë ę˛Ŋė° (Python íė¤ ëŧė´ë¸ëŦëĻŦė íŦí¨ëė´ ėėĩëë¤), **ėĩė ë˛ė ėŧëĄ ė
꡸ë ė´ë**íë ę˛ė´ ėĸėĩëë¤.
+
+í¨í¤ė§ ė¤ėš ė¤ ë°ėíë ë¤ėíęŗ íšė´í ėëŦë¤ė `pip` ė
꡸ë ė´ëëĄ ėŊę˛ í´ę˛°ëë ę˛Ŋė°ę° ë§ėĩëë¤.
+
+/// tip | í
+
+ė´ ėė
ė ëŗ´íĩ ę°ė íę˛Ŋė ėėąí **ė§í í ë˛ë§** í늴 ëŠëë¤.
+
+///
+
+ę°ė íę˛Ŋė´ íėąíë ėíė¸ė§ íė¸í í(ėė ė¤ëĒ
í ëĒ
ë šė´ ėŦėŠ), ėë ëĒ
ë šė´ëĨŧ ė¤ííė¸ė:
+
+
+
+```console
+$ python -m pip install --upgrade pip
+
+---> 100%
+```
+
+
+
+## `.gitignore` ėļę°í기
+
+**Git**ė ėŦėŠíęŗ ėë¤ëŠ´ (ėŦėŠíë ę˛ė´ ėĸėĩëë¤), `.gitignore` íėŧė ėļę°í´ė `.venv` ëë í°ëĻŦ ė 랴ëĨŧ Gitėė ė ė¸íė¸ė.
+
+/// tip | í
+
+`uv` ëĨŧ ėŦėŠí´ ę°ė íę˛Ŋė ėėąíë¤ëŠ´, ė´ë¯¸ ė´ ėė
ė´ ėëėŧëĄ ė˛ëĻŦëė´ ėėŧë¯ëĄ ė´ ë¨ęŗë ęą´ëë°ė´ë ëŠëë¤. đ
+
+///
+
+/// tip | í
+
+ė´ ėė
ë ë§ė°Ŧę°ė§ëĄ, ę°ė íę˛Ŋė ėėąí **ė§í í ë˛ë§** í늴 ëŠëë¤.
+
+///
+
+
+
+```console
+$ echo "*" > .venv/.gitignore
+```
+
+
+
+/// details | ëĒ
ë šė´ ėė¸ ė¤ëĒ
+
+* `echo "*"`: í°ë¯¸ëė `*` í
ė¤í¸ëĨŧ "ėļë Ĩ"íŠëë¤ (ë¤ė ė¤ëĒ
ėė ėĄ°ę¸ ë°ëëë¤)
+* `>`: ėŧėĒŊ ëĒ
ë šė´ė ėļë Ĩ ë´ėŠė í°ë¯¸ëė ėļë Ĩíė§ ėęŗ , ė¤ëĨ¸ėĒŊė ė§ė ë íėŧëĄ **기ëĄ(write)** íëŧë ė미ė
ëë¤.
+* `.gitignore`: ėļë Ĩë í
ė¤í¸ę° 기ëĄë íėŧ ė´ëĻė
ëë¤.
+
+꡸ëĻŦęŗ Gitėė `*`ë "ëǍë ę˛"ė ė미íŠëë¤. ë°ëŧė `.venv` ëë í°ëĻŦ ėė ëǍë ę˛ė ëŦ´ėíę˛ ëŠëë¤.
+
+ė´ ëĒ
ë šė´ë ë¤ėęŗŧ ę°ė ë´ėŠė ę°ė§ `.gitignore` íėŧė ėėąíŠëë¤:
+
+
+```gitignore
+*
+```
+
+///
+
+## í¨í¤ė§ ė¤ėš
+
+ę°ė íę˛Ŋė íėąíí í, ꡸ ėė íėí í¨í¤ė§ë¤ė ė¤ėší ė ėėĩëë¤.
+
+/// tip | í
+
+íëĄė í¸ėė íėí í¨í¤ė§ëĨŧ ė¤ėšíęą°ë ė
꡸ë ė´ëí ëë ė´ ėė
ė **í ë˛ë§** í늴 ëŠëë¤.
+
+ë§ėŊ íšė í¨í¤ė§ė ë˛ė ė ė
꡸ë ė´ëíęą°ë, ėëĄė´ í¨í¤ė§ëĨŧ ėļę°í íėę° ė기늴 **ë¤ė ė´ ėė
ė ë°ëŗĩ**í늴 ëŠëë¤.
+
+///
+
+### í¨í¤ė§ ė§ė ė¤ėš
+
+ę¸íę˛ ėė
íęą°ë, íëĄė í¸ė íėí í¨í¤ė§ ëĒŠëĄė ë°ëĄ íėŧëĄ ę´ëĻŦíęŗ ėļė§ ėė ę˛Ŋė°, í¨í¤ė§ëĨŧ ė§ė ė¤ėší ėë ėėĩëë¤.
+
+/// tip | í
+
+í¨í¤ė§ ė´ëĻęŗŧ ë˛ė ė ëŗ´ëĨŧ íėŧė ė ëĻŦí´ëë ę˛(ė: `requirements.txt` ëë `pyproject.toml`)ė (매ė°) ėĸė ėę°ė
ëë¤.
+
+///
+
+//// tab | `pip`
+
+
+
+```console
+$ pip install "fastapi[standard]"
+
+---> 100%
+```
+
+
+
+////
+
+//// tab | `uv`
+
+`uv` ëĨŧ ėŦėŠíë ę˛Ŋė°:
+
+
+
+```console
+$ uv pip install "fastapi[standard]"
+---> 100%
+```
+
+
+
+////
+
+### `requirements.txt`ėė ė¤ėš
+
+`requirements.txt` íėŧė´ ėë¤ëŠ´, ꡸ ėė ëĒ
ėë í¨í¤ė§ë¤ė í ë˛ė ė¤ėší ė ėėĩëë¤.
+
+//// tab | `pip`
+
+
+
+```console
+$ pip install -r requirements.txt
+---> 100%
+```
+
+
+
+////
+
+//// tab | `uv`
+
+`uv` ëĨŧ ėŦėŠíë ę˛Ŋė°:
+
+
+
+```console
+$ uv pip install -r requirements.txt
+---> 100%
+```
+
+
+
+////
+
+/// details | `requirements.txt`
+
+ë¤ėė ëĒ ę°ė§ í¨í¤ė§ëĨŧ íŦí¨í `requirements.txt`ė ėėė
ëë¤:
+
+```requirements.txt
+fastapi[standard]==0.113.0
+pydantic==2.8.0
+```
+
+///
+
+## íëĄęˇ¸ë¨ ė¤í
+
+ę°ė íę˛Ŋė íėąíí íėë íëĄęˇ¸ë¨ė ė¤íí ė ėėĩëë¤. ė´ë í´ëš ę°ė íę˛Ŋė ė¤ėšë Pythonęŗŧ í¨í¤ė§ë¤ė´ ėŦėŠëŠëë¤.
+
+
+
+```console
+$ python main.py
+
+Hello World
+```
+
+
+
+## ėëí° ė¤ė
+
+ėëí°ëĨŧ ėŦėŠí ę˛Ŋė°, ėė ë§ë ę°ė íę˛Ŋė ėŦėŠíëëĄ ė¤ė íë ę˛ė´ ėĸėĩëë¤. (ëëļëļė ėëí°ë ėëėŧëĄ ę°ė§í기ë íŠëë¤.)
+ė´ë ę˛ í늴 ėë ėėą ę¸°ëĨė´ë ėŊë ë´ ė¤ëĨ íė 기ëĨė ė ëëĄ ėŦėŠí ė ėėĩëë¤.
+
+ėė:
+
+* VS Code
+* PyCharm
+
+/// tip | í
+
+ė´ ė¤ė ė ëŗ´íĩ ę°ė íę˛Ŋė **ė˛ė ë§ë¤ėė ë í ë˛ë§** í´ėŖŧ늴 ëŠëë¤.
+
+///
+
+## ę°ė íę˛Ŋ ëšíėąí
+
+íëĄė í¸ ėė
ė´ ëëŦë¤ëŠ´, ę°ė íę˛Ŋė **ëšíėąí**í ė ėėĩëë¤.
+
+
+
+```console
+$ deactivate
+```
+
+
+
+ė´ë ę˛ í늴 ė´íė `python` ëĒ
ë šė´ëĨŧ ė¤ííė ë, ę°ė íę˛Ŋė Pythonė´ë ꡸ ėė ė¤ėšë í¨í¤ė§ë¤ė ėŦėŠíė§ ėę˛ ëŠëë¤.
+
+## ė´ė ėė
í ė¤ëšę° ëėėĩëë¤
+
+ė´ė íëĄė í¸ ėė
ė ėėí ė¤ëšę° ėëŖëėėĩëë¤.
+
+
+/// tip | í
+
+ė ë´ėŠė ë ęšė´ ė´í´íęŗ ėļėŧė ę°ė?
+
+꡸ë ë¤ëŠ´ ęŗė ėŊė´ ėŖŧė¸ė. đđ¤
+
+///
+
+## ę°ė íę˛Ŋė ė ėŦėŠíëę°
+
+FastAPIëĨŧ ėŦėŠíë ¤ëŠ´ ë¨ŧė Python ė ė¤ėší´ėŧ íŠëë¤.
+
+꡸ íėë FastAPIė í¨ęģ ėŦėŠí **기í í¨í¤ė§ë¤**ė **ė¤ėš**í´ėŧ íŠëë¤.
+
+í¨í¤ė§ëĨŧ ė¤ėší ë ëŗ´íĩ Pythonė ę¸°ëŗ¸ íŦí¨ë `pip` ëĒ
ë šė´(ëë ė ėŦí ëęĩŦ)ëĨŧ ėŦėŠíŠëë¤.
+
+íė§ë§ `pip`ė ꡸ëĨ ė§ė ėŦėŠí늴, í´ëš í¨í¤ė§ë¤ė **ė ė Python íę˛Ŋ**(ėė¤í
ė 랴ė ė¤ėšë Python)ė ė¤ėšëŠëë¤.
+
+### ëŦ¸ė ė
+
+꡸ë ë¤ëŠ´, ė ė Python íę˛Ŋė í¨í¤ė§ëĨŧ ė¤ėší늴 ė´ë¤ ëŦ¸ė ę° ë°ėí ęšė?
+
+ė´ë ėė ė´ ë늴, **ėëĄ ë¤ëĨ¸ í¨í¤ė§ë¤**ė ėėĄ´íë ėŦëŦ ę°ė íëĄęˇ¸ë¨ė ėėąíę˛ ë ę˛ė
ëë¤. ꡸ëĻŦęŗ ė´ë¤ ė¤ ėŧëļë **ę°ė í¨í¤ė§ė ėëĄ ë¤ëĨ¸ ë˛ė **ė íėëĄ í ė ėėĩëë¤. đą
+
+ėëĨŧ ë¤ė´, `ë§ë˛ėŦė ë(philosophers-stone)` íëĄė í¸ëĨŧ ë§ë¤ėë¤ęŗ ę°ė í´ë´
ėë¤. ė´ íëĄęˇ¸ë¨ė `í´ëĻŦ íŦí°(harry)`ëŧë í¨í¤ė§ė `v1` ë˛ė ė **ėėĄ´**íŠëë¤. ë°ëŧė `harry`ëĨŧ ė¤ėší´ėŧ íŠëë¤.
+
+```mermaid
+flowchart LR
+ stone(philosophers-stone) -->|requires| harry-1[harry v1]
+```
+
+꡸ë°ë° ëė¤ė `ėėĻėš´ë°ė ėŖė(prisoner-of-azkaban)`ė´ëŧë ë ë¤ëĨ¸ íëĄė í¸ëĨŧ ë§ë¤ę˛ ëėęŗ , ė´ íëĄė í¸ë ėė `harry` í¨í¤ė§ëĨŧ ėŦėŠíŠëë¤. ꡸ë°ë° ė´ íëĄė í¸ë `harry`ė `v3` ë˛ė ė´ íėíŠëë¤.
+
+```mermaid
+flowchart LR
+ azkaban(prisoner-of-azkaban) --> |requires| harry-3[harry v3]
+```
+
+íė§ë§ ė´ė ëŦ¸ė ę° ėęšëë¤. ëĄėģŦ ę°ė íę˛Ŋ ëė ė ė ė íę˛Ŋė í¨í¤ė§ëĨŧ ė¤ėšíę˛ ë늴, ė´ë¤ ë˛ė ė `harry`ëĨŧ ė¤ėší ė§ëĨŧ ė íí´ėŧ í기 ëëŦ¸ė
ëë¤.
+
+ėëĨŧ ë¤ė´, `ë§ë˛ėŦė ë(philosophers-stone)`ė ė¤ííęŗ ėļë¤ëŠ´ ë¨ŧė `harry` `v1` ë˛ė ė ë¤ėęŗŧ ę°ė´ ė¤ėš í´ėŧ íŠëë¤:
+
+
+
+```console
+$ pip install "harry==1"
+```
+
+
+
+꡸ëŦ늴 결ęĩ ė ė Python íę˛Ŋėë `harry` `v1`ë˛ė ė´ ė¤ėšë ėíę° ëŠëë¤.
+
+```mermaid
+flowchart LR
+ subgraph global[global env]
+ harry-1[harry v1]
+ end
+ subgraph stone-project[philosophers-stone project]
+ stone(philosophers-stone) -->|requires| harry-1
+ end
+```
+
+íė§ë§ ė´ė `ėėĻėš´ë°ė ėŖė(prisoner-of-azkaban)`ė ė¤ííęŗ ėļë¤ëŠ´, `harry` `v1`ë˛ė ė ė ęą°íęŗ `harry` `v3`ë˛ė ė ė¤ėší´ėŧ íŠëë¤. (ëë ë¨ėí `v3`ë˛ė ė ė¤ėšíë ę˛ë§ėŧëĄë ę¸°ėĄ´ė `v1`ë˛ė ė´ ėëėŧëĄ ė ęą°ëŠëë¤.)
+
+
+
+```console
+$ pip install "harry==3"
+```
+
+
+
+꡸ë ę˛ í늴 ė´ė ė ė Python íę˛Ŋėë `harry` `v3`ë˛ė ė´ ė¤ėšë ėíę° ëŠëë¤.
+
+꡸ëĻŦęŗ ë¤ė `ë§ë˛ėŦė ë(philosophers-stone)`ė ė¤ííë ¤ęŗ í늴, **ėëíė§** ėė ė ėėĩëë¤. ėëí늴 ė´ íëĄęˇ¸ë¨ė `harry` `v1`ë˛ė ė íėëĄ í기 ëëŦ¸ė
ëë¤.
+
+```mermaid
+flowchart LR
+ subgraph global[global env]
+ harry-1[harry v1 ]
+ style harry-1 fill:#ccc,stroke-dasharray: 5 5
+ harry-3[harry v3]
+ end
+ subgraph stone-project[philosophers-stone project]
+ stone(philosophers-stone) -.-x|âī¸| harry-1
+ end
+ subgraph azkaban-project[prisoner-of-azkaban project]
+ azkaban(prisoner-of-azkaban) --> |requires| harry-3
+ end
+```
+
+/// tip | í
+
+Python í¨í¤ė§ë¤ė **ė ë˛ė **ėė **í¸íėą ëŦ¸ė (breaking changes)**ę° ë°ėíė§ ėëëĄ ėĩëí ë
¸ë Ĩíë ę˛ė´ ėŧë°ė ė
ëë¤. íė§ë§ ꡸ëë ėė íę˛ ėė
íë ¤ëŠ´, í
ė¤í¸ëĨŧ ė¤íí´ëŗ´ëŠ´ė ė ë˛ė ė ėëė ėŧëĄ ė¤ėšíë ę˛ė´ ėĸėĩëë¤.
+
+///
+
+ė´ė , ė´ë° ėŧė´ ėŦëŦëļė **ëǍë íëĄė í¸**ę° ėŦėŠíë **ėë§ė í¨í¤ė§ë¤**ėė ëėė ë°ėíë¤ęŗ ėėí´ëŗ´ė¸ė. ė´ë ë§¤ė° ę´ëĻŦí기 ė´ë ¤ė°ëа, 결ęĩ **ėëĄ í¸íëė§ ėë ë˛ė **ė í¨í¤ė§ëĄ íëĄė í¸ëĨŧ ė¤ííę˛ ë ę°ëĨėąė´ ëęŗ , ęˇ¸ëĄ ė¸í´ ė´ë¤ ëŦ¸ė ę° ė ë°ėíëė§ ė ė ėę˛ ë ė ėėĩëë¤.
+
+ëí ėŦėŠíë ė´ė랴ė (Linux, Windows, macOS ëą)ė ë°ëŧ Pythonė´ **미ëĻŦ ė¤ėšëė´ ėė ėë** ėėĩëë¤. ė´ë° ę˛Ŋė°ėë ė´ė랴ė ė ëėė íėí íšė ë˛ė ė í¨í¤ė§ë¤ė´ í¨ęģ ė¤ėšëė´ ėė ė ėėĩëë¤. ė´ ėíėė ė ė Python íę˛Ŋė ėėė í¨í¤ė§ëĨŧ ė¤ėší늴, ė´ė랴ė ė íŦí¨ë íëĄęˇ¸ë¨ ėŧëļę° **ęš¨ė§ ėí**ë ėėĩëë¤.
+
+## í¨í¤ė§ë¤ė ė´ëė ė¤ėšëëę°
+
+Pythonė ė¤ėší늴, ėģ´í¨í°ė ėŦëŦ ëë í°ëĻŦė íėŧë¤ė´ ėėąëŠëë¤.
+
+ė´ ė¤ ėŧëļ ëë í°ëĻŦë ėŦėŠėę° ė¤ėší í¨í¤ė§ë¤ė ëŗ´ę´íë ėí ė íŠëë¤.
+
+ėëĨŧ ë¤ė´, ėë ëĒ
ë šė´ëĨŧ ė¤íí늴:
+
+
+
+```console
+// ė§ę¸ ė¤ííė§ ėėë ëŠëë¤, ꡸ëĨ ėė ėŧ ëŋė´ėė đ¤
+$ pip install "fastapi[standard]"
+---> 100%
+```
+
+
+
+í´ëš ëĒ
ë šė´ë FastAPI ėŊëëĨŧ íŦí¨í ėėļ íėŧė ë¤ė´ëĄëíŠëë¤. ė´ íėŧė ëŗ´íĩ PyPI ėė ë°ėėĩëë¤.
+
+ëí FastAPIę° ėėĄ´íë ë¤ëĨ¸ í¨í¤ė§ë¤ë í¨ęģ **ë¤ė´ëĄë**ëŠëë¤.
+
+꡸ëĻŦęŗ ęˇ¸ ëǍë íėŧë¤ė **ėėļ í´ė **í ë¤, ėģ´í¨í°ė íšė ëë í°ëĻŦė ė ėĨíŠëë¤.
+
+ę¸°ëŗ¸ė ėŧëĄ ė´ íėŧë¤ė Pythonė´ ė¤ėšë ëë í°ëĻŦ ė, ėĻ **ė ė íę˛Ŋ**ė ë´ė ëë í°ëĻŦė ė ėĨëŠëë¤.
+
+## ę°ė íę˛Ŋė´ë
+
+ė ė íę˛Ŋė ëǍë í¨í¤ė§ëĨŧ ė¤ėší늴ė ë°ėíë ëŦ¸ė ė ëí í´ę˛°ėą
ė, ėė
íë **ę° íëĄė í¸ë§ë¤ ę°ė íę˛Ŋ**ė ėŦėŠíë ę˛ė
ëë¤.
+
+ę°ė íę˛Ŋė ė ė íę˛Ŋęŗŧ ë§¤ė° ė ėŦí íëė **ëë í°ëĻŦ**ė´ëа, ꡸ ėė í´ëš íëĄė í¸ëĨŧ ėí í¨í¤ė§ë¤ė ė¤ėší ė ėėĩëë¤.
+
+ė´ë ę˛ í늴 ę° íëĄė í¸ë ė랴ė ė¸ ę°ė íę˛Ŋ(`.venv` ëë í°ëĻŦ)ė ę°ė§ę˛ ë늰, ꡸ ėė í´ëš íëĄė í¸ ė ėŠ í¨í¤ė§ë¤ė ëŗ´ė íę˛ ëŠëë¤.
+
+
+```mermaid
+flowchart TB
+ subgraph stone-project[philosophers-stone project]
+ stone(philosophers-stone) --->|requires| harry-1
+ subgraph venv1[.venv]
+ harry-1[harry v1]
+ end
+ end
+ subgraph azkaban-project[prisoner-of-azkaban project]
+ azkaban(prisoner-of-azkaban) --->|requires| harry-3
+ subgraph venv2[.venv]
+ harry-3[harry v3]
+ end
+ end
+ stone-project ~~~ azkaban-project
+```
+
+## ę°ė íę˛Ŋ íėąí ė미
+
+ę°ė íę˛Ŋė íėąííë¤ë ę˛ė, ėëĨŧ ë¤ė´ ë¤ėęŗŧ ę°ė ëĒ
ë šė´ëĨŧ ė¤ííë ę˛ė ė미íŠëë¤:
+
+//// tab | Linux, macOS
+
+
+
+```console
+$ source .venv/bin/activate
+```
+
+
+
+////
+
+//// tab | Windows PowerShell
+
+
+
+```console
+$ .venv\Scripts\Activate.ps1
+```
+
+
+
+////
+
+//// tab | Windows Bash
+
+Windowsėė Bash(ė: Git Bash )ëĨŧ ėŦėŠíë ę˛Ŋė°:
+
+
+
+```console
+$ source .venv/Scripts/activate
+```
+
+
+
+////
+
+ė´ ëĒ
ë šė´ë ė´íė ė¤íë ëĒ
ë šė´ėė ėŦėŠë [íę˛Ŋ ëŗė](environment-variables.md){.internal-link target=_blank} ëĒ ę°ëĨŧ ėėąíęą°ë ėė íŠëë¤.
+
+ė´ ëŗėë¤ ė¤ íëę° ë°ëĄ `PATH` ëŗėė
ëë¤.
+
+/// tip | í
+
+`PATH` íę˛Ŋ ëŗėė ëí´ ë ėęŗ ėļë¤ëŠ´ [íę˛Ŋ ëŗė ëŦ¸ėė PATH íę˛Ŋ ëŗė ėšė
](environment-variables.md#path-environment-variable){.internal-link target=_blank}ė ė°¸ęŗ íė¸ė.
+
+///
+
+ę°ė íę˛Ŋė íėąíí늴, ę°ė íę˛Ŋė ę˛ŊëĄė¸ `.venv/bin` (Linuxė macOS) ëë `.venv\Scripts`(Windows)ëĨŧ `PATH` íę˛Ŋ ëŗėė ėļę°ëŠëë¤.
+
+ėëĨŧ ë¤ė´, ę°ė íę˛Ŋė íėąíí기 ė ė `PATH` ëŗėë ë¤ėęŗŧ ę°ėë¤ęŗ ę°ė í´ë´
ėë¤:
+
+//// tab | Linux, macOS
+
+```plaintext
+/usr/bin:/bin:/usr/sbin:/sbin
+```
+
+ėė¤í
ė ë¤ė ę˛ŊëĄë¤ėė íëĄęˇ¸ë¨ė ė°žę˛ ëŠëë¤:
+
+* `/usr/bin`
+* `/bin`
+* `/usr/sbin`
+* `/sbin`
+
+////
+
+//// tab | Windows
+
+```plaintext
+C:\Windows\System32
+```
+
+ėė¤í
ė ë¤ė ę˛ŊëĄë¤ėė íëĄęˇ¸ë¨ė ė°žę˛ ëŠëë¤:
+
+* `C:\Windows\System32`
+
+////
+
+ę°ė íę˛Ŋė íėąíí íėë, `PATH` ëŗėë ë¤ėęŗŧ ę°ė ííę° ëŠëë¤:
+
+//// tab | Linux, macOS
+
+```plaintext
+/home/user/code/awesome-project/.venv/bin:/usr/bin:/bin:/usr/sbin:/sbin
+```
+
+ėė¤í
ė ę°ėĨ ë¨ŧė ë¤ė ę˛ŊëĄėė íëĄęˇ¸ë¨ė ė°žę¸° ėėíŠëë¤:
+
+```plaintext
+/home/user/code/awesome-project/.venv/bin
+```
+
+꡸ íė ë¤ëĨ¸ ëë í°ëĻŦë¤ė íėíŠëë¤.
+
+ë°ëŧė í°ë¯¸ëė `python`ė ė
ë Ĩí늴, ėė¤í
ė ë¤ė ėėšė ėë Python íëĄęˇ¸ë¨ė ė°žę˛ ëŠëë¤:
+
+```plaintext
+/home/user/code/awesome-project/.venv/bin/python
+```
+
+꡸ëĻŦęŗ í´ëš Pythonė ėŦėŠíę˛ ëŠëë¤.
+
+////
+
+//// tab | Windows
+
+```plaintext
+C:\Users\user\code\awesome-project\.venv\Scripts;C:\Windows\System32
+```
+
+ėė¤í
ė ę°ėĨ ë¨ŧė ë¤ė ę˛ŊëĄėė íëĄęˇ¸ë¨ė ė°žę¸° ėėíŠëë¤:
+
+```plaintext
+C:\Users\user\code\awesome-project\.venv\Scripts
+```
+
+꡸ íė ë¤ëĨ¸ ëë í°ëĻŦë¤ė íėíŠëë¤.
+
+ë°ëŧė í°ë¯¸ëė `python`ė ė
ë Ĩí늴, ėė¤í
ė ë¤ė ę˛ŊëĄė ėë Python íëĄęˇ¸ë¨ė ė°žę˛ ëŠëë¤:
+
+```plaintext
+C:\Users\user\code\awesome-project\.venv\Scripts\python
+```
+
+꡸ëĻŦęŗ í´ëš Pythonė ėŦėŠíę˛ ëŠëë¤.
+
+////
+
+ė¤ėí ė¸ëļ ėŦí ė¤ íëë, ę°ė íę˛Ŋė ę˛ŊëĄę° `PATH` ëŗėė ę°ėĨ **ė**ė ėļę°ëë¤ë ė ė
ëë¤. ėė¤í
ė ėŦėŠ ę°ëĨí ë¤ëĨ¸ Pythonë¤ëŗ´ë¤ **ë¨ŧė ** ė´ ę˛ŊëĄëĨŧ ė°žėĩëë¤. ꡸ëė í°ë¯¸ëėė `python`ė ė¤íí늴, ė ė íę˛Ŋė Pythonė´ ėë **ę°ė íę˛Ŋė ėë** Pythonė´ ėŦėŠëŠëë¤. (ė: ė ė íę˛Ŋė ė¤ėšë `python`ė´ ėëëŧë ęˇ¸ëŗ´ë¤ ė°ė íŠëë¤.)
+
+ę°ė íę˛Ŋė íėąíí늴 ė´ ė¸ėë ëĒ ę°ė§ ë¤ëĨ¸ ę˛ë¤ė´ ëŗę˛Ŋëė§ë§, ė´ë ꡸ė¤ėėë ę°ėĨ ė¤ėí ëŗí ė¤ íëė
ëë¤.
+
+## ę°ė íę˛Ŋ íė¸í기
+
+ę°ė íę˛Ŋė´ íėąí ëėëė§ íė¸íë ¤ëŠ´, ėë ëĒ
ë šė´ëĨŧ ėŦėŠí ė ėėĩëë¤:
+
+//// tab | Linux, macOS, Windows Bash
+
+
+
+```console
+$ which python
+
+/home/user/code/awesome-project/.venv/bin/python
+```
+
+
+
+////
+
+//// tab | Windows PowerShell
+
+
+
+```console
+$ Get-Command python
+
+C:\Users\user\code\awesome-project\.venv\Scripts\python
+```
+
+
+
+////
+
+ėĻ, íėŦ ėŦėŠëë `python` íëĄęˇ¸ë¨ė **ę°ė íę˛Ŋ ë´ëļė ėë ę˛**ė
ëë¤.
+
+Linuxė macOSėėë `which`, Windows PowerShellėėë `Get-Command` ëĒ
ë šė´ëĨŧ ėŦėŠíŠëë¤.
+
+ė´ ëĒ
ë šė´ë `PATH` íę˛Ŋ ëŗėė ė§ė ë ę˛ŊëĄë¤ė **ėėëëĄ íė**í늴ė `python`ė´ëŧë ė´ëĻė íëĄęˇ¸ë¨ė ė°žėĩëë¤.
+ė°žë ėĻė, í´ëš íëĄęˇ¸ë¨ė **ę˛ŊëĄëĨŧ ėļë Ĩ**íŠëë¤.
+
+ė¤ėí ė ė í°ë¯¸ëėė `python`ė ė¤ííė ë, ė¤ė ëĄ ė¤íëë "`python`"ė´ ė´ë¤ ę˛ė¸ė§ ė íí ė ė ėë¤ë ę˛ė
ëë¤.
+
+ë°ëŧė íėŦ ėŦë°ëĨ¸ ę°ė íę˛Ŋė ėëė§ íė¸í ė ėėĩëë¤.
+
+/// tip | í
+
+íëė ę°ė íę˛Ŋė íėąíí ë¤, í´ëš Pythonė ę°ė§ ėíėė **ë ë¤ëĨ¸ íëĄė í¸**ëĄ ė´ëíë ę˛ė íí ë°ėíŠëë¤.
+
+íė§ë§ ė´ë ė´ė íëĄė í¸ė ę°ė íę˛Ŋė ėë **ėëĒģë Python ė¤í íėŧ**ė ėŦėŠíę˛ ëė´ ė íëĄė í¸ę° **ė ė ėëíė§ ėė ė ėėĩëë¤.**
+
+꡸ëė íėŦ ė´ë¤ `python`ė´ ėŦėŠëęŗ ėëė§ íė¸í ė ėë ëĨë Ĩė ë§¤ė° ė ėŠíŠëë¤. đ¤
+
+///
+
+## ę°ė íę˛Ŋė ëšíėąííë ė´ė
+
+ėëĨŧ ë¤ė´ `ë§ë˛ėŦė ë(philosophers-stone)`ė´ëŧë íëĄė í¸ėė ėė
ė¤ė´ëŧęŗ í´ëŗ´ę˛ ėĩëë¤. ė´ë í´ëš **ę°ė íę˛Ŋė íėąí**íęŗ , íėí í¨í¤ė§ëĨŧ ė¤ėší늰 ėė
ė ė§ííŠëë¤.
+
+꡸ë°ë° ė´ė ë **ë¤ëĨ¸ íëĄė í¸**ė¸ `ėėĻėš´ë°ė ėŖė(prisoner-of-azkaban)`ė ėė
íęŗ ėļė´ėĄėĩëë¤.
+
+꡸ëė ꡸ íëĄė í¸ ëë í°ëĻŦëĄ ė´ëíŠëë¤:
+
+
+
+```console
+$ cd ~/code/prisoner-of-azkaban
+```
+
+
+
+ë§ėŊ `ë§ë˛ėŦė ë(philosophers-stone)`ė ę°ė íę˛Ŋė ëšíėąííė§ ėėë¤ëŠ´, í°ë¯¸ëėė `python`ė ė¤íí ë ėŦė í `ë§ë˛ėŦė ë(philosophers-stone)` ę°ė íę˛Ŋė Pythonė ėŦėŠíę˛ ëŠëë¤.
+
+
+
+```console
+$ cd ~/code/prisoner-of-azkaban
+
+$ python main.py
+
+// siriusëĨŧ ėíŦí¸íë ë° ė¤í¨íėĩëë¤. ė¤ėšëė´ ėė§ ėėė đą
+Traceback (most recent call last):
+ File "main.py", line 1, in
+ import sirius
+```
+
+
+
+íė§ë§ `ë§ë˛ėŦė ë(philosophers-stone)`ė ę°ė íę˛Ŋė ëšíėąíí ë¤ė, `ėėĻėš´ë°ė ėŖė(prisoner-of-azkaban)` íëĄė í¸ė ę°ė íę˛Ŋė íėąíí늴, ė´ė `python` ëĒ
ë šė´ë `ėėĻėš´ë°ė ėŖė(prisoner-of-azkaban)` ę°ė íę˛Ŋė Pythonė ėŦėŠíę˛ ëŠëë¤.
+
+
+
+```console
+$ cd ~/code/prisoner-of-azkaban
+
+// ė´ė ëë í°ëĻŦė ėė íė ėė´, ė´ëėë ę°ė íę˛Ŋė ëšíėąíí ė ėėĩëë¤. ë¤ëĨ¸ íëĄė í¸ ëë í°ëĻŦëĄ ė´ëí íėë ę´ė°Žėė đ
+$ deactivate
+
+// prisoner-of-azkaban/.venv ę°ė íę˛Ŋė íėąííŠëë¤ đ
+$ source .venv/bin/activate
+
+// ė´ė pythonė ė¤íí늴, ė´ ę°ė íę˛Ŋė ė¤ėšë sirius í¨í¤ė§ëĨŧ ė°žę˛ ëŠëë¤ â¨
+$ python main.py
+
+ëĒģë ė§ė ęž¸ë¯¸ęŗ ėėė ėėí ë§šė¸íŠëë¤.đ§
+ImportErrorë ė´ė ėėĩëë¤. đē
+```
+
+
+
+## ëėë¤
+
+ė´ ëŦ¸ėë ėŦëŦëļė´ Python íëĄė í¸ëĨŧ ėėíęŗ , **꡸ ë´ëļėė** ė´ëģę˛ ëėę°ëė§ ėë ¤ėŖŧë ę°ë¨í ę°ė´ëė
ëë¤.
+
+ę°ė íę˛Ŋ, í¨í¤ė§ ėėĄ´ėą(Requirements), íëĄė í¸ëĨŧ ę´ëĻŦíë ë°Šë˛ėë ė´ ė¸ėë ë¤ėí **ëė**ë¤ė´ ėĄ´ėŦíŠëë¤.
+
+ë§ėŊ ė¤ëšę° ëėë¤ëŠ´, **íëĄė í¸ ė 랴**, í¨í¤ė§ ėėĄ´ėą, ę°ė íę˛Ŋ ëąė íĩíŠė ėŧëĄ **ę´ëĻŦ**í ė ėë ëęĩŦëĨŧ ė¨ëŗ´ë ę˛ë ėĸėĩëë¤. ęˇ¸ë´ ë ėļė˛íë ëęĩŦę° ë°ëĄ uv ė
ëë¤.
+
+`uv`ë ë¤ėí 기ëĨė ė§ėíŠëë¤:
+
+* ë¤ėí ë˛ė ė **Python ė¤ėš**
+* ę° íëĄė í¸ ëŗ **ę°ė íę˛Ŋ ę´ëĻŦ**
+* **í¨í¤ė§ ė¤ėš**
+* íëĄė í¸ė **ėėĄ´ėąęŗŧ ë˛ė ** ę´ëĻŦ
+* ė¤ėšë í¨í¤ė§ë¤ęŗŧ ꡸ ë˛ė ė **ė íí ęŗ ė (lock)**í´ė,ę°ë° íę˛Ŋęŗŧ ė´ė íę˛Ŋė´ ėė í ëėŧíę˛ ėëí ė ėëëĄ ëŗ´ėĨ
+* ė´ ė¸ėë ë¤ėí 기ëĨė ė§ė
+
+## 결ëĄ
+
+ėŦ기ęšė§ ëǍë ėŊęŗ ė´í´íë¤ëŠ´, ė´ė ë§ė ę°ë°ėë¤ëŗ´ë¤ ę°ė íę˛Ŋė **í¨ėŦ ë ęšė´ ėę˛ ė´í´**íę˛ ëė
¨ėĩëë¤. đ¤
+
+ė´ë° ė¸ëļė ė¸ ë´ėŠė ėęŗ ėėŧ늴, ė¸ė ę° ëŗĩėĄí´ ëŗ´ė´ë ëŦ¸ė ëĨŧ ëë˛ęš
í ë ëļëĒ
í í° ëėė´ ë ę˛ė
ëë¤. ė´ė ë **ė´ ëǍë ę˛ë¤ė´ ë´ëļėė ė´ëģę˛ ėëíëė§** ėęŗ ė기 ëëŦ¸ė
ëë¤. đ
diff --git a/docs/nl/docs/index.md b/docs/nl/docs/index.md
index d88bb7771..32b20e31e 100644
--- a/docs/nl/docs/index.md
+++ b/docs/nl/docs/index.md
@@ -12,7 +12,7 @@
-
+
diff --git a/docs/pl/docs/index.md b/docs/pl/docs/index.md
index 9a96c6553..0e13d2631 100644
--- a/docs/pl/docs/index.md
+++ b/docs/pl/docs/index.md
@@ -11,15 +11,18 @@
FastAPI to szybki, prosty w nauce i gotowy do uÅŧycia w produkcji framework
-
-
+
+
-
-
+
+
+
+
+
---
diff --git a/docs/pt/docs/advanced/generate-clients.md b/docs/pt/docs/advanced/generate-clients.md
index 04d7c0071..dc6b29511 100644
--- a/docs/pt/docs/advanced/generate-clients.md
+++ b/docs/pt/docs/advanced/generate-clients.md
@@ -22,7 +22,7 @@ E isso mostra o verdadeiro compromisso deles com o FastAPI e sua **comunidade**
Por exemplo, vocÃĒ pode querer experimentar:
-* Speakeasy
+* Speakeasy
* Stainless
* liblab
diff --git a/docs/pt/docs/async.md b/docs/pt/docs/async.md
index 0d6bdbf0e..4425eba77 100644
--- a/docs/pt/docs/async.md
+++ b/docs/pt/docs/async.md
@@ -40,7 +40,7 @@ def results():
---
-Se sua aplicaÃ§ÃŖo (de alguma forma) nÃŖo tem que se comunicar com nada mais e tem que esperar que o respondam, use `async def`.
+Se sua aplicaÃ§ÃŖo (de alguma forma) nÃŖo tem que se comunicar com nada mais e esperar que o respondam, use `async def`.
---
@@ -52,7 +52,7 @@ Se vocÃĒ simplesmente nÃŖo sabe, use apenas `def`.
De qualquer forma, em ambos os casos acima, FastAPI irÃĄ trabalhar assincronamente e ser extremamente rÃĄpido.
-Seguindo os passos acima, ele serÃĄ capaz de fazer algumas otimizaçÃĩes de performance.
+Mas, seguindo os passos acima, ele serÃĄ capaz de fazer algumas otimizaçÃĩes de performance.
## Detalhes TÊcnicos
@@ -66,36 +66,36 @@ Vamos ver aquela frase por partes na seÃ§ÃŖo abaixo:
## CÃŗdigo assÃncrono
-CÃŗdigo assÃncrono apenas significa que a linguagem đŦ tem um jeito de dizer para o computador / programa đ¤ que em certo ponto, ele đ¤ terÃĄ que esperar por *algo* para finalizar em outro lugar. Vamos dizer que esse *algo* seja chamado "arquivo lento" đ.
+CÃŗdigo assÃncrono apenas significa que a linguagem đŦ tem um jeito de dizer para o computador / programa đ¤ que em certo ponto do cÃŗdigo, ele đ¤ terÃĄ que esperar *algo* finalizar em outro lugar. Vamos dizer que esse *algo* seja chamado "arquivo lento" đ.
-EntÃŖo, durante esse tempo, o computador pode ir e fazer outro trabalho, enquanto o "arquivo lento" đ termine.
+EntÃŖo, durante esse tempo, o computador pode ir e fazer outro trabalho, enquanto o "arquivo lento" đ termina.
-EntÃŖo o computador / programa đ¤ irÃĄ voltar toda hora que tiver uma chance porquÃĒ ele ainda estÃĄ esperando o "arquivo lento", ou ele đ¤ nunca irÃĄ terminar todo o trabalho que tem atÊ esse ponto. E ele đ¤ irÃĄ ver se alguma das tarefas que estava esperando jÃĄ terminaram, fazendo o que quer que tinham que fazer.
+EntÃŖo o computador / programa đ¤ irÃĄ voltar sempre que tiver uma chance, seja porque ele estÃĄ esperando novamente, ou quando ele đ¤ terminar todo o trabalho que tem atÊ esse ponto. E ele đ¤ irÃĄ ver se alguma das tarefas que estava esperando jÃĄ terminaram de fazer o que quer que tinham que fazer.
-Depois, ele đ¤ pega a primeira tarefa para finalizar (vamos dizer, nosso "arquivo lento" đ) e continua o que ele tem que fazer com isso.
+Depois, ele đ¤ pega a primeira tarefa para finalizar (vamos dizer, nosso "arquivo lento" đ) e continua o que tem que fazer com ela.
-Esse "esperar por algo" normalmente se refere a operaçÃĩes I/O que sÃŖo relativamente "lentas" (comparadas a velocidade do processador e da memÃŗria RAM), como esperar por:
+Esse "esperar por algo" normalmente se refere a operaçÃĩes I/O que sÃŖo relativamente "lentas" (comparadas à velocidade do processador e da memÃŗria RAM), como esperar por:
* dados do cliente para serem enviados atravÊs da rede
-* dados enviados pelo seu programa para serem recebidos pelo clente atravÊs da rede
-* conteÃēdo de um arquivo no disco pra ser lido pelo sistema e entregar ao seu programa
+* dados enviados pelo seu programa serem recebidos pelo clente atravÊs da rede
+* conteÃēdo de um arquivo no disco ser lido pelo sistema e entregue ao seu programa
* conteÃēdo que seu programa deu ao sistema para ser escrito no disco
-* uma operaÃ§ÃŖo remota API
-* uma operaÃ§ÃŖo no banco de dados para finalizar
-* uma solicitaÃ§ÃŖo no banco de dados esperando o retorno do resultado
+* uma operaÃ§ÃŖo em uma API remota
+* uma operaÃ§ÃŖo no banco de dados finalizar
+* uma solicitaÃ§ÃŖo no banco de dados retornar o resultado
* etc.
-Enquanto o tempo de execuÃ§ÃŖo Ê consumido mais pela espera das operaçÃĩes I/O , essas operaçÃĩes sÃŖo chamadas de operaçÃĩes "limitadas por I/O".
+Quanto o tempo de execuÃ§ÃŖo Ê consumido majoritariamente pela espera de operaçÃĩes I/O , essas operaçÃĩes sÃŖo chamadas operaçÃĩes "limitadas por I/O".
-Isso Ê chamado de "assÃncrono" porquÃĒ o computador / programa nÃŖo tem que ser "sincronizado" com a tarefa lenta, esperando pelo exato momento que a tarefa finalize, enquanto nÃŖo faz nada, para ser capaz de pegar o resultado da tarefa e dar continuidade ao trabalho.
+Isso Ê chamado de "assÃncrono" porque o computador / programa nÃŖo tem que ser "sincronizado" com a tarefa lenta, esperando pelo momento exato em que a tarefa finaliza, enquanto nÃŖo faz nada, para ser capaz de pegar o resultado da tarefa e dar continuidade ao trabalho.
-Ao invÊs disso, sendo um sistema "assÃncrono", uma vez finalizada, a tarefa pode esperar um pouco (alguns microssegundos) para que o computador / programa finalize o que quer que esteja fazendo,e entÃŖo volte para pegar o resultado e continue trabalhando com ele.
+Ao invÊs disso, sendo um sistema "assÃncrono", uma vez finalizada, a tarefa pode esperar na fila um pouco (alguns microssegundos) para que o computador / programa finalize o que quer que esteja fazendo, e entÃŖo volte para pegar o resultado e continue trabalhando com ele.
-Para "sÃncrono" (contrÃĄrio de "assÃncrono") tambÊm Ê utilizado o termo "sequencial", porquÃĒ o computador / programa segue todos os passos, na sequÃĒncia, antes de trocar para uma tarefa diferente, mesmo se alguns passos envolvam esperar.
+Para "sÃncrono" (contrÃĄrio de "assÃncrono") tambÊm Ê utilizado o termo "sequencial", porquÃĒ o computador / programa segue todos os passos, em sequÃĒncia, antes de trocar para uma tarefa diferente, mesmo se alguns passos envolvam esperar.
### ConcorrÃĒncia e hambÃērgueres
-Essa idÊia de cÃŗdigo **assÃncrono** descrito acima Ê algo à s vezes chamado de **"concorrÃĒncia"**. E Ê diferente de **"paralelismo"**.
+Essa idÊia de cÃŗdigo **assÃncrono** descrita acima Ê à s vezes chamado de **"concorrÃĒncia"**. Isso Ê diferente de **"paralelismo"**.
**ConcorrÃĒncia** e **paralelismo** ambos sÃŖo relacionados a "diferentes coisas acontecendo mais ou menos ao mesmo tempo".
@@ -105,117 +105,115 @@ Para ver essa diferença, imagine a seguinte histÃŗria sobre hambÃērgueres:
### HambÃērgueres concorrentes
-VocÃĒ vai com seu _crush_ :heart_eyes: na lanchonete, fica na fila enquanto o caixa pega os pedidos das pessoas na sua frente.
+VocÃĒ vai com seu _crush_ na lanchonete, e fica na fila enquanto o caixa pega os pedidos das pessoas na sua frente. đ
-EntÃŖo chega a sua vez, vocÃĒ pede dois saborosos hambÃērgueres para vocÃĒ e seu _crush_ :heart_eyes:.
+EntÃŖo chega a sua vez, vocÃĒ pede dois saborosos hambÃērgueres para vocÃĒ e seu _crush_. đđ
-VocÃĒ paga.
+O caixa diz alguma coisa para o cozinheiro na cozinha para que eles saivam que tÃĒm que preparar seus hambÃērgueres (mesmo que ele esteja atualmente preparando os lanches dos outros clientes).
-O caixa diz alguma coisa para o cara na cozinha para que ele tenha que preparar seus hambÃērgueres (mesmo embora ele esteja preparando os lanches dos outros clientes).
+VocÃĒ paga. đ¸
O caixa te entrega seu nÃēmero de chamada.
-Enquanto vocÃĒ espera, vocÃĒ vai com seu _crush_ :heart_eyes: e pega uma mesa, senta e conversa com seu _crush_ :heart_eyes: por um bom tempo (como seus hambÃērgueres sÃŖo muito saborosos, leva um tempo para serem preparados).
+Enquanto vocÃĒ espera, vocÃĒ vai com seu _crush_ e pega uma mesa, senta e conversa com seu _crush_ por um bom tempo (jÃĄ que seus hambÃērgueres sÃŖo muito saborosos, e leva um tempo para serem preparados).
-Enquanto vocÃĒ estÃĄ sentado na mesa com seu _crush_ :heart_eyes:, esperando os hambÃērgueres, vocÃĒ pode gastar o tempo admirando como lindo, maravilhoso e esperto Ê seu _crush_ :heart_eyes:.
+JÃĄ que vocÃĒ estÃĄ sentado na mesa com seu _crush_, esperando os hambÃērgueres, vocÃĒ pode passar esse tempo admirando o quÃŖo lindo, maravilhoso e esperto Ê seu _crush_ â¨đâ¨.
-Enquanto espera e conversa com seu _crush_ :heart_eyes:, de tempos em tempos, vocÃĒ verifica o nÃēmero de chamada exibido no balcÃŖo para ver se jÃĄ Ê sua vez.
+Enquanto espera e conversa com seu _crush_, de tempos em tempos, vocÃĒ verifica o nÃēmero da chamada exibido no balcÃŖo para ver se jÃĄ Ê sua vez.
-EntÃŖo a certo ponto, Ê finalmente sua vez. VocÃĒ vai no balcÃŖo, pega seus hambÃērgueres e volta para a mesa.
+EntÃŖo em algum momento, Ê finalmente sua vez. VocÃĒ vai ao balcÃŖo, pega seus hambÃērgueres e volta para a mesa.
-VocÃĒ e seu _crush_ :heart_eyes: comem os hambÃērgueres e aproveitam o tempo.
+VocÃĒ e seu _crush_ comem os hambÃērgueres e aproveitam o tempo. â¨
---
-Imagine que vocÃĒ seja o computador / programa nessa histÃŗria.
+Imagine que vocÃĒ seja o computador / programa nessa histÃŗria.
-Enquanto vocÃĒ estÃĄ na fila, tranquilo, esperando por sua vez, nÃŖo estÃĄ fazendo nada "produtivo". Mas a fila Ê rÃĄpida porquÃĒ o caixa sÃŗ estÃĄ pegando os pedidos, entÃŖo estÃĄ tudo bem.
+Enquanto vocÃĒ estÃĄ na fila, vocÃĒ estÃĄ somente ocioso đ´, esperando por sua vez, sem fazer nada muito "produtivo". Mas a fila Ê rÃĄpida porque o caixa sÃŗ estÃĄ pegando os pedidos (nÃŖo os preparando), entÃŖo estÃĄ tudo bem.
-EntÃŖo, quando Ê sua vez, vocÃĒ faz o trabalho "produtivo" de verdade, vocÃĒ processa o menu, decide o que quer, pega a escolha de seu _crush_ :heart_eyes:, paga, verifica se entregou o valor correto em dinheiro ou cartÃŖo de crÊdito, verifica se foi cobrado corretamente, verifica se seu pedido estÃĄ correto etc.
+EntÃŖo, quando Ê sua vez, vocÃĒ faz trabalho realmente "produtivo", vocÃĒ processa o menu, decide o que quer, pega a escolha de seu _crush_, paga, verifica se entregou o cartÃŖo ou a cÊdula correta, verifica se foi cobrado corretamente, verifica se seu pedido estÃĄ correto etc.
-Mas entÃŖo, embora vocÃĒ ainda nÃŖo tenha os hambÃērgueres, seu trabalho no caixa estÃĄ "pausado", porquÃĒ vocÃĒ tem que esperar seus hambÃērgueres estarem prontos.
+Mas entÃŖo, embora vocÃĒ ainda nÃŖo tenha os hambÃērgueres, seu trabalho no caixa estÃĄ "pausado" â¸, porque vocÃĒ tem que esperar đ seus hambÃērgueres ficarem prontos.
-Mas enquanto vocÃĒ se afasta do balcÃŖo e senta na mesa com o nÃēmero da sua chamada, vocÃĒ pode trocar sua atenÃ§ÃŖo para seu _crush_ :heart_eyes:, e "trabalhar" nisso. EntÃŖo vocÃĒ estÃĄ novamente fazendo algo muito "produtivo", como flertar com seu _crush_ :heart_eyes:.
+Contudo, à medida que vocÃĒ se afasta do balcÃŖo e senta na mesa, com um nÃēmero para sua chamada, vocÃĒ pode trocar đ sua atenÃ§ÃŖo para seu _crush_, e "trabalhar" ⯠đ¤ nisso. EntÃŖo vocÃĒ estÃĄ novamente fazendo algo muito "produtivo", como flertar com seu _crush_ đ.
-EntÃŖo o caixa diz que "seus hambÃērgueres estÃŖo prontos" colocando seu nÃēmero no balcÃŖo, mas vocÃĒ nÃŖo corre que nem um maluco imediatamente quando o nÃēmero exibido Ê o seu. VocÃĒ sabe que ninguÊm irÃĄ roubar seus hambÃērgueres porquÃĒ vocÃĒ tem o nÃēmero de chamada, e os outros tem os nÃēmeros deles.
+EntÃŖo o caixa đ diz que "seus hambÃērgueres estÃŖo prontos" colocando seu nÃēmero no balcÃŖo, mas vocÃĒ nÃŖo corre que nem um maluco imediatamente quando o nÃēmero exibido Ê o seu. VocÃĒ sabe que ninguÊm irÃĄ roubar seus hambÃērgueres porque vocÃĒ tem o seu nÃēmero da chamada, e os outros tÃĒm os deles.
-EntÃŖo vocÃĒ espera que seu _crush_ :heart_eyes: termine a histÃŗria que estava contando (terminar o trabalho atual / tarefa sendo processada), sorri gentilmente e diz que vocÃĒ estÃĄ indo buscar os hambÃērgueres.
+EntÃŖo vocÃĒ espera seu _crush_ terminar a histÃŗria que estava contando (terminar o trabalho atual ⯠/ tarefa sendo processada đ¤), sorri gentilmente e diz que vocÃĒ estÃĄ indo buscar os hambÃērgueres.
-EntÃŖo vocÃĒ vai no balcÃŖo, para a tarefa inicial que agora estÃĄ finalizada, pega os hambÃērgueres, e leva para a mesa. Isso finaliza esse passo / tarefa da interaÃ§ÃŖo com o balcÃŖo. Agora Ê criada uma nova tarefa, "comer hambÃērgueres", mas a tarefa anterior, "pegar os hambÃērgueres" jÃĄ estÃĄ finalizada.
+EntÃŖo vocÃĒ vai ao balcÃŖo đ, para a tarefa inicial que agora estÃĄ finalizadaâ¯, pega os hambÃērgueres, agradece, e leva-os para a mesa. Isso finaliza esse passo / tarefa da interaÃ§ÃŖo com o balcÃŖo âš. Isso, por sua vez, cria uma nova tarefa, a de "comer hambÃērgueres" đ â¯, mas a tarefa anterior de "pegar os hambÃērgueres" jÃĄ estÃĄ finalizada âš.
### HambÃērgueres paralelos
-VocÃĒ vai com seu _crush_ :heart_eyes: em uma lanchonete paralela.
+Agora vamos imaginar que esses nÃŖo sÃŖo "HambÃērgueres Concorrentes", e sim "HambÃērgueres Paralelos"
-VocÃĒ fica na fila enquanto alguns (vamos dizer 8) caixas pegam os pedidos das pessoas na sua frente.
+VocÃĒ vai com seu _crush_ na lanchonete paralela.
-Todo mundo antes de vocÃĒ estÃĄ esperando pelos hambÃērgueres estarem prontos antes de deixar o caixa porquÃĒ cada um dos 8 caixas vai e prepara o hambÃērguer antes de pegar o prÃŗximo pedido.
+VocÃĒ fica na fila enquanto vÃĄrios (vamos dizer 8) caixas que tambÊm sÃŖo cozinheiros pegam os pedidos das pessoas na sua frente.
-EntÃŖo Ê finalmente sua vez, e pede 2 hambÃērgueres muito saborosos para vocÃĒ e seu _crush_ :heart_eyes:.
+Todo mundo na sua frente estÃĄ esperando seus hambÃērgueres ficarem prontos antes de deixar o caixa porque cada um dos 8 caixas vai e prepara o hambÃērguer logo apÃŗs receber o pedido, antes de pegar o prÃŗximo pedido.
-VocÃĒ paga.
+EntÃŖo Ê finalmente sua vez, vocÃĒ pede 2 hambÃērgueres muito saborosos para vocÃĒ e seu _crush_.
+
+VocÃĒ paga đ¸.
O caixa vai para a cozinha.
-VocÃĒ espera, na frente do balcÃŖo, para que ninguÊm pegue seus hambÃērgueres antes de vocÃĒ, jÃĄ que nÃŖo tem nÃēmeros de chamadas.
+VocÃĒ espera, na frente do balcÃŖo đ, para que ninguÊm pegue seus hambÃērgueres antes de vocÃĒ, jÃĄ que nÃŖo tem nÃēmeros de chamadas.
-Enquanto vocÃĒ e seu _crush_ :heart_eyes: estÃŖo ocupados nÃŖo permitindo que ninguÊm passe a frente e pegue seus hambÃērgueres assim que estiverem prontos, vocÃĒ nÃŖo pode dar atenÃ§ÃŖo ao seu _crush_ :heart_eyes:.
+Como vocÃĒ e seu _crush_ estÃŖo ocupados nÃŖo permitindo que ninguÊm passe na frente e pegue seus hambÃērgueres assim que estiverem prontos, vocÃĒ nÃŖo pode dar atenÃ§ÃŖo ao seu _crush_. đ
-Isso Ê trabalho "sÃncrono", vocÃĒ estÃĄ "sincronizado" com o caixa / cozinheiro. VocÃĒ tem que esperar e estar lÃĄ no exato momento que o caixa / cozinheiro terminar os hambÃērgueres e dÃĄ-los a vocÃĒ, ou entÃŖo, outro alguÊm pode pegÃĄ-los.
+Isso Ê trabalho "sÃncrono", vocÃĒ estÃĄ "sincronizado" com o caixa / cozinheirođ¨âđŗ. VocÃĒ tem que esperar đ e estar lÃĄ no exato momento que o caixa / cozinheiro đ¨âđŗ terminar os hambÃērgueres e os der a vocÃĒ, ou entÃŖo, outro alguÊm pode pegÃĄ-los.
-EntÃŖo seu caixa / cozinheiro finalmente volta com seus hambÃērgueres, depois de um longo tempo esperando por eles em frente ao balcÃŖo.
+EntÃŖo seu caixa / cozinheiro đ¨âđŗ finalmente volta com seus hambÃērgueres, depois de um longo tempo esperando đ por eles em frente ao balcÃŖo.
-VocÃĒ pega seus hambÃērgueres e vai para a mesa com seu _crush_ :heart_eyes:.
+VocÃĒ pega seus hambÃērgueres e vai para a mesa com seu _crush_.
-VocÃĒs comem os hambÃērgueres, e o trabalho estÃĄ terminado.
+VocÃĒs comem os hambÃērgueres, e o trabalho estÃĄ terminado. âš
-NÃŖo houve muita conversa ou flerte jÃĄ que a maior parte do tempo foi gasto esperando os lanches na frente do balcÃŖo.
+NÃŖo houve muita conversa ou flerte jÃĄ que a maior parte do tempo foi gasto esperando đ na frente do balcÃŖo. đ
---
-Nesse cenÃĄrio dos hambÃērgueres paralelos, vocÃĒ ÃŠ um computador / programa com dois processadores (vocÃĒ e seu _crush_ :heart_eyes:), ambos esperando e dedicando a atenÃ§ÃŖo de estar "esperando no balcÃŖo" por um bom tempo.
+Nesse cenÃĄrio dos hambÃērgueres paralelos, vocÃĒ ÃŠ um computador / programa com dois processadores (vocÃĒ e seu _crush_), ambos esperando đ e dedicando sua atenÃ§ÃŖo ⯠"esperando no balcÃŖo" đ por um bom tempo.
-A lanchonete paralela tem 8 processadores (caixas / cozinheiros). Enquanto a lanchonete dos hambÃērgueres concorrentes tinham apenas 2 (um caixa e um cozinheiro).
+A lanchonete paralela tem 8 processadores (caixas / cozinheiros), enquanto a lanchonete dos hambÃērgueres concorrentes tinha apenas 2 (um caixa e um cozinheiro).
-Ainda assim, a Ãēltima experiÃĒncia nÃŖo foi a melhor.
+Ainda assim, a experiÃĒncia final nÃŖo foi a melhor. đ
---
-Essa poderia ser a histÃŗria paralela equivalente aos hambÃērgueres.
+Essa seria o equivalente paralelo à histÃŗrio dos hambÃērgueres. đ
Para um exemplo "mais real", imagine um banco.
-AtÊ recentemente, a maioria dos bancos tinha muitos caixas e uma grande fila.
+AtÊ recentemente, a maioria dos bancos tinham muitos caixas đ¨âđŧđ¨âđŧđ¨âđŧđ¨âđŧ e uma grande fila đđđđđđđđ.
-Todos os caixas fazendo todo o trabalho, um cliente apÃŗs o outro.
+Todos os caixas fazendo todo o trabalho, um cliente apÃŗs o outro đ¨âđŧâ¯.
-E vocÃĒ tinha que esperar na fila por um longo tempo ou poderia perder a vez.
+E vocÃĒ tinha que esperar đ na fila por um longo tempo ou poderia perder a vez.
-VocÃĒ provavelmente nÃŖo gostaria de levar seu _crush_ :heart_eyes: com vocÃĒ para um rolezinho no banco.
+VocÃĒ provavelmente nÃŖo gostaria de levar seu _crush_ đ com vocÃĒ para um rolezinho no banco đĻ.
### ConclusÃŖo dos hambÃērgueres
-Nesse cenÃĄrio dos "hambÃērgueres com seu _crush_ :heart_eyes:", como tem muita espera, faz mais sentido ter um sistema concorrente.
+Nesse cenÃĄrio dos "hambÃērgueres com seu _crush_", como tem muita espera, faz mais sentido ter um sistema concorrente â¸đâ¯.
Esse Ê o caso da maioria das aplicaçÃĩes web.
-Geralmente sÃŖo muitos usuÃĄrios, e seu servidor estÃĄ esperando pelas suas conexÃĩes nÃŖo tÃŖo boas para enviar as requisiçÃĩes.
-
-E entÃŖo esperando novamente pelas respostas voltarem.
-
-Essa "espera" Ê medida em microssegundos, e ainda assim, somando tudo, Ê um monte de espera no final.
+Muitos, muitos usuÃĄrios, mas seu servidor estÃĄ esperando đ pela sua conexÃŖo nÃŖo tÃŖo boa enviar suas requisiçÃĩes.
-Por isso que faz muito mais sentido utilizar cÃŗdigo assÃncrono para APIs web.
+E entÃŖo esperando đ novamente as respostas voltarem.
-A maioria dos frameworks Python existentes mais populares (incluindo Flask e Django) foram criados antes que os novos recursos assÃncronos existissem em Python. EntÃŖo, os meios que eles podem ser colocados em produÃ§ÃŖo para suportar execuÃ§ÃŖo paralela mais a forma antiga de execuÃ§ÃŖo assÃncrona nÃŖo sÃŖo tÃŖo poderosos quanto as novas capacidades.
+Essa "espera" đ Ê medida em microssegundos, mas ainda assim, somando tudo, Ê um monte de espera no final.
-Mesmo embora a especificaÃ§ÃŖo principal para web assÃncrono em Python (ASGI) foi desenvolvida no Django, para adicionar suporte para WebSockets.
+Por isso que faz bastante sentido utilizar cÃŗdigo assÃncrono â¸đ⯠para APIs web.
-Esse tipo de assincronicidade Ê o que fez NodeJS popular (embora NodeJS nÃŖo seja paralelo) e que essa seja a força do Go como uma linguagem de programa.
+Esse tipo de assincronicidade Ê o que fez NodeJS popular (embora NodeJS nÃŖo seja paralelo) e essa Ê a força do Go como uma linguagem de programaÃ§ÃŖo.
E esse Ê o mesmo nÃvel de performance que vocÃĒ tem com o **FastAPI**.
-E como vocÃĒ pode ter paralelismo e sincronicidade ao mesmo tempo, vocÃĒ tem uma maior performance do que a maioria dos frameworks NodeJS testados e lado a lado com Go, que Ê uma linguagem compilada prÃŗxima ao C (tudo graças ao Starlette) .
+E como vocÃĒ pode ter paralelismo e assincronicidade ao mesmo tempo, vocÃĒ tem uma maior performance do que a maioria dos frameworks NodeJS testados e lado a lado com Go, que Ê uma linguagem compilada, mais prÃŗxima ao C (tudo graças ao Starlette) .
### ConcorrÃĒncia Ê melhor que paralelismo?
@@ -225,64 +223,64 @@ ConcorrÃĒncia Ê diferente de paralelismo. E Ê melhor em cenÃĄrios **especÃfic
EntÃŖo, para equilibrar tudo, imagine a seguinte historinha:
-> VocÃĒ tem que limpar uma grande casa suja.
+> VocÃĒ tem que limpar uma casa grande e suja.
*Sim, essa Ê toda a histÃŗria*.
---
-NÃŖo hÃĄ espera em lugar algum, apenas um monte de trabalho para ser feito, em mÃēltiplos cômodos da casa.
+NÃŖo hÃĄ espera đ em lugar algum, apenas um monte de trabalho para ser feito, em mÃēltiplos cômodos da casa.
-VocÃĒ poderia ter chamadas como no exemplo dos hambÃērgueres, primeiro a sala de estar, entÃŖo a cozinha, mas vocÃĒ nÃŖo estÃĄ esperando por nada, apenas limpar e limpar, as chamadas nÃŖo afetariam em nada.
+VocÃĒ poderia ter turnos como no exemplo dos hambÃērgueres, primeiro a sala de estar, entÃŖo a cozinha, mas como vocÃĒ nÃŖo estÃĄ esperando por nada, apenas limpando e limpando, as chamadas nÃŖo afetariam em nada.
-Levaria o mesmo tempo para finalizar com ou sem chamadas (concorrÃĒncia) e vocÃĒ teria feito o mesmo tanto de trabalho.
+Levaria o mesmo tempo para finalizar com ou sem turnos (concorrÃĒncia) e vocÃĒ teria feito o mesmo tanto de trabalho.
Mas nesse caso, se vocÃĒ trouxesse os 8 ex-caixas / cozinheiros / agora-faxineiros, e cada um deles (mais vocÃĒ) pudessem dividir a casa para limpÃĄ-la, vocÃĒs fariam toda a limpeza em **paralelo**, com a ajuda extra, e terminariam muito mais cedo.
Nesse cenÃĄrio, cada um dos faxineiros (incluindo vocÃĒ) poderia ser um processador, fazendo a sua parte do trabalho.
-E a maior parte do tempo de execuÃ§ÃŖo Ê tomada por trabalho (ao invÊs de ficar esperando), e o trabalho em um computador Ê feito pela CPU , que podem gerar problemas que sÃŖo chamados de "limite de CPU".
+E a maior parte do tempo de execuÃ§ÃŖo Ê tomada por trabalho real (ao invÊs de ficar esperando), e o trabalho em um computador Ê feito pela CPU . Eles chamam esses problemas de "limitados por CPU".
---
-Exemplos comuns de limite de CPU sÃŖo coisas que exigem processamento matemÃĄtico complexo.
+Exemplos comuns de operaçÃĩes limitadas por CPU sÃŖo coisas que exigem processamento matemÃĄtico complexo.
Por exemplo:
* **Processamento de ÃĄudio** ou **imagem**
-* **VisÃŖo do Computador**: uma imagem Ê composta por milhÃĩes de pixels, cada pixel tem 3 valores (cores, processamento que normalmente exige alguma computaÃ§ÃŖo em todos esses pixels ao mesmo tempo)
+* **VisÃŖo Computacional**: uma imagem Ê composta por milhÃĩes de pixels, cada pixel tem 3 valores / cores, processar isso normalmente exige alguma computaÃ§ÃŖo em todos esses pixels ao mesmo tempo
-* **Machine Learning**: Normalmente exige muita multiplicaÃ§ÃŖo de matrizes e vetores. Pense numa grande folha de papel com nÃēmeros e multiplicando todos eles juntos e ao mesmo tempo.
+* **Machine Learning**: Normalmente exige muita multiplicaÃ§ÃŖo de matrizes e vetores. Pense numa grande planilha com nÃēmeros e em multiplicar todos eles juntos e ao mesmo tempo.
-* **Deep Learning**: Esse Ê um subcampo do Machine Learning, entÃŖo o mesmo se aplica. A diferença Ê que nÃŖo hÃĄ apenas uma grande folha de papel com nÃēmeros para multiplicar, mas um grande conjunto de folhas de papel, e em muitos casos, vocÃĒ utiliza um processador especial para construir e/ou usar modelos.
+* **Deep Learning**: Esse Ê um subcampo do Machine Learning, entÃŖo, o mesmo se aplica. A diferença Ê que nÃŖo hÃĄ apenas uma grande planilha com nÃēmeros para multiplicar, mas um grande conjunto delas, e em muitos casos, vocÃĒ utiliza um processador especial para construir e/ou usar esses modelos.
### ConcorrÃĒncia + Paralelismo: Web + Machine learning
Com **FastAPI** vocÃĒ pode levar a vantagem da concorrÃĒncia que Ê muito comum para desenvolvimento web (o mesmo atrativo de NodeJS).
-Mas vocÃĒ tambÊm pode explorar os benefÃcios do paralelismo e multiprocessamento (tendo mÃēltiplos processadores rodando em paralelo) para trabalhos pesados que geram **limite de CPU** como aqueles em sistemas de Machine Learning.
+Mas vocÃĒ tambÊm pode explorar os benefÃcios do paralelismo e multiprocessamento (tendo mÃēltiplos processadores rodando em paralelo) para trabalhos **limitados por CPU** como aqueles em sistemas de Machine Learning.
-Isso, mais o simples fato que Python Ê a principal linguagem para **Data Science**, Machine Learning e especialmente Deep Learning, faz do FastAPI uma Ãŗtima escolha para APIs web e aplicaçÃĩes com Data Science / Machine Learning (entre muitas outras).
+Isso, somado ao simples fato que Python Ê a principal linguagem para **Data Science**, Machine Learning e especialmente Deep Learning, faz do FastAPI uma Ãŗtima escolha para APIs web e aplicaçÃĩes com Data Science / Machine Learning (entre muitas outras).
Para ver como alcançar esse paralelismo em produÃ§ÃŖo veja a seÃ§ÃŖo sobre [Deployment](deployment/index.md){.internal-link target=_blank}.
## `async` e `await`
-VersÃĩes modernas do Python tem um modo muito intuitivo para definir cÃŗdigo assÃncrono. Isso faz parecer normal o cÃŗdigo "sequencial" e fazer o "esperar" para vocÃĒ nos momentos certos.
+VersÃĩes modernas do Python tÃĒm um modo muito intuitivo para definir cÃŗdigo assÃncrono. Isso faz parecer do mesmo jeito do cÃŗdigo normal "sequencial" e fazer a "espera" para vocÃĒ nos momentos certos.
-Quando tem uma operaÃ§ÃŖo que exigirÃĄ espera antes de dar os resultados e tem suporte para esses recursos Python, vocÃĒ pode escrever assim:
+Quando tem uma operaÃ§ÃŖo que exigirÃĄ espera antes de dar os resultados e tem suporte para esses novos recursos do Python, vocÃĒ pode escrever assim:
```Python
burgers = await get_burgers(2)
```
-A chave aqui Ê o `await`. Ele diz ao Python que ele tem que esperar por `get_burgers(2)` para finalizar suas coisas antes de armazenar os resultados em `burgers`. Com isso, o Python saberÃĄ que ele pode ir e fazer outras coisas nesse meio tempo (como receber outra requisiÃ§ÃŖo).
+A chave aqui Ê o `await`. Ele diz ao Python que ele tem que esperar por `get_burgers(2)` finalizar suas coisas đ antes de armazenar os resultados em `burgers`. Com isso, o Python saberÃĄ que ele pode ir e fazer outras coisas đ ⯠nesse meio tempo (como receber outra requisiÃ§ÃŖo).
Para o `await` funcionar, tem que estar dentro de uma funÃ§ÃŖo que suporte essa assincronicidade. Para fazer isso, apenas declare a funÃ§ÃŖo com `async def`:
```Python hl_lines="1"
async def get_burgers(number: int):
- # Fazer alguma coisa assÃncrona para criar os hambÃērgueres
+ # Faz alguma coisa assÃncrona para criar os hambÃērgueres
return burgers
```
@@ -295,9 +293,9 @@ def get_sequential_burgers(number: int):
return burgers
```
-Com `async def`, o Python sabe que, dentro dessa funÃ§ÃŖo, tem que estar ciente das expressÃĩes `await`, e que isso pode "pausar" a execuÃ§ÃŖo dessa funÃ§ÃŖo, e poderÃĄ fazer outra coisa antes de voltar.
+Com `async def`, o Python sabe que, dentro dessa funÃ§ÃŖo, ele deve estar ciente das expressÃĩes `await`, e que isso poderÃĄ "pausar" ⸠a execuÃ§ÃŖo dessa funÃ§ÃŖo, e ir fazer outra coisa đ antes de voltar.
-Quando vocÃĒ quiser chamar uma funÃ§ÃŖo `async def`, vocÃĒ tem que "esperar". EntÃŖo, isso nÃŖo funcionarÃĄ:
+Quando vocÃĒ quiser chamar uma funÃ§ÃŖo `async def`, vocÃĒ tem que "esperar" ela. EntÃŖo, isso nÃŖo funcionarÃĄ:
```Python
# Isso nÃŖo irÃĄ funcionar, porquÃĒ get_burgers foi definido com: async def
@@ -319,13 +317,24 @@ async def read_burgers():
VocÃĒ deve ter observado que `await` pode ser usado somente dentro de funçÃĩes definidas com `async def`.
-Mas ao mesmo tempo, funçÃĩes definidas com `async def` tem que ser aguardadas. EntÃŖo, funçÃĩes com `async def` pdem ser chamadas somente dentro de funçÃĩes definidas com `async def` tambÊm.
+Mas ao mesmo tempo, funçÃĩes definidas com `async def` tÃĒm que ser "aguardadas". EntÃŖo, funçÃĩes com `async def` pdem ser chamadas somente dentro de funçÃĩes definidas com `async def` tambÊm.
EntÃŖo, sobre o ovo e a galinha, como vocÃĒ chama a primeira funÃ§ÃŖo async?
Se vocÃĒ estivar trabalhando com **FastAPI** nÃŖo terÃĄ que se preocupar com isso, porquÃĒ essa "primeira" funÃ§ÃŖo serÃĄ a sua *funÃ§ÃŖo de operaÃ§ÃŖo de rota*, e o FastAPI saberÃĄ como fazer a coisa certa.
-Mas se vocÃĒ quiser usar `async` / `await` sem FastAPI, verifique a documentaÃ§ÃŖo oficial Python .
+Mas se vocÃĒ quiser usar `async` / `await` sem FastAPI, vocÃĒ tambÊm pode fazÃĒ-lo.
+
+### Escreva seu prÃŗprio cÃŗdigo assÃncrono
+
+Starlette (e **FastAPI**) sÃŖo baseados no AnyIO , o que o torna compatÃvel com ambos o asyncio da biblioteca padrÃŖo do Python, e o Trio .
+
+Em particular, vocÃĒ pode usar diretamente o AnyIO para seus casos de uso avançados de concorrÃĒncia que requerem padrÃĩes mais avançados no seu prÃŗprio cÃŗdigo.
+
+E atÊ se vocÃĒ nÃŖo estiver utilizando FastAPI, vocÃĒ tambÊm pode escrever suas prÃŗprias aplicaçÃĩes assÃncronas com o AnyIO por ser altamente compatÃvel e ganhar seus benefÃcios (e.g. *concorrÃĒncia estruturada*).
+
+Eu criei outra biblioteca em cima do AnyIO, como uma fina camada acima, para melhorar um pouco as anotaçÃĩes de tipo e obter melhor **autocompletar**, **erros de linha**, etc. Ela tambÊm possui uma introduÃ§ÃŖo amigÃĄvel e um tutorial para ajudar vocÃĒ a **entender** e escrever **seu prÃŗprio cÃŗdigo async**: Asyncer . Seria particularmente Ãētil se vocÃĒ precisar **combinar cÃŗdigo async com cÃŗdigo regular** (bloqueador/sÃncrono).
+
### Outras formas de cÃŗdigo assÃncrono
@@ -337,25 +346,25 @@ Essa mesma sintaxe (ou quase a mesma) foi tambÊm incluÃda recentemente em vers
Mas antes disso, controlar cÃŗdigo assÃncrono era bem mais complexo e difÃcil.
-Nas versÃĩes anteriores do Python, vocÃĒ poderia utilizar threads ou Gevent . Mas o cÃŗdigo Ê um pouco mais complexo de entender, debugar, e pensar sobre.
+Nas versÃĩes anteriores do Python, vocÃĒ poderia utilizar threads ou Gevent . Mas o cÃŗdigo Ê bem mais complexo de entender, debugar, e pensar sobre.
-Nas versÃĩes anteriores do NodeJS / Navegador JavaScript, vocÃĒ poderia utilizar "callbacks". O que leva ao inferno do callback .
+Nas versÃĩes anteriores do NodeJS / Navegador JavaScript, vocÃĒ utilizaria "callbacks". O que leva ao inferno do callback .
## Corrotinas
-**Corrotina** Ê apenas um jeito bonitinho para a coisa que Ê retornada de uma funÃ§ÃŖo `async def`. O Python sabe que Ê uma funÃ§ÃŖo que pode começar e terminar em algum ponto, mas que pode ser pausada internamente tambÊm, sempre que tiver um `await` dentro dela.
+**Corrotina** Ê apenas um jeito bonitinho para a coisa que Ê retornada de uma funÃ§ÃŖo `async def`. O Python sabe que Ê algo como uma funÃ§ÃŖo, que pode começar e que vai terminar em algum ponto, mas que pode ser pausada ⸠internamente tambÊm, sempre que tiver um `await` dentro dela.
-Mas toda essa funcionalidade de cÃŗdigo assÃncrono com `async` e `await` Ê muitas vezes resumida como "corrotina". à comparÃĄvel ao principal recurso chave do Go, a "Gorotina".
+Mas toda essa funcionalidade de cÃŗdigo assÃncrono com `async` e `await` Ê muitas vezes resumida como usando "corrotinas". à comparÃĄvel ao principal recurso chave do Go, a "Gorrotina".
## ConclusÃŖo
-Vamos ver a mesma frase com o conteÃēdo cima:
+Vamos ver a mesma frase de cima:
-> VersÃĩes modernas do Python tem suporte para **"cÃŗdigo assÃncrono"** usando algo chamado **"corrotinas"**, com sintaxe **`async` e `await`**.
+> VersÃĩes modernas do Python tÃĒm suporte para **"cÃŗdigo assÃncrono"** usando algo chamado **"corrotinas"**, com sintaxe **`async` e `await`**.
-Isso pode fazer mais sentido agora.
+Isso pode fazer mais sentido agora. â¨
-Tudo isso Ê o que deixa o FastAPI poderoso (atravÊs do Starlette) e que o faz ter uma performance impressionante.
+Tudo isso Ê o que empodera o FastAPI (atravÊs do Starlette) e que o faz ter uma performance tÃŖo impressionante.
## Detalhes muito tÊcnicos
@@ -365,25 +374,25 @@ VocÃĒ pode provavelmente pular isso.
Esses sÃŖo detalhes muito tÊcnicos de como **FastAPI** funciona por baixo do capô.
-Se vocÃĒ tem algum conhecimento tÊcnico (corrotinas, threads, blocking etc) e estÃĄ curioso sobre como o FastAPI controla o `async def` vs normal `def`, vÃĄ em frente.
+Se vocÃĒ tem certo conhecimento tÊcnico (corrotinas, threads, blocking etc) e estÃĄ curioso sobre como o FastAPI controla o `async def` vs normal `def`, vÃĄ em frente.
///
### FunçÃĩes de operaÃ§ÃŖo de rota
-Quando vocÃĒ declara uma *funÃ§ÃŖo de operaÃ§ÃŖo de rota* com `def` normal ao invÊs de `async def`, ela Ê rodada em uma threadpool externa que entÃŖo Ê aguardada, ao invÊs de ser chamada diretamente (ela poderia bloquear o servidor).
+Quando vocÃĒ declara uma *funÃ§ÃŖo de operaÃ§ÃŖo de rota* com `def` normal ao invÊs de `async def`, ela Ê rodada em uma threadpool externa que Ê entÃŖo aguardada, ao invÊs de ser chamada diretamente (jÃĄ que ela bloquearia o servidor).
-Se vocÃĒ estÃĄ chegando de outro framework assÃncrono que nÃŖo faz o trabalho descrito acima e vocÃĒ estÃĄ acostumado a definir triviais *funçÃĩes de operaÃ§ÃŖo de rota* com simples `def` para ter um mÃnimo ganho de performance (cerca de 100 nanosegundos), por favor observe que no **FastAPI** o efeito pode ser bem o oposto. Nesses casos, Ê melhor usar `async def` a menos que suas *funçÃĩes de operaÃ§ÃŖo de rota* utilizem cÃŗdigo que performem bloqueamento IO .
+Se vocÃĒ estÃĄ chegando de outro framework assÃncrono que nÃŖo funciona como descrito acima e vocÃĒ estÃĄ acostumado a definir *funçÃĩes de operaÃ§ÃŖo de rota* triviais somente de computaÃ§ÃŖo com simples `def` para ter um mÃnimo ganho de performance (cerca de 100 nanosegundos), por favor observe que no **FastAPI** o efeito pode ser bem o oposto. Nesses casos, Ê melhor usar `async def` a menos que suas *funçÃĩes de operaÃ§ÃŖo de rota* utilizem cÃŗdigo que performe bloqueamento IO .
-Ainda, em ambas as situaçÃĩes, as chances sÃŖo que o **FastAPI** serÃĄ [ainda mais rÃĄpido](index.md#performance){.internal-link target=_blank} do que (ou ao menos comparÃĄvel a) seus frameworks antecessores.
+Ainda, em ambas as situaçÃĩes, as chances sÃŖo que o **FastAPI** [ainda serÃĄ mais rÃĄpido](index.md#performance){.internal-link target=_blank} do que (ou ao menos comparÃĄvel a) seu framework anterior.
### DependÃĒncias
-O mesmo se aplica para as dependÃĒncias. Se uma dependÃĒncia tem as funçÃĩes com padrÃŖo `def` ao invÊs de `async def`, ela Ê rodada no threadpool externo.
+O mesmo se aplica para as [dependÃĒncias](tutorial/dependencies/index.md){.internal-link target=_blank}. Se uma dependÃĒncia tem as funçÃĩes com padrÃŖo `def` ao invÊs de `async def`, ela Ê rodada no threadpool externo.
### Sub-dependÃĒncias
-VocÃĒ pode ter mÃēltiplas dependÃĒncias e sub-dependÃĒncias exigindo uma a outra (como parÃĸmetros de definiçÃĩes de funçÃĩes), algumas delas podem ser criadas com `async def` e algumas com `def` normal. Isso ainda poderia funcionar, e aquelas criadas com `def` podem ser chamadas em uma thread externa ao invÊs de serem "aguardadas".
+VocÃĒ pode ter mÃēltiplas dependÃĒncias e [sub-dependÃĒncias](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank} requisitando uma à outra (como parÃĸmetros de definiçÃĩes de funçÃĩes), algumas delas podem ser criadas com `async def` e algumas com `def` normal. Isso ainda funcionaria, e aquelas criadas com `def` normal seriam chamadas em uma thread externa (do threadpool) ao invÊs de serem "aguardadas".
### Outras funçÃĩes de utilidade
@@ -395,6 +404,6 @@ Se sua funÃ§ÃŖo de utilidade Ê uma funÃ§ÃŖo normal com `def`, ela serÃĄ chamada
---
-Novamente, esses sÃŖo detalhes muito tÊcnicos que provavelmente possam ser Ãēteis caso vocÃĒ esteja procurando por eles.
+Novamente, esses sÃŖo detalhes muito tÊcnicos que provavelmente seriam Ãēteis caso vocÃĒ esteja procurando por eles.
Caso contrÃĄrio, vocÃĒ deve ficar bem com as dicas da seÃ§ÃŖo acima: Com pressa? .
diff --git a/docs/pt/docs/deployment/concepts.md b/docs/pt/docs/deployment/concepts.md
index 8cf70d0b4..014ca3797 100644
--- a/docs/pt/docs/deployment/concepts.md
+++ b/docs/pt/docs/deployment/concepts.md
@@ -216,7 +216,7 @@ Este Processo de Gerenciador provavelmente seria o que escutaria na **porta** no
Esses processos de trabalho seriam aqueles que executariam seu aplicativo, eles executariam os cÃĄlculos principais para receber uma **solicitaÃ§ÃŖo** e retornar uma **resposta**, e carregariam qualquer coisa que vocÃĒ colocasse em variÃĄveis ââna RAM.
-
+
E, claro, a mesma mÃĄquina provavelmente teria **outros processos** em execuÃ§ÃŖo, alÊm do seu aplicativo.
diff --git a/docs/pt/docs/deployment/https.md b/docs/pt/docs/deployment/https.md
index 9a13977ec..904d04eaa 100644
--- a/docs/pt/docs/deployment/https.md
+++ b/docs/pt/docs/deployment/https.md
@@ -14,38 +14,186 @@ Para aprender o bÃĄsico de HTTPS de uma perspectiva do usuÃĄrio, verifique SNI .
- * Esta extensÃŖo SNI permite que um Ãēnico servidor (com um Ãēnico endereço IP) tenha vÃĄrios certificados HTTPS e atenda a vÃĄrios domÃnios / aplicativos HTTPS.
- * Para que isso funcione, um Ãēnico componente (programa) em execuÃ§ÃŖo no servidor, ouvindo no endereço IP pÃēblico, deve ter todos os certificados HTTPS no servidor.
-* Depois de obter uma conexÃŖo segura, o protocolo de comunicaÃ§ÃŖo ainda Ê HTTP.
- * Os conteÃēdos sÃŖo criptografados, embora sejam enviados com o protocolo HTTP.
+ * No entanto, existe uma **soluÃ§ÃŖo** para isso.
+* HÃĄ uma **extensÃŖo** para o protocolo **TLS** (aquele que lida com a criptografia no nÃvel TCP, antes do HTTP) chamado **SNI **.
+ * Esta extensÃŖo SNI permite que um Ãēnico servidor (com um **Ãēnico endereço IP**) tenha **vÃĄrios certificados HTTPS** e atenda a **vÃĄrios domÃnios / aplicativos HTTPS**.
+ * Para que isso funcione, um **Ãēnico** componente (programa) em execuÃ§ÃŖo no servidor, ouvindo no **endereço IP pÃēblico**, deve ter **todos os certificados HTTPS** no servidor.
+* **Depois** de obter uma conexÃŖo segura, o protocolo de comunicaÃ§ÃŖo **ainda Ê HTTP**.
+ * Os conteÃēdos sÃŖo **criptografados**, embora sejam enviados com o **protocolo HTTP**.
-à uma prÃĄtica comum ter um programa/servidor HTTP em execuÃ§ÃŖo no servidor (mÃĄquina, host, etc.) e gerenciar todas as partes HTTPS: enviando as solicitaçÃĩes HTTP descriptografadas para o aplicativo HTTP real em execuÃ§ÃŖo no mesmo servidor (a aplicaÃ§ÃŖo **FastAPI**, neste caso), pegue a resposta HTTP do aplicativo, criptografe-a usando o certificado apropriado e envie-a de volta ao cliente usando HTTPS. Este servidor Ê frequentemente chamado de TLS Termination Proxy .
+à uma prÃĄtica comum ter um **programa/servidor HTTP** em execuÃ§ÃŖo no servidor (mÃĄquina, host, etc.) e **gerenciar todas as partes HTTPS**: **recebendo as requisiçÃĩes encriptadas**, enviando as **solicitaçÃĩes HTTP descriptografadas** para o aplicativo HTTP real em execuÃ§ÃŖo no mesmo servidor (a aplicaÃ§ÃŖo **FastAPI**, neste caso), pegue a **resposta HTTP** do aplicativo, **criptografe-a** usando o **certificado HTTPS** apropriado e envie-a de volta ao cliente usando **HTTPS**. Este servidor Ê frequentemente chamado de **Proxy de TerminaÃ§ÃŖo TLS **.
+
+Algumas das opçÃĩes que vocÃĒ pode usar como Proxy de TerminaÃ§ÃŖo TLS sÃŖo:
+
+* Traefik (que tambÊm pode gerenciar a renovaÃ§ÃŖo de certificados)
+* Caddy (que tambÊm pode gerenciar a renovaÃ§ÃŖo de certificados)
+* Nginx
+* HAProxy
## Let's Encrypt
-Antes de Let's Encrypt, esses certificados HTTPS eram vendidos por terceiros confiÃĄveis.
+Antes de Let's Encrypt, esses **certificados HTTPS** eram vendidos por terceiros confiÃĄveis.
O processo de aquisiÃ§ÃŖo de um desses certificados costumava ser complicado, exigia bastante papelada e os certificados eram bastante caros.
-Mas entÃŖo Let's Encrypt foi criado.
+Mas entÃŖo o **Let's Encrypt ** foi criado.
-Ele Ê um projeto da Linux Foundation que fornece certificados HTTPS gratuitamente. De forma automatizada. Esses certificados usam toda a segurança criptogrÃĄfica padrÃŖo e tÃĒm vida curta (cerca de 3 meses), entÃŖo a segurança Ê realmente melhor por causa de sua vida Ãētil reduzida.
+Ele Ê um projeto da Linux Foundation que fornece **certificados HTTPS gratuitamente** . De forma automatizada. Esses certificados usam toda a segurança criptogrÃĄfica padrÃŖo e tÃĒm vida curta (cerca de 3 meses), entÃŖo a **segurança Ê, na verdade, melhor** por causa de sua vida Ãētil reduzida.
Os domÃnios sÃŖo verificados com segurança e os certificados sÃŖo gerados automaticamente. Isso tambÊm permite automatizar a renovaÃ§ÃŖo desses certificados.
-A ideia Ê automatizar a aquisiÃ§ÃŖo e renovaÃ§ÃŖo desses certificados, para que vocÃĒ tenha HTTPS seguro, de graça e para sempre.
+A ideia Ê automatizar a aquisiÃ§ÃŖo e renovaÃ§ÃŖo desses certificados, para que vocÃĒ tenha **HTTPS seguro, de graça e para sempre**.
+
+## HTTPS para Desenvolvedores
+
+Aqui estÃĄ um exemplo de como uma API HTTPS poderia ser estruturada, passo a passo, com foco principal nas ideias relevantes para desenvolvedores.
+
+### Nome do domÃnio
+
+A etapa inicial provavelmente seria **adquirir** algum **nome de domÃnio**. EntÃŖo, vocÃĒ iria configurÃĄ-lo em um servidor DNS (possivelmente no mesmo provedor em nuvem).
+
+VocÃĒ provavelmente usaria um servidor em nuvem (mÃĄquina virtual) ou algo parecido, e ele teria fixed **Endereço IP pÃēblico**.
+
+No(s) servidor(es) DNS, vocÃĒ configuraria um registro (`registro A`) para apontar **seu domÃnio** para o **endereço IP pÃēblico do seu servidor**.
+
+VocÃĒ provavelmente farÃĄ isso apenas uma vez, na primeira vez em que tudo estiver sendo configurado.
+
+/// tip | Dica
+
+Essa parte do Nome do DomÃnio se dÃĄ muito antes do HTTPS, mas como tudo depende do domÃnio e endereço IP pÃēblico, vale a pena mencionÃĄ-la aqui.
+
+///
+
+### DNS
+
+Agora vamos focar em todas as partes que realmente fazem parte do HTTPS.
+
+Primeiro, o navegador iria verificar com os **servidores DNS** qual o **IP do domÃnio**, nesse caso, `someapp.example.com`.
+
+Os servidores DNS iriam informar o navegador para utilizar algum **endereço IP** especÃfico. Esse seria o endereço IP pÃēblico em uso no seu servidor, que vocÃĒ configurou nos servidores DNS.
+
+
+
+### InÃcio do Handshake TLS
+
+O navegador entÃŖo irÃĄ comunicar-se com esse endereço IP na **porta 443** (a porta HTTPS).
+
+A primeira parte dessa comunicaÃ§ÃŖo Ê apenas para estabelecer a conexÃŖo entre o cliente e o servidor e para decidir as chaves criptogrÃĄficas a serem utilizadas, etc.
+
+
+
+Esse interaÃ§ÃŖo entre o cliente e o servidor para estabelecer uma conexÃŖo TLS Ê chamada de **Handshake TLS**.
+
+### TLS com a ExtensÃŖo SNI
+
+**Apenas um processo** no servidor pode se conectar a uma **porta** em um **endereço IP**. Poderiam existir outros processos conectados em outras portas desse mesmo endereço IP, mas apenas um para cada combinaÃ§ÃŖo de endereço IP e porta.
+
+TLS (HTTPS) usa a porta `443` por padrÃŖo. EntÃŖo essa Ê a porta que precisamos.
+
+Como apenas um Ãēnico processo pode se comunicar com essa porta, o processo que faria isso seria o **Proxy de TerminaÃ§ÃŖo TLS**.
+
+O Proxy de TerminaÃ§ÃŖo TLS teria acesso a um ou mais **certificados TLS** (certificados HTTPS).
+
+Utilizando a **extensÃŖo SNI** discutida acima, o Proxy de TerminaÃ§ÃŖo TLS iria checar qual dos certificados TLS (HTTPS) disponÃveis deve ser usado para essa conexÃŖo, utilizando o que corresponda ao domÃnio esperado pelo cliente.
+
+Nesse caso, ele usaria o certificado para `someapp.example.com`.
+
+
+
+O cliente jÃĄ **confia** na entidade que gerou o certificado TLS (nesse caso, o Let's Encrypt, mas veremos sobre isso mais tarde), entÃŖo ele pode **verificar** que o certificado Ê vÃĄlido.
+
+EntÃŖo, utilizando o certificado, o cliente e o Proxy de TerminaÃ§ÃŖo TLS **decidem como encriptar** o resto da **comunicaÃ§ÃŖo TCP**. Isso completa a parte do **Handshake TLS**.
+
+ApÃŗs isso, o cliente e o servidor possuem uma **conexÃŖo TCP encriptada**, que Ê provida pelo TLS. E entÃŖo eles podem usar essa conexÃŖo para começar a **comunicaÃ§ÃŖo HTTP** propriamente dita.
+
+E isso resume o que Ê **HTTPS**, apenas **HTTP** simples dentro de uma **conexÃŖo TLS segura** em vez de uma conexÃŖo TCP pura (nÃŖo encriptada).
+
+/// tip | Dica
+
+Percebe que a encriptaÃ§ÃŖo da comunicaÃ§ÃŖo acontece no **nÃvel do TCP**, nÃŖo no nÃvel do HTTP.
+
+///
+
+### SolicitaÃ§ÃŖo HTTPS
+
+Agora que o cliente e servidor (especialmente o navegador e o Proxy de TerminaÃ§ÃŖo TLS) possuem uma **conexÃŖo TCP encriptada**, eles podem iniciar a **comunicaÃ§ÃŖo HTTP**.
+
+EntÃŖo, o cliente envia uma **solicitaÃ§ÃŖo HTTPS**. Que Ê apenas uma solicitaÃ§ÃŖo HTTP sobre uma conexÃŖo TLS encriptada.
+
+
+
+### Desencriptando a SolicitaÃ§ÃŖo
+
+O Proxy de TerminaÃ§ÃŖo TLS entÃŖo usaria a encriptaÃ§ÃŖo combinada para **desencriptar a solicitaÃ§ÃŖo**, e transmitiria a **solicitaÃ§ÃŖo bÃĄsica (desencriptada)** para o processo executando a aplicaÃ§ÃŖo (por exemplo, um processo com Uvicorn executando a aplicaÃ§ÃŖo FastAPI).
+
+
+
+### Resposta HTTP
+
+A aplicaÃ§ÃŖo processaria a solicitaÃ§ÃŖo e retornaria uma **resposta HTTP bÃĄsica (nÃŖo encriptada)** para o Proxy de TerminaÃ§ÃŖo TLS.
+
+
+
+### Resposta HTTPS
+
+O Proxy de TerminaÃ§ÃŖo TLS iria **encriptar a resposta** utilizando a criptografia combinada anteriormente (que foi definida com o certificado para `someapp.example.com`), e devolveria para o navegador.
+
+No prÃŗximo passo, o navegador verifica que a resposta Ê vÃĄlida e encriptada com a chave criptogrÃĄfica correta, etc. E depois **desencripta a resposta** e a processa.
+
+
+
+O cliente (navegador) saberÃĄ que a resposta vem do servidor correto por que ela usa a criptografia que foi combinada entre eles usando o **certificado HTTPS** anterior.
+
+### MÃēltiplas AplicaçÃĩes
+
+Podem existir **mÃēltiplas aplicaçÃĩes** em execuÃ§ÃŖo no mesmo servidor (ou servidores), por exemplo: outras APIs ou um banco de dados.
+
+Apenas um processo pode estar vinculado a um IP e porta (o Proxy de TerminaÃ§ÃŖo TLS, por exemplo), mas outras aplicaçÃĩes/processos tambÊm podem estar em execuÃ§ÃŖo no(s) servidor(es), desde que nÃŖo tentem usar a mesma **combinaÃ§ÃŖo de IP pÃēblico e porta**.
+
+
+
+Dessa forma, o Proxy de TerminaÃ§ÃŖo TLS pode gerenciar o HTTPS e os certificados de **mÃēltiplos domÃnios**, para mÃēltiplas aplicaçÃĩes, e entÃŖo transmitir as requisiçÃĩes para a aplicaÃ§ÃŖo correta em cada caso.
+
+### RenovaÃ§ÃŖo de Certificados
+
+Em algum momento futuro, cada certificado irÃĄ **expirar** (aproximadamente 3 meses apÃŗs a aquisiÃ§ÃŖo).
+
+E entÃŖo, haverÃĄ outro programa (em alguns casos pode ser o prÃŗprio Proxy de TerminaÃ§ÃŖo TLS) que irÃĄ interagir com o Let's Encrypt e renovar o(s) certificado(s).
+
+
+
+Os **certificados TLS** sÃŖo **associados com um nome de domÃnio**, e nÃŖo a um endereço IP.
+
+EntÃŖo para renovar os certificados, o programa de renovaÃ§ÃŖo precisa **provar** para a autoridade (Let's Encrypt) que ele realmente **possui e controla esse domÃnio**>
+
+Para fazer isso, e acomodar as necessidades de diferentes aplicaçÃĩes, existem diferentes opçÃĩes para esse programa. Algumas escolhas populares sÃŖo:
+
+* **Modificar alguns registros DNS**
+ * Para isso, o programa de renovaÃ§ÃŖo precisa ter suporte as APIs do provedor DNS, entÃŖo, dependendo do provedor DNS que vocÃĒ utilize, isso pode ou nÃŖo ser uma opÃ§ÃŖo viÃĄvel.
+* **Executar como um servidor** (ao menos durante o processo de aquisiÃ§ÃŖo do certificado) no endereço IP pÃēblico associado com o domÃnio.
+ * Como dito anteriormente, apenas um processo pode estar ligado a uma porta e IP especÃficos.
+ * Essa Ê uma dos motivos que fazem utilizar o mesmo Proxy de TerminaÃ§ÃŖo TLS para gerenciar a renovaÃ§ÃŖo de certificados ser tÃŖo Ãētil.
+ * Caso contrÃĄrio, vocÃĒ pode ter que parar a execuÃ§ÃŖo do Proxy de TerminaÃ§ÃŖo TLS momentaneamente, inicializar o programa de renovaÃ§ÃŖo para renovar os certificados, e entÃŖo reiniciar o Proxy de TerminaÃ§ÃŖo TLS. Isso nÃŖo Ê o ideal, jÃĄ que sua(s) aplicaÃ§ÃŖo(Ãĩes) nÃŖo vÃŖo estar disponÃveis enquanto o Proxy de TerminaÃ§ÃŖo TLS estiver desligado.
+
+Todo esse processo de renovaÃ§ÃŖo, enquanto o aplicativo ainda funciona, Ê uma das principais razÃĩes para preferir um **sistema separado para gerenciar HTTPS** com um Proxy de TerminaÃ§ÃŖo TLS em vez de usar os certificados TLS no servidor da aplicaÃ§ÃŖo diretamente (e.g. com o Uvicorn).
+
+## Recapitulando
+
+Possuir **HTTPS** habilitado na sua aplicaÃ§ÃŖo Ê bastante importante, e atÊ **crÃtico** na maioria dos casos. A maior parte do esforço que vocÃĒ tem que colocar sobre o HTTPS como desenvolvedor estÃĄ em **entender esses conceitos** e como eles funcionam.
+
+Mas uma vez que vocÃĒ saiba o bÃĄsico de **HTTPS para desenvolvedores**, vocÃĒ pode combinar e configurar diferentes ferramentas facilmente para gerenciar tudo de uma forma simples.
+
+Em alguns dos prÃŗximos capÃtulos, eu mostrarei para vocÃĒ vÃĄrios exemplos concretos de como configurar o **HTTPS** para aplicaçÃĩes **FastAPI**. đ
diff --git a/docs/pt/docs/how-to/custom-docs-ui-assets.md b/docs/pt/docs/how-to/custom-docs-ui-assets.md
index 3adc7529e..b7de6c8bd 100644
--- a/docs/pt/docs/how-to/custom-docs-ui-assets.md
+++ b/docs/pt/docs/how-to/custom-docs-ui-assets.md
@@ -98,7 +98,7 @@ VocÃĒ provavelmente pode clicar com o botÃŖo direito em cada link e selecionar u
E o **ReDoc** usa os arquivos:
-* `redoc.standalone.js`
+* `redoc.standalone.js`
Depois disso, sua estrutura de arquivos deve se parecer com:
@@ -129,14 +129,8 @@ VocÃĒ deverÃĄ ver um arquivo JavaScript muito longo para o **ReDoc**.
Esse arquivo pode começar com algo como:
```JavaScript
-/*!
- * ReDoc - OpenAPI/Swagger-generated API Reference Documentation
- * -------------------------------------------------------------
- * Version: "2.0.0-rc.18"
- * Repo: https://github.com/Redocly/redoc
- */
-!function(e,t){"object"==typeof exports&&"object"==typeof m
-
+/*! For license information please see redoc.standalone.js.LICENSE.txt */
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("null")):
...
```
diff --git a/docs/pt/docs/index.md b/docs/pt/docs/index.md
index bc23114dc..9f08d5224 100644
--- a/docs/pt/docs/index.md
+++ b/docs/pt/docs/index.md
@@ -11,15 +11,18 @@
Framework FastAPI, alta performance, fÃĄcil de aprender, fÃĄcil de codar, pronto para produÃ§ÃŖo
-
-
+
+
-
-
+
+
+
+
+
---
@@ -60,7 +63,7 @@ Os recursos chave sÃŖo:
-Outros patrocinadores
+Outros patrocinadores
## OpiniÃĩes
@@ -70,6 +73,18 @@ Os recursos chave sÃŖo:
---
+"_NÃŗs adotamos a biblioteca **FastAPI** para iniciar um servidor **REST** que pode ser consultado para obter **previsÃĩes**. [para o Ludwig]_"
+
+Piero Molino, Yaroslav Dudin, e Sai Sumanth Miryala -
Uber (ref)
+
+---
+
+"_A **Netflix** tem o prazer de anunciar o lançamento open-source do nosso framework de orquestraÃ§ÃŖo de **gerenciamento de crises**: **Dispatch**! [criado com **FastAPI**]_"
+
+Kevin Glisson, Marc Vilanova, Forest Monsen -
Netflix (ref)
+
+---
+
"*Estou extremamente entusiasmado com o **FastAPI**. Ã tÃŖo divertido!*"
@@ -90,9 +105,9 @@ Os recursos chave sÃŖo:
---
-"*NÃŗs adotamos a biblioteca **FastAPI** para criar um servidor **REST** que possa ser chamado para obter **prediçÃĩes**. [para o Ludwig]*"
+"_Se alguÊm estiver procurando construir uma API Python para produÃ§ÃŖo, eu recomendaria fortemente o **FastAPI**. Ele Ê **lindamente projetado**, **simples de usar** e **altamente escalÃĄvel**. Ele se tornou um **componente chave** para a nossa estratÊgia API first de desenvolvimento e estÃĄ impulsionando diversas automaçÃĩes e serviços, como o nosso Virtual TAC Engineer._"
-Piero Molino, Yaroslav Dudin e Sai Sumanth Miryala -
Uber (ref)
+Deon Pillsbury -
Cisco (ref)
---
@@ -113,28 +128,20 @@ FastAPI estÃĄ nos ombros de gigantes:
## InstalaÃ§ÃŖo
-
-
-```console
-$ pip install fastapi
-
----> 100%
-```
-
-
-
-VocÃĒ tambÊm precisarÃĄ de um servidor ASGI para produÃ§ÃŖo, tal como Uvicorn ou Hypercorn .
+Crie e ative um ambiente virtual , e entÃŖo instale o FastAPI:
```console
-$ pip install "uvicorn[standard]"
+$ pip install "fastapi[standard]"
---> 100%
```
+**Nota**: Certifique-se de que vocÃĒ colocou `"fastapi[standard]"` com aspas, para garantir que funcione em todos os terminais.
+
## Exemplo
### Crie
@@ -184,7 +191,7 @@ async def read_item(item_id: int, q: Union[str, None] = None):
**Nota**:
-Se vocÃĒ nÃŖo sabe, verifique a seÃ§ÃŖo _"In a hurry?"_ sobre `async` e `await` nas docs .
+Se vocÃĒ nÃŖo sabe, verifique a seÃ§ÃŖo _"Com pressa?"_ sobre `async` e `await` nas docs .
@@ -195,11 +202,24 @@ Rode o servidor com:
```console
-$ uvicorn main:app --reload
-
+$ fastapi dev main.py
+
+ âââââââââââ FastAPI CLI - Development mode ââââââââââââŽ
+ â â
+ â Serving at: http://127.0.0.1:8000 â
+ â â
+ â API docs: http://127.0.0.1:8000/docs â
+ â â
+ â Running in development mode, for production use: â
+ â â
+ â fastapi run â
+ â â
+ â°ââââââââââââââââââââââââââââââââââââââââââââââââââââââ¯
+
+INFO: Will watch for changes in these directories: ['/home/user/code/awesomeapp']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
-INFO: Started reloader process [28720]
-INFO: Started server process [28722]
+INFO: Started reloader process [2248755] using WatchFiles
+INFO: Started server process [2248757]
INFO: Waiting for application startup.
INFO: Application startup complete.
```
@@ -207,13 +227,13 @@ INFO: Application startup complete.
-Sobre o comando uvicorn main:app --reload
...
+Sobre o comando fastapi dev main.py
...
-O comando `uvicorn main:app` se refere a:
+O comando `fastapi dev` lÃĒ o seu arquivo `main.py`, identifica o aplicativo **FastAPI** nele, e inicia um servidor usando o Uvicorn .
-* `main`: o arquivo `main.py` (o "mÃŗdulo" Python).
-* `app`: o objeto criado dentro de `main.py` com a linha `app = FastAPI()`.
-* `--reload`: faz o servidor recarregar apÃŗs mudanças de cÃŗdigo. Somente faça isso para desenvolvimento.
+Por padrÃŖo, o `fastapi dev` iniciarÃĄ com *auto-reload* habilitado para desenvolvimento local.
+
+VocÃĒ pode ler mais sobre isso na documentaÃ§ÃŖo do FastAPI CLI .
@@ -268,7 +288,7 @@ app = FastAPI()
class Item(BaseModel):
name: str
price: float
- is_offer: Union[bool] = None
+ is_offer: Union[bool, None] = None
@app.get("/")
@@ -286,7 +306,7 @@ def update_item(item_id: int, item: Item):
return {"item_name": item.name, "item_id": item_id}
```
-O servidor deverÃĄ recarregar automaticamente (porquÃĒ vocÃĒ adicionou `--reload` ao comando `uvicorn` acima).
+O servidor `fastapi dev` deverÃĄ recarregar automaticamente.
### Evoluindo a DocumentaÃ§ÃŖo Interativa da API
@@ -316,7 +336,7 @@ E agora, vÃĄ para Tutorial - Guia do UsuÃĄrio .
+Para um exemplo mais completo incluindo mais recursos, veja Tutorial - Guia do UsuÃĄrio .
**Alerta de Spoiler**: o tutorial - guia do usuÃĄrio inclui:
@@ -416,9 +436,9 @@ Para um exemplo mais completo incluindo mais recursos, veja InjeÃ§ÃŖo de DependÃĒncia**.
* Segurança e autenticaÃ§ÃŖo, incluindo suporte para **OAuth2** com autenticaÃ§ÃŖo **JWT tokens** e **HTTP Basic**.
* TÊcnicas mais avançadas (mas igualmente fÃĄceis) para declaraÃ§ÃŖo de **modelos JSON profundamente aninhados** (graças ao Pydantic).
+* IntegraçÃĩes **GraphQL** com o Strawberry e outras bibliotecas.
* Muitos recursos extras (graças ao Starlette) como:
* **WebSockets**
- * **GraphQL**
* testes extrememamente fÃĄceis baseados em HTTPX e `pytest`
* **CORS**
* **Cookie Sessions**
@@ -428,30 +448,49 @@ Para um exemplo mais completo incluindo mais recursos, veja um dos _frameworks_ Python mais rÃĄpidos disponÃveis , somente atrÃĄs de Starlette e Uvicorn (utilizados internamente pelo FastAPI). (*)
-Para entender mais sobre performance, veja a seÃ§ÃŖo Benchmarks .
+Para entender mais sobre performance, veja a seÃ§ÃŖo ComparaçÃĩes .
+
+## DependÃĒncias
+
+O FastAPI depende do Pydantic e do Starlette.
+
-## DependÃĒncias opcionais
+### DependÃĒncias `standard`
-Usados por Pydantic:
+Quando vocÃĒ instala o FastAPI com `pip install "fastapi[standard]"`, ele vÃĒm com o grupo `standard` (padrÃŖo) de dependÃĒncias opcionais:
+
+Utilizado pelo Pydantic:
* email-validator
- para validaÃ§ÃŖo de email.
-Usados por Starlette:
+Utilizado pelo Starlette:
+
+* httpx
- ObrigatÃŗrio caso vocÃĒ queira utilizar o `TestClient`.
+* jinja2
- ObrigatÃŗrio se vocÃĒ quer utilizar a configuraÃ§ÃŖo padrÃŖo de templates.
+* python-multipart
- ObrigatÃŗrio se vocÃĒ deseja suporte a "parsing" de formulÃĄrio, com `request.form()`.
+
+Utilizado pelo FastAPI / Starlette:
+
+* uvicorn
- para o servidor que carrega e serve a sua aplicaÃ§ÃŖo. Isto inclui `uvicorn[standard]`, que inclui algumas dependÃĒncias (e.g. `uvloop`) necessÃĄrias para servir em alta performance.
+* `fastapi-cli` - que disponibiliza o comando `fastapi`.
+
+### Sem as dependÃĒncias `standard`
+
+Se vocÃĒ nÃŖo deseja incluir as dependÃĒncias opcionais `standard`, vocÃĒ pode instalar utilizando `pip install fastapi` ao invÊs de `pip install "fastapi[standard]"`.
+
+### DpendÃĒncias opcionais adicionais
+
+Existem algumas dependÃĒncias adicionais que vocÃĒ pode querer instalar.
-* httpx
- NecessÃĄrio se vocÃĒ quiser utilizar o `TestClient`.
-* jinja2
- NecessÃĄrio se vocÃĒ quiser utilizar a configuraÃ§ÃŖo padrÃŖo de templates.
-* python-multipart
- NecessÃĄrio se vocÃĒ quiser suporte com "parsing" de formulÃĄrio, com `request.form()`.
-* itsdangerous
- NecessÃĄrio para suporte a `SessionMiddleware`.
-* pyyaml
- NecessÃĄrio para suporte a `SchemaGenerator` da Starlette (vocÃĒ provavelmente nÃŖo precisarÃĄ disso com o FastAPI).
-* graphene
- NecessÃĄrio para suporte a `GraphQLApp`.
+DependÃĒncias opcionais adicionais do Pydantic:
-Usados por FastAPI / Starlette:
+* pydantic-settings
- para gerenciamento de configuraçÃĩes.
+* pydantic-extra-types
- tipos extras para serem utilizados com o Pydantic.
-* uvicorn
- para o servidor que carrega e serve sua aplicaÃ§ÃŖo.
-* orjson
- NecessÃĄrio se vocÃĒ quer utilizar `ORJSONResponse`.
-* ujson
- NecessÃĄrio se vocÃĒ quer utilizar `UJSONResponse`.
+DependÃĒncias opcionais adicionais do FastAPI:
-VocÃĒ pode instalar todas essas dependÃĒncias com `pip install fastapi[all]`.
+* orjson
- ObrigatÃŗrio se vocÃĒ deseja utilizar o `ORJSONResponse`.
+* ujson
- ObrigatÃŗrio se vocÃĒ deseja utilizar o `UJSONResponse`.
## Licença
diff --git a/docs/pt/docs/project-generation.md b/docs/pt/docs/project-generation.md
index e5c935fd2..e337ad762 100644
--- a/docs/pt/docs/project-generation.md
+++ b/docs/pt/docs/project-generation.md
@@ -1,84 +1,28 @@
-# GeraÃ§ÃŖo de Projetos - Modelo
-
-VocÃĒ pode usar um gerador de projetos para começar, por jÃĄ incluir configuraçÃĩes iniciais, segurança, banco de dados e os primeiros _endpoints_ API jÃĄ feitos para vocÃĒ.
-
-Um gerador de projetos sempre terÃĄ uma prÊ-configuraÃ§ÃŖo que vocÃĒ pode atualizar e adaptar para suas prÃŗprias necessidades, mas pode ser um bom ponto de partida para seu projeto.
-
-## Full Stack FastAPI PostgreSQL
-
-GitHub: https://github.com/tiangolo/full-stack-fastapi-postgresql
-
-### Full Stack FastAPI PostgreSQL - Recursos
-
-* IntegraÃ§ÃŖo completa **Docker**.
-* Modo de implantaÃ§ÃŖo Docker Swarm.
-* IntegraÃ§ÃŖo e otimizaÃ§ÃŖo **Docker Compose** para desenvolvimento local.
-* **Pronto para ProduÃ§ÃŖo** com servidor _web_ usando Uvicorn e Gunicorn.
-* _Backend_ **FastAPI** Python:
- * **RÃĄpido**: Alta performance, no nÃvel de **NodeJS** e **Go** (graças ao Starlette e Pydantic).
- * **Intuitivo**: Ãtimo suporte de editor. _Auto-Complete_ em todo lugar. Menos tempo _debugando_.
- * **FÃĄcil**: Projetado para ser fÃĄcil de usar e aprender. Menos tempo lendo documentaçÃĩes.
- * **Curto**: Minimize duplicaÃ§ÃŖo de cÃŗdigo. MÃēltiplos recursos para cada declaraÃ§ÃŖo de parÃĸmetro.
- * **Robusto**: Tenha cÃŗdigo pronto para produÃ§ÃŖo. Com documentaÃ§ÃŖo interativa automÃĄtica.
- * **Baseado em PadrÃĩes**: Baseado em (e completamente compatÃvel com) padrÃĩes abertos para APIs: OpenAPI e JSON Schema .
- * **Muitos outros recursos** incluindo validaÃ§ÃŖo automÃĄtica, serializaÃ§ÃŖo, documentaÃ§ÃŖo interativa, autenticaÃ§ÃŖo com _tokens_ OAuth2 JWT etc.
-* **Senha segura** _hashing_ por padrÃŖo.
-* AutenticaÃ§ÃŖo **Token JWT**.
-* Modelos **SQLAlchemy** (independente de extensÃĩes Flask, para que eles possam ser usados com _workers_ Celery diretamente).
-* Modelos bÃĄsicos para usuÃĄrios (modifique e remova conforme suas necessidades).
-* MigraçÃĩes **Alembic**.
-* **CORS** (_Cross Origin Resource Sharing_ - Compartilhamento de Recursos Entre Origens).
-* _Worker_ **Celery** que pode importar e usar modelos e cÃŗdigos do resto do _backend_ seletivamente.
-* Testes _backend_ _REST_ baseados no **Pytest**, integrados com Docker, entÃŖo vocÃĒ pode testar a interaÃ§ÃŖo completa da API, independente do banco de dados. Como roda no Docker, ele pode construir um novo repositÃŗrio de dados do zero toda vez (assim vocÃĒ pode usar ElasticSearch, MongoDB, CouchDB, ou o que quiser, e apenas testar que a API esteja funcionando).
-* FÃĄcil integraÃ§ÃŖo com Python atravÊs dos **Kernels Jupyter** para desenvolvimento remoto ou no Docker com extensÃĩes como Atom Hydrogen ou Visual Studio Code Jupyter.
-* _Frontend_ **Vue**:
- * Gerado com Vue CLI.
- * Controle de **AutenticaÃ§ÃŖo JWT**.
- * VisualizaÃ§ÃŖo de _login_.
- * ApÃŗs o _login_, visualizaÃ§ÃŖo do painel de controle principal.
- * Painel de controle principal com criaÃ§ÃŖo e ediÃ§ÃŖo de usuÃĄrio.
- * EdiÃ§ÃŖo do prÃŗprio usuÃĄrio.
- * **Vuex**.
- * **Vue-router**.
- * **Vuetify** para belos componentes _material design_.
- * **TypeScript**.
- * Servidor Docker baseado em **Nginx** (configurado para rodar "lindamente" com Vue-router).
- * ConstruÃ§ÃŖo multi-estÃĄgio Docker, entÃŖo vocÃĒ nÃŖo precisa salvar ou _commitar_ cÃŗdigo compilado.
- * Testes _frontend_ rodados na hora da construÃ§ÃŖo (pode ser desabilitado tambÊm).
- * Feito tÃŖo modular quanto possÃvel, entÃŖo ele funciona fora da caixa, mas vocÃĒ pode gerar novamente com Vue CLI ou criar conforme vocÃĒ queira, e reutilizar o que quiser.
-* **PGAdmin** para banco de dados PostgreSQL, vocÃĒ pode modificar para usar PHPMyAdmin e MySQL facilmente.
-* **Flower** para monitoraÃ§ÃŖo de tarefas Celery.
-* Balanceamento de carga entre _frontend_ e _backend_ com **Traefik**, entÃŖo vocÃĒ pode ter ambos sob o mesmo domÃnio, separados por rota, mas servidos por diferentes containers.
-* IntegraÃ§ÃŖo Traefik, incluindo geraÃ§ÃŖo automÃĄtica de certificados **HTTPS** Let's Encrypt.
-* GitLab **CI** (integraÃ§ÃŖo contÃnua), incluindo testes _frontend_ e _backend_.
-
-## Full Stack FastAPI Couchbase
-
-GitHub: https://github.com/tiangolo/full-stack-fastapi-couchbase
-
-â ī¸ **WARNING** â ī¸
-
-Se vocÃĒ estÃĄ iniciando um novo projeto do zero, verifique as alternativas aqui.
-
-Por exemplo, o gerador de projetos Full Stack FastAPI PostgreSQL pode ser uma alternativa melhor, como ele Ê ativamente mantido e utilizado. E ele inclui todos os novos recursos e melhorias.
-
-VocÃĒ ainda Ê livre para utilizar o gerador baseado em Couchbase se quiser, ele provavelmente ainda funciona bem, e vocÃĒ jÃĄ tem um projeto gerado com ele que roda bem tambÊm (e vocÃĒ provavelmente jÃĄ atualizou ele para encaixar nas suas necessidades).
-
-VocÃĒ pode ler mais sobre nas documentaÃ§ÃŖoes do repositÃŗrio.
-
-## Full Stack FastAPI MongoDB
-
-...pode demorar, dependendo do meu tempo disponÃvel e outros fatores. đ
đ
-
-## Modelos de Aprendizado de MÃĄquina com spaCy e FastAPI
-
-GitHub: https://github.com/microsoft/cookiecutter-spacy-fastapi
-
-### Modelos de Aprendizado de MÃĄquina com spaCy e FastAPI - Recursos
-
-* IntegraÃ§ÃŖo com modelo NER **spaCy**.
-* Formato de requisiÃ§ÃŖo **Busca Cognitiva Azure** acoplado.
-* Servidor Python _web_ **Pronto para ProduÃ§ÃŖo** usando Uvicorn e Gunicorn.
-* ImplantaÃ§ÃŖo **Azure DevOps** Kubernetes (AKS) CI/CD acoplada.
-* **Multilingual** facilmente escolhido como uma das linguagens spaCy acopladas durante a configuraÃ§ÃŖo do projeto.
-* **Facilmente extensÃvel** para outros modelos de _frameworks_ (Pytorch, Tensorflow), nÃŖo apenas spaCy.
+# Full Stack FastAPI Template
+
+_Templates_, embora tipicamente venham com alguma configuraÃ§ÃŖo especÃfica, sÃŖo desenhados para serem flexÃveis e customizÃĄveis. Isso permite que vocÃĒ os modifique e adapte para as especificaçÃĩes do seu projeto, fazendo-os um excelente ponto de partida. đ
+
+VocÃĒ pode usar esse _template_ para começar, jÃĄ que ele inclui vÃĄrias configuraçÃĩes iniciais, segurança, banco de dados, e alguns _endpoints_ de API jÃĄ feitos para vocÃĒ.
+
+RepositÃŗrio GitHub: Full Stack FastAPI Template
+
+## Full Stack FastAPI Template - Pilha de Tecnologias e Recursos
+
+- ⥠[**FastAPI**](https://fastapi.tiangolo.com) para a API do backend em Python.
+ - đ§° [SQLModel](https://sqlmodel.tiangolo.com) para as interaçÃĩes do Python com bancos de dados SQL (ORM).
+ - đ [Pydantic](https://docs.pydantic.dev), usado pelo FastAPI, para validaÃ§ÃŖo de dados e gerenciamento de configuraçÃĩes.
+ - đž [PostgreSQL](https://www.postgresql.org) como banco de dados SQL.
+- đ [React](https://react.dev) para o frontend.
+ - đ Usando TypeScript, hooks, [Vite](https://vitejs.dev), e outras partes de uma _stack_ frontend moderna.
+ - đ¨ [Chakra UI](https://chakra-ui.com) para os componentes de frontend.
+ - đ¤ Um cliente frontend automaticamente gerado.
+ - đ§Ē [Playwright](https://playwright.dev) para testes Ponta-a-Ponta.
+ - đĻ Suporte para modo escuro.
+- đ [Docker Compose](https://www.docker.com) para desenvolvimento e produÃ§ÃŖo.
+- đ _Hash_ seguro de senhas por padrÃŖo.
+- đ AutenticaÃ§ÃŖo por token JWT.
+- đĢ RecuperaÃ§ÃŖo de senhas baseada em email.
+- â
Testes com [Pytest](https://pytest.org).
+- đ [Traefik](https://traefik.io) como proxy reverso / balanceador de carga.
+- đĸ InstruçÃĩes de _deployment_ usando Docker Compose, incluindo como configurar um proxy frontend com Traefik para gerenciar automaticamente certificados HTTPS.
+- đ CI (IntegraÃ§ÃŖo ContÃnua) e CD (_Deploy_ ContÃnuo) baseado em GitHub Actions.
diff --git a/docs/pt/docs/tutorial/bigger-applications.md b/docs/pt/docs/tutorial/bigger-applications.md
index a094005fd..b621f3c72 100644
--- a/docs/pt/docs/tutorial/bigger-applications.md
+++ b/docs/pt/docs/tutorial/bigger-applications.md
@@ -52,7 +52,7 @@ from app.routers import items
* HÃĄ tambÊm um subdiretÃŗrio `app/internal/` com outro arquivo `__init__.py`, entÃŖo ele Ê outro "subpacote Python":`app.internal`.
* E o arquivo `app/internal/admin.py` Ê outro submÃŗdulo: `app.internal.admin`.
-
+
A mesma estrutura de arquivos com comentÃĄrios:
@@ -270,7 +270,7 @@ Mas esse arquivo nÃŖo existe, nossas dependÃĒncias estÃŖo em um arquivo em `app/
Lembre-se de como nossa estrutura app/file se parece:
-
+
---
diff --git a/docs/ru/docs/advanced/additional-status-codes.md b/docs/ru/docs/advanced/additional-status-codes.md
new file mode 100644
index 000000000..aab1f8ee3
--- /dev/null
+++ b/docs/ru/docs/advanced/additional-status-codes.md
@@ -0,0 +1,41 @@
+# ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ŅŅаŅŅŅ ĐēОдŅ
+
+ĐĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ **FastAPI** вОСвŅаŅаĐĩŅ ĐžŅвĐĩŅŅ, иŅĐŋĐžĐģŅСŅŅ `JSONResponse`, ĐŋĐžĐŧĐĩŅĐ°Ņ ŅОдĐĩŅĐļиĐŧĐžĐĩ, ĐēĐžŅĐžŅĐžĐĩ Đ˛Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅĐĩ иС ваŅĐĩĐš *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*, вĐŊŅŅŅŅ ŅŅĐžĐŗĐž `JSONResponse`.
+
+ĐĐŊ ĐąŅĐ´ĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ ĐēОд ŅŅаŅŅŅа ĐŋĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ Đ¸Đģи ŅĐžŅ, ĐēĐžŅĐžŅŅĐš Đ˛Ņ ŅĐēаĐļĐĩŅĐĩ в ваŅĐĩĐš *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*.
+
+## ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ŅŅаŅŅŅ ĐēОдŅ
+
+ĐŅĐģи Đ˛Ņ Ņ
ĐžŅиŅĐĩ вОСвŅаŅаŅŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐš ŅŅаŅŅŅ ĐēОд ĐŋĐžĐŧиĐŧĐž ĐžŅĐŊОвĐŊĐžĐŗĐž, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅĐ´ĐĩĐģаŅŅ ŅŅĐž, вОСвŅаŅĐ°Ņ ĐžĐąŅĐĩĐēŅ `Response` ĐŊаĐŋŅŅĐŧŅŅ, ĐēаĐē `JSONResponse`, и ŅŅŅаĐŊавĐģĐ¸Đ˛Đ°Ņ ĐŊŅĐļĐŊŅĐš ŅŅаŅŅŅ ĐēОд ĐŊаĐŋŅŅĐŧŅŅ.
+
+ĐаĐŋŅиĐŧĐĩŅ, ŅĐēаĐļĐĩĐŧ, Đ˛Ņ Ņ
ĐžŅиŅĐĩ ŅОСдаŅŅ *ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи*, ĐēĐžŅĐžŅĐ°Ņ ĐŋОСвОĐģŅĐĩŅ ĐžĐąĐŊОвĐģŅŅŅ ŅĐģĐĩĐŧĐĩĐŊŅŅ Đ¸ вОСвŅаŅаĐĩŅ HTTP-ĐēОд 200 "OK" ĐŋŅи ŅŅĐŋĐĩŅĐŊĐžĐŧ вŅĐŋĐžĐģĐŊĐĩĐŊии.
+
+ĐĐž Đ˛Ņ ŅаĐēĐļĐĩ Ņ
ĐžŅиŅĐĩ, ŅŅĐžĐąŅ ĐžĐŊа ĐŋŅиĐŊиĐŧаĐģа ĐŊОвŅĐĩ ŅĐģĐĩĐŧĐĩĐŊŅŅ. Đ ĐĩŅĐģи ŅĐģĐĩĐŧĐĩĐŊŅ ŅаĐŊĐĩĐĩ ĐŊĐĩ ŅŅŅĐĩŅŅвОваĐģ, ĐžĐŊ ŅОСдаŅŅŅŅ, и вОСвŅаŅаĐģŅŅ HTTP-ĐēОд 201 "Created".
+
+ЧŅĐžĐąŅ ŅĐĩаĐģиСОваŅŅ ŅŅĐž, иĐŧĐŋĐžŅŅиŅŅĐšŅĐĩ `JSONResponse` и вОСвŅаŅаКŅĐĩ Đ˛Đ°Ņ ĐēĐžĐŊŅĐĩĐŊŅ ĐŊаĐŋŅŅĐŧŅŅ, ŅŅŅаĐŊавĐģĐ¸Đ˛Đ°Ņ ĐŊŅĐļĐŊŅĐš `status_code`:
+
+{* ../../docs_src/additional_status_codes/tutorial001_an_py310.py hl[4,25] *}
+
+/// warning | ĐĐŊиĐŧаĐŊиĐĩ
+
+ĐĐžĐŗĐ´Đ° Đ˛Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅĐĩ ОйŅĐĩĐēŅ `Response` ĐŊаĐŋŅŅĐŧŅŅ, ĐēаĐē в ĐŋŅиĐŧĐĩŅĐĩ вŅŅĐĩ, ĐžĐŊ ĐąŅĐ´ĐĩŅ Đ˛ĐžĐˇĐ˛ŅаŅŅĐŊ ĐēаĐē ĐĩŅŅŅ.
+
+ĐĐŊ ĐŊĐĩ ĐąŅĐ´ĐĩŅ ŅĐĩŅиаĐģиСОваĐŊ ĐŋŅи ĐŋĐžĐŧĐžŅи ĐŧОдĐĩĐģи и Ņ.Đ´.
+
+ĐŖĐąĐĩдиŅĐĩŅŅ, ŅŅĐž в ĐŊŅĐŧ ŅОдĐĩŅĐļаŅŅŅ Đ¸ĐŧĐĩĐŊĐŊĐž ŅĐĩ даĐŊĐŊŅĐĩ, ĐēĐžŅĐžŅŅĐĩ Đ˛Ņ Ņ
ĐžŅиŅĐĩ, и ŅŅĐž СĐŊаŅĐĩĐŊĐ¸Ņ ŅвĐģŅŅŅŅŅ Đ˛Đ°ĐģидĐŊŅĐŧ JSON (ĐĩŅĐģи Đ˛Ņ Đ¸ŅĐŋĐžĐģŅСŅĐĩŅĐĩ `JSONResponse`).
+
+///
+
+/// note | ĐĸĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ Đ´ĐĩŅаĐģи
+
+ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ `from starlette.responses import JSONResponse`.
+
+**FastAPI** ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ ŅĐžŅ ĐļĐĩ `starlette.responses` ŅĐĩŅĐĩС `fastapi.responses` ĐŋŅĐžŅŅĐž Đ´ĐģŅ Đ˛Đ°ŅĐĩĐŗĐž ŅдОйŅŅва, ĐēаĐē ŅаСŅайОŅŅиĐēа. ĐĐž йОĐģŅŅиĐŊŅŅвО Đ´ĐžŅŅŅĐŋĐŊŅŅ
Response-ĐēĐģаŅŅОв ĐŋĐžŅŅŅĐŋаŅŅ ĐŊаĐŋŅŅĐŧŅŅ Đ¸Đˇ Starlette. ĐĸĐž ĐļĐĩ ŅаĐŧĐžĐĩ ĐēаŅаĐĩŅŅŅ Đ¸ `status`.
+
+///
+
+## OpenAPI и Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ API
+
+ĐŅĐģи Đ˛Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅĐĩ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ĐēĐžĐ´Ņ ŅŅаŅŅŅОв и ĐžŅвĐĩŅŅ ĐŊаĐŋŅŅĐŧŅŅ, ĐžĐŊи ĐŊĐĩ ĐąŅĐ´ŅŅ Đ˛ĐēĐģŅŅĐĩĐŊŅ Đ˛ ŅŅ
ĐĩĐŧŅ OpenAPI (Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ API), ĐŋĐžŅĐžĐŧŅ ŅŅĐž FastAPI ĐŊĐĩ ĐŧĐžĐļĐĩŅ ĐˇĐ°ŅаĐŊĐĩĐĩ СĐŊаŅŅ, ŅŅĐž Đ˛Ņ ŅОйиŅаĐĩŅĐĩŅŅ Đ˛ĐĩŅĐŊŅŅŅ.
+
+ĐĐž Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ СадОĐēŅĐŧĐĩĐŊŅиŅОваŅŅ ŅŅĐž в ваŅĐĩĐŧ ĐēОдĐĩ, иŅĐŋĐžĐģŅСŅŅ: [ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ĐžŅвĐĩŅŅ Đ˛ OpenAPI](additional-responses.md){.internal-link target=_blank}.
diff --git a/docs/ru/docs/advanced/index.md b/docs/ru/docs/advanced/index.md
new file mode 100644
index 000000000..b5cb733e7
--- /dev/null
+++ b/docs/ru/docs/advanced/index.md
@@ -0,0 +1,21 @@
+# РаŅŅиŅĐĩĐŊĐŊĐžĐĩ ŅŅĐēОвОдŅŅвО ĐŋĐžĐģŅСОваŅĐĩĐģŅ
+
+## ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ вОСĐŧĐžĐļĐŊĐžŅŅи
+
+ĐŅĐŊОвĐŊĐžĐĩ [ĐŖŅĐĩĐąĐŊиĐē - Đ ŅĐēОвОдŅŅвО ĐŋĐžĐģŅСОваŅĐĩĐģŅ](../tutorial/index.md){.internal-link target=_blank} Đ´ĐžĐģĐļĐŊĐž ĐąŅŅŅ Đ´ĐžŅŅаŅĐžŅĐŊĐž, ŅŅĐžĐąŅ ĐŋОСĐŊаĐēĐžĐŧиŅŅ Đ˛Đ°Ņ ŅĐž вŅĐĩĐŧи ĐžŅĐŊОвĐŊŅĐŧи ŅŅĐŊĐēŅиŅĐŧи **FastAPI**.
+
+Đ ŅĐģĐĩĐ´ŅŅŅиŅ
ŅаСдĐĩĐģаŅ
Đ˛Ņ ŅвидиŅĐĩ Đ´ŅŅĐŗĐ¸Đĩ ваŅиаĐŊŅŅ, ĐēĐžĐŊŅĐ¸ĐŗŅŅаŅии и Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ вОСĐŧĐžĐļĐŊĐžŅŅи.
+
+/// tip
+
+ĐĄĐģĐĩĐ´ŅŅŅиĐĩ ŅаСдĐĩĐģŅ **ĐŊĐĩ ОйŅСаŅĐĩĐģŅĐŊĐž ŅвĐģŅŅŅŅŅ "ĐŋŅОдвиĐŊŅŅŅĐŧи"**.
+
+РвĐŋĐžĐģĐŊĐĩ вОСĐŧĐžĐļĐŊĐž, ŅŅĐž Đ´ĐģŅ Đ˛Đ°ŅĐĩĐŗĐž ŅĐģŅŅĐ°Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊĐ¸Ņ ŅĐĩŅĐĩĐŊиĐĩ ĐŊаŅ
ОдиŅŅŅ Đ˛ ОдĐŊĐžĐŧ иС ĐŊиŅ
.
+
+///
+
+## ĐĄĐŊаŅаĐģа ĐŋŅĐžŅиŅаКŅĐĩ ĐŖŅĐĩĐąĐŊиĐē - Đ ŅĐēОвОдŅŅвО ĐŋĐžĐģŅСОваŅĐĩĐģŅ
+
+ĐŅ Đ˛ŅĐĩ ĐĩŅĐĩ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ ĐąĐžĐģŅŅиĐŊŅŅвО ŅŅĐŊĐēŅиК **FastAPI** ŅĐž СĐŊаĐŊиŅĐŧи иС [ĐŖŅĐĩĐąĐŊиĐē - Đ ŅĐēОвОдŅŅвО ĐŋĐžĐģŅСОваŅĐĩĐģŅ](../tutorial/index.md){.internal-link target=_blank}.
+
+Đ ŅĐģĐĩĐ´ŅŅŅиĐĩ ŅаСдĐĩĐģŅ ĐŋŅĐĩĐ´ĐŋĐžĐģĐ°ĐŗĐ°ŅŅ, ŅŅĐž Đ˛Ņ ŅĐļĐĩ ĐŋŅĐžŅиŅаĐģи ĐĩĐŗĐž, и ĐŋŅĐĩĐ´ĐŋĐžĐģĐ°ĐŗĐ°ŅŅ, ŅŅĐž Đ˛Ņ ĐˇĐŊаĐĩŅĐĩ ŅŅи ĐžŅĐŊОвĐŊŅĐĩ идĐĩи.
diff --git a/docs/ru/docs/advanced/response-change-status-code.md b/docs/ru/docs/advanced/response-change-status-code.md
new file mode 100644
index 000000000..37dade99f
--- /dev/null
+++ b/docs/ru/docs/advanced/response-change-status-code.md
@@ -0,0 +1,31 @@
+# Response - ĐСĐŧĐĩĐŊĐĩĐŊиĐĩ cŅаŅŅŅ ĐēОда
+
+ĐŅ, вĐĩŅĐžŅŅĐŊĐž, ŅĐļĐĩ ŅиŅаĐģи Đž ŅĐžĐŧ, ŅŅĐž ĐŧĐžĐļĐŊĐž ŅŅŅаĐŊОвиŅŅ [ĐĄĐžŅŅĐžŅĐŊиĐĩ ĐžŅвĐĩŅа ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ](../tutorial/response-status-code.md){.internal-link target=_blank}.
+
+ĐĐž в ĐŊĐĩĐēĐžŅĐžŅŅŅ
ŅĐģŅŅаŅŅ
ваĐŧ ĐŊŅĐļĐŊĐž вĐĩŅĐŊŅŅŅ ĐēОд ŅĐžŅŅĐžŅĐŊиŅ, ĐžŅĐģиŅĐŊŅĐš ĐžŅ ŅŅŅаĐŊОвĐģĐĩĐŊĐŊĐžĐŗĐž ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ.
+
+## ĐŅиĐŧĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваĐŊиŅ
+
+ĐаĐŋŅиĐŧĐĩŅ, ĐŋŅĐĩĐ´ŅŅавŅŅĐĩ, ŅŅĐž Đ˛Ņ Ņ
ĐžŅиŅĐĩ вОСвŅаŅаŅŅ HTTP ĐēОд ŅĐžŅŅĐžŅĐŊĐ¸Ņ "OK" `200` ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ.
+
+ĐĐž ĐĩŅĐģи даĐŊĐŊŅĐĩ ĐŊĐĩ ŅŅŅĐĩŅŅвОваĐģи, Đ˛Ņ Ņ
ĐžŅиŅĐĩ ŅОСдаŅŅ Đ¸Ņ
и вĐĩŅĐŊŅŅŅ HTTP ĐēОд ŅĐžŅŅĐžŅĐŊĐ¸Ņ "CREATED" `201`.
+
+ĐŅи ŅŅĐžĐŧ Đ˛Ņ Đ˛ŅŅ ĐĩŅŅ Ņ
ĐžŅиŅĐĩ иĐŧĐĩŅŅ Đ˛ĐžĐˇĐŧĐžĐļĐŊĐžŅŅŅ ŅиĐģŅŅŅОваŅŅ Đ¸ ĐŋŅĐĩОйŅаСОвŅваŅŅ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩĐŧŅĐĩ даĐŊĐŊŅĐĩ Ņ ĐŋĐžĐŧĐžŅŅŅ `response_model`.
+
+ĐĐģŅ ŅаĐēиŅ
ŅĐģŅŅаĐĩв Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ ĐŋаŅаĐŧĐĩŅŅ `Response`.
+
+## ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ ĐŋаŅаĐŧĐĩŅŅа `Response`
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ОйŅŅвиŅŅ ĐŋаŅаĐŧĐĩŅŅ ŅиĐŋа `Response` в ваŅĐĩĐš *ŅŅĐŊĐēŅии ОйŅайОŅĐēи ĐŋŅŅи* (ŅаĐē ĐļĐĩ ĐēаĐē Đ´ĐģŅ cookies и headers).
+
+РСаŅĐĩĐŧ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅŅŅаĐŊОвиŅŅ `status_code` в ŅŅĐžĐŧ *вŅĐĩĐŧĐĩĐŊĐŊĐžĐŧ* ОйŅĐĩĐēŅĐĩ ĐžŅвĐĩŅа.
+
+{* ../../docs_src/response_change_status_code/tutorial001.py hl[1,9,12] *}
+
+ĐĐžŅĐģĐĩ ŅŅĐžĐŗĐž Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ вĐĩŅĐŊŅŅŅ ĐģŅйОК ОйŅĐĩĐēŅ, ĐēĐžŅĐžŅŅĐš ваĐŧ ĐŊŅĐļĐĩĐŊ, ĐēаĐē ОйŅŅĐŊĐž (`dict`, ĐŧОдĐĩĐģŅ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊĐŊŅŅ
и Ņ.Đ´.).
+
+Đ ĐĩŅĐģи Đ˛Ņ ĐžĐąŅŅвиĐģи `response_model`, ĐžĐŊ вŅŅ ŅавĐŊĐž ĐąŅĐ´ĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅŅŅ Đ´ĐģŅ ŅиĐģŅŅŅаŅии и ĐŋŅĐĩОйŅаСОваĐŊĐ¸Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩĐŧĐžĐŗĐž ОйŅĐĩĐēŅа.
+
+**FastAPI** ĐąŅĐ´ĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ ŅŅĐžŅ *вŅĐĩĐŧĐĩĐŊĐŊŅĐš* ĐžŅвĐĩŅ Đ´ĐģŅ Đ¸ĐˇĐ˛ĐģĐĩŅĐĩĐŊĐ¸Ņ ĐēОда ŅĐžŅŅĐžŅĐŊĐ¸Ņ (а ŅаĐēĐļĐĩ cookies и headers) и ĐŋĐžĐŧĐĩŅŅĐ¸Ņ Đ¸Ņ
в ŅиĐŊаĐģŅĐŊŅĐš ĐžŅвĐĩŅ, ĐēĐžŅĐžŅŅĐš ŅОдĐĩŅĐļĐ¸Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩĐŧĐžĐĩ ваĐŧи СĐŊаŅĐĩĐŊиĐĩ, ĐžŅŅиĐģŅŅŅОваĐŊĐŊĐžĐĩ ĐģŅĐąŅĐŧ `response_model`.
+
+ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ ОйŅŅвиŅŅ ĐŋаŅаĐŧĐĩŅŅ `Response` в СавиŅиĐŧĐžŅŅŅŅ
и ŅŅŅаĐŊОвиŅŅ ĐēОд ŅĐžŅŅĐžŅĐŊĐ¸Ņ Đ˛ ĐŊиŅ
. ĐĐž ĐŋĐžĐŧĐŊиŅĐĩ, ŅŅĐž ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐĩ ŅŅŅаĐŊОвĐģĐĩĐŊĐŊĐžĐĩ СĐŊаŅĐĩĐŊиĐĩ ĐąŅĐ´ĐĩŅ Đ¸ĐŧĐĩŅŅ ĐŋŅиОŅиŅĐĩŅ.
diff --git a/docs/ru/docs/advanced/response-cookies.md b/docs/ru/docs/advanced/response-cookies.md
new file mode 100644
index 000000000..e04ff577c
--- /dev/null
+++ b/docs/ru/docs/advanced/response-cookies.md
@@ -0,0 +1,48 @@
+
+# Cookies в ĐžŅвĐĩŅĐĩ
+
+## ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ ĐŋаŅаĐŧĐĩŅŅа `Response`
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ОйŅŅвиŅŅ ĐŋаŅаĐŧĐĩŅŅ ŅиĐŋа `Response` в ваŅĐĩĐš ŅŅĐŊĐēŅии ŅĐŊĐ´ĐŋОиĐŊŅа.
+
+ĐаŅĐĩĐŧ ŅŅŅаĐŊОвиŅŅ cookies в ŅŅĐžĐŧ вŅĐĩĐŧĐĩĐŊĐŊĐžĐŧ ОйŅĐĩĐēŅĐĩ ĐžŅвĐĩŅа.
+
+{* ../../docs_src/response_cookies/tutorial002.py hl[1, 8:9] *}
+
+ĐĐžŅĐģĐĩ ŅŅĐžĐŗĐž ĐŧĐžĐļĐŊĐž вĐĩŅĐŊŅŅŅ ĐģŅйОК ОйŅĐĩĐēŅ, ĐēаĐē и ŅаĐŊŅŅĐĩ (ĐŊаĐŋŅиĐŧĐĩŅ, `dict`, ОйŅĐĩĐēŅ ĐŧОдĐĩĐģи ĐąĐ°ĐˇŅ Đ´Đ°ĐŊĐŊŅŅ
и ŅаĐē даĐģĐĩĐĩ).
+
+ĐŅĐģи Đ˛Ņ ŅĐēаСаĐģи `response_model`, ĐžĐŊ вŅŅ ŅавĐŊĐž ĐąŅĐ´ĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅŅŅ Đ´ĐģŅ ŅиĐģŅŅŅаŅии и ĐŋŅĐĩОйŅаСОваĐŊĐ¸Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩĐŧĐžĐŗĐž ОйŅĐĩĐēŅа.
+
+**FastAPI** иСвĐģĐĩŅĐĩŅ cookies (а ŅаĐēĐļĐĩ ĐˇĐ°ĐŗĐžĐģОвĐēи и ĐēĐžĐ´Ņ ŅĐžŅŅĐžŅĐŊиŅ) иС вŅĐĩĐŧĐĩĐŊĐŊĐžĐŗĐž ĐžŅвĐĩŅа и вĐēĐģŅŅĐ¸Ņ Đ¸Ņ
в ĐžĐēĐžĐŊŅаŅĐĩĐģŅĐŊŅĐš ĐžŅвĐĩŅ, ŅОдĐĩŅĐļаŅиК ваŅĐĩ вОСвŅаŅаĐĩĐŧĐžĐĩ СĐŊаŅĐĩĐŊиĐĩ, ĐžŅŅиĐģŅŅŅОваĐŊĐŊĐžĐĩ ŅĐĩŅĐĩС `response_model`.
+
+ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ ОйŅŅвиŅŅ ĐŋаŅаĐŧĐĩŅŅ ŅиĐŋа Response в СавиŅиĐŧĐžŅŅŅŅ
и ŅŅŅаĐŊавĐģиваŅŅ cookies (и ĐˇĐ°ĐŗĐžĐģОвĐēи) ŅаĐŧ.
+
+## ĐОСвŅаŅĐĩĐŊиĐĩ `Response` ĐŊаĐŋŅŅĐŧŅŅ
+
+ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ ŅŅŅаĐŊОвиŅŅ cookies, ĐĩŅĐģи вОСвŅаŅаĐĩŅĐĩ `Response` ĐŊаĐŋŅŅĐŧŅŅ Đ˛ ваŅĐĩĐŧ ĐēОдĐĩ.
+
+ĐĐģŅ ŅŅĐžĐŗĐž ŅОСдаКŅĐĩ ОйŅĐĩĐēŅ `Response`, ĐēаĐē ĐžĐŋиŅаĐŊĐž в ŅаСдĐĩĐģĐĩ [ĐОСвŅаŅĐĩĐŊиĐĩ ĐžŅвĐĩŅа ĐŊаĐŋŅŅĐŧŅŅ](response-directly.md){.target=_blank}.
+
+ĐаŅĐĩĐŧ ŅŅŅаĐŊОвиŅĐĩ cookies и вĐĩŅĐŊиŅĐĩ ŅŅĐžŅ ĐžĐąŅĐĩĐēŅ:
+
+{* ../../docs_src/response_cookies/tutorial001.py hl[10:12] *}
+
+/// tip | ĐŅиĐŧĐĩŅаĐŊиĐĩ
+ĐĐŧĐĩĐšŅĐĩ в видŅ, ŅŅĐž ĐĩŅĐģи Đ˛Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅĐĩ ĐžŅвĐĩŅ ĐŊаĐŋŅŅĐŧŅŅ, вĐŧĐĩŅŅĐž иŅĐŋĐžĐģŅСОваĐŊĐ¸Ņ ĐŋаŅаĐŧĐĩŅŅа `Response`, **FastAPI** ĐžŅĐŋŅĐ°Đ˛Đ¸Ņ ĐĩĐŗĐž ĐąĐĩС Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊОК ОйŅайОŅĐēи.
+
+ĐŖĐąĐĩдиŅĐĩŅŅ, ŅŅĐž ваŅи даĐŊĐŊŅĐĩ иĐŧĐĩŅŅ ĐēĐžŅŅĐĩĐēŅĐŊŅĐš ŅиĐŋ. ĐаĐŋŅиĐŧĐĩŅ, ĐžĐŊи Đ´ĐžĐģĐļĐŊŅ ĐąŅŅŅ ŅОвĐŧĐĩŅŅиĐŧŅ Ņ JSON, ĐĩŅĐģи Đ˛Ņ Đ¸ŅĐŋĐžĐģŅСŅĐĩŅĐĩ `JSONResponse`.
+
+ĐĸаĐēĐļĐĩ ŅĐąĐĩдиŅĐĩŅŅ, ŅŅĐž Đ˛Ņ ĐŊĐĩ ĐžŅĐŋŅавĐģŅĐĩŅĐĩ даĐŊĐŊŅĐĩ, ĐēĐžŅĐžŅŅĐĩ Đ´ĐžĐģĐļĐŊŅ ĐąŅĐģи ĐąŅŅŅ ĐžŅŅиĐģŅŅŅОваĐŊŅ ŅĐĩŅĐĩС `response_model`.
+///
+
+### ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊĐ°Ņ Đ¸ĐŊŅĐžŅĐŧаŅиŅ
+
+/// note | ĐĸĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ Đ´ĐĩŅаĐģи
+ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ `from starlette.responses import Response` иĐģи `from starlette.responses import JSONResponse`.
+
+**FastAPI** ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ `fastapi.responses`, ĐēĐžŅĐžŅŅĐĩ ŅвĐģŅŅŅŅŅ ŅĐĩĐŧи ĐļĐĩ ОйŅĐĩĐēŅаĐŧи, ŅŅĐž и `starlette.responses`, ĐŋŅĐžŅŅĐž Đ´ĐģŅ ŅдОйŅŅва. ĐĐ´ĐŊаĐēĐž йОĐģŅŅиĐŊŅŅвО Đ´ĐžŅŅŅĐŋĐŊŅŅ
ŅиĐŋОв ĐžŅвĐĩŅОв ĐŋĐžŅŅŅĐŋаĐĩŅ ĐŊĐĩĐŋĐžŅŅĐĩĐ´ŅŅвĐĩĐŊĐŊĐž иС **Starlette**.
+
+ĐĐģŅ ŅŅŅаĐŊОвĐēи ĐˇĐ°ĐŗĐžĐģОвĐēОв и cookies `Response` иŅĐŋĐžĐģŅСŅĐĩŅŅŅ ŅаŅŅĐž, ĐŋĐžŅŅĐžĐŧŅ **FastAPI** ŅаĐēĐļĐĩ ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ ĐĩĐŗĐž ŅĐĩŅĐĩС `fastapi.responses`.
+///
+
+ЧŅĐžĐąŅ ŅвидĐĩŅŅ Đ˛ŅĐĩ Đ´ĐžŅŅŅĐŋĐŊŅĐĩ ĐŋаŅаĐŧĐĩŅŅŅ Đ¸ ĐŊаŅŅŅОКĐēи, ОСĐŊаĐēĐžĐŧŅŅĐĩŅŅ Ņ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиĐĩĐš Starlette .
diff --git a/docs/ru/docs/advanced/response-directly.md b/docs/ru/docs/advanced/response-directly.md
new file mode 100644
index 000000000..ee83d22b1
--- /dev/null
+++ b/docs/ru/docs/advanced/response-directly.md
@@ -0,0 +1,65 @@
+# ĐОСвŅĐ°Ņ ĐžŅвĐĩŅа ĐŊаĐŋŅŅĐŧŅŅ
+
+ĐĐžĐŗĐ´Đ° Đ˛Ņ ŅОСдаŅŅĐĩ **FastAPI** *ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи*, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ вОСвŅаŅаŅŅ Đ¸Đˇ ĐŊĐĩŅ ĐģŅĐąŅĐĩ даĐŊĐŊŅĐĩ: `dict`, `list`, Pydantic-ĐŧОдĐĩĐģŅ, ĐŧОдĐĩĐģŅ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊĐŊŅŅ
и Ņ.Đ´.
+
+ĐĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ **FastAPI** авŅĐžĐŧаŅиŅĐĩŅĐēи ĐŋŅĐĩОйŅаСŅĐĩŅ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩĐŧĐžĐĩ СĐŊаŅĐĩĐŊиĐĩ в JSON Ņ ĐŋĐžĐŧĐžŅŅŅ `jsonable_encoder`, ĐēаĐē ĐžĐŋиŅаĐŊĐž в [JSON ĐēОдиŅОвŅиĐē](../tutorial/encoder.md){.internal-link target=_blank}.
+
+ĐаŅĐĩĐŧ "ĐŋОд ĐēаĐŋĐžŅĐžĐŧ" ŅŅи даĐŊĐŊŅĐĩ, ŅОвĐŧĐĩŅŅиĐŧŅĐĩ Ņ JSON (ĐŊаĐŋŅиĐŧĐĩŅ `dict`), ĐŋĐžĐŧĐĩŅаŅŅŅŅ Đ˛ `JSONResponse`, ĐēĐžŅĐžŅŅĐš иŅĐŋĐžĐģŅСŅĐĩŅŅŅ Đ´ĐģŅ ĐžŅĐŋŅавĐēи ĐžŅвĐĩŅа ĐēĐģиĐĩĐŊŅŅ.
+
+ĐĐž Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ вОСвŅаŅаŅŅ `JSONResponse` ĐŊаĐŋŅŅĐŧŅŅ Đ¸Đˇ ваŅиŅ
*ĐžĐŋĐĩŅаŅиК ĐŋŅŅи*.
+
+ĐŅĐž ĐŧĐžĐļĐĩŅ ĐąŅŅŅ ĐŋĐžĐģĐĩСĐŊĐž, ĐŊаĐŋŅиĐŧĐĩŅ, ĐĩŅĐģи ĐŊŅĐļĐŊĐž вĐĩŅĐŊŅŅŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиĐĩ ĐˇĐ°ĐŗĐžĐģОвĐēи иĐģи ĐēŅĐēи.
+
+## ĐОСвŅĐ°Ņ `Response`
+
+Đа ŅаĐŧĐžĐŧ Đ´ĐĩĐģĐĩ, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ вОСвŅаŅаŅŅ ĐģŅйОК ОйŅĐĩĐēŅ `Response` иĐģи ĐĩĐŗĐž ĐŋОдĐēĐģаŅŅ.
+
+/// tip | ĐОдŅĐēаСĐēа
+
+`JSONResponse` ŅаĐŧ ĐŋĐž ŅĐĩĐąĐĩ ŅвĐģŅĐĩŅŅŅ ĐŋОдĐēĐģаŅŅĐžĐŧ `Response`.
+
+///
+
+Đ ĐēĐžĐŗĐ´Đ° Đ˛Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅĐĩ `Response`, **FastAPI** ĐŋĐĩŅĐĩдаŅŅ ĐĩĐŗĐž ĐŊаĐŋŅŅĐŧŅŅ.
+
+ĐŅĐž ĐŊĐĩ ĐŋŅивĐĩĐ´ĐĩŅ Đē ĐŋŅĐĩОйŅаСОваĐŊĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
Ņ ĐŋĐžĐŧĐžŅŅŅ Pydantic-ĐŧОдĐĩĐģĐĩĐš, ŅОдĐĩŅĐļиĐŧĐžĐĩ ĐŊĐĩ ĐąŅĐ´ĐĩŅ ĐŋŅĐĩОйŅаСОваĐŊĐž в ĐēаĐēОК-ĐģийО ŅиĐŋ и Ņ.Đ´.
+
+ĐŅĐž даŅŅ Đ˛Đ°Đŧ йОĐģŅŅŅŅ ĐŗĐ¸ĐąĐēĐžŅŅŅ. ĐŅ ĐŧĐžĐļĐĩŅĐĩ вОСвŅаŅаŅŅ ĐģŅĐąŅĐĩ ŅиĐŋŅ Đ´Đ°ĐŊĐŊŅŅ
, ĐŋĐĩŅĐĩĐžĐŋŅĐĩĐ´ĐĩĐģŅŅŅ ĐģŅĐąŅĐĩ ОйŅŅвĐģĐĩĐŊĐ¸Ņ Đ¸Đģи ваĐģидаŅĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
и Ņ.Đ´.
+
+## ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ `jsonable_encoder` в `Response`
+
+ĐĐžŅĐēĐžĐģŅĐēŅ **FastAPI** ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ ĐžĐąŅĐĩĐēŅ `Response`, ĐēĐžŅĐžŅŅĐš Đ˛Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅĐĩ, Đ˛Ņ Đ´ĐžĐģĐļĐŊŅ ŅĐąĐĩдиŅŅŅŅ, ŅŅĐž ĐĩĐŗĐž ŅОдĐĩŅĐļиĐŧĐžĐĩ ĐŗĐžŅОвО Đē ĐžŅĐŋŅавĐēĐĩ.
+
+ĐаĐŋŅиĐŧĐĩŅ, Đ˛Ņ ĐŊĐĩ ĐŧĐžĐļĐĩŅĐĩ ĐŋĐžĐŧĐĩŅŅиŅŅ Pydantic-ĐŧОдĐĩĐģŅ Đ˛ `JSONResponse`, ĐŊĐĩ ĐŋŅĐĩОйŅаСОвав ĐĩŅ ŅĐŊаŅаĐģа в `dict` Ņ ĐŋĐžĐŧĐžŅŅŅ ĐŋŅĐĩОйŅаСОваĐŊĐ¸Ņ Đ˛ŅĐĩŅ
ŅиĐŋОв даĐŊĐŊŅŅ
(ŅаĐēиŅ
ĐēаĐē `datetime`, `UUID` и Ņ.Đ´.) в ŅОвĐŧĐĩŅŅиĐŧŅĐĩ Ņ JSON ŅиĐŋŅ.
+
+Đ ŅаĐēиŅ
ŅĐģŅŅаŅŅ
Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ `jsonable_encoder` Đ´ĐģŅ ĐŋŅĐĩОйŅаСОваĐŊĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
ĐŋĐĩŅĐĩĐ´ ĐŋĐĩŅĐĩдаŅĐĩĐš иŅ
в ĐžŅвĐĩŅ:
+
+{* ../../docs_src/response_directly/tutorial001.py hl[6:7,21:22] *}
+
+/// note | ĐĸĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ Đ´ĐĩŅаĐģи
+
+ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ `from starlette.responses import JSONResponse`.
+
+**FastAPI** ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ `starlette.responses` ŅĐĩŅĐĩС `fastapi.responses` ĐŋŅĐžŅŅĐž Đ´ĐģŅ Đ˛Đ°ŅĐĩĐŗĐž ŅдОйŅŅва, ĐēаĐē ŅаСŅайОŅŅиĐēа. ĐĐž йОĐģŅŅиĐŊŅŅвО Đ´ĐžŅŅŅĐŋĐŊŅŅ
Response-ĐēĐģаŅŅОв ĐŋĐžŅŅŅĐŋаŅŅ ĐŊаĐŋŅŅĐŧŅŅ Đ¸Đˇ Starlette.
+
+///
+
+## ĐОСвŅĐ°Ņ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēĐžĐŗĐž `Response`
+
+ĐŅиĐŧĐĩŅ Đ˛ŅŅĐĩ ĐŋĐžĐēаСŅваĐĩŅ Đ˛ŅĐĩ ĐŊĐĩОйŅ
ОдиĐŧŅĐĩ ŅаŅŅи, ĐŊĐž ĐžĐŊ ĐŋĐžĐēа ĐŊĐĩ ĐžŅĐĩĐŊŅ ĐŋĐžĐģĐĩСĐĩĐŊ, ŅаĐē ĐēаĐē Đ˛Ņ ĐŧĐžĐŗĐģи ĐąŅ ĐŋŅĐžŅŅĐž вĐĩŅĐŊŅŅŅ `item` ĐŊаĐŋŅŅĐŧŅŅ, и **FastAPI** ĐŋĐžĐŧĐĩŅŅиĐģ ĐąŅ ĐĩĐŗĐž в `JSONResponse`, ĐŋŅĐĩОйŅаСОвав в `dict` и Ņ.Đ´. ĐŅŅ ŅŅĐž ĐŋŅОиŅŅ
ĐžĐ´Đ¸Ņ ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ.
+
+ĐĸĐĩĐŋĐĩŅŅ Đ´Đ°Đ˛Đ°ĐšŅĐĩ ĐŋĐžŅĐŧĐžŅŅиĐŧ, ĐēаĐē ĐŧĐžĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ ŅŅĐž Đ´ĐģŅ Đ˛ĐžĐˇĐ˛ŅаŅа ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēĐžĐŗĐž ĐžŅвĐĩŅа.
+
+ĐĐžĐŋŅŅŅиĐŧ, Đ˛Ņ Ņ
ĐžŅиŅĐĩ вĐĩŅĐŊŅŅŅ ĐžŅвĐĩŅ Đ˛ ŅĐžŅĐŧаŅĐĩ XML .
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ĐŋĐžĐŧĐĩŅŅиŅŅ Đ˛Đ°Ņ XML-ĐēĐžĐŊŅĐĩĐŊŅ Đ˛ ŅŅŅĐžĐēŅ, ĐŋĐžĐŧĐĩŅŅиŅŅ ĐĩŅ Đ˛ `Response` и вĐĩŅĐŊŅŅŅ:
+
+{* ../../docs_src/response_directly/tutorial002.py hl[1,18] *}
+
+## ĐŅиĐŧĐĩŅаĐŊиŅ
+
+ĐĐžĐŗĐ´Đ° Đ˛Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅĐĩ ОйŅĐĩĐēŅ `Response` ĐŊаĐŋŅŅĐŧŅŅ, ĐĩĐŗĐž даĐŊĐŊŅĐĩ ĐŊĐĩ ваĐģидиŅŅŅŅŅŅ, ĐŊĐĩ ĐŋŅĐĩОйŅаСŅŅŅŅŅ (ĐŊĐĩ ŅĐĩŅиаĐģиСŅŅŅŅŅ) и ĐŊĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅиŅŅŅŅŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēи.
+
+ĐĐž Đ˛Ņ Đ˛ŅŅ ŅавĐŊĐž ĐŧĐžĐļĐĩŅĐĩ СадОĐēŅĐŧĐĩĐŊŅиŅОваŅŅ ŅŅĐž, ĐēаĐē ĐžĐŋиŅаĐŊĐž в [ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ĐžŅвĐĩŅŅ Đ˛ OpenAPI](additional-responses.md){.internal-link target=_blank}.
+
+Đ ŅĐģĐĩĐ´ŅŅŅиŅ
ŅаСдĐĩĐģаŅ
Đ˛Ņ ŅвидиŅĐĩ, ĐēаĐē иŅĐŋĐžĐģŅСОваŅŅ/ОйŅŅвĐģŅŅŅ ŅаĐēиĐĩ ĐēаŅŅĐžĐŧĐŊŅĐĩ `Response`, ĐŋŅи ŅŅĐžĐŧ ŅĐžŅ
ŅаĐŊŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēĐžĐĩ ĐŋŅĐĩОйŅаСОваĐŊиĐĩ даĐŊĐŊŅŅ
, Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ Đ¸ Ņ.Đ´.
diff --git a/docs/ru/docs/advanced/websockets.md b/docs/ru/docs/advanced/websockets.md
new file mode 100644
index 000000000..bc9dfcbff
--- /dev/null
+++ b/docs/ru/docs/advanced/websockets.md
@@ -0,0 +1,186 @@
+# ĐĐĩĐą-ŅĐžĐēĐĩŅŅ
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ Đ˛ĐĩĐą-ŅĐžĐēĐĩŅŅ Đ˛ **FastAPI**.
+
+## ĐŖŅŅаĐŊОвĐēа `WebSockets`
+
+ĐŖĐąĐĩдиŅĐĩŅŅ, ŅŅĐž [виŅŅŅаĐģŅĐŊĐ°Ņ ŅŅĐĩда](../virtual-environments.md){.internal-link target=_blank} ŅОСдаĐŊа, аĐēŅивиŅŅĐšŅĐĩ ĐĩŅ Đ¸ ŅŅŅаĐŊОвиŅĐĩ `websockets`:
+
+
+
+```console
+$ pip install websockets
+
+---> 100%
+```
+
+
+
+## ĐĐģиĐĩĐŊŅ WebSockets
+
+### РайОŅĐĩĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ
+
+ĐĄĐēĐžŅĐĩĐĩ вŅĐĩĐŗĐž, в ваŅĐĩĐš ŅĐĩаĐģŅĐŊОК ĐŋŅОдŅĐēŅОвОК ŅиŅŅĐĩĐŧĐĩ ĐĩŅŅŅ ŅŅĐžĐŊŅĐĩĐŊĐ´, ŅĐĩаĐģиСОваĐŊĐŊŅĐš ĐŋŅи ĐŋĐžĐŧĐžŅи ŅОвŅĐĩĐŧĐĩĐŊĐŊŅŅ
ŅŅĐĩĐšĐŧвОŅĐēОв React, Vue.js иĐģи Angular.
+
+Đ ĐŊавĐĩŅĐŊŅĐēа Đ´ĐģŅ Đ˛ĐˇĐ°Đ¸ĐŧОдĐĩĐšŅŅĐ˛Đ¸Ņ Ņ ĐąĐĩĐēĐĩĐŊĐ´ĐžĐŧ ŅĐĩŅĐĩС вĐĩĐą-ŅĐžĐēĐĩŅŅ Đ˛Ņ ĐąŅĐ´ĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ ŅŅĐĩĐ´ŅŅва ŅŅĐžĐŊŅĐĩĐŊда.
+
+ĐĸаĐēĐļĐĩ Ņ Đ˛Đ°Ņ ĐŧĐžĐļĐĩŅ ĐąŅŅŅ ĐŊаŅивĐŊĐžĐĩ ĐŧОйиĐģŅĐŊĐžĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ, ĐēĐžĐŧĐŧŅĐŊиŅиŅŅŅŅĐĩĐĩ ĐŊĐĩĐŋĐžŅŅĐĩĐ´ŅŅвĐĩĐŊĐŊĐž Ņ Đ˛ĐĩĐą-ŅĐžĐēĐĩŅаĐŧи ĐŊа ĐąĐĩĐēĐĩĐŊĐ´-ŅĐĩŅвĐĩŅĐĩ.
+
+ĐийО Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅĐ´ĐĩĐģаŅŅ ĐēаĐēОК-ĐģийО Đ´ŅŅĐŗĐžĐš ŅĐŋĐžŅОй вСаиĐŧОдĐĩĐšŅŅĐ˛Đ¸Ņ Ņ Đ˛ĐĩĐą-ŅĐžĐēĐĩŅаĐŧи.
+
+---
+
+ĐĐž Đ´ĐģŅ ŅŅĐžĐŗĐž ĐŋŅиĐŧĐĩŅа ĐŧŅ Đ˛ĐžŅĐŋĐžĐģŅСŅĐĩĐŧŅŅ ĐžŅĐĩĐŊŅ ĐŋŅĐžŅŅŅĐŧ HTML Đ´ĐžĐēŅĐŧĐĩĐŊŅĐžĐŧ Ņ ĐŊĐĩйОĐģŅŅиĐŧи вŅŅавĐēаĐŧи JavaScript ĐēОда.
+
+ĐĐžĐŊĐĩŅĐŊĐž ĐļĐĩ ŅŅĐž ĐŊĐĩĐžĐŋŅиĐŧаĐģŅĐŊĐž, и ĐŊа ĐŋŅаĐēŅиĐēĐĩ ŅаĐē Đ´ĐĩĐģаŅŅ ĐŊĐĩ ŅŅОиŅ.
+
+Đ ŅĐĩаĐģŅĐŊŅŅ
ĐŋŅиĐģĐžĐļĐĩĐŊиŅŅ
ŅŅĐžĐ¸Ņ Đ˛ĐžŅĐŋĐžĐģŅСОваŅŅŅŅ ĐžĐ´ĐŊиĐŧ иС вŅŅĐĩŅĐŋĐžĐŧŅĐŊŅŅŅŅ
ŅĐŋĐžŅОйОв.
+
+ĐĐģŅ ĐŋŅиĐŧĐĩŅа ĐŊаĐŧ ĐŊŅĐļĐĩĐŊ ĐŊаийОĐģĐĩĐĩ ĐŋŅĐžŅŅОК ŅĐŋĐžŅОй, ĐēĐžŅĐžŅŅĐš ĐŋОСвОĐģĐ¸Ņ ŅĐžŅŅĐĩĐ´ĐžŅĐžŅиŅŅŅŅ ĐŊа ŅĐĩŅвĐĩŅĐŊОК ŅаŅŅи вĐĩĐą-ŅĐžĐēĐĩŅОв и ĐŋĐžĐģŅŅиŅŅ ŅайОŅиК ĐēОд:
+
+{* ../../docs_src/websockets/tutorial001.py hl[2,6:38,41:43] *}
+
+## ХОСдаĐŊиĐĩ `websocket`
+
+ХОСдаКŅĐĩ `websocket` в ŅвОĐĩĐŧ **FastAPI** ĐŋŅиĐģĐžĐļĐĩĐŊии:
+
+{* ../../docs_src/websockets/tutorial001.py hl[1,46:47] *}
+
+/// note | ĐĸĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ Đ´ĐĩŅаĐģи
+
+ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ `from starlette.websockets import WebSocket`.
+
+**FastAPI** ĐŊаĐŋŅŅĐŧŅŅ ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ ŅĐžŅ ĐļĐĩ ŅаĐŧŅĐš `WebSocket` ĐŋŅĐžŅŅĐž Đ´ĐģŅ ŅдОйŅŅва. Đа ŅаĐŧĐžĐŧ Đ´ĐĩĐģĐĩ ŅŅĐž `WebSocket` иС Starlette.
+
+///
+
+## ĐĐļидаĐŊиĐĩ и ĐžŅĐŋŅавĐēа ŅООйŅĐĩĐŊиК
+
+ЧĐĩŅĐĩС ŅĐŊĐ´ĐŋОиĐŊŅ Đ˛ĐĩĐą-ŅĐžĐēĐĩŅа Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐŋĐžĐģŅŅаŅŅ Đ¸ ĐžŅĐŋŅавĐģŅŅŅ ŅООйŅĐĩĐŊиŅ.
+
+{* ../../docs_src/websockets/tutorial001.py hl[48:52] *}
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ĐŋĐžĐģŅŅаŅŅ Đ¸ ĐžŅĐŋŅавĐģŅŅŅ Đ´Đ˛ĐžĐ¸ŅĐŊŅĐĩ, ŅĐĩĐēŅŅОвŅĐĩ и JSON даĐŊĐŊŅĐĩ.
+
+## ĐŅОвĐĩŅĐēа в Đ´ĐĩĐšŅŅвии
+
+ĐŅĐģи Đ˛Đ°Ņ ŅаКĐģ ĐŊаСŅваĐĩŅŅŅ `main.py`, ŅĐž СаĐŋŅŅŅиŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐēĐžĐŧаĐŊдОК:
+
+
+
+```console
+$ fastapi dev main.py
+
+INFO : Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
+```
+
+
+
+ĐŅĐēŅОКŅĐĩ ĐąŅаŅСĐĩŅ ĐŋĐž адŅĐĩŅŅ http://127.0.0.1:8000 .
+
+ĐŅ ŅвидиŅĐĩ ŅĐģĐĩĐ´ŅŅŅŅŅ ĐŋŅĐžŅŅĐĩĐŊŅĐēŅŅ ŅŅŅаĐŊиŅŅ:
+
+
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ĐŊайиŅаŅŅ ŅООйŅĐĩĐŊĐ¸Ņ Đ˛ ĐŋĐžĐģĐĩ ввОда и ĐžŅĐŋŅавĐģŅŅŅ Đ¸Ņ
:
+
+
+
+РваŅĐĩ **FastAPI** ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ Ņ Đ˛ĐĩĐą-ŅĐžĐēĐĩŅаĐŧи ĐžŅвĐĩŅиŅ:
+
+
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ĐžŅĐŋŅавĐģŅŅŅ Đ¸ ĐŋĐžĐģŅŅаŅŅ ĐŧĐŊĐžĐļĐĩŅŅвО ŅООйŅĐĩĐŊиК:
+
+
+
+РвŅĐĩ ĐžĐŊи ĐąŅĐ´ŅŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ ĐžĐ´ĐŊĐž и ŅĐž ĐļĐĩ вĐĩĐą-ŅĐžĐēĐĩŅ ŅĐžĐĩдиĐŊĐĩĐŊиĐĩ.
+
+## ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ `Depends` и ĐŊĐĩ ŅĐžĐģŅĐēĐž
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ иĐŧĐŋĐžŅŅиŅОваŅŅ Đ¸Đˇ `fastapi` и иŅĐŋĐžĐģŅСОваŅŅ Đ˛ ŅĐŊĐ´ĐŋОиĐŊŅĐĩ вĐĩĐąŅĐžĐēĐĩŅа:
+
+* `Depends`
+* `Security`
+* `Cookie`
+* `Header`
+* `Path`
+* `Query`
+
+ĐĐŊи ŅайОŅаŅŅ ŅаĐē ĐļĐĩ, ĐēаĐē и в Đ´ŅŅĐŗĐ¸Ņ
FastAPI ŅĐŊĐ´ĐŋОиĐŊŅаŅ
/*ĐžĐŋĐĩŅаŅиŅŅ
ĐŋŅŅи*:
+
+{* ../../docs_src/websockets/tutorial002_an_py310.py hl[68:69,82] *}
+
+/// info | ĐŅиĐŧĐĩŅаĐŊиĐĩ
+
+РвĐĩĐą-ŅĐžĐēĐĩŅĐĩ вŅСŅваŅŅ `HTTPException` ĐŊĐĩ иĐŧĐĩĐĩŅ ŅĐŧŅŅĐģа. ĐĐŧĐĩŅŅĐž ŅŅĐžĐŗĐž ĐŊŅĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ `WebSocketException`.
+
+ĐаĐēŅŅваŅŅиК ŅŅаŅŅŅ ĐēОд ĐŧĐžĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ Đ¸Đˇ valid codes defined in the specification .
+
+///
+
+### ĐĐĩĐą-ŅĐžĐēĐĩŅŅ Ņ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅŅĐŧи: ĐŋŅОвĐĩŅĐēа в Đ´ĐĩĐšŅŅвии
+
+ĐŅĐģи Đ˛Đ°Ņ ŅаКĐģ ĐŊаСŅваĐĩŅŅŅ `main.py`, ŅĐž СаĐŋŅŅŅиŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐēĐžĐŧаĐŊдОК:
+
+
+
+```console
+$ fastapi dev main.py
+
+INFO : Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
+```
+
+
+
+ĐŅĐēŅОКŅĐĩ ĐąŅаŅСĐĩŅ ĐŋĐž адŅĐĩŅŅ http://127.0.0.1:8000 .
+
+ĐĸаĐŧ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ СадаŅŅ:
+
+* "Item ID", иŅĐŋĐžĐģŅСŅĐĩĐŧŅĐš в ĐŋŅŅи.
+* "Token", иŅĐŋĐžĐģŅСŅĐĩĐŧŅĐš ĐēаĐē query-ĐŋаŅаĐŧĐĩŅŅ.
+
+/// tip | ĐОдŅĐēаСĐēа
+
+ĐĐąŅаŅиŅĐĩ вĐŊиĐŧаĐŊиĐĩ, ŅŅĐž query-ĐŋаŅаĐŧĐĩŅŅ `token` ĐąŅĐ´ĐĩŅ ĐžĐąŅайОŅаĐŊ в СавиŅиĐŧĐžŅŅи.
+
+///
+
+ĐĸĐĩĐŋĐĩŅŅ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐŋОдĐēĐģŅŅиŅŅŅŅ Đē вĐĩĐą-ŅĐžĐēĐĩŅŅ Đ¸ ĐŊаŅиĐŊаŅŅ ĐžŅĐŋŅавĐēŅ Đ¸ ĐŋĐžĐģŅŅĐĩĐŊиĐĩ ŅООйŅĐĩĐŊиК:
+
+
+
+## ĐĐąŅайОŅĐēа ĐžŅĐēĐģŅŅĐĩĐŊиК и ŅайОŅа Ņ ĐŊĐĩŅĐēĐžĐģŅĐēиĐŧи ĐēĐģиĐĩĐŊŅаĐŧи
+
+ĐŅĐģи вĐĩĐą-ŅĐžĐēĐĩŅ ŅĐžĐĩдиĐŊĐĩĐŊиĐĩ СаĐēŅŅŅĐž, ŅĐž `await websocket.receive_text()` вŅСОвĐĩŅ Đ¸ŅĐēĐģŅŅĐĩĐŊиĐĩ `WebSocketDisconnect`, ĐēĐžŅĐžŅĐžĐĩ ĐŧĐžĐļĐŊĐž ĐŋОКĐŧаŅŅ Đ¸ ОйŅайОŅаŅŅ ĐēаĐē в ŅŅĐžĐŧ ĐŋŅиĐŧĐĩŅĐĩ:
+
+{* ../../docs_src/websockets/tutorial003_py39.py hl[79:81] *}
+
+ЧŅĐžĐąŅ Đ˛ĐžŅĐŋŅОиСвĐĩŅŅи ĐŋŅиĐŧĐĩŅ:
+
+* ĐŅĐēŅОКŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ в ĐŊĐĩŅĐēĐžĐģŅĐēиŅ
вĐēĐģадĐēаŅ
ĐąŅаŅСĐĩŅа.
+* ĐŅĐŋŅавŅŅĐĩ иС ĐŊиŅ
ŅООйŅĐĩĐŊиŅ.
+* ĐаŅĐĩĐŧ СаĐēŅОКŅĐĩ ОдĐŊŅ Đ¸Đˇ вĐēĐģадОĐē.
+
+ĐŅĐž вŅСОвĐĩŅ Đ¸ŅĐēĐģŅŅĐĩĐŊиĐĩ `WebSocketDisconnect`, и вŅĐĩ ĐžŅŅаĐģŅĐŊŅĐĩ ĐēĐģиĐĩĐŊŅŅ ĐŋĐžĐģŅŅĐ°Ņ ŅĐģĐĩĐ´ŅŅŅĐĩĐĩ ŅООйŅĐĩĐŊиĐĩ:
+
+```
+Client #1596980209979 left the chat
+```
+
+/// tip | ĐŅиĐŧĐĩŅаĐŊиĐĩ
+
+ĐŅиĐģĐžĐļĐĩĐŊиĐĩ вŅŅĐĩ - ŅŅĐž вŅĐĩĐŗĐž ĐģиŅŅ ĐŋŅĐžŅŅОК ĐŧиĐŊиĐŧаĐģŅĐŊŅĐš ĐŋŅиĐŧĐĩŅ, Đ´ĐĩĐŧĐžĐŊŅŅŅиŅŅŅŅиК ОйŅайОŅĐēŅ Đ¸ ĐŋĐĩŅĐĩдаŅŅ ŅООйŅĐĩĐŊиК ĐŊĐĩŅĐēĐžĐģŅĐēиĐŧ вĐĩĐą-ŅĐžĐēĐĩŅ ŅĐžĐĩдиĐŊĐĩĐŊиŅĐŧ.
+
+ĐĐž иĐŧĐĩĐšŅĐĩ в видŅ, ŅŅĐž ŅŅĐž ĐąŅĐ´ĐĩŅ ŅайОŅаŅŅ ŅĐžĐģŅĐēĐž в ОдĐŊĐžĐŧ ĐŋŅĐžŅĐĩŅŅĐĩ и ŅĐžĐģŅĐēĐž ĐŋĐžĐēа ĐžĐŊ аĐēŅивĐĩĐŊ, ŅаĐē ĐēаĐē вŅŅ ĐžĐąŅайаŅŅваĐĩŅŅŅ Đ˛ ĐŋŅĐžŅŅĐžĐŧ ŅĐŋиŅĐēĐĩ в ĐžĐŋĐĩŅаŅивĐŊОК ĐŋаĐŧŅŅи.
+
+ĐŅĐģи ĐŊŅĐļĐŊĐž ŅŅĐž-ŅĐž ĐģĐĩĐŗĐēĐž иĐŊŅĐĩĐŗŅиŅŅĐĩĐŧĐžĐĩ Ņ FastAPI, ĐŊĐž йОĐģĐĩĐĩ ĐŊадĐĩĐļĐŊĐžĐĩ и Ņ ĐŋОддĐĩŅĐļĐēОК Redis, PostgreSQL иĐģи Đ´ŅŅĐŗĐžĐŗĐž, ŅĐž ĐŧĐžĐļĐŊĐž вОŅĐŋĐžĐģŅСОваŅŅŅŅ encode/broadcaster .
+
+///
+
+## ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊĐ°Ņ Đ¸ĐŊŅĐžŅĐŧаŅиŅ
+
+ĐĐģŅ ĐąĐžĐģĐĩĐĩ ĐŗĐģŅйОĐēĐžĐŗĐž иСŅŅĐĩĐŊĐ¸Ņ ŅĐĩĐŧŅ Đ˛ĐžŅĐŋĐžĐģŅСŅĐšŅĐĩŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиĐĩĐš Starlette:
+
+* The `WebSocket` class .
+* Class-based WebSocket handling .
diff --git a/docs/ru/docs/deployment/concepts.md b/docs/ru/docs/deployment/concepts.md
index 7cdc29526..acfa1f4fe 100644
--- a/docs/ru/docs/deployment/concepts.md
+++ b/docs/ru/docs/deployment/concepts.md
@@ -216,7 +216,7 @@
ĐаĐļĐ´ŅĐš иС ŅŅиŅ
ĐŋŅĐžŅĐĩŅŅОв ĐąŅĐ´ĐĩŅ ĐˇĐ°ĐŋŅŅĐēаŅŅ Đ˛Đ°ŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ Đ´ĐģŅ ĐžĐąŅайОŅĐēи ĐŋĐžĐģŅŅĐĩĐŊĐŊĐžĐŗĐž **СаĐŋŅĐžŅа** и вОСвŅаŅĐĩĐŊĐ¸Ņ Đ˛ŅŅиŅĐģĐĩĐŊĐŊĐžĐŗĐž **ĐžŅвĐĩŅа** и ĐžĐŊи ĐąŅĐ´ŅŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ ĐžĐŋĐĩŅаŅивĐŊŅŅ ĐŋаĐŧŅŅŅ.
-
+
ĐĐĩСŅŅĐģОвĐŊĐž, ĐŊа ŅŅĐžĐŧ ĐļĐĩ ŅĐĩŅвĐĩŅĐĩ ĐąŅĐ´ŅŅ ŅайОŅаŅŅ Đ¸ **Đ´ŅŅĐŗĐ¸Đĩ ĐŋŅĐžŅĐĩŅŅŅ**, ĐēĐžŅĐžŅŅĐĩ ĐŊĐĩ ĐžŅĐŊĐžŅŅŅŅŅ Đē ваŅĐĩĐŧŅ ĐŋŅиĐģĐžĐļĐĩĐŊиŅ.
diff --git a/docs/ru/docs/deployment/https.md b/docs/ru/docs/deployment/https.md
index 85c4cce60..d8877a9a1 100644
--- a/docs/ru/docs/deployment/https.md
+++ b/docs/ru/docs/deployment/https.md
@@ -92,7 +92,7 @@
DNS-ŅĐĩŅвĐĩŅа ĐŋŅиŅŅĐģаŅŅ ĐąŅаŅСĐĩŅŅ ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐŊŅĐš **IP-адŅĐĩŅ**, ŅĐžŅ ŅаĐŧŅĐš ĐŋŅĐąĐģиŅĐŊŅĐš IP-адŅĐĩŅ Đ˛Đ°ŅĐĩĐŗĐž ŅĐĩŅвĐĩŅа, ĐēĐžŅĐžŅŅĐš Đ˛Ņ ŅĐēаСаĐģи в ŅĐĩŅŅŅŅĐŊОК "СаĐŋиŅи Đ" ĐŋŅи ĐŊаŅŅŅОКĐēĐĩ.
-
+
### Đ ŅĐēĐžĐŋĐžĐļаŅиĐĩ TLS
@@ -100,7 +100,7 @@ DNS-ŅĐĩŅвĐĩŅа ĐŋŅиŅŅĐģаŅŅ ĐąŅаŅСĐĩŅŅ ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐŊŅĐš
ĐĐĩŅвŅĐŧ ŅĐ°ĐŗĐžĐŧ ĐąŅĐ´ĐĩŅ ŅŅŅаĐŊОвĐģĐĩĐŊиĐĩ ŅĐžĐĩдиĐŊĐĩĐŊĐ¸Ņ ĐŧĐĩĐļĐ´Ņ ĐēĐģиĐĩĐŊŅĐžĐŧ (ĐąŅаŅСĐĩŅĐžĐŧ) и ŅĐĩŅвĐĩŅĐžĐŧ и вŅĐąĐžŅ ĐēŅиĐŋŅĐžĐŗŅаŅиŅĐĩŅĐēĐžĐŗĐž ĐēĐģŅŅа (Đ´ĐģŅ ŅиŅŅОваĐŊиŅ).
-
+
ĐŅа ŅаŅŅŅ ĐēĐģиĐĩĐŊŅ-ŅĐĩŅвĐĩŅĐŊĐžĐŗĐž вСаиĐŧОдĐĩĐšŅŅĐ˛Đ¸Ņ ŅŅŅаĐŊавĐģиваĐĩŅ TLS-ŅĐžĐĩдиĐŊĐĩĐŊиĐĩ и ĐŊаСŅваĐĩŅŅŅ **TLS-ŅŅĐēĐžĐŋĐžĐļаŅиĐĩĐŧ**.
@@ -118,7 +118,7 @@ DNS-ŅĐĩŅвĐĩŅа ĐŋŅиŅŅĐģаŅŅ ĐąŅаŅСĐĩŅŅ ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐŊŅĐš
ĐĸĐž ĐĩŅŅŅ ĐąŅĐ´ĐĩŅ Đ˛ŅĐąŅаĐŊ ŅĐĩŅŅиŅиĐēĐ°Ņ Đ´ĐģŅ Đ´ĐžĐŧĐĩĐŊа `someapp.example.com`.
-
+
ĐĐģиĐĩĐŊŅ ŅĐļĐĩ **дОвĐĩŅŅĐĩŅ** ŅĐžĐŧŅ, ĐēŅĐž вŅдаĐģ ŅŅĐžŅ TLS-ŅĐĩŅŅиŅиĐēĐ°Ņ (в ĐŊаŅĐĩĐŧ ŅĐģŅŅаĐĩ - Let's Encrypt, ĐŊĐž ĐŧŅ ĐĩŅŅ ĐžĐąŅŅдиĐŧ ŅŅĐž), ĐŋĐžŅĐžĐŧŅ ĐŧĐžĐļĐĩŅ **ĐŋŅОвĐĩŅиŅŅ**, Đ´ĐĩĐšŅŅвиŅĐĩĐģĐĩĐŊ Đģи ĐŋĐžĐģŅŅĐĩĐŊĐŊŅĐš ĐžŅ ŅĐĩŅвĐĩŅа ŅĐĩŅŅиŅиĐēаŅ.
@@ -140,19 +140,19 @@ DNS-ŅĐĩŅвĐĩŅа ĐŋŅиŅŅĐģаŅŅ ĐąŅаŅСĐĩŅŅ ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐŊŅĐš
ĐĸаĐē ĐēĐģиĐĩĐŊŅ ĐžŅĐŋŅавĐģŅĐĩŅ **HTTPS-СаĐŋŅĐžŅ**. ĐĸĐž ĐĩŅŅŅ ĐžĐąŅŅĐŊŅĐš HTTP-СаĐŋŅĐžŅ, ĐŊĐž ŅĐĩŅĐĩС СаŅиŅŅОваĐŊĐŊĐžĐĩ TLS-ŅОдиĐŊĐĩĐŊиĐĩ.
-
+
### РаŅŅиŅŅОвĐēа СаĐŋŅĐžŅа
ĐŅĐžĐēŅи-ŅĐĩŅвĐĩŅ, иŅĐŋĐžĐģŅСŅŅ ŅĐžĐŗĐģаŅОваĐŊĐŊŅĐš Ņ ĐēĐģиĐĩĐŊŅĐžĐŧ ĐēĐģŅŅ, ŅаŅŅиŅŅŅĐĩŅ ĐŋĐžĐģŅŅĐĩĐŊĐŊŅĐš **СаŅиŅŅОваĐŊĐŊŅĐš СаĐŋŅĐžŅ** и ĐŋĐĩŅĐĩдаŅŅ **ОйŅŅĐŊŅĐš (ĐŊĐĩСаŅиŅŅОваĐŊĐŊŅĐš) HTTP-СаĐŋŅĐžŅ** ĐŋŅĐžŅĐĩŅŅŅ, СаĐŋŅŅĐēаŅŅĐĩĐŧŅ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ (ĐŊаĐŋŅиĐŧĐĩŅ, ĐŋŅĐžŅĐĩŅŅŅ Uvicorn СаĐŋŅŅĐēаŅŅĐĩĐŧŅ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ FastAPI).
-
+
### HTTP-ĐžŅвĐĩŅ
ĐŅиĐģĐžĐļĐĩĐŊиĐĩ ОйŅайОŅаĐĩŅ ĐˇĐ°ĐŋŅĐžŅ Đ¸ вĐĩŅĐŊŅŅ **ОйŅŅĐŊŅĐš (ĐŊĐĩСаŅиŅŅОваĐŊĐŊŅĐš) HTTP-ĐžŅвĐĩŅ** ĐŋŅĐžĐēŅи-ŅĐĩŅвĐĩŅŅ.
-
+
### HTTPS-ĐžŅвĐĩŅ
@@ -160,7 +160,7 @@ DNS-ŅĐĩŅвĐĩŅа ĐŋŅиŅŅĐģаŅŅ ĐąŅаŅСĐĩŅŅ ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐŊŅĐš
ĐаĐēĐžĐŊĐĩŅ, ĐąŅаŅСĐĩŅ ĐŋŅОвĐĩŅĐ¸Ņ ĐžŅвĐĩŅ, в ŅĐžĐŧ ŅиŅĐģĐĩ, ŅŅĐž ŅĐžŅ ĐˇĐ°ŅиŅŅОваĐŊ Ņ ĐŊŅĐļĐŊŅĐŧ ĐēĐģŅŅĐžĐŧ, **ŅаŅŅиŅŅŅĐĩŅ ĐĩĐŗĐž** и ОйŅайОŅаĐĩŅ.
-
+
ĐĐģиĐĩĐŊŅ (ĐąŅаŅСĐĩŅ) СĐŊаĐĩŅ, ŅŅĐž ĐžŅвĐĩŅ ĐŋŅиŅŅĐģ ĐžŅ ĐŋŅавиĐģŅĐŊĐžĐŗĐž ŅĐĩŅвĐĩŅа, ŅаĐē ĐēаĐē иŅĐŋĐžĐģŅСŅĐĩŅ ĐŧĐĩŅĐžĐ´Ņ ŅиŅŅОваĐŊиŅ, ŅĐžĐŗĐģаŅОваĐŊĐŊŅĐĩ иĐŧи ŅаĐŊĐŊĐĩĐĩ ŅĐĩŅĐĩС **HTTPS-ŅĐĩŅŅиŅиĐēаŅ**.
@@ -171,7 +171,7 @@ DNS-ŅĐĩŅвĐĩŅа ĐŋŅиŅŅĐģаŅŅ ĐąŅаŅСĐĩŅŅ ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐŊŅĐš
ĐаĐŋĐžĐŧĐŊŅ, ŅŅĐž ŅĐžĐģŅĐēĐž ОдиĐŊ ĐŋŅĐžŅĐĩŅŅ (ĐŊаĐŋŅиĐŧĐĩŅ, ĐŋŅĐžĐēŅи-ŅĐĩŅвĐĩŅ) ĐŧĐžĐļĐĩŅ ĐŋŅĐžŅĐģŅŅиваŅŅ ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐŊŅĐš ĐŋĐžŅŅ ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐŊĐžĐŗĐž IP-адŅĐĩŅа.
ĐĐž Đ´ŅŅĐŗĐ¸Đĩ ĐŋŅĐžŅĐĩŅŅŅ Đ¸ ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ ŅĐžĐļĐĩ ĐŧĐžĐŗŅŅ ŅайОŅаŅŅ ĐŊа ŅŅĐžĐŧ ĐļĐĩ ŅĐĩŅвĐĩŅĐĩ (ŅĐĩŅвĐĩŅаŅ
), ĐĩŅĐģи ĐžĐŊи ĐŊĐĩ ĐŋŅŅаŅŅŅŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ ŅĐļĐĩ СаĐŊŅŅŅŅ **ĐēĐžĐŧйиĐŊаŅĐ¸Ņ IP-адŅĐĩŅа и ĐŋĐžŅŅа** (ŅĐžĐēĐĩŅ).
-
+
ĐĸаĐēиĐŧ ОйŅаСОĐŧ, ŅĐĩŅвĐĩŅ ĐˇĐ°Đ˛ĐĩŅŅĐĩĐŊĐ¸Ņ TLS ĐŧĐžĐļĐĩŅ ĐžĐąŅайаŅŅваŅŅ HTTPS-СаĐŋŅĐžŅŅ Đ¸ иŅĐŋĐžĐģŅСОваŅŅ ŅĐĩŅŅиŅиĐēаŅŅ Đ´ĐģŅ **ĐŧĐŊĐžĐļĐĩŅŅва Đ´ĐžĐŧĐĩĐŊОв** иĐģи ĐŋŅиĐģĐžĐļĐĩĐŊиК и ĐŋĐĩŅĐĩдаваŅŅ ĐˇĐ°ĐŋŅĐžŅŅ ĐŋŅавиĐģŅĐŊŅĐŧ адŅĐĩŅаŅаĐŧ (Đ´ŅŅĐŗĐ¸Đŧ ĐŋŅиĐģĐžĐļĐĩĐŊиŅĐŧ).
@@ -181,7 +181,7 @@ DNS-ŅĐĩŅвĐĩŅа ĐŋŅиŅŅĐģаŅŅ ĐąŅаŅСĐĩŅŅ ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐŊŅĐš
ĐĐžĐŗĐ´Đ° ŅŅĐž ĐŋŅОиСОКдŅŅ, ĐŧĐžĐļĐŊĐž СаĐŋŅŅŅиŅŅ Đ´ŅŅĐŗŅŅ ĐŋŅĐžĐŗŅаĐŧĐŧŅ, ĐēĐžŅĐžŅĐ°Ņ ĐŋОдĐēĐģŅŅиŅŅŅ Đē Let's Encrypt и ОйĐŊĐžĐ˛Đ¸Ņ ŅĐĩŅŅиŅиĐēаŅ(Ņ). ĐĄŅŅĐĩŅŅвŅŅŅ ĐŋŅĐžĐēŅи-ŅĐĩŅвĐĩŅŅ, ĐēĐžŅĐžŅŅĐĩ ĐŧĐžĐŗŅŅ ŅĐ´ĐĩĐģаŅŅ ŅŅĐž Đ´ĐĩĐšŅŅвиĐĩ ŅаĐŧĐžŅŅĐžŅŅĐĩĐģŅĐŊĐž.
-
+
**TLS-ŅĐĩŅŅиŅиĐēаŅŅ** ĐŊĐĩ ĐŋŅивŅСаĐŊŅ Đē IP-адŅĐĩŅŅ, ĐŊĐž **ŅвŅСаĐŊŅ Ņ Đ¸ĐŧĐĩĐŊĐĩĐŧ Đ´ĐžĐŧĐĩĐŊа**.
diff --git a/docs/ru/docs/index.md b/docs/ru/docs/index.md
index 5ebe1494b..a9546cf1e 100644
--- a/docs/ru/docs/index.md
+++ b/docs/ru/docs/index.md
@@ -12,10 +12,10 @@
-
+
-
-
+
+
diff --git a/docs/ru/docs/tutorial/bigger-applications.md b/docs/ru/docs/tutorial/bigger-applications.md
index 7c3dc288f..8b9080d39 100644
--- a/docs/ru/docs/tutorial/bigger-applications.md
+++ b/docs/ru/docs/tutorial/bigger-applications.md
@@ -52,7 +52,7 @@ from app.routers import items
* ĐОдĐēаŅаĐģĐžĐŗ `app/internal/`, ŅОдĐĩŅĐļаŅиК ŅаКĐģ `__init__.py`, ŅвĐģŅĐĩŅŅŅ ĐĩŅŅ ĐžĐ´ĐŊиĐŧ ŅŅĐą-ĐŋаĐēĐĩŅĐžĐŧ: `app.internal`.
* Đ ŅаКĐģ `app/internal/admin.py` ŅвĐģŅĐĩŅŅŅ ĐĩŅŅ ĐžĐ´ĐŊиĐŧ ŅŅĐą-ĐŧОдŅĐģĐĩĐŧ: `app.internal.admin`.
-
+
Đĸа ĐļĐĩ ŅаĐŧĐ°Ņ ŅаКĐģĐžĐ˛Đ°Ņ ŅŅŅŅĐēŅŅŅа ĐŋŅиĐģĐžĐļĐĩĐŊиŅ, ĐŊĐž Ņ ĐēĐžĐŧĐŧĐĩĐŊŅаŅиŅĐŧи:
@@ -269,7 +269,7 @@ from .dependencies import get_token_header
ĐŅĐŋĐžĐŧĐŊиŅĐĩ, ĐēаĐē вŅĐŗĐģŅĐ´Đ¸Ņ ŅаКĐģĐžĐ˛Đ°Ņ ŅŅŅŅĐēŅŅŅа ĐŊаŅĐĩĐŗĐž ĐŋŅиĐģĐžĐļĐĩĐŊиŅ:
-
+
---
diff --git a/docs/ru/docs/tutorial/cookie-param-models.md b/docs/ru/docs/tutorial/cookie-param-models.md
new file mode 100644
index 000000000..3a57443bb
--- /dev/null
+++ b/docs/ru/docs/tutorial/cookie-param-models.md
@@ -0,0 +1,76 @@
+# ĐОдĐĩĐģи ĐŋаŅаĐŧĐĩŅŅОв cookie
+
+ĐŅĐģи Ņ Đ˛Đ°Ņ ĐĩŅŅŅ ĐŗŅŅĐŋĐŋа **cookies**, ĐēĐžŅĐžŅŅĐĩ ŅвŅСаĐŊŅ ĐŧĐĩĐļĐ´Ņ ŅОйОК, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅОСдаŅŅ **Pydantic-ĐŧОдĐĩĐģŅ** Đ´ĐģŅ Đ¸Ņ
ОйŅŅвĐģĐĩĐŊиŅ. đĒ
+
+ĐŅĐž ĐŋОСвОĐģĐ¸Ņ Đ˛Đ°Đŧ **ĐŋĐĩŅĐĩиŅĐŋĐžĐģŅСОваŅŅ ĐŧОдĐĩĐģŅ** в **ŅаСĐŊŅŅ
ĐŧĐĩŅŅаŅ
**, а ŅаĐēĐļĐĩ ОйŅŅвиŅŅ ĐŋŅОвĐĩŅĐēи и ĐŧĐĩŅадаĐŊĐŊŅĐĩ ŅŅĐ°ĐˇŅ Đ´ĐģŅ Đ˛ŅĐĩŅ
ĐŋаŅаĐŧĐĩŅŅОв. đ
+
+/// note | ĐаĐŧĐĩŅĐēа
+
+ĐŅĐžŅ ŅŅĐŊĐēŅиОĐŊаĐģ Đ´ĐžŅŅŅĐŋĐĩĐŊ Ņ Đ˛ĐĩŅŅии `0.115.0`. đ¤
+
+///
+
+/// tip | ХОвĐĩŅ
+
+ĐĸаĐēОК ĐļĐĩ ĐŋОдŅ
Од ĐŋŅиĐŧĐĩĐŊŅĐĩŅŅŅ Đ´ĐģŅ `Query`, `Cookie`, и `Header`. đ
+
+///
+
+## Pydantic-ĐŧОдĐĩĐģŅ Đ´ĐģŅ cookies
+
+ĐĐąŅŅвиŅĐĩ ĐŋаŅаĐŧĐĩŅŅŅ **cookie**, ĐēĐžŅĐžŅŅĐĩ ваĐŧ ĐŊŅĐļĐŊŅ, в **Pydantic-ĐŧОдĐĩĐģи**, а СаŅĐĩĐŧ ОйŅŅвиŅĐĩ ĐŋаŅаĐŧĐĩŅŅ ĐēаĐē `Cookie`:
+
+{* ../../docs_src/cookie_param_models/tutorial001_an_py310.py hl[9:12,16] *}
+
+**FastAPI** **иСвĐģĐĩŅŅŅ** даĐŊĐŊŅĐĩ Đ´ĐģŅ **ĐēаĐļĐ´ĐžĐŗĐž ĐŋĐžĐģŅ** иС **cookies**, ĐŋĐžĐģŅŅĐĩĐŊĐŊŅŅ
в СаĐŋŅĐžŅĐĩ, и вŅдаŅŅ Đ˛Đ°Đŧ ОйŅŅвĐģĐĩĐŊĐŊŅŅ Pydantic-ĐŧОдĐĩĐģŅ.
+
+## ĐŅОвĐĩŅĐēа ŅĐŗĐĩĐŊĐĩŅиŅОваĐŊĐŊОК Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ĐŋĐžŅĐŧĐžŅŅĐĩŅŅ ĐžĐąŅŅвĐģĐĩĐŊĐŊŅĐĩ cookies в ĐŗŅаŅиŅĐĩŅĐēĐžĐŧ иĐŊŅĐĩŅŅĐĩĐšŅĐĩ ĐĐžĐēŅĐŧĐĩĐŊŅаŅии ĐŋĐž ĐŋŅŅи `/docs`:
+
+
+
+
+
+/// info | ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊĐ°Ņ Đ¸ĐŊŅĐžŅĐŧаŅиŅ
+
+ĐĐŧĐĩĐšŅĐĩ в видŅ, ŅŅĐž, ĐŋĐžŅĐēĐžĐģŅĐēŅ **ĐąŅаŅСĐĩŅŅ ĐžĐąŅайаŅŅваŅŅ cookies** ĐžŅОйŅĐŧ ОйŅаСОĐŧ и ĐŋОд ĐēаĐŋĐžŅĐžĐŧ, ĐžĐŊи **ĐŊĐĩ** ĐŋОСвОĐģŅŅ **JavaScript** ĐģĐĩĐŗĐēĐž ĐŋĐžĐģŅŅиŅŅ Đ´ĐžŅŅŅĐŋ Đē ĐŊиĐŧ.
+
+ĐŅĐģи Đ˛Ņ ĐŋĐĩŅĐĩКдŅŅĐĩ Đē **ĐŗŅаŅиŅĐĩŅĐēĐžĐŧŅ Đ¸ĐŊŅĐĩŅŅĐĩĐšŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии API** ĐŋĐž ĐŋŅŅи `/docs`, ŅĐž ŅĐŧĐžĐļĐĩŅĐĩ ŅвидĐĩŅŅ **Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиŅ** ĐŋĐž cookies Đ´ĐģŅ Đ˛Đ°ŅиŅ
*ĐžĐŋĐĩŅаŅиК ĐŋŅŅĐĩĐš*.
+
+ĐĐž даĐļĐĩ ĐĩŅĐģи Đ˛Ņ **СаĐŋĐžĐģĐŊиŅĐĩ даĐŊĐŊŅĐĩ** и ĐŊаĐļĐŧŅŅĐĩ "Execute", ĐŋĐžŅĐēĐžĐģŅĐēŅ ĐŗŅаŅиŅĐĩŅĐēиК иĐŊŅĐĩŅŅĐĩĐšŅ ĐĐžĐēŅĐŧĐĩĐŊŅаŅии ŅайОŅаĐĩŅ Ņ **JavaScript**, cookies ĐŊĐĩ ĐąŅĐ´ŅŅ ĐžŅĐŋŅавĐģĐĩĐŊŅ, и Đ˛Ņ ŅвидиŅĐĩ ŅООйŅĐĩĐŊиĐĩ Ой **ĐžŅийĐēĐĩ** ĐēаĐē ĐąŅĐ´ŅĐž ĐŊĐĩ ŅĐēаСŅваĐģи ĐŊиĐēаĐēиŅ
СĐŊаŅĐĩĐŊиК.
+
+///
+
+## ĐаĐŋŅĐĩŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅŅ
cookies
+
+Đ ĐŊĐĩĐēĐžŅĐžŅŅŅ
ŅĐģŅŅаŅŅ
(ĐŊĐĩ ĐžŅОйО ŅаŅŅĐž вŅŅŅĐĩŅаŅŅиŅ
ŅŅ) ваĐŧ ĐŧĐžĐļĐĩŅ ĐŋĐžĐŊадОйиŅŅŅŅ **ĐžĐŗŅаĐŊиŅиŅŅ** cookies, ĐēĐžŅĐžŅŅĐĩ Đ˛Ņ Ņ
ĐžŅиŅĐĩ ĐŋĐžĐģŅŅаŅŅ.
+
+ĐĸĐĩĐŋĐĩŅŅ Đ˛Đ°Ņ API ŅаĐŧ ŅĐĩŅаĐĩŅ, ĐŋŅиĐŊиĐŧаŅŅ Đģи cookies . đ¤ĒđĒ
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ŅĐēĐžĐŊŅĐ¸ĐŗŅŅиŅОваŅŅ Pydantic-ĐŧОдĐĩĐģŅ ŅаĐē, ŅŅĐžĐąŅ ĐˇĐ°ĐŋŅĐĩŅиŅŅ (`forbid`) ĐģŅĐąŅĐĩ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ (`extra`) ĐŋĐžĐģŅ:
+
+{* ../../docs_src/cookie_param_models/tutorial002_an_py39.py hl[10] *}
+
+ĐŅĐģи ĐēĐģиĐĩĐŊŅ ĐŋĐžĐŋŅОйŅĐĩŅ ĐžŅĐŋŅавиŅŅ **Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ cookies**, ŅĐž в ĐžŅвĐĩŅ ĐžĐŊ ĐŋĐžĐģŅŅĐ¸Ņ **ĐžŅийĐēŅ**.
+
+ĐĐĩĐ´ĐŊŅĐĩ йаĐŊĐŊĐĩŅŅ cookies, ĐžĐŊи вŅĐĩĐŧи ŅиĐģаĐŧи ĐŋŅŅаŅŅŅŅ ĐŋĐžĐģŅŅиŅŅ Đ˛Đ°ŅĐĩ ŅĐžĐŗĐģаŅиĐĩ â и вŅŅ Ņади ŅĐžĐŗĐž, ŅŅĐžĐąŅ API ĐĩĐŗĐž ĐžŅĐēĐģĐžĐŊиĐģ . đĒ
+
+ĐаĐŋŅиĐŧĐĩŅ, ĐĩŅĐģи ĐēĐģиĐĩĐŊŅ ĐŋĐžĐŋŅŅаĐĩŅŅŅ ĐžŅĐŋŅавиŅŅ cookie `santa_tracker` ŅĐž СĐŊаŅĐĩĐŊиĐĩĐŧ `good-list-please`, ŅĐž в ĐžŅвĐĩŅ ĐžĐŊ ĐŋĐžĐģŅŅĐ¸Ņ **ĐžŅийĐēŅ**, ŅООйŅаŅŅŅŅ ĐĩĐŧŅ, ŅŅĐž cookie `santa_tracker` ĐŊĐĩ ŅаСŅĐĩŅŅĐŊ :
+
+```json
+{
+ "detail": [
+ {
+ "type": "extra_forbidden",
+ "loc": ["cookie", "santa_tracker"],
+ "msg": "Extra inputs are not permitted",
+ "input": "good-list-please"
+ }
+ ]
+}
+```
+
+## ĐаĐēĐģŅŅĐĩĐŊиĐĩ
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ **Pydantic-ĐŧОдĐĩĐģи** Đ´ĐģŅ ĐžĐąŅŅвĐģĐĩĐŊĐ¸Ņ **cookies** в **FastAPI**. đ
diff --git a/docs/ru/docs/tutorial/header-param-models.md b/docs/ru/docs/tutorial/header-param-models.md
new file mode 100644
index 000000000..4f54e3e15
--- /dev/null
+++ b/docs/ru/docs/tutorial/header-param-models.md
@@ -0,0 +1,72 @@
+# ĐОдĐĩĐģи Header-ĐŋаŅаĐŧĐĩŅŅОв
+
+ĐŅĐģи Ņ Đ˛Đ°Ņ ĐĩŅŅŅ ĐŗŅŅĐŋĐŋа ŅвŅСаĐŊĐŊŅŅ
**header-ĐŋаŅаĐŧĐĩŅŅОв**, ŅĐž Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ОйŅĐĩдиĐŊиŅŅ Đ¸Ņ
в ОдĐŊŅ **Pydantic-ĐŧОдĐĩĐģŅ**.
+
+ĐŅĐž ĐŋОСвОĐģĐ¸Ņ Đ˛Đ°Đŧ **ĐŋĐĩŅĐĩиŅĐŋĐžĐģŅСОваŅŅ ĐŧОдĐĩĐģŅ** в **ŅаСĐŊŅŅ
ĐŧĐĩŅŅаŅ
**, а ŅаĐēĐļĐĩ СадаŅŅ Đ˛Đ°ĐģидаŅĐ¸Ņ Đ¸ ĐŧĐĩŅадаĐŊĐŊŅĐĩ ŅŅĐ°ĐˇŅ Đ´ĐģŅ Đ˛ŅĐĩŅ
ĐŋаŅаĐŧĐĩŅŅОв. đ
+
+/// note | ĐаĐŧĐĩŅĐēа
+
+ĐŅĐžŅ ŅŅĐŊĐēŅиОĐŊаĐģ Đ´ĐžŅŅŅĐŋĐĩĐŊ в FastAPI ĐŊаŅиĐŊĐ°Ņ Ņ Đ˛ĐĩŅŅии `0.115.0`. đ¤
+
+///
+
+## Header-ĐŋаŅаĐŧĐĩŅŅŅ Đ˛ видĐĩ Pydantic-ĐŧОдĐĩĐģи
+
+ĐĐąŅŅвиŅĐĩ ĐŊŅĐļĐŊŅĐĩ **header-ĐŋаŅаĐŧĐĩŅŅŅ** в **Pydantic-ĐŧОдĐĩĐģи** и СаŅĐĩĐŧ аĐŊĐŊĐžŅиŅŅĐšŅĐĩ ĐŋаŅаĐŧĐĩŅŅ ĐēаĐē `Header`:
+
+{* ../../docs_src/header_param_models/tutorial001_an_py310.py hl[9:14,18] *}
+
+**FastAPI** **иСвĐģĐĩŅŅŅ** даĐŊĐŊŅĐĩ Đ´ĐģŅ **ĐēаĐļĐ´ĐžĐŗĐž ĐŋĐžĐģŅ** иС **ĐˇĐ°ĐŗĐžĐģОвĐēОв** СаĐŋŅĐžŅа и вŅдаŅŅ ĐˇĐ°Đ´Đ°ĐŊĐŊŅŅ Đ˛Đ°Đŧи Pydantic-ĐŧОдĐĩĐģŅ.
+
+## ĐŅОвĐĩŅŅŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиŅ
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ĐŋĐžŅĐŧĐžŅŅĐĩŅŅ ĐŊŅĐļĐŊŅĐĩ header-ĐŋаŅаĐŧĐĩŅŅŅ Đ˛ ĐŗŅаŅиŅĐĩŅĐēĐžĐŧ иĐŊŅĐĩŅŅĐĩĐšŅĐĩ ŅĐŗĐĩĐŊĐĩŅиŅОваĐŊĐŊОК Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии ĐŋĐž ĐŋŅŅи `/docs`:
+
+
+
+
+
+## ĐаĐē СаĐŋŅĐĩŅиŅŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ĐˇĐ°ĐŗĐžĐģОвĐēи
+
+Đ ĐŊĐĩĐēĐžŅĐžŅŅŅ
ŅĐģŅŅаŅŅ
(ĐŊĐĩ ĐžŅОйО ŅаŅŅĐž вŅŅŅĐĩŅаŅŅиŅ
ŅŅ) ваĐŧ ĐŧĐžĐļĐĩŅ ĐŋĐžĐŊадОйиŅŅŅŅ **ĐžĐŗŅаĐŊиŅиŅŅ** ĐˇĐ°ĐŗĐžĐģОвĐēи, ĐēĐžŅĐžŅŅĐĩ Đ˛Ņ Ņ
ĐžŅиŅĐĩ ĐŋĐžĐģŅŅаŅŅ.
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ Đ˛ĐžĐˇĐŧĐžĐļĐŊĐžŅŅи ĐēĐžĐŊŅĐ¸ĐŗŅŅаŅии Pydantic-ĐŧОдĐĩĐģи Đ´ĐģŅ ŅĐžĐŗĐž, ŅŅĐžĐąŅ ĐˇĐ°ĐŋŅĐĩŅиŅŅ (`forbid`) ĐģŅĐąŅĐĩ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ (`extra`) ĐŋĐžĐģŅ:
+
+{* ../../docs_src/header_param_models/tutorial002_an_py310.py hl[10] *}
+
+ĐŅĐģи ĐēĐģиĐĩĐŊŅ ĐŋĐžĐŋŅОйŅĐĩŅ ĐžŅĐŋŅавиŅŅ **Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ĐˇĐ°ĐŗĐžĐģОвĐēи**, ŅĐž в ĐžŅвĐĩŅ ĐžĐŊ ĐŋĐžĐģŅŅĐ¸Ņ **ĐžŅийĐēŅ**.
+
+ĐаĐŋŅиĐŧĐĩŅ, ĐĩŅĐģи ĐēĐģиĐĩĐŊŅ ĐŋĐžĐŋŅŅаĐĩŅŅŅ ĐžŅĐŋŅавиŅŅ ĐˇĐ°ĐŗĐžĐģОвОĐē `tool` ŅĐž СĐŊаŅĐĩĐŊиĐĩĐŧ `plumbus`, ŅĐž в ĐžŅвĐĩŅ ĐžĐŊ ĐŋĐžĐģŅŅĐ¸Ņ ĐžŅийĐēŅ, ŅООйŅаŅŅŅŅ ĐĩĐŧŅ, ŅŅĐž header-ĐŋаŅаĐŧĐĩŅŅ `tool` ĐŊĐĩ ŅаСŅĐĩŅĐĩĐŊ:
+
+```json
+{
+ "detail": [
+ {
+ "type": "extra_forbidden",
+ "loc": ["header", "tool"],
+ "msg": "Extra inputs are not permitted",
+ "input": "plumbus",
+ }
+ ]
+}
+```
+
+## ĐаĐē ĐžŅĐēĐģŅŅиŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēĐžĐĩ ĐŋŅĐĩОйŅаСОваĐŊиĐĩ ĐŋОдŅĐĩŅĐēиваĐŊиК
+
+ĐаĐē и в ŅĐģŅŅаĐĩ Ņ ĐžĐąŅŅĐŊŅĐŧи ĐˇĐ°ĐŗĐžĐģОвĐēаĐŧи, ĐĩŅĐģи Ņ Đ˛Đ°Ņ Đ˛ иĐŧĐĩĐŊаŅ
ĐŋаŅаĐŧĐĩŅŅОв иĐŧĐĩŅŅŅŅ ŅиĐŧвОĐģŅ ĐŋОдŅĐĩŅĐēиваĐŊиŅ, ĐžĐŊи **авŅĐžĐŧаŅиŅĐĩŅĐēи ĐŋŅĐĩОйŅаСОвŅваŅŅŅŅ Đ˛ Đ´ĐĩŅиŅ**.
+
+ĐаĐŋŅиĐŧĐĩŅ, ĐĩŅĐģи в ĐēОдĐĩ ĐĩŅŅŅ header-ĐŋаŅаĐŧĐĩŅŅ `save_data`, ŅĐž ĐžĐļидаĐĩĐŧŅĐš HTTP-ĐˇĐ°ĐŗĐžĐģОвОĐē ĐąŅĐ´ĐĩŅ `save-data` и иĐŧĐĩĐŊĐŊĐž ŅаĐē ĐžĐŊ ĐąŅĐ´ĐĩŅ ĐžŅОйŅаĐļаŅŅŅŅ Đ˛ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии.
+
+ĐŅĐģи ĐŋĐž ĐēаĐēиĐŧ-ŅĐž ĐŋŅиŅиĐŊаĐŧ ваĐŧ ĐŊŅĐļĐŊĐž ĐžŅĐēĐģŅŅиŅŅ Đ´Đ°ĐŊĐŊĐžĐĩ авŅĐžĐŧаŅиŅĐĩŅĐēĐžĐĩ ĐŋŅĐĩОйŅаСОваĐŊиĐĩ, ŅŅĐž ĐŧĐžĐļĐŊĐž ŅĐ´ĐĩĐģаŅŅ Đ¸ Đ´ĐģŅ Pydantic-ĐŧОдĐĩĐģĐĩĐš Đ´ĐģŅ header-ĐŋаŅаĐŧĐĩŅŅОв.
+
+{* ../../docs_src/header_param_models/tutorial003_an_py310.py hl[19] *}
+
+/// warning | ĐĐŊиĐŧаĐŊиĐĩ
+
+ĐĐĩŅĐĩĐ´ ŅĐĩĐŧ ĐēаĐē ŅŅŅаĐŊавĐģиваŅŅ Đ´ĐģŅ ĐŋаŅаĐŧĐĩŅŅа `convert_underscores` СĐŊаŅĐĩĐŊиĐĩ `False`, иĐŧĐĩĐšŅĐĩ в видŅ, ŅŅĐž ĐŊĐĩĐēĐžŅĐžŅŅĐĩ HTTP-ĐŋŅĐžĐēŅи и ŅĐĩŅвĐĩŅŅ ĐŊĐĩ ŅаСŅĐĩŅаŅŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ ĐˇĐ°ĐŗĐžĐģОвĐēи Ņ ŅиĐŧвОĐģаĐŧи ĐŋОдŅĐĩŅĐēиваĐŊиŅ.
+
+///
+
+## Đ ĐĩСŅĐŧĐĩ
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ **Pydantic-ĐŧОдĐĩĐģи** Đ´ĐģŅ ĐžĐąŅŅвĐģĐĩĐŊĐ¸Ņ **header-ĐŋаŅаĐŧĐĩŅŅОв** в **FastAPI**. đ
diff --git a/docs/ru/docs/tutorial/middleware.md b/docs/ru/docs/tutorial/middleware.md
new file mode 100644
index 000000000..845e881e1
--- /dev/null
+++ b/docs/ru/docs/tutorial/middleware.md
@@ -0,0 +1,74 @@
+# Middleware (ĐŅĐžĐŧĐĩĐļŅŅĐžŅĐŊŅĐš ŅĐģОК)
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ дОйавиŅŅ ĐŋŅĐžĐŧĐĩĐļŅŅĐžŅĐŊŅĐš ŅĐģОК (middleware) в **FastAPI** ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ.
+
+"Middleware" ŅŅĐž ŅŅĐŊĐēŅиŅ, ĐēĐžŅĐžŅĐ°Ņ Đ˛ŅĐŋĐžĐģĐŊŅĐĩŅŅŅ Ņ ĐēаĐļĐ´ŅĐŧ СаĐŋŅĐžŅĐžĐŧ Đ´Đž ĐĩĐŗĐž ОйŅайОŅĐēи ĐēаĐēОК-ĐģийО ĐēĐžĐŊĐēŅĐĩŅĐŊОК *ĐžĐŋĐĩŅаŅиĐĩĐš ĐŋŅŅи*.
+Đ ŅаĐēĐļĐĩ Ņ ĐēаĐļĐ´ŅĐŧ ĐžŅвĐĩŅĐžĐŧ ĐŋĐĩŅĐĩĐ´ ĐĩĐŗĐž вОСвŅаŅĐĩĐŊиĐĩĐŧ.
+
+
+* ĐĐŊа ĐŋŅиĐŊиĐŧаĐĩŅ ĐēаĐļĐ´ŅĐš ĐŋĐžŅŅŅĐŋаŅŅиК **СаĐŋŅĐžŅ**.
+* ĐĐžĐļĐĩŅ ŅŅĐž-ŅĐž ŅĐ´ĐĩĐģаŅŅ Ņ ŅŅиĐŧ **СаĐŋŅĐžŅĐžĐŧ** иĐģи вŅĐŋĐžĐģĐŊиŅŅ ĐģŅйОК ĐŊŅĐļĐŊŅĐš ĐēОд.
+* ĐаŅĐĩĐŧ ĐŋĐĩŅĐĩдаĐĩŅ **СаĐŋŅĐžŅ** Đ´ĐģŅ ĐŋĐžŅĐģĐĩĐ´ŅŅŅĐĩĐš ОйŅайОŅĐēи (ĐēаĐēОК-ĐģийО *ĐžĐŋĐĩŅаŅиĐĩĐš ĐŋŅŅи*).
+* ĐĐžĐģŅŅаĐĩŅ **ĐžŅвĐĩŅ** (ĐžŅ *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*).
+* ĐĐžĐļĐĩŅ ŅŅĐž-ŅĐž ŅĐ´ĐĩĐģаŅŅ Ņ ŅŅиĐŧ **ĐžŅвĐĩŅĐžĐŧ** иĐģи вŅĐŋĐžĐģĐŊиŅŅ ĐģŅйОК ĐŊŅĐļĐŊŅĐš ĐēОд.
+* РвОСвŅаŅаĐĩŅ **ĐžŅвĐĩŅ**.
+
+/// note | ĐĸĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ Đ´ĐĩŅаĐģи
+
+ĐŅĐģи Ņ Đ˛Đ°Ņ ĐĩŅŅŅ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅи Ņ `yield`, ŅĐž ĐēОд вŅŅ
Ода (ĐēОд ĐŋĐžŅĐģĐĩ `yield`) ĐąŅĐ´ĐĩŅ Đ˛ŅĐŋĐžĐģĐŊŅŅŅŅŅ *ĐŋĐžŅĐģĐĩ* middleware.
+
+ĐŅĐģи Ņ Đ˛Đ°Ņ Đ¸ĐŧĐĩŅŅŅŅ ĐŊĐĩĐēиĐĩ ŅĐžĐŊОвŅĐĩ СадаŅи (ŅĐŧ. Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиŅ), ŅĐž ĐžĐŊи ĐąŅĐ´ŅŅ ĐˇĐ°ĐŋŅŅĐĩĐŊŅ ĐŋĐžŅĐģĐĩ middleware.
+
+///
+
+## ХОСдаĐŊиĐĩ middleware
+
+ĐĐģŅ ŅОСдаĐŊĐ¸Ņ middleware иŅĐŋĐžĐģŅСŅĐšŅĐĩ Đ´ĐĩĐēĐžŅаŅĐžŅ `@app.middleware("http")`.
+
+ФŅĐŊĐēŅĐ¸Ņ middleware ĐŋĐžĐģŅŅаĐĩŅ:
+
+* `request` (ОйŅĐĩĐēŅ ĐˇĐ°ĐŋŅĐžŅа).
+* ФŅĐŊĐēŅĐ¸Ņ `call_next`, ĐēĐžŅĐžŅĐ°Ņ ĐŋĐžĐģŅŅаĐĩŅ `request` в ĐēаŅĐĩŅŅвĐĩ ĐŋаŅаĐŧĐĩŅŅа.
+ * ĐŅа ŅŅĐŊĐēŅĐ¸Ņ ĐŋĐĩŅĐĩдаŅŅ `request` ŅООŅвĐĩŅŅŅвŅŅŅĐĩĐš *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*.
+ * ĐаŅĐĩĐŧ ĐžĐŊа вОСвŅаŅаĐĩŅ ĐžŅвĐĩŅ `response`, ŅĐŗĐĩĐŊĐĩŅиŅОваĐŊĐŊŅĐš *ĐžĐŋĐĩŅаŅиĐĩĐš ĐŋŅŅи*.
+* ĐĸаĐēĐļĐĩ иĐŧĐĩĐĩŅŅŅ Đ˛ĐžĐˇĐŧĐžĐļĐŊĐžŅŅŅ Đ˛Đ¸Đ´ĐžĐ¸ĐˇĐŧĐĩĐŊиŅŅ `response`, ĐŋĐĩŅĐĩĐ´ ŅĐĩĐŧ ĐēаĐē ĐĩĐŗĐž вĐĩŅĐŊŅŅŅ.
+
+{* ../../docs_src/middleware/tutorial001.py hl[8:9,11,14] *}
+
+/// tip | ĐŅиĐŧĐĩŅаĐŊиĐĩ
+
+ĐĐŧĐĩĐšŅĐĩ в видŅ, ŅŅĐž ĐŧĐžĐļĐŊĐž дОйавĐģŅŅŅ ŅвОи ŅОйŅŅвĐĩĐŊĐŊŅĐĩ ĐˇĐ°ĐŗĐžĐģОвĐēи ĐŋŅи ĐŋĐžĐŧĐžŅи ĐŋŅĐĩŅиĐēŅа 'X-' .
+
+ĐŅĐģи ĐļĐĩ Đ˛Ņ Ņ
ĐžŅиŅĐĩ дОйавиŅŅ ŅОйŅŅвĐĩĐŊĐŊŅĐĩ ĐˇĐ°ĐŗĐžĐģОвĐēи, ĐēĐžŅĐžŅŅĐĩ ĐēĐģиĐĩĐŊŅ ŅĐŧĐžĐļĐĩŅ ŅвидĐĩŅŅ Đ˛ ĐąŅаŅСĐĩŅĐĩ, ŅĐž ваĐŧ ĐŋĐžŅŅĐĩĐąŅĐĩŅŅŅ Đ´ĐžĐąĐ°Đ˛Đ¸ŅŅ Đ¸Ņ
в ĐŊаŅŅŅОКĐēи CORS ([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank}), иŅĐŋĐžĐģŅСŅŅ ĐŋаŅаĐŧĐĩŅŅ `expose_headers`, ŅĐŧ. Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ Starlette's CORS docs .
+
+///
+
+/// note | ĐĸĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ Đ´ĐĩŅаĐģи
+
+ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ `from starlette.requests import Request`.
+
+**FastAPI** ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ ŅаĐēОК Đ´ĐžŅŅŅĐŋ Đ´ĐģŅ ŅдОйŅŅва ŅаСŅайОŅŅиĐēОв. ĐĐž, ĐŊа ŅаĐŧĐžĐŧ Đ´ĐĩĐģĐĩ, ŅŅĐž `Request` иС Starlette.
+
+///
+
+### ĐĐž и ĐŋĐžŅĐģĐĩ `response`
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ дОйавиŅŅ ĐēОд, иŅĐŋĐžĐģŅСŅŅŅиК `request` Đ´Đž ĐŋĐĩŅĐĩдаŅи ĐĩĐŗĐž ĐēаĐēОК-ĐģийО *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*.
+
+Đ ŅаĐēĐļĐĩ ĐŋĐžŅĐģĐĩ ŅĐžŅĐŧиŅОваĐŊĐ¸Ņ `response`, Đ´Đž ŅĐžĐŗĐž, ĐēаĐē Đ˛Ņ ĐĩĐŗĐž вĐĩŅĐŊŅŅĐĩ.
+
+ĐаĐŋŅиĐŧĐĩŅ, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ дОйавиŅŅ ŅОйŅŅвĐĩĐŊĐŊŅĐš ĐˇĐ°ĐŗĐžĐģОвОĐē `X-Process-Time`, ŅОдĐĩŅĐļаŅиК вŅĐĩĐŧŅ Đ˛ ŅĐĩĐēŅĐŊдаŅ
, ĐŊĐĩОйŅ
ОдиĐŧĐžĐĩ Đ´ĐģŅ ĐžĐąŅайОŅĐēи СаĐŋŅĐžŅа и ĐŗĐĩĐŊĐĩŅаŅии ĐžŅвĐĩŅа:
+
+{* ../../docs_src/middleware/tutorial001.py hl[10,12:13] *}
+
+/// tip | ĐŅиĐŧĐĩŅаĐŊиĐĩ
+
+ĐŅ Đ¸ŅĐŋĐžĐģŅСŅĐĩĐŧ `time.perf_counter()` вĐŧĐĩŅŅĐž `time.time()` Đ´ĐģŅ ĐžĐąĐĩŅĐŋĐĩŅĐĩĐŊĐ¸Ņ ĐąĐžĐģŅŅĐĩĐš ŅĐžŅĐŊĐžŅŅи ĐŊаŅиŅ
ĐŋŅиĐŧĐĩŅОв. đ¤
+
+///
+
+## ĐŅŅĐŗĐ¸Đĩ middleware
+
+Đ Đ´ŅŅĐŗĐ¸Ņ
middleware Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅСĐŊаŅŅ ĐąĐžĐģŅŅĐĩ в ŅаСдĐĩĐģĐĩ [Advanced User Guide: Advanced Middleware](../advanced/middleware.md){.internal-link target=_blank}.
+
+Đ ŅĐģĐĩĐ´ŅŅŅĐĩĐŧ ŅаСдĐĩĐģĐĩ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐŋŅĐžŅиŅаŅŅ, ĐēаĐē ĐŊаŅŅŅОиŅŅ CORS Ņ ĐŋĐžĐŧĐžŅŅŅ middleware.
diff --git a/docs/ru/docs/tutorial/query-params-str-validations.md b/docs/ru/docs/tutorial/query-params-str-validations.md
index 32a98ff22..13b7015db 100644
--- a/docs/ru/docs/tutorial/query-params-str-validations.md
+++ b/docs/ru/docs/tutorial/query-params-str-validations.md
@@ -291,22 +291,6 @@ q: Union[str, None] = Query(default=None, min_length=3)
{* ../../docs_src/query_params_str_validations/tutorial006_an_py39.py hl[9] *}
-### ĐĐąŅСаŅĐĩĐģŅĐŊŅĐš ĐŋаŅаĐŧĐĩŅŅ Ņ Ellipsis (`...`)
-
-ĐĐģŅŅĐĩŅĐŊаŅивĐŊŅĐš ŅĐŋĐžŅОй ŅĐēаСаŅŅ ĐžĐąŅСаŅĐĩĐģŅĐŊĐžŅŅŅ ĐŋаŅаĐŧĐĩŅŅа СаĐŋŅĐžŅа - ŅŅĐž ŅĐēаСаŅŅ ĐŋаŅаĐŧĐĩŅŅ `default` ŅĐĩŅĐĩС ĐŧĐŊĐžĐŗĐžŅĐžŅиĐĩ `...`:
-
-{* ../../docs_src/query_params_str_validations/tutorial006b_an_py39.py hl[9] *}
-
-/// info | ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊĐ°Ņ Đ¸ĐŊŅĐžŅĐŧаŅиŅ
-
-ĐŅĐģи Đ˛Ņ ŅаĐŊĐĩĐĩ ĐŊĐĩ ŅŅаĐģĐēиваĐģиŅŅ Ņ `...`: ŅŅĐž ŅĐŋĐĩŅиаĐģŅĐŊĐžĐĩ СĐŊаŅĐĩĐŊиĐĩ, ŅаŅŅŅ ŅСŅĐēа Python и ĐŊаСŅваĐĩŅŅŅ "Ellipsis" .
-
-ĐŅĐŋĐžĐģŅСŅĐĩŅŅŅ Đ˛ Pydantic и FastAPI Đ´ĐģŅ ĐžĐŋŅĐĩĐ´ĐĩĐģĐĩĐŊиŅ, ŅŅĐž СĐŊаŅĐĩĐŊиĐĩ ŅŅĐĩĐąŅĐĩŅŅŅ ĐžĐąŅСаŅĐĩĐģŅĐŊĐž.
-
-///
-
-ĐĸаĐēиĐŧ ОйŅаСОĐŧ, **FastAPI** ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐĩŅ, ŅŅĐž ĐŋаŅаĐŧĐĩŅŅ ŅвĐģŅĐĩŅŅŅ ĐžĐąŅСаŅĐĩĐģŅĐŊŅĐŧ.
-
### ĐĐąŅСаŅĐĩĐģŅĐŊŅĐš ĐŋаŅаĐŧĐĩŅŅ Ņ `None`
ĐŅ ĐŧĐžĐļĐĩŅĐĩ ĐžĐŋŅĐĩĐ´ĐĩĐģиŅŅ, ŅŅĐž ĐŋаŅаĐŧĐĩŅŅ ĐŧĐžĐļĐĩŅ ĐŋŅиĐŊиĐŧаŅŅ `None`, ĐŊĐž вŅŅ ĐĩŅŅ ŅвĐģŅĐĩŅŅŅ ĐžĐąŅСаŅĐĩĐģŅĐŊŅĐŧ. ĐŅĐž ĐŧĐžĐļĐĩŅ ĐŋĐžŅŅĐĩйОваŅŅŅŅ Đ´ĐģŅ ŅĐžĐŗĐž, ŅŅĐžĐąŅ ĐŋĐžĐģŅСОваŅĐĩĐģи ŅвĐŊĐž ŅĐēаСаĐģи ĐŋаŅаĐŧĐĩŅŅ, даĐļĐĩ ĐĩŅĐģи ĐĩĐŗĐž СĐŊаŅĐĩĐŊиĐĩ ĐąŅĐ´ĐĩŅ `None`.
@@ -321,18 +305,6 @@ Pydantic, ĐŧĐžŅŅ ĐēĐžŅĐžŅĐžĐŗĐž иŅĐŋĐžĐģŅСŅĐĩŅŅŅ Đ˛ FastAPI Đ´ĐģŅ
///
-### ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ Pydantic's `Required` вĐŧĐĩŅŅĐž Ellipsis (`...`)
-
-ĐŅĐģи Đ˛Đ°Ņ ŅĐŧŅŅаĐĩŅ `...`, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ `Required` иС Pydantic:
-
-{* ../../docs_src/query_params_str_validations/tutorial006d_an_py39.py hl[4,10] *}
-
-/// tip | ĐОдŅĐēаСĐēа
-
-ĐаĐŋĐžĐŧĐŊиŅĐĩ, ĐēĐžĐŗĐ´Đ° ваĐŧ ĐŊĐĩОйŅ
ОдиĐŧĐž ОйŅŅвиŅŅ query-ĐŋаŅаĐŧĐĩŅŅ ĐžĐąŅСаŅĐĩĐģŅĐŊŅĐŧ, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐŋŅĐžŅŅĐž ĐŊĐĩ ŅĐēаСŅваŅŅ ĐŋаŅаĐŧĐĩŅŅ `default`. ĐĸаĐēиĐŧ ОйŅаСОĐŧ, ваĐŧ ŅĐĩĐ´ĐēĐž ĐŋŅидŅŅŅŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ `...` иĐģи `Required`.
-
-///
-
## ĐĐŊĐžĐļĐĩŅŅвО СĐŊаŅĐĩĐŊиК Đ´ĐģŅ query-ĐŋаŅаĐŧĐĩŅŅа
ĐĐģŅ query-ĐŋаŅаĐŧĐĩŅŅа `Query` ĐŧĐžĐļĐŊĐž ŅĐēаСаŅŅ, ŅŅĐž ĐžĐŊ ĐŋŅиĐŊиĐŧаĐĩŅ ŅĐŋиŅĐžĐē СĐŊаŅĐĩĐŊиК (ĐŧĐŊĐžĐļĐĩŅŅвО СĐŊаŅĐĩĐŊиК).
diff --git a/docs/ru/docs/tutorial/request-form-models.md b/docs/ru/docs/tutorial/request-form-models.md
new file mode 100644
index 000000000..1034ed27f
--- /dev/null
+++ b/docs/ru/docs/tutorial/request-form-models.md
@@ -0,0 +1,78 @@
+# ĐОдĐĩĐģи ŅĐžŅĐŧ
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ **Pydantic-ĐŧОдĐĩĐģи** Đ´ĐģŅ ĐžĐąŅŅвĐģĐĩĐŊĐ¸Ņ **ĐŋĐžĐģĐĩĐš ŅĐžŅĐŧ** в FastAPI.
+
+/// info | ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊĐ°Ņ Đ¸ĐŊŅĐžŅĐŧаŅиŅ
+
+ЧŅĐžĐąŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ ŅĐžŅĐŧŅ, ŅĐŊаŅаĐģа ŅŅŅаĐŊОвиŅĐĩ `python-multipart` .
+
+ĐŖĐąĐĩдиŅĐĩŅŅ, ŅŅĐž Đ˛Ņ ŅОСдаĐģи и аĐēŅивиŅОваĐģи [виŅŅŅаĐģŅĐŊĐžĐĩ ĐžĐēŅŅĐļĐĩĐŊиĐĩ](../virtual-environments.md){.internal-link target=_blank}, а СаŅĐĩĐŧ ŅŅŅаĐŊОвиŅĐĩ ĐŋаĐēĐĩŅ, ĐŊаĐŋŅиĐŧĐĩŅ:
+
+```console
+$ pip install python-multipart
+```
+
+///
+
+/// note | ĐаĐŧĐĩŅĐēа
+
+ĐŅĐžŅ ŅŅĐŊĐēŅиОĐŊаĐģ Đ´ĐžŅŅŅĐŋĐĩĐŊ Ņ Đ˛ĐĩŅŅии `0.113.0`. đ¤
+
+///
+
+## Pydantic-ĐŧОдĐĩĐģŅ Đ´ĐģŅ ŅĐžŅĐŧŅ
+
+ĐаĐŧ ĐŋŅĐžŅŅĐž ĐŊŅĐļĐŊĐž ОйŅŅвиŅŅ **Pydantic-ĐŧОдĐĩĐģŅ** Ņ ĐŋĐžĐģŅĐŧи, ĐēĐžŅĐžŅŅĐĩ Đ˛Ņ Ņ
ĐžŅиŅĐĩ ĐŋĐžĐģŅŅиŅŅ ĐēаĐē **ĐŋĐžĐģŅ ŅĐžŅĐŧŅ**, а СаŅĐĩĐŧ ОйŅŅвиŅŅ ĐŋаŅаĐŧĐĩŅŅ ĐēаĐē `Form`:
+
+{* ../../docs_src/request_form_models/tutorial001_an_py39.py hl[9:11,15] *}
+
+**FastAPI** **иСвĐģĐĩŅŅŅ** даĐŊĐŊŅĐĩ Đ´ĐģŅ **ĐēаĐļĐ´ĐžĐŗĐž ĐŋĐžĐģŅ** иС **даĐŊĐŊŅŅ
ŅĐžŅĐŧŅ** в СаĐŋŅĐžŅĐĩ и вŅдаŅŅ Đ˛Đ°Đŧ ОйŅŅвĐģĐĩĐŊĐŊŅŅ Pydantic-ĐŧОдĐĩĐģŅ.
+
+## ĐŅОвĐĩŅĐēа ŅĐŗĐĩĐŊĐĩŅиŅОваĐŊĐŊОК Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ĐŋĐžŅĐŧĐžŅŅĐĩŅŅ ĐŋĐžĐģŅ ŅĐžŅĐŧŅ Đ˛ ĐŗŅаŅиŅĐĩŅĐēĐžĐŧ иĐŊŅĐĩŅŅĐĩĐšŅĐĩ ĐĐžĐēŅĐŧĐĩĐŊŅаŅии ĐŋĐž ĐŋŅŅи `/docs`:
+
+
+
+
+
+## ĐаĐŋŅĐĩŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅŅ
ĐŋĐžĐģĐĩĐš ŅĐžŅĐŧŅ
+
+Đ ĐŊĐĩĐēĐžŅĐžŅŅŅ
ŅĐģŅŅаŅŅ
(ĐŊĐĩ ĐžŅОйО ŅаŅŅĐž вŅŅŅĐĩŅаŅŅиŅ
ŅŅ) ваĐŧ ĐŧĐžĐļĐĩŅ ĐŋĐžĐŊадОйиŅŅŅŅ **ĐžĐŗŅаĐŊиŅиŅŅ** ĐŋĐžĐģŅ ŅĐžŅĐŧŅ ŅĐžĐģŅĐēĐž ŅĐĩĐŧи, ĐēĐžŅĐžŅŅĐĩ ОйŅŅвĐģĐĩĐŊŅ Đ˛ Pydantic-ĐŧОдĐĩĐģи. Đ **СаĐŋŅĐĩŅиŅŅ** ĐģŅĐąŅĐĩ **Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ** ĐŋĐžĐģŅ.
+
+/// note | ĐаĐŧĐĩŅĐēа
+
+ĐŅĐžŅ ŅŅĐŊĐēŅиОĐŊаĐģ Đ´ĐžŅŅŅĐŋĐĩĐŊ Ņ Đ˛ĐĩŅŅии `0.114.0`. đ¤
+
+///
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ŅĐēĐžĐŊŅĐ¸ĐŗŅŅиŅОваŅŅ Pydantic-ĐŧОдĐĩĐģŅ ŅаĐē, ŅŅĐžĐąŅ ĐˇĐ°ĐŋŅĐĩŅиŅŅ (`forbid`) вŅĐĩ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ (`extra`) ĐŋĐžĐģŅ:
+
+{* ../../docs_src/request_form_models/tutorial002_an_py39.py hl[12] *}
+
+ĐŅĐģи ĐēĐģиĐĩĐŊŅ ĐŋĐžĐŋŅОйŅĐĩŅ ĐžŅĐŋŅавиŅŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ даĐŊĐŊŅĐĩ, ŅĐž в ĐžŅвĐĩŅ ĐžĐŊ ĐŋĐžĐģŅŅĐ¸Ņ **ĐžŅийĐēŅ**.
+
+ĐаĐŋŅиĐŧĐĩŅ, ĐĩŅĐģи ĐēĐģиĐĩĐŊŅ ĐŋĐžĐŋŅŅаĐĩŅŅŅ ĐžŅĐŋŅавиŅŅ ĐŋĐžĐģŅ ŅĐžŅĐŧŅ:
+
+* `username`: `Rick`
+* `password`: `Portal Gun`
+* `extra`: `Mr. Poopybutthole`
+
+ĐĸĐž в ĐžŅвĐĩŅ ĐžĐŊ ĐŋĐžĐģŅŅĐ¸Ņ **ĐžŅийĐēŅ**, ŅООйŅаŅŅŅŅ ĐĩĐŧŅ, ŅŅĐž ĐŋĐžĐģĐĩ `extra` ĐŊĐĩ ŅаСŅĐĩŅĐĩĐŊĐž:
+
+```json
+{
+ "detail": [
+ {
+ "type": "extra_forbidden",
+ "loc": ["body", "extra"],
+ "msg": "Extra inputs are not permitted",
+ "input": "Mr. Poopybutthole"
+ }
+ ]
+}
+```
+
+## ĐаĐēĐģŅŅĐĩĐŊиĐĩ
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ Pydantic-ĐŧОдĐĩĐģи Đ´ĐģŅ ĐžĐąŅŅвĐģĐĩĐŊĐ¸Ņ ĐŋĐžĐģĐĩĐš ŅĐžŅĐŧ в FastAPI. đ
diff --git a/docs/tr/docs/index.md b/docs/tr/docs/index.md
index 7ecaf1ba3..f666e2d06 100644
--- a/docs/tr/docs/index.md
+++ b/docs/tr/docs/index.md
@@ -12,7 +12,7 @@
-
+
diff --git a/docs/uk/docs/features.md b/docs/uk/docs/features.md
new file mode 100644
index 000000000..7d679d8ee
--- /dev/null
+++ b/docs/uk/docs/features.md
@@ -0,0 +1,189 @@
+# ФŅĐŊĐēŅŅĐžĐŊаĐģŅĐŊŅ ĐŧĐžĐļĐģивОŅŅŅ
+
+## ФŅĐŊĐēŅŅĐžĐŊаĐģŅĐŊŅ ĐŧĐžĐļĐģивОŅŅŅ FastAPI
+
+**FastAPI** ĐŊĐ°Đ´Đ°Ņ Đ˛Đ°Đŧ ŅаĐēŅ ĐŧĐžĐļĐģивОŅŅŅ:
+
+### ĐиĐēĐžŅиŅŅаĐŊĐŊŅ Đ˛ŅĐ´ĐēŅиŅиŅ
ŅŅаĐŊдаŅŅŅв
+
+* OpenAPI Đ´ĐģŅ ŅŅвОŅĐĩĐŊĐŊŅ API, вĐēĐģŅŅаŅŅи ĐžĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ ŅĐģŅŅ
Ņв , ĐžĐŋĐĩŅаŅŅĐš , ĐŋаŅаĐŧĐĩŅŅŅв, ŅŅĐģ СаĐŋиŅŅв, ĐąĐĩСĐŋĐĩĐēи ŅĐžŅĐž.
+* ĐвŅĐžĐŧаŅиŅĐŊа Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ ĐŧОдĐĩĐģĐĩĐš даĐŊиŅ
Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ JSON Schema (ĐžŅĐēŅĐģŅĐēи OpenAPI йаСŅŅŅŅŅŅ ŅаĐŧĐĩ ĐŊа JSON Schema).
+* РОСŅОйĐģĐĩĐŊĐž ĐŊа ĐžŅĐŊĐžĐ˛Ņ ŅиŅ
ŅŅаĐŊдаŅŅŅв ĐŋŅŅĐģŅ ŅĐĩŅĐĩĐģŅĐŊĐžĐŗĐž аĐŊаĐģŅСŅ, а ĐŊĐĩ ŅĐē дОдаŅĐēОвиК ŅŅвĐĩĐŊŅ ĐŋОвĐĩŅŅ
ĐžŅĐŊОвĐŊĐžŅ Đ°ŅŅ
ŅŅĐĩĐēŅŅŅи.
+* ĐĻĐĩ ŅаĐēĐžĐļ Đ´Đ°Ņ ĐˇĐŧĐžĐŗŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐŊĐž **ĐŗĐĩĐŊĐĩŅŅваŅи ĐēОд ĐēĐģŅŅĐŊŅа** ĐąĐ°ĐŗĐ°ŅŅĐŧа ĐŧОваĐŧи.
+
+### ĐвŅĐžĐŧаŅиŅĐŊа ĐŗĐĩĐŊĐĩŅаŅŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ
+
+ĐĐŊŅĐĩŅаĐēŅивĐŊа Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ API Ņа вĐĩĐąŅĐŊŅĐĩŅŅĐĩĐšŅ Đ´ĐģŅ ĐšĐžĐŗĐž Đ´ĐžŅĐģŅĐ´ĐļĐĩĐŊĐŊŅ. ĐŅĐēŅĐģŅĐēи ŅŅĐĩĐšĐŧвОŅĐē йаСŅŅŅŅŅŅ ĐŊа OpenAPI, Ņ ĐēŅĐģŅĐēа ваŅŅаĐŊŅŅв, два С ŅĐēиŅ
вĐēĐģŅŅĐĩĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ.
+
+* Swagger UI â дОСвОĐģŅŅ ŅĐŊŅĐĩŅаĐēŅивĐŊĐž ĐŋĐĩŅĐĩĐŗĐģŅдаŅи API, виĐēĐģиĐēаŅи Ņа ŅĐĩŅŅŅваŅи ĐšĐžĐŗĐž ĐŋŅŅĐŧĐž Ņ ĐąŅаŅСĐĩŅŅ.
+
+
+
+* ĐĐģŅŅĐĩŅĐŊаŅивĐŊа Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ API Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ ReDoc .
+
+
+
+### ĐĸŅĐģŅĐēи ŅŅŅаŅĐŊиК Python
+
+FastAPI виĐēĐžŅиŅŅОвŅŅ ŅŅаĐŊдаŅŅĐŊŅ **ŅиĐŋи Python** (СавдŅĐēи Pydantic). ĐаĐŧ ĐŊĐĩ ĐŋĐžŅŅŅĐąĐŊĐž вивŅаŅи ĐŊОвиК ŅиĐŊŅаĐēŅĐ¸Ņ â ĐģиŅĐĩ ŅŅаĐŊдаŅŅĐŊиК ŅŅŅаŅĐŊиК Python.
+
+Đ¯ĐēŅĐž ваĐŧ ĐŋĐžŅŅŅĐąĐŊĐĩ ĐēĐžŅĐžŅĐēĐĩ ĐŊĐ°ĐŗĐ°Đ´ŅваĐŊĐŊŅ ĐŋŅĐž виĐēĐžŅиŅŅаĐŊĐŊŅ ŅиĐŋŅв Ņ Python (ĐŊавŅŅŅ ŅĐēŅĐž ви ĐŊĐĩ виĐēĐžŅиŅŅОвŅŅŅĐĩ FastAPI), ĐŋĐĩŅĐĩĐŗĐģŅĐŊŅŅĐĩ ĐēĐžŅĐžŅĐēиК ĐŋŅĐ´ŅŅŅĐŊиĐē: [ĐŅŅŅĐŋ Đ´Đž ŅиĐŋŅв Python](python-types.md){.internal-link target=_blank}.
+
+ĐŅŅ ĐŋŅиĐēĐģад ŅŅаĐŊдаŅŅĐŊĐžĐŗĐž Python-ĐēĐžĐ´Ņ Đˇ ŅиĐŋаĐŧи:
+
+```Python
+from datetime import date
+from pydantic import BaseModel
+
+# ĐĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ ĐˇĐŧŅĐŊĐŊĐžŅ ŅĐē str
+# С ĐŋŅĐ´ŅŅиĐŧĐēĐžŅ Đ°Đ˛ŅОдОĐŋОвĐŊĐĩĐŊĐŊŅ Ņ ŅĐĩдаĐēŅĐžŅŅ
+def main(user_id: str):
+ return user_id
+
+# ĐОдĐĩĐģŅ Pydantic
+class User(BaseModel):
+ id: int
+ name: str
+ joined: date
+```
+
+ĐŅиĐēĐģад виĐēĐžŅиŅŅаĐŊĐŊŅ ŅŅŅŅ ĐŧОдĐĩĐģŅ:
+
+```Python
+my_user: User = User(id=3, name="John Doe", joined="2018-07-19")
+
+second_user_data = {
+ "id": 4,
+ "name": "Mary",
+ "joined": "2018-11-30",
+}
+
+my_second_user: User = User(**second_user_data)
+```
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+`**second_user_data` ОСĐŊаŅаŅ:
+
+ĐĐĩŅĐĩдаŅи ĐēĐģŅŅŅ Ņа СĐŊаŅĐĩĐŊĐŊŅ ŅĐģОвĐŊиĐēа `second_user_data` ŅĐē аŅĐŗŅĐŧĐĩĐŊŅи Ņ Đ˛Đ¸ĐŗĐģŅĐ´Ņ "ĐēĐģŅŅ-СĐŊаŅĐĩĐŊĐŊŅ", ĐĩĐēвŅваĐģĐĩĐŊŅĐŊĐž `User(id=4, name="Mary", joined="2018-11-30")`.
+
+///
+
+### ĐŅĐ´ŅŅиĐŧĐēа ŅĐĩдаĐēŅĐžŅŅв (IDE)
+
+ФŅĐĩĐšĐŧвОŅĐē ŅĐŋŅĐžŅĐēŅОваĐŊиК ŅаĐē, ŅОй ĐąŅŅи ĐģĐĩĐŗĐēиĐŧ Ņ ŅĐŊŅŅŅŅивĐŊĐž СŅОСŅĐŧŅĐģиĐŧ. ĐŖŅŅ ŅŅŅĐĩĐŊĐŊŅ ŅĐĩŅŅŅваĐģиŅŅ Ņ ŅŅСĐŊиŅ
ŅĐĩдаĐēŅĐžŅаŅ
ŅĐĩ Đ´Đž ĐŋĐžŅаŅĐēŅ ŅОСŅОйĐēи, ŅОй СайĐĩСĐŋĐĩŅиŅи ĐŊаКĐēŅаŅиК Đ´ĐžŅвŅĐ´ ĐŋŅĐžĐŗŅаĐŧŅваĐŊĐŊŅ.
+
+Đа ŅĐĩСŅĐģŅŅаŅаĐŧи ĐžĐŋиŅŅваĐŊŅ ŅОСŅОйĐŊиĐēŅв Python ОдĐŊŅŅŅ Đˇ ĐŊаКĐŋĐžĐŋŅĐģŅŅĐŊŅŅиŅ
ŅŅĐŊĐēŅŅĐš Ņ "авŅОдОĐŋОвĐŊĐĩĐŊĐŊŅ" .
+
+**FastAPI** ĐŋОвĐŊŅŅŅŅ ĐŋŅĐ´ŅŅиĐŧŅŅ Đ°Đ˛ŅОдОĐŋОвĐŊĐĩĐŊĐŊŅ Ņ Đ˛ŅŅŅ
ĐŧŅŅŅŅŅ
, ŅĐžĐŧŅ Đ˛Đ°Đŧ ŅŅĐ´ĐēĐž дОвĐĩĐ´ĐĩŅŅŅŅ ĐŋОвĐĩŅŅаŅиŅŅ Đ´Đž Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ.
+
+ĐŅиĐēĐģад авŅОдОĐŋОвĐŊĐĩĐŊĐŊŅ Ņ ŅĐĩдаĐēŅĐžŅаŅ
:
+
+* Ņ Visual Studio Code :
+
+
+
+* Ņ PyCharm :
+
+
+
+### ĐĐžŅĐžŅĐēиК ĐēОд
+FastAPI ĐŧĐ°Ņ ŅОСŅĐŧĐŊŅ ĐŊаĐģаŅŅŅваĐŊĐŊŅ **Са СаĐŧОвŅŅваĐŊĐŊŅĐŧ**, аĐģĐĩ вŅŅ ĐŋаŅаĐŧĐĩŅŅи ĐŧĐžĐļĐŊа ĐŊаĐģаŅŅОвŅваŅи вŅĐ´ĐŋОвŅĐ´ĐŊĐž Đ´Đž ваŅиŅ
ĐŋĐžŅŅĐĩĐą. ĐĐ´ĐŊаĐē Са СаĐŧОвŅŅваĐŊĐŊŅĐŧ вŅĐĩ "ĐŋŅĐžŅŅĐž ĐŋŅаŅŅŅ".
+
+### ĐаĐģŅдаŅŅŅ
+* ĐŅĐ´ŅŅиĐŧĐēа ваĐģŅдаŅŅŅ Đ´ĐģŅ ĐąŅĐģŅŅĐžŅŅŅ (айО вŅŅŅ
?) **ŅиĐŋŅв даĐŊиŅ
Python**, СОĐēŅĐĩĐŧа:
+ * JSON-Ой'ŅĐēŅŅв (`dict`).
+ * JSON-ŅĐŋиŅĐēŅв (`list`) С виСĐŊаŅĐĩĐŊĐŊŅĐŧ ŅиĐŋŅв ĐĩĐģĐĩĐŧĐĩĐŊŅŅв.
+ * Đ ŅĐ´ĐēŅв (`str`) ŅС ĐŧŅĐŊŅĐŧаĐģŅĐŊĐžŅ Ņа ĐŧаĐēŅиĐŧаĐģŅĐŊĐžŅ Đ´ĐžĐ˛ĐļиĐŊĐžŅ.
+ * ЧиŅĐĩĐģ (`int`, `float`) С ОйĐŧĐĩĐļĐĩĐŊĐŊŅĐŧи ĐŧŅĐŊŅĐŧаĐģŅĐŊиŅ
Ņа ĐŧаĐēŅиĐŧаĐģŅĐŊиŅ
СĐŊаŅĐĩĐŊŅ ŅĐžŅĐž.
+
+* ĐаĐģŅдаŅŅŅ ŅĐēĐģадĐŊŅŅиŅ
ŅиĐŋŅв, ŅаĐēиŅ
ŅĐē:
+ * URL.
+ * Email.
+ * UUID.
+ * ...Ņа ŅĐŊŅŅ.
+
+ĐŖŅŅ Đ˛Đ°ĐģŅдаŅŅŅ Đ˛Đ¸ĐēĐžĐŊŅŅŅŅŅŅ ŅĐĩŅĐĩС ĐŊадŅĐšĐŊиК Ņа ĐŋĐĩŅĐĩвŅŅĐĩĐŊиК **Pydantic**.
+
+### ĐĐĩСĐŋĐĩĐēа Ņа авŅĐĩĐŊŅиŅŅĐēаŅŅŅ
+
+**FastAPI** ĐŋŅĐ´ŅŅиĐŧŅŅ Đ˛ĐąŅдОваĐŊŅ Đ°Đ˛ŅĐĩĐŊŅиŅŅĐēаŅŅŅ Ņа авŅĐžŅиСаŅŅŅ, ĐąĐĩС ĐŋŅивâŅСĐēи Đ´Đž ĐēĐžĐŊĐēŅĐĩŅĐŊиŅ
йаС даĐŊиŅ
Ņи ĐŧОдĐĩĐģĐĩĐš даĐŊиŅ
.
+
+ĐŅĐ´ŅŅиĐŧŅŅŅŅŅŅ Đ˛ŅŅ ŅŅ
ĐĩĐŧи ĐąĐĩСĐŋĐĩĐēи OpenAPI, вĐēĐģŅŅаŅŅи:
+
+* HTTP Basic.
+* **OAuth2** (ŅаĐēĐžĐļ ŅС ĐŋŅĐ´ŅŅиĐŧĐēĐžŅ **JWT-ŅĐžĐēĐĩĐŊŅв**). Đив. ĐŋŅĐ´ŅŅŅĐŊиĐē: [OAuth2 ŅС JWT](tutorial/security/oauth2-jwt.md){.internal-link target=_blank}.
+* ĐĐģŅŅŅ API в:
+ * ĐĐ°ĐŗĐžĐģОвĐēаŅ
.
+ * ĐаŅаĐŧĐĩŅŅаŅ
СаĐŋиŅŅ.
+ * Cookies ŅĐžŅĐž.
+
+Đ ŅаĐēĐžĐļ ŅŅŅ ĐŧĐžĐļĐģивОŅŅŅ ĐąĐĩСĐŋĐĩĐēи вŅĐ´ Starlette (СОĐēŅĐĩĐŧа **ŅĐĩŅŅĐšĐŊŅ cookies**).
+
+ĐŖŅŅ Đ˛ĐžĐŊи ŅŅвОŅĐĩĐŊŅ ŅĐē ĐąĐ°ĐŗĐ°ŅĐžŅĐ°ĐˇĐžĐ˛Ņ ŅĐŊŅŅŅŅĐŧĐĩĐŊŅи Ņа ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅи, ŅĐēŅ ĐģĐĩĐŗĐēĐž ŅĐŊŅĐĩĐŗŅŅŅŅŅŅŅ Đˇ ваŅиĐŧи ŅиŅŅĐĩĐŧаĐŧи, ŅŅ
ОвиŅаĐŧи даĐŊиŅ
, ŅĐĩĐģŅŅŅĐšĐŊиĐŧи Ņа NoSQL йаСаĐŧи даĐŊиŅ
ŅĐžŅĐž.
+
+### ĐĐŋŅОвадĐļĐĩĐŊĐŊŅ ĐˇĐ°ĐģĐĩĐļĐŊĐžŅŅĐĩĐš
+
+**FastAPI** ĐŧŅŅŅиŅŅ ĐŊадСвиŅаКĐŊĐž ĐŋŅĐžŅŅŅ Ņ Đ˛Đ¸ĐēĐžŅиŅŅаĐŊĐŊŅ, аĐģĐĩ ĐŋĐžŅŅĐļĐŊŅ ŅиŅŅĐĩĐŧŅ Đ˛ĐŋŅОвадĐļĐĩĐŊĐŊŅ ĐˇĐ°ĐģĐĩĐļĐŊĐžŅŅĐĩĐš.
+
+* ĐаĐģĐĩĐļĐŊĐžŅŅŅ ĐŧĐžĐļŅŅŅ ĐŧаŅи вĐģаŅĐŊŅ ĐˇĐ°ĐģĐĩĐļĐŊĐžŅŅŅ, ŅŅвОŅŅŅŅи ŅŅŅаŅŅ
ŅŅ Đ°ĐąĐž **"ĐŗŅĐ°Ņ ĐˇĐ°ĐģĐĩĐļĐŊĐžŅŅĐĩĐš"**.
+* ĐŖŅŅ ĐˇĐ°ĐģĐĩĐļĐŊĐžŅŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐŊĐž ĐēĐĩŅŅŅŅŅŅŅ ŅŅĐĩĐšĐŧвОŅĐēĐžĐŧ.
+* ĐŖŅŅ ĐˇĐ°ĐģĐĩĐļĐŊĐžŅŅŅ ĐŧĐžĐļŅŅŅ ĐžŅŅиĐŧŅваŅи даĐŊŅ Đˇ СаĐŋиŅŅв Ņ ŅОСŅиŅŅваŅи **ОйĐŧĐĩĐļĐĩĐŊĐŊŅ ĐžĐŋĐĩŅаŅŅŅ ĐˇĐ° ŅĐģŅŅ
ĐžĐŧ** Ņа авŅĐžĐŧаŅиŅĐŊŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ.
+* **ĐвŅĐžĐŧаŅиŅĐŊа ваĐģŅдаŅŅŅ** ĐŊавŅŅŅ Đ´ĐģŅ ĐŋаŅаĐŧĐĩŅŅŅв *ĐžĐŋĐĩŅаŅŅĐš ŅĐģŅŅ
Ņ*, виСĐŊаŅĐĩĐŊиŅ
Ņ ĐˇĐ°ĐģĐĩĐļĐŊĐžŅŅŅŅ
.
+* ĐŅĐ´ŅŅиĐŧĐēа ŅĐēĐģадĐŊиŅ
ŅиŅŅĐĩĐŧ авŅĐĩĐŊŅиŅŅĐēаŅŅŅ ĐēĐžŅиŅŅŅваŅŅв, **С'ŅĐ´ĐŊаĐŊŅ ŅС йаСаĐŧи даĐŊиŅ
** ŅĐžŅĐž.
+* **ĐОдĐŊиŅ
ОйĐŧĐĩĐļĐĩĐŊŅ** ŅОдО виĐēĐžŅиŅŅаĐŊĐŊŅ ĐąĐ°Đˇ даĐŊиŅ
, ŅŅĐžĐŊŅĐĩĐŊĐ´Ņв ŅĐžŅĐž, аĐģĐĩ вОдĐŊĐžŅĐ°Ņ ĐŋŅĐžŅŅа ŅĐŊŅĐĩĐŗŅаŅŅŅ Đˇ ŅŅŅĐŧа ĐŊиĐŧи.
+
+### ĐĐĩĐŧĐ°Ņ ĐžĐąĐŧĐĩĐļĐĩĐŊŅ ĐŊа "ĐŋĐģĐ°ĐŗŅĐŊи"
+
+ĐйО ŅĐŊŅиĐŧи ŅĐģОваĐŧи, вОĐŊи ĐŊĐĩ ĐŋĐžŅŅŅĐąĐŊŅ â ĐŋŅĐžŅŅĐž ŅĐŧĐŋĐžŅŅŅĐšŅĐĩ Ņа виĐēĐžŅиŅŅОвŅĐšŅĐĩ ĐŊĐĩОйŅ
ŅĐ´ĐŊиК ĐēОд.
+
+ĐŅĐ´Ņ-ŅĐēа ŅĐŊŅĐĩĐŗŅаŅŅŅ ŅĐŋŅĐžŅĐēŅОваĐŊа ĐŊаŅŅŅĐģŅĐēи ĐŋŅĐžŅŅĐž (С виĐēĐžŅиŅŅаĐŊĐŊŅĐŧ СаĐģĐĩĐļĐŊĐžŅŅĐĩĐš), ŅĐž ви ĐŧĐžĐļĐĩŅĐĩ ŅŅвОŅиŅи "ĐŋĐģĐ°ĐŗŅĐŊ" Đ´ĐģŅ ŅĐ˛ĐžĐŗĐž СаŅŅĐžŅŅĐŊĐēŅ Đ˛ŅŅĐžĐŗĐž Ņ 2 ŅŅĐ´ĐēаŅ
ĐēОдŅ, виĐēĐžŅиŅŅОвŅŅŅи ŅŅ ŅаĐŧŅ ŅŅŅŅĐēŅŅŅŅ Ņа ŅиĐŊŅаĐēŅиŅ, ŅĐž Đš Đ´ĐģŅ Đ˛Đ°ŅиŅ
*ĐžĐŋĐĩŅаŅŅĐš ŅĐģŅŅ
Ņ*.
+
+### ĐŅĐžŅĐĩŅŅОваĐŊĐž
+
+* 100% ĐŋĐžĐēŅиŅŅŅ ŅĐĩŅŅаĐŧи .
+* 100% аĐŊĐžŅОваĐŊа ŅиĐŋаĐŧи ĐēОдОва йаСа.
+* ĐиĐēĐžŅиŅŅОвŅŅŅŅŅŅ Ņ ŅОйОŅиŅ
ŅĐĩŅĐĩдОвиŅаŅ
.
+
+## ĐĐžĐļĐģивОŅŅŅ Starlette
+
+**FastAPI** ĐŋОвĐŊŅŅŅŅ ŅŅĐŧŅŅĐŊиК ŅС (Ņа ĐŋОйŅдОваĐŊиК ĐŊа ĐžŅĐŊОвŅ) Starlette . ĐĸĐžĐŧŅ ĐąŅĐ´Ņ-ŅĐēиК дОдаŅĐēОвиК ĐēОд Starlette, ŅĐēиК ви ĐŧаŅŅĐĩ, ŅаĐēĐžĐļ ĐŋŅаŅŅваŅиĐŧĐĩ.
+
+**FastAPI** ŅаĐēŅиŅĐŊĐž Ņ ĐŋŅĐ´ĐēĐģаŅĐžĐŧ **Starlette**. ĐĸĐžĐŧŅ, ŅĐēŅĐž ви вĐļĐĩ СĐŊаКОĐŧŅ ĐˇŅ Starlette айО виĐēĐžŅиŅŅОвŅŅŅĐĩ ĐšĐžĐŗĐž, ĐąŅĐģŅŅŅŅŅŅ ŅŅĐŊĐēŅŅĐžĐŊаĐģŅĐŊĐžŅŅŅ ĐŋŅаŅŅваŅиĐŧĐĩ ŅаĐē ŅаĐŧĐž.
+
+Đ **FastAPI** ви ĐžŅŅиĐŧŅŅŅĐĩ вŅŅ ĐŧĐžĐļĐģивОŅŅŅ **Starlette** (адĐļĐĩ FastAPI â ŅĐĩ, ĐŋĐž ŅŅŅŅ, Starlette ĐŊа ŅŅĐĩŅĐžŅдаŅ
):
+
+* РаСŅŅа ĐŋŅОдŅĐēŅивĐŊŅŅŅŅ. ĐĻĐĩ ОдиĐŊ ŅС ĐŊаКŅвидŅиŅ
ŅŅĐĩĐšĐŧвОŅĐēŅв ĐŊа Python , ĐŊа ŅŅвĐŊŅ Đˇ **NodeJS** Ņ **Go**.
+* ĐŅĐ´ŅŅиĐŧĐēа **WebSocket**.
+* ФОĐŊĐžĐ˛Ņ ĐˇĐ°Đ´Đ°ŅŅ Ņ ĐŋŅĐžŅĐĩŅŅ.
+* ĐОдŅŅ ĐˇĐ°ĐŋŅŅĐēŅ Ņа СавĐĩŅŅĐĩĐŊĐŊŅ ŅОйОŅи.
+* ĐĐģŅŅĐŊŅ Đ´ĐģŅ ŅĐĩŅŅŅваĐŊĐŊŅ, ĐŋОйŅдОваĐŊиК ĐŊа HTTPX.
+* ĐŅĐ´ŅŅиĐŧĐēа **CORS**, **GZip**, ŅŅаŅиŅĐŊиŅ
ŅаКĐģŅв, ĐŋĐžŅĐžĐēОвиŅ
вŅĐ´ĐŋОвŅĐ´ĐĩĐš.
+* ĐŅĐ´ŅŅиĐŧĐēа **ŅĐĩŅŅĐš** Ņ **cookie**.
+* 100% ĐŋĐžĐēŅиŅŅŅ ŅĐĩŅŅаĐŧи.
+* 100% аĐŊĐžŅОваĐŊа ŅиĐŋаĐŧи ĐēОдОва йаСа.
+
+## ĐĐžĐļĐģивОŅŅŅ Pydantic
+
+**FastAPI** ĐŋОвĐŊŅŅŅŅ ŅŅĐŧŅŅĐŊиК ŅС (Ņа ĐŋОйŅдОваĐŊиК ĐŊа ĐžŅĐŊОвŅ) Pydantic . ĐĸĐžĐŧŅ ĐąŅĐ´Ņ-ŅĐēиК дОдаŅĐēОвиК ĐēОд Pydantic, ŅĐēиК ви ĐŧаŅŅĐĩ, ŅаĐēĐžĐļ ĐŋŅаŅŅваŅиĐŧĐĩ.
+
+ĐĐēĐģŅŅаŅŅи СОвĐŊŅŅĐŊŅ ĐąŅĐąĐģŅĐžŅĐĩĐēи, ĐŋОйŅдОваĐŊŅ ŅаĐēĐžĐļ ĐŊа Pydantic, ŅаĐēŅ ŅĐē ORM , ODM Đ´ĐģŅ ĐąĐ°Đˇ даĐŊиŅ
.
+
+ĐĻĐĩ ŅаĐēĐžĐļ ОСĐŊаŅаŅ, ŅĐž в ĐąĐ°ĐŗĐ°ŅŅĐžŅ
виĐŋадĐēаŅ
ви ĐŧĐžĐļĐĩŅĐĩ ĐŋĐĩŅĐĩдаŅи ŅОК ŅаĐŧиК Ой'ŅĐēŅ, ŅĐēиК ĐžŅŅиĐŧŅŅŅĐĩ С СаĐŋиŅŅ, **ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž в ĐąĐ°ĐˇŅ Đ´Đ°ĐŊиŅ
**, ĐžŅĐēŅĐģŅĐēи вŅĐĩ авŅĐžĐŧаŅиŅĐŊĐž ĐŋĐĩŅĐĩвŅŅŅŅŅŅŅŅ.
+
+ĐĸĐĩ Đļ ŅаĐŧĐĩ вŅĐ´ĐąŅваŅŅŅŅŅ Đš Ņ ĐˇĐ˛ĐžŅĐžŅĐŊĐžĐŧŅ ĐŊаĐŋŅŅĐŧĐēŅ â Ņ ĐąĐ°ĐŗĐ°ŅŅĐžŅ
виĐŋадĐēаŅ
ви ĐŧĐžĐļĐĩŅĐĩ ĐŋŅĐžŅŅĐž ĐŋĐĩŅĐĩдаŅи Ой'ŅĐēŅ, ŅĐēиК ĐžŅŅиĐŧŅŅŅĐĩ С йаСи даĐŊиŅ
, **ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž ĐēĐģŅŅĐŊŅŅ**.
+
+Đ **FastAPI** ви ĐžŅŅиĐŧŅŅŅĐĩ вŅŅ ĐŧĐžĐļĐģивОŅŅŅ **Pydantic** (адĐļĐĩ FastAPI йаСŅŅŅŅŅŅ ĐŊа Pydantic Đ´ĐģŅ ĐžĐąŅОйĐēи вŅŅŅ
даĐŊиŅ
):
+
+* **ĐŅŅĐēĐžŅ ĐŋĐģŅŅаĐŊиĐŊи** :
+ * ĐĐĩ ĐŋĐžŅŅŅĐąĐŊĐž вŅиŅи ĐŊĐžĐ˛Ņ ĐŧĐžĐ˛Ņ Đ´ĐģŅ Đ˛Đ¸ĐˇĐŊаŅĐĩĐŊĐŊŅ ŅŅ
ĐĩĐŧ.
+ * Đ¯ĐēŅĐž ви СĐŊаŅŅĐĩ ŅиĐŋи Python, ви СĐŊаŅŅĐĩ, ŅĐē виĐēĐžŅиŅŅОвŅваŅи Pydantic.
+* ĐĐĩĐŗĐēĐž ĐŋŅаŅŅŅ Đˇ ваŅиĐŧ **IDE /ĐģŅĐŊŅĐĩŅĐžĐŧ /ĐŧОСĐēĐžĐŧ**:
+ * ĐŅĐēŅĐģŅĐēи ŅŅŅŅĐēŅŅŅи даĐŊиŅ
Pydantic Ņ ĐŋŅĐžŅŅĐž ĐĩĐēСĐĩĐŧĐŋĐģŅŅаĐŧи ĐēĐģаŅŅв, ŅĐēŅ Đ˛Đ¸ виСĐŊаŅаŅŅĐĩ; авŅОдОĐŋОвĐŊĐĩĐŊĐŊŅ, ĐģŅĐŊŅиĐŊĐŗ, mypy Ņ Đ˛Đ°Ņа ŅĐŊŅŅŅŅŅŅ ĐŋОвиĐŊĐŊŅ Đ´ĐžĐąŅĐĩ ĐŋŅаŅŅваŅи С ваŅиĐŧи ĐŋĐĩŅĐĩвŅŅĐĩĐŊиĐŧи даĐŊиĐŧи.
+* ĐаĐģŅдаŅŅŅ **ŅĐēĐģадĐŊиŅ
ŅŅŅŅĐēŅŅŅ**:
+ * ĐиĐēĐžŅиŅŅаĐŊĐŊŅ ŅŅŅаŅŅ
ŅŅĐŊиŅ
ĐŧОдĐĩĐģĐĩĐš Pydantic. Python `typing`, `List` Ņ `Dict` ŅĐžŅĐž.
+ * ĐаĐģŅдаŅĐžŅи дОСвОĐģŅŅŅŅ ŅŅŅĐēĐž Ņ ĐŋŅĐžŅŅĐž виСĐŊаŅаŅи, ĐŋĐĩŅĐĩвŅŅŅŅи Đš Đ´ĐžĐēŅĐŧĐĩĐŊŅŅваŅи ŅĐēĐģадĐŊŅ ŅŅ
ĐĩĐŧи даĐŊиŅ
Ņ Đ˛Đ¸ĐŗĐģŅĐ´Ņ JSON-ŅŅ
ĐĩĐŧи.
+ * Đи ĐŧĐžĐļĐĩŅĐĩ ĐŧаŅи ĐŗĐģийОĐēĐž **вĐēĐģадĐĩĐŊŅ JSON Ой'ŅĐēŅи** Ņа ĐŋĐĩŅĐĩвŅŅиŅи Ņа аĐŊĐžŅŅваŅи ŅŅ
вŅŅ.
+* **РОСŅиŅŅваĐŊŅŅŅŅ**:
+ * Pydantic дОСвОĐģŅŅ Đ˛Đ¸ĐˇĐŊаŅаŅи ĐēĐžŅиŅŅŅваŅŅĐēŅ ŅиĐŋи даĐŊиŅ
айО ŅОСŅиŅŅваŅи ваĐģŅдаŅŅŅ ĐŧĐĩŅОдаĐŧи в ĐŧОдĐĩĐģŅ Đ´ĐĩĐēĐžŅаŅĐžŅĐžĐŧ `validator`.
+* 100% ĐŋĐžĐēŅиŅŅŅ ŅĐĩŅŅаĐŧи.
diff --git a/docs/uk/docs/index.md b/docs/uk/docs/index.md
index 012bac2e2..b573ee259 100644
--- a/docs/uk/docs/index.md
+++ b/docs/uk/docs/index.md
@@ -6,7 +6,7 @@
-
+
diff --git a/docs/uk/docs/learn/index.md b/docs/uk/docs/learn/index.md
new file mode 100644
index 000000000..7f9f21e57
--- /dev/null
+++ b/docs/uk/docs/learn/index.md
@@ -0,0 +1,5 @@
+# ĐавŅаĐŊĐŊŅ
+
+ĐŖ ŅŅĐžĐŧŅ ŅОСдŅĐģŅ ĐŊадаĐŊŅ Đ˛ŅŅŅĐŋĐŊŅ Ņа ĐŊавŅаĐģŅĐŊŅ ĐŧаŅĐĩŅŅаĐģи Đ´ĐģŅ Đ˛Đ¸Đ˛ŅĐĩĐŊĐŊŅ FastAPI.
+
+ĐĻĐĩ ĐŧĐžĐļĐŊа ŅĐžĐˇĐŗĐģŅдаŅи ŅĐē **ĐēĐŊĐ¸ĐŗŅ**, **ĐēŅŅŅ**, айО **ĐžŅŅŅŅĐšĐŊиК** Ņа ŅĐĩĐēĐžĐŧĐĩĐŊдОваĐŊиК ŅĐŋĐžŅŅĐą ĐžŅвОŅŅи FastAPI. đ
diff --git a/docs/uk/docs/tutorial/background-tasks.md b/docs/uk/docs/tutorial/background-tasks.md
new file mode 100644
index 000000000..912ba8c2a
--- /dev/null
+++ b/docs/uk/docs/tutorial/background-tasks.md
@@ -0,0 +1,85 @@
+# ФОĐŊĐžĐ˛Ņ ĐˇĐ°Đ´Đ°ŅŅ
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ŅŅвОŅŅваŅи ŅĐžĐŊĐžĐ˛Ņ ĐˇĐ°Đ´Đ°ŅŅ, ŅĐēŅ ĐąŅĐ´ŅŅŅ Đ˛Đ¸ĐēĐžĐŊŅваŅиŅŅ *ĐŋŅŅĐģŅ* ĐŋОвĐĩŅĐŊĐĩĐŊĐŊŅ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ.
+
+ĐĻĐĩ ĐēĐžŅиŅĐŊĐž Đ´ĐģŅ ĐžĐŋĐĩŅаŅŅĐš, ŅĐēŅ ĐŋĐžŅŅŅĐąĐŊĐž виĐēĐžĐŊаŅи ĐŋŅŅĐģŅ ĐžĐąŅОйĐēи СаĐŋиŅŅ, аĐģĐĩ ĐēĐģŅŅĐŊŅŅ ĐŊĐĩ ОйОвâŅСĐēОвО ŅĐĩĐēаŅи СавĐĩŅŅĐĩĐŊĐŊŅ ŅŅŅŅ ĐžĐŋĐĩŅаŅŅŅ ĐŋĐĩŅĐĩĐ´ ĐžŅŅиĐŧаĐŊĐŊŅĐŧ вŅĐ´ĐŋОвŅĐ´Ņ.
+
+ĐŅиĐēĐģади виĐēĐžŅиŅŅаĐŊĐŊŅ:
+
+* ĐадŅиĐģаĐŊĐŊŅ email-ŅĐŋОвŅŅĐĩĐŊŅ ĐŋŅŅĐģŅ Đ˛Đ¸ĐēĐžĐŊаĐŊĐŊŅ ĐŋĐĩвĐŊĐžŅ Đ´ŅŅ:
+ * ĐŅĐ´ĐēĐģŅŅĐĩĐŊĐŊŅ Đ´Đž ĐŋĐžŅŅĐžĐ˛ĐžĐŗĐž ŅĐĩŅвĐĩŅа Ņа ĐŊадŅиĐģаĐŊĐŊŅ ĐģиŅŅа ĐŧĐžĐļĐĩ СаКĐŧаŅи ĐēŅĐģŅĐēа ŅĐĩĐēŅĐŊĐ´. Đи ĐŧĐžĐļĐĩŅĐĩ вŅĐ´ŅĐ°ĐˇŅ ĐŋОвĐĩŅĐŊŅŅи вŅĐ´ĐŋОвŅĐ´Ņ, а email вŅĐ´ĐŋŅавиŅи Ņ ŅĐžĐŊŅ.
+* ĐĐąŅОйĐēа даĐŊиŅ
:
+ * ĐаĐŋŅиĐēĐģад, ŅĐēŅĐž ĐžŅŅиĐŧаĐŊĐž ŅаКĐģ, ŅĐēиК ĐŋĐžŅŅŅĐąĐŊĐž ОйŅОйиŅи Đ´ĐžĐ˛ĐŗĐžŅŅиваĐģиĐŧ ĐŋŅĐžŅĐĩŅĐžĐŧ, ĐŧĐžĐļĐŊа ĐŋОвĐĩŅĐŊŅŅи вŅĐ´ĐŋОвŅĐ´Ņ "Accepted" ("ĐŅиКĐŊŅŅĐž", HTTP 202) Ņ Đ˛Đ¸ĐēĐžĐŊаŅи ОйŅОйĐēŅ ŅаКĐģŅ Ņ ŅĐžĐŊŅ.
+
+## ĐиĐēĐžŅиŅŅаĐŊĐŊŅ `BackgroundTasks`
+
+ĐĄĐŋĐžŅаŅĐēŅ ŅĐŧĐŋĐžŅŅŅĐšŅĐĩ `BackgroundTasks` Ņ Đ´ĐžĐ´Đ°ĐšŅĐĩ ĐšĐžĐŗĐž ŅĐē ĐŋаŅаĐŧĐĩŅŅ Ņ ĐаŅŅ *ŅŅĐŊĐēŅŅŅ ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ* (path operation function) Đ´Đž `BackgroundTasks`:
+
+{* ../../docs_src/background_tasks/tutorial001.py hl[1,13] *}
+
+**FastAPI** авŅĐžĐŧаŅиŅĐŊĐž ŅŅвОŅиŅŅ ĐžĐą'ŅĐēŅ `BackgroundTasks` Ņ ĐŋĐĩŅĐĩдаŅŅŅ ĐšĐžĐŗĐž Ņ ŅĐĩĐš ĐŋаŅаĐŧĐĩŅŅ.
+
+
+## ĐĄŅвОŅĐĩĐŊĐŊŅ ŅŅĐŊĐēŅŅŅ ĐˇĐ°Đ´Đ°ŅŅ
+
+ĐĄŅвОŅŅŅŅ ŅŅĐŊĐēŅŅŅ, ŅĐēа ĐąŅĐ´Đĩ виĐēĐžĐŊŅваŅи ŅĐžĐŊĐžĐ˛Ņ ĐˇĐ°Đ´Đ°ŅŅ.
+
+ĐĻĐĩ СвиŅаКĐŊа ŅŅĐŊĐēŅŅŅ, ŅĐēа ĐŧĐžĐļĐĩ ĐžŅŅиĐŧŅваŅи ĐŋаŅаĐŧĐĩŅŅи.
+
+ĐĐžĐŊа ĐŧĐžĐļĐĩ ĐąŅŅи аŅиĐŊŅ
ŅĐžĐŊĐŊĐžŅ `async def` айО СвиŅаКĐŊĐžŅ `def` ŅŅĐŊĐēŅŅŅŅ â **FastAPI** ОйŅОйиŅŅ ŅŅ ĐŋŅавиĐģŅĐŊĐž.
+
+ĐŖ ĐŊаŅĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ ŅŅĐŊĐēŅŅŅ ĐˇĐ°ĐŋиŅŅŅ Ņ ŅаКĐģ (ŅĐŧŅŅŅŅŅи ĐŊадŅиĐģаĐŊĐŊŅ email).
+
+Đ ĐžŅĐēŅĐģŅĐēи ĐžĐŋĐĩŅаŅŅŅ ĐˇĐ°ĐŋиŅŅ ĐŊĐĩ виĐēĐžŅиŅŅОвŅŅ `async` Ņа `await`, Đŧи виСĐŊаŅаŅĐŧĐž ŅŅĐŊĐēŅŅŅ ŅĐē СвиŅаКĐŊŅ `def`:
+
+{* ../../docs_src/background_tasks/tutorial001.py hl[6:9] *}
+
+## ĐОдаваĐŊĐŊŅ ŅĐžĐŊĐžĐ˛ĐžŅ ĐˇĐ°Đ´Đ°ŅŅ
+
+ĐŖŅĐĩŅĐĩдиĐŊŅ ĐаŅĐžŅ *ŅŅĐŊĐēŅŅŅ ĐžĐąŅОйĐēи ŅĐģŅŅ
Ņ*, ĐŋĐĩŅĐĩдаКŅĐĩ ŅŅĐŊĐēŅŅŅ ĐˇĐ°Đ´Đ°ŅŅ Đ˛ Ой'ŅĐēŅ *background tasks*, виĐēĐžŅиŅŅОвŅŅŅи ĐŧĐĩŅОд `.add_task()`:
+
+{* ../../docs_src/background_tasks/tutorial001.py hl[14] *}
+
+`.add_task()` ĐŋŅиКĐŧĐ°Ņ Đ°ŅĐŗŅĐŧĐĩĐŊŅи:
+
+* ФŅĐŊĐēŅŅŅ ĐˇĐ°Đ´Đ°Ņа, ŅĐēа ĐąŅĐ´Đĩ виĐēĐžĐŊŅваŅиŅŅ Ņ ŅĐžĐŊОвОĐŧŅ ŅĐĩĐļиĐŧŅ (`write_notification`). ĐвĐĩŅĐŊŅŅŅ ŅĐ˛Đ°ĐŗŅ, ŅĐž ĐŋĐĩŅĐĩдаŅŅŅŅŅ ĐžĐąĘŧŅĐēŅ ĐąĐĩС Đ´ŅĐļĐžĐē.
+* ĐŅĐ´Ņ-ŅĐēа ĐŋĐžŅĐģŅдОвĐŊŅŅŅŅ Đ°ŅĐŗŅĐŧĐĩĐŊŅŅв, ŅĐēŅ ĐŋĐžŅŅŅĐąĐŊĐž ĐŋĐĩŅĐĩдаŅи Ņ ŅŅĐŊĐēŅŅŅ ĐˇĐ°Đ˛Đ´Đ°ĐŊĐŊŅ Ņ Đ˛ŅĐ´ĐŋОвŅĐ´ĐŊĐžĐŧŅ ĐŋĐžŅŅĐ´ĐēŅ (`email`).
+* ĐŅĐ´Ņ-ŅĐēŅ ŅĐŧĐĩĐŊОваĐŊŅ Đ°ŅĐŗŅĐŧĐĩĐŊŅи, ŅĐēŅ ĐŋĐžŅŅŅĐąĐŊĐž ĐŋĐĩŅĐĩдаŅи Ņ ŅŅĐŊĐēŅŅŅ ĐˇĐ°Đ´Đ°ŅŅ (`message="some notification"`).
+
+## ĐĐŋŅОвадĐļĐĩĐŊĐŊŅ ĐˇĐ°ĐģĐĩĐļĐŊĐžŅŅĐĩĐš
+
+ĐиĐēĐžŅиŅŅаĐŊĐŊŅ `BackgroundTasks` ŅаĐēĐžĐļ ĐŋŅаŅŅŅ Đˇ ŅиŅŅĐĩĐŧĐžŅ Đ˛ĐŋŅОвадĐļĐĩĐŊĐŊŅ ĐˇĐ°ĐģĐĩĐļĐŊĐžŅŅĐĩĐš. Đи ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅиŅи ĐŋаŅаĐŧĐĩŅŅ ŅиĐŋŅ `BackgroundTasks` ĐŊа ŅŅСĐŊиŅ
ŅŅвĐŊŅŅ
: Ņ *ŅŅĐŊĐēŅŅŅ ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ*, Ņ ĐˇĐ°ĐģĐĩĐļĐŊĐžŅŅŅ (dependable), Ņ ĐŋŅĐ´ СаĐģĐĩĐļĐŊĐžŅŅŅ ŅĐžŅĐž.
+
+**FastAPI** СĐŊаŅ, ŅĐē Đ´ŅŅŅи в ĐēĐžĐļĐŊĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ Ņ ŅĐē ĐŋОвŅĐžŅĐŊĐž виĐēĐžŅиŅŅОвŅваŅи ОдиĐŊ Ņ ŅОК ŅаĐŧиК Ой'ŅĐēŅ, ŅОй ŅŅŅ ŅĐžĐŊĐžĐ˛Ņ ĐˇĐ°Đ´Đ°ŅŅ ĐąŅĐģи ОйâŅĐ´ĐŊаĐŊŅ Ņа виĐēĐžĐŊŅваĐģиŅŅ Ņ ŅĐžĐŊОвОĐŧŅ ŅĐĩĐļиĐŧŅ ĐŋŅŅĐģŅ ĐˇĐ°Đ˛ĐĩŅŅĐĩĐŊĐŊŅ ĐžŅĐŊОвĐŊĐžĐŗĐž СаĐŋиŅŅ.
+
+{* ../../docs_src/background_tasks/tutorial002_an_py310.py hl[13,15,22,25] *}
+
+ĐŖ ŅŅĐžĐŧŅ ĐŋŅиĐēĐģĐ°Đ´Ņ ĐŋОвŅĐ´ĐžĐŧĐģĐĩĐŊĐŊŅ ĐąŅĐ´ŅŅŅ ĐˇĐ°ĐŋиŅаĐŊŅ Ņ ŅаКĐģ `log.txt` *ĐŋŅŅĐģŅ* ŅĐžĐŗĐž, ŅĐē вŅĐ´ĐŋОвŅĐ´Ņ ĐąŅĐ´Đĩ ĐŊадŅŅĐģаĐŊа.
+
+Đ¯ĐēŅĐž Ņ ĐˇĐ°ĐŋиŅŅ ĐąŅв ĐŋĐĩŅĐĩдаĐŊиК query-ĐŋаŅаĐŧĐĩŅŅ, вŅĐŊ ĐąŅĐ´Đĩ СаĐŋиŅаĐŊиК Ņ ĐģĐžĐŗ Ņ ŅĐžĐŊОвŅĐš СадаŅŅ.
+
+Đ ĐŋĐžŅŅĐŧ ŅĐŊŅа ŅĐžĐŊОва СадаŅа, ŅĐēа ŅŅвОŅŅŅŅŅŅŅ Ņ *ŅŅĐŊĐēŅŅŅ ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ*, СаĐŋиŅĐĩ ĐŋОвŅĐ´ĐžĐŧĐģĐĩĐŊĐŊŅ Đˇ виĐēĐžŅиŅŅаĐŊĐŊŅĐŧ path ĐŋаŅаĐŧĐĩŅŅа `email`.
+
+## ĐĸĐĩŅ
ĐŊŅŅĐŊŅ Đ´ĐĩŅаĐģŅ
+
+ĐĐģĐ°Ņ `BackgroundTasks` ĐŋĐžŅ
ОдиŅŅ ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž С `starlette.background` .
+
+ĐŅĐŊ ŅĐŧĐŋĐžŅŅŅŅŅŅŅŅ ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž Ņ FastAPI, ŅОй Đи ĐŧĐžĐŗĐģи виĐēĐžŅиŅŅОвŅваŅи ĐšĐžĐŗĐž С `fastapi` Ņ Đ˛Đ¸ĐŋадĐēОвО ĐŊĐĩ ŅĐŧĐŋĐžŅŅŅваĐģи `BackgroundTask` (ĐąĐĩС s в ĐēŅĐŊŅŅ) С `starlette.background`.
+
+Đ¯ĐēŅĐž виĐēĐžŅиŅŅОвŅваŅи ĐģиŅĐĩ `BackgroundTasks` (а ĐŊĐĩ `BackgroundTask`), ŅĐž ĐšĐžĐŗĐž ĐŧĐžĐļĐŊа ĐŋĐĩŅĐĩдаваŅи ŅĐē ĐŋаŅаĐŧĐĩŅŅ Ņ *ŅŅĐŊĐēŅŅŅ ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ*, Ņ **FastAPI** ĐŋĐžĐ´ĐąĐ°Ņ ĐŋŅĐž вŅĐĩ ŅĐŊŅĐĩ, ŅаĐē ŅаĐŧĐž ŅĐē Ņ ĐŋŅĐž виĐēĐžŅиŅŅаĐŊĐŊŅ ĐžĐą'ŅĐēŅа `Request`.
+
+ĐĸаĐēĐžĐļ ĐŧĐžĐļĐŊа виĐēĐžŅиŅŅОвŅваŅи `BackgroundTask` ĐžĐēŅĐĩĐŧĐž в FastAPI, аĐģĐĩ Đ´ĐģŅ ŅŅĐžĐŗĐž ĐаĐŧ дОвĐĩĐ´ĐĩŅŅŅŅ ŅŅвОŅиŅи Ой'ŅĐēŅ Ņ ĐēĐžĐ´Ņ Ņа ĐŋОвĐĩŅĐŊŅŅи Starlette `Response`, вĐēĐģŅŅаŅŅи ĐšĐžĐŗĐž.
+
+ĐĐĩŅаĐģŅĐŊŅŅĐĩ ĐŧĐžĐļĐŊа ĐŋĐžŅиŅаŅи в ĐžŅŅŅŅĐšĐŊŅĐš Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ Starlette ĐŋŅĐž ŅĐžĐŊĐžĐ˛Ņ ĐˇĐ°Đ´Đ°ŅŅ .
+
+## ĐаŅŅĐĩŅĐĩĐļĐĩĐŊĐŊŅ
+
+Đ¯ĐēŅĐž ĐаĐŧ ĐŋĐžŅŅŅĐąĐŊĐž виĐēĐžĐŊŅваŅи ŅĐēĐģадĐŊŅ ŅĐžĐŊĐžĐ˛Ņ ĐžĐąŅиŅĐģĐĩĐŊĐŊŅ, Ņ ĐŋŅи ŅŅĐžĐŧŅ ĐŊĐĩĐŧа ĐŋĐžŅŅĐĩйи СаĐŋŅŅĐēаŅи ŅŅ
Ņ ŅĐžĐŧŅ Đļ ĐŋŅĐžŅĐĩŅŅ (ĐŊаĐŋŅиĐēĐģад, ĐŊĐĩ ĐŋĐžŅŅŅĐąĐŊĐž ŅĐŋŅĐģŅĐŊĐžĐŗĐž Đ´ĐžŅŅŅĐŋŅ Đ´Đž ĐŋаĐŧâŅŅŅ Ņи СĐŧŅĐŊĐŊиŅ
), ĐŧĐžĐļĐģивО, ваŅŅĐž ŅĐēĐžŅиŅŅаŅиŅŅ ĐąŅĐģŅŅ ĐŋĐžŅŅĐļĐŊиĐŧи ŅĐŊŅŅŅŅĐŧĐĩĐŊŅаĐŧи, ŅаĐēиĐŧи ŅĐē Celery .
+
+ĐĸаĐēŅ ŅĐŊŅŅŅŅĐŧĐĩĐŊŅи СаСвиŅаК ĐŋĐžŅŅĐĩĐąŅŅŅŅ ŅĐēĐģадĐŊŅŅĐžŅ ĐēĐžĐŊŅŅĐŗŅŅаŅŅŅ Ņа ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅа ŅĐĩŅĐŗĐ¸ ĐŋОвŅĐ´ĐžĐŧĐģĐĩĐŊŅ/СавдаĐŊŅ, ĐŊаĐŋŅиĐēĐģад, RabbitMQ айО Redis. ĐĐ´ĐŊаĐē вОĐŊи дОСвОĐģŅŅŅŅ Đ˛Đ¸ĐēĐžĐŊŅваŅи ŅĐžĐŊĐžĐ˛Ņ ĐˇĐ°Đ´Đ°ŅŅ Đ˛ ĐēŅĐģŅĐēĐžŅ
ĐŋŅĐžŅĐĩŅаŅ
Ņ ĐŊавŅŅŅ ĐŊа ĐēŅĐģŅĐēĐžŅ
ŅĐĩŅвĐĩŅаŅ
.
+
+Đ¯ĐēŅĐž Đļ ĐаĐŧ ĐŋĐžŅŅŅĐąĐŊĐž ĐžŅŅиĐŧаŅи Đ´ĐžŅŅŅĐŋ Đ´Đž СĐŧŅĐŊĐŊиŅ
Ņ ĐžĐąâŅĐēŅŅв ŅС ŅŅŅŅ Đļ **FastAPI** - ĐŋŅĐžĐŗŅаĐŧи айО виĐēĐžĐŊŅваŅи ĐŊĐĩвĐĩĐģиĐēŅ ŅĐžĐŊĐžĐ˛Ņ ĐˇĐ°Đ˛Đ´Đ°ĐŊĐŊŅ (ĐŊаĐŋŅиĐēĐģад, ĐŊадŅиĐģаŅи ŅĐŋОвŅŅĐĩĐŊĐŊŅ ĐĩĐģĐĩĐēŅŅĐžĐŊĐŊĐžŅ ĐŋĐžŅŅĐžŅ), Đ´ĐžŅŅаŅĐŊŅĐž ĐŋŅĐžŅŅĐž виĐēĐžŅиŅŅОвŅваŅи `BackgroundTasks`.
+
+## ĐŅĐ´ŅŅĐŧĐžĐē
+
+ĐĐŧĐŋĐžŅŅŅĐšŅĐĩ Ņа виĐēĐžŅиŅŅОвŅĐšŅĐĩ `BackgroundTasks` ŅĐē ĐŋаŅаĐŧĐĩŅŅ Ņ *ŅŅĐŊĐēŅŅŅŅ
ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ* Ņа СаĐģĐĩĐļĐŊĐžŅŅŅŅ
, ŅОй дОдаваŅи ŅĐžĐŊĐžĐ˛Ņ ĐˇĐ°Đ´Đ°ŅŅ.
diff --git a/docs/uk/docs/tutorial/body-multiple-params.md b/docs/uk/docs/tutorial/body-multiple-params.md
new file mode 100644
index 000000000..e2acf8a70
--- /dev/null
+++ b/docs/uk/docs/tutorial/body-multiple-params.md
@@ -0,0 +1,170 @@
+# ĐĸŅĐģĐž СаĐŋиŅŅ - ĐĐĩĐēŅĐģŅĐēа ĐŋаŅаĐŧĐĩŅŅŅв
+
+ĐĸĐĩĐŋĐĩŅ, ĐēĐžĐģи Đŧи ŅĐžĐˇĐŗĐģŅĐŊŅĐģи виĐēĐžŅиŅŅаĐŊĐŊŅ `Path` Ņа `Query`, ŅĐžĐˇĐŗĐģŅĐŊŅĐŧĐž ĐąŅĐģŅŅ ĐŋŅĐžŅŅĐŊŅŅŅ ŅĐŋĐžŅОйи ĐžĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ ŅŅĐģа СаĐŋиŅŅ Đ˛ **FastAPI**.
+
+## ĐĐŧŅŅŅваĐŊĐŊŅ `Path`, `Query` Ņа ĐŋаŅаĐŧĐĩŅŅŅв ŅŅĐģа СаĐŋиŅŅ
+
+ĐĐž-ĐŋĐĩŅŅĐĩ, СвŅŅĐŊĐž, Đи ĐŧĐžĐļĐĩŅĐĩ вŅĐģŅĐŊĐž СĐŧŅŅŅваŅи ĐžĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ ĐŋаŅаĐŧĐĩŅŅŅв `Path`, `Query` Ņа ŅŅĐģа СаĐŋиŅŅ, Ņ **FastAPI** ĐŋŅавиĐģŅĐŊĐž ŅŅ
ОйŅОйиŅŅ.
+
+ĐĸаĐēĐžĐļ Đи ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅиŅи ĐŋаŅаĐŧĐĩŅŅи ŅŅĐģа ŅĐē ĐŊĐĩОйОвâŅСĐēОвŅ, вŅŅаĐŊОвивŅи Đ´ĐģŅ ĐŊиŅ
СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ `None`:
+
+{* ../../docs_src/body_multiple_params/tutorial001_an_py310.py hl[18:20] *}
+
+/// note | ĐŅиĐŧŅŅĐēа
+
+ĐвĐĩŅĐŊŅŅŅ ŅĐ˛Đ°ĐŗŅ, ŅĐž в ŅŅĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ ĐŋаŅаĐŧĐĩŅŅ `item`, ŅĐēиК ĐąĐĩŅĐĩŅŅŅŅ Đˇ ŅŅĐģа СаĐŋиŅŅ, Ņ ĐŊĐĩОйОв'ŅСĐēОвиĐŧ, ĐžŅĐēŅĐģŅĐēи ĐŧĐ°Ņ ĐˇĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ `None`.
+
+///
+
+## ĐĐĩĐēŅĐģŅĐēа ĐŋаŅаĐŧĐĩŅŅŅв ŅŅĐģа СаĐŋиŅŅ
+
+ĐŖ ĐŋĐžĐŋĐĩŅĐĩĐ´ĐŊŅĐžĐŧŅ ĐŋŅиĐēĐģĐ°Đ´Ņ *ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ* ĐžŅŅĐēŅваĐģа JSON С аŅŅийŅŅаĐŧи `Item`, ĐŊаĐŋŅиĐēĐģад:
+
+```JSON
+{
+ "name": "Foo",
+ "description": "The pretender",
+ "price": 42.0,
+ "tax": 3.2
+}
+```
+ĐĐģĐĩ Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅиŅи Đ´ĐĩĐēŅĐģŅĐēа ĐŋаŅаĐŧĐĩŅŅŅв ŅŅĐģа, ĐŊаĐŋŅиĐēĐģад `item` Ņа `user`:
+
+{* ../../docs_src/body_multiple_params/tutorial002_py310.py hl[20] *}
+
+ĐŖ ŅŅĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ **FastAPI** ŅОСĐŋŅСĐŊаŅ, ŅĐž Ņ ĐēŅĐģŅĐēа ĐŋаŅаĐŧĐĩŅŅŅв ŅŅĐģа (два ĐŋаŅаĐŧĐĩŅŅи Ņ ĐŧОдĐĩĐģŅĐŧи Pydantic).
+
+ĐĸĐžĐŧŅ Đ˛ŅĐŊ виĐēĐžŅиŅŅĐ°Ņ ĐŊаСви ĐŋаŅаĐŧĐĩŅŅŅв ŅĐē ĐēĐģŅŅŅ (ĐŊаСви ĐŋĐžĐģŅв) Ņ ŅŅĐģŅ ĐˇĐ°ĐŋиŅŅ, ĐžŅŅĐēŅŅŅи:
+
+```JSON
+{
+ "item": {
+ "name": "Foo",
+ "description": "The pretender",
+ "price": 42.0,
+ "tax": 3.2
+ },
+ "user": {
+ "username": "dave",
+ "full_name": "Dave Grohl"
+ }
+}
+```
+
+/// note | ĐŅиĐŧŅŅĐēа
+
+ĐвĐĩŅĐŊŅŅŅ ŅĐ˛Đ°ĐŗŅ, ŅĐž Ņ
ĐžŅа `item` ĐžĐŗĐžĐģĐžŅĐĩĐŊĐž, ŅаĐē ŅаĐŧĐž ŅĐē Ņ ŅаĐŊŅŅĐĩ, ŅĐĩĐŋĐĩŅ Đ˛ŅĐŊ ĐžŅŅĐēŅŅŅŅŅŅ Đ˛ ŅŅĐģŅ ĐŋŅĐ´ ĐēĐģŅŅĐĩĐŧ `item`.
+
+///
+
+**FastAPI** авŅĐžĐŧаŅиŅĐŊĐž ĐēĐžĐŊвĐĩŅŅŅŅ Đ´Đ°ĐŊŅ ŅС СаĐŋиŅŅ ŅаĐēиĐŧ ŅиĐŊĐžĐŧ, ŅОй ĐŋаŅаĐŧĐĩŅŅ `item` ĐžŅŅиĐŧав ŅвŅĐš вĐŧŅŅŅ, Ņ ŅĐĩ Đļ ŅаĐŧĐĩ ŅŅĐžŅŅŅŅŅŅŅ `user`.
+
+ĐŅĐŊ виĐēĐžĐŊĐ°Ņ Đ˛Đ°ĐģŅдаŅŅŅ ŅĐēĐģадĐĩĐŊиŅ
даĐŊиŅ
Ņ ĐˇĐ°Đ´ĐžĐēŅĐŧĐĩĐŊŅŅŅ ŅŅ
вŅĐ´ĐŋОвŅĐ´ĐŊиĐŧ ŅиĐŊĐžĐŧ Ņ ŅŅ
ĐĩĐŧŅ OpenAPI Ņа в авŅĐžĐŧаŅиŅĐŊŅĐš Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ.
+
+## ĐдиĐŊиŅĐŊŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ Đ˛ ŅŅĐģŅ ĐˇĐ°ĐŋиŅŅ
+
+ĐĸаĐē ŅаĐŧĐž ŅĐē Ņ `Query` Ņ `Path` Đ´ĐģŅ Đ˛Đ¸ĐˇĐŊаŅĐĩĐŊĐŊŅ Đ´ĐžĐ´Đ°ŅĐēОвиŅ
даĐŊиŅ
Đ´ĐģŅ ĐŋаŅаĐŧĐĩŅŅŅв СаĐŋиŅŅ Ņа ŅĐģŅŅ
Ņ, **FastAPI** ĐŊĐ°Đ´Đ°Ņ ĐĩĐēвŅваĐģĐĩĐŊŅĐŊиК `Body`.
+
+ĐаĐŋŅиĐēĐģад, ŅОСŅиŅŅŅŅи ĐŋĐžĐŋĐĩŅĐĩĐ´ĐŊŅ ĐŧОдĐĩĐģŅ, Đи ĐŧĐžĐļĐĩŅĐĩ виŅŅŅиŅи дОдаŅи ŅĐĩ ОдиĐŊ ĐēĐģŅŅ `importance` в ŅĐĩ Đļ ŅаĐŧĐĩ ŅŅĐģĐž СаĐŋиŅŅ ŅаСОĐŧ ŅС `item` Ņ `user`.
+
+Đ¯ĐēŅĐž Đи ĐžĐŗĐžĐģĐžŅиŅĐĩ ĐšĐžĐŗĐž ŅĐē Ņ, ŅĐž, ĐžŅĐēŅĐģŅĐēи ŅĐĩ ОдиĐŊиŅĐŊĐĩ СĐŊаŅĐĩĐŊĐŊŅ, **FastAPI** ĐŋŅиĐŋŅŅĐēаŅиĐŧĐĩ, ŅĐž ŅĐĩ ĐŋаŅаĐŧĐĩŅŅ ĐˇĐ°ĐŋиŅŅ (query parameter).
+
+ĐĐģĐĩ Đи ĐŧĐžĐļĐĩŅĐĩ вĐēаСаŅи **FastAPI** ОйŅОйĐģŅŅи ĐšĐžĐŗĐž ŅĐē ŅĐŊŅиК ĐēĐģŅŅ ŅŅĐģа (body key), виĐēĐžŅиŅŅОвŅŅŅи `Body`:
+
+{* ../../docs_src/body_multiple_params/tutorial003_an_py310.py hl[23] *}
+
+ĐŖ ŅŅĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ **FastAPI** ĐžŅŅĐēŅваŅиĐŧĐĩ ŅŅĐģĐž СаĐŋиŅŅ Ņ ŅаĐēĐžĐŧŅ Đ˛Đ¸ĐŗĐģŅĐ´Ņ:
+
+```JSON
+{
+ "item": {
+ "name": "Foo",
+ "description": "The pretender",
+ "price": 42.0,
+ "tax": 3.2
+ },
+ "user": {
+ "username": "dave",
+ "full_name": "Dave Grohl"
+ },
+ "importance": 5
+}
+```
+ĐĐŊĐžĐ˛Ņ Đļ ŅаĐēи, **FastAPI** ĐēĐžĐŊвĐĩŅŅŅваŅиĐŧĐĩ ŅиĐŋи даĐŊиŅ
, ĐŋĐĩŅĐĩвŅŅŅŅиĐŧĐĩ ŅŅ
, ŅŅвОŅŅваŅиĐŧĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ ŅĐžŅĐž.
+
+## ĐĐĩĐēŅĐģŅĐēа body Ņа query ĐŋаŅаĐŧĐĩŅŅŅв
+
+ĐвŅŅĐŊĐž, Đи ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅŅваŅи дОдаŅĐēĐžĐ˛Ņ query ĐŋаŅаĐŧĐĩŅŅи СаĐŋиŅŅ, ĐēĐžĐģи ŅĐĩ ĐŊĐĩОйŅ
ŅĐ´ĐŊĐž, ĐŊа дОдаŅĐžĐē Đ´Đž ĐąŅĐ´Ņ-ŅĐēиŅ
ĐŋаŅаĐŧĐĩŅŅŅв ŅŅĐģа СаĐŋиŅŅ.
+
+ĐŅĐēŅĐģŅĐēи Са СаĐŧОвŅŅваĐŊĐŊŅĐŧ ĐžĐēŅĐĩĐŧŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ ŅĐŊŅĐĩŅĐŋŅĐĩŅŅŅŅŅŅŅ ŅĐē ĐŋаŅаĐŧĐĩŅŅи СаĐŋиŅŅ, ĐаĐŧ ĐŊĐĩ ĐŋĐžŅŅŅĐąĐŊĐž ŅвĐŊĐž дОдаваŅи `Query`, ĐŧĐžĐļĐŊа ĐŋŅĐžŅŅĐž виĐēĐžŅиŅŅаŅи:
+
+```Python
+q: Union[str, None] = None
+```
+
+ĐйО в Python 3.10 Ņа виŅĐĩ:
+
+```Python
+q: str | None = None
+```
+
+ĐаĐŋŅиĐēĐģад:
+
+{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
+
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+`Body` ŅаĐēĐžĐļ ĐŧĐ°Ņ ŅŅ ŅаĐŧŅ Đ´ĐžĐ´Đ°ŅĐēĐžĐ˛Ņ ĐŋаŅаĐŧĐĩŅŅи ваĐģŅдаŅŅŅ Ņа ĐŧĐĩŅадаĐŊиŅ
, ŅĐž Đš `Query`, `Path` Ņа ŅĐŊŅŅ, ŅĐēŅ Đи ĐŋОйаŅиŅĐĩ ĐŋŅСĐŊŅŅĐĩ.
+
+///
+
+## ĐĐēĐģадĐĩĐŊиК ĐŋООдиĐŊĐžĐēиК ĐŋаŅаĐŧĐĩŅŅ ŅŅĐģа СаĐŋиŅŅ
+
+ĐŅиĐŋŅŅŅиĐŧĐž, Ņ Đ˛Đ°Ņ Ņ ĐģиŅĐĩ ОдиĐŊ ĐŋаŅаĐŧĐĩŅŅ ŅŅĐģа СаĐŋиŅŅ `item` С ĐŧОдĐĩĐģŅ Pydantic `Item`.
+
+Đа СаĐŧОвŅŅваĐŊĐŊŅĐŧ **FastAPI** ĐžŅŅĐēŅваŅиĐŧĐĩ, ŅĐž ŅŅĐģĐž СаĐŋиŅŅ ĐŧŅŅŅиŅиĐŧĐĩ вĐŧŅŅŅ ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž.
+
+ĐĐģĐĩ ŅĐēŅĐž Đи Ņ
ĐžŅĐĩŅĐĩ, ŅОй вŅĐŊ ĐžŅŅĐēŅвав JSON С ĐēĐģŅŅĐĩĐŧ `item`, а вŅĐĩŅĐĩдиĐŊŅ â вĐŧŅŅŅ ĐŧОдĐĩĐģŅ (ŅаĐē, ŅĐē ŅĐĩ вŅĐ´ĐąŅваŅŅŅŅŅ ĐŋŅи ĐžĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ Đ´ĐžĐ´Đ°ŅĐēОвиŅ
ĐŋаŅаĐŧĐĩŅŅŅв ŅŅĐģа), Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅаŅи ŅĐŋĐĩŅŅаĐģŅĐŊиК ĐŋаŅаĐŧĐĩŅŅ `Body` â `embed`:
+
+```Python
+item: Item = Body(embed=True)
+```
+
+ŅĐē Ņ ĐŋŅиĐēĐģадŅ:
+
+{* ../../docs_src/body_multiple_params/tutorial005_an_py310.py hl[17] *}
+
+ĐŖ ŅŅĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ **FastAPI** ĐžŅŅĐēŅваŅиĐŧĐĩ ŅŅĐģĐž СаĐŋиŅŅ ŅаĐēĐžĐŗĐž Đ˛Đ¸ĐŗĐģŅĐ´Ņ:
+
+```JSON hl_lines="2"
+{
+ "item": {
+ "name": "Foo",
+ "description": "The pretender",
+ "price": 42.0,
+ "tax": 3.2
+ }
+}
+```
+
+СаĐŧŅŅŅŅ:
+
+```JSON
+{
+ "name": "Foo",
+ "description": "The pretender",
+ "price": 42.0,
+ "tax": 3.2
+}
+```
+
+## ĐŅĐ´ŅŅĐŧĐžĐē
+
+Đи ĐŧĐžĐļĐĩŅĐĩ дОдаваŅи ĐēŅĐģŅĐēа ĐŋаŅаĐŧĐĩŅŅŅв ŅŅĐģа Đ´Đž ĐаŅĐžŅ *ŅŅĐŊĐēŅŅŅ ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ* (*path operation function*), ĐŊавŅŅŅ ŅĐēŅĐž СаĐŋĐ¸Ņ ĐŧĐžĐļĐĩ ĐŧаŅи ĐģиŅĐĩ ОдĐŊĐĩ ŅŅĐģĐž.
+
+ĐĐģĐĩ **FastAPI** ОйŅОйиŅŅ ŅĐĩ, ĐŊадаŅŅŅ ĐаĐŧ ĐŋĐžŅŅŅĐąĐŊŅ Đ´Đ°ĐŊŅ Ņ ŅŅĐŊĐēŅŅŅ, ĐŋĐĩŅĐĩвŅŅиŅŅ ŅŅ
Ņа СадОĐēŅĐŧĐĩĐŊŅŅŅ ĐēĐžŅĐĩĐēŅĐŊŅ ŅŅ
ĐĩĐŧŅ Đ˛ *ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ*.
+
+ĐĸаĐēĐžĐļ Đи ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅŅваŅи ĐžĐēŅĐĩĐŧŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ, ŅĐēŅ ĐąŅĐ´ŅŅŅ ĐžŅŅиĐŧаĐŊŅ ŅĐē ŅаŅŅиĐŊа ŅŅĐģа СаĐŋиŅŅ.
+
+ĐŅŅĐŧ ŅĐžĐŗĐž, Đи ĐŧĐžĐļĐĩŅĐĩ вĐēаСаŅи **FastAPI** вйŅдОвŅваŅи ŅŅĐģĐž в ĐēĐģŅŅ, ĐŊавŅŅŅ ŅĐēŅĐž ĐžĐŗĐžĐģĐžŅĐĩĐŊĐž ĐģиŅĐĩ ОдиĐŊ ĐŋаŅаĐŧĐĩŅŅ.
diff --git a/docs/uk/docs/tutorial/body-nested-models.md b/docs/uk/docs/tutorial/body-nested-models.md
new file mode 100644
index 000000000..abc33f2eb
--- /dev/null
+++ b/docs/uk/docs/tutorial/body-nested-models.md
@@ -0,0 +1,245 @@
+# ĐĸŅĐģĐž СаĐŋиŅŅ - ĐĐēĐģадĐĩĐŊŅ ĐŧОдĐĩĐģŅ
+
+Đ **FastAPI** Đи ĐŧĐžĐļĐĩŅĐĩ виСĐŊаŅаŅи, ĐŋĐĩŅĐĩвŅŅŅŅи, Đ´ĐžĐēŅĐŧĐĩĐŊŅŅваŅи Ņа виĐēĐžŅиŅŅОвŅваŅи ĐŧОдĐĩĐģŅ, ŅĐēŅ ĐŧĐžĐļŅŅŅ ĐąŅŅи вĐēĐģадĐĩĐŊŅ ĐŊа ĐąŅĐ´Ņ-ŅĐēŅ ĐŗĐģийиĐŊŅ (СавдŅĐēи Pydantic).
+
+## ĐĐžĐģŅ ŅĐŋиŅĐēŅ
+
+Đи ĐŧĐžĐļĐĩŅĐĩ виСĐŊаŅиŅи аŅŅийŅŅ ŅĐē ĐŋŅĐ´ŅиĐŋ. ĐаĐŋŅиĐēĐģад, Python-ŅĐŋиŅĐžĐē (`list`):
+
+{* ../../docs_src/body_nested_models/tutorial001_py310.py hl[12] *}
+
+ĐĻĐĩ СŅОйиŅŅ `tags` ŅĐŋиŅĐēĐžĐŧ, Ņ
ĐžŅа ĐŊĐĩ виСĐŊаŅаŅŅŅŅŅ ŅиĐŋ ĐĩĐģĐĩĐŧĐĩĐŊŅŅв ŅĐŋиŅĐēŅ.
+
+## ĐĐžĐģŅ ŅĐŋиŅĐēŅ Đˇ ĐŋаŅаĐŧĐĩŅŅĐžĐŧ ŅиĐŋŅ
+
+ĐĐģĐĩ Python ĐŧĐ°Ņ ŅĐŋĐĩŅиŅŅŅĐŊиК ŅĐŋĐžŅŅĐą ĐžĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ ŅĐŋиŅĐēŅв С вĐŊŅŅŅŅŅĐŊŅĐŧи ŅиĐŋаĐŧи айО "ĐŋаŅаĐŧĐĩŅŅаĐŧи ŅиĐŋŅ":
+### ĐĐŧĐŋĐžŅŅŅŅĐŧĐž `List` С ĐŧОдŅĐģŅ typing
+
+ĐŖ Python 3.9 Ņ Đ˛Đ¸ŅĐĩ ĐŧĐžĐļĐŊа виĐēĐžŅиŅŅОвŅваŅи ŅŅаĐŊдаŅŅĐŊиК `list` Đ´ĐģŅ ĐžĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ ŅаĐēиŅ
ŅиĐŋŅв, ŅĐē Đŧи ĐŋОйаŅиĐŧĐž ĐŊиĐļŅĐĩ. đĄ
+
+ĐĐģĐĩ в Python вĐĩŅŅŅŅ Đ´Đž 3.9 (вŅĐ´ 3.6 Ņ Đ˛Đ¸ŅĐĩ) ŅĐŋĐžŅаŅĐēŅ ĐŋĐžŅŅŅĐąĐŊĐž ŅĐŧĐŋĐžŅŅŅваŅи `List` С ĐŧОдŅĐģŅ ŅŅаĐŊдаŅŅĐŊĐžŅ ĐąŅĐąĐģŅĐžŅĐĩĐēи Python `typing`:
+
+{* ../../docs_src/body_nested_models/tutorial002.py hl[1] *}
+
+### ĐĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ `list` С ĐŋаŅаĐŧĐĩŅŅĐžĐŧ ŅиĐŋŅ
+
+ЊОй ĐžĐŗĐžĐģĐžŅиŅи ŅиĐŋи С ĐŋаŅаĐŧĐĩŅŅаĐŧи ŅиĐŋŅ (вĐŊŅŅŅŅŅĐŊŅĐŧи ŅиĐŋаĐŧи), ŅаĐēиĐŧи ŅĐē `list`, `dict`, `tuple`:
+
+* Đ¯ĐēŅĐž Đи виĐēĐžŅиŅŅОвŅŅŅĐĩ вĐĩŅŅŅŅ Python Đ´Đž 3.9, ŅĐŧĐŋĐžŅŅŅĐšŅĐĩ ŅŅ
вŅĐ´ĐŋОвŅĐ´ĐŊŅ Đ˛ĐĩŅŅŅŅ Đˇ ĐŧОдŅĐģŅ `typing`.
+* ĐĐĩŅĐĩдаКŅĐĩ вĐŊŅŅŅŅŅĐŊŅ ŅиĐŋи ŅĐē "ĐŋаŅаĐŧĐĩŅŅи ŅиĐŋŅ", виĐēĐžŅиŅŅОвŅŅŅи ĐēвадŅаŅĐŊŅ Đ´ŅĐļĐēи: `[` and `]`.
+
+ĐŖ Python 3.9 ŅĐĩ ĐąŅĐ´Đĩ Đ˛Đ¸ĐŗĐģŅдаŅи ŅаĐē:
+
+```Python
+my_list: list[str]
+```
+
+ĐŖ вĐĩŅŅŅŅŅ
Python Đ´Đž 3.9 ŅĐĩ Đ˛Đ¸ĐŗĐģŅĐ´Đ°Ņ ŅаĐē:
+
+```Python
+from typing import List
+
+my_list: List[str]
+```
+
+ĐĻĐĩ ŅŅаĐŊдаŅŅĐŊиК ŅиĐŊŅаĐēŅĐ¸Ņ Python Đ´ĐģŅ ĐžĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ ŅиĐŋŅв.
+
+ĐиĐēĐžŅиŅŅОвŅĐšŅĐĩ ŅОК ŅаĐŧиК ŅŅаĐŊдаŅŅĐŊиК ŅиĐŊŅаĐēŅĐ¸Ņ Đ´ĐģŅ Đ°ŅŅийŅŅŅв ĐŧОдĐĩĐģĐĩĐš С вĐŊŅŅŅŅŅĐŊŅĐŧи ŅиĐŋаĐŧи.
+
+ĐŅĐļĐĩ, Ņ ĐŊаŅĐžĐŧŅ ĐŋŅиĐēĐģадŅ, Đŧи ĐŧĐžĐļĐĩĐŧĐž СŅОйиŅи `tags` ŅаĐŧĐĩ "ŅĐŋиŅĐēĐžĐŧ ŅŅĐ´ĐēŅв":
+
+{* ../../docs_src/body_nested_models/tutorial002_py310.py hl[12] *}
+
+## ĐĸиĐŋи ĐŧĐŊĐžĐļиĐŊ
+
+ĐĐģĐĩ ĐŋĐžŅŅĐŧ Đŧи ĐŋОдŅĐŧаĐģи, ŅĐž ŅĐĩĐŗĐ¸ ĐŊĐĩ ĐŋОвиĐŊĐŊŅ ĐŋОвŅĐžŅŅваŅиŅŅ, вОĐŊи, ĐšĐŧОвŅŅĐŊĐž, ĐŋОвиĐŊĐŊŅ ĐąŅŅи ŅĐŊŅĐēаĐģŅĐŊиĐŧи ŅŅĐ´ĐēаĐŧи.
+
+Đ Python ĐŧĐ°Ņ ŅĐŋĐĩŅŅаĐģŅĐŊиК ŅиĐŋ даĐŊиŅ
Đ´ĐģŅ ĐŧĐŊĐžĐļиĐŊ ŅĐŊŅĐēаĐģŅĐŊиŅ
ĐĩĐģĐĩĐŧĐĩĐŊŅŅв â ŅĐĩ `set`.
+
+ĐĸĐžĐŧŅ Đŧи ĐŧĐžĐļĐĩĐŧĐž ĐžĐŗĐžĐģĐžŅиŅи `tags` ŅĐē ĐŧĐŊĐžĐļиĐŊŅ ŅŅĐ´ĐēŅв:
+
+{* ../../docs_src/body_nested_models/tutorial003_py310.py hl[12] *}
+
+ĐавŅŅŅ ŅĐēŅĐž Đи ĐžŅŅиĐŧаŅŅĐĩ СаĐŋĐ¸Ņ Đˇ Đ´ŅĐąĐģŅОваĐŊиĐŧи даĐŊиĐŧи, вŅĐŊ ĐąŅĐ´Đĩ ĐŋĐĩŅĐĩŅвОŅĐĩĐŊиК Ņ ĐŧĐŊĐžĐļиĐŊŅ ŅĐŊŅĐēаĐģŅĐŊиŅ
ĐĩĐģĐĩĐŧĐĩĐŊŅŅв.
+
+Đ ĐēĐžĐģи Đи ĐąŅĐ´ĐĩŅĐĩ вивОдиŅи ŅŅ Đ´Đ°ĐŊŅ, ĐŊавŅŅŅ ŅĐēŅĐž Đ´ĐļĐĩŅĐĩĐģĐž ĐŧŅŅŅиŅŅ Đ´ŅĐąĐģŅĐēаŅи, вОĐŊи ĐąŅĐ´ŅŅŅ Đ˛Đ¸Đ˛ĐĩĐ´ĐĩĐŊŅ ŅĐē ĐŧĐŊĐžĐļиĐŊа ŅĐŊŅĐēаĐģŅĐŊиŅ
ĐĩĐģĐĩĐŧĐĩĐŊŅŅв.
+
+Đ ŅĐĩ ĐąŅĐ´Đĩ аĐŊĐžŅОваĐŊĐž/Đ´ĐžĐēŅĐŧĐĩĐŊŅОваĐŊĐž вŅĐ´ĐŋОвŅĐ´ĐŊĐž.
+
+## ĐĐēĐģадĐĩĐŊŅ ĐŧОдĐĩĐģŅ
+
+ĐĐžĐļĐĩĐŊ аŅŅийŅŅ ĐŧОдĐĩĐģŅ Pydantic ĐŧĐ°Ņ ŅиĐŋ.
+
+ĐĐģĐĩ ŅĐĩĐš ŅиĐŋ ŅаĐŧ ĐŧĐžĐļĐĩ ĐąŅŅи ŅĐŊŅĐžŅ ĐŧОдĐĩĐģĐģŅ Pydantic.
+
+ĐŅĐļĐĩ, Đи ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅиŅи ĐŗĐģийОĐēĐž вĐēĐģадĐĩĐŊŅ JSON "Ой'ŅĐēŅи" С ĐēĐžĐŊĐēŅĐĩŅĐŊиĐŧи ŅĐŧĐĩĐŊаĐŧи аŅŅийŅŅŅв, ŅиĐŋаĐŧи Ņа ĐŋĐĩŅĐĩвŅŅĐēаĐŧи.
+
+ĐŖŅĐĩ ŅĐĩ, вĐēĐģадĐĩĐŊĐĩ ĐąĐĩС ОйĐŧĐĩĐļĐĩĐŊŅ.
+
+### ĐиСĐŊаŅĐĩĐŊĐŊŅ ĐŋŅĐ´ĐŧОдĐĩĐģŅ
+
+ĐаĐŋŅиĐēĐģад, Đŧи ĐŧĐžĐļĐĩĐŧĐž виСĐŊаŅиŅи ĐŧОдĐĩĐģŅ `Image`:
+
+{* ../../docs_src/body_nested_models/tutorial004_py310.py hl[7:9] *}
+
+### ĐиĐēĐžŅиŅŅаĐŊĐŊŅ ĐŋŅĐ´ĐŧОдĐĩĐģŅ ŅĐē ŅиĐŋŅ
+
+Đ ĐŋĐžŅŅĐŧ Đŧи ĐŧĐžĐļĐĩĐŧĐž виĐēĐžŅиŅŅОвŅваŅи ŅŅ ŅĐē ŅиĐŋ аŅŅийŅŅа:
+
+{* ../../docs_src/body_nested_models/tutorial004_py310.py hl[18] *}
+
+ĐĻĐĩ ОСĐŊаŅаŅиĐŧĐĩ, ŅĐž **FastAPI** ĐžŅŅĐēŅваŅиĐŧĐĩ ŅŅĐģĐž СаĐŋиŅŅ ŅаĐēĐžĐŗĐž Đ˛Đ¸ĐŗĐģŅĐ´Ņ:
+
+```JSON
+{
+ "name": "Foo",
+ "description": "The pretender",
+ "price": 42.0,
+ "tax": 3.2,
+ "tags": ["rock", "metal", "bar"],
+ "image": {
+ "url": "http://example.com/baz.jpg",
+ "name": "The Foo live"
+ }
+}
+```
+
+ĐавдŅĐēи ŅаĐēŅĐš Đ´ĐĩĐēĐģаŅаŅŅŅ Ņ **FastAPI** Đи ĐžŅŅиĐŧŅŅŅĐĩ:
+
+* ĐŅĐ´ŅŅиĐŧĐēŅ Đ˛ ŅĐĩдаĐēŅĐžŅŅ (авŅОСавĐĩŅŅĐĩĐŊĐŊŅ ŅĐžŅĐž), ĐŊавŅŅŅ Đ´ĐģŅ Đ˛ĐēĐģадĐĩĐŊиŅ
ĐŧОдĐĩĐģĐĩĐš
+* ĐĐžĐŊвĐĩŅŅаŅŅŅ Đ´Đ°ĐŊиŅ
+* ĐаĐģŅдаŅŅŅ Đ´Đ°ĐŊиŅ
+* ĐвŅĐžĐŧаŅиŅĐŊŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ
+
+## ĐĄĐŋĐĩŅŅаĐģŅĐŊŅ ŅиĐŋи Ņа ваĐģŅдаŅŅŅ
+
+ĐĐēŅŅĐŧ СвиŅаКĐŊиŅ
ŅиĐŋŅв, ŅаĐēиŅ
ŅĐē `str`, `int`, `float`, Ņа ŅĐŊ. Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи ŅĐēĐģадĐŊŅŅŅ ŅиĐŋи, ŅĐēŅ ĐŊаŅĐģŅĐ´ŅŅŅŅ `str`.
+
+ЊОй ĐŋОйаŅиŅи вŅŅ Đ´ĐžŅŅŅĐŋĐŊŅ Đ˛Đ°ŅŅаĐŊŅи, ОСĐŊаКОĐŧŅĐĩŅŅ Đˇ ĐžĐŗĐģŅĐ´ĐžĐŧ ŅиĐŋŅв Ņ Pydantic . ĐĐĩŅĐēŅ ĐŋŅиĐēĐģади ĐąŅĐ´ŅŅŅ Ņ ĐŊаŅŅŅĐŋĐŊиŅ
ŅОСдŅĐģаŅ
.
+
+ĐаĐŋŅиĐēĐģад, Ņ ĐŧОдĐĩĐģŅ `Image` Ņ ĐŋĐžĐģĐĩ `url`, ŅĐžĐŧŅ Đŧи ĐŧĐžĐļĐĩĐŧĐž ĐžĐŗĐžĐģĐžŅиŅи ĐšĐžĐŗĐž ŅĐē `HttpUrl` вŅĐ´ Pydantic СаĐŧŅŅŅŅ `str`:
+
+{* ../../docs_src/body_nested_models/tutorial005_py310.py hl[2,8] *}
+
+Đ ŅĐ´ĐžĐē ĐąŅĐ´Đĩ ĐŋĐĩŅĐĩвŅŅĐĩĐŊĐž ŅĐē Đ´ŅĐšŅĐŊŅ URL-адŅĐĩŅŅ Ņ ĐˇĐ°Đ´ĐžĐēŅĐŧĐĩĐŊŅОваĐŊĐž в JSON Schema / OpenAPI ŅĐē URL.
+
+## ĐŅŅийŅŅи ĐˇŅ ŅĐŋиŅĐēаĐŧи ĐŋŅĐ´ĐŧОдĐĩĐģĐĩĐš
+
+ĐŖ Pydantic Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи ĐŧОдĐĩĐģŅ ŅĐē ĐŋŅĐ´ŅиĐŋи Đ´ĐģŅ `list`, `set` ŅĐžŅĐž:
+
+{* ../../docs_src/body_nested_models/tutorial006_py310.py hl[18] *}
+
+ĐĻĐĩ ОСĐŊаŅаŅ, ŅĐž **FastAPI** ĐąŅĐ´Đĩ ĐžŅŅĐēŅваŅи (ĐēĐžĐŊвĐĩŅŅŅваŅи, ваĐģŅĐ´ŅваŅи, Đ´ĐžĐēŅĐŧĐĩĐŊŅŅваŅи ŅĐžŅĐž) JSON ŅŅĐģĐž СаĐŋиŅŅ Ņ Đ˛Đ¸ĐŗĐģŅĐ´Ņ:
+
+```JSON hl_lines="11"
+{
+ "name": "Foo",
+ "description": "The pretender",
+ "price": 42.0,
+ "tax": 3.2,
+ "tags": [
+ "rock",
+ "metal",
+ "bar"
+ ],
+ "images": [
+ {
+ "url": "http://example.com/baz.jpg",
+ "name": "The Foo live"
+ },
+ {
+ "url": "http://example.com/dave.jpg",
+ "name": "The Baz"
+ }
+ ]
+}
+```
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+ĐвĐĩŅĐŊŅŅŅ ŅĐ˛Đ°ĐŗŅ, ŅĐž ŅĐĩĐŋĐĩŅ ĐēĐģŅŅ `images` ĐŧŅŅŅиŅŅ ŅĐŋиŅĐžĐē Ой'ŅĐēŅŅв СОйŅаĐļĐĩĐŊŅ.
+
+///
+
+## ĐĐģийОĐēĐž вĐēĐģадĐĩĐŊŅ ĐŧОдĐĩĐģŅ
+
+Đи ĐŧĐžĐļĐĩŅĐĩ виСĐŊаŅаŅи вĐēĐģадĐĩĐŊŅ ĐŧОдĐĩĐģŅ Đ´ĐžĐ˛ŅĐģŅĐŊĐžŅ ĐŗĐģийиĐŊи:
+
+{* ../../docs_src/body_nested_models/tutorial007_py310.py hl[7,12,18,21,25] *}
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+ĐвĐĩŅĐŊŅŅŅ ŅĐ˛Đ°ĐŗŅ, ŅĐž в ĐŧОдĐĩĐģŅ `Offer` Ņ ŅĐŋиŅĐžĐē `Item`Ņв, ŅĐēŅ, ŅвОŅŅ ŅĐĩŅĐŗĐžŅ, ĐŧĐžĐļŅŅŅ ĐŧаŅи ĐŊĐĩОйОв'ŅСĐēОвиК ŅĐŋиŅĐžĐē `Image`Ņв.
+
+///
+
+## ĐĸŅĐģа СаĐŋиŅŅв, ŅĐž ŅĐēĐģадаŅŅŅŅŅ ĐˇŅ ŅĐŋиŅĐēŅв
+
+Đ¯ĐēŅĐž вĐĩŅŅ
ĐŊŅĐš ŅŅвĐĩĐŊŅ JSON ŅŅĐģа, ŅĐēĐĩ Đи ĐžŅŅĐēŅŅŅĐĩ, Ņ JSON `ĐŧаŅивОĐŧ` (Ņ Python â `list`), Đи ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅиŅи ŅиĐŋ Ņ ĐŋаŅаĐŧĐĩŅŅŅ ŅŅĐŊĐēŅŅŅ, ŅĐē Ņ Đ˛ ĐŧОдĐĩĐģŅŅ
Pydantic:
+
+```Python
+images: List[Image]
+```
+айО в Python 3.9 Ņ Đ˛Đ¸ŅĐĩ:
+
+```Python
+images: list[Image]
+```
+
+ĐŊаĐŋŅиĐēĐģад:
+
+{* ../../docs_src/body_nested_models/tutorial008_py39.py hl[13] *}
+
+## ĐŅĐ´ŅŅиĐŧĐēа в ŅĐĩдаĐēŅĐžŅŅ Đ˛ŅŅди
+
+Đи ĐžŅŅиĐŧаŅŅĐĩ ĐŋŅĐ´ŅŅиĐŧĐēŅ Đ˛ ŅĐĩдаĐēŅĐžŅŅ Đ˛ŅŅди.
+
+ĐавŅŅŅ Đ´ĐģŅ ĐĩĐģĐĩĐŧĐĩĐŊŅŅв Ņ ŅĐŋиŅĐēаŅ
:
+
+
+
+Đи ĐŊĐĩ СĐŧĐžĐŗĐģи Đą ĐžŅŅиĐŧаŅи ŅаĐēŅ ĐŋŅĐ´ŅŅиĐŧĐēŅ Đ˛ ŅĐĩдаĐēŅĐžŅŅ, ŅĐēйи ĐŋŅаŅŅваĐģи ĐŊаĐŋŅŅĐŧŅ ĐˇŅ `dict`, а ĐŊĐĩ С ĐŧОдĐĩĐģŅĐŧи Pydantic.
+
+ĐĐģĐĩ ĐаĐŧ ĐŊĐĩ ĐŋĐžŅŅŅĐąĐŊĐž ŅŅŅĐąŅваŅиŅŅ ĐŋŅĐž ŅĐĩ: вŅ
ŅĐ´ĐŊŅ dict'и авŅĐžĐŧаŅиŅĐŊĐž ĐēĐžĐŊвĐĩŅŅŅŅŅŅŅŅ, а виŅ
ŅĐ´ĐŊŅ Đ´Đ°ĐŊŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐŊĐž ĐŋĐĩŅĐĩŅвОŅŅŅŅŅŅŅ Đ˛ JSON.
+
+## ĐĸŅĐģа С дОвŅĐģŅĐŊиĐŧи `dict`
+
+Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅиŅи ŅŅĐģĐž ŅĐē `dict` С ĐēĐģŅŅаĐŧи ОдĐŊĐžĐŗĐž ŅиĐŋŅ Ņа СĐŊаŅĐĩĐŊĐŊŅĐŧи ŅĐŊŅĐžĐŗĐž ŅиĐŋŅ.
+
+ĐĻĐĩ ĐēĐžŅиŅĐŊĐž, ŅĐēŅĐž Đи ĐŊĐĩ СĐŊаŅŅĐĩ ĐŊаĐŋĐĩŅĐĩĐ´, ŅĐēŅ ŅĐŧĐĩĐŊа ĐŋĐžĐģŅв ĐąŅĐ´ŅŅŅ Đ´ŅĐšŅĐŊиĐŧи (ŅĐē Ņ Đ˛Đ¸ĐŋадĐēŅ Đˇ ĐŧОдĐĩĐģŅĐŧи Pydantic).
+
+ĐĻĐĩ ĐąŅĐ´Đĩ ĐēĐžŅиŅĐŊĐž, ŅĐēŅĐž Đи Ņ
ĐžŅĐĩŅĐĩ ĐŋŅиКĐŧаŅи ĐēĐģŅŅŅ, ŅĐēŅ ĐˇĐ°ĐˇĐ´Đ°ĐģĐĩĐŗŅĐ´Ņ ĐŊĐĩвŅĐ´ĐžĐŧŅ.
+
+---
+
+ĐĻĐĩ ŅаĐēĐžĐļ СŅŅŅĐŊĐž, ŅĐēŅĐž Đи Ņ
ĐžŅĐĩŅĐĩ ĐŧаŅи ĐēĐģŅŅŅ ŅĐŊŅĐžĐŗĐž ŅиĐŋŅ (ĐŊаĐŋŅиĐēĐģад, `int`).
+
+ĐŅŅ ŅĐž Đŧи ŅĐžĐˇĐŗĐģŅĐŊĐĩĐŧĐž даĐģŅ.
+
+ĐŖ ŅŅĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ Đи ĐŧĐžĐļĐĩŅĐĩ ĐŋŅиКĐŧаŅи ĐąŅĐ´Ņ-ŅĐēиК `dict`, ŅĐēŅĐž ĐšĐžĐŗĐž ĐēĐģŅŅŅ â ŅĐĩ `int`, а СĐŊаŅĐĩĐŊĐŊŅ â `float`:
+
+{* ../../docs_src/body_nested_models/tutorial009_py39.py hl[7] *}
+
+/// tip | ĐĐžŅада
+
+ĐаКŅĐĩ ĐŊа ŅваСŅ, ŅĐž в JSON ŅŅĐģŅ ĐēĐģŅŅŅ ĐŧĐžĐļŅŅŅ ĐąŅŅи ĐģиŅĐĩ ŅŅĐ´ĐēаĐŧи (`str`).
+
+ĐĐģĐĩ Pydantic авŅĐžĐŧаŅиŅĐŊĐž ĐēĐžĐŊвĐĩŅŅŅŅ Đ´Đ°ĐŊŅ.
+
+ĐĻĐĩ ОСĐŊаŅаŅ, ŅĐž ĐŊавŅŅŅ ŅĐēŅĐž ĐēĐģŅŅĐŊŅи ваŅĐžĐŗĐž API ĐŊадŅиĐģаŅиĐŧŅŅŅ ĐēĐģŅŅŅ Ņ Đ˛Đ¸ĐŗĐģŅĐ´Ņ ŅŅĐ´ĐēŅв, ŅĐēŅĐž вОĐŊи ĐŧŅŅŅŅŅŅ ŅŅĐģŅ ŅиŅĐģа, Pydantic ĐēĐžĐŊвĐĩŅŅŅŅ ŅŅ
Ņ ĐŋŅОвĐĩĐ´Đĩ ваĐģŅдаŅŅŅ.
+
+ĐĸОйŅĐž `dict`, ŅĐēиК Đи ĐžŅŅиĐŧаŅŅĐĩ ŅĐē `weights`, ĐŧаŅиĐŧĐĩ ĐēĐģŅŅŅ ŅиĐŋŅ `int` Ņа СĐŊаŅĐĩĐŊĐŊŅ ŅиĐŋŅ `float`.
+
+///
+
+## ĐŅĐ´ŅŅĐŧĐžĐē
+
+Đ **FastAPI** Đи ĐŧаŅŅĐĩ ĐŧаĐēŅиĐŧаĐģŅĐŊŅ ĐŗĐŊŅŅĐēŅŅŅŅ ĐˇĐ°Đ˛Đ´ŅĐēи ĐŧОдĐĩĐģŅĐŧ Pydantic, СйĐĩŅŅĐŗĐ°ŅŅи ĐŋŅи ŅŅĐžĐŧŅ ĐēОд ĐŋŅĐžŅŅиĐŧ, ĐēĐžŅĐžŅĐēиĐŧ Ņа ĐĩĐģĐĩĐŗĐ°ĐŊŅĐŊиĐŧ.
+
+Đ ŅаĐēĐžĐļ ĐžŅŅиĐŧŅŅŅĐĩ вŅŅ ĐŋĐĩŅĐĩĐ˛Đ°ĐŗĐ¸:
+
+* ĐŅĐ´ŅŅиĐŧĐēа в ŅĐĩдаĐēŅĐžŅŅ (авŅОдОĐŋОвĐŊĐĩĐŊĐŊŅ Đ˛ŅŅди!)
+* ĐĐžĐŊвĐĩŅŅаŅŅŅ Đ´Đ°ĐŊиŅ
(ĐŋаŅŅиĐŊĐŗ/ŅĐĩŅиаĐģŅСаŅŅŅ)
+* ĐаĐģŅдаŅŅŅ Đ´Đ°ĐŊиŅ
+* ĐĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ ŅŅ
ĐĩĐŧ
+* ĐвŅĐžĐŧаŅиŅĐŊĐĩ ŅŅвОŅĐĩĐŊĐŊŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ
diff --git a/docs/uk/docs/tutorial/body-updates.md b/docs/uk/docs/tutorial/body-updates.md
new file mode 100644
index 000000000..e78b5a5bf
--- /dev/null
+++ b/docs/uk/docs/tutorial/body-updates.md
@@ -0,0 +1,116 @@
+# ĐĸŅĐģĐž â ĐĐŊОвĐģĐĩĐŊĐŊŅ
+
+## ĐĐŊОвĐģĐĩĐŊĐŊŅ Đˇ виĐēĐžŅиŅŅаĐŊĐŊŅĐŧ `PUT`
+
+ЊОй ĐžĐŊОвиŅи ĐĩĐģĐĩĐŧĐĩĐŊŅ, Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅаŅи HTTP `PUT` ĐžĐŋĐĩŅаŅŅŅ.
+
+Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅаŅи `jsonable_encoder`, ŅОй ĐŋĐĩŅĐĩŅвОŅиŅи вŅ
ŅĐ´ĐŊŅ Đ´Đ°ĐŊŅ ĐŊа ŅаĐēŅ, ŅĐēŅ ĐŧĐžĐļĐŊа СйĐĩŅŅĐŗĐ°Ņи ŅĐē JSON (ĐŊаĐŋŅиĐēĐģад, Ņ NoSQL ĐąĐ°ĐˇŅ Đ´Đ°ĐŊиŅ
). ĐаĐŋŅиĐēĐģад, ĐŋĐĩŅĐĩŅвОŅŅŅŅи `datetime` Ņ `str`.
+
+{* ../../docs_src/body_updates/tutorial001_py310.py hl[28:33] *}
+
+`PUT` виĐēĐžŅиŅŅОвŅŅŅŅŅŅ Đ´ĐģŅ ĐžŅŅиĐŧаĐŊĐŊŅ Đ´Đ°ĐŊиŅ
, ŅĐēŅ ĐŧаŅŅŅ ĐˇĐ°ĐŧŅĐŊиŅи ŅиĐŊĐŊŅ Đ´Đ°ĐŊŅ.
+
+### ĐĐžĐŋĐĩŅĐĩĐ´ĐļĐĩĐŊĐŊŅ ĐŋŅĐž СаĐŧŅĐŊŅ
+
+ĐĻĐĩ ОСĐŊаŅаŅ, ŅĐž ŅĐēŅĐž Đи Ņ
ĐžŅĐĩŅĐĩ ĐžĐŊОвиŅи ĐĩĐģĐĩĐŧĐĩĐŊŅ `bar`, виĐēĐžŅиŅŅОвŅŅŅи `PUT` С ŅŅĐģĐžĐŧ:
+
+```Python
+{
+ "name": "Barz",
+ "price": 3,
+ "description": None,
+}
+```
+
+ĐžŅĐēŅĐģŅĐēи вŅĐŊ ĐŊĐĩ ĐŧŅŅŅиŅŅ Đ˛ĐļĐĩ СйĐĩŅĐĩĐļĐĩĐŊĐžĐŗĐž аŅŅийŅŅа `"tax": 20.2`, ĐŧОдĐĩĐģŅ Đ˛Đ˛ĐĩĐ´ĐĩĐŊĐŊŅ ĐŋŅиКĐŧĐĩ СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ `"tax": 10.5`.
+
+РдаĐŊŅ ĐąŅĐ´ŅŅŅ ĐˇĐąĐĩŅĐĩĐļĐĩĐŊŅ Đˇ ŅиĐŧ "ĐŊОвиĐŧ" СĐŊаŅĐĩĐŊĐŊŅĐŧ `tax` = `10.5`.
+
+## ЧаŅŅĐēĐžĐ˛Ņ ĐžĐŊОвĐģĐĩĐŊĐŊŅ Đˇ `PATCH`
+
+Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи ĐžĐŋĐĩŅаŅŅŅ HTTP `PATCH` Đ´ĐģŅ *ŅаŅŅĐēĐžĐ˛ĐžĐŗĐž* ĐžĐŊОвĐģĐĩĐŊĐŊŅ Đ´Đ°ĐŊиŅ
.
+
+ĐĻĐĩ ОСĐŊаŅаŅ, ŅĐž Đи ĐŧĐžĐļĐĩŅĐĩ ĐŊадŅŅĐģаŅи ĐģиŅĐĩ ŅŅ Đ´Đ°ĐŊŅ, ŅĐēŅ Ņ
ĐžŅĐĩŅĐĩ ĐžĐŊОвиŅи, СаĐģиŅаŅŅи ŅĐŊŅŅ ĐąĐĩС СĐŧŅĐŊ.
+
+/// note | ĐŅиĐŧŅŅĐēа
+
+`PATCH` ĐŧĐĩĐŊŅ Đ˛ŅĐ´ĐžĐŧиК Ņ ŅŅĐ´ŅĐĩ виĐēĐžŅиŅŅОвŅŅŅŅŅŅ, ĐŊŅĐļ `PUT`.
+
+Đ ĐąĐ°ĐŗĐ°ŅĐž ĐēĐžĐŧаĐŊĐ´ виĐēĐžŅиŅŅОвŅŅŅŅ ĐģиŅĐĩ `PUT`, ĐŊавŅŅŅ Đ´ĐģŅ ŅаŅŅĐēОвиŅ
ĐžĐŊОвĐģĐĩĐŊŅ.
+
+Đи **вŅĐģŅĐŊŅ** виĐēĐžŅиŅŅОвŅваŅи ŅŅ
ŅаĐē, ŅĐē Ņ
ĐžŅĐĩŅĐĩ, **FastAPI** ĐŊĐĩ ĐŊаĐēĐģĐ°Đ´Đ°Ņ ĐžĐąĐŧĐĩĐļĐĩĐŊŅ.
+
+ĐĐģĐĩ ŅĐĩĐš ĐŋĐžŅŅĐąĐŊиĐē ĐŋĐžĐēаСŅŅ ĐаĐŧ ĐąŅĐģŅŅ-ĐŧĐĩĐŊŅ ŅĐē ŅŅ
СадŅĐŧаĐŊĐž виĐēĐžŅиŅŅОвŅваŅи.
+
+///
+
+### ĐиĐēĐžŅиŅŅаĐŊĐŊŅ ĐŋаŅаĐŧĐĩŅŅа `exclude_unset` Ņ Pydantic
+
+Đ¯ĐēŅĐž Đи Ņ
ĐžŅĐĩŅĐĩ ĐžŅŅиĐŧаŅи ŅаŅŅĐēĐžĐ˛Ņ ĐžĐŊОвĐģĐĩĐŊĐŊŅ, Đ´ŅĐļĐĩ СŅŅŅĐŊĐž виĐēĐžŅиŅŅОвŅваŅи ĐŋаŅаĐŧĐĩŅŅ `exclude_unset` Ņ ĐŧĐĩŅĐžĐ´Ņ `.model_dump()` ĐŧОдĐĩĐģŅ Pydantic.
+
+ĐаĐŋŅиĐēĐģад: `item.model_dump(exclude_unset=True)`.
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+ĐŖ Pydantic v1 ŅĐĩĐš ĐŧĐĩŅОд ĐŊаСивавŅŅ `.dict()`, вŅĐŊ ĐąŅв СаŅŅаŅŅĐģиК (аĐģĐĩ вŅĐĩ ŅĐĩ ĐŋŅĐ´ŅŅиĐŧŅŅŅŅŅŅ) Ņ Pydantic v2, Ņ ĐąŅв ĐŋĐĩŅĐĩĐšĐŧĐĩĐŊОваĐŊиК Ņ `.model_dump()`.
+
+ĐŅиĐēĐģади ŅŅŅ Đ˛Đ¸ĐēĐžŅиŅŅОвŅŅŅŅ `.dict()` Đ´ĐģŅ ŅŅĐŧŅŅĐŊĐžŅŅŅ Đˇ Pydantic v1, аĐģĐĩ ĐаĐŧ ŅĐģŅĐ´ виĐēĐžŅиŅŅОвŅваŅи `.model_dump()`, ŅĐēŅĐž ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи Pydantic v2.
+
+///
+
+ĐĻĐĩ ŅŅвОŅиŅŅ `dict` ĐģиŅĐĩ С ŅиĐŧи даĐŊиĐŧи, ŅĐēŅ ĐąŅĐģи ŅвĐŊĐž вŅŅаĐŊОвĐģĐĩĐŊŅ ĐŋŅĐ´ ŅĐ°Ņ ŅŅвОŅĐĩĐŊĐŊŅ ĐŧОдĐĩĐģŅ `item`, виĐēĐģŅŅаŅŅи СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ.
+
+ĐĸĐžĐ´Ņ Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи ŅĐĩ, ŅОй ŅŅвОŅиŅи `dict` ĐģиŅĐĩ С даĐŊиĐŧи, ŅĐēŅ ĐąŅĐģи вŅŅаĐŊОвĐģĐĩĐŊŅ (ĐŊадŅŅĐģаĐŊŅ Ņ ĐˇĐ°ĐŋиŅŅ), ĐŋŅĐžĐŋŅŅĐēаŅŅи СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ:
+
+{* ../../docs_src/body_updates/tutorial002_py310.py hl[32] *}
+
+### ĐиĐēĐžŅиŅŅаĐŊĐŊŅ ĐŋаŅаĐŧĐĩŅŅа `update` Ņ Pydantic
+
+ĐĸĐĩĐŋĐĩŅ Đи ĐŧĐžĐļĐĩŅĐĩ ŅŅвОŅиŅи ĐēĐžĐŋŅŅ ĐŊаŅвĐŊĐžŅ ĐŧОдĐĩĐģŅ ĐˇĐ° Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ `.model_copy()`, Ņ ĐŋĐĩŅĐĩдаŅи ĐŋаŅаĐŧĐĩŅŅ `update` С `dict` , ŅĐēиК ĐŧŅŅŅиŅŅ Đ´Đ°ĐŊŅ Đ´ĐģŅ ĐžĐŊОвĐģĐĩĐŊĐŊŅ.
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+ĐŖ Pydantic v1 ĐŧĐĩŅОд ĐŊаСивавŅŅ `.copy()`, вŅĐŊ ĐąŅв СаŅŅаŅŅĐģиК (аĐģĐĩ вŅĐĩ ŅĐĩ ĐŋŅĐ´ŅŅиĐŧŅŅŅŅŅŅ) Ņ Pydantic v2, Ņ ĐąŅв ĐŋĐĩŅĐĩĐšĐŧĐĩĐŊОваĐŊиК Ņ `.model_copy()`.
+
+ĐŅиĐēĐģади ŅŅŅ Đ˛Đ¸ĐēĐžŅиŅŅОвŅŅŅŅ `.copy()` Đ´ĐģŅ ŅŅĐŧŅŅĐŊĐžŅŅŅ Đˇ Pydantic v1, аĐģĐĩ ŅĐēŅĐž Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи Pydantic v2 â ĐаĐŧ ŅĐģŅĐ´ виĐēĐžŅиŅŅОвŅваŅи `.model_copy()` СаĐŧŅŅŅŅ ŅŅĐžĐŗĐž.
+
+///
+
+ĐаĐŋŅиĐēĐģад: `stored_item_model.model_copy(update=update_data)`:
+
+{* ../../docs_src/body_updates/tutorial002_py310.py hl[33] *}
+
+### ĐŅĐ´ŅŅĐŧĐžĐē ŅаŅŅĐēОвиŅ
ĐžĐŊОвĐģĐĩĐŊŅ
+
+ĐŖ ĐŋŅĐ´ŅŅĐŧĐēŅ, ŅОй СаŅŅĐžŅŅваŅи ŅаŅŅĐēĐžĐ˛Ņ ĐžĐŊОвĐģĐĩĐŊĐŊŅ, Đи:
+
+* (ĐĐŋŅŅĐžĐŊаĐģŅĐŊĐž) виĐēĐžŅиŅŅОвŅŅŅĐĩ `PATCH` СаĐŧŅŅŅŅ `PUT`.
+* ĐŅŅиĐŧŅŅŅĐĩ СйĐĩŅĐĩĐļĐĩĐŊŅ Đ´Đ°ĐŊŅ.
+* ĐĐžĐŧŅŅаŅŅĐĩ ŅŅ Đ´Đ°ĐŊŅ Đ˛ ĐŧОдĐĩĐģŅ Pydantic.
+* ĐĐĩĐŊĐĩŅŅŅŅĐĩ `dict` ĐąĐĩС СĐŊаŅĐĩĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ С ĐŧОдĐĩĐģŅ Đ˛Đ˛ĐĩĐ´ĐĩĐŊĐŊŅ (виĐēĐžŅиŅŅОвŅŅŅи `exclude_unset`).
+ * ĐĸаĐēиĐŧ ŅиĐŊĐžĐŧ Đи ĐžĐŊОвиŅĐĩ ĐģиŅĐĩ ŅŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ, ŅĐēŅ ĐąŅĐģи ŅвĐŊĐž СадаĐŊŅ ĐēĐžŅиŅŅŅваŅĐĩĐŧ, СаĐŧŅŅŅŅ ŅĐžĐŗĐž, ŅОй ĐŋĐĩŅĐĩСаĐŋиŅŅваŅи вĐļĐĩ СйĐĩŅĐĩĐļĐĩĐŊŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ ĐˇĐŊаŅĐĩĐŊĐŊŅĐŧи Са СаĐŧОвŅŅваĐŊĐŊŅĐŧ С ваŅĐžŅ ĐŧОдĐĩĐģŅ.
+* ĐĄŅвОŅŅŅŅĐĩ ĐēĐžĐŋŅŅ ĐˇĐąĐĩŅĐĩĐļĐĩĐŊĐžŅ ĐŧОдĐĩĐģŅ, ĐžĐŊОвĐģŅŅŅи ŅŅ Đ°ŅŅийŅŅи ĐžŅŅиĐŧаĐŊиĐŧи ŅаŅŅĐēОвиĐŧи ĐžĐŊОвĐģĐĩĐŊĐŊŅĐŧи (виĐēĐžŅиŅŅОвŅŅŅи ĐŋаŅаĐŧĐĩŅŅ `update`).
+* ĐĐĩŅĐĩŅвОŅŅŅŅĐĩ ŅĐēĐžĐŋŅКОваĐŊŅ ĐŧОдĐĩĐģŅ ĐŊа ŅĐžŅŅ, ŅĐž ĐŧĐžĐļĐŊа СйĐĩŅĐĩĐŗŅи Ņ Đ˛Đ°ŅŅ ĐĐ (ĐŊаĐŋŅиĐēĐģад, виĐēĐžŅиŅŅОвŅŅŅи `jsonable_encoder`).
+ * ĐĻĐĩ ĐŧĐžĐļĐŊа ĐŋĐžŅŅвĐŊŅŅи С ĐŋОвŅĐžŅĐŊиĐŧ виĐēĐžŅиŅŅаĐŊĐŊŅĐŧ ĐŧĐĩŅĐžĐ´Ņ `.model_dump()` ĐŧОдĐĩĐģŅ, аĐģĐĩ ŅĐĩ ĐŗĐ°ŅаĐŊŅŅŅ (Ņ ĐŋĐĩŅĐĩŅвОŅŅŅ) СĐŊаŅĐĩĐŊĐŊŅ Ņ ŅиĐŋи даĐŊиŅ
, ŅĐēŅ ĐŧĐžĐļĐŊа ĐŋĐĩŅĐĩŅвОŅиŅи ĐŊа JSON, ĐŊаĐŋŅиĐēĐģад, `datetime` ĐŊа `str`.
+* ĐĐąĐĩŅŅĐŗĐ°ŅŅĐĩ даĐŊŅ Ņ Đ˛Đ°ŅŅ ĐĐ.
+* ĐОвĐĩŅŅаŅŅĐĩ ĐžĐŊОвĐģĐĩĐŊŅ ĐŧОдĐĩĐģŅ.
+
+{* ../../docs_src/body_updates/tutorial002_py310.py hl[28:35] *}
+
+/// tip | ĐĐžŅада
+
+ĐаŅĐŋŅĐ°Đ˛Đ´Ņ Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи ŅŅ ŅаĐŧŅ ŅĐĩŅ
ĐŊŅĐēŅ Ņ Đˇ ĐžĐŋĐĩŅаŅŅŅŅ HTTP `PUT`.
+
+ĐĐģĐĩ ĐŋŅиĐēĐģад ŅŅŅ Đ˛Đ¸ĐēĐžŅиŅŅОвŅŅ `PATCH`, ŅĐžĐŧŅ ŅĐž вŅĐŊ ĐąŅв ŅŅвОŅĐĩĐŊиК ŅаĐŧĐĩ Đ´ĐģŅ ŅаĐēиŅ
виĐŋадĐēŅв.
+
+///
+
+/// note | ĐŅиĐŧŅŅĐēа
+
+ĐвĐĩŅĐŊŅŅŅ ŅĐ˛Đ°ĐŗŅ, ŅĐž ĐŧОдĐĩĐģŅ ĐˇĐ°ĐŋиŅŅ Đ˛ŅĐĩ ŅĐĩ ĐŋŅĐžŅ
ОдиŅŅ Đ˛Đ°ĐģŅдаŅŅŅ.
+
+ĐĸĐžĐļ, ŅĐēŅĐž Đи Ņ
ĐžŅĐĩŅĐĩ ĐžŅŅиĐŧŅваŅи ŅаŅŅĐēĐžĐ˛Ņ ĐžĐŊОвĐģĐĩĐŊĐŊŅ, ŅĐēŅ ĐŧĐžĐļŅŅŅ ĐŊĐĩ ĐŧŅŅŅиŅи ĐļОдĐŊĐžĐŗĐž аŅŅийŅŅа, ĐаĐŧ ĐŋĐžŅŅŅĐąĐŊĐž ĐŧаŅи ĐŧОдĐĩĐģŅ, Đ´Đĩ вŅŅ Đ°ŅŅийŅŅи ĐŋОСĐŊаŅĐĩĐŊŅ ŅĐē ĐŊĐĩОйОвâŅСĐēĐžĐ˛Ņ (ĐˇŅ ĐˇĐŊаŅĐĩĐŊĐŊŅĐŧи Са СаĐŧОвŅŅваĐŊĐŊŅĐŧ айО `None`).
+
+ЊОй ŅОСŅŅСĐŊŅŅи ĐŧОдĐĩĐģŅ Đˇ ŅŅŅĐŧа ĐŊĐĩОйОвâŅСĐēОвиĐŧи СĐŊаŅĐĩĐŊĐŊŅĐŧи Đ´ĐģŅ **ĐžĐŊОвĐģĐĩĐŊĐŊŅ** Ņ ĐŧОдĐĩĐģŅ Đˇ ОйОвâŅСĐēОвиĐŧи СĐŊаŅĐĩĐŊĐŊŅĐŧи Đ´ĐģŅ **ŅŅвОŅĐĩĐŊĐŊŅ**, Đи ĐŧĐžĐļĐĩŅĐĩ ŅĐēĐžŅиŅŅаŅиŅŅ ŅĐ´ĐĩŅĐŧи, ĐžĐŋиŅаĐŊиĐŧи Ņ [ĐОдаŅĐēĐžĐ˛Ņ ĐŧОдĐĩĐģŅ](extra-models.md){.internal-link target=_blank}.
+
+///
diff --git a/docs/uk/docs/tutorial/cookie-param-models.md b/docs/uk/docs/tutorial/cookie-param-models.md
new file mode 100644
index 000000000..f070b6ac8
--- /dev/null
+++ b/docs/uk/docs/tutorial/cookie-param-models.md
@@ -0,0 +1,76 @@
+# ĐОдĐĩĐģŅ Đ´ĐģŅ Cookie-ĐŋаŅаĐŧĐĩŅŅŅв
+
+Đ¯ĐēŅĐž Ņ ĐĐ°Ņ Ņ ĐŗŅŅĐŋа **cookies** ĐŋаŅаĐŧĐĩŅŅŅв, ŅĐēŅ ĐŋОв'ŅСаĐŊŅ ĐŧŅĐļ ŅОйОŅ, Đи ĐŧĐžĐļĐĩŅĐĩ ŅŅвОŅиŅи **Pydantic-ĐŧОдĐĩĐģŅ**, ŅОй ĐžĐŗĐžĐģĐžŅиŅи ŅŅ
. đĒ
+
+ĐĻĐĩ дОСвОĐģиŅŅ ĐаĐŧ ĐŋОвŅĐžŅĐŊĐž **виĐēĐžŅиŅŅОвŅваŅи ĐŧОдĐĩĐģŅ** Ņ **ŅŅСĐŊиŅ
ĐŧŅŅŅŅŅ
**, а ŅаĐēĐžĐļ ĐžĐŗĐžĐģĐžŅиŅи ваĐģŅдаŅŅŅ Ņа ĐŧĐĩŅадаĐŊŅ Đ´ĐģŅ Đ˛ŅŅŅ
ĐŋаŅаĐŧĐĩŅŅŅв ОдĐŊĐžŅаŅĐŊĐž. đ
+
+/// note | ĐĐžŅаŅĐēи
+
+ĐĻĐĩ ĐŋŅĐ´ŅŅиĐŧŅŅŅŅŅŅ Đˇ вĐĩŅŅŅŅ FastAPI `0.115.0`. đ¤
+
+///
+
+/// tip | ĐĐžŅада
+
+ĐĻŅ Đļ ŅĐĩŅ
ĐŊŅĐēа СаŅŅĐžŅОвŅŅŅŅŅŅ Đ´Đž `Query`, `Cookie`, Ņа `Header`. đ
+
+///
+
+## Cookie С Pydantic-ĐŧОдĐĩĐģĐģŅ
+
+ĐĐŗĐžĐģĐžŅŅŅŅ **cookie-ĐŋаŅаĐŧĐĩŅŅи**, ŅĐēŅ ĐаĐŧ ĐŋĐžŅŅŅĐąĐŊŅ, Ņ **Pydantic-ĐŧОдĐĩĐģŅ**, а ĐŋĐžŅŅĐŧ ĐžĐŗĐžĐģĐžŅŅŅŅ ĐŋаŅаĐŧĐĩŅŅ ŅĐē `Cookie`:
+
+{* ../../docs_src/cookie_param_models/tutorial001_an_py310.py hl[9:12,16] *}
+
+**FastAPI** ĐąŅĐ´Đĩ **виŅŅĐŗŅваŅи** даĐŊŅ Đ´ĐģŅ **ĐēĐžĐļĐŊĐžĐŗĐž ĐŋĐžĐģŅ** С **cookie** ĐŋаŅаĐŧĐĩŅŅŅв, ĐžŅŅиĐŧаĐŊиŅ
Ņ ĐˇĐ°ĐŋиŅŅ, Ņ ĐŋĐĩŅĐĩдаваŅи ĐаĐŧ Pydantic-ĐŧОдĐĩĐģŅ, ŅĐēŅ Đи виСĐŊаŅиĐģи.
+
+## ĐĐĩŅĐĩвŅŅĐēа Ņ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ĐŋОйаŅиŅи виСĐŊаŅĐĩĐŊŅ cookie в ŅĐŊŅĐĩŅŅĐĩĐšŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ ĐˇĐ° адŅĐĩŅĐžŅ `/docs`:
+
+
+
+
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+ĐаКŅĐĩ ĐŊа ŅваСŅ, ŅĐž ĐžŅĐēŅĐģŅĐēи **ĐąŅаŅСĐĩŅи ОйŅОйĐģŅŅŅŅ cookie** ĐžŅОйĐģивиĐŧ ŅиĐŊĐžĐŧ Ņ "Са ĐģаŅŅŅĐŊĐēаĐŧи", вОĐŊи **ĐŊĐĩ** дОСвОĐģŅŅŅŅ **JavaScript** ĐģĐĩĐŗĐēĐž С ĐŊиĐŧи ĐŋŅаŅŅваŅи.
+
+Đ¯ĐēŅĐž Đи СаКдĐĩŅĐĩ Đ´Đž **ŅĐŊŅĐĩŅŅĐĩĐšŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ API** Са адŅĐĩŅĐžŅ `/docs`, Đи СĐŧĐžĐļĐĩŅĐĩ ĐŋОйаŅиŅи **Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ** Đ´ĐģŅ cookie Ņ ĐаŅиŅ
**ĐžĐŋĐĩŅаŅŅŅŅ
ŅĐģŅŅ
Ņ**.
+
+ĐĐģĐĩ ĐŊавŅŅŅ ŅĐēŅĐž Đи СаĐŋОвĐŊиŅĐĩ даĐŊŅ Đš ĐŊаŅиŅĐŊĐĩŅĐĩ "Execute", ĐžŅĐēŅĐģŅĐēи ŅĐŊŅĐĩŅŅĐĩĐšŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ ĐŋŅаŅŅŅ Đˇ **JavaScript**, cookie ĐŊĐĩ ĐąŅĐ´ŅŅŅ Đ˛ŅĐ´ĐŋŅавĐģĐĩĐŊŅ, Ņ Đи ĐŋОйаŅиŅĐĩ **ĐŋĐžĐŧиĐģĐēŅ**, ĐŊŅйи Đи ĐŊĐĩ ввĐĩĐģи ĐļОдĐŊиŅ
СĐŊаŅĐĩĐŊŅ.
+
+///
+
+## ĐайОŅĐžĐŊа дОдаŅĐēОвиŅ
cookie
+
+ĐŖ Đ´ĐĩŅĐēиŅ
ŅĐŋĐĩŅŅаĐģŅĐŊиŅ
виĐŋадĐēаŅ
(ĐšĐŧОвŅŅĐŊĐž, ĐŊĐĩ Đ´ŅĐļĐĩ ĐŋĐžŅиŅĐĩĐŊиŅ
) Đи ĐŧĐžĐļĐĩŅĐĩ СаŅ
ĐžŅŅŅи **ОйĐŧĐĩĐļиŅи** ŅĐŋиŅĐžĐē cookie, ŅĐēŅ Ņ
ĐžŅĐĩŅĐĩ ĐžŅŅиĐŧŅваŅи.
+
+ĐаŅа API ŅĐĩĐŋĐĩŅ ĐŧĐ°Ņ ĐŧĐžĐļĐģивŅŅŅŅ ĐēĐžĐŊŅŅĐžĐģŅваŅи вĐģаŅĐŊŅ ĐˇĐŗĐžĐ´Ņ ĐŊа cookie . đ¤ĒđĒ
+
+Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи ĐŊаĐģаŅŅŅваĐŊĐŊŅ ĐŧОдĐĩĐģŅ Pydantic, ŅОй `СайОŅĐžĐŊиŅи` ĐąŅĐ´Ņ-ŅĐēŅ `дОдаŅĐēОвŅ` ĐŋĐžĐģŅ:
+
+{* ../../docs_src/cookie_param_models/tutorial002_an_py39.py hl[10] *}
+
+Đ¯ĐēŅĐž ĐēĐģŅŅĐŊŅ ŅĐŋŅОйŅŅ ĐŊадŅŅĐģаŅи ŅĐēŅŅŅ **дОдаŅĐēĐžĐ˛Ņ cookie**, вŅĐŊ ĐžŅŅиĐŧĐ°Ņ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ Đˇ **ĐŋĐžĐŧиĐģĐēĐžŅ**.
+
+ĐŅĐ´ĐŊŅ ĐąĐ°ĐŊĐĩŅи cookie, ŅĐēŅ ŅаĐē ŅŅаŅаĐŊĐŊĐž ĐŊаĐŧĐ°ĐŗĐ°ŅŅŅŅŅ ĐžŅŅиĐŧаŅи ĐаŅŅ ĐˇĐŗĐžĐ´Ņ, ŅОй API ŅŅ Đ˛ŅĐ´Ņ
иĐģиĐģа . đĒ
+
+ĐаĐŋŅиĐēĐģад, ŅĐēŅĐž ĐēĐģŅŅĐŊŅ ŅĐŋŅОйŅŅ ĐŊадŅŅĐģаŅи cookie `santa_tracker` ĐˇŅ ĐˇĐŊаŅĐĩĐŊĐŊŅĐŧ `good-list-please`, вŅĐŊ ĐžŅŅиĐŧĐ°Ņ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ Đˇ ĐŋĐžĐŧиĐģĐēĐžŅ, ŅĐēа ĐŋОвŅĐ´ĐžĐŧиŅŅ, ŅĐž cookie `santa_tracker` ĐŊĐĩ дОСвОĐģĐĩĐŊĐž :
+
+```json
+{
+ "detail": [
+ {
+ "type": "extra_forbidden",
+ "loc": ["cookie", "santa_tracker"],
+ "msg": "Extra inputs are not permitted",
+ "input": "good-list-please",
+ }
+ ]
+}
+```
+
+## ĐŅĐ´ŅŅĐŧĐžĐē
+
+Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи **Pydantic-ĐŧОдĐĩĐģŅ** Đ´ĐģŅ ĐžĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ cookie Ņ FastAPI. đ
diff --git a/docs/uk/docs/tutorial/cors.md b/docs/uk/docs/tutorial/cors.md
new file mode 100644
index 000000000..95b204d0f
--- /dev/null
+++ b/docs/uk/docs/tutorial/cors.md
@@ -0,0 +1,89 @@
+# CORS (ĐĐąĐŧŅĐŊ ŅĐĩŅŅŅŅаĐŧи ĐŧŅĐļ ŅŅСĐŊиĐŧи Đ´ĐļĐĩŅĐĩĐģаĐŧи)
+
+CORS айО "ĐĐąĐŧŅĐŊ ŅĐĩŅŅŅŅаĐŧи ĐŧŅĐļ ŅŅСĐŊиĐŧи Đ´ĐļĐĩŅĐĩĐģаĐŧи" Ņ ŅиŅŅаŅŅŅ, ĐēĐžĐģи ŅŅĐžĐŊŅĐĩĐŊĐ´, ŅĐž ĐŋŅаŅŅŅ Đ˛ ĐąŅаŅСĐĩŅŅ, ĐŧŅŅŅиŅŅ JavaScript-ĐēОд, ŅĐēиК вСаŅĐŧОдŅŅ Đˇ ĐąĐĩĐēĐĩĐŊĐ´ĐžĐŧ, ŅОСŅаŅОваĐŊиĐŧ в ŅĐŊŅĐžĐŧŅ "Đ´ĐļĐĩŅĐĩĐģŅ" (origin).
+
+## ĐĐļĐĩŅĐĩĐģĐž (Origin)
+
+ĐĐļĐĩŅĐĩĐģĐž виСĐŊаŅаŅŅŅŅŅ ĐēĐžĐŧĐąŅĐŊаŅŅŅŅ ĐŋŅĐžŅĐžĐēĐžĐģŅ (`http`, `https`), Đ´ĐžĐŧĐĩĐŊŅ (`myapp.com`, `localhost`, `localhost.tiangolo.com`), ĐŋĐžŅŅŅ (`80`, `443`, `8080`).
+
+
+ĐаĐŋŅиĐēĐģад, ŅаĐēŅ Đ°Đ´ŅĐĩŅи вваĐļаŅŅŅŅŅ ŅŅСĐŊиĐŧи Đ´ĐļĐĩŅĐĩĐģаĐŧи:
+
+* `http://localhost`
+* `https://localhost`
+* `http://localhost:8080`
+
+ĐавŅŅŅ ŅĐēŅĐž вОĐŊи вŅŅ ĐŧŅŅŅŅŅŅ `localhost`, вОĐŊи ĐŧаŅŅŅ ŅŅСĐŊŅ ĐŋŅĐžŅĐžĐēĐžĐģи айО ĐŋĐžŅŅи, ŅĐž ŅОйиŅŅ ŅŅ
ĐžĐēŅĐĩĐŧиĐŧи "Đ´ĐļĐĩŅĐĩĐģаĐŧи".
+
+## ĐŅĐžĐēи
+
+ĐŅиĐŋŅŅŅиĐŧĐž, ŅĐž ĐĐ°Ņ ŅŅĐžĐŊŅĐĩĐŊĐ´ ĐŋŅаŅŅŅ Đ˛ ĐąŅаŅСĐĩŅŅ ĐŊа `http://localhost:8080`, а ĐšĐžĐŗĐž JavaScript ĐŊаĐŧĐ°ĐŗĐ°ŅŅŅŅŅ Đ˛ŅĐ´ĐŋŅавиŅи СаĐŋĐ¸Ņ Đ´Đž ĐąĐĩĐēĐĩĐŊĐ´Ņ, ŅĐēиК ĐŋŅаŅŅŅ ĐŊа `http://localhost` (ĐŅĐēŅĐģŅĐēи Đŧи ĐŊĐĩ вĐēаСŅŅĐŧĐž ĐŋĐžŅŅ, ĐąŅаŅСĐĩŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ ĐŋŅиĐŋŅŅĐēĐ°Ņ ĐŋĐžŅŅ `80`).
+
+ĐĐžŅŅĐŧ ĐąŅаŅСĐĩŅ ĐŊадŅŅĐģĐĩ HTTP-СаĐŋĐ¸Ņ `OPTIONS` Đ´Đž ĐąĐĩĐēĐĩĐŊĐ´Ņ ĐŊа ĐŋĐžŅŅŅ `:80`, Ņ ŅĐēŅĐž ĐąĐĩĐēĐĩĐŊĐ´ ĐŊадŅŅĐģĐĩ вŅĐ´ĐŋОвŅĐ´ĐŊŅ ĐˇĐ°ĐŗĐžĐģОвĐēи, ŅĐž дОСвОĐģŅŅŅŅ ĐēĐžĐŧŅĐŊŅĐēаŅŅŅ Đˇ ŅŅĐžĐŗĐž ŅĐŊŅĐžĐŗĐž Đ´ĐļĐĩŅĐĩĐģа (`http://localhost:8080`), ŅĐžĐ´Ņ ĐąŅаŅСĐĩŅ ĐŊа ĐŋĐžŅŅŅ `:8080` дОСвОĐģиŅŅ JavaScript Ņ ŅŅĐžĐŊŅĐĩĐŊĐ´Ņ ĐŊадŅŅĐģаŅи ŅвŅĐš СаĐŋĐ¸Ņ Đ´Đž ĐąĐĩĐēĐĩĐŊĐ´Ņ ĐŊа ĐŋĐžŅŅŅ `:80`.
+
+ЊОй Đ´ĐžŅŅĐŗŅи ŅŅĐžĐŗĐž, ĐąĐĩĐēĐĩĐŊĐ´ ĐŊа ĐŋĐžŅŅŅ `:80` ĐŋОвиĐŊĐĩĐŊ ĐŧаŅи ŅĐŋиŅĐžĐē "дОСвОĐģĐĩĐŊиŅ
Đ´ĐļĐĩŅĐĩĐģ".
+
+ĐŖ ŅŅĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ ŅĐŋиŅĐžĐē ĐŧĐ°Ņ ĐŧŅŅŅиŅи `http://localhost:8080`, ŅОй ŅŅĐžĐŊŅĐĩĐŊĐ´ ĐŊа ĐŋĐžŅŅŅ `:8080` ĐŋŅаŅŅвав ĐēĐžŅĐĩĐēŅĐŊĐž.
+
+## ХиĐŧвОĐģŅĐŊĐĩ ĐŋŅĐ´ŅŅавĐģŅĐŊĐŊŅ
+
+ĐĐžĐļĐŊа ŅаĐēĐžĐļ ĐžĐŗĐžĐģĐžŅиŅи ŅĐŋиŅĐžĐē ŅĐē `"*"` ("ŅиĐŧвОĐģŅĐŊĐĩ ĐŋŅĐ´ŅŅавĐģŅĐŊĐŊŅ"), ŅĐž ОСĐŊаŅĐ°Ņ Đ´ĐžĐˇĐ˛ŅĐģ Đ´ĐģŅ Đ˛ŅŅŅ
Đ´ĐļĐĩŅĐĩĐģ.
+
+ĐĐ´ĐŊаĐē ŅĐĩ дОСвОĐģиŅŅ ĐģиŅĐĩ ĐŋĐĩвĐŊŅ ŅиĐŋи ĐēĐžĐŧŅĐŊŅĐēаŅŅŅ, виĐēĐģŅŅаŅŅи вŅĐĩ, ŅĐž ĐŋОв'ŅСаĐŊĐĩ С ОйĐģŅĐēОвиĐŧи даĐŊиĐŧи: Cookies, ĐˇĐ°ĐŗĐžĐģОвĐēи авŅĐžŅиСаŅŅŅ, ŅаĐēŅ ŅĐē ŅŅ, ŅĐž виĐēĐžŅиŅŅОвŅŅŅŅŅŅ Đˇ Bearer ŅĐžĐēĐĩĐŊаĐŧи ŅĐžŅĐž.
+
+ĐĸĐžĐŧŅ Đ´ĐģŅ ĐēĐžŅĐĩĐēŅĐŊĐžŅ ŅОйОŅи ĐēŅаŅĐĩ ŅвĐŊĐž вĐēаСŅваŅи дОСвОĐģĐĩĐŊŅ Đ´ĐļĐĩŅĐĩĐģа.
+
+## ĐиĐēĐžŅиŅŅаĐŊĐŊŅ `CORSMiddleware`
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ĐŊаĐģаŅŅŅваŅи ŅĐĩ Ņ ĐаŅĐžĐŧŅ Đ´ĐžĐ´Đ°ŅĐēŅ **FastAPI** Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ `CORSMiddleware`.
+
+* ĐĐŧĐŋĐžŅŅŅĐšŅĐĩ `CORSMiddleware`.
+* ĐĄŅвОŅŅŅŅ ŅĐŋиŅĐžĐē дОСвОĐģĐĩĐŊиŅ
Đ´ĐļĐĩŅĐĩĐģ (Ņ Đ˛Đ¸ĐŗĐģŅĐ´Ņ ŅŅĐ´ĐēŅв).
+* ĐОдаКŅĐĩ ĐšĐžĐŗĐž ŅĐē "middleware" Ņ ĐĐ°Ņ Đ´ĐžĐ´Đ°ŅĐžĐē **FastAPI**.
+
+
+ĐĸаĐēĐžĐļ ĐŧĐžĐļĐŊа вĐēаСаŅи, Ņи дОСвОĐģŅŅ ĐĐ°Ņ ĐąĐĩĐēĐĩĐŊĐ´:
+
+* ĐĐąĐģŅĐēĐžĐ˛Ņ Đ´Đ°ĐŊŅ (ĐˇĐ°ĐŗĐžĐģОвĐēи авŅĐžŅиСаŅŅŅ, Ņookies, ŅĐžŅĐž).
+* ĐĐžĐŊĐēŅĐĩŅĐŊŅ HTTP-ĐŧĐĩŅОди (`POST`, `PUT`) айО вŅŅ ĐˇĐ° Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ `"*"`
+* ĐĐžĐŊĐēŅĐĩŅĐŊŅ HTTP-ĐˇĐ°ĐŗĐžĐģОвĐēи айО вŅŅ ĐˇĐ° Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ `"*"`.
+
+
+{* ../../docs_src/cors/tutorial001.py hl[2,6:11,13:19] *}
+
+ĐаŅаĐŧĐĩŅŅи Са СаĐŧОвŅŅваĐŊĐŊŅĐŧ Ņ `CORSMiddleware` Ņ Đ´ĐžŅиŅŅ ĐžĐąĐŧĐĩĐļĐĩĐŊиĐŧи, ŅĐžĐŧŅ ĐаĐŧ ĐŋĐžŅŅŅĐąĐŊĐž ŅвĐŊĐž вĐēаСаŅи ĐēĐžĐŊĐēŅĐĩŅĐŊŅ Đ´ĐļĐĩŅĐĩĐģа, ĐŧĐĩŅОди айО ĐˇĐ°ĐŗĐžĐģОвĐēи, ŅОй ĐąŅаŅСĐĩŅи ĐŧĐžĐŗĐģи виĐēĐžŅиŅŅОвŅваŅи ŅŅ
Ņ ĐēĐžĐŊŅĐĩĐēŅŅŅ ĐˇĐ°ĐŋиŅŅв ĐŧŅĐļ ŅŅСĐŊиĐŧи Đ´ĐžĐŧĐĩĐŊаĐŧи.
+
+
+ĐŅĐ´ŅŅиĐŧŅŅŅŅŅŅ ŅаĐēŅ Đ°ŅĐŗŅĐŧĐĩĐŊŅи:
+
+* `allow_origins` - ĐĄĐŋиŅĐžĐē Đ´ĐļĐĩŅĐĩĐģ, ŅĐēиĐŧ дОСвОĐģĐĩĐŊĐž СдŅĐšŅĐŊŅваŅи ĐŧŅĐļĐ´ĐžĐŧĐĩĐŊĐŊŅ ĐˇĐ°ĐŋиŅи. ĐаĐŋŅиĐēĐģад `['https://example.org', 'https://www.example.org']`. Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи ['*'], ŅОй дОСвОĐģиŅи вŅŅ Đ´ĐļĐĩŅĐĩĐģа.
+* `allow_origin_regex` - Đ ŅĐ´ĐžĐē ŅĐĩĐŗŅĐģŅŅĐŊĐžĐŗĐž виŅĐ°ĐˇŅ Đ´ĐģŅ Đ˛ŅĐ´ĐŋОвŅĐ´ĐŊĐžŅŅŅ Đ´ĐļĐĩŅĐĩĐģаĐŧ, ŅĐēиĐŧ дОСвОĐģĐĩĐŊĐž СдŅĐšŅĐŊŅваŅи ĐŧŅĐļĐ´ĐžĐŧĐĩĐŊĐŊŅ ĐˇĐ°ĐŋиŅи. ĐаĐŋŅиĐēĐģад, `'https://.*\.example\.org'`.
+* `allow_methods` - ĐĄĐŋиŅĐžĐē HTTP-ĐŧĐĩŅОдŅв, дОСвОĐģĐĩĐŊиŅ
Đ´ĐģŅ ĐŧŅĐļĐ´ĐžĐŧĐĩĐŊĐŊиŅ
СаĐŋиŅŅв. Đа СаĐŧОвŅŅваĐŊĐŊŅĐŧ `['GET']`. Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи `['*']`, ŅОй дОСвОĐģиŅи вŅŅ ŅŅаĐŊдаŅŅĐŊŅ ĐŧĐĩŅОди.
+* `allow_headers` - ĐĄĐŋиŅĐžĐē HTTP-ĐˇĐ°ĐŗĐžĐģОвĐēŅв, ŅĐēŅ ĐŋŅĐ´ŅŅиĐŧŅŅŅŅŅŅ Đ´ĐģŅ ĐŧŅĐļĐ´ĐžĐŧĐĩĐŊĐŊиŅ
СаĐŋиŅŅв. Đа СаĐŧОвŅŅваĐŊĐŊŅĐŧ `[]`. Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи `['*']`, ŅОй дОСвОĐģиŅи вŅŅ ĐˇĐ°ĐŗĐžĐģОвĐēи. ĐĐ°ĐŗĐžĐģОвĐēи `Accept`, `Accept-Language`, `Content-Language` Ņ `Content-Type` СавĐļди дОСвОĐģĐĩĐŊŅ Đ´ĐģŅ ĐŋŅĐžŅŅиŅ
CORS-СаĐŋиŅŅв .
+* `allow_credentials` - ĐиСĐŊаŅаŅ, Ņи ĐŋŅĐ´ŅŅиĐŧŅŅŅŅŅŅ ŅаКĐģи cookie Đ´ĐģŅ ĐŧŅĐļĐ´ĐžĐŧĐĩĐŊĐŊиŅ
СаĐŋиŅŅв. Đа СаĐŧОвŅŅваĐŊĐŊŅĐŧ `False`. ĐĸаĐēĐžĐļ, ŅĐēŅĐž ĐŋĐžŅŅŅĐąĐŊĐž дОСвОĐģиŅи ОйĐŧŅĐŊ ОйĐģŅĐēОвиĐŧи даĐŊиĐŧи (`allow_credentials = True`), ĐŋаŅаĐŧĐĩŅŅ `allow_origins` ĐŊĐĩ ĐŧĐžĐļĐĩ ĐąŅŅи вŅŅаĐŊОвĐģĐĩĐŊиК ŅĐē `['*']`, ĐŊĐĩОйŅ
ŅĐ´ĐŊĐž вĐēаСаŅи ĐēĐžĐŊĐēŅĐĩŅĐŊŅ Đ´ĐļĐĩŅĐĩĐģа.
+* `expose_headers` - ĐĐēаСŅŅ, ŅĐēŅ ĐˇĐ°ĐŗĐžĐģОвĐēи вŅĐ´ĐŋОвŅĐ´Ņ ĐŋОвиĐŊĐŊŅ ĐąŅŅи Đ´ĐžŅŅŅĐŋĐŊŅ Đ´ĐģŅ ĐąŅаŅСĐĩŅа. Đа СаĐŧОвŅŅваĐŊĐŊŅĐŧ `[]`.
+* `max_age` - ĐŅŅаĐŊОвĐģŅŅ ĐŧаĐēŅиĐŧаĐģŅĐŊиК ŅĐ°Ņ (Ņ ŅĐĩĐēŅĐŊдаŅ
) Đ´ĐģŅ ĐēĐĩŅŅваĐŊĐŊŅ CORS-вŅĐ´ĐŋОвŅĐ´ĐĩĐš Ņ ĐąŅаŅСĐĩŅаŅ
. Đа СаĐŧОвŅŅваĐŊĐŊŅĐŧ `600`.
+
+ĐĻĐĩĐš middleware ОйŅОйĐģŅŅ Đ´Đ˛Đ° ŅиĐŋи HTTP-СаĐŋиŅŅв...
+
+### ĐĐžĐŋĐĩŅĐĩĐ´ĐŊŅ CORS-СаĐŋиŅи (preflight requests)
+
+ĐĻĐĩ ĐąŅĐ´Ņ-ŅĐēŅ `OPTIONS` - СаĐŋиŅи, ŅĐž ĐŧŅŅŅŅŅŅ ĐˇĐ°ĐŗĐžĐģОвĐēи `Origin` Ņа `Access-Control-Request-Method`.
+
+ĐŖ ŅаĐēĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ middleware ĐŋĐĩŅĐĩŅ
ĐžĐŋиŅŅ Đ˛Ņ
ŅĐ´ĐŊиК СаĐŋĐ¸Ņ Ņ Đ˛ŅĐ´ĐŋОвŅŅŅŅ Đ˛ŅĐ´ĐŋОвŅĐ´ĐŊиĐŧи CORS-ĐˇĐ°ĐŗĐžĐģОвĐēаĐŧи, ĐŋОвĐĩŅŅаŅŅи айО `200`, айО `400` Đ´ĐģŅ ŅĐŊŅĐžŅĐŧаŅŅĐšĐŊиŅ
ŅŅĐģĐĩĐš.
+
+### ĐŅĐžŅŅŅ ĐˇĐ°ĐŋиŅи
+
+ĐŅĐ´Ņ-ŅĐēŅ ĐˇĐ°ĐŋиŅи ŅС ĐˇĐ°ĐŗĐžĐģОвĐēĐžĐŧ `Origin`. ĐŖ ŅŅĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ middleware ĐŋŅĐžĐŋŅŅŅиŅŅ ĐˇĐ°ĐŋĐ¸Ņ ŅĐē СвиŅаКĐŊиК, аĐģĐĩ дОдаŅŅŅ Đ˛ŅĐ´ĐŋОвŅĐ´ĐŊŅ CORS-ĐˇĐ°ĐŗĐžĐģОвĐēи Ņ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ.
+
+## ĐОдаŅĐēОва ŅĐŊŅĐžŅĐŧаŅŅŅ
+
+ĐŅĐģŅŅĐĩ ĐŋŅĐž CORS ĐŧĐžĐļĐŊа Đ´ŅСĐŊаŅиŅŅ Đ˛ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ Mozilla .
+
+/// note | ĐĸĐĩŅ
ĐŊŅŅĐŊŅ Đ´ĐĩŅаĐģŅ
+
+ĐĸаĐēĐžĐļ ĐŧĐžĐļĐŊа виĐēĐžŅиŅŅОвŅваŅи `from starlette.middleware.cors import CORSMiddleware`.
+
+**FastAPI** ĐŊĐ°Đ´Đ°Ņ ĐēŅĐģŅĐēа middleware Ņ `fastapi.middleware` Đ´ĐģŅ ĐˇŅŅŅĐŊĐžŅŅŅ ŅОСŅОйĐŊиĐēŅв. ĐĐģĐĩ ĐąŅĐģŅŅŅŅŅŅ Đ´ĐžŅŅŅĐŋĐŊиŅ
middleware ĐŋĐžŅ
ОдŅŅŅ ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž ĐˇŅ Starlette.
+
+///
diff --git a/docs/uk/docs/tutorial/debugging.md b/docs/uk/docs/tutorial/debugging.md
new file mode 100644
index 000000000..b0e5344f8
--- /dev/null
+++ b/docs/uk/docs/tutorial/debugging.md
@@ -0,0 +1,112 @@
+# ĐаĐģĐ°ĐŗĐžĐ´ĐļĐĩĐŊĐŊŅ (Debugging)
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ĐŋŅĐ´'ŅĐ´ĐŊаŅи Đ´ĐĩĐąĐ°ĐŗĐĩŅ Ņ ĐаŅĐžĐŧŅ ŅĐĩдаĐēŅĐžŅŅ ĐēОдŅ, ĐŊаĐŋŅиĐēĐģад, Ņ Visual Studio Code айО PyCharm.
+
+## ĐиĐēĐģиĐē `uvicorn`
+
+ĐŖ ĐаŅĐžĐŧŅ FastAPI-дОдаŅĐēŅ ŅĐŧĐŋĐžŅŅŅĐšŅĐĩ Ņа СаĐŋŅŅŅŅŅŅ `uvicorn` ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž:
+
+{* ../../docs_src/debugging/tutorial001.py hl[1,15] *}
+
+### ĐŅĐž `__name__ == "__main__"`
+
+ĐĐžĐģОвĐŊа ĐŧĐĩŅа виĐēĐžŅиŅŅаĐŊĐŊŅ `__name__ == "__main__"` â ŅĐĩ СайĐĩСĐŋĐĩŅĐĩĐŊĐŊŅ Đ˛Đ¸ĐēĐžĐŊаĐŊĐŊŅ ĐŋĐĩвĐŊĐžĐŗĐž ĐēĐžĐ´Ņ ŅŅĐģŅĐēи ŅОдŅ, ĐēĐžĐģи ŅаКĐģ СаĐŋŅŅĐēаŅŅŅŅŅ ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž:
+
+
+
+```console
+$ python myapp.py
+```
+
+
+
+аĐģĐĩ ĐŊĐĩ виĐēĐžĐŊŅŅŅŅŅŅ ĐŋŅи ĐšĐžĐŗĐž ŅĐŧĐŋĐžŅŅŅ Đ˛ ŅĐŊŅиК ŅаКĐģ, ĐŊаĐŋŅиĐēĐģад:
+
+```Python
+from myapp import app
+```
+
+#### ĐĐĩŅаĐģŅĐŊŅŅĐĩ
+
+ĐŅиĐŋŅŅŅиĐŧĐž, ĐĐ°Ņ ŅаКĐģ ĐŊаСиваŅŅŅŅŅ `myapp.py`.
+
+Đ¯ĐēŅĐž Đи СаĐŋŅŅŅиŅĐĩ ĐšĐžĐŗĐž ŅаĐē:
+
+
+
+```console
+$ python myapp.py
+```
+
+
+
+ŅĐžĐ´Ņ Đ˛ĐŊŅŅŅŅŅĐŊŅ ĐˇĐŧŅĐŊĐŊа `__name__`, ŅĐēа ŅŅвОŅŅŅŅŅŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐŊĐž Python, ĐŧаŅиĐŧĐĩ СĐŊаŅĐĩĐŊĐŊŅ `"__main__"`.
+
+ĐŅĐļĐĩ, ŅĐĩĐš ĐąĐģĐžĐē ĐēОдŅ:
+
+```Python
+ uvicorn.run(app, host="0.0.0.0", port=8000)
+```
+
+ĐąŅĐ´Đĩ виĐēĐžĐŊаĐŊиК.
+
+---
+
+ĐĻĐĩ ĐŊĐĩ ŅŅаĐŊĐĩŅŅŅŅ, ŅĐēŅĐž Đи ŅĐŧĐŋĐžŅŅŅŅŅĐĩ ŅĐĩĐš ĐŧОдŅĐģŅ (ŅаКĐģ).
+
+Đ¯ĐēŅĐž Ņ ĐĐ°Ņ Ņ ŅĐŊŅиК ŅаКĐģ, ĐŊаĐŋŅиĐēĐģад `importer.py`, С ĐŊаŅŅŅĐŋĐŊиĐŧ ĐēОдОĐŧ:
+
+```Python
+from myapp import app
+
+# ĐОдаŅĐēОвиК ĐēОд
+```
+
+ĐŖ ŅŅĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐŊĐž ŅŅвОŅĐĩĐŊа СĐŧŅĐŊĐŊа Ņ ŅаКĐģŅ `myapp.py` ĐŊĐĩ ĐŧаŅиĐŧĐĩ СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐŧŅĐŊĐŊĐžŅ `__name__` ŅĐē `"__main__"`.
+
+ĐŅĐļĐĩ, ŅŅĐ´ĐžĐē:
+
+```Python
+ uvicorn.run(app, host="0.0.0.0", port=8000)
+```
+
+ĐŊĐĩ ĐąŅĐ´Đĩ виĐēĐžĐŊаĐŊĐž.
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+ĐŅĐģŅŅ Đ´ĐĩŅаĐģŅĐŊŅ ŅĐŊŅĐžŅĐŧаŅŅŅ ĐŧĐžĐļĐŊа СĐŊаКŅи в ĐžŅŅŅŅĐšĐŊŅĐš Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ Python .
+
+///
+
+## ĐаĐŋŅŅĐē ĐēĐžĐ´Ņ Đˇ ваŅиĐŧ Đ´ĐĩĐąĐ°ĐŗĐĩŅĐžĐŧ
+
+ĐŅĐēŅĐģŅĐēи Đи СаĐŋŅŅĐēаŅŅĐĩ ŅĐĩŅвĐĩŅ Uvicorn ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž С ĐаŅĐžĐŗĐž ĐēОдŅ, Đи ĐŧĐžĐļĐĩŅĐĩ СаĐŋŅŅŅиŅи ваŅŅ Python ĐŋŅĐžĐŗŅаĐŧŅ (Đ˛Đ°Ņ FastAPI дОдаŅĐžĐē) ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž С Đ´ĐĩĐąĐ°ĐŗĐĩŅа.
+
+---
+
+ĐаĐŋŅиĐēĐģад, Ņ Visual Studio Code Đи ĐŧĐžĐļĐĩŅĐĩ:
+
+* ĐĐĩŅĐĩКдŅŅŅ ĐŊа вĐēĐģадĐēŅ "Debug".
+* ĐаŅиŅĐŊŅŅŅ "Add configuration...".
+* ĐийĐĩŅŅŅŅ "Python"
+* ĐаĐŋŅŅŅŅŅŅ Đ´ĐĩĐąĐ°ĐŗĐĩŅ Đˇ ĐžĐŋŅŅŅŅ "`Python: Current File (Integrated Terminal)`".
+
+ĐĻĐĩ СаĐŋŅŅŅиŅŅ ŅĐĩŅвĐĩŅ Đˇ ĐаŅиĐŧ **FastAPI** ĐēОдОĐŧ, СŅĐŋиĐŊиŅŅŅŅ ĐŊа ŅĐžŅĐēаŅ
СŅĐŋиĐŊŅ ŅĐžŅĐž.
+
+ĐŅŅ ŅĐē ŅĐĩ ĐŧĐžĐļĐĩ Đ˛Đ¸ĐŗĐģŅдаŅи:
+
+
+
+---
+Đ¯ĐēŅĐž Đи виĐēĐžŅиŅŅОвŅŅŅĐĩ PyCharm, ви ĐŧĐžĐļĐĩŅĐĩ:
+
+* ĐŅĐ´ĐēŅиŅи ĐŧĐĩĐŊŅ "Run".
+* ĐийŅаŅи ĐžĐŋŅŅŅ "Debug...".
+* ĐĐžŅŅĐŧ С'ŅвиŅŅŅŅ ĐēĐžĐŊŅĐĩĐēŅŅĐŊĐĩ ĐŧĐĩĐŊŅ.
+* ĐийŅаŅи ŅаКĐģ Đ´ĐģŅ ĐŊаĐģĐ°ĐŗĐžĐ´ĐļĐĩĐŊĐŊŅ (Ņ ŅŅĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ, `main.py`).
+
+ĐĻĐĩ СаĐŋŅŅŅиŅŅ ŅĐĩŅвĐĩŅ Đˇ ĐаŅиĐŧ **FastAPI** ĐēОдОĐŧ, СŅĐŋиĐŊиŅŅŅŅ ĐŊа ŅĐžŅĐēаŅ
СŅĐŋиĐŊŅ ŅĐžŅĐž.
+
+ĐŅŅ ŅĐē ŅĐĩ ĐŧĐžĐļĐĩ Đ˛Đ¸ĐŗĐģŅдаŅи:
+
+
diff --git a/docs/uk/docs/tutorial/handling-errors.md b/docs/uk/docs/tutorial/handling-errors.md
new file mode 100644
index 000000000..12a356cd0
--- /dev/null
+++ b/docs/uk/docs/tutorial/handling-errors.md
@@ -0,0 +1,255 @@
+# ĐĐąŅОйĐēа ĐĐžĐŧиĐģĐžĐē
+
+Đ ĐąĐ°ĐŗĐ°ŅĐž ŅиŅŅаŅŅĐš, ĐēĐžĐģи ĐŋĐžŅŅŅĐąĐŊĐž ĐŋОвŅĐ´ĐžĐŧиŅи ĐēĐģŅŅĐŊŅа, ŅĐēиК виĐēĐžŅиŅŅОвŅŅ ĐĐ°Ņ API, ĐŋŅĐž ĐŋĐžĐŧиĐģĐēŅ.
+
+ĐĻиĐŧ ĐēĐģŅŅĐŊŅĐžĐŧ ĐŧĐžĐļĐĩ ĐąŅŅи ĐąŅаŅСĐĩŅ ŅС ŅŅĐžĐŊŅĐĩĐŊĐ´ĐžĐŧ, ĐēОд ŅĐŊŅĐžĐŗĐž ŅОСŅОйĐŊиĐēа, IoT-ĐŋŅиŅŅŅŅĐš ŅĐžŅĐž.
+
+ĐĐžĐļĐģивО, ĐаĐŧ ĐŋĐžŅŅŅĐąĐŊĐž ĐŋОвŅĐ´ĐžĐŧиŅи ĐēĐģŅŅĐŊŅа, ŅĐž:
+
+* ĐŖ ĐŊŅĐžĐŗĐž ĐŊĐĩĐ´ĐžŅŅаŅĐŊŅĐž ĐŋŅав Đ´ĐģŅ Đ˛Đ¸ĐēĐžĐŊаĐŊĐŊŅ ŅŅŅŅ ĐžĐŋĐĩŅаŅŅŅ.
+* ĐŅĐŊ ĐŊĐĩ ĐŧĐ°Ņ Đ´ĐžŅŅŅĐŋŅ Đ´Đž ŅŅĐžĐŗĐž ŅĐĩŅŅŅŅŅ.
+* ĐĐģĐĩĐŧĐĩĐŊŅ, Đ´Đž ŅĐēĐžĐŗĐž вŅĐŊ ĐŊаĐŧĐ°ĐŗĐ°ŅŅŅŅŅ ĐžŅŅиĐŧаŅи Đ´ĐžŅŅŅĐŋ, ĐŊĐĩ ŅŅĐŊŅŅ.
+* ŅĐžŅĐž.
+
+ĐŖ ŅаĐēиŅ
виĐŋадĐēаŅ
СаСвиŅаК ĐŋОвĐĩŅŅаŅŅŅŅŅ **HTTP ŅŅаŅŅŅ-ĐēОд** в Đ´ŅаĐŋаСОĐŊŅ **400** (вŅĐ´ 400 Đ´Đž 499).
+
+ĐĻĐĩ ŅŅ
ĐžĐļĐĩ ĐŊа HTTP ŅŅаŅŅŅ-ĐēОди 200 (вŅĐ´ 200 Đ´Đž 299). ĐĻŅ "200" ŅŅаŅŅŅ-ĐēОди ОСĐŊаŅаŅŅŅ, ŅĐž СаĐŋĐ¸Ņ ĐŋŅОКŅОв ŅŅĐŋŅŅĐŊĐž.
+
+ĐĄŅаŅŅŅ-ĐēОди в Đ´ŅаĐŋаСОĐŊŅ 400 ОСĐŊаŅаŅŅŅ, ŅĐž ŅŅаĐģаŅŅ ĐŋĐžĐŧиĐģĐēа С йОĐēŅ ĐēĐģŅŅĐŊŅа.
+
+ĐаĐŧ'ŅŅаŅŅĐĩ вŅŅ ŅŅ ĐŋĐžĐŧиĐģĐēи **404 Not Found** (Ņ ĐļаŅŅи ĐŋŅĐž ĐŊиŅ
)?
+
+## ĐиĐēĐžŅиŅŅаĐŊĐŊŅ `HTTPException`
+
+ЊОй ĐŋОвĐĩŅĐŊŅŅи HTTP-вŅĐ´ĐŋОвŅĐ´Ņ Đˇ ĐŋĐžĐŧиĐģĐēаĐŧи ĐēĐģŅŅĐŊŅŅ, виĐēĐžŅиŅŅОвŅĐšŅĐĩ `HTTPException`.
+
+### ĐĐŧĐŋĐžŅŅ `HTTPException`
+
+{* ../../docs_src/handling_errors/tutorial001.py hl[1] *}
+
+### ĐиĐēĐžŅиŅŅаĐŊĐŊŅ `HTTPException` Ņ ĐēОдŅ
+
+`HTTPException` â ŅĐĩ СвиŅаКĐŊа ĐŋĐžĐŧиĐģĐēа Python ŅС дОдаŅĐēОвиĐŧи даĐŊиĐŧи, ŅĐēŅ ŅŅĐžŅŅŅŅŅŅŅ API.
+
+ĐŅĐēŅĐģŅĐēи ŅĐĩ ĐŋĐžĐŧиĐģĐēа Python, Đи ĐŊĐĩ `ĐŋОвĐĩŅŅаŅŅĐĩ` ĐšĐžĐŗĐž, а `ĐŗĐĩĐŊĐĩŅŅŅŅĐĩ` (ĐŗĐĩĐŊĐĩŅŅŅŅĐĩ ĐŋĐžĐŧиĐģĐēŅ).
+
+ĐĻĐĩ ŅаĐēĐžĐļ ОСĐŊаŅаŅ, ŅĐž ŅĐēŅĐž Đи ĐŋĐĩŅĐĩĐąŅваŅŅĐĩ вŅĐĩŅĐĩдиĐŊŅ Đ´ĐžĐŋĐžĐŧŅĐļĐŊĐžŅ ŅŅĐŊĐēŅŅŅ, ŅĐēŅ Đ˛Đ¸ĐēĐģиĐēаŅŅĐĩ вŅĐĩŅĐĩдиĐŊŅ ŅвОŅŅ *ŅŅĐŊĐēŅŅŅ ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ*, Ņ ŅаĐŧ ĐŗĐĩĐŊĐĩŅŅŅŅĐĩ `HTTPException`, вŅĐĩŅĐĩдиĐŊŅ ŅŅŅŅ Đ´ĐžĐŋĐžĐŧŅĐļĐŊĐžŅ ŅŅĐŊĐēŅŅŅ, ŅĐž ŅĐĩŅŅа ĐēĐžĐ´Ņ Đ˛ *ŅŅĐŊĐēŅŅŅ ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ* ĐŊĐĩ ĐąŅĐ´Đĩ виĐēĐžĐŊаĐŊа. ĐаĐŋĐ¸Ņ ĐžĐ´ŅĐ°ĐˇŅ ĐˇĐ°Đ˛ĐĩŅŅиŅŅŅŅ, Ņ HTTP-ĐŋĐžĐŧиĐģĐēа С `HTTPException` ĐąŅĐ´Đĩ ĐŊадŅŅĐģаĐŊа ĐēĐģŅŅĐŊŅŅ.
+
+ĐĐĩŅĐĩĐ˛Đ°ĐŗĐ° виĐēĐžŅиŅŅаĐŊĐŊŅ `ĐŗĐĩĐŊĐĩŅаŅŅŅ` (raise) ĐŋĐžĐŧиĐģĐēи СаĐŧŅŅŅŅ `ĐŋОвĐĩŅĐŊĐĩĐŊĐŊŅ` СĐŊаŅĐĩĐŊĐŊŅ (return) ŅŅаĐŊĐĩ ĐąŅĐģŅŅ ĐžŅĐĩвидĐŊиĐŧ в ŅОСдŅĐģŅ ĐŋŅĐž ĐаĐģĐĩĐļĐŊĐžŅŅŅ Ņа ĐĐĩСĐŋĐĩĐēŅ.
+
+ĐŖ ŅŅĐžĐŧŅ ĐŋŅиĐēĐģадŅ, ŅĐēŅĐž ĐēĐģŅŅĐŊŅ ĐˇĐ°ĐŋиŅŅŅ ĐĩĐģĐĩĐŧĐĩĐŊŅ ĐˇĐ° ID, ŅĐēĐžĐŗĐž ĐŊĐĩ ŅŅĐŊŅŅ, ĐąŅĐ´Đĩ ĐˇĐŗĐĩĐŊĐĩŅОваĐŊĐž ĐŋĐžĐŧиĐģĐēŅ ĐˇŅ ŅŅаŅŅŅ-ĐēОдОĐŧ `404`:
+
+{* ../../docs_src/handling_errors/tutorial001.py hl[11] *}
+
+### ĐŅŅиĐŧаĐŊа вŅĐ´ĐŋОвŅĐ´Ņ
+
+Đ¯ĐēŅĐž ĐēĐģŅŅĐŊŅ ŅОйиŅŅ ĐˇĐ°ĐŋĐ¸Ņ ĐˇĐ° ŅĐģŅŅ
ĐžĐŧ `http://example.com/items/foo` (Đ´Đĩ `item_id` `"foo"`), вŅĐŊ ĐžŅŅиĐŧĐ°Ņ ŅŅаŅŅŅ-ĐēОд 200 Ņ JSON вŅĐ´ĐŋОвŅĐ´Ņ:
+
+```JSON
+{
+ "item": "The Foo Wrestlers"
+}
+```
+
+ĐĐģĐĩ ŅĐēŅĐž ĐēĐģŅŅĐŊŅ ŅОйиŅŅ ĐˇĐ°ĐŋĐ¸Ņ ĐŊа `http://example.com/items/bar` (Đ´Đĩ `item_id` ĐŧĐ°Ņ ĐŊĐĩ ŅŅĐŊŅŅŅĐĩ СĐŊаŅĐĩĐŊĐŊŅ `"bar"`), ŅĐž ĐžŅŅиĐŧĐ°Ņ ŅŅаŅŅŅ-ĐēОд 404 (ĐŋĐžĐŧиĐģĐēа "ĐŊĐĩ СĐŊаКдĐĩĐŊĐž") Ņа вŅĐ´ĐŋОвŅĐ´Ņ:
+
+```JSON
+{
+ "detail": "Item not found"
+}
+```
+
+/// tip | ĐĐžŅада
+
+ĐŅĐ´ ŅĐ°Ņ Đ˛Đ¸ĐēĐģиĐēŅ `HTTPException` Đи ĐŧĐžĐļĐĩŅĐĩ ĐŋĐĩŅĐĩдаŅи ĐąŅĐ´Ņ-ŅĐēĐĩ СĐŊаŅĐĩĐŊĐŊŅ, ŅĐēĐĩ ĐŧĐžĐļĐĩ ĐąŅŅи ĐŋĐĩŅĐĩŅвОŅĐĩĐŊĐĩ в JSON, ŅĐē ĐŋаŅаĐŧĐĩŅŅ `detail`, а ĐŊĐĩ ĐģиŅĐĩ ŅŅĐ´ĐžĐē (`str`).
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ĐŋĐĩŅĐĩдаŅи `dict`, `list` ŅĐžŅĐž.
+
+ĐĐžĐŊи ОйŅОйĐģŅŅŅŅŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐŊĐž Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ **FastAPI** Ņа ĐŋĐĩŅĐĩŅвОŅŅŅŅŅŅŅ Đ˛ JSON.
+
+///
+
+## ĐОдаваĐŊĐŊŅ Đ˛ĐģаŅĐŊиŅ
ĐˇĐ°ĐŗĐžĐģОвĐēŅв
+
+ĐĐŊĐžĐ´Ņ ĐŋĐžŅŅŅĐąĐŊĐž дОдаŅи вĐģаŅĐŊŅ ĐˇĐ°ĐŗĐžĐģОвĐēи Đ´Đž HTTP-ĐŋĐžĐŧиĐģĐēи, ĐŊаĐŋŅиĐēĐģад, Đ´ĐģŅ ĐŋĐĩвĐŊиŅ
ŅиĐŋŅв ĐąĐĩСĐŋĐĩĐēи.
+
+ĐĐŧОвŅŅĐŊĐž, ĐаĐŧ ĐŊĐĩ дОвĐĩĐ´ĐĩŅŅŅŅ Đ˛Đ¸ĐēĐžŅиŅŅОвŅваŅи ŅĐĩ ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž Ņ ŅвОŅĐŧŅ ĐēОдŅ.
+
+ĐĐģĐĩ ŅĐēŅĐž ĐаĐŧ СĐŊадОйиŅŅŅŅ ŅĐĩ Đ´ĐģŅ ŅĐēĐģадĐŊĐžĐŗĐž ŅŅĐĩĐŊаŅŅŅ, Đи ĐŧĐžĐļĐĩŅĐĩ дОдаŅи вĐģаŅĐŊŅ ĐˇĐ°ĐŗĐžĐģОвĐēи:
+
+{* ../../docs_src/handling_errors/tutorial002.py hl[14] *}
+
+## ĐŅŅаĐŊОвĐģĐĩĐŊĐŊŅ Đ˛ĐģаŅĐŊиŅ
ОйŅОйĐŊиĐēŅв ĐŋĐžĐŧиĐģĐžĐē
+
+Đи ĐŧĐžĐļĐĩŅĐĩ дОдаŅи вĐģаŅĐŊŅ ĐžĐąŅОйĐŊиĐēи ĐŋĐžĐŧиĐģĐžĐē Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ ŅиŅ
ŅаĐŧиŅ
ŅŅиĐģŅŅ ĐžĐąŅОйĐēи ĐŋĐžĐŧиĐģĐžĐē ĐˇŅ Starlette .
+
+ĐŅиĐŋŅŅŅиĐŧĐž, Ņ ĐĐ°Ņ Ņ Đ˛ĐģаŅĐŊиК ОйĘŧŅĐēŅ ĐŋĐžĐŧиĐģĐēи `UnicornException`, ŅĐēĐĩ Đи (айО ĐąŅĐąĐģŅĐžŅĐĩĐēа, ŅĐēŅ Đи виĐēĐžŅиŅŅОвŅŅŅĐĩ) ĐŧĐžĐļĐĩ `ĐˇĐŗĐĩĐŊĐĩŅŅваŅи` (`raise`).
+
+Đ Đи Ņ
ĐžŅĐĩŅĐĩ ОйŅОйĐģŅŅи ŅĐĩ виĐēĐģŅŅĐĩĐŊĐŊŅ ĐŗĐģОйаĐģŅĐŊĐž Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ FastAPI.
+
+Đи ĐŧĐžĐļĐĩŅĐĩ дОдаŅи вĐģаŅĐŊиК ОйŅОйĐŊиĐē виĐēĐģŅŅĐĩĐŊŅ ĐˇĐ° Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ `@app.exception_handler()`:
+
+{* ../../docs_src/handling_errors/tutorial003.py hl[5:7,13:18,24] *}
+
+ĐĸŅŅ, ŅĐēŅĐž Đи СвĐĩŅĐŊĐĩŅĐĩŅŅ Đ´Đž `/unicorns/yolo`, ŅĐž ĐˇĐŗĐĩĐŊĐĩŅŅŅŅŅŅŅ ĐŋĐžĐŧиĐģĐēа `UnicornException`.
+
+ĐĐģĐĩ вОĐŊа ĐąŅĐ´Đĩ ОйŅОйĐģĐĩĐŊа ŅŅĐŊĐēŅŅŅŅ-ОйŅОйĐŊиĐēĐžĐŧ `unicorn_exception_handler`.
+
+ĐŅĐļĐĩ, Đи ĐžŅŅиĐŧаŅŅĐĩ СŅОСŅĐŧŅĐģŅ ĐŋĐžĐŧиĐģĐēŅ ĐˇŅ HTTP-ŅŅаŅŅŅĐžĐŧ `418` Ņ JSON-вŅĐ´ĐŋОвŅĐ´Đ´Ņ:
+
+```JSON
+{"message": "Oops! yolo did something. There goes a rainbow..."}
+```
+
+/// note | ĐĸĐĩŅ
ĐŊŅŅĐŊŅ Đ´ĐĩŅаĐģŅ
+
+Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи `from starlette.requests import Request` Ņ `from starlette.responses import JSONResponse`.
+
+**FastAPI** ĐŊĐ°Đ´Đ°Ņ ŅŅ ŅаĐŧŅ `starlette.responses`, ŅĐž Đš `fastapi.responses`, ĐŋŅĐžŅŅĐž Đ´ĐģŅ ĐˇŅŅŅĐŊĐžŅŅŅ ŅОСŅОйĐŊиĐēа. ĐĐģĐĩ ĐąŅĐģŅŅŅŅŅŅ Đ´ĐžŅŅŅĐŋĐŊиŅ
вŅĐ´ĐŋОвŅĐ´ĐĩĐš ĐŊадŅ
ОдŅŅŅ ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž ĐˇŅ Starlette. ĐĸĐĩ Đļ ŅаĐŧĐĩ ŅŅĐžŅŅŅŅŅŅŅ Ņ `Request`.
+
+///
+
+## ĐĐĩŅĐĩвиСĐŊаŅĐĩĐŊĐŊŅ ĐžĐąŅОйĐŊиĐēŅв ĐŋĐžĐŧиĐģĐžĐē Са СаĐŧОвŅŅваĐŊĐŊŅĐŧ
+
+**FastAPI** ĐŧĐ°Ņ ĐēŅĐģŅĐēа ОйŅОйĐŊиĐēŅв ĐŋĐžĐŧиĐģĐžĐē Са СаĐŧОвŅŅваĐŊĐŊŅĐŧ.
+
+ĐĻŅ ĐžĐąŅОйĐŊиĐēи вŅĐ´ĐŋОвŅдаŅŅŅ ĐˇĐ° ĐŋОвĐĩŅĐŊĐĩĐŊĐŊŅ ŅŅаĐŊдаŅŅĐŊиŅ
JSON-вŅĐ´ĐŋОвŅĐ´ĐĩĐš, ĐēĐžĐģи Đи `ĐŗĐĩĐŊĐĩŅŅŅŅĐĩ` (`raise`) `HTTPException`, а ŅаĐēĐžĐļ ĐēĐžĐģи СаĐŋĐ¸Ņ ĐŧŅŅŅиŅŅ ĐŊĐĩĐēĐžŅĐĩĐēŅĐŊŅ Đ´Đ°ĐŊŅ.
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ĐŋĐĩŅĐĩвиСĐŊаŅиŅи ŅŅ ĐžĐąŅОйĐŊиĐēи, ŅŅвОŅивŅи вĐģаŅĐŊŅ.
+
+### ĐĐĩŅĐĩвиСĐŊаŅĐĩĐŊĐŊŅ ĐŋĐžĐŧиĐģĐžĐē ваĐģŅдаŅŅŅ ĐˇĐ°ĐŋиŅŅ
+
+ĐĐžĐģи СаĐŋĐ¸Ņ ĐŧŅŅŅиŅŅ ĐŊĐĩĐēĐžŅĐĩĐēŅĐŊŅ Đ´Đ°ĐŊŅ, **FastAPI** ĐŗĐĩĐŊĐĩŅŅŅ `RequestValidationError`.
+
+Đ ŅаĐēĐžĐļ вĐēĐģŅŅĐ°Ņ ĐžĐąŅОйĐŊиĐē ĐŋĐžĐŧиĐģĐžĐē Са СаĐŧОвŅŅваĐŊĐŊŅĐŧ Đ´ĐģŅ ĐŊŅĐžĐŗĐž.
+
+ЊОй ĐŋĐĩŅĐĩвиСĐŊаŅиŅи ĐšĐžĐŗĐž, ŅĐŧĐŋĐžŅŅŅĐšŅĐĩ `RequestValidationError` Ņ Đ˛Đ¸ĐēĐžŅиŅŅОвŅĐšŅĐĩ ĐšĐžĐŗĐž С `@app.exception_handler(RequestValidationError)` Đ´ĐģŅ Đ´ĐĩĐēĐžŅŅваĐŊĐŊŅ ĐžĐąŅОйĐŊиĐēа ĐŋĐžĐŧиĐģĐžĐē.
+
+ĐĐąŅОйĐŊиĐē ĐŋĐžĐŧиĐģĐžĐē ĐžŅŅиĐŧŅŅ `Request` Ņ ŅаĐŧŅ ĐŋĐžĐŧиĐģĐēŅ.
+
+{* ../../docs_src/handling_errors/tutorial004.py hl[2,14:16] *}
+
+ĐĸĐĩĐŋĐĩŅ, ŅĐēŅĐž Đи ĐŋĐĩŅĐĩКдĐĩŅĐĩ Са ĐŋĐžŅиĐģаĐŊĐŊŅĐŧ `/items/foo`, СаĐŧŅŅŅŅ ŅĐžĐŗĐž, ŅОй ĐžŅŅиĐŧаŅи ŅŅаĐŊдаŅŅĐŊŅ JSON-ĐŋĐžĐŧиĐģĐēŅ:
+
+```JSON
+{
+ "detail": [
+ {
+ "loc": [
+ "path",
+ "item_id"
+ ],
+ "msg": "value is not a valid integer",
+ "type": "type_error.integer"
+ }
+ ]
+}
+```
+
+Đи ĐžŅŅиĐŧаŅŅĐĩ ŅĐĩĐēŅŅĐžĐ˛Ņ Đ˛ĐĩŅŅŅŅ:
+
+```
+1 validation error
+path -> item_id
+ value is not a valid integer (type=type_error.integer)
+```
+
+#### `RequestValidationError` ĐŋŅĐžŅи `ValidationError`
+
+/// warning | ĐŖĐ˛Đ°ĐŗĐ°
+
+ĐĻĐĩ ŅĐĩŅ
ĐŊŅŅĐŊŅ Đ´ĐĩŅаĐģŅ, ŅĐēŅ Đи ĐŧĐžĐļĐĩŅĐĩ ĐŋŅĐžĐŋŅŅŅиŅи, ŅĐēŅĐž вОĐŊи СаŅаС ĐŊĐĩ ваĐļĐģĐ¸Đ˛Ņ Đ´ĐģŅ ĐаŅ.
+
+///
+
+`RequestValidationError` Ņ ĐŋŅĐ´ĐēĐģаŅĐžĐŧ Pydantic `ValidationError` .
+
+**FastAPI** виĐēĐžŅиŅŅОвŅŅ ĐšĐžĐŗĐž Đ´ĐģŅ ŅĐžĐŗĐž, ŅĐēŅĐž Đи виĐēĐžŅиŅŅОвŅŅŅĐĩ ĐŧОдĐĩĐģŅ Pydantic Ņ `response_model` Ņ Ņ Đ˛Đ°ŅиŅ
даĐŊиŅ
Ņ ĐŋĐžĐŧиĐģĐēа, Đи ĐŋОйаŅиĐģи ĐŋĐžĐŧиĐģĐēŅ Ņ ŅвОŅĐŧŅ ĐļŅŅĐŊаĐģŅ.
+
+ĐĐģĐĩ ĐēĐģŅŅĐŊŅ/ĐēĐžŅиŅŅŅĐ˛Đ°Ņ ĐŊĐĩ ĐŋОйаŅиŅŅ ŅŅ. ĐаŅĐžĐŧŅŅŅŅ ĐēĐģŅŅĐŊŅ ĐžŅŅиĐŧĐ°Ņ "Internal Server Error" ĐˇŅ ŅŅаŅŅŅĐžĐŧ HTTP `500`.
+
+ĐĸаĐē ĐŧĐ°Ņ ĐąŅŅи, ŅĐēŅĐž Ņ ĐĐ°Ņ Đ˛Đ¸ĐŊиĐēĐģа `ValidationError` Pydantic Ņ *вŅĐ´ĐŋОвŅĐ´Ņ* айО Đ´ĐĩŅĐŊĐ´Đĩ Ņ Đ˛Đ°ŅĐžĐŧŅ ĐēĐžĐ´Ņ (ĐŊĐĩ Ņ *СаĐŋиŅŅ* ĐēĐģŅŅĐŊŅа), ŅĐĩ ĐŊаŅĐŋŅĐ°Đ˛Đ´Ņ Ņ ĐŋĐžĐŧиĐģĐēĐžŅ Ņ ĐаŅĐžĐŧŅ ĐēОдŅ.
+
+Đ ĐŋĐžĐēи Đи ŅŅ Đ˛Đ¸ĐŋŅавĐģŅŅŅĐĩ, ĐēĐģŅŅĐŊŅи/ĐēĐžŅиŅŅŅваŅŅ ĐŊĐĩ ĐŋОвиĐŊĐŊŅ ĐŧаŅи Đ´ĐžŅŅŅĐŋŅ Đ´Đž вĐŊŅŅŅŅŅĐŊŅĐžŅ ŅĐŊŅĐžŅĐŧаŅŅŅ ĐŋŅĐž ĐŋĐžĐŧиĐģĐēŅ, ĐžŅĐēŅĐģŅĐēи ŅĐĩ ĐŧĐžĐļĐĩ ĐŋŅиСвĐĩŅŅи Đ´Đž вŅаСĐģивОŅŅŅ ĐąĐĩСĐŋĐĩĐēи.
+
+### ĐĐĩŅĐĩвиСĐŊаŅĐĩĐŊĐŊŅ ĐžĐąŅОйĐŊиĐēа ĐŋĐžĐŧиĐģĐžĐē `HTTPException`
+
+ĐĐŊаĐģĐžĐŗŅŅĐŊĐž, Đи ĐŧĐžĐļĐĩŅĐĩ ĐŋĐĩŅĐĩвиСĐŊаŅиŅи ОйŅОйĐŊиĐē `HTTPException`.
+
+ĐаĐŋŅиĐēĐģад, Đи ĐŧĐžĐļĐĩŅĐĩ СаŅ
ĐžŅŅŅи ĐŋОвĐĩŅĐŊŅŅи ŅĐĩĐēŅŅĐžĐ˛Ņ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ ĐˇĐ°ĐŧŅŅŅŅ JSON Đ´ĐģŅ ŅиŅ
ĐŋĐžĐŧиĐģĐžĐē:
+
+{* ../../docs_src/handling_errors/tutorial004.py hl[3:4,9:11,22] *}
+
+/// note | ĐĸĐĩŅ
ĐŊŅŅĐŊŅ Đ´ĐĩŅаĐģŅ
+
+Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи `from starlette.responses import PlainTextResponse`.
+
+**FastAPI** ĐŊĐ°Đ´Đ°Ņ ŅŅ ŅаĐŧŅ `starlette.responses`, ŅĐž Đš `fastapi.responses`, ĐŋŅĐžŅŅĐž Đ´ĐģŅ ĐˇŅŅŅĐŊĐžŅŅŅ ŅОСŅОйĐŊиĐēа. ĐĐģĐĩ ĐąŅĐģŅŅŅŅŅŅ Đ´ĐžŅŅŅĐŋĐŊиŅ
вŅĐ´ĐŋОвŅĐ´ĐĩĐš ĐŊадŅ
ОдŅŅŅ ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž ĐˇŅ Starlette.
+
+///
+
+### ĐиĐēĐžŅиŅŅаĐŊĐŊŅ ŅŅĐģа `RequestValidationError`
+
+`RequestValidationError` ĐŧŅŅŅиŅŅ `body`, ŅĐēиК вŅĐŊ ĐžŅŅиĐŧав ŅС ĐŊĐĩĐēĐžŅĐĩĐēŅĐŊиĐŧи даĐŊиĐŧи.
+
+Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи ŅĐĩ ĐŋŅĐ´ ŅĐ°Ņ ŅОСŅОйĐēи ŅĐ˛ĐžĐŗĐž дОдаŅĐēа, ŅОй ĐģĐžĐŗŅваŅи ŅŅĐģĐž СаĐŋиŅŅ Ņа ĐŊаĐģĐ°ĐŗĐžĐ´ĐļŅваŅи ĐšĐžĐŗĐž, ĐŋОвĐĩŅŅаŅи ĐēĐžŅиŅŅŅваŅĐĩĐ˛Ņ ŅĐžŅĐž.
+
+{* ../../docs_src/handling_errors/tutorial005.py hl[14] *}
+
+ĐĸĐĩĐŋĐĩŅ ŅĐŋŅОйŅĐšŅĐĩ ĐŊадŅŅĐģаŅи ĐŊĐĩĐēĐžŅĐĩĐēŅĐŊиК ĐĩĐģĐĩĐŧĐĩĐŊŅ, ĐŊаĐŋŅиĐēĐģад:
+
+```JSON
+{
+ "title": "towel",
+ "size": "XL"
+}
+```
+Đи ĐžŅŅиĐŧаŅŅĐĩ вŅĐ´ĐŋОвŅĐ´Ņ, ŅĐēа ĐŋОвŅĐ´ĐžĐŧиŅŅ ĐаĐŧ, ŅĐēŅ ŅаĐŧĐĩ даĐŊŅ Ņ ĐŊĐĩĐēĐžŅĐĩĐēŅĐŊŅ Ņ Đ˛Đ°ŅĐžĐŧŅ ŅŅĐģŅ ĐˇĐ°ĐŋиŅŅ:
+
+
+```JSON hl_lines="12-15"
+{
+ "detail": [
+ {
+ "loc": [
+ "body",
+ "size"
+ ],
+ "msg": "value is not a valid integer",
+ "type": "type_error.integer"
+ }
+ ],
+ "body": {
+ "title": "towel",
+ "size": "XL"
+ }
+}
+```
+
+#### `HTTPException` FastAPI ĐŋŅĐžŅи `HTTPException` Starlette
+
+**FastAPI** ĐŧĐ°Ņ Đ˛ĐģаŅĐŊиК `HTTPException`.
+
+Đ ĐēĐģĐ°Ņ ĐŋĐžĐŧиĐģĐēи `HTTPException` в **FastAPI** ŅŅĐŋадĐēОвŅŅŅŅŅŅ Đ˛ŅĐ´ ĐēĐģаŅŅ ĐŋĐžĐŧиĐģĐēи `HTTPException` в Starlette.
+
+ĐдиĐŊа ŅŅСĐŊиŅŅ ĐŋĐžĐģŅĐŗĐ°Ņ Đ˛ ŅĐžĐŧŅ, ŅĐž `HTTPException` в **FastAPI** ĐŋŅиКĐŧĐ°Ņ ĐąŅĐ´Ņ-ŅĐēŅ Đ´Đ°ĐŊŅ, ŅĐēŅ ĐŧĐžĐļĐŊа ĐŋĐĩŅĐĩŅвОŅиŅи ĐŊа JSON, Đ´ĐģŅ ĐŋĐžĐģŅ `detail`, ŅĐžĐ´Ņ ŅĐē `HTTPException` Ņ Starlette ĐŋŅиКĐŧĐ°Ņ ŅŅĐģŅĐēи ŅŅĐ´Đēи.
+
+ĐŅĐļĐĩ, Đи ĐŧĐžĐļĐĩŅĐĩ ĐŋŅОдОвĐļŅваŅи виĐēĐžŅиŅŅОвŅваŅи `HTTPException` в **FastAPI** ŅĐē СаСвиŅаК Ņ ŅвОŅĐŧŅ ĐēОдŅ.
+
+ĐĐģĐĩ ĐēĐžĐģи Đи ŅĐĩŅŅŅŅŅŅŅĐĩ ОйŅОйĐŊиĐē виĐēĐģŅŅĐĩĐŊŅ, ŅĐģŅĐ´ ŅĐĩŅŅŅŅŅваŅи ĐšĐžĐŗĐž Đ´ĐģŅ `HTTPException` ĐˇŅ Starlette.
+
+ĐĸаĐēиĐŧ ŅиĐŊĐžĐŧ, ŅĐēŅĐž ĐąŅĐ´Ņ-ŅĐēа ŅаŅŅиĐŊа вĐŊŅŅŅŅŅĐŊŅĐžĐŗĐž ĐēĐžĐ´Ņ Starlette айО ŅОСŅиŅĐĩĐŊĐŊŅ Ņи ĐŋĐģĐ°ĐŗŅĐŊ Starlette ĐˇĐŗĐĩĐŊĐĩŅŅŅ (raise) `HTTPException`, ĐĐ°Ņ ĐžĐąŅОйĐŊиĐē СĐŧĐžĐļĐĩ ĐŋĐĩŅĐĩŅ
ĐžĐŋиŅи Ņа ОйŅОйиŅи ŅŅ.
+
+ĐŖ ŅŅĐžĐŧŅ ĐŋŅиĐēĐģадŅ, ŅОй ĐŧаŅи ĐŧĐžĐļĐģивŅŅŅŅ Đ˛Đ¸ĐēĐžŅиŅŅОвŅваŅи Ойидва `HTTPException` в ОдĐŊĐžĐŧŅ ĐēОдŅ, ĐŋĐžĐŧиĐģĐēа Starlette ĐŋĐĩŅĐĩĐšĐŧĐĩĐŊОвŅŅŅŅŅŅ ĐŊа `StarletteHTTPException`:
+
+```Python
+from starlette.exceptions import HTTPException as StarletteHTTPException
+```
+
+### ĐОвŅĐžŅĐŊĐĩ виĐēĐžŅиŅŅаĐŊĐŊŅ ĐžĐąŅОйĐŊиĐēŅв ĐŋĐžĐŧиĐģĐžĐē **FastAPI**
+
+Đ¯ĐēŅĐž Đи Ņ
ĐžŅĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи ĐŋĐžĐŧиĐģĐēи ŅаСОĐŧ ŅС ŅаĐēиĐŧи Đļ ОйŅОйĐŊиĐēаĐŧи ĐŋĐžĐŧиĐģĐžĐē Са СаĐŧОвŅŅваĐŊĐŊŅĐŧ, ŅĐē Ņ **FastAPI**, Đи ĐŧĐžĐļĐĩŅĐĩ ŅĐŧĐŋĐžŅŅŅваŅи Ņа ĐŋОвŅĐžŅĐŊĐž виĐēĐžŅиŅŅОвŅваŅи ŅŅ
ŅС `fastapi.exception_handlers`:
+
+{* ../../docs_src/handling_errors/tutorial006.py hl[2:5,15,21] *}
+
+ĐŖ ŅŅĐžĐŧŅ ĐŋŅиĐēĐģĐ°Đ´Ņ Đи ĐŋŅĐžŅŅĐž виĐēĐžŅиŅŅОвŅŅŅĐĩ `print` Đ´ĐģŅ Đ˛Đ¸Đ˛ĐĩĐ´ĐĩĐŊĐŊŅ Đ´ŅĐļĐĩ ŅĐŊŅĐžŅĐŧаŅивĐŊĐžĐŗĐž ĐŋОвŅĐ´ĐžĐŧĐģĐĩĐŊĐŊŅ, аĐģĐĩ Đи СŅОСŅĐŧŅĐģи ĐžŅĐŊОвĐŊŅ ŅĐ´ĐĩŅ. Đи ĐŧĐžĐļĐĩŅĐĩ ОйŅОйиŅи ĐŋĐžĐŧиĐģĐēŅ Ņа ĐŋОвŅĐžŅĐŊĐž виĐēĐžŅиŅŅОвŅваŅи ОйŅОйĐŊиĐēи ĐŋĐžĐŧиĐģĐžĐē Са СаĐŧОвŅŅваĐŊĐŊŅĐŧ.
diff --git a/docs/uk/docs/tutorial/header-param-models.md b/docs/uk/docs/tutorial/header-param-models.md
new file mode 100644
index 000000000..6f7b0bdae
--- /dev/null
+++ b/docs/uk/docs/tutorial/header-param-models.md
@@ -0,0 +1,58 @@
+# ĐОдĐĩĐģŅ ĐаŅаĐŧĐĩŅŅŅв ĐĐ°ĐŗĐžĐģОвĐēŅв
+
+Đ¯ĐēŅĐž Ņ ĐĐ°Ņ Ņ ĐŗŅŅĐŋа ĐŋОвâŅСаĐŊиŅ
ĐŋаŅаĐŧĐĩŅŅŅв ĐˇĐ°ĐŗĐžĐģОвĐēŅв, Đи ĐŧĐžĐļĐĩŅĐĩ ŅŅвОŅиŅи **Pydantic ĐŧОдĐĩĐģŅ** Đ´ĐģŅ ŅŅ
ĐžĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ.
+
+ĐĻĐĩ дОСвОĐģиŅŅ ĐаĐŧ ĐŋОвŅĐžŅĐŊĐž **виĐēĐžŅиŅŅОвŅваŅи ĐŧОдĐĩĐģŅ** в **ŅŅСĐŊиŅ
ĐŧŅŅŅŅŅ
**, а ŅаĐēĐžĐļ ĐžĐŗĐžĐģĐžŅиŅи ваĐģŅдаŅŅŅ Ņа ĐŧĐĩŅадаĐŊŅ Đ´ĐģŅ Đ˛ŅŅŅ
ĐŋаŅаĐŧĐĩŅŅŅв ОдĐŊĐžŅаŅĐŊĐž. đ
+
+/// note | ĐĐžŅаŅĐēи
+
+ĐĻŅ ĐŧĐžĐļĐģивŅŅŅŅ ĐŋŅĐ´ŅŅиĐŧŅŅŅŅŅŅ ĐŋĐžŅиĐŊаŅŅи С вĐĩŅŅŅŅ FastAPI `0.115.0`. đ¤
+
+///
+
+## ĐаŅаĐŧĐĩŅŅи ĐĐ°ĐŗĐžĐģОвĐēŅв С ĐиĐēĐžŅиŅŅаĐŊĐŊŅĐŧ Pydantic Model
+
+ĐĐŗĐžĐģĐžŅŅŅŅ ĐŋĐžŅŅŅĐąĐŊŅ **ĐŋаŅаĐŧĐĩŅŅи ĐˇĐ°ĐŗĐžĐģОвĐēŅв** Ņ **Pydantic ĐŧОдĐĩĐģŅ**, а ĐŋĐžŅŅĐŧ ĐžĐŗĐžĐģĐžŅŅŅŅ ĐŋаŅаĐŧĐĩŅŅ ŅĐē `Header`:
+
+{* ../../docs_src/header_param_models/tutorial001_an_py310.py hl[9:14,18] *}
+
+FastAPI ĐąŅĐ´Đĩ виŅŅĐŗŅваŅи даĐŊŅ Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž ĐŋĐžĐģŅ Đˇ ĐˇĐ°ĐŗĐžĐģОвĐēŅв Ņ ĐˇĐ°ĐŋиŅŅ Ņа ĐŋĐĩŅĐĩдаваŅи ŅŅ
Ņ ŅŅвОŅĐĩĐŊŅ ĐаĐŧи Pydantic ĐŧОдĐĩĐģŅ.
+
+**FastAPI** ĐąŅĐ´Đĩ **виŅŅĐŗŅваŅи** даĐŊŅ Đ´ĐģŅ **ĐēĐžĐļĐŊĐžĐŗĐž ĐŋĐžĐģŅ** С **ĐˇĐ°ĐŗĐžĐģОвĐēŅв** Ņ ĐˇĐ°ĐŋиŅŅ Ņа ĐŋĐĩŅĐĩдаваŅи ŅŅ
Ņ ŅŅвОŅĐĩĐŊŅ ĐаĐŧи Pydantic ĐŧОдĐĩĐģŅ.
+
+## ĐĐĩŅĐĩвŅŅĐēа в ĐĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ĐŋОйаŅиŅи ĐŊĐĩОйŅ
ŅĐ´ĐŊŅ ĐˇĐ°ĐŗĐžĐģОвĐēи в ŅĐŊŅĐĩŅŅĐĩĐšŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ ĐˇĐ° адŅĐĩŅĐžŅ `/docs`:
+
+
+
+
+
+## ĐайОŅĐžĐŊа ĐОдаŅĐēОвиŅ
ĐĐ°ĐŗĐžĐģОвĐēŅв
+
+ĐŖ Đ´ĐĩŅĐēиŅ
ĐžŅОйĐģивиŅ
виĐŋадĐēаŅ
(ĐšĐŧОвŅŅĐŊĐž, ĐŊĐĩ Đ´ŅĐļĐĩ ĐŋĐžŅиŅĐĩĐŊиŅ
) Đи ĐŧĐžĐļĐĩŅĐĩ СаŅ
ĐžŅŅŅи **ОйĐŧĐĩĐļиŅи** ĐˇĐ°ĐŗĐžĐģОвĐēи, ŅĐēŅ Ņ
ĐžŅĐĩŅĐĩ ĐžŅŅиĐŧаŅи.
+
+Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅаŅи ĐēĐžĐŊŅŅĐŗŅŅаŅŅŅ ĐŧОдĐĩĐģŅ Pydantic, ŅОй `СайОŅĐžĐŊиŅи` ĐąŅĐ´Ņ-ŅĐēŅ `дОдаŅĐēОвŅ` ĐŋĐžĐģŅ:
+
+{* ../../docs_src/header_param_models/tutorial002_an_py310.py hl[10] *}
+
+Đ¯ĐēŅĐž ĐēĐģŅŅĐŊŅ ŅĐŋŅОйŅŅ ĐŊадŅŅĐģаŅи **дОдаŅĐēĐžĐ˛Ņ ĐˇĐ°ĐŗĐžĐģОвĐēи**, вŅĐŊ ĐžŅŅиĐŧĐ°Ņ **ĐŋĐžĐŧиĐģĐēŅ** Ņ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ.
+
+ĐаĐŋŅиĐēĐģад, ŅĐēŅĐž ĐēĐģŅŅĐŊŅ ŅĐŋŅОйŅŅ ĐŊадŅŅĐģаŅи ĐˇĐ°ĐŗĐžĐģОвОĐē `tool` ĐˇŅ ĐˇĐŊаŅĐĩĐŊĐŊŅĐŧ `plumbus`, вŅĐŊ ĐžŅŅиĐŧĐ°Ņ **ĐŋĐžĐŧиĐģĐēŅ** С ĐŋОвŅĐ´ĐžĐŧĐģĐĩĐŊĐŊŅĐŧ ĐŋŅĐž ŅĐĩ, ŅĐž ĐŋаŅаĐŧĐĩŅŅ ĐˇĐ°ĐŗĐžĐģОвĐēа `tool` ĐŊĐĩ дОСвОĐģĐĩĐŊиК:
+
+```json
+{
+ "detail": [
+ {
+ "type": "extra_forbidden",
+ "loc": ["header", "tool"],
+ "msg": "Extra inputs are not permitted",
+ "input": "plumbus",
+ }
+ ]
+}
+```
+
+## ĐŅĐ´ŅŅĐŧĐžĐē
+
+Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи **Pydantic ĐŧОдĐĩĐģŅ** Đ´ĐģŅ ĐžĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ **ĐˇĐ°ĐŗĐžĐģОвĐēŅв** Ņ **FastAPI**. đ
diff --git a/docs/uk/docs/tutorial/header-params.md b/docs/uk/docs/tutorial/header-params.md
new file mode 100644
index 000000000..09c70a4f6
--- /dev/null
+++ b/docs/uk/docs/tutorial/header-params.md
@@ -0,0 +1,91 @@
+# Header-ĐŋаŅаĐŧĐĩŅŅи
+
+Đи ĐŧĐžĐļĐĩŅĐĩ виСĐŊаŅаŅи ĐŋаŅаĐŧĐĩŅŅи ĐˇĐ°ĐŗĐžĐģОвĐēŅв, ŅаĐē ŅаĐŧĐž ŅĐē виСĐŊаŅаŅŅĐĩ `Query`, `Path` Ņ `Cookie` ĐŋаŅаĐŧĐĩŅŅи.
+
+## ĐĐŧĐŋĐžŅŅ `Header`
+
+ĐĄĐŋĐžŅаŅĐēŅ ŅĐŧĐŋĐžŅŅŅĐšŅĐĩ `Header`:
+
+{* ../../docs_src/header_params/tutorial001_an_py310.py hl[3] *}
+
+## ĐĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ ĐŋаŅаĐŧĐĩŅŅŅв `Header`
+
+ĐĐžŅŅĐŧ ĐžĐŗĐžĐģĐžŅŅŅŅ ĐŋаŅаĐŧĐĩŅŅи ĐˇĐ°ĐŗĐžĐģОвĐēŅв, виĐēĐžŅиŅŅОвŅŅŅи ŅŅ Đļ ŅŅŅŅĐēŅŅŅŅ, ŅĐž Đš Đ´ĐģŅ `Path`, `Query` Ņа `Cookie`.
+
+Đи ĐŧĐžĐļĐĩŅĐĩ виСĐŊаŅиŅи СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ, а ŅаĐēĐžĐļ ŅŅŅ Đ´ĐžĐ´Đ°ŅĐēĐžĐ˛Ņ ĐŋаŅаĐŧĐĩŅŅи ваĐģŅдаŅŅŅ Đ°ĐąĐž аĐŊĐžŅаŅŅŅ:
+
+{* ../../docs_src/header_params/tutorial001_an_py310.py hl[9] *}
+
+/// note | ĐĸĐĩŅ
ĐŊŅŅĐŊŅ Đ´ĐĩŅаĐģŅ
+
+`Header`Ņ "ŅĐĩŅŅŅиĐŊŅŅĐēиĐŧ" ĐēĐģаŅĐžĐŧ Đ´ĐģŅ `Path`, `Query` Ņ `Cookie`. ĐŅĐŊ ŅаĐēĐžĐļ ŅŅĐŋадĐēОвŅŅŅŅŅŅ Đ˛ŅĐ´ ĐˇĐ°ĐŗĐ°ĐģŅĐŊĐžĐŗĐž ĐēĐģаŅŅ `Param`.
+
+ĐĐģĐĩ ĐŋаĐŧâŅŅаКŅĐĩ, ŅĐž ĐŋŅи ŅĐŧĐŋĐžŅŅŅ `Query`, `Path`, `Header` Ņа ŅĐŊŅиŅ
ŅС `fastapi`, ŅĐž ĐŊаŅĐŋŅĐ°Đ˛Đ´Ņ Đ˛ĐžĐŊи Ņ ŅŅĐŊĐēŅŅŅĐŧи, ŅĐēŅ ĐŋОвĐĩŅŅаŅŅŅ ŅĐŋĐĩŅŅаĐģŅĐŊŅ ĐēĐģаŅи.
+
+///
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+ЊОй ĐžĐŗĐžĐģĐžŅиŅи ĐˇĐ°ĐŗĐžĐģОвĐēи, ĐŋĐžŅŅŅĐąĐŊĐž виĐēĐžŅиŅŅОвŅваŅи `Header`, ŅĐŊаĐēŅĐĩ ĐŋаŅаĐŧĐĩŅŅи ĐąŅĐ´ŅŅŅ ŅĐŊŅĐĩŅĐŋŅĐĩŅŅваŅиŅŅ ŅĐē ĐŋаŅаĐŧĐĩŅŅи СаĐŋиŅŅ.
+
+///
+
+## ĐвŅĐžĐŧаŅиŅĐŊĐĩ ĐŋĐĩŅĐĩŅвОŅĐĩĐŊĐŊŅ
+
+`Header` ĐŧĐ°Ņ Đ´ĐžĐ´Đ°ŅĐēОвиК ŅŅĐŊĐēŅŅĐžĐŊаĐģ ĐŋĐžŅŅвĐŊŅĐŊĐž С `Path`, `Query` Ņа `Cookie`.
+
+ĐŅĐģŅŅŅŅŅŅ ŅŅаĐŊдаŅŅĐŊиŅ
ĐˇĐ°ĐŗĐžĐģОвĐēŅв ŅОСдŅĐģŅŅŅŅŅŅ ŅиĐŧвОĐģĐžĐŧ ÂĢĐ´ĐĩŅŅŅÂģ, ŅаĐēĐžĐļ вŅĐ´ĐžĐŧиĐŧ ŅĐē ÂĢĐŧŅĐŊŅŅÂģ (`-`).
+
+ĐĐģĐĩ СĐŧŅĐŊĐŊа, ŅаĐēа ŅĐē `user-agent`, Ņ ĐŊĐĩĐ´ŅĐšŅĐŊĐžŅ Đ˛ Python.
+
+ĐĸĐžĐŧŅ, Са СаĐŧОвŅŅваĐŊĐŊŅĐŧ, `Header` авŅĐžĐŧаŅиŅĐŊĐž ĐŋĐĩŅĐĩŅвОŅŅŅ ŅиĐŧвОĐģи ĐŋŅĐ´ĐēŅĐĩŅĐģĐĩĐŊĐŊŅ (`_`) ĐŊа Đ´ĐĩŅŅŅи (`-`) Đ´ĐģŅ ĐžŅŅиĐŧаĐŊĐŊŅ Ņа Đ´ĐžĐēŅĐŧĐĩĐŊŅŅваĐŊĐŊŅ ĐˇĐ°ĐŗĐžĐģОвĐēŅв.
+
+ĐŅĐēŅĐģŅĐēи ĐˇĐ°ĐŗĐžĐģОвĐēи HTTP ĐŊĐĩ ŅŅŅĐģĐ¸Đ˛Ņ Đ´Đž ŅĐĩĐŗŅŅŅŅŅ, Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи ŅŅаĐŊдаŅŅĐŊиК ŅŅиĐģŅ Python ("snake_case").
+
+ĐĸĐžĐŧŅ Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи `user_agent`, ŅĐē СаСвиŅаК Ņ ĐēĐžĐ´Ņ Python, СаĐŧŅŅŅŅ ŅĐžĐŗĐž ŅОй ĐŋиŅаŅи С вĐĩĐģиĐēĐžŅ ĐģŅŅĐĩŅи, ŅĐē `User_Agent` айО ŅĐžŅŅ ĐŋОдŅĐąĐŊĐĩ.
+
+Đ¯ĐēŅĐž ĐаĐŧ ĐŋĐžŅŅŅĐąĐŊĐž виĐŧĐēĐŊŅŅи авŅĐžĐŧаŅиŅĐŊĐĩ ĐŋĐĩŅĐĩŅвОŅĐĩĐŊĐŊŅ ĐŋŅĐ´ĐēŅĐĩŅĐģĐĩĐŊŅ Ņ Đ´ĐĩŅŅŅи, вŅŅаĐŊОвŅŅŅ `convert_underscores` в `Header` СĐŊаŅĐĩĐŊĐŊŅ `False`:
+
+{* ../../docs_src/header_params/tutorial002_an_py310.py hl[10] *}
+
+/// warning | ĐŖĐ˛Đ°ĐŗĐ°
+
+ĐĐĩŅĐĩĐ´ ŅиĐŧ ŅĐē вŅŅаĐŊОвиŅи СĐŊаŅĐĩĐŊĐŊŅ `False` Đ´ĐģŅ `convert_underscores` ĐŋаĐŧâŅŅаКŅĐĩ, ŅĐž Đ´ĐĩŅĐēŅ HTTP-ĐŋŅĐžĐēŅŅ Ņа ŅĐĩŅвĐĩŅи ĐŊĐĩ ĐŋŅĐ´ŅŅиĐŧŅŅŅŅ ĐˇĐ°ĐŗĐžĐģОвĐēи С ĐŋŅĐ´ĐēŅĐĩŅĐģĐĩĐŊĐŊŅĐŧи.
+
+///
+
+## ĐŅĐąĐģŅОваĐŊŅ ĐˇĐ°ĐŗĐžĐģОвĐēи
+
+ĐĐžĐļĐģивО ĐžŅŅиĐŧаŅи Đ´ŅĐąĐģŅОваĐŊŅ ĐˇĐ°ĐŗĐžĐģОвĐēи, ŅОйŅĐž ŅОК ŅаĐŧиК ĐˇĐ°ĐŗĐžĐģОвОĐē ŅС ĐēŅĐģŅĐēĐžĐŧа СĐŊаŅĐĩĐŊĐŊŅĐŧи.
+
+ĐĻĐĩ ĐŧĐžĐļĐŊа виСĐŊаŅиŅи, виĐēĐžŅиŅŅОвŅŅŅи ŅĐŋиŅĐžĐē Ņ ŅиĐŋŅСаŅŅŅ ĐŋаŅаĐŧĐĩŅŅа.
+
+Đи ĐžŅŅиĐŧаŅŅĐĩ вŅŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ Đ´ŅĐąĐģŅОваĐŊĐžĐŗĐž ĐˇĐ°ĐŗĐžĐģОвĐēа Ņ Đ˛Đ¸ĐŗĐģŅĐ´Ņ `list` Ņ Python.
+
+ĐаĐŋŅиĐēĐģад, ŅОй ĐžĐŗĐžĐģĐžŅиŅи ĐˇĐ°ĐŗĐžĐģОвОĐē `X-Token`, ŅĐēиК ĐŧĐžĐļĐĩ СâŅвĐģŅŅиŅŅ ĐąŅĐģŅŅĐĩ ĐŊŅĐļ ОдиĐŊ ŅаС:
+
+{* ../../docs_src/header_params/tutorial003_an_py310.py hl[9] *}
+
+Đ¯ĐēŅĐž Đи вСаŅĐŧОдŅŅŅĐĩ С ŅŅŅŅ ĐžĐŋĐĩŅаŅŅŅŅ ŅĐģŅŅ
Ņ, ĐŊадŅиĐģаŅŅи два HTTP-ĐˇĐ°ĐŗĐžĐģОвĐēи, ĐŊаĐŋŅиĐēĐģад:
+
+```
+X-Token: foo
+X-Token: bar
+```
+
+ĐŅĐ´ĐŋОвŅĐ´Ņ ĐąŅĐ´Đĩ ŅаĐēа:
+
+```JSON
+{
+ "X-Token values": [
+ "bar",
+ "foo"
+ ]
+}
+```
+
+## ĐŅĐ´ŅŅĐŧĐžĐē
+
+ĐĐŗĐžĐģĐžŅŅĐšŅĐĩ ĐˇĐ°ĐŗĐžĐģОвĐēи Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ `Header`, виĐēĐžŅиŅŅОвŅŅŅи ŅОК ŅаĐŧиК ĐŋŅĐ´Ņ
ŅĐ´, ŅĐž Đš Đ´ĐģŅ `Query`, `Path` Ņа `Cookie`.
+
+ĐĐĩ Ņ
виĐģŅĐšŅĐĩŅŅ ĐŋŅĐž ĐŋŅĐ´ĐēŅĐĩŅĐģĐĩĐŊĐŊŅ Ņ ĐˇĐŧŅĐŊĐŊиŅ
â **FastAPI** авŅĐžĐŧаŅиŅĐŊĐž ĐēĐžĐŊвĐĩŅŅŅŅ ŅŅ
.
diff --git a/docs/uk/docs/tutorial/metadata.md b/docs/uk/docs/tutorial/metadata.md
new file mode 100644
index 000000000..64e667ec6
--- /dev/null
+++ b/docs/uk/docs/tutorial/metadata.md
@@ -0,0 +1,120 @@
+# ĐĐĩŅадаĐŊŅ Ņа URL-адŅĐĩŅи Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ĐŊаĐģаŅŅŅваŅи ĐēŅĐģŅĐēа ĐēĐžĐŊŅŅĐŗŅŅаŅŅĐš ĐŧĐĩŅадаĐŊиŅ
Ņ ĐаŅĐžĐŧŅ Đ´ĐžĐ´Đ°ŅĐēŅ **FastAPI**.
+
+## ĐĐĩŅадаĐŊŅ Đ´ĐģŅ API
+
+Đи ĐŧĐžĐļĐĩŅĐĩ вŅŅаĐŊОвиŅи ŅаĐēŅ ĐŋĐžĐģŅ, ŅĐēŅ Đ˛Đ¸ĐēĐžŅиŅŅОвŅŅŅŅŅŅ Đ˛ ŅĐŋĐĩŅиŅŅĐēаŅŅŅ OpenAPI Ņа в авŅĐžĐŧаŅиŅĐŊĐž ĐˇĐŗĐĩĐŊĐĩŅОваĐŊиŅ
ŅĐŊŅĐĩŅŅĐĩĐšŅаŅ
Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ API:
+
+| ĐаŅаĐŧĐĩŅŅ | ĐĸиĐŋ | ĐĐŋĐ¸Ņ |
+|------------|------|-------------|
+| `title` | `str` | ĐаСва API. |
+| `summary` | `str` | ĐĐžŅĐžŅĐēиК ĐžĐŋĐ¸Ņ API. ĐĐžŅŅŅĐŋĐŊĐž С OpenAPI 3.1.0, FastAPI 0.99.0. |
+| `description` | `str` | ĐŅĐģŅŅ Đ´ĐĩŅаĐģŅĐŊиК ĐžĐŋĐ¸Ņ API. ĐĐžĐļĐĩ виĐēĐžŅиŅŅОвŅваŅи Markdown. |
+| `version` | `string` | ĐĐĩŅŅŅŅ API. ĐĻĐĩ вĐĩŅŅŅŅ ĐаŅĐžĐŗĐž дОдаŅĐēа, а ĐŊĐĩ OpenAPI. ĐаĐŋŅиĐēĐģад, `2.5.0`. |
+| `terms_of_service` | `str` | URL Đ´Đž ŅĐŧОв виĐēĐžŅиŅŅаĐŊĐŊŅ API. Đ¯ĐēŅĐž вĐēаСаĐŊĐž, ĐŧĐ°Ņ ĐąŅŅи Ņ ŅĐžŅĐŧаŅŅ URL. |
+| `contact` | `dict` | ĐĐŊŅĐžŅĐŧаŅŅŅ Đ´ĐģŅ ĐēĐžĐŊŅаĐēŅŅ Đˇ API. ĐĐžĐļĐĩ ĐŧŅŅŅиŅи ĐēŅĐģŅĐēа ĐŋĐžĐģŅв. contact
ĐŋĐžĐģŅĐаŅаĐŧĐĩŅŅ ĐĸиĐŋ ĐĐŋĐ¸Ņ name
str
ĐĐŧ'Ņ ĐēĐžĐŊŅаĐēŅĐŊĐžŅ ĐžŅОйи айО ĐžŅĐŗĐ°ĐŊŅСаŅŅŅ. url
str
URL С ŅĐŊŅĐžŅĐŧаŅŅŅŅ Đ´ĐģŅ ĐēĐžĐŊŅаĐēŅŅ. ĐОвиĐŊĐĩĐŊ ĐąŅŅи Ņ ŅĐžŅĐŧаŅŅ URL. email
str
Email ĐēĐžĐŊŅаĐēŅĐŊĐžŅ ĐžŅОйи айО ĐžŅĐŗĐ°ĐŊŅСаŅŅŅ. ĐОвиĐŊĐĩĐŊ ĐąŅŅи Ņ ŅĐžŅĐŧаŅŅ ĐĩĐģĐĩĐēŅŅĐžĐŊĐŊĐžŅ ĐŋĐžŅŅи.
|
+| `license_info` | `dict` | ĐĐŊŅĐžŅĐŧаŅŅŅ ĐŋŅĐž ĐģŅŅĐĩĐŊСŅŅ Đ´ĐģŅ API. ĐĐžĐļĐĩ ĐŧŅŅŅиŅи ĐēŅĐģŅĐēа ĐŋĐžĐģŅв. license_info
ĐŋĐžĐģŅĐаŅаĐŧĐĩŅŅ ĐĸиĐŋ ĐĐŋĐ¸Ņ name
str
ĐĐĐĐ'Đ¯ĐĐĐĐĐ (ŅĐēŅĐž вŅŅаĐŊОвĐģĐĩĐŊĐž license_info
). ĐаСва ĐģŅŅĐĩĐŊСŅŅ Đ´ĐģŅ API.identifier
str
ĐŅŅĐĩĐŊСŅĐšĐŊиК виŅаС Са SPDX Đ´ĐģŅ API. ĐĐžĐģĐĩ identifier
вСаŅĐŧОвиĐēĐģŅŅĐŊĐĩ С ĐŋĐžĐģĐĩĐŧ url
. ĐĐžŅŅŅĐŋĐŊĐž С OpenAPI 3.1.0, FastAPI 0.99.0. url
str
URL Đ´Đž ĐģŅŅĐĩĐŊСŅŅ, ŅĐēа виĐēĐžŅиŅŅОвŅŅŅŅŅŅ Đ´ĐģŅ API. ĐОвиĐŊĐĩĐŊ ĐąŅŅи Ņ ŅĐžŅĐŧаŅŅ URL.
|
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ĐŊаĐģаŅŅŅваŅи ŅŅ
ĐŊаŅŅŅĐŋĐŊиĐŧ ŅиĐŊĐžĐŧ:
+
+{* ../../docs_src/metadata/tutorial001.py hl[3:16, 19:32] *}
+
+/// tip | ĐŅĐ´ĐēаСĐēа
+
+ĐŖ ĐŋĐžĐģŅ `description` ĐŧĐžĐļĐŊа виĐēĐžŅиŅŅОвŅваŅи Markdown, Ņ Đ˛ŅĐŊ ĐąŅĐ´Đĩ вŅдОйŅаĐļаŅиŅŅ Ņ ŅĐĩСŅĐģŅŅаŅŅ.
+
+///
+
+Đ ŅŅŅŅ ĐēĐžĐŊŅŅĐŗŅŅаŅŅŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐŊа Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ API Đ˛Đ¸ĐŗĐģŅдаŅиĐŧĐĩ ŅаĐē:
+
+
+
+## ĐĐ´ĐĩĐŊŅиŅŅĐēаŅĐžŅ ĐģŅŅĐĩĐŊСŅŅ
+
+Đ ĐŋĐžŅаŅĐēŅ Đ˛Đ¸ĐēĐžŅиŅŅаĐŊĐŊŅ OpenAPI 3.1.0 Ņа FastAPI 0.99.0 Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ ĐŊаĐģаŅŅŅваŅи `license_info` Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ `identifier` СаĐŧŅŅŅŅ `url`.
+
+ĐаĐŋŅиĐēĐģад:
+
+{* ../../docs_src/metadata/tutorial001_1.py hl[31] *}
+
+## ĐĐĩŅадаĐŊŅ Đ´ĐģŅ ŅĐĩĐŗŅв
+
+Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ дОдаŅи дОдаŅĐēĐžĐ˛Ņ ĐŧĐĩŅадаĐŊŅ Đ´ĐģŅ ŅŅСĐŊиŅ
ŅĐĩĐŗŅв, ŅĐēŅ Đ˛Đ¸ĐēĐžŅиŅŅОвŅŅŅŅŅŅ Đ´ĐģŅ ĐŗŅŅĐŋŅваĐŊĐŊŅ ĐžĐŋĐĩŅаŅŅĐš ŅĐģŅŅ
Ņв, Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ ĐŋаŅаĐŧĐĩŅŅа `openapi_tags`.
+
+ĐŅĐŊ ĐŋŅиКĐŧĐ°Ņ ŅĐŋиŅĐžĐē, ŅĐēиК ĐŧŅŅŅиŅŅ ĐžĐ´Đ¸ĐŊ ŅĐģОвĐŊиĐē Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž ŅĐĩĐŗĐ°.
+
+ĐĐžĐļĐĩĐŊ ŅĐģОвĐŊиĐē ĐŧĐžĐļĐĩ ĐŧŅŅŅиŅи:
+
+* `name` (**ОйОв'ŅСĐēОвО**): `str` С ŅŅŅŅ Đļ ĐŊĐ°ĐˇĐ˛ĐžŅ ŅĐĩĐŗŅ, ŅĐēŅ Đи виĐēĐžŅиŅŅОвŅŅŅĐĩ Ņ ĐŋаŅаĐŧĐĩŅŅŅ `tags` Ņ ĐаŅиŅ
*ĐžĐŋĐĩŅаŅŅŅŅ
ŅĐģŅŅ
Ņ* Ņа `APIRouter`s.
+* `description`: `str` С ĐēĐžŅĐžŅĐēиĐŧ ĐžĐŋиŅĐžĐŧ ŅĐĩĐŗŅ. ĐĐžĐļĐĩ ĐŧŅŅŅиŅи Markdown Ņ ĐąŅĐ´Đĩ вŅдОйŅаĐļĐĩĐŊĐž в ŅĐŊŅĐĩŅŅĐĩĐšŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ.
+* `externalDocs`: `dict` ŅĐēиК ĐžĐŋиŅŅŅ ĐˇĐžĐ˛ĐŊŅŅĐŊŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ Đˇ ŅаĐēиĐŧи ĐŋĐžĐģŅĐŧи:
+ * `description`: `str` С ĐēĐžŅĐžŅĐēиĐŧ ĐžĐŋиŅĐžĐŧ СОвĐŊŅŅĐŊŅĐžŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ.
+ * `url` (**ОйОв'ŅСĐēОвО**): `str`С URL-адŅĐĩŅĐžŅ ĐˇĐžĐ˛ĐŊŅŅĐŊŅĐžŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ.
+
+### ĐĄŅвОŅĐĩĐŊĐŊŅ ĐŧĐĩŅадаĐŊиŅ
Đ´ĐģŅ ŅĐĩĐŗŅв
+
+ĐĄĐŋŅОйŅĐšĐŧĐž ŅĐĩ ĐŊа ĐŋŅиĐēĐģĐ°Đ´Ņ Đˇ ŅĐĩĐŗĐ°Đŧи Đ´ĐģŅ `users` Ņа `items`.
+
+ĐĄŅвОŅŅŅŅ ĐŧĐĩŅадаĐŊŅ Đ´ĐģŅ ŅвОŅŅ
ŅĐĩĐŗŅв Ņ ĐŋĐĩŅĐĩдаКŅĐĩ ŅŅ
Ņ ĐŋаŅаĐŧĐĩŅŅ `openapi_tags`:
+
+{* ../../docs_src/metadata/tutorial004.py hl[3:16,18] *}
+
+ĐвĐĩŅĐŊŅŅŅ ŅĐ˛Đ°ĐŗŅ, ŅĐž в ĐžĐŋиŅаŅ
ĐŧĐžĐļĐŊа виĐēĐžŅиŅŅОвŅваŅи Markdown, ĐŊаĐŋŅиĐēĐģад, "login" ĐąŅĐ´Đĩ ĐŋĐžĐēаСаĐŊĐž ĐļиŅĐŊиĐŧ ŅŅиŅŅĐžĐŧ (**login**), а "fancy" ĐąŅĐ´Đĩ ĐŋĐžĐēаСаĐŊĐž ĐēŅŅŅивОĐŧ (_fancy_).
+
+/// tip | ĐĐžŅада
+
+ĐĐĩ ОйОв'ŅСĐēОвО дОдаваŅи ĐŧĐĩŅадаĐŊŅ Đ´ĐģŅ Đ˛ŅŅŅ
ŅĐĩĐŗŅв, ŅĐēŅ Đи виĐēĐžŅиŅŅОвŅŅŅĐĩ.
+
+///
+
+### ĐиĐēĐžŅиŅŅаĐŊĐŊŅ ŅĐĩĐŗŅв
+
+ĐиĐēĐžŅиŅŅОвŅĐšŅĐĩ ĐŋаŅаĐŧĐĩŅŅ `tags` ĐˇŅ ŅвОŅĐŧи *ĐžĐŋĐĩŅаŅŅŅĐŧи ŅĐģŅŅ
Ņ* (Ņ `APIRouter`) Đ´ĐģŅ ĐŋŅиСĐŊаŅĐĩĐŊĐŊŅ ŅŅ
Đ´Đž ŅŅСĐŊиŅ
ŅĐĩĐŗŅв:
+
+{* ../../docs_src/metadata/tutorial004.py hl[21,26] *}
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+ĐĐĩŅаĐģŅĐŊŅŅĐĩ ĐŋŅĐž ŅĐĩĐŗĐ¸ ŅиŅаКŅĐĩ в ŅОСдŅĐģŅ [ĐĐžĐŊŅŅĐŗŅŅаŅŅŅ ŅĐģŅŅ
Ņв ĐžĐŋĐĩŅаŅŅĐš](path-operation-configuration.md#tags){.internal-link target=_blank}.
+
+///
+
+### ĐĐĩŅĐĩвŅŅĐēа Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ
+
+Đ¯ĐēŅĐž Đи СаŅаС ĐŋĐĩŅĐĩвŅŅиŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ, вОĐŊа ĐŋĐžĐēаĐļĐĩ вŅŅ Đ´ĐžĐ´Đ°ŅĐēĐžĐ˛Ņ ĐŧĐĩŅадаĐŊŅ:
+
+
+
+### ĐĐžŅŅĐ´ĐžĐē ŅĐĩĐŗŅв
+
+ĐĐžŅŅĐ´ĐžĐē ĐēĐžĐļĐŊĐžĐŗĐž ŅĐģОвĐŊиĐēа ĐŧĐĩŅадаĐŊиŅ
ŅĐĩĐŗŅ ŅаĐēĐžĐļ виСĐŊаŅĐ°Ņ ĐŋĐžŅŅĐ´ĐžĐē вŅдОйŅаĐļĐĩĐŊĐŊŅ Đ˛ ŅĐŊŅĐĩŅŅĐĩĐšŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ.
+
+ĐаĐŋŅиĐēĐģад, Ņ
ĐžŅа `users` Đŧав йи ĐšŅи ĐŋŅŅĐģŅ `items` в аĐģŅавŅŅĐŊĐžĐŧŅ ĐŋĐžŅŅĐ´ĐēŅ, вŅĐŊ вŅдОйŅаĐļаŅŅŅŅŅ ĐŋĐĩŅĐĩĐ´ ĐŊиĐŧи, ĐžŅĐēŅĐģŅĐēи Đŧи дОдаĐģи ĐšĐžĐŗĐž ĐŧĐĩŅадаĐŊŅ ŅĐē ĐŋĐĩŅŅиК ŅĐģОвĐŊиĐē Ņ ŅĐŋиŅĐēŅ.
+
+## URL Đ´ĐģŅ OpenAPI
+
+Đа СаĐŧОвŅŅваĐŊĐŊŅĐŧ ŅŅ
ĐĩĐŧа OpenAPI ĐŊадаŅŅŅŅŅ ĐˇĐ° адŅĐĩŅĐžŅ `/openapi.json`.
+
+ĐĐģĐĩ Đи ĐŧĐžĐļĐĩŅĐĩ ĐŊаĐģаŅŅŅваŅи ŅĐĩ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ ĐŋаŅаĐŧĐĩŅŅа `openapi_url`.
+
+ĐаĐŋŅиĐēĐģад, ŅОй ĐŊаĐģаŅŅŅваŅи ĐšĐžĐŗĐž ĐŊа `/api/v1/openapi.json`:
+
+{* ../../docs_src/metadata/tutorial002.py hl[3] *}
+
+Đ¯ĐēŅĐž Đи Ņ
ĐžŅĐĩŅĐĩ ĐŋОвĐŊŅŅŅŅ Đ˛Đ¸ĐŧĐēĐŊŅŅи ŅŅ
ĐĩĐŧŅ OpenAPI, Đи ĐŧĐžĐļĐĩŅĐĩ вŅŅаĐŊОвиŅи `openapi_url=None`, ŅĐĩ ŅаĐēĐžĐļ виĐŧĐēĐŊĐĩ ŅĐŊŅĐĩŅŅĐĩĐšŅи Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ, ŅĐēŅ ŅŅ Đ˛Đ¸ĐēĐžŅиŅŅОвŅŅŅŅ.
+
+## URL-адŅĐĩŅи Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ĐŊаĐģаŅŅŅваŅи два ŅĐŊŅĐĩŅŅĐĩĐšŅи ĐēĐžŅиŅŅŅваŅа Đ´ĐģŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ, ŅĐēŅ Đ˛ĐēĐģŅŅĐĩĐŊŅ:
+
+* **Swagger UI**: Đ´ĐžŅŅŅĐŋĐŊиК Са адŅĐĩŅĐžŅ `/docs`.
+ * Đи ĐŧĐžĐļĐĩŅĐĩ СĐŧŅĐŊиŅи ĐšĐžĐŗĐž URL Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ ĐŋаŅаĐŧĐĩŅŅа `docs_url`.
+ * Đи ĐŧĐžĐļĐĩŅĐĩ виĐŧĐēĐŊŅŅи ĐšĐžĐŗĐž, вŅŅаĐŊОвивŅи `docs_url=None`.
+* **ReDoc**: Đ´ĐžŅŅŅĐŋĐŊиК Са адŅĐĩŅĐžŅ `/redoc`.
+ * Đи ĐŧĐžĐļĐĩŅĐĩ СĐŧŅĐŊиŅи ĐšĐžĐŗĐž URL Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ ĐŋаŅаĐŧĐĩŅŅа `redoc_url`.
+ * Đи ĐŧĐžĐļĐĩŅĐĩ виĐŧĐēĐŊŅŅи ĐšĐžĐŗĐž, вŅŅаĐŊОвивŅи `redoc_url=None`.
+
+ĐаĐŋŅиĐēĐģад, ŅОй ĐŊаĐģаŅŅŅваŅи Swagger UI ĐŊа `/documentation` Ņ Đ˛Đ¸ĐŧĐēĐŊŅŅи ReDoc:
+
+{* ../../docs_src/metadata/tutorial003.py hl[3] *}
diff --git a/docs/uk/docs/tutorial/middleware.md b/docs/uk/docs/tutorial/middleware.md
new file mode 100644
index 000000000..807be484a
--- /dev/null
+++ b/docs/uk/docs/tutorial/middleware.md
@@ -0,0 +1,75 @@
+# Middleware (ĐŅĐžĐŧŅĐļĐŊиК ŅаŅ)
+
+ĐŖ **FastAPI** ĐŧĐžĐļĐŊа дОдаваŅи middleware (ĐŋŅĐžĐŧŅĐļĐŊиК ŅаŅ).
+
+"Middleware" â ŅĐĩ ŅŅĐŊĐēŅŅŅ, ŅĐēа ĐŋŅаŅŅŅ Đˇ ĐēĐžĐļĐŊиĐŧ **СаĐŋиŅĐžĐŧ** ĐŋĐĩŅĐĩĐ´ ĐšĐžĐŗĐž ОйŅОйĐēĐžŅ ĐąŅĐ´Ņ-ŅĐēĐžŅ ĐēĐžĐŊĐēŅĐĩŅĐŊĐžŅ *ĐžĐŋĐĩŅаŅŅŅŅ ŅĐģŅŅ
Ņ* (*path operation*), а ŅаĐēĐžĐļ С ĐēĐžĐļĐŊĐžŅ **вŅĐ´ĐŋОвŅĐ´Đ´Ņ** ĐŋĐĩŅĐĩĐ´ ŅŅ ĐŋОвĐĩŅĐŊĐĩĐŊĐŊŅĐŧ.
+
+* Middleware ĐžŅŅиĐŧŅŅ ĐēĐžĐļĐĩĐŊ **СаĐŋиŅ**, ŅĐž ĐŊадŅ
ОдиŅŅ Đ´Đž ĐаŅĐžĐŗĐž СаŅŅĐžŅŅĐŊĐēŅ.
+* ĐĐžĐļĐĩ виĐēĐžĐŊаŅи ĐŋĐĩвĐŊŅ Đ´ŅŅ ŅС ŅиĐŧ **СаĐŋиŅĐžĐŧ** айО СаĐŋŅŅŅиŅи ĐŊĐĩОйŅ
ŅĐ´ĐŊиК ĐēОд.
+* ĐаĐģŅ ĐŋĐĩŅĐĩĐ´Đ°Ņ **СаĐŋиŅ** Đ´ĐģŅ ĐžĐąŅОйĐēи ĐžŅĐŊОвĐŊиĐŧ СаŅŅĐžŅŅĐŊĐēĐžĐŧ (*ĐžĐŋĐĩŅаŅŅŅŅ ŅĐģŅŅ
Ņ*).
+* ĐŅŅиĐŧŅŅ **вŅĐ´ĐŋОвŅĐ´Ņ**, ŅŅĐžŅĐŧОваĐŊŅ ĐˇĐ°ŅŅĐžŅŅĐŊĐēĐžĐŧ (*ĐžĐŋĐĩŅаŅŅŅŅ ŅĐģŅŅ
Ņ*).
+* ĐĐžĐļĐĩ СĐŧŅĐŊиŅи ŅŅ **вŅĐ´ĐŋОвŅĐ´Ņ** айО виĐēĐžĐŊаŅи дОдаŅĐēОвиК ĐēОд.
+* ĐОвĐĩŅŅĐ°Ņ **вŅĐ´ĐŋОвŅĐ´Ņ** ĐēĐģŅŅĐŊŅŅ.
+
+/// note | ĐĸĐĩŅ
ĐŊŅŅĐŊŅ Đ´ĐĩŅаĐģŅ
+
+Đ¯ĐēŅĐž Ņ ĐĐ°Ņ Ņ ĐˇĐ°ĐģĐĩĐļĐŊĐžŅŅŅ Đˇ `yield`, ĐēОд виŅ
ĐžĐ´Ņ Đ˛Đ¸ĐēĐžĐŊаŅŅŅŅŅ *ĐŋŅŅĐģŅ* middleware.
+
+Đ¯ĐēŅĐž ĐąŅĐģи СаĐŋĐģаĐŊОваĐŊŅ ŅĐžĐŊĐžĐ˛Ņ ĐˇĐ°Đ´Đ°ŅŅ (background tasks - ŅĐžĐˇĐŗĐģŅĐŊŅŅĐž даĐģŅ), вОĐŊи виĐēĐžĐŊаŅŅŅŅŅ *ĐŋŅŅĐģŅ* вŅŅŅ
middleware.
+
+///
+
+## ĐĄŅвОŅĐĩĐŊĐŊŅ middleware
+
+ЊОй ŅŅвОŅиŅи middleware, Đи виĐēĐžŅиŅŅОвŅŅŅĐĩ Đ´ĐĩĐēĐžŅаŅĐžŅ `@app.middleware("http")` ĐŊа ŅŅĐŊĐēŅŅŅ.
+
+ФŅĐŊĐēŅŅŅ middleware ĐžŅŅиĐŧŅŅ:
+
+* `ĐаĐŋиŅ`.
+* ФŅĐŊĐēŅŅŅ `call_next`, ŅĐēа ĐŋŅиКĐŧĐ°Ņ `СаĐŋиŅ` ŅĐē ĐŋаŅаĐŧĐĩŅŅ.
+ * ĐĻŅ ŅŅĐŊĐēŅŅŅ ĐŋĐĩŅĐĩĐ´Đ°Ņ `СаĐŋиŅ` вŅĐ´ĐŋОвŅĐ´ĐŊŅĐš *ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ*.
+ * ĐĐžŅŅĐŧ вОĐŊа ĐŋОвĐĩŅŅĐ°Ņ `вŅĐ´ĐŋОвŅĐ´Ņ`, ĐˇĐŗĐĩĐŊĐĩŅОваĐŊŅ ŅŅŅŅ *ĐžĐŋĐĩŅаŅŅŅŅ ŅĐģŅŅ
Ņ*.
+
+* Đи ĐŧĐžĐļĐĩŅĐĩ ŅĐĩ СĐŧŅĐŊиŅи `вŅĐ´ĐŋОвŅĐ´Ņ` ĐŋĐĩŅĐĩĐ´ ŅиĐŧ, ŅĐē ĐŋОвĐĩŅĐŊŅŅи ŅŅ.
+
+
+{* ../../docs_src/middleware/tutorial001.py hl[8:9,11,14] *}
+
+/// tip | ĐĐžŅада
+
+ĐĐĩ СайŅваКŅĐĩ, ŅĐž вĐģаŅĐŊŅ ĐˇĐ°ĐŗĐžĐģОвĐēи ĐŧĐžĐļĐŊа дОдаваŅи, виĐēĐžŅиŅŅОвŅŅŅи ĐŋŅĐĩŅŅĐēŅ 'X-' .
+
+ĐĐģĐĩ ŅĐēŅĐž Ņ ĐĐ°Ņ Ņ Đ˛ĐģаŅĐŊŅ ĐˇĐ°ĐŗĐžĐģОвĐēи, ŅĐēŅ Đи Ņ
ĐžŅĐĩŅĐĩ, ŅОй ĐąŅаŅСĐĩŅĐŊиК ĐēĐģŅŅĐŊŅ ĐŧŅĐŗ ĐŋОйаŅиŅи, ĐŋĐžŅŅŅĐąĐŊĐž дОдаŅи ŅŅ
Đ´Đž ĐаŅĐžŅ ĐēĐžĐŊŅŅĐŗŅŅаŅŅŅ CORS (див. [CORS (ĐĐąĐŧŅĐŊ ŅĐĩŅŅŅŅаĐŧи ĐŧŅĐļ ŅŅСĐŊиĐŧи Đ´ĐļĐĩŅĐĩĐģаĐŧи)](cors.md){.internal-link target=_blank} Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ ĐŋаŅаĐŧĐĩŅŅа `expose_headers`, ĐžĐŋиŅаĐŊĐžĐŗĐž в Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ Starlette ĐŋĐž CORS .
+
+///
+
+/// note | ĐĸĐĩŅ
ĐŊŅŅĐŊŅ Đ´ĐĩŅаĐģŅ
+
+Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅаŅи `from starlette.requests import Request`.
+
+**FastAPI** ĐŊĐ°Đ´Đ°Ņ ŅĐĩ Đ´ĐģŅ ĐаŅĐžŅ ĐˇŅŅŅĐŊĐžŅŅŅ ŅĐē ŅОСŅОйĐŊиĐēа. ĐĐģĐĩ вŅĐŊ ĐŋĐžŅ
ОдиŅŅ ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž ĐˇŅ Starlette.
+
+///
+
+### ĐĐž Ņ ĐŋŅŅĐģŅ `response`(`вŅĐ´ĐŋОвŅĐ´Ņ`)
+
+Đи ĐŧĐžĐļĐĩŅĐĩ дОдаŅи ĐēОд, ŅĐēиК ĐąŅĐ´Đĩ виĐēĐžĐŊŅваŅиŅŅ Đˇ `СаĐŋиŅĐžĐŧ` (`request`), Đ´Đž ŅĐžĐŗĐž, ŅĐē ĐšĐžĐŗĐž ОйŅОйиŅŅ ĐąŅĐ´Ņ-ŅĐēа *ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ* (*path operation*).
+
+ĐĸаĐēĐžĐļ Đи ĐŧĐžĐļĐĩŅĐĩ дОдаŅи ĐēОд, ŅĐēиК ĐąŅĐ´Đĩ виĐēĐžĐŊŅваŅиŅŅ ĐŋŅŅĐģŅ ŅĐžĐŗĐž, ŅĐē `вŅĐ´ĐŋОвŅĐ´Ņ` (`response`) ĐąŅĐ´Đĩ ĐˇĐŗĐĩĐŊĐĩŅОваĐŊĐž, ĐŋĐĩŅĐĩĐ´ ŅиĐŧ ŅĐē ĐšĐžĐŗĐž ĐŋОвĐĩŅĐŊŅŅи.
+
+ĐаĐŋŅиĐēĐģад, Đи ĐŧĐžĐļĐĩŅĐĩ дОдаŅи вĐģаŅĐŊиК ĐˇĐ°ĐŗĐžĐģОвОĐē `X-Process-Time`, ŅĐēиК ĐŧŅŅŅиŅиĐŧĐĩ ŅĐ°Ņ Ņ ŅĐĩĐēŅĐŊдаŅ
, ŅĐēиК виŅŅаŅивŅŅ ĐŊа ОйŅОйĐēŅ ĐˇĐ°ĐŋиŅŅ Ņа ĐŗĐĩĐŊĐĩŅаŅŅŅ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ:
+
+{* ../../docs_src/middleware/tutorial001.py hl[10,12:13] *}
+
+
+/// tip | ĐŅĐ´ĐēаСĐēа
+
+ĐĸŅŅ Đŧи виĐēĐžŅиŅŅОвŅŅĐŧĐž `time.perf_counter()` СаĐŧŅŅŅŅ `time.time()` ĐžŅĐēŅĐģŅĐēи вŅĐŊ ĐŧĐžĐļĐĩ ĐąŅŅи ĐąŅĐģŅŅ ŅĐžŅĐŊиĐŧ Đ´ĐģŅ ŅаĐēиŅ
виĐŋадĐēŅв. đ¤
+
+///
+
+## ĐĐŊŅŅ middlewares
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ĐŋŅСĐŊŅŅĐĩ ĐŋŅĐžŅиŅаŅи ĐąŅĐģŅŅĐĩ ĐŋŅĐž ŅĐŊŅŅ middlewares в [Advanced User Guide: Advanced Middleware](../advanced/middleware.md){.internal-link target=_blank}.
+
+Đи Đ´ŅСĐŊаŅŅĐĩŅŅ, ŅĐē ОйŅОйĐģŅŅи CORS Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ middleware в ĐŊаŅŅŅĐŋĐŊĐžĐŧŅ ŅОСдŅĐģŅ.
diff --git a/docs/uk/docs/tutorial/path-params-numeric-validations.md b/docs/uk/docs/tutorial/path-params-numeric-validations.md
new file mode 100644
index 000000000..281ee183c
--- /dev/null
+++ b/docs/uk/docs/tutorial/path-params-numeric-validations.md
@@ -0,0 +1,165 @@
+# Path ĐаŅаĐŧĐĩŅŅи Ņа ваĐģŅдаŅŅŅ ŅиŅĐģОвиŅ
даĐŊиŅ
+
+ĐĸаĐē ŅаĐŧĐž ŅĐē Đи ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅŅваŅи дОдаŅĐēĐžĐ˛Ņ ĐŋĐĩŅĐĩвŅŅĐēи Ņа ĐŧĐĩŅадаĐŊŅ Đ´ĐģŅ query ĐŋаŅаĐŧĐĩŅŅŅв Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ `Query`, Đи ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅŅваŅи ŅОК ŅаĐŧиК ŅиĐŋ ĐŋĐĩŅĐĩвŅŅĐžĐē Ņ ĐŧĐĩŅадаĐŊиŅ
Đ´ĐģŅ ĐŋаŅаĐŧĐĩŅŅŅв ŅĐģŅŅ
Ņ ĐˇĐ° Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ `Path`.
+
+## ĐĐŧĐŋĐžŅŅ Path
+
+ĐĄĐŋĐžŅаŅĐēŅ ŅĐŧĐŋĐžŅŅŅĐšŅĐĩ `Path` С `fastapi` Ņ ŅĐŧĐŋĐžŅŅŅĐšŅĐĩ `Annotated`:
+
+{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *}
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+FastAPI дОдав ĐŋŅĐ´ŅŅиĐŧĐēŅ `Annotated` (Ņ ĐŋĐžŅав ŅĐĩĐēĐžĐŧĐĩĐŊĐ´ŅваŅи ĐšĐžĐŗĐž виĐēĐžŅиŅŅаĐŊĐŊŅ) Ņ Đ˛ĐĩŅŅŅŅ 0.95.0.
+
+Đ¯ĐēŅĐž Ņ ĐĐ°Ņ ŅŅаŅа вĐĩŅŅŅŅ, ĐŋŅи ŅĐŋŅĐžĐąŅ Đ˛Đ¸ĐēĐžŅиŅŅаŅи `Annotated` ĐŧĐžĐļŅŅŅ Đ˛Đ¸ĐŊиĐēаŅи ĐŋĐžĐŧиĐģĐēи.
+
+ĐĐĩŅĐĩĐēĐžĐŊаКŅĐĩŅŅ, ŅĐž Đи [ĐžĐŊОвиĐģи вĐĩŅŅŅŅ FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} ĐŋŅиĐŊаКĐŧĐŊŅ Đ´Đž вĐĩŅŅŅŅ 0.95.1 ĐŋĐĩŅĐĩĐ´ виĐēĐžŅиŅŅаĐŊĐŊŅĐŧ `Annotated`.
+
+///
+
+## ĐĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ ĐŧĐĩŅадаĐŊиŅ
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅŅваŅи вŅŅ ŅŅ Đļ ĐŋаŅаĐŧĐĩŅŅи, ŅĐž Ņ Đ´ĐģŅ `Query`.
+
+ĐаĐŋŅиĐēĐģад, ŅОй ĐžĐŗĐžĐģĐžŅиŅи СĐŊаŅĐĩĐŊĐŊŅ ĐŧĐĩŅадаĐŊиŅ
`title` Đ´ĐģŅ ĐŋаŅаĐŧĐĩŅŅа ŅĐģŅŅ
Ņ `item_id`, Đи ĐŧĐžĐļĐĩŅĐĩ ĐŊаĐŋиŅаŅи:
+
+{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[10] *}
+
+/// note | ĐŅиĐŧŅŅĐēа
+
+ĐаŅаĐŧĐĩŅŅ ŅĐģŅŅ
Ņ ĐˇĐ°Đ˛Đļди Ņ ĐžĐąĐžĐ˛âŅСĐēОвиĐŧ, ĐžŅĐēŅĐģŅĐēи вŅĐŊ ĐŧĐ°Ņ ĐąŅŅи ŅаŅŅиĐŊĐžŅ ŅĐģŅŅ
Ņ. ĐавŅŅŅ ŅĐēŅĐž Đи ĐžĐŗĐžĐģĐžŅиŅĐĩ ĐšĐžĐŗĐž ĐˇŅ ĐˇĐŊаŅĐĩĐŊĐŊŅĐŧ `None` айО вŅŅаĐŊОвиŅĐĩ СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ â вŅĐŊ вŅĐĩ ОдĐŊĐž СаĐģиŅаŅиĐŧĐĩŅŅŅŅ ĐžĐąĐžĐ˛âŅСĐēОвиĐŧ.
+
+///
+
+## ĐŖĐŋĐžŅŅĐ´ĐēОвŅĐšŅĐĩ ĐŋаŅаĐŧĐĩŅŅи, ŅĐē ĐаĐŧ ĐŋĐžŅŅŅĐąĐŊĐž
+
+/// tip | ĐŅĐ´ĐēаСĐēа
+
+ĐĻĐĩ, ĐŧайŅŅŅ, ĐŊĐĩ ĐŊаŅŅŅĐģŅĐēи ваĐļĐģивО айО ĐŊĐĩОйŅ
ŅĐ´ĐŊĐž, ŅĐēŅĐž Đи виĐēĐžŅиŅŅОвŅŅŅĐĩ `Annotated`.
+
+///
+
+ĐŅиĐŋŅŅŅиĐŧĐž, Đи Ņ
ĐžŅĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅиŅи ĐŋаŅаĐŧĐĩŅŅ ĐˇĐ°ĐŋиŅŅ `q` ŅĐē ОйОвâŅСĐēОвиК `str`.
+
+Đ ĐаĐŧ ĐŊĐĩ ĐŋĐžŅŅŅĐąĐŊĐž ĐžĐŗĐžĐģĐžŅŅваŅи ĐŊŅŅĐžĐŗĐž ŅĐŊŅĐžĐŗĐž Đ´ĐģŅ ŅŅĐžĐŗĐž ĐŋаŅаĐŧĐĩŅŅа, ŅĐžĐŧŅ ĐŊĐĩĐŧĐ°Ņ ĐŋĐžŅŅĐĩйи виĐēĐžŅиŅŅОвŅваŅи `Query`.
+
+ĐĐģĐĩ ĐаĐŧ вŅĐĩ ОдĐŊĐž ĐŋĐžŅŅŅĐąĐŊĐž виĐēĐžŅиŅŅОвŅваŅи `Path` Đ´ĐģŅ ĐŋаŅаĐŧĐĩŅŅа ŅĐģŅŅ
Ņ `item_id`. РС ĐŋĐĩвĐŊиŅ
ĐŋŅиŅиĐŊ Đи ĐŊĐĩ Ņ
ĐžŅĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи `Annotated`.
+
+Python видаŅŅŅ ĐŋĐžĐŧиĐģĐēŅ, ŅĐēŅĐž ŅОСĐŧŅŅŅиŅи СĐŊаŅĐĩĐŊĐŊŅ Đˇ "default" ĐŋĐĩŅĐĩĐ´ СĐŊаŅĐĩĐŊĐŊŅĐŧ, ŅĐēĐĩ ĐŊĐĩ ĐŧĐ°Ņ "default".
+
+ĐĐģĐĩ Đи ĐŧĐžĐļĐĩŅĐĩ СĐŧŅĐŊиŅи ĐŋĐžŅŅĐ´ĐžĐē Ņ ŅОСĐŧŅŅŅиŅи СĐŊаŅĐĩĐŊĐŊŅ ĐąĐĩС СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ (ĐŋаŅаĐŧĐĩŅŅ ĐˇĐ°ĐŋиŅŅ `q`) ĐŋĐĩŅŅиĐŧ.
+
+
+ĐĐģŅ **FastAPI** ĐŋĐžŅŅĐ´ĐžĐē ĐŊĐĩ ĐŧĐ°Ņ ĐˇĐŊаŅĐĩĐŊĐŊŅ. ĐŅĐŊ виСĐŊаŅĐ°Ņ ĐŋаŅаĐŧĐĩŅŅи Са ŅŅ
ŅĐŧĐĩĐŊаĐŧи, ŅиĐŋаĐŧи Ņа СĐŊаŅĐĩĐŊĐŊŅĐŧи Са СаĐŧОвŅŅваĐŊĐŊŅĐŧ (`Query`, `Path` ŅĐžŅĐž) Ņ ĐŊĐĩ СвĐĩŅŅĐ°Ņ ŅĐ˛Đ°ĐŗĐ¸ ĐŊа ĐŋĐžŅŅĐ´ĐžĐē.
+
+ĐĸĐžĐŧŅ Đи ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅиŅи ĐаŅŅ ŅŅĐŊĐēŅŅŅ ŅаĐē:
+
+//// tab | Python 3.8 non-Annotated
+
+/// tip | ĐŅĐ´ĐēаСĐēа
+
+Đа ĐŧĐžĐļĐģивОŅŅŅ Đ˛ŅддаваКŅĐĩ ĐŋĐĩŅĐĩĐ˛Đ°ĐŗŅ Đ˛ĐĩŅŅŅŅ Đˇ виĐēĐžŅиŅŅаĐŊĐŊŅĐŧ `Annotated`.
+
+///
+
+{* ../../docs_src/path_params_numeric_validations/tutorial002.py hl[7] *}
+
+////
+
+ĐĐģĐĩ ĐŧаКŅĐĩ ĐŊа ŅваСŅ, ŅĐž ŅĐēŅĐž Đи виĐēĐžŅиŅŅОвŅŅŅĐĩ `Annotated`, ŅŅ ĐŋŅОйĐģĐĩĐŧа ĐŊĐĩ виĐŊиĐēĐŊĐĩ, ĐžŅĐēŅĐģŅĐēи Đи ĐŊĐĩ виĐēĐžŅиŅŅОвŅŅŅĐĩ СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ Đ´ĐģŅ ĐŋаŅаĐŧĐĩŅŅŅв `Query()` айО `Path()`.
+
+{* ../../docs_src/path_params_numeric_validations/tutorial002_an_py39.py *}
+
+## ĐŖĐŋĐžŅŅĐ´ĐēОвŅĐšŅĐĩ ĐŋаŅаĐŧĐĩŅŅи Са ĐŋĐžŅŅĐĩйОŅ, Ņ
иŅŅĐžŅŅ
+
+/// tip | ĐŅĐ´ĐēаСĐēа
+
+ĐĻĐĩ, ĐŧайŅŅŅ, ĐŊĐĩ ĐŊаŅŅŅĐģŅĐēи ваĐļĐģивО айО ĐŊĐĩОйŅ
ŅĐ´ĐŊĐž, ŅĐēŅĐž Đи виĐēĐžŅиŅŅОвŅŅŅĐĩ `Annotated`.
+
+///
+
+ĐŅŅ **ĐŊĐĩвĐĩĐģиĐēа Ņ
иŅŅŅŅŅŅ**, ŅĐēа ĐŧĐžĐļĐĩ ŅŅаŅи в ĐŋŅĐ¸ĐŗĐžĐ´Ņ, Ņ
ĐžŅа вОĐŊа ŅŅĐ´ĐēĐž СĐŊадОйиŅŅŅŅ.
+
+Đ¯ĐēŅĐž Đи Ņ
ĐžŅĐĩŅĐĩ:
+
+* ĐžĐŗĐžĐģĐžŅиŅи ĐŋаŅаĐŧĐĩŅŅ ĐˇĐ°ĐŋиŅŅ `q` ĐąĐĩС виĐēĐžŅиŅŅаĐŊĐŊŅ `Query` айО СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ
+* ĐžĐŗĐžĐģĐžŅиŅи ĐŋаŅаĐŧĐĩŅŅ ŅĐģŅŅ
Ņ `item_id`, виĐēĐžŅиŅŅОвŅŅŅи `Path`
+* ŅОСĐŧŅŅŅиŅи ŅŅ
Ņ ŅŅСĐŊĐžĐŧŅ ĐŋĐžŅŅĐ´ĐēŅ
+* ĐŊĐĩ виĐēĐžŅиŅŅОвŅваŅи `Annotated`
+
+...Ņ Python Ņ ŅĐŋĐĩŅŅаĐģŅĐŊиК ŅиĐŊŅаĐēŅĐ¸Ņ Đ´ĐģŅ ŅŅĐžĐŗĐž.
+
+ĐĐĩŅĐĩдаКŅĐĩ `*` ŅĐē ĐŋĐĩŅŅиК ĐŋаŅаĐŧĐĩŅŅ ŅŅĐŊĐēŅŅŅ.
+
+Python ĐŊŅŅĐžĐŗĐž ĐŊĐĩ СŅОйиŅŅ ŅС ŅŅŅŅ `*`, аĐģĐĩ ŅОСĐŋŅСĐŊаŅ, ŅĐž вŅŅ ĐŊаŅŅŅĐŋĐŊŅ ĐŋаŅаĐŧĐĩŅŅи ŅĐģŅĐ´ виĐēĐģиĐēаŅи ŅĐē аŅĐŗŅĐŧĐĩĐŊŅи Са ĐēĐģŅŅОвиĐŧ ŅĐģОвОĐŧ (ĐŋаŅи ĐēĐģŅŅ-СĐŊаŅĐĩĐŊĐŊŅ), ŅаĐēĐžĐļ вŅĐ´ĐžĐŧŅ ŅĐē kwargs
. ĐавŅŅŅ ŅĐēŅĐž вОĐŊи ĐŊĐĩ ĐŧаŅŅŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ.
+
+{* ../../docs_src/path_params_numeric_validations/tutorial003.py hl[7] *}
+
+### ĐŅаŅĐĩ С `Annotated`
+
+ĐаКŅĐĩ ĐŊа ŅваСŅ, ŅĐēŅĐž Đи виĐēĐžŅиŅŅОвŅŅŅĐĩ `Annotated`, ĐžŅĐēŅĐģŅĐēи Đи ĐŊĐĩ виĐēĐžŅиŅŅОвŅŅŅĐĩ СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ Đ´ĐģŅ ĐŋаŅаĐŧĐĩŅŅŅв ŅŅĐŊĐēŅŅŅ, ŅŅŅŅ ĐŋŅОйĐģĐĩĐŧи ĐŊĐĩ виĐŊиĐēĐŊĐĩ, Ņ, ŅвидŅĐĩ Са вŅĐĩ, ĐаĐŧ ĐŊĐĩ ĐŋĐžŅŅŅĐąĐŊĐž ĐąŅĐ´Đĩ виĐēĐžŅиŅŅОвŅваŅи `*`.
+
+{* ../../docs_src/path_params_numeric_validations/tutorial003_an_py39.py hl[10] *}
+
+## ĐаĐģŅдаŅŅŅ ŅиŅĐģОвиŅ
даĐŊиŅ
: ĐąŅĐģŅŅĐĩ айО Đ´ĐžŅŅвĐŊŅŅ
+
+Đа Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ `Query` Ņ `Path` (Ņа ŅĐŊŅиŅ
, ŅĐēŅ Đи ĐŋОйаŅиŅĐĩ ĐŋŅСĐŊŅŅĐĩ) ĐŧĐžĐļĐŊа ĐžĐŗĐžĐģĐžŅŅваŅи ŅиŅĐģĐžĐ˛Ņ ĐžĐąĐŧĐĩĐļĐĩĐŊĐŊŅ.
+
+ĐĸŅŅ, СавдŅĐēи `ge=1`, `item_id` ĐŧĐ°Ņ ĐąŅŅи ŅŅĐģиĐŧ ŅиŅĐģĐžĐŧ, ŅĐēĐĩ "`g`reater than or `e`qual" (ĐąŅĐģŅŅĐĩ айО Đ´ĐžŅŅвĐŊŅŅ) `1`.
+
+{* ../../docs_src/path_params_numeric_validations/tutorial004_an_py39.py hl[10] *}
+
+## ĐаĐģŅдаŅŅŅ ŅиŅĐģОвиŅ
даĐŊиŅ
: ĐąŅĐģŅŅĐĩ ĐŊŅĐļ Ņ ĐŧĐĩĐŊŅĐĩ айО Đ´ĐžŅŅвĐŊŅŅ
+
+ĐĸĐĩ ŅаĐŧĐĩ СаŅŅĐžŅОвŅŅŅŅŅŅ Đ´Đž:
+
+* `gt`: `g`reater `t`han (ĐąŅĐģŅŅĐĩ ĐŊŅĐļ)
+* `le`: `l`ess than or `e`qual (ĐŧĐĩĐŊŅĐĩ айО Đ´ĐžŅŅвĐŊŅŅ)
+
+{* ../../docs_src/path_params_numeric_validations/tutorial005_an_py39.py hl[10] *}
+
+## ĐаĐģŅдаŅŅŅ ŅиŅĐģОвиŅ
даĐŊиŅ
: float, ĐąŅĐģŅŅĐĩ ĐŊŅĐļ Ņ ĐŧĐĩĐŊŅĐĩ ĐŊŅĐļ
+
+ĐаĐģŅдаŅŅŅ ŅиŅĐĩĐģ ŅаĐēĐžĐļ ĐŋŅаŅŅŅ Đ´ĐģŅ ĐˇĐŊаŅĐĩĐŊŅ ŅиĐŋŅ `float`.
+
+ĐŅŅ Đ´Đĩ ŅŅĐ°Ņ Đ˛Đ°ĐļĐģивО ĐŧаŅи ĐŧĐžĐļĐģивŅŅŅŅ ĐžĐŗĐžĐģĐžŅŅваŅи gt
, а ĐŊĐĩ ŅŅĐģŅĐēи ge
. ĐĻĐĩ дОСвОĐģŅŅ, ĐŊаĐŋŅиĐēĐģад, виĐŧĐ°ĐŗĐ°Ņи, ŅОй СĐŊаŅĐĩĐŊĐŊŅ ĐąŅĐģĐž ĐąŅĐģŅŅĐĩ `0`, ĐŊавŅŅŅ ŅĐēŅĐž вОĐŊĐž ĐŧĐĩĐŊŅĐĩ `1`.
+
+ĐĸаĐēиĐŧ ŅиĐŊĐžĐŧ, СĐŊаŅĐĩĐŊĐŊŅ `0.5` ĐąŅĐ´Đĩ Đ´ĐžĐŋŅŅŅиĐŧиĐŧ. ĐĐģĐĩ `0.0` айО `0` â ĐŊŅ.
+
+ĐĸĐĩ ŅаĐŧĐĩ ŅŅĐžŅŅŅŅŅŅŅ lt
.
+
+{* ../../docs_src/path_params_numeric_validations/tutorial006_an_py39.py hl[13] *}
+
+## ĐŅĐ´ŅŅĐŧĐžĐē
+
+Đа Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ `Query`, `Path` (Ņ ŅĐŊŅиŅ
ĐŋаŅаĐŧĐĩŅŅŅв, ŅĐēŅ Đи ŅĐĩ ĐŊĐĩ йаŅиĐģи) ĐŧĐžĐļĐŊа ĐžĐŗĐžĐģĐžŅŅваŅи ĐŧĐĩŅадаĐŊŅ Ņа ĐŋĐĩŅĐĩвŅŅĐēи ŅŅĐ´ĐēŅв, ŅаĐē ŅаĐŧĐž ŅĐē Ņ [Query ĐŋаŅаĐŧĐĩŅŅи Ņа ваĐģŅдаŅŅŅ ŅŅĐ´ĐēŅв](query-params-str-validations.md){.internal-link target=_blank}.
+
+ĐĸаĐēĐžĐļ ĐŧĐžĐļĐŊа ĐžĐŗĐžĐģĐžŅŅваŅи ŅиŅĐģĐžĐ˛Ņ ĐŋĐĩŅĐĩвŅŅĐēи:
+
+* `gt`: `g`reater `t`han (ĐąŅĐģŅŅĐĩ ĐŊŅĐļ)
+* `ge`: `g`reater than or `e`qual (ĐąŅĐģŅŅĐĩ айО Đ´ĐžŅŅвĐŊŅŅ)
+* `lt`: `l`ess `t`han (ĐŧĐĩĐŊŅĐĩ ĐŊŅĐļ)
+* `le`: `l`ess than or `e`qual (ĐŧĐĩĐŊŅĐĩ айО Đ´ĐžŅŅвĐŊŅŅ)
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+`Query`, `Path` Ņа ŅĐŊŅŅ ĐēĐģаŅи, ŅĐēŅ Đи ĐŋОйаŅиŅĐĩ ĐŋŅСĐŊŅŅĐĩ, Ņ ĐŋŅĐ´ĐēĐģаŅаĐŧи ŅĐŋŅĐģŅĐŊĐžĐŗĐž ĐēĐģаŅŅ `Param`.
+
+ĐŅŅ Đ˛ĐžĐŊи ĐŧаŅŅŅ ĐžĐ´ĐŊаĐēĐžĐ˛Ņ ĐŋаŅаĐŧĐĩŅŅи Đ´ĐģŅ Đ´ĐžĐ´Đ°ŅĐēОвиŅ
ĐŋĐĩŅĐĩвŅŅĐžĐē Ņ ĐŧĐĩŅадаĐŊиŅ
, ŅĐēŅ Đи вĐļĐĩ йаŅиĐģи.
+
+///
+
+/// note | ĐĸĐĩŅ
ĐŊŅŅĐŊŅ Đ´ĐĩŅаĐģŅ
+
+ĐĐžĐģи Đи ŅĐŧĐŋĐžŅŅŅŅŅĐĩ `Query`, `Path` Ņа ŅĐŊŅŅ Đˇ `fastapi`, ĐŊаŅĐŋŅĐ°Đ˛Đ´Ņ ŅĐĩ ŅŅĐŊĐēŅŅŅ.
+
+ĐŅи виĐēĐģиĐēŅ Đ˛ĐžĐŊи ĐŋОвĐĩŅŅаŅŅŅ ĐĩĐēСĐĩĐŧĐŋĐģŅŅи ĐēĐģаŅŅв С ŅаĐēиĐŧи Đļ ŅĐŧĐĩĐŊаĐŧи.
+
+ĐĸОйŅĐž Đи ŅĐŧĐŋĐžŅŅŅŅŅĐĩ `Query`, ŅĐēа Ņ ŅŅĐŊĐēŅŅŅŅ. Đ ĐēĐžĐģи Đи ŅŅ Đ˛Đ¸ĐēĐģиĐēаŅŅĐĩ, вОĐŊа ĐŋОвĐĩŅŅĐ°Ņ ĐĩĐēСĐĩĐŧĐŋĐģŅŅ ĐēĐģаŅŅ, ŅĐēиК ŅĐĩĐļ ĐŊаСиваŅŅŅŅŅ `Query`.
+
+ĐĻŅ ŅŅĐŊĐēŅŅŅ ŅŅвОŅĐĩĐŊŅ ŅаĐēиĐŧ ŅиĐŊĐžĐŧ (СаĐŧŅŅŅŅ Đ˛Đ¸ĐēĐžŅиŅŅаĐŊĐŊŅ ĐēĐģаŅŅв ĐŊаĐŋŅŅĐŧŅ), ŅОй ĐĐ°Ņ ŅĐĩдаĐēŅĐžŅ ĐŊĐĩ вŅдСĐŊаŅав ŅŅ
ĐŊŅ ŅиĐŋи ŅĐē ĐŋĐžĐŧиĐģĐēи.
+
+ĐĸаĐēиĐŧ ŅиĐŊĐžĐŧ, Đи ĐŧĐžĐļĐĩŅĐĩ ĐēĐžŅиŅŅŅваŅиŅŅ ŅвОŅĐŧ СвиŅаКĐŊиĐŧ ŅĐĩдаĐēŅĐžŅĐžĐŧ Ņ ŅĐŊŅŅŅŅĐŧĐĩĐŊŅаĐŧи Đ´ĐģŅ ĐŋŅĐžĐŗŅаĐŧŅваĐŊĐŊŅ ĐąĐĩС дОдаŅĐēОвиŅ
ĐŊаĐģаŅŅŅваĐŊŅ Đ´ĐģŅ ŅĐŗĐŊĐžŅŅваĐŊĐŊŅ ŅаĐēиŅ
ĐŋĐžĐŧиĐģĐžĐē.
+
+///
diff --git a/docs/uk/docs/tutorial/path-params.md b/docs/uk/docs/tutorial/path-params.md
new file mode 100644
index 000000000..e7df1f19a
--- /dev/null
+++ b/docs/uk/docs/tutorial/path-params.md
@@ -0,0 +1,261 @@
+# Path ĐаŅаĐŧĐĩŅŅи
+
+Đи ĐŧĐžĐļĐĩŅĐĩ виСĐŊаŅиŅи "ĐŋаŅаĐŧĐĩŅŅи" айО "СĐŧŅĐŊĐŊŅ" ŅĐģŅŅ
Ņ, виĐēĐžŅиŅŅОвŅŅŅи ŅиĐŊŅаĐēŅĐ¸Ņ ŅĐžŅĐŧаŅОваĐŊиŅ
ŅŅĐ´ĐēŅв:
+
+{* ../../docs_src/path_params/tutorial001.py hl[6:7] *}
+
+ĐĐŊаŅĐĩĐŊĐŊŅ ĐŋаŅаĐŧĐĩŅŅа ŅĐģŅŅ
Ņ `item_id` ĐŋĐĩŅĐĩдаŅŅŅŅŅ Ņ ŅŅĐŊĐēŅŅŅ ŅĐē аŅĐŗŅĐŧĐĩĐŊŅ `item_id`.
+
+Đ¯ĐēŅĐž СаĐŋŅŅŅиŅи ŅĐĩĐš ĐŋŅиĐēĐģад Ņа ĐŋĐĩŅĐĩĐšŅи Са ĐŋĐžŅиĐģаĐŊĐŊŅĐŧ http://127.0.0.1:8000/items/foo , ŅĐž ĐžŅŅиĐŧаŅĐŧĐž ŅаĐēŅ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ:
+
+```JSON
+{"item_id":"foo"}
+```
+
+## Path ĐŋаŅаĐŧĐĩŅŅи С ŅиĐŋаĐŧи
+
+Đи ĐŧĐžĐļĐĩŅĐĩ виСĐŊаŅиŅи ŅиĐŋ ĐŋаŅаĐŧĐĩŅŅа ŅĐģŅŅ
Ņ Ņ ŅŅĐŊĐēŅŅŅ, виĐēĐžŅиŅŅОвŅŅŅи ŅŅаĐŊдаŅŅĐŊŅ Đ°ĐŊĐžŅаŅŅŅ ŅиĐŋŅв Python:
+
+{* ../../docs_src/path_params/tutorial002.py hl[7] *}
+
+ĐŖ ŅаĐēĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ `item_id` виСĐŊаŅаŅŅŅŅŅ ŅĐē `int`.
+
+/// check | ĐŅиĐŧŅŅĐēа
+
+ĐĻĐĩ даŅŅŅ ĐŧĐžĐļĐģивŅŅŅŅ ĐŋŅĐ´ŅŅиĐŧĐēи ŅĐĩдаĐēŅĐžŅа вŅĐĩŅĐĩдиĐŊŅ ŅŅĐŊĐēŅŅŅ Đˇ ĐŋĐĩŅĐĩвŅŅĐēаĐŧи ĐŋĐžĐŧиĐģĐžĐē, авŅОдОĐŋОвĐŊĐĩĐŊĐŊŅ ŅĐžŅĐž.
+
+///
+
+## ĐĐĩŅĐĩŅвОŅĐĩĐŊĐŊŅ Đ´Đ°ĐŊиŅ
+
+Đ¯ĐēŅĐž СаĐŋŅŅŅиŅи ŅĐĩĐš ĐŋŅиĐēĐģад Ņ ĐŋĐĩŅĐĩĐšŅи Са ĐŋĐžŅиĐģаĐŊĐŊŅĐŧ http://127.0.0.1:8000/items/3 , ŅĐž ĐžŅŅиĐŧаŅŅĐĩ ŅаĐēŅ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ:
+
+```JSON
+{"item_id":3}
+```
+
+/// check | ĐŅиĐŧŅŅĐēа
+
+ĐвĐĩŅĐŊŅŅŅ ŅĐ˛Đ°ĐŗŅ, ŅĐž СĐŊаŅĐĩĐŊĐŊŅ, ŅĐēĐĩ ĐžŅŅиĐŧаĐģа (Ņ ĐŋОвĐĩŅĐŊŅĐģа) ваŅа ŅŅĐŊĐēŅŅŅ, â ŅĐĩ `3`. ĐĻĐĩ Python `int`, а ĐŊĐĩ ŅŅĐ´ĐžĐē `"3"`.
+
+ĐŅĐļĐĩ, С ŅаĐēиĐŧ ĐžĐŗĐžĐģĐžŅĐĩĐŊĐŊŅĐŧ ŅиĐŋŅ **FastAPI** авŅĐžĐŧаŅиŅĐŊĐž виĐēĐžĐŊŅŅ "ĐŋаŅŅиĐŊĐŗ" СаĐŋиŅŅв.
+
+///
+
+## ĐĐĩŅĐĩвŅŅĐēа даĐŊиŅ
+
+Đ¯ĐēŅĐž Đļ вŅĐ´ĐēŅиŅи Ņ ĐąŅаŅСĐĩŅŅ ĐŋĐžŅиĐģаĐŊĐŊŅ http://127.0.0.1:8000/items/foo , ŅĐž ĐŋОйаŅиĐŧĐž ŅŅĐēĐ°Đ˛Ņ HTTP-ĐŋĐžĐŧиĐģĐēŅ:
+
+```JSON
+{
+ "detail": [
+ {
+ "type": "int_parsing",
+ "loc": [
+ "path",
+ "item_id"
+ ],
+ "msg": "Input should be a valid integer, unable to parse string as an integer",
+ "input": "foo",
+ "url": "https://errors.pydantic.dev/2.1/v/int_parsing"
+ }
+ ]
+}
+```
+ŅĐžĐŧŅ ŅĐž ĐŋаŅаĐŧĐĩŅŅ ŅĐģŅŅ
Ņ ĐŧĐ°Ņ ĐˇĐŊаŅĐĩĐŊĐŊŅ `"foo"`, ŅĐēĐĩ ĐŊĐĩ Ņ ŅиĐŋĐžĐŧ `int`.
+
+ĐĸаĐēŅ ŅаĐŧŅ ĐŋĐžĐŧиĐģĐēŅ ĐžŅŅиĐŧаŅĐŧĐž, ŅĐēŅĐž ĐŋĐĩŅĐĩдаŅи `float` СаĐŧŅŅŅŅ `int`, ŅĐē йаŅиĐŧĐž, Ņ ŅŅĐžĐŧŅ ĐŋŅиĐēĐģадŅ: http://127.0.0.1:8000/items/4.2
+
+/// check | ĐŅиĐŧŅŅĐēа
+
+ĐŅĐļĐĩ, **FastAPI** ĐŊĐ°Đ´Đ°Ņ ĐŋĐĩŅĐĩвŅŅĐēŅ ŅиĐŋŅв С ŅаĐēиĐŧ ŅаĐŧиĐŧ ĐžĐŗĐžĐģĐžŅĐĩĐŊĐŊŅĐŧ ŅиĐŋŅ Đ˛ Python.
+
+ĐвĐĩŅĐŊŅŅŅ ŅĐ˛Đ°ĐŗŅ, ŅĐž ĐŋĐžĐŧиĐģĐēа ŅаĐēĐžĐļ ŅŅŅĐēĐž вĐēаСŅŅ ŅаĐŧĐĩ ĐŊа ŅĐĩ ĐŧŅŅŅĐĩ, Đ´Đĩ ваĐģŅдаŅŅŅ ĐŊĐĩ ĐŋŅОКŅĐģа.
+
+ĐĻĐĩ ĐŊĐĩĐšĐŧОвŅŅĐŊĐž ĐēĐžŅиŅĐŊĐž ĐŋŅĐ´ ŅĐ°Ņ ŅОСŅОйĐēи Ņа Đ´ĐĩĐąĐ°ĐŗŅĐŊĐŗŅ ĐēОдŅ, ŅĐž вСаŅĐŧОдŅŅ Đˇ ваŅиĐŧ API.
+
+///
+
+## ĐĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ
+
+ĐĸĐĩĐŋĐĩŅ ĐēĐžĐģи вŅĐ´ĐēŅиŅŅĐĩ ŅвŅĐš ĐąŅаŅСĐĩŅ ĐˇĐ° ĐŋĐžŅиĐģаĐŊĐŊŅĐŧ http://127.0.0.1:8000/docs , ŅĐž ĐŋОйаŅиŅĐĩ авŅĐžĐŧаŅиŅĐŊĐž ĐˇĐŗĐĩĐŊĐĩŅОваĐŊŅ, ŅĐŊŅĐĩŅаĐēŅивĐŊŅ API-Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ:
+
+
+
+/// check | ĐŅиĐŧŅŅĐēа
+
+ĐĐŊĐžĐ˛Ņ Đļ ŅаĐēи, ĐģиŅĐĩ С ŅиĐŧ ŅаĐŧиĐŧ ĐžĐŗĐžĐģĐžŅĐĩĐŊĐŊŅĐŧ ŅиĐŋŅ Đ˛ Python, FastAPI ĐŊĐ°Đ´Đ°Ņ Đ˛Đ°Đŧ авŅĐžĐŧаŅиŅĐŊŅ, ŅĐŊŅĐĩŅаĐēŅивĐŊŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ (С ŅĐŊŅĐĩĐŗŅаŅŅŅŅ Swagger UI).
+
+ĐвĐĩŅĐŊŅŅŅ ŅĐ˛Đ°ĐŗŅ, ŅĐž ĐŋаŅаĐŧĐĩŅŅ ŅĐģŅŅ
Ņ ĐžĐŗĐžĐģĐžŅĐĩĐŊиК ŅĐē ŅŅĐģĐĩ ŅиŅĐģĐž.
+
+
+///
+
+## ĐĐĩŅĐĩĐ˛Đ°ĐŗĐ¸ ŅŅаĐŊдаŅŅиСаŅŅŅ, аĐģŅŅĐĩŅĐŊаŅивĐŊа Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ
+
+Đ ĐžŅĐēŅĐģŅĐēи ĐˇĐŗĐĩĐŊĐĩŅОваĐŊа ŅŅ
ĐĩĐŧа вŅĐ´ĐŋОвŅĐ´Đ°Ņ ŅŅаĐŊдаŅŅŅ OpenAPI , ŅŅĐŊŅŅ ĐąĐ°ĐŗĐ°ŅĐž ŅŅĐŧŅŅĐŊиŅ
ŅĐŊŅŅŅŅĐŧĐĩĐŊŅŅв.
+
+Đ ŅŅŅŅ ĐŋŅиŅиĐŊи FastAPI ŅаĐēĐžĐļ ĐŊĐ°Đ´Đ°Ņ Đ°ĐģŅŅĐĩŅĐŊаŅивĐŊŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ API (виĐēĐžŅиŅŅОвŅŅŅи ReDoc), Đ´Đž ŅĐēĐžŅ ĐŧĐžĐļĐŊа ĐžŅŅиĐŧаŅи Đ´ĐžŅŅŅĐŋ Са ĐŋĐžŅиĐģаĐŊĐŊŅĐŧ http://127.0.0.1:8000/redoc :
+
+
+
+ĐĸаĐēиĐŧ ŅиĐŊĐžĐŧ, ŅŅĐŊŅŅ ĐąĐ°ĐŗĐ°ŅĐž ŅŅĐŧŅŅĐŊиŅ
ŅĐŊŅŅŅŅĐŧĐĩĐŊŅŅв, вĐēĐģŅŅаŅŅи ŅĐŊŅŅŅŅĐŧĐĩĐŊŅи Đ´ĐģŅ ĐŗĐĩĐŊĐĩŅаŅŅŅ ĐēĐžĐ´Ņ Đ´ĐģŅ ĐąĐ°ĐŗĐ°ŅŅĐžŅ
ĐŧОв.
+
+
+## Pydantic
+
+ĐŅŅ Đ˛Đ°ĐģŅдаŅŅŅ Đ´Đ°ĐŊиŅ
виĐēĐžĐŊŅŅŅŅŅŅ ĐˇĐ° ĐģаŅŅŅĐŊĐēаĐŧи Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ Pydantic , ŅĐžĐŧŅ Đи ĐžŅŅиĐŧŅŅŅĐĩ вŅŅ ĐŋĐĩŅĐĩĐ˛Đ°ĐŗĐ¸ вŅĐ´ ĐšĐžĐŗĐž виĐēĐžŅиŅŅаĐŊĐŊŅ. Đ ĐŧĐžĐļĐĩŅĐĩ ĐąŅŅи вĐŋĐĩвĐŊĐĩĐŊŅ, ŅĐž вŅĐĩ в ĐŊадŅĐšĐŊиŅ
ŅŅĐēаŅ
.
+
+Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи ŅŅ ŅаĐŧŅ ĐžĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ ŅиĐŋŅв С `str`, `float`, `bool` Ņа ĐąĐ°ĐŗĐ°ŅŅĐŧа ŅĐŊŅиĐŧи ŅĐēĐģадĐŊиĐŧи ŅиĐŋаĐŧи даĐŊиŅ
.
+
+ĐĐĩĐēŅĐģŅĐēа С ĐŊиŅ
ĐąŅĐ´ŅŅŅ ŅĐžĐˇĐŗĐģŅĐŊŅŅŅ Đ˛ ĐŊаŅŅŅĐŋĐŊиŅ
ŅОСдŅĐģаŅ
ĐŋĐžŅŅĐąĐŊиĐēа.
+
+## ĐĐžŅŅĐ´ĐžĐē ĐŧĐ°Ņ ĐˇĐŊаŅĐĩĐŊĐŊŅ
+
+ĐŅи ŅŅвОŅĐĩĐŊĐŊŅ *ĐžĐŋĐĩŅаŅŅĐš ŅĐģŅŅ
Ņ* ĐŧĐžĐļŅŅŅ Đ˛Đ¸ĐŊиĐēаŅи ŅиŅŅаŅŅŅ, ĐēĐžĐģи ŅĐģŅŅ
ŅŅĐēŅОваĐŊиК.
+
+ĐаĐŋŅиĐēĐģад, `/users/me`. ĐŅиĐŋŅŅŅиĐŧĐž, ŅĐž ŅĐĩ ŅĐģŅŅ
Đ´ĐģŅ ĐžŅŅиĐŧаĐŊĐŊŅ Đ´Đ°ĐŊиŅ
ĐŋŅĐž ĐŋĐžŅĐžŅĐŊĐžĐŗĐž ĐēĐžŅиŅŅŅваŅа.
+
+Đ ŅаĐēĐžĐļ Ņ Đ˛Đ°Ņ ĐŧĐžĐļĐĩ ĐąŅŅи ŅĐģŅŅ
`/users/{user_id}`, ŅОй ĐžŅŅиĐŧаŅи даĐŊŅ ĐŋŅĐž ĐēĐžĐŊĐēŅĐĩŅĐŊĐžĐŗĐž ĐēĐžŅиŅŅŅваŅа Са ĐšĐžĐŗĐž ID.
+
+ĐŅĐēŅĐģŅĐēи *ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ* ĐžŅŅĐŊŅŅŅŅŅŅ ĐŋĐž ŅĐĩŅСŅ, Đи ĐŋОвиĐŊĐŊŅ ĐŋĐĩŅĐĩĐēĐžĐŊаŅиŅŅ, ŅĐž ŅĐģŅŅ
Đ´ĐģŅ `/users/me` ĐžĐŗĐžĐģĐžŅĐĩĐŊиК ĐŋĐĩŅĐĩĐ´ ŅĐģŅŅ
ĐžĐŧ Đ´ĐģŅ `/users/{user_id}`:
+
+{* ../../docs_src/path_params/tutorial003.py hl[6,11] *}
+
+ĐĐŊаĐēŅĐĩ ŅĐģŅŅ
Đ´ĐģŅ `/users/{user_id}` ŅаĐēĐžĐļ ĐąŅĐ´Đĩ вŅĐ´ĐŋОвŅдаŅи Đ´ĐģŅ `/users/me`, "вваĐļаŅŅи", ŅĐž вŅĐŊ ĐžŅŅиĐŧŅŅ ĐŋаŅаĐŧĐĩŅŅ `user_id` ĐˇŅ ĐˇĐŊаŅĐĩĐŊĐŊŅĐŧ `"me"`.
+
+ĐĐŊаĐģĐžĐŗŅŅĐŊĐž, Đи ĐŊĐĩ ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅиŅи ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ:
+
+{* ../../docs_src/path_params/tutorial003b.py hl[6,11] *}
+
+ĐĐĩŅŅа ĐžĐŋĐĩŅаŅŅŅ ĐąŅĐ´Đĩ СавĐļди виĐēĐžŅиŅŅОвŅваŅиŅŅ, ĐžŅĐēŅĐģŅĐēи ŅĐģŅŅ
СйŅĐŗĐ°ŅŅŅŅŅ ĐŋĐĩŅŅиĐŧ.
+## ĐĐžĐŋĐĩŅĐĩĐ´ĐŊŅĐž виСĐŊаŅĐĩĐŊŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ
+
+Đ¯ĐēŅĐž Ņ Đ˛Đ°Ņ Ņ *ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ*, ŅĐēа ĐŋŅиКĐŧĐ°Ņ *ĐŋаŅаĐŧĐĩŅŅ ŅĐģŅŅ
Ņ*, аĐģĐĩ Đи Ņ
ĐžŅĐĩŅĐĩ, ŅОй ĐŧĐžĐļĐģĐ¸Đ˛Ņ Đ´ĐžĐŋŅŅŅиĐŧŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ *ĐŋаŅаĐŧĐĩŅŅа ŅĐģŅŅ
Ņ* ĐąŅĐģи ĐŋĐžĐŋĐĩŅĐĩĐ´ĐŊŅĐž виСĐŊаŅĐĩĐŊŅ, Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅаŅи ŅŅаĐŊдаŅŅĐŊиК Python Enum .
+
+### ĐĄŅвОŅĐĩĐŊĐŊŅ ĐēĐģаŅŅ `Enum`
+
+ĐĐŧĐŋĐžŅŅŅĐšŅĐĩ `Enum` Ņ ŅŅвОŅŅŅŅ ĐŋŅĐ´ĐēĐģаŅ, ŅĐž ĐŊаŅĐģŅĐ´ŅŅŅŅŅŅ Đ˛ŅĐ´ `str` Ņа `Enum`.
+
+ĐаŅĐģŅĐ´ŅŅŅи вŅĐ´ `str`, Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ API СĐŧĐžĐļĐĩ виСĐŊаŅиŅи, ŅĐž СĐŊаŅĐĩĐŊĐŊŅ ĐŋОвиĐŊĐŊŅ ĐąŅŅи ŅиĐŋŅ `string`, Ņ ĐŋŅавиĐģŅĐŊĐž ŅŅ
вŅдОйŅаСиŅŅ.
+
+ĐŅŅĐģŅ ŅŅĐžĐŗĐž ŅŅвОŅŅŅŅ Đ°ŅŅийŅŅи ĐēĐģаŅŅ Đˇ ŅŅĐēŅОваĐŊиĐŧи СĐŊаŅĐĩĐŊĐŊŅĐŧи, ŅĐēŅ ĐąŅĐ´ŅŅŅ Đ´ĐžŅŅŅĐŋĐŊиĐŧи Đ´ĐžĐŋŅŅŅиĐŧиĐŧи СĐŊаŅĐĩĐŊĐŊŅĐŧи:
+
+{* ../../docs_src/path_params/tutorial005.py hl[1,6:9] *}
+
+/// info | ĐОдаŅĐēОва ŅĐŊŅĐžŅĐŧаŅŅŅ
+
+ĐĐĩŅĐĩĐģŅŅĐĩĐŊĐŊŅ (айО enums) Đ´ĐžŅŅŅĐŋĐŊŅ Đ˛ Python ĐŋĐžŅиĐŊаŅŅи С вĐĩŅŅŅŅ 3.4.
+
+///
+
+/// tip | ĐĐžŅада
+
+Đ¯ĐēŅĐž ваĐŧ ŅŅĐēавО, "AlexNet", "ResNet" Ņа "LeNet" â ŅĐĩ ĐŋŅĐžŅŅĐž ĐŊаСви ML ĐŧОдĐĩĐģĐĩĐš Machine Learning .
+
+///
+
+
+### ĐĐŗĐžĐģĐžŅŅŅŅ *ĐŋаŅаĐŧĐĩŅŅ ŅĐģŅŅ
Ņ*
+
+ĐĐžŅŅĐŧ ŅŅвОŅŅŅŅ *ĐŋаŅаĐŧĐĩŅŅ ŅĐģŅŅ
Ņ* С аĐŊĐžŅаŅŅŅŅ ŅиĐŋŅ, виĐēĐžŅиŅŅОвŅŅŅи ŅŅвОŅĐĩĐŊиК ваĐŧи ĐēĐģĐ°Ņ enum (`ModelName`):
+
+{* ../../docs_src/path_params/tutorial005.py hl[16] *}
+
+### ĐĐĩŅĐĩвŅŅĐēа Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ
+
+ĐŅĐēŅĐģŅĐēи Đ´ĐžŅŅŅĐŋĐŊŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ Đ´ĐģŅ *ĐŋаŅаĐŧĐĩŅŅа ŅĐģŅŅ
Ņ* виСĐŊаŅĐĩĐŊŅ ĐˇĐ°ĐˇĐ´Đ°ĐģĐĩĐŗŅĐ´Ņ, ŅĐŊŅĐĩŅаĐēŅивĐŊа Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ ĐˇĐŧĐžĐļĐĩ ĐēŅаŅивО ŅŅ
вŅдОйŅаСиŅи:
+
+
+
+### РОйОŅа С *ĐŋĐĩŅĐĩĐģŅŅŅваĐŊĐŊŅĐŧи* Ņ Python
+
+ĐĐŊаŅĐĩĐŊĐŊŅ *ĐŋаŅаĐŧĐĩŅŅа ŅĐģŅŅ
Ņ* ĐąŅĐ´Đĩ ĐĩĐģĐĩĐŧĐĩĐŊŅĐžĐŧ *ĐŋĐĩŅĐĩĐģŅŅŅваĐŊĐŊŅ*.
+
+#### ĐĐžŅŅвĐŊŅĐŊĐŊŅ *ĐĩĐģĐĩĐŧĐĩĐŊŅŅв ĐŋĐĩŅĐĩĐģŅŅŅваĐŊĐŊŅ*
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ĐŋĐžŅŅвĐŊŅваŅи ĐšĐžĐŗĐž С *ĐĩĐģĐĩĐŧĐĩĐŊŅаĐŧи ĐŋĐĩŅĐĩĐģŅŅŅваĐŊĐŊŅ* Ņ ŅŅвОŅĐĩĐŊĐžĐŧŅ Đ˛Đ°Đŧи enum `ModelName`:
+
+{* ../../docs_src/path_params/tutorial005.py hl[17] *}
+
+#### ĐŅŅиĐŧаĐŊĐŊŅ *СĐŊаŅĐĩĐŊĐŊŅ ĐŋĐĩŅĐĩĐģŅŅŅваĐŊĐŊŅ*
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ĐžŅŅиĐŧаŅи ŅаĐēŅиŅĐŊĐĩ СĐŊаŅĐĩĐŊĐŊŅ (Ņ ŅŅĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ ŅĐĩ `str`), виĐēĐžŅиŅŅОвŅŅŅи `model_name.value`, айО ĐˇĐ°ĐŗĐ°ĐģĐžĐŧ `your_enum_member.value`:
+
+{* ../../docs_src/path_params/tutorial005.py hl[20] *}
+
+/// tip | ĐĐžŅада
+
+Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ ĐžŅŅиĐŧаŅи Đ´ĐžŅŅŅĐŋ Đ´Đž СĐŊаŅĐĩĐŊĐŊŅ `"lenet"`, виĐēĐžŅиŅŅОвŅŅŅи `ModelName.lenet.value`.
+
+///
+
+
+#### ĐОвĐĩŅĐŊĐĩĐŊĐŊŅ *ĐĩĐģĐĩĐŧĐĩĐŊŅŅв ĐŋĐĩŅĐĩĐģŅŅŅваĐŊĐŊŅ*
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ĐŋОвĐĩŅŅаŅи *ĐĩĐģĐĩĐŧĐĩĐŊŅи ĐŋĐĩŅĐĩĐģŅŅŅваĐŊĐŊŅ* С ваŅĐžŅ *ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ*, ĐŊавŅŅŅ Đ˛ĐēĐģадĐĩĐŊŅ Ņ JSON-ŅŅĐģĐž (ĐŊаĐŋŅиĐēĐģад, `dict`).
+
+ĐĐžĐŊи ĐąŅĐ´ŅŅŅ ĐŋĐĩŅĐĩŅвОŅĐĩĐŊŅ ĐŊа вŅĐ´ĐŋОвŅĐ´ĐŊŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ (Ņ ŅŅĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ ŅŅĐ´Đēи) ĐŋĐĩŅĐĩĐ´ ĐŋОвĐĩŅĐŊĐĩĐŊĐŊŅĐŧ ĐēĐģŅŅĐŊŅŅ:
+
+{* ../../docs_src/path_params/tutorial005.py hl[18,21,23] *}
+
+Đа ŅŅĐžŅĐžĐŊŅ ĐēĐģŅŅĐŊŅа Đи ĐžŅŅиĐŧаŅŅĐĩ вŅĐ´ĐŋОвŅĐ´Ņ Ņ ŅĐžŅĐŧаŅŅ JSON, ĐŊаĐŋŅиĐēĐģад:
+
+```JSON
+{
+ "model_name": "alexnet",
+ "message": "Deep Learning FTW!"
+}
+```
+
+## Path-ĐŋаŅаĐŧĐĩŅŅи, ŅĐž ĐŧŅŅŅŅŅŅ ŅĐģŅŅ
и
+
+ĐŅиĐŋŅŅŅиĐŧĐž, Ņ Đ˛Đ°Ņ Ņ *ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ* С ĐŧаŅŅŅŅŅĐžĐŧ `/files/{file_path}`.
+
+ĐĐģĐĩ ваĐŧ ĐŋĐžŅŅŅĐąĐŊĐž, ŅОй `file_path` ĐŧŅŅŅив *ŅĐģŅŅ
*, ĐŊаĐŋŅиĐēĐģад `home/johndoe/myfile.txt`.
+
+ĐŅĐļĐĩ, URL Đ´ĐģŅ ŅŅĐžĐŗĐž ŅаКĐģŅ Đ˛Đ¸ĐŗĐģŅдаŅиĐŧĐĩ ŅаĐē: `/files/home/johndoe/myfile.txt`.
+
+
+
+### ĐŅĐ´ŅŅиĐŧĐēа OpenAPI
+
+OpenAPI ĐŊĐĩ ĐŋŅĐ´ŅŅиĐŧŅŅ ŅĐŋĐžŅŅĐą ĐžĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ *ĐŋаŅаĐŧĐĩŅŅа ŅĐģŅŅ
Ņ*, ŅĐž ĐŧŅŅŅиŅŅ *ŅĐģŅŅ
* вŅĐĩŅĐĩдиĐŊŅ, ĐžŅĐēŅĐģŅĐēи ŅĐĩ ĐŧĐžĐļĐĩ ĐŋŅиСвĐĩŅŅи Đ´Đž ŅŅĐĩĐŊаŅŅŅв, ŅĐēŅ ŅĐēĐģадĐŊĐž ŅĐĩŅŅŅваŅи Ņа виСĐŊаŅаŅи.
+
+ĐĐ´ĐŊаĐē (ОдĐŊаŅĐĩ), Đи вŅĐĩ ОдĐŊĐž ĐŧĐžĐļĐĩŅĐĩ СŅОйиŅи ŅĐĩ в **FastAPI**, виĐēĐžŅиŅŅОвŅŅŅи ОдиĐŊ ŅС вĐŊŅŅŅŅŅĐŊŅŅ
ŅĐŊŅŅŅŅĐŧĐĩĐŊŅŅв Starlette.
+
+ĐĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ Đ˛ŅĐĩ ŅĐĩ ĐŋŅаŅŅваŅиĐŧĐĩ, Ņ
ĐžŅа Đš ĐŊĐĩ дОдаваŅиĐŧĐĩ ĐžĐŋиŅŅ ĐŋŅĐž ŅĐĩ, ŅĐž ĐŋаŅаĐŧĐĩŅŅ ĐŋОвиĐŊĐĩĐŊ ĐŧŅŅŅиŅи ŅĐģŅŅ
.
+
+### ĐĐžĐŊвĐĩŅŅĐĩŅ ŅĐģŅŅ
Ņ
+
+ĐиĐēĐžŅиŅŅОвŅŅŅи ĐžĐŋŅŅŅ ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž ĐˇŅ Starlette, Đи ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅиŅи *ĐŋаŅаĐŧĐĩŅŅ ŅĐģŅŅ
Ņ*, ŅĐž ĐŧŅŅŅиŅŅ *ŅĐģŅŅ
*, виĐēĐžŅиŅŅОвŅŅŅи URL ĐŊа ĐēŅŅаĐģŅ:
+
+```
+/files/{file_path:path}
+```
+ĐŖ ŅŅĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ ŅĐŧ'Ņ ĐŋаŅаĐŧĐĩŅŅа â `file_path`, а ĐžŅŅаĐŊĐŊŅ ŅаŅŅиĐŊа `:path` вĐēаСŅŅ ĐŊа ŅĐĩ, ŅĐž ĐŋаŅаĐŧĐĩŅŅ ĐŋОвиĐŊĐĩĐŊ вŅĐ´ĐŋОвŅдаŅи ĐąŅĐ´Ņ-ŅĐēĐžĐŧŅ *ŅĐģŅŅ
Ņ*.
+
+ĐŅĐļĐĩ, Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅаŅи ĐšĐžĐŗĐž ŅаĐē:
+
+{* ../../docs_src/path_params/tutorial004.py hl[6] *}
+
+/// tip | ĐĐžŅада
+
+ĐаĐŧ ĐŧĐžĐļĐĩ СĐŊадОйиŅиŅŅ, ŅОй ĐŋаŅаĐŧĐĩŅŅ ĐŧŅŅŅив `/home/johndoe/myfile.txt` ŅС ĐŋĐžŅаŅĐēĐžĐ˛ĐžŅ ĐēĐžŅĐžŅ ŅиŅĐēĐžŅ (`/`).
+
+ĐŖ ŅаĐēĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ URL Đ˛Đ¸ĐŗĐģŅдаŅиĐŧĐĩ ŅаĐē: `/files//home/johndoe/myfile.txt`, ŅС ĐŋОдвŅĐšĐŊĐžŅ ĐēĐžŅĐžŅ ŅиŅĐēĐžŅ (`//`) ĐŧŅĐļ `files` Ņ `home`.
+
+///
+
+## ĐŅĐ´ŅŅĐŧĐžĐē
+
+Đ **FastAPI**, виĐēĐžŅиŅŅОвŅŅŅи ĐēĐžŅĐžŅĐēŅ, ŅĐŊŅŅŅŅивĐŊĐž СŅОСŅĐŧŅĐģŅ Ņа ŅŅаĐŊдаŅŅĐŊŅ ĐžĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ ŅиĐŋŅв Python, Đи ĐžŅŅиĐŧŅŅŅĐĩ:
+
+* ĐŅĐ´ŅŅиĐŧĐēŅ Đ˛ ŅĐĩдаĐēŅĐžŅŅ: ĐŋĐĩŅĐĩвŅŅĐēа ĐŋĐžĐŧиĐģĐžĐē, авŅОдОĐŋОвĐŊĐĩĐŊĐŊŅ ŅĐžŅĐž.
+* "ĐаŅŅиĐŊĐŗ " даĐŊиŅ
+* ĐаĐģŅдаŅŅŅ Đ´Đ°ĐŊиŅ
+* ĐĐŊĐžŅаŅŅŅ API Ņа авŅĐžĐŧаŅиŅĐŊŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ
+
+РваĐŧ ĐŋĐžŅŅŅĐąĐŊĐž ĐžĐŗĐžĐģĐžŅиŅи ŅŅ
ĐģиŅĐĩ ОдиĐŊ ŅаС.
+
+ĐĻĐĩ, ĐšĐŧОвŅŅĐŊĐž, ĐžŅĐŊОвĐŊа видиĐŧа ĐŋĐĩŅĐĩĐ˛Đ°ĐŗĐ° **FastAPI** ĐŋĐžŅŅвĐŊŅĐŊĐž С аĐģŅŅĐĩŅĐŊаŅивĐŊиĐŧи ŅŅĐĩĐšĐŧвОŅĐēаĐŧи (ĐžĐēŅŅĐŧ виŅĐžĐēĐžŅ ĐŋŅОдŅĐēŅивĐŊĐžŅŅŅ).
diff --git a/docs/uk/docs/tutorial/query-param-models.md b/docs/uk/docs/tutorial/query-param-models.md
new file mode 100644
index 000000000..97eb82fa1
--- /dev/null
+++ b/docs/uk/docs/tutorial/query-param-models.md
@@ -0,0 +1,68 @@
+# ĐОдĐĩĐģŅ Query ĐŋаŅаĐŧĐĩŅŅŅв
+
+Đ¯ĐēŅĐž Ņ ĐĐ°Ņ Ņ ĐŗŅŅĐŋа **query ĐŋаŅаĐŧĐĩŅŅŅв**, ŅĐēŅ ĐŋОвâŅСаĐŊŅ ĐŧŅĐļ ŅОйОŅ, Đи ĐŧĐžĐļĐĩŅĐĩ ŅŅвОŅиŅи **Pydantic-ĐŧОдĐĩĐģŅ** Đ´ĐģŅ ŅŅ
ĐžĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ.
+
+ĐĻĐĩ дОСвОĐģиŅŅ ĐаĐŧ **ĐŋОвŅĐžŅĐŊĐž виĐēĐžŅиŅŅОвŅваŅи ĐŧОдĐĩĐģŅ** Ņ **ŅŅСĐŊиŅ
ĐŧŅŅŅŅŅ
**, а ŅаĐēĐžĐļ ĐžĐŗĐžĐģĐžŅŅваŅи ĐŋĐĩŅĐĩвŅŅĐēи Ņа ĐŧĐĩŅадаĐŊŅ Đ´ĐģŅ Đ˛ŅŅŅ
ĐŋаŅаĐŧĐĩŅŅŅв ОдĐŊĐžŅаŅĐŊĐž. đ
+
+/// note | ĐŅиĐŧŅŅĐēа
+
+ĐĻŅ ĐŧĐžĐļĐģивŅŅŅŅ ĐŋŅĐ´ŅŅиĐŧŅŅŅŅŅŅ, ĐŋĐžŅиĐŊаŅŅи С вĐĩŅŅŅŅ FastAPI `0.115.0`. đ¤
+
+///
+
+## Query ĐŋаŅаĐŧĐĩŅŅи С Pydantic-ĐŧОдĐĩĐģĐģŅ
+
+ĐĐŗĐžĐģĐžŅŅŅŅ **query ĐŋаŅаĐŧĐĩŅŅи**, ŅĐēŅ ĐаĐŧ ĐŋĐžŅŅŅĐąĐŊŅ, Ņ **Pydantic-ĐŧОдĐĩĐģŅ**, а ĐŋĐžŅŅĐŧ ĐžĐŗĐžĐģĐžŅŅŅŅ ŅĐĩĐš ĐŋаŅаĐŧĐĩŅŅ ŅĐē `Query`:
+
+{* ../../docs_src/query_param_models/tutorial001_an_py310.py hl[9:13,17] *}
+
+**FastAPI** ĐąŅĐ´Đĩ **виŅŅĐŗŅваŅи** даĐŊŅ Đ´ĐģŅ **ĐēĐžĐļĐŊĐžĐŗĐž ĐŋĐžĐģŅ** С **query ĐŋаŅаĐŧĐĩŅŅŅв** Ņ ĐˇĐ°ĐŋиŅŅ Ņа ĐŋĐĩŅĐĩдаваŅи ŅŅ
Ņ Đ˛Đ¸ĐˇĐŊаŅĐĩĐŊŅ Đ˛Đ°Đŧи Pydantic-ĐŧОдĐĩĐģŅ.
+
+## ĐĐĩŅĐĩвŅŅŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ĐŋОйаŅиŅи ĐŋаŅаĐŧĐĩŅŅи СаĐŋиŅŅ Đ˛ UI Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ ĐˇĐ° `/docs`:
+
+
+
+
+
+## ĐайОŅĐžĐŊа СаКвиŅ
Query ĐŋаŅаĐŧĐĩŅŅŅв
+
+ĐŖ Đ´ĐĩŅĐēиŅ
ĐžŅОйĐģивиŅ
виĐŋадĐēаŅ
(ĐšĐŧОвŅŅĐŊĐž, ĐŊĐĩ Đ´ŅĐļĐĩ ĐŋĐžŅиŅĐĩĐŊиŅ
) Đи ĐŧĐžĐļĐĩŅĐĩ СаŅ
ĐžŅŅŅи **ОйĐŧĐĩĐļиŅи** query ĐŋаŅаĐŧĐĩŅŅи, ŅĐēŅ Đ´ĐžĐˇĐ˛ĐžĐģĐĩĐŊĐž ĐžŅŅиĐŧŅваŅи.
+
+Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅаŅи ĐēĐžĐŊŅŅĐŗŅŅаŅŅŅ ĐŧОдĐĩĐģŅ Pydantic, ŅОй СайОŅĐžĐŊиŅи (`forbid`) ĐąŅĐ´Ņ-ŅĐēŅ ĐˇĐ°ĐšĐ˛Ņ (`extra`) ĐŋĐžĐģŅ:
+
+{* ../../docs_src/query_param_models/tutorial002_an_py310.py hl[10] *}
+
+Đ¯ĐēŅĐž ĐēĐģŅŅĐŊŅ ŅĐŋŅОйŅŅ ĐŊадŅŅĐģаŅи **СаКвŅ** даĐŊŅ Ņ **query ĐŋаŅаĐŧĐĩŅŅаŅ
**, вŅĐŊ ĐžŅŅиĐŧĐ°Ņ **ĐŋĐžĐŧиĐģĐēŅ**.
+
+ĐаĐŋŅиĐēĐģад, ŅĐēŅĐž ĐēĐģŅŅĐŊŅ ŅĐŋŅОйŅŅ ĐŊадŅŅĐģаŅи query ĐŋаŅаĐŧĐĩŅŅ `tool` ĐˇŅ ĐˇĐŊаŅĐĩĐŊĐŊŅĐŧ `plumbus`, ŅĐē Ņ ŅŅĐžĐŧŅ ĐˇĐ°ĐŋиŅŅ:
+
+```http
+https://example.com/items/?limit=10&tool=plumbus
+```
+
+ĐŅĐŊ ĐžŅŅиĐŧĐ°Ņ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ Đˇ **ĐŋĐžĐŧиĐģĐēĐžŅ**, ŅĐēа ĐŋОвŅĐ´ĐžĐŧиŅŅ, ŅĐž query ĐŋаŅаĐŧĐĩŅŅ `tool ` ĐŊĐĩ дОСвОĐģĐĩĐŊĐž:
+
+```json
+{
+ "detail": [
+ {
+ "type": "extra_forbidden",
+ "loc": ["query", "tool"],
+ "msg": "Extra inputs are not permitted",
+ "input": "plumbus"
+ }
+ ]
+}
+```
+
+## ĐŅĐ´ŅŅĐŧĐžĐē
+
+Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи **Pydantic-ĐŧОдĐĩĐģŅ** Đ´ĐģŅ ĐžĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ **query ĐŋаŅаĐŧĐĩŅŅŅв** Ņ **FastAPI**. đ
+
+/// tip | ĐŅĐ´ĐēаСĐēа
+
+ĐĄĐŋОКĐģĐĩŅ: Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи Pydantic-ĐŧОдĐĩĐģŅ Đ´ĐģŅ ĐžĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ cookie Ņа ĐˇĐ°ĐŗĐžĐģОвĐēŅв, аĐģĐĩ ĐŋŅĐž ŅĐĩ Đи Đ´ŅСĐŊаŅŅĐĩŅŅ ĐŋŅСĐŊŅŅĐĩ в ŅŅĐžĐŧŅ ĐŋĐžŅŅĐąĐŊиĐēŅ. đ¤Ģ
+
+///
diff --git a/docs/uk/docs/tutorial/query-params-str-validations.md b/docs/uk/docs/tutorial/query-params-str-validations.md
new file mode 100644
index 000000000..cd3f4ad93
--- /dev/null
+++ b/docs/uk/docs/tutorial/query-params-str-validations.md
@@ -0,0 +1,491 @@
+# Query ĐŋаŅаĐŧĐĩŅŅи Ņа ваĐģŅдаŅŅŅ ŅŅĐ´ĐēŅв
+
+**FastAPI** дОСвОĐģŅŅ ĐžĐŗĐžĐģĐžŅŅваŅи дОдаŅĐēĐžĐ˛Ņ ŅĐŊŅĐžŅĐŧаŅŅŅ Ņа виĐēĐžĐŊŅваŅи ваĐģŅдаŅŅŅ Đ´ĐģŅ ĐаŅиŅ
ĐŋаŅаĐŧĐĩŅŅŅв.
+
+Đ ĐžĐˇĐŗĐģŅĐŊĐĩĐŧĐž ŅĐĩĐš дОдаŅĐžĐē ŅĐē ĐŋŅиĐēĐģад:
+
+{* ../../docs_src/query_params_str_validations/tutorial001_py310.py hl[7] *}
+
+Query ĐŋаŅаĐŧĐĩŅŅ `q` ĐŧĐ°Ņ ŅиĐŋ `str | None`, ŅĐž ОСĐŊаŅаŅ, ŅĐž вŅĐŊ ĐŧĐžĐļĐĩ ĐąŅŅи ŅĐē `str`, ŅаĐē Ņ `None`. Đа СаĐŧОвŅŅваĐŊĐŊŅĐŧ вŅĐŊ ĐŧĐ°Ņ ĐˇĐŊаŅĐĩĐŊĐŊŅ `None`, ŅĐžĐŧŅ FastAPI ŅОСŅĐŧŅŅ, ŅĐž ŅĐĩĐš ĐŋаŅаĐŧĐĩŅŅ ĐŊĐĩ Ņ ĐžĐąĐžĐ˛'ŅСĐēОвиĐŧ.
+
+/// note | ĐŅиĐŧŅŅĐēа
+
+FastAPI СĐŊаŅ, ŅĐž `q` ĐŊĐĩ Ņ ĐžĐąĐžĐ˛âŅСĐēОвиĐŧ, СавдŅĐēи СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ `= None`.
+
+ĐиĐēĐžŅиŅŅаĐŊĐŊŅ `str | None` дОСвОĐģиŅŅ ĐаŅĐžĐŧŅ ŅĐĩдаĐēŅĐžŅŅ ĐēĐžĐ´Ņ ĐŊадаваŅи ĐēŅаŅŅ ĐŋŅĐ´ŅŅиĐŧĐēŅ Ņа виŅвĐģŅŅи ĐŋĐžĐŧиĐģĐēи.
+
+///
+
+## ĐОдаŅĐēОва ваĐģŅдаŅŅŅ
+
+Đи Ņ
ĐžŅĐĩĐŧĐž, ŅОй ĐŊавŅŅŅ ŅĐēŅĐž `q` Ņ ĐŊĐĩОйОвâŅСĐēОвиĐŧ, **ĐšĐžĐŗĐž дОвĐļиĐŊа ĐŊĐĩ ĐŋĐĩŅĐĩвиŅŅваĐģа 50 ŅиĐŧвОĐģŅв**, ŅĐēŅĐž вŅĐŊ вŅĐĩ Đļ ĐąŅĐ´Đĩ ĐŋĐĩŅĐĩдаĐŊиК.
+
+### ĐĐŧĐŋĐžŅŅ `Query` Ņа `Annotated`
+
+ЊОй ŅĐĩ СŅОйиŅи, ŅĐŋĐžŅаŅĐēŅ ŅĐŧĐŋĐžŅŅŅŅĐŧĐž:
+
+* `Query` С `fastapi`
+* `Annotated` С `typing`
+
+{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+FastAPI дОдав ĐŋŅĐ´ŅŅиĐŧĐēŅ `Annotated` (Ņ ĐŋĐžŅав ŅĐĩĐēĐžĐŧĐĩĐŊĐ´ŅваŅи ĐšĐžĐŗĐž) Ņ Đ˛ĐĩŅŅŅŅ 0.95.0.
+
+Đ¯ĐēŅĐž Ņ ĐĐ°Ņ ŅŅаŅŅŅа вĐĩŅŅŅŅ, ĐŋŅĐ´ ŅĐ°Ņ Đ˛Đ¸ĐēĐžŅиŅŅаĐŊĐŊŅ `Annotated` ĐŧĐžĐļŅŅŅ Đ˛Đ¸ĐŊиĐēаŅи ĐŋĐžĐŧиĐģĐēи.
+
+ĐĐĩŅĐĩĐēĐžĐŊаКŅĐĩŅŅ, ŅĐž Đи [ĐžĐŊОвиĐģи вĐĩŅŅŅŅ FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} Đ´Đž ĐŋŅиĐŊаКĐŧĐŊŅ 0.95.1, ĐŋĐĩŅŅ ĐŊŅĐļ виĐēĐžŅиŅŅОвŅваŅи `Annotated`.
+
+///
+
+## ĐиĐēĐžŅиŅŅаĐŊĐŊŅ `Annotated` Ņ ŅиĐŋŅ ĐŋаŅаĐŧĐĩŅŅа `q`
+
+ĐаĐŧâŅŅаŅŅĐĩ, ŅĐē Ņ ŅаĐŊŅŅĐĩ ŅОСĐŋОвŅдав, ŅĐž `Annotated` ĐŧĐžĐļĐŊа виĐēĐžŅиŅŅОвŅваŅи Đ´ĐģŅ Đ´ĐžĐ´Đ°Đ˛Đ°ĐŊĐŊŅ ĐŧĐĩŅадаĐŊиŅ
Đ´Đž ĐŋаŅаĐŧĐĩŅŅŅв Ņ [ĐŅŅŅĐŋŅ Đ´Đž ŅиĐŋŅв Python](../python-types.md#type-hints-with-metadata-annotations){.internal-link target=_blank}?
+
+ĐаŅаС ŅаĐŧĐĩ ŅĐ°Ņ Đ˛Đ¸ĐēĐžŅиŅŅаŅи ĐšĐžĐŗĐž ŅаСОĐŧ ŅС FastAPI. đ
+
+РаĐŊŅŅĐĩ Đŧи ĐŧаĐģи ŅаĐēŅ Đ°ĐŊĐžŅаŅŅŅ ŅиĐŋŅ:
+
+//// tab | Python 3.10+
+
+```Python
+q: str | None = None
+```
+
+////
+
+//// tab | Python 3.8+
+
+```Python
+q: Union[str, None] = None
+```
+
+////
+
+ĐĸĐĩĐŋĐĩŅ Đŧи ĐˇĐ°ĐŗĐžŅĐŊĐĩĐŧĐž ŅŅ Ņ `Annotated`, Ņ ĐžŅŅиĐŧаŅĐŧĐž:
+
+//// tab | Python 3.10+
+
+```Python
+q: Annotated[str | None] = None
+```
+
+////
+
+//// tab | Python 3.8+
+
+```Python
+q: Annotated[Union[str, None]] = None
+```
+
+////
+
+ĐĐąĐ¸Đ´Đ˛Ņ ŅŅ Đ˛ĐĩŅŅŅŅ ĐžĐˇĐŊаŅаŅŅŅ ĐžĐ´ĐŊĐĩ Đš ŅĐĩ ŅаĐŧĐĩ: `q` â ŅĐĩ ĐŋаŅаĐŧĐĩŅŅ, ŅĐēиК ĐŧĐžĐļĐĩ ĐąŅŅи `str` айО `None`, Ņ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ ĐŧĐ°Ņ ĐˇĐŊаŅĐĩĐŊĐŊŅ `None`.
+
+Đ ŅĐĩĐŋĐĩŅ ĐŋĐĩŅĐĩŅ
ОдиĐŧĐž Đ´Đž ŅŅĐēĐ°Đ˛ĐžĐŗĐž! đ
+
+## ĐОдаваĐŊĐŊŅ `Query` Đ´Đž `Annotated` Ņ ĐŋаŅаĐŧĐĩŅŅ `q`
+
+ĐĸĐĩĐŋĐĩŅ, ĐēĐžĐģи Ņ ĐŊĐ°Ņ Ņ `Annotated`, Đ´Đĩ Đŧи ĐŧĐžĐļĐĩĐŧĐž дОдаваŅи дОдаŅĐēĐžĐ˛Ņ ŅĐŊŅĐžŅĐŧаŅŅŅ (СОĐēŅĐĩĐŧа ваĐģŅдаŅŅŅ), дОдаĐŧĐž `Query` вŅĐĩŅĐĩдиĐŊŅ `Annotated` Ņ Đ˛ŅŅаĐŊОвиĐŧĐž ĐŋаŅаĐŧĐĩŅŅ `max_length` Ņ `50`:
+
+{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[9] *}
+
+ĐвĐĩŅĐŊŅŅŅ ŅĐ˛Đ°ĐŗŅ, ŅĐž СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ ŅŅĐĩ ŅĐĩ `None`, ŅĐžĐŧŅ ĐŋаŅаĐŧĐĩŅŅ ĐˇĐ°ĐģиŅаŅŅŅŅŅ ĐŊĐĩОйОв'ŅСĐēОвиĐŧ.
+
+ĐĐģĐĩ ŅĐĩĐŋĐĩŅ, дОдавŅи `Query(max_length=50)` вŅĐĩŅĐĩдиĐŊŅ `Annotated`, Đŧи ĐŋОвŅĐ´ĐžĐŧĐģŅŅĐŧĐž FastAPI, ŅĐž Ņ
ĐžŅĐĩĐŧĐž **дОдаŅĐēĐžĐ˛Ņ Đ˛Đ°ĐģŅдаŅŅŅ** Đ´ĐģŅ ŅŅĐžĐŗĐž СĐŊаŅĐĩĐŊĐŊŅ â вОĐŊĐž ĐŧĐ°Ņ ĐŧŅŅŅиŅи ĐŧаĐēŅиĐŧŅĐŧ 50 ŅиĐŧвОĐģŅв. đ
+
+/// tip | ĐŅĐ´ĐēаСĐēа
+
+Đи виĐēĐžŅиŅŅОвŅŅĐŧĐž `Query()`, ĐžŅĐēŅĐģŅĐēи ŅĐĩ **query ĐŋаŅаĐŧĐĩŅŅ**. ĐаĐģŅ Đŧи ŅĐžĐˇĐŗĐģŅĐŊĐĩĐŧĐž ŅĐŊŅŅ Đ˛Đ°ŅŅаĐŊŅи, ŅĐē-ĐžŅ `Path()`, `Body()`, `Header()` Ņа `Cookie()`, ŅĐēŅ ĐŋŅиКĐŧаŅŅŅ ŅŅ ŅаĐŧŅ Đ°ŅĐŗŅĐŧĐĩĐŊŅи, ŅĐž Đš `Query()`.
+
+///
+
+ĐĸĐĩĐŋĐĩŅ FastAPI:
+
+* **ĐĐĩŅĐĩвŅŅиŅŅ** даĐŊŅ, ŅОй ĐŋĐĩŅĐĩĐēĐžĐŊаŅиŅŅ, ŅĐž ŅŅ
ĐŊŅ Đ´ĐžĐ˛ĐļиĐŊа ĐŊĐĩ ĐŋĐĩŅĐĩвиŅŅŅ 50 ŅиĐŧвОĐģŅв
+* ĐĐžĐēаĐļe **ŅŅŅĐēŅ ĐŋĐžĐŧиĐģĐēŅ** ĐēĐģŅŅĐŊŅŅ, ŅĐēŅĐž даĐŊŅ ĐŊĐĩĐ´ŅĐšŅĐŊŅ
+* **ĐадОĐēŅĐŧĐĩĐŊŅŅŅ** ĐŋаŅаĐŧĐĩŅŅ Đ˛ OpenAPI-ŅŅ
ĐĩĐŧŅ *ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ* (ŅĐž вŅдОйŅаСиŅŅŅŅ Đ˛ **авŅĐžĐŧаŅиŅĐŊĐž ĐˇĐŗĐĩĐŊĐĩŅОваĐŊŅĐš Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ**)
+
+## ĐĐģŅŅĐĩŅĐŊаŅивĐŊиК (СаŅŅаŅŅĐģиК) ĐŧĐĩŅОд: Query ŅĐē СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ
+
+ĐŖ ĐŋĐžĐŋĐĩŅĐĩĐ´ĐŊŅŅ
вĐĩŅŅŅŅŅ
FastAPI (Đ´Đž 0.95.0 ) `Query` виĐēĐžŅиŅŅОвŅвавŅŅ ŅĐē СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ Đ´ĐģŅ ĐŋаŅаĐŧĐĩŅŅа, а ĐŊĐĩ вŅĐĩŅĐĩдиĐŊŅ `Annotated`. Đи, ĐšĐŧОвŅŅĐŊĐž, ĐŋОйаŅиŅĐĩ ĐēОд, ŅĐēиК виĐēĐžŅиŅŅОвŅŅ ŅĐĩĐš ĐŋŅĐ´Ņ
ŅĐ´, ŅĐžĐŧŅ Đ˛Đ°ŅŅĐž ŅĐžĐˇĐŗĐģŅĐŊŅŅи ĐšĐžĐŗĐž.
+
+/// tip | ĐŅĐ´ĐēаСĐēа
+
+ĐĐģŅ ĐŊĐžĐ˛ĐžĐŗĐž ĐēĐžĐ´Ņ Ņа ĐēĐžĐģи ŅĐĩ ĐŧĐžĐļĐģивО, виĐēĐžŅиŅŅОвŅĐšŅĐĩ `Annotated`, ŅĐē ĐŋĐžĐēаСаĐŊĐž виŅĐĩ. ĐĻĐĩ ĐŧĐ°Ņ ĐąĐ°ĐŗĐ°ŅĐž ĐŋĐĩŅĐĩĐ˛Đ°Đŗ (ĐŋĐžŅŅĐŊĐĩĐŊиŅ
ĐŊиĐļŅĐĩ) Ņ ĐŊĐĩ ĐŧĐ°Ņ ĐŊĐĩĐ´ĐžĐģŅĐēŅв. đ°
+
+///
+
+РаĐŊŅŅĐĩ Đŧи ĐŋиŅаĐģи `Query()` ŅĐē СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ Đ´ĐģŅ ĐŋаŅаĐŧĐĩŅŅа ŅŅĐŊĐēŅŅŅ, вŅŅаĐŊОвĐģŅŅŅи `max_length` Ņ 50:
+
+{* ../../docs_src/query_params_str_validations/tutorial002_py310.py hl[7] *}
+
+ĐŅĐēŅĐģŅĐēи в ŅŅĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ (ĐąĐĩС `Annotated`) ĐŊаĐŧ ĐŋĐžŅŅŅĐąĐŊĐž СаĐŧŅĐŊиŅи `None` Ņ ŅŅĐŊĐēŅŅŅ ĐŊа `Query()`, ŅĐĩĐŋĐĩŅ Đŧи ĐŋОвиĐŊĐŊŅ ŅвĐŊĐž вŅŅаĐŊОвиŅи СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ ŅĐĩŅĐĩС ĐŋаŅаĐŧĐĩŅŅ `Query(default=None)`. ĐĻĐĩ виĐēĐžĐŊŅŅ ŅŅ ŅаĐŧŅ ŅĐžĐģŅ Đ˛Đ¸ĐˇĐŊаŅĐĩĐŊĐŊŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ (ĐŋŅиĐŊаКĐŧĐŊŅ Đ´ĐģŅ FastAPI).
+
+ĐĸаĐēиĐŧ ŅиĐŊĐžĐŧ:
+
+```Python
+q: str | None = Query(default=None)
+```
+
+...ŅОйиŅŅ ĐŋаŅаĐŧĐĩŅŅ ĐŊĐĩОйОвâŅСĐēОвиĐŧ ĐˇŅ ĐˇĐŊаŅĐĩĐŊĐŊŅĐŧ Са СаĐŧОвŅŅваĐŊĐŊŅĐŧ `None`, ŅĐž ĐĩĐēвŅваĐģĐĩĐŊŅĐŊĐž:
+
+
+```Python
+q: str | None = None
+```
+ĐĐģĐĩ Ņ Đ˛ĐĩŅŅŅŅ Đˇ `Query` Đŧи ŅвĐŊĐž вĐēаСŅŅĐŧĐž, ŅĐž ŅĐĩ query ĐŋаŅаĐŧĐĩŅŅ.
+
+ĐаĐģŅ Đŧи ĐŧĐžĐļĐĩĐŧĐž ĐŋĐĩŅĐĩдаваŅи `Query` дОдаŅĐēĐžĐ˛Ņ ĐŋаŅаĐŧĐĩŅŅи, СОĐēŅĐĩĐŧа `max_length`, ŅĐēиК СаŅŅĐžŅОвŅŅŅŅŅŅ Đ´Đž ŅŅĐ´ĐēŅв:
+
+```Python
+q: str | None = Query(default=None, max_length=50)
+```
+
+ĐĻĐĩ СайĐĩСĐŋĐĩŅиŅŅ Đ˛Đ°ĐģŅдаŅŅŅ Đ´Đ°ĐŊиŅ
, вивĐĩĐ´Đĩ СŅОСŅĐŧŅĐģŅ ĐŋĐžĐŧиĐģĐēŅ Ņ ŅĐ°ĐˇŅ ĐŊĐĩĐ´ŅĐšŅĐŊиŅ
даĐŊиŅ
Ņ ĐˇĐ°Đ´ĐžĐēŅĐŧĐĩĐŊŅŅŅ ĐŋаŅаĐŧĐĩŅŅ Ņ ŅŅ
ĐĩĐŧŅ OpenAPI *ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ*.
+
+### `Query` ŅĐē СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ айО вŅĐĩŅĐĩдиĐŊŅ `Annotated`
+
+ĐаĐļĐģивО ĐŋаĐŧâŅŅаŅи, ŅĐēŅĐž виĐēĐžŅиŅŅОвŅваŅи `Query` вŅĐĩŅĐĩдиĐŊŅ `Annotated`, ĐŊĐĩ ĐŧĐžĐļĐŊа СадаваŅи ĐŋаŅаĐŧĐĩŅŅ `default` Ņ `Query`.
+
+ĐаĐŧŅŅŅŅ ŅŅĐžĐŗĐž виĐēĐžŅиŅŅОвŅĐšŅĐĩ СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ Ņ ŅаĐŧŅĐš ŅŅĐŊĐēŅŅŅ. ĐĐŊаĐēŅĐĩ ŅĐĩ ĐąŅĐ´Đĩ ĐŊĐĩĐģĐžĐŗŅŅĐŊĐž.
+
+ĐаĐŋŅиĐēĐģад, ŅĐĩĐš ваŅŅаĐŊŅ Ņ ĐŊĐĩĐēĐžŅĐĩĐēŅĐŊиĐŧ:
+
+```Python
+q: Annotated[str, Query(default="rick")] = "morty"
+```
+
+...ŅĐžĐŧŅ, ŅĐž ĐŊĐĩ СŅОСŅĐŧŅĐģĐž, ŅĐēĐĩ СĐŊаŅĐĩĐŊĐŊŅ ĐŧĐ°Ņ ĐąŅŅи СĐŊаŅĐĩĐŊĐŊŅĐŧ Са СаĐŧОвŅŅваĐŊĐŊŅĐŧ: `"rick"` Ņи `"morty"`.
+
+ĐĐžŅĐĩĐēŅĐŊŅ Đ˛Đ°ŅŅаĐŊŅи:
+
+```Python
+q: Annotated[str, Query()] = "rick"
+```
+
+...айО Ņ ŅŅаŅиŅ
ĐēОдОвиŅ
йаСаŅ
Đи СĐŊаКдĐĩŅĐĩ:
+
+```Python
+q: str = Query(default="rick")
+```
+
+### ĐĐĩŅĐĩĐ˛Đ°ĐŗĐ¸ виĐēĐžŅиŅŅаĐŊĐŊŅ `Annotated`
+
+**ĐиĐēĐžŅиŅŅаĐŊĐŊŅ `Annotated` Ņ ŅĐĩĐēĐžĐŧĐĩĐŊдОваĐŊиĐŧ** СаĐŧŅŅŅŅ ĐˇĐ°Đ´Đ°ĐŊĐŊŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ Ņ ĐŋаŅаĐŧĐĩŅŅаŅ
ŅŅĐŊĐēŅŅŅ, ĐžŅĐēŅĐģŅĐēи вОĐŊĐž **ĐēŅаŅĐĩ** С ĐēŅĐģŅĐēĐžŅ
ĐŋŅиŅиĐŊ. đ¤
+
+ĐĐŊаŅĐĩĐŊĐŊŅ **Са СаĐŧОвŅŅваĐŊĐŊŅĐŧ** ĐŋаŅаĐŧĐĩŅŅа **ŅŅĐŊĐēŅŅŅ** Ņ ĐšĐžĐŗĐž **ŅаĐēŅиŅĐŊиĐŧ СĐŊаŅĐĩĐŊĐŊŅĐŧ Са СаĐŧОвŅŅваĐŊĐŊŅĐŧ**, ŅĐž Ņ ĐąŅĐģŅŅ ŅĐŊŅŅŅŅивĐŊиĐŧ Ņ Python ĐˇĐ°ĐŗĐ°ĐģĐžĐŧ. đ
+
+Đи ĐŧĐžĐļĐĩŅĐĩ **виĐēĐģиĐēаŅи** ŅŅ ŅаĐŧŅ ŅŅĐŊĐēŅŅŅ **в ŅĐŊŅиŅ
ĐŧŅŅŅŅŅ
** ĐąĐĩС FastAPI, Ņ Đ˛ĐžĐŊа **ĐŋŅаŅŅваŅиĐŧĐĩ ĐžŅŅĐēŅваĐŊĐž**. Đ¯ĐēŅĐž ĐŋаŅаĐŧĐĩŅŅ Ņ **ОйОвâŅСĐēОвиĐŧ** (ĐąĐĩС СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ), ĐĐ°Ņ **ŅĐĩдаĐēŅĐžŅ** ĐŋОвŅĐ´ĐžĐŧиŅŅ ĐŋŅĐž ĐŋĐžĐŧиĐģĐēŅ, а **Python** ŅаĐēĐžĐļ видаŅŅŅ ĐŋĐžĐŧиĐģĐēŅ, ŅĐēŅĐž Đи виĐēĐžĐŊаŅŅĐĩ ŅŅĐŊĐēŅŅŅ ĐąĐĩС ĐŋĐĩŅĐĩдаваĐŊĐŊŅ ŅŅĐžĐŗĐž ĐŋаŅаĐŧĐĩŅŅа.
+
+Đ¯ĐēŅĐž Đи ĐŊĐĩ виĐēĐžŅиŅŅОвŅŅŅĐĩ `Annotated`, а виĐēĐžŅиŅŅОвŅŅŅĐĩ **(ŅŅаŅиК) ŅŅиĐģŅ ĐˇĐŊаŅĐĩĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ**, ŅĐž ĐŋŅи виĐēĐģиĐēŅ ŅŅŅŅ ŅŅĐŊĐēŅŅŅ ĐąĐĩС FastAPI **в ŅĐŊŅиŅ
ĐŧŅŅŅŅŅ
**, ĐŋĐžŅŅŅĐąĐŊĐž **ĐŊĐĩ СайŅŅи** ĐŋĐĩŅĐĩдаŅи ŅĐš аŅĐŗŅĐŧĐĩĐŊŅи, ŅĐŊаĐēŅĐĩ СĐŊаŅĐĩĐŊĐŊŅ ĐąŅĐ´ŅŅŅ Đ˛ŅĐ´ŅŅСĐŊŅŅиŅŅ Đ˛ŅĐ´ ĐžŅŅĐēŅваĐŊиŅ
(ĐŊаĐŋŅиĐēĐģад, Đи ĐžŅŅиĐŧаŅŅĐĩ `QueryInfo` айО ĐŋОдŅĐąĐŊĐĩ СаĐŧŅŅŅŅ `str`). ĐĐ°Ņ ŅĐĩдаĐēŅĐžŅ ĐŊĐĩ ĐŋОвŅĐ´ĐžĐŧиŅŅ ĐŋŅĐž ĐŋĐžĐŧиĐģĐēŅ, Ņ Python ŅаĐēĐžĐļ ĐŊĐĩ видаŅŅŅ ĐŋĐžĐŧиĐģĐēŅ ĐŋŅи СаĐŋŅŅĐēŅ ŅŅĐŊĐēŅŅŅ, ĐŋĐžĐēи ĐŊĐĩ виĐŊиĐēĐŊĐĩ ĐŋĐžĐŧиĐģĐēа ĐŋŅĐ´ ŅĐ°Ņ Đ˛Đ¸ĐēĐžĐŊаĐŊĐŊŅ ĐžĐŋĐĩŅаŅŅĐš ŅŅĐĩŅĐĩдиĐŊŅ.
+
+ĐŅĐēŅĐģŅĐēи `Annotated` ĐŧĐžĐļĐĩ ĐŧŅŅŅиŅи ĐēŅĐģŅĐēа аĐŊĐžŅаŅŅĐš ĐŧĐĩŅадаĐŊиŅ
, Đи ĐŊавŅŅŅ ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи ŅŅ ŅаĐŧŅ ŅŅĐŊĐēŅŅŅ Đˇ ŅĐŊŅиĐŧи ŅĐŊŅŅŅŅĐŧĐĩĐŊŅаĐŧи, ŅаĐēиĐŧи ŅĐē Typer . đ
+
+## ĐОдаваĐŊĐŊŅ Đ´ĐžĐ´Đ°ŅĐēОвиŅ
ваĐģŅдаŅŅĐš
+
+Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ дОдаŅи ĐŋаŅаĐŧĐĩŅŅ `min_length`:
+
+{* ../../docs_src/query_params_str_validations/tutorial003_an_py310.py hl[10] *}
+
+## ĐОдаваĐŊĐŊŅ ŅĐĩĐŗŅĐģŅŅĐŊиŅ
виŅаСŅв
+
+Đи ĐŧĐžĐļĐĩŅĐĩ виСĐŊаŅиŅи ŅĐĩĐŗŅĐģŅŅĐŊиК виŅаС pattern, ŅĐēĐžĐŧŅ ĐŧĐ°Ņ Đ˛ŅĐ´ĐŋОвŅдаŅи ĐŋаŅаĐŧĐĩŅŅ:
+
+{* ../../docs_src/query_params_str_validations/tutorial004_an_py310.py hl[11] *}
+
+ĐĻĐĩĐš ĐēĐžĐŊĐēŅĐĩŅĐŊиК ŅайĐģĐžĐŊ ŅĐĩĐŗŅĐģŅŅĐŊĐžĐŗĐž виŅĐ°ĐˇŅ ĐŋĐĩŅĐĩвŅŅŅŅ, ŅĐž ĐžŅŅиĐŧаĐŊĐĩ СĐŊаŅĐĩĐŊĐŊŅ ĐŋаŅаĐŧĐĩŅŅа:
+
+* `^`: ĐŋĐžŅиĐŊаŅŅŅŅŅ Đˇ ĐŊаŅŅŅĐŋĐŊиŅ
ŅиĐŧвОĐģŅв, ĐŋĐĩŅĐĩĐ´ ŅĐēиĐŧи ĐŊĐĩĐŧĐ°Ņ ŅĐŊŅиŅ
ŅиĐŧвОĐģŅв.
+* `fixedquery`: ŅĐžŅĐŊĐž вŅĐ´ĐŋОвŅĐ´Đ°Ņ ĐˇĐŊаŅĐĩĐŊĐŊŅ `fixedquery`.
+* `$`: СаĐēŅĐŊŅŅŅŅŅŅŅ ŅŅŅ, ĐŋŅŅĐģŅ `fixedquery` ĐŊĐĩĐŧĐ°Ņ ĐļОдĐŊиŅ
ŅиĐŧвОĐģŅв.
+
+Đ¯ĐēŅĐž Đи ĐŋĐžŅŅваŅŅĐĩŅŅ ŅĐžĐˇĐŗŅĐąĐģĐĩĐŊĐž ŅОдО **"ŅĐĩĐŗŅĐģŅŅĐŊиŅ
виŅаСŅв"**, ĐŊĐĩ Ņ
виĐģŅĐšŅĐĩŅŅ. ĐĐžĐŊи Ņ ŅĐēĐģадĐŊĐžŅ ŅĐĩĐŧĐžŅ Đ´ĐģŅ ĐąĐ°ĐŗĐ°ŅŅĐžŅ
ĐģŅĐ´ĐĩĐš. Đи вŅĐĩ ОдĐŊĐž ĐŧĐžĐļĐĩŅĐĩ СŅОйиŅи ĐąĐ°ĐŗĐ°ŅĐž ŅĐĩŅĐĩĐš ĐąĐĩС ŅŅ
виĐēĐžŅиŅŅаĐŊĐŊŅ.
+
+ĐĐģĐĩ ŅĐĩĐŋĐĩŅ Đи СĐŊаŅŅĐĩ, ŅĐž ĐēĐžĐģи вОĐŊи СĐŊадОйĐģŅŅŅŅŅ, ŅŅ
ĐŧĐžĐļĐŊа СаŅŅĐžŅОвŅваŅи Ņ **FastAPI**.
+
+### Pydantic v1 `regex` СаĐŧŅŅŅŅ `pattern`
+
+ĐĐž вĐĩŅŅŅŅ Pydantic 2 Ņ FastAPI 0.100.0 ĐŋаŅаĐŧĐĩŅŅ ĐŊаСивавŅŅ `regex` СаĐŧŅŅŅŅ `pattern`, аĐģĐĩ ŅĐĩĐŋĐĩŅ Đ˛ŅĐŊ СаŅŅаŅŅв.
+
+Đи вŅĐĩ ŅĐĩ ĐŧĐžĐļĐĩŅĐĩ СŅŅŅŅŅŅи ĐēОд, ŅĐēиК виĐēĐžŅиŅŅОвŅŅ ĐšĐžĐŗĐž:
+
+//// tab | Pydantic v1
+
+{* ../../docs_src/query_params_str_validations/tutorial004_regex_an_py310.py hl[11] *}
+
+////
+
+ĐĐģĐĩ ĐŧаКŅĐĩ ĐŊа ŅваСŅ, ŅĐž вŅĐŊ Ņ ĐˇĐ°ŅŅаŅŅĐģиĐŧ Ņ ĐšĐžĐŗĐž ŅĐģŅĐ´ ĐžĐŊОвиŅи Đ´Đž ĐŊĐžĐ˛ĐžĐŗĐž ĐŋаŅаĐŧĐĩŅŅа `pattern`. đ¤
+
+## ĐĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ
+
+Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ, вŅĐ´ĐŧŅĐŊĐŊŅ Đ˛ŅĐ´ `None`.
+
+ĐаĐŋŅиĐēĐģад, ŅĐēŅĐž Đи Ņ
ĐžŅĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅиŅи ĐŋаŅаĐŧĐĩŅŅ ĐˇĐ°ĐŋиŅŅ `q` С `min_length` `3` Ņ ĐˇĐŊаŅĐĩĐŊĐŊŅĐŧ Са СаĐŧОвŅŅваĐŊĐŊŅĐŧ `"fixedquery"`:
+
+{* ../../docs_src/query_params_str_validations/tutorial005_an_py39.py hl[9] *}
+
+/// note | ĐĸĐĩŅ
ĐŊŅŅĐŊŅ Đ´ĐĩŅаĐģŅ
+
+ĐаŅвĐŊŅŅŅŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ ĐąŅĐ´Ņ-ŅĐēĐžĐŗĐž ŅиĐŋŅ, вĐēĐģŅŅаŅŅи `None`, ŅОйиŅŅ ĐŋаŅаĐŧĐĩŅŅ ĐŊĐĩОйОвâŅСĐēОвиĐŧ (not required).
+
+///
+
+## ĐйОвâŅСĐēĐžĐ˛Ņ ĐŋаŅаĐŧĐĩŅŅи
+
+Đ¯ĐēŅĐž ĐŊаĐŧ ĐŊĐĩ ĐŋĐžŅŅŅĐąĐŊĐž вĐēаСŅваŅи дОдаŅĐēĐžĐ˛Ņ ĐŋĐĩŅĐĩвŅŅĐēи айО ĐŧĐĩŅадаĐŊŅ, Đŧи ĐŧĐžĐļĐĩĐŧĐž СŅОйиŅи ĐŋаŅаĐŧĐĩŅŅ `q` ОйОвâŅСĐēОвиĐŧ, ĐŋŅĐžŅŅĐž ĐŊĐĩ ĐžĐŗĐžĐģĐžŅŅŅŅи СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ, ĐŊаĐŋŅиĐēĐģад:
+
+```Python
+q: str
+```
+
+СаĐŧŅŅŅŅ:
+
+```Python
+q: str | None = None
+```
+
+ĐĐģĐĩ ŅĐĩĐŋĐĩŅ Đŧи ĐžĐŗĐžĐģĐžŅŅŅĐŧĐž ĐšĐžĐŗĐž С `Query`, ĐŊаĐŋŅиĐēĐģад:
+
+//// tab | Annotated
+
+```Python
+q: Annotated[str | None, Query(min_length=3)] = None
+```
+
+////
+
+ĐĸĐžĐŧŅ, ŅĐēŅĐž ĐаĐŧ ĐŋĐžŅŅŅĐąĐŊĐž СŅОйиŅи СĐŊаŅĐĩĐŊĐŊŅ ĐžĐąĐžĐ˛âŅСĐēОвиĐŧ, виĐēĐžŅиŅŅОвŅŅŅи `Query`, ĐŋŅĐžŅŅĐž ĐŊĐĩ вĐēаСŅĐšŅĐĩ СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ:
+
+{* ../../docs_src/query_params_str_validations/tutorial006_an_py39.py hl[9] *}
+
+### ĐйОвâŅСĐēОвĐĩ СĐŊаŅĐĩĐŊĐŊŅ, ŅĐēĐĩ ĐŧĐžĐļĐĩ ĐąŅŅи `None`
+
+Đи ĐŧĐžĐļĐĩŅĐĩ вĐēаСаŅи, ŅĐž ĐŋаŅаĐŧĐĩŅŅ ĐŧĐžĐļĐĩ ĐŋŅиКĐŧаŅи `None`, аĐģĐĩ ĐŋŅи ŅŅĐžĐŧŅ ĐˇĐ°ĐģиŅаŅŅŅŅŅ ĐžĐąĐžĐ˛âŅСĐēОвиĐŧ. ĐĻĐĩ СĐŧŅŅиŅŅ ĐēĐģŅŅĐŊŅŅв ĐŊадŅŅĐģаŅи СĐŊаŅĐĩĐŊĐŊŅ, ĐŊавŅŅŅ ŅĐēŅĐž вОĐŊĐž Đ´ĐžŅŅвĐŊŅŅ `None`.
+
+ЊОй СŅОйиŅи ŅĐĩ, ĐžĐŗĐžĐģĐžŅŅŅŅ, ŅĐž `None` Ņ Đ´ĐžĐŋŅŅŅиĐŧиĐŧ ŅиĐŋĐžĐŧ, аĐģĐĩ ĐŊĐĩ вĐēаСŅĐšŅĐĩ СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ:
+
+{* ../../docs_src/query_params_str_validations/tutorial006c_an_py310.py hl[9] *}
+
+## ĐĄĐŋиŅĐžĐē ĐŋаŅаĐŧĐĩŅŅŅв СаĐŋиŅŅ / ĐēŅĐģŅĐēа СĐŊаŅĐĩĐŊŅ
+
+Đ¯ĐēŅĐž Đи виСĐŊаŅаŅŅĐĩ ĐŋаŅаĐŧĐĩŅŅ ĐˇĐ°ĐŋиŅŅ ĐˇĐ° Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ `Query`, Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ дОСвОĐģиŅи ĐžŅŅиĐŧаĐŊĐŊŅ ŅĐŋиŅĐēŅ ĐˇĐŊаŅĐĩĐŊŅ, ŅОйŅĐž дОСвОĐģиŅи ĐžŅŅиĐŧаĐŊĐŊŅ ĐēŅĐģŅĐēĐžŅ
СĐŊаŅĐĩĐŊŅ.
+
+ĐаĐŋŅиĐēĐģад, ŅОй дОСвОĐģиŅи ĐŋаŅаĐŧĐĩŅŅŅ ĐˇĐ°ĐŋиŅŅ `q` С'ŅвĐģŅŅиŅŅ ĐēŅĐģŅĐēа ŅаСŅв в URL, ĐŧĐžĐļĐŊа ĐŊаĐŋиŅаŅи:
+
+{* ../../docs_src/query_params_str_validations/tutorial011_an_py310.py hl[9] *}
+
+ĐĸОдŅ, Ņ Đ˛Đ¸ĐŋадĐēŅ ĐˇĐ°ĐŋиŅŅ ĐˇĐ° URL:
+
+```
+http://localhost:8000/items/?q=foo&q=bar
+```
+
+Đи ĐžŅŅиĐŧаŅŅĐĩ ĐēŅĐģŅĐēа СĐŊаŅĐĩĐŊŅ *query ĐŋаŅаĐŧĐĩŅŅа* `q` (`foo` Ņ `bar`) Ņ Đ˛Đ¸ĐŗĐģŅĐ´Ņ ŅĐŋиŅĐēŅ `list` в Python Ņ ĐаŅŅĐš *ŅŅĐŊĐēŅŅŅ ĐžĐąŅОйĐēи ŅĐģŅŅ
Ņ*, Ņ *ĐŋаŅаĐŧĐĩŅŅŅ ŅŅĐŊĐēŅŅŅ* `q`.
+
+ĐŅĐļĐĩ, вŅĐ´ĐŋОвŅĐ´Ņ ĐŊа ŅĐĩĐš URL ĐąŅĐ´Đĩ:
+
+```JSON
+{
+ "q": [
+ "foo",
+ "bar"
+ ]
+}
+```
+
+/// tip | ĐŅĐ´ĐēаСĐēа
+
+ЊОй ĐžĐŗĐžĐģĐžŅиŅи ĐŋаŅаĐŧĐĩŅŅ ĐˇĐ°ĐŋиŅŅ Đˇ ŅиĐŋĐžĐŧ `list`, ŅĐē Ņ ĐŊавĐĩĐ´ĐĩĐŊĐžĐŧŅ Đ˛Đ¸ŅĐĩ ĐŋŅиĐēĐģадŅ, ĐŋĐžŅŅŅĐąĐŊĐž ŅвĐŊĐž виĐēĐžŅиŅŅОвŅваŅи `Query`, ŅĐŊаĐēŅĐĩ вŅĐŊ ĐąŅĐ´Đĩ ŅĐŊŅĐĩŅĐŋŅĐĩŅОваĐŊиК ŅĐē ŅŅĐģĐž СаĐŋиŅŅ.
+
+///
+
+ĐĐŊŅĐĩŅаĐēŅивĐŊа API-Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ ĐžĐŊОвиŅŅŅŅ Đ˛ŅĐ´ĐŋОвŅĐ´ĐŊĐž, дОСвОĐģŅŅŅи ĐŋĐĩŅĐĩдаваŅи ĐēŅĐģŅĐēа СĐŊаŅĐĩĐŊŅ:
+
+
+
+### ĐĄĐŋиŅĐžĐē ĐŋаŅаĐŧĐĩŅŅŅв СаĐŋиŅŅ / ĐēŅĐģŅĐēа СĐŊаŅĐĩĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ
+
+Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ виСĐŊаŅиŅи СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ Đ´ĐģŅ `list`, ŅĐēŅĐž ĐļОдĐŊĐĩ СĐŊаŅĐĩĐŊĐŊŅ ĐŊĐĩ ĐąŅĐģĐž ĐŋĐĩŅĐĩдаĐŊĐĩ:
+
+{* ../../docs_src/query_params_str_validations/tutorial012_an_py39.py hl[9] *}
+
+Đ¯ĐēŅĐž Đи ĐŋĐĩŅĐĩКдĐĩŅĐĩ Са ĐŋĐžŅиĐģаĐŊĐŊŅĐŧ:
+
+```
+http://localhost:8000/items/
+```
+
+ŅĐž СĐŊаŅĐĩĐŊĐŊŅ `q` Са СаĐŧОвŅŅваĐŊĐŊŅĐŧ ĐąŅĐ´Đĩ: `["foo", "bar"]`, Ņ ĐаŅа вŅĐ´ĐŋОвŅĐ´Ņ Đ˛Đ¸ĐŗĐģŅдаŅиĐŧĐĩ ŅаĐē:
+
+```JSON
+{
+ "q": [
+ "foo",
+ "bar"
+ ]
+}
+```
+
+#### ĐиĐēĐžŅиŅŅаĐŊĐŊŅ ŅŅĐģŅĐēи `list`
+
+Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи `list` ĐąĐĩС ŅŅĐžŅĐŊĐĩĐŊĐŊŅ ŅиĐŋŅ, СаĐŧŅŅŅŅ `list[str]`:
+
+{* ../../docs_src/query_params_str_validations/tutorial013_an_py39.py hl[9] *}
+
+/// note | ĐĸĐĩŅ
ĐŊŅŅĐŊŅ Đ´ĐĩŅаĐģŅ
+
+ĐаКŅĐĩ ĐŊа ŅваСŅ, ŅĐž в ŅŅĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ FastAPI ĐŊĐĩ ĐŋĐĩŅĐĩвŅŅŅŅиĐŧĐĩ вĐŧŅŅŅ ŅĐŋиŅĐēŅ.
+
+ĐаĐŋŅиĐēĐģад, `list[int]` ĐŋĐĩŅĐĩвŅŅŅŅиĐŧĐĩ (Ņ Đ´ĐžĐēŅĐŧĐĩĐŊŅŅваŅиĐŧĐĩ), ŅĐž вŅŅ ĐĩĐģĐĩĐŧĐĩĐŊŅи ŅĐŋиŅĐēŅ Ņ ŅŅĐģиĐŧи ŅиŅĐģаĐŧи. ĐĐģĐĩ `list` ĐąĐĩС ŅŅĐžŅĐŊĐĩĐŊĐŊŅ ŅŅĐžĐŗĐž ĐŊĐĩ ŅОйиŅиĐŧĐĩ.
+
+///
+
+## ĐОдаваĐŊĐŊŅ Đ´ĐžĐ´Đ°ŅĐēОвиŅ
ĐŧĐĩŅадаĐŊиŅ
+
+Đи ĐŧĐžĐļĐĩŅĐĩ дОдаŅи ĐąŅĐģŅŅĐĩ ŅĐŊŅĐžŅĐŧаŅŅŅ ĐŋŅĐž ĐŋаŅаĐŧĐĩŅŅ.
+
+ĐĻŅ ŅĐŊŅĐžŅĐŧаŅŅŅ ĐąŅĐ´Đĩ вĐēĐģŅŅĐĩĐŊа Ņ ĐˇĐŗĐĩĐŊĐĩŅОваĐŊиК OpenAPI Ņа виĐēĐžŅиŅŅаĐŊа в ŅĐŊŅĐĩŅŅĐĩĐšŅаŅ
Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ Ņа СОвĐŊŅŅĐŊŅŅ
ŅĐŊŅŅŅŅĐŧĐĩĐŊŅаŅ
.
+
+/// note | ĐĸĐĩŅ
ĐŊŅŅĐŊŅ Đ´ĐĩŅаĐģŅ
+
+ĐаКŅĐĩ ĐŊа ŅваСŅ, ŅĐž ŅŅСĐŊŅ ŅĐŊŅŅŅŅĐŧĐĩĐŊŅи ĐŧĐžĐļŅŅŅ ĐŧаŅи ŅŅСĐŊиК ŅŅвĐĩĐŊŅ ĐŋŅĐ´ŅŅиĐŧĐēи OpenAPI.
+
+ĐĐĩŅĐēŅ Đˇ ĐŊиŅ
ĐŧĐžĐļŅŅŅ ŅĐĩ ĐŊĐĩ вŅдОйŅаĐļаŅи вŅŅ Đ´ĐžĐ´Đ°ŅĐēĐžĐ˛Ņ ŅĐŊŅĐžŅĐŧаŅŅŅ, Ņ
ĐžŅа в ĐąŅĐģŅŅĐžŅŅŅ Đ˛Đ¸ĐŋадĐēŅв ŅŅ ŅŅĐŊĐēŅŅŅ Đ˛ĐļĐĩ СаĐŋĐģаĐŊОваĐŊа Đ´ĐģŅ ŅОСŅОйĐēи.
+
+///
+
+Đи ĐŧĐžĐļĐĩŅĐĩ дОдаŅи `title` :
+
+{* ../../docs_src/query_params_str_validations/tutorial007_an_py310.py hl[10] *}
+
+Đ ŅаĐēĐžĐļ `description`:
+
+{* ../../docs_src/query_params_str_validations/tutorial008_an_py310.py hl[14] *}
+
+## ĐĐģŅаŅи ĐŋаŅаĐŧĐĩŅŅŅв
+
+ĐŖŅвŅŅŅ, ŅĐž Đи Ņ
ĐžŅĐĩŅĐĩ, ŅОй ĐŋаŅаĐŧĐĩŅŅ ĐŊаСивавŅŅ `item-query`.
+
+ĐаĐŋŅиĐēĐģад:
+
+```
+http://127.0.0.1:8000/items/?item-query=foobaritems
+```
+
+ĐĐģĐĩ `item-query` â ŅĐĩ ĐŊĐĩĐēĐžŅĐĩĐēŅĐŊа ĐŊаСва СĐŧŅĐŊĐŊĐžŅ Đ˛ Python.
+
+ĐаКйĐģиĐļŅиК Đ´ĐžĐŋŅŅŅиĐŧиК ваŅŅаĐŊŅ â `item_query`.
+
+ĐŅĐžŅĐĩ ĐаĐŧ ĐŋĐžŅŅŅĐąĐŊĐž, ŅОй ĐŋаŅаĐŧĐĩŅŅ ĐˇĐ°ĐģиŅавŅŅ ŅаĐŧĐĩ `item-query`...
+
+ĐŖ ŅаĐēĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ ĐŧĐžĐļĐŊа ĐžĐŗĐžĐģĐžŅиŅи `alias`, Ņ ŅаĐŧĐĩ вŅĐŊ ĐąŅĐ´Đĩ виĐēĐžŅиŅŅОвŅваŅиŅŅ Đ´ĐģŅ ĐžŅŅиĐŧаĐŊĐŊŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ ĐŋаŅаĐŧĐĩŅŅа:
+
+{* ../../docs_src/query_params_str_validations/tutorial009_an_py310.py hl[9] *}
+
+## ĐивĐĩĐ´ĐĩĐŊĐŊŅ ĐŋаŅаĐŧĐĩŅŅŅв ŅĐē СаŅŅаŅŅĐģиŅ
+
+ĐŅиĐŋŅŅŅиĐŧĐž, ŅĐž Đи ĐąŅĐģŅŅĐĩ ĐŊĐĩ Ņ
ĐžŅĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи ŅĐĩĐš ĐŋаŅаĐŧĐĩŅŅ.
+
+ĐаĐŧ ĐŋĐžŅŅŅĐąĐŊĐž СаĐģиŅиŅи ĐšĐžĐŗĐž ĐŊа Đ´ĐĩŅĐēиК ŅаŅ, ĐžŅĐēŅĐģŅĐēи ĐŊиĐŧ ĐēĐžŅиŅŅŅŅŅŅŅŅ ĐēĐģŅŅĐŊŅи, аĐģĐĩ Đи Ņ
ĐžŅĐĩŅĐĩ, ŅОй Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ ŅŅŅĐēĐž ĐŋĐžĐēаСŅваĐģа, ŅĐž вŅĐŊ Ņ ĐˇĐ°ŅŅаŅŅĐģиĐŧ .
+
+ĐĸĐžĐ´Ņ Đи ĐŧĐžĐļĐĩŅĐĩ ĐŋĐĩŅĐĩдаŅи ĐŋаŅаĐŧĐĩŅŅ `deprecated=True` Đ´Đž `Query`:
+
+{* ../../docs_src/query_params_str_validations/tutorial010_an_py310.py hl[19] *}
+
+ĐĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ ĐąŅĐ´Đĩ ĐŋĐžĐēаСŅваŅи ŅĐĩ ŅаĐēиĐŧ ŅиĐŊĐžĐŧ:
+
+
+
+## ĐиĐŊŅŅĐžĐē ĐŋаŅаĐŧĐĩŅŅŅв С OpenAPI
+
+ЊОй виĐēĐģŅŅиŅи ĐŋаŅаĐŧĐĩŅŅ ĐˇĐ°ĐŋиŅŅ ĐˇŅ ĐˇĐŗĐĩĐŊĐĩŅОваĐŊĐžŅ ŅŅ
ĐĩĐŧи OpenAPI (Ņ, ŅаĐēиĐŧ ŅиĐŊĐžĐŧ, С авŅĐžĐŧаŅиŅĐŊиŅ
ŅиŅŅĐĩĐŧ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ), вŅŅаĐŊОвŅŅŅ ĐŋаŅаĐŧĐĩŅŅ `include_in_schema` Đ´ĐģŅ `Query` в `False`:
+
+{* ../../docs_src/query_params_str_validations/tutorial014_an_py310.py hl[10] *}
+
+## ĐаŅŅĐžĐŧĐŊа ваĐģŅдаŅŅŅ
+
+ĐĐžĐļŅŅŅ ĐąŅŅи виĐŋадĐēи, ĐēĐžĐģи ĐаĐŧ ĐŋĐžŅŅŅĐąĐŊĐž ĐŋŅОвĐĩŅŅи **ĐēаŅŅĐžĐŧĐŊŅ Đ˛Đ°ĐģŅдаŅŅŅ**, ŅĐēŅ ĐŊĐĩ ĐŧĐžĐļĐŊа ŅĐĩаĐģŅСŅваŅи Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ ĐŋаŅаĐŧĐĩŅŅŅв, ĐŋĐžĐēаСаĐŊиŅ
виŅĐĩ.
+
+ĐŖ ŅаĐēиŅ
виĐŋадĐēаŅ
ви ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅаŅи **ĐēаŅŅĐžĐŧĐŊŅ ŅŅĐŊĐēŅŅŅ Đ˛Đ°ĐģŅдаŅŅŅ**, ŅĐēа ĐąŅĐ´Đĩ СаŅŅĐžŅОваĐŊа ĐŋŅŅĐģŅ ĐˇĐ˛Đ¸ŅаКĐŊĐžŅ Đ˛Đ°ĐģŅдаŅŅŅ (ĐŊаĐŋŅиĐēĐģад, ĐŋŅŅĐģŅ ĐŋĐĩŅĐĩвŅŅĐēи, ŅĐž СĐŊаŅĐĩĐŊĐŊŅ Ņ ŅиĐŋĐžĐŧ `str`).
+
+ĐĻĐĩ ĐŧĐžĐļĐŊа Đ´ĐžŅŅĐŗŅи Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ Pydantic's `AfterValidator` в ŅĐĩŅĐĩдиĐŊŅ `Annotated`.
+
+/// tip | ĐŅĐ´ĐēаСĐēа
+
+Pydantic ŅаĐēĐžĐļ ĐŧĐ°Ņ `BeforeValidator` Ņа ŅĐŊŅŅ. đ¤
+
+///
+
+ĐаĐŋŅиĐēĐģад, ŅĐĩĐš ĐēаŅŅĐžĐŧĐŊиК ваĐģŅдаŅĐžŅ ĐŋĐĩŅĐĩвŅŅŅŅ, Ņи ĐŋĐžŅиĐŊаŅŅŅŅŅ ID ĐĩĐģĐĩĐŧĐĩĐŊŅа С `isbn-` Đ´ĐģŅ ĐŊĐžĐŧĐĩŅа ĐēĐŊĐ¸ĐŗĐ¸ ISBN айО С `imdb-` Đ´ĐģŅ ID URL ŅŅĐģŅĐŧŅ ĐŊа IMDB :
+
+{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+ĐĻĐĩ Đ´ĐžŅŅŅĐŋĐŊĐž С вĐĩŅŅŅŅ Pydantic 2 айО виŅĐĩ. đ
+
+///
+
+/// tip | ĐŅĐ´ĐēаСĐēа
+
+Đ¯ĐēŅĐž ĐаĐŧ ĐŋĐžŅŅŅĐąĐŊĐž виĐēĐžĐŊаŅи ĐąŅĐ´Ņ-ŅĐēŅ Đ˛Đ°ĐģŅдаŅŅŅ, ŅĐēа виĐŧĐ°ĐŗĐ°Ņ Đ˛ĐˇĐ°ŅĐŧОдŅŅ Đˇ ĐąŅĐ´Ņ-ŅĐēиĐŧ **СОвĐŊŅŅĐŊŅĐŧ ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅĐžĐŧ**, ŅаĐēиĐŧ ŅĐē йаСа даĐŊиŅ
Ņи ŅĐŊŅиК API, ви ĐŋОвиĐŊĐŊŅ ĐˇĐ°ĐŧŅŅŅŅ ŅŅĐžĐŗĐž виĐēĐžŅиŅŅОвŅваŅи **FastAPI Dependencies**. Đи Đ´ŅСĐŊаŅŅĐĩŅŅ ĐŋŅĐž ĐŊиŅ
ĐŋŅСĐŊŅŅĐĩ.
+
+ĐĻŅ ĐēаŅŅĐžĐŧĐŊŅ Đ˛Đ°ĐģŅдаŅĐžŅи виĐēĐžŅиŅŅОвŅŅŅŅŅŅ Đ´ĐģŅ ŅĐĩŅĐĩĐš, ŅĐēŅ ĐŧĐžĐļĐŊа ĐŋĐĩŅĐĩвŅŅиŅи ĐģиŅĐĩ С **ŅиĐŧи даĐŊиĐŧи**, ŅĐž ĐŊадаĐŊŅ Đ˛ СаĐŋиŅŅ.
+
+///
+
+### ĐŅОСŅĐŧŅĐšŅĐĩ ŅĐĩĐš ĐēОд
+
+ĐĐžĐģОвĐŊиК ĐŧĐžĐŧĐĩĐŊŅ â ŅĐĩ виĐēĐžŅиŅŅаĐŊĐŊŅ **`AfterValidator` С ŅŅĐŊĐēŅŅŅŅ Đ˛ŅĐĩŅĐĩдиĐŊŅ `Annotated`**. ĐĐžĐļĐĩŅĐĩ ĐŋŅĐžĐŋŅŅŅиŅи ŅŅ ŅаŅŅиĐŊŅ, ŅĐēŅĐž Ņ
ĐžŅĐĩŅĐĩ. đ¤¸
+
+---
+
+ĐĐģĐĩ ŅĐēŅĐž ĐаĐŧ ŅŅĐēавО ŅОСŅĐąŅаŅиŅŅ Đ˛ ŅŅĐžĐŧŅ ĐēĐžĐŊĐēŅĐĩŅĐŊĐžĐŧŅ ĐŋŅиĐēĐģĐ°Đ´Ņ ĐēĐžĐ´Ņ Ņ ĐаĐŧ ŅĐĩ ĐŊĐĩ ĐŊайŅидĐģĐž, ĐžŅŅ ĐēŅĐģŅĐēа дОдаŅĐēОвиŅ
Đ´ĐĩŅаĐģĐĩĐš.
+
+#### Đ ŅĐ´ĐžĐē ŅС `value.startswith()`
+
+ĐвĐĩŅĐŊŅĐģи ŅĐ˛Đ°ĐŗŅ? Đ ŅĐ´ĐžĐē ŅС `value.startswith()` ĐŧĐžĐļĐĩ ĐŋŅиКĐŧаŅи ĐēĐžŅŅĐĩĐļ, Ņ ŅĐžĐ´Ņ Đ˛ŅĐŊ ĐŋĐĩŅĐĩвŅŅŅŅиĐŧĐĩ ĐēĐžĐļĐŊĐĩ СĐŊаŅĐĩĐŊĐŊŅ Đ˛ ĐēĐžŅŅĐĩĐļŅ:
+
+{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[16:19] hl[17] *}
+
+#### ĐиĐŋадĐēОвиК ĐĩĐģĐĩĐŧĐĩĐŊŅ
+
+Đа Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ `data.items()` Đŧи ĐžŅŅиĐŧŅŅĐŧĐž ŅŅĐĩŅайĐĩĐģŅĐŊиК Ой'ŅĐēŅ ŅС ĐēĐžŅŅĐĩĐļаĐŧи, ŅĐž ĐŧŅŅŅŅŅŅ ĐēĐģŅŅ Ņ ĐˇĐŊаŅĐĩĐŊĐŊŅ Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž ĐĩĐģĐĩĐŧĐĩĐŊŅа ŅĐģОвĐŊиĐēа.
+
+Đи ĐŋĐĩŅĐĩŅвОŅŅŅĐŧĐž ŅĐĩĐš ŅŅĐĩŅайĐĩĐģŅĐŊиК Ой'ŅĐēŅ Ņ ĐˇĐ˛Đ¸ŅаКĐŊиК `list` Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ `list(data.items())`.
+
+ĐĐžŅŅĐŧ, виĐēĐžŅиŅŅОвŅŅŅи `random.choice()`, Đŧи ĐŧĐžĐļĐĩĐŧĐž ĐžŅŅиĐŧаŅи виĐŋадĐēОвĐĩ СĐŊаŅĐĩĐŊĐŊŅ ĐˇŅ ŅĐŋиŅĐēŅ, ŅОйŅĐž ĐžŅŅиĐŧŅŅĐŧĐž ĐēĐžŅŅĐĩĐļ ŅС `(id, name)`. ĐĻĐĩ ĐŧĐžĐļĐĩ ĐąŅŅи ŅĐžŅŅ ĐŊа СŅаСОĐē `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`.
+
+ĐаĐģŅ Đŧи **ĐŋŅиŅвОŅŅĐŧĐž ŅŅ Đ´Đ˛Đ° СĐŊаŅĐĩĐŊĐŊŅ** ĐēĐžŅŅĐĩĐļŅ ĐˇĐŧŅĐŊĐŊиĐŧ `id` Ņ `name`.
+
+ĐĸĐžĐļ, ŅĐēŅĐž ĐēĐžŅиŅŅŅĐ˛Đ°Ņ ĐŊĐĩ вĐēаСав ID ĐĩĐģĐĩĐŧĐĩĐŊŅа, вŅĐŊ вŅĐĩ ОдĐŊĐž ĐžŅŅиĐŧĐ°Ņ Đ˛Đ¸ĐŋадĐēĐžĐ˛Ņ ŅĐĩĐēĐžĐŧĐĩĐŊдаŅŅŅ.
+
+...Ņ Đ˛ŅĐĩ ŅĐĩ ŅĐĩаĐģŅСОваĐŊĐž в **ОдĐŊĐžĐŧŅ ŅŅĐ´ĐēŅ ĐēОдŅ**. đ¤¯ ĐĨŅйа ĐŊĐĩ ĐŋŅĐĩĐēŅаŅĐŊиК Python? đ
+
+{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[22:30] hl[29] *}
+
+## ĐŅĐ´ŅŅĐŧĐžĐē
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅŅваŅи дОдаŅĐēĐžĐ˛Ņ Đ˛Đ°ĐģŅдаŅŅŅ Ņа ĐŧĐĩŅаŅĐŊŅĐžŅĐŧаŅŅŅ Đ´ĐģŅ ŅвОŅŅ
ĐŋаŅаĐŧĐĩŅŅŅв.
+
+ĐĐ°ĐŗĐ°ĐģŅĐŊŅ Đ˛Đ°ĐģŅдаŅŅŅ Ņа ĐŧĐĩŅаŅĐŊŅĐžŅĐŧаŅŅŅ:
+
+* `alias`
+* `title`
+* `description`
+* `deprecated`
+
+ĐаĐģŅдаŅŅŅ, ŅĐŋĐĩŅиŅŅŅĐŊŅ Đ´ĐģŅ ŅŅĐ´ĐēŅв:
+
+* `min_length`
+* `max_length`
+* `pattern`
+
+ĐаŅŅĐžĐŧĐŊŅ Đ˛Đ°ĐģŅдаŅŅŅ ĐˇĐ° Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ `AfterValidator`.
+
+ĐŖ ŅиŅ
ĐŋŅиĐēĐģадаŅ
Đи ĐŋОйаŅиĐģи, ŅĐē ĐžĐŗĐžĐģĐžŅŅваŅи ваĐģŅдаŅŅŅ Đ´ĐģŅ ĐˇĐŊаŅĐĩĐŊŅ `str`.
+
+ĐивŅŅŅŅŅ ĐŊаŅŅŅĐŋĐŊŅ ŅОСдŅĐģи, ŅОй Đ´ŅСĐŊаŅиŅŅ, ŅĐē ĐžĐŗĐžĐģĐžŅŅваŅи ваĐģŅдаŅŅŅ Đ´ĐģŅ ŅĐŊŅиŅ
ŅиĐŋŅв, ĐŊаĐŋŅиĐēĐģад ŅиŅĐĩĐģ.
diff --git a/docs/uk/docs/tutorial/query-params.md b/docs/uk/docs/tutorial/query-params.md
new file mode 100644
index 000000000..16bb42af3
--- /dev/null
+++ b/docs/uk/docs/tutorial/query-params.md
@@ -0,0 +1,192 @@
+# Query ĐаŅаĐŧĐĩŅŅи
+
+ĐĐžĐģи Đи ĐžĐŗĐžĐģĐžŅŅŅŅĐĩ ŅĐŊŅŅ ĐŋаŅаĐŧĐĩŅŅи ŅŅĐŊĐēŅŅŅ, ŅĐēŅ ĐŊĐĩ Ņ ŅаŅŅиĐŊĐžŅ ĐŋаŅаĐŧĐĩŅŅŅв ŅĐģŅŅ
Ņ, вОĐŊи авŅĐžĐŧаŅиŅĐŊĐž ŅĐŊŅĐĩŅĐŋŅĐĩŅŅŅŅŅŅŅ ŅĐē "query" ĐŋаŅаĐŧĐĩŅŅи.
+
+{* ../../docs_src/query_params/tutorial001.py hl[9] *}
+
+Query ĐŋаŅаĐŧĐĩŅŅи â ŅĐĩ ĐŊайŅŅ ĐŋĐ°Ņ ĐēĐģŅŅ-СĐŊаŅĐĩĐŊĐŊŅ, ŅĐž КдŅŅŅ ĐŋŅŅĐģŅ ŅиĐŧвОĐģŅ `?` в URL, ŅОСдŅĐģĐĩĐŊŅ ŅиĐŧвОĐģаĐŧи `&`.
+
+ĐаĐŋŅиĐēĐģад, в URL:
+
+```
+http://127.0.0.1:8000/items/?skip=0&limit=10
+```
+
+...query ĐŋаŅаĐŧĐĩŅŅаĐŧи Ņ:
+
+* `skip`: ĐˇŅ ĐˇĐŊаŅĐĩĐŊĐŊŅĐŧ `0`
+* `limit`: ĐˇŅ ĐˇĐŊаŅĐĩĐŊĐŊŅĐŧ `10`
+
+ĐŅĐēŅĐģŅĐēи вОĐŊи Ņ ŅаŅŅиĐŊĐžŅ URL, вОĐŊи "Са СаĐŧОвŅŅваĐŊĐŊŅĐŧ" Ņ ŅŅĐ´ĐēаĐŧи.
+
+ĐĐģĐĩ ĐēĐžĐģи Đи ĐžĐŗĐžĐģĐžŅŅŅŅĐĩ ŅŅ
ŅС ŅиĐŋаĐŧи Python (Ņ ĐŊавĐĩĐ´ĐĩĐŊĐžĐŧŅ ĐŋŅиĐēĐģĐ°Đ´Ņ ŅĐē `int`), вОĐŊи ĐŋĐĩŅĐĩŅвОŅŅŅŅŅŅŅ ĐŊа ŅĐĩĐš ŅиĐŋ Ņ ĐŋŅĐžŅ
ОдŅŅŅ ĐŋĐĩŅĐĩвŅŅĐēŅ Đ˛ŅĐ´ĐŋОвŅĐ´ĐŊĐžŅŅŅ.
+
+ĐŖĐ˛ĐĩŅŅ ŅОК ŅаĐŧиК ĐŋŅĐžŅĐĩŅ, ŅĐēиК СаŅŅĐžŅОвŅŅŅŅŅŅ Đ´Đž ĐŋаŅаĐŧĐĩŅŅŅв ŅĐģŅŅ
Ņ, ŅаĐēĐžĐļ СаŅŅĐžŅОвŅŅŅŅŅŅ Đ´Đž query ĐŋаŅаĐŧĐĩŅŅŅв:
+
+* ĐŅĐ´ŅŅиĐŧĐēа в ŅĐĩдаĐēŅĐžŅŅ (авŅОдОĐŋОвĐŊĐĩĐŊĐŊŅ, ĐŋĐĩŅĐĩвŅŅĐēа ĐŋĐžĐŧиĐģĐžĐē)
+* "ĐаŅŅиĐŊĐŗ" даĐŊиŅ
+* ĐаĐģŅдаŅŅŅ Đ´Đ°ĐŊиŅ
+* ĐвŅĐžĐŧаŅиŅĐŊа Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ
+
+
+## ĐĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ
+
+ĐŅĐēŅĐģŅĐēи query ĐŋаŅаĐŧĐĩŅŅи ĐŊĐĩ Ņ ŅŅĐēŅОваĐŊĐžŅ ŅаŅŅиĐŊĐžŅ ŅĐģŅŅ
Ņ, вОĐŊи ĐŧĐžĐļŅŅŅ ĐąŅŅи ĐŊĐĩОйОвâŅСĐēОвиĐŧи Ņа ĐŧаŅи СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ.
+
+ĐŖ ĐŊавĐĩĐ´ĐĩĐŊĐžĐŧŅ Đ˛Đ¸ŅĐĩ ĐŋŅиĐēĐģĐ°Đ´Ņ Đ˛ĐžĐŊи ĐŧаŅŅŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ: `skip=0` Ņ `limit=10`.
+
+ĐŅĐļĐĩ, ŅĐĩСŅĐģŅŅĐ°Ņ ĐŋĐĩŅĐĩŅ
ĐžĐ´Ņ ĐˇĐ° URL:
+
+```
+http://127.0.0.1:8000/items/
+```
+ĐąŅĐ´Đĩ ŅаĐēиĐŧ ŅаĐŧиĐŧ, ŅĐē Ņ ĐŋĐĩŅĐĩŅ
ŅĐ´ Са ĐŋĐžŅиĐģаĐŊĐŊŅĐŧ:
+
+```
+http://127.0.0.1:8000/items/?skip=0&limit=10
+```
+
+ĐĐģĐĩ ŅĐēŅĐž Đи ĐŋĐĩŅĐĩКдĐĩŅĐĩ, ĐŊаĐŋŅиĐēĐģад, Са ĐŋĐžŅиĐģаĐŊĐŊŅĐŧ:
+
+```
+http://127.0.0.1:8000/items/?skip=20
+```
+
+ĐĐŊаŅĐĩĐŊĐŊŅ ĐŋаŅаĐŧĐĩŅŅŅв Ņ Đ˛Đ°ŅŅĐš ŅŅĐŊĐēŅŅŅ ĐąŅĐ´ŅŅŅ ŅаĐēиĐŧи:
+
+* `skip=20`: ĐžŅĐēŅĐģŅĐēи Đи вĐēаСаĐģи ĐšĐžĐŗĐž в URL
+* `limit=10`: ĐžŅĐēŅĐģŅĐēи ŅĐĩ СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ
+
+## ĐĐĩОйОв'ŅСĐēĐžĐ˛Ņ ĐŋаŅаĐŧĐĩŅŅи
+
+ĐĐŊаĐģĐžĐŗŅŅĐŊĐž, Đи ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅиŅи ĐŊĐĩОйОвâŅСĐēĐžĐ˛Ņ query ĐŋаŅаĐŧĐĩŅŅи, вŅŅаĐŊОвивŅи Đ´ĐģŅ ĐŊиŅ
СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ `None`:
+
+{* ../../docs_src/query_params/tutorial002_py310.py hl[7] *}
+
+ĐŖ ŅŅĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ ĐŋаŅаĐŧĐĩŅŅ ŅŅĐŊĐēŅŅŅ `q` ĐąŅĐ´Đĩ ĐŊĐĩОйОвâŅСĐēОвиĐŧ Ņ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ ĐŧаŅиĐŧĐĩ СĐŊаŅĐĩĐŊĐŊŅ `None`.
+
+/// check | ĐŅиĐŧŅŅĐēа
+
+ĐĸаĐēĐžĐļ СвĐĩŅĐŊŅŅŅ ŅĐ˛Đ°ĐŗŅ, ŅĐž **FastAPI** Đ´ĐžŅŅаŅĐŊŅĐž ŅОСŅĐŧĐŊиК, ŅОй виСĐŊаŅиŅи, ŅĐž ĐŋаŅаĐŧĐĩŅŅ ŅĐģŅŅ
Ņ `item_id` Ņ ĐŋаŅаĐŧĐĩŅŅĐžĐŧ ŅĐģŅŅ
Ņ, а `q` â ĐŊŅ, ĐžŅĐļĐĩ, ŅĐĩ query ĐŋаŅаĐŧĐĩŅŅ.
+
+///
+
+## ĐĐĩŅĐĩŅвОŅĐĩĐŊĐŊŅ ŅиĐŋŅ Query ĐŋаŅаĐŧĐĩŅŅа
+
+Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅŅваŅи ĐŋаŅаĐŧĐĩŅŅи ŅиĐŋŅ `bool`, Ņ Đ˛ĐžĐŊи ĐąŅĐ´ŅŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐŊĐž ĐēĐžĐŊвĐĩŅŅОваĐŊŅ:
+
+{* ../../docs_src/query_params/tutorial003_py310.py hl[7] *}
+
+ĐŖ ŅŅĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ, ŅĐēŅĐž Đи СвĐĩŅĐŊĐĩŅĐĩŅŅ Đ´Đž:
+
+
+```
+http://127.0.0.1:8000/items/foo?short=1
+```
+
+айО
+
+```
+http://127.0.0.1:8000/items/foo?short=True
+```
+
+айО
+
+```
+http://127.0.0.1:8000/items/foo?short=true
+```
+
+айО
+
+```
+http://127.0.0.1:8000/items/foo?short=on
+```
+
+айО
+
+```
+http://127.0.0.1:8000/items/foo?short=yes
+```
+
+айО ĐąŅĐ´Ņ-ŅĐēиК ŅĐŊŅиК ваŅŅаĐŊŅ ĐŊаĐŋиŅаĐŊĐŊŅ (вĐĩĐģиĐēŅ ĐģŅŅĐĩŅи, ĐŋĐĩŅŅа ĐģŅŅĐĩŅа вĐĩĐģиĐēа ŅĐžŅĐž), ваŅа ŅŅĐŊĐēŅŅŅ ĐŋОйаŅиŅŅ ĐŋаŅаĐŧĐĩŅŅ `short` ĐˇŅ ĐˇĐŊаŅĐĩĐŊĐŊŅĐŧ `True` С ŅиĐŋĐžĐŧ даĐŊиŅ
`bool`. Đ ŅĐŊŅĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ â `False`.
+
+## ĐŅĐģŅĐēа path Ņ query ĐŋаŅаĐŧĐĩŅŅŅв
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ОдĐŊĐžŅаŅĐŊĐž ĐžĐŗĐžĐģĐžŅŅваŅи ĐēŅĐģŅĐēа path Ņ query ĐŋаŅаĐŧĐĩŅŅŅв, Ņ **FastAPI** авŅĐžĐŧаŅиŅĐŊĐž виСĐŊаŅиŅŅ, ŅĐēиК С ĐŊиŅ
Đ´Đž ŅĐžĐŗĐž ĐŊаĐģĐĩĐļиŅŅ.
+
+
+ĐĐĩ ĐŋĐžŅŅŅĐąĐŊĐž Đ´ĐžŅŅиĐŧŅваŅиŅŅ ĐŋĐĩвĐŊĐžĐŗĐž ĐŋĐžŅŅĐ´ĐēŅ ŅŅ
ĐžĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ.
+
+ĐĐžĐŊи виСĐŊаŅаŅŅŅŅŅ ĐˇĐ° ĐŊаСвОŅ:
+
+{* ../../docs_src/query_params/tutorial004_py310.py hl[6,8] *}
+
+## ĐйОвâŅСĐēĐžĐ˛Ņ Query ĐŋаŅаĐŧĐĩŅŅи
+
+Đ¯ĐēŅĐž Đи ĐžĐŗĐžĐģĐžŅŅŅŅĐĩ СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ Đ´ĐģŅ ĐŋаŅаĐŧĐĩŅŅŅв, ŅĐēŅ ĐŊĐĩ Ņ path-ĐŋаŅаĐŧĐĩŅŅаĐŧи (Ņ ŅŅĐžĐŧŅ ŅОСдŅĐģŅ Đŧи йаŅиĐģи ĐŋĐžĐēи ŅĐž ĐģиŅĐĩ path ĐŋаŅаĐŧĐĩŅŅи), ŅĐžĐ´Ņ Đ˛ĐžĐŊи ŅŅаŅŅŅ ĐŊĐĩОйОвâŅСĐēОвиĐŧи.
+
+Đ¯ĐēŅĐž Đи ĐŊĐĩ Ņ
ĐžŅĐĩŅĐĩ вĐēаСŅваŅи ĐēĐžĐŊĐēŅĐĩŅĐŊŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ, аĐģĐĩ Ņ
ĐžŅĐĩŅĐĩ СŅОйиŅи ĐŋаŅаĐŧĐĩŅŅ ĐžĐŋŅŅĐžĐŊаĐģŅĐŊиĐŧ, СадаКŅĐĩ `None` ŅĐē СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ.
+
+ĐĐģĐĩ ŅĐēŅĐž Đи Ņ
ĐžŅĐĩŅĐĩ СŅОйиŅи query ĐŋаŅаĐŧĐĩŅŅ ĐžĐąĐžĐ˛âŅСĐēОвиĐŧ, ĐŋŅĐžŅŅĐž ĐŊĐĩ вĐēаСŅĐšŅĐĩ Đ´ĐģŅ ĐŊŅĐžĐŗĐž СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ:
+
+{* ../../docs_src/query_params/tutorial005.py hl[6:7] *}
+
+ĐĸŅŅ `needy` â ОйОвâŅСĐēОвиК query ĐŋаŅаĐŧĐĩŅŅ ŅиĐŋŅ `str`.
+
+Đ¯ĐēŅĐž Đи вŅĐ´ĐēŅиŅŅĐĩ Ņ ĐąŅаŅСĐĩŅŅ URL-адŅĐĩŅŅ:
+
+```
+http://127.0.0.1:8000/items/foo-item
+```
+
+...ĐąĐĩС дОдаваĐŊĐŊŅ ĐžĐąĐžĐ˛âŅСĐēĐžĐ˛ĐžĐŗĐž ĐŋаŅаĐŧĐĩŅŅа `needy`, Đи ĐŋОйаŅиŅĐĩ ĐŋĐžĐŧиĐģĐēŅ:
+
+```JSON
+{
+ "detail": [
+ {
+ "type": "missing",
+ "loc": [
+ "query",
+ "needy"
+ ],
+ "msg": "Field required",
+ "input": null,
+ "url": "https://errors.pydantic.dev/2.1/v/missing"
+ }
+ ]
+}
+```
+
+ĐŅĐēŅĐģŅĐēи `needy` Ņ ĐžĐąĐžĐ˛âŅСĐēОвиĐŧ ĐŋаŅаĐŧĐĩŅŅĐžĐŧ, ваĐŧ ĐŋĐžŅŅŅĐąĐŊĐž вĐēаСаŅи ĐšĐžĐŗĐž в URL:
+
+```
+http://127.0.0.1:8000/items/foo-item?needy=sooooneedy
+```
+
+...ŅĐĩĐš СаĐŋĐ¸Ņ ĐŋОвĐĩŅĐŊĐĩ:
+
+```JSON
+{
+ "item_id": "foo-item",
+ "needy": "sooooneedy"
+}
+```
+
+
+ĐвиŅаКĐŊĐž, Đи ĐŧĐžĐļĐĩŅĐĩ виСĐŊаŅиŅи Đ´ĐĩŅĐēŅ ĐŋаŅаĐŧĐĩŅŅи ŅĐē ОйОвâŅСĐēОвŅ, ŅĐŊŅŅ ĐˇŅ ĐˇĐŊаŅĐĩĐŊĐŊŅĐŧ Са СаĐŧОвŅŅваĐŊĐŊŅĐŧ, а ŅĐĩ Đ´ĐĩŅĐēŅ â ĐŋОвĐŊŅŅŅŅ ĐžĐŋŅŅĐžĐŊаĐģŅĐŊŅ:
+
+{* ../../docs_src/query_params/tutorial006_py310.py hl[8] *}
+
+ĐŖ ŅŅĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ Ņ 3 query ĐŋаŅаĐŧĐĩŅŅи:
+
+* `needy`, ОйОвâŅСĐēОвиК `str`.
+* `skip`, `int` ĐˇŅ ĐˇĐŊаŅĐĩĐŊĐŊŅĐŧ Са СаĐŧОвŅŅваĐŊĐŊŅĐŧ `0`.
+* `limit`, ĐžĐŋŅŅĐžĐŊаĐģŅĐŊиК `int`.
+
+
+/// tip | ĐŅĐ´ĐēаСĐēа
+
+Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи `Enum`-и, ŅаĐē ŅаĐŧĐž ŅĐē Ņ Đˇ [Path Parameters](path-params.md#predefined-values){.internal-link target=_blank}.
+
+///
diff --git a/docs/uk/docs/tutorial/request-files.md b/docs/uk/docs/tutorial/request-files.md
new file mode 100644
index 000000000..18b7cc01c
--- /dev/null
+++ b/docs/uk/docs/tutorial/request-files.md
@@ -0,0 +1,175 @@
+# ĐаĐŋĐ¸Ņ ŅаКĐģŅв
+
+Đи ĐŧĐžĐļĐĩŅĐĩ виСĐŊаŅиŅи ŅаКĐģи, ŅĐēŅ ĐąŅĐ´ŅŅŅ ĐˇĐ°Đ˛Đ°ĐŊŅаĐļŅваŅиŅŅ ĐēĐģŅŅĐŊŅĐžĐŧ, виĐēĐžŅиŅŅОвŅŅŅи `File`.
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+ЊОй ĐžŅŅиĐŧŅваŅи СаваĐŊŅаĐļĐĩĐŊŅ ŅаКĐģи, ŅĐŋĐžŅаŅĐēŅ Đ˛ŅŅаĐŊОвŅŅŅ python-multipart .
+
+ĐĐĩŅĐĩĐēĐžĐŊаКŅĐĩŅŅ, ŅĐž Đи ŅŅвОŅиĐģи [вŅŅŅŅаĐģŅĐŊĐĩ ŅĐĩŅĐĩдОвиŅĐĩ](../virtual-environments.md){.internal-link target=_blank}, аĐēŅивŅваĐģи ĐšĐžĐŗĐž Ņа вŅŅаĐŊОвиĐģи ĐŋаĐēĐĩŅ, ĐŊаĐŋŅиĐēĐģад:
+
+```console
+$ pip install python-multipart
+```
+
+ĐĻĐĩ ĐŊĐĩОйŅ
ŅĐ´ĐŊĐž, ĐžŅĐēŅĐģŅĐēи СаваĐŊŅаĐļĐĩĐŊŅ ŅаКĐģи ĐŋĐĩŅĐĩдаŅŅŅŅŅ Ņ Đ˛Đ¸ĐŗĐģŅĐ´Ņ "ŅĐžŅĐŧаŅОваĐŊиŅ
даĐŊиŅ
ŅĐžŅĐŧи".
+
+///
+
+## ĐĐŧĐŋĐžŅŅ `File`
+
+ĐĐŧĐŋĐžŅŅŅĐšŅĐĩ `File` Ņа `UploadFile` С `fastapi`:
+
+{* ../../docs_src/request_files/tutorial001_an_py39.py hl[3] *}
+
+## ĐиСĐŊаŅĐĩĐŊĐŊŅ ĐŋаŅаĐŧĐĩŅŅŅв `File`
+
+ĐĄŅвОŅŅŅŅ ĐŋаŅаĐŧĐĩŅŅи ŅаКĐģŅв ŅаĐē ŅаĐŧĐž ŅĐē Đи Đą ŅŅвОŅŅваĐģи `Body` айО `Form`:
+
+{* ../../docs_src/request_files/tutorial001_an_py39.py hl[9] *}
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+`File` â ŅĐĩ ĐēĐģаŅ, ŅĐēиК ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž ŅŅĐŋадĐēОвŅŅ `Form`.
+
+ĐĐģĐĩ ĐŋаĐŧâŅŅаКŅĐĩ, ŅĐž ĐēĐžĐģи Đи ŅĐŧĐŋĐžŅŅŅŅŅĐĩ `Query`, `Path`, `File` Ņа ŅĐŊŅŅ Đˇ `fastapi`, ŅĐĩ ĐŊаŅĐŋŅĐ°Đ˛Đ´Ņ ŅŅĐŊĐēŅŅŅ, ŅĐēŅ ĐŋОвĐĩŅŅаŅŅŅ ŅĐŋĐĩŅŅаĐģŅĐŊŅ ĐēĐģаŅи.
+
+///
+
+/// tip | ĐŅĐ´ĐēаСĐēа
+
+ЊОй ĐžĐŗĐžĐģĐžŅиŅи ŅŅĐģа ŅаКĐģŅв, ĐаĐŧ ĐŋĐžŅŅŅĐąĐŊĐž виĐēĐžŅиŅŅОвŅваŅи `File`, ŅĐžĐŧŅ ŅĐž ŅĐŊаĐēŅĐĩ ĐŋаŅаĐŧĐĩŅŅи ĐąŅĐ´ŅŅŅ ŅĐŊŅĐĩŅĐŋŅĐĩŅОваĐŊŅ ŅĐē ĐŋаŅаĐŧĐĩŅŅи СаĐŋиŅŅ Đ°ĐąĐž ĐŋаŅаĐŧĐĩŅŅи ŅŅĐģа (JSON).
+
+///
+
+ФаКĐģи ĐąŅĐ´ŅŅŅ ĐˇĐ°Đ˛Đ°ĐŊŅаĐļĐĩĐŊŅ Ņ Đ˛Đ¸ĐŗĐģŅĐ´Ņ "ŅĐžŅĐŧаŅОваĐŊиŅ
даĐŊиŅ
ŅĐžŅĐŧи".
+
+Đ¯ĐēŅĐž Đи ĐžĐŗĐžĐģĐžŅиŅĐĩ ŅиĐŋ ĐŋаŅаĐŧĐĩŅŅа ŅŅĐŊĐēŅŅŅ ĐžĐąŅОйĐŊиĐēа ĐŧаŅŅŅŅŅŅ ŅĐē `bytes`, **FastAPI** ĐŋŅĐžŅиŅĐ°Ņ ŅаКĐģ Са ĐаŅ, Ņ Đи ĐžŅŅиĐŧаŅŅĐĩ ĐšĐžĐŗĐž вĐŧŅŅŅ Ņ Đ˛Đ¸ĐŗĐģŅĐ´Ņ `bytes`.
+
+ĐĐ´ĐŊаĐē ĐŧаКŅĐĩ ĐŊа ŅваСŅ, ŅĐž вĐĩŅŅ Đ˛ĐŧŅŅŅ ĐąŅĐ´Đĩ СйĐĩŅĐĩĐļĐĩĐŊĐž в ĐŋаĐŧ'ŅŅŅ. ĐĻĐĩ ĐŋŅаŅŅваŅиĐŧĐĩ дОйŅĐĩ Đ´ĐģŅ ĐŧаĐģиŅ
ŅаКĐģŅв.
+
+ĐĐģĐĩ в Đ´ĐĩŅĐēиŅ
виĐŋадĐēаŅ
ĐаĐŧ ĐŧĐžĐļĐĩ СĐŊадОйиŅиŅŅ `UploadFile`.
+
+## ĐаŅаĐŧĐĩŅŅи ŅаКĐģŅ Đˇ `UploadFile`
+
+ĐиСĐŊаŅŅĐĩ ĐŋаŅаĐŧĐĩŅŅ ŅаКĐģŅ Đˇ ŅиĐŋĐžĐŧ `UploadFile`:
+
+{* ../../docs_src/request_files/tutorial001_an_py39.py hl[14] *}
+
+ĐиĐēĐžŅиŅŅаĐŊĐŊŅ `UploadFile` ĐŧĐ°Ņ ĐēŅĐģŅĐēа ĐŋĐĩŅĐĩĐ˛Đ°Đŗ ĐŋĐĩŅĐĩĐ´ `bytes`:
+
+* ĐаĐŧ ĐŊĐĩ ĐŋĐžŅŅŅĐąĐŊĐž виĐēĐžŅиŅŅОвŅваŅи `File()` Ņ ĐˇĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ ĐŋаŅаĐŧĐĩŅŅа.
+* ĐиĐēĐžŅиŅŅОвŅŅŅŅŅŅ "ĐąŅŅĐĩŅиСОваĐŊиК" ŅаКĐģ:
+ * ФаКĐģ СйĐĩŅŅĐŗĐ°ŅŅŅŅŅ Đ˛ ĐŋаĐŧ'ŅŅŅ Đ´Đž Đ´ĐžŅŅĐŗĐŊĐĩĐŊĐŊŅ ĐŋĐĩвĐŊĐžĐŗĐž ОйĐŧĐĩĐļĐĩĐŊĐŊŅ, ĐŋŅŅĐģŅ ŅĐžĐŗĐž вŅĐŊ СаĐŋиŅŅŅŅŅŅŅ ĐŊа диŅĐē.
+* ĐĻĐĩ ОСĐŊаŅаŅ, ŅĐž вŅĐŊ дОйŅĐĩ ĐŋŅаŅŅŅ Đ´ĐģŅ Đ˛ĐĩĐģиĐēиŅ
ŅаКĐģŅв, ŅаĐēиŅ
ŅĐē СОйŅаĐļĐĩĐŊĐŊŅ, вŅĐ´ĐĩĐž, вĐĩĐģиĐēŅ Đ´Đ˛ŅĐšĐēĐžĐ˛Ņ ŅаКĐģи ŅĐžŅĐž, ĐŊĐĩ ŅĐŋĐžĐļиваŅŅи вŅŅ ĐŋаĐŧ'ŅŅŅ.
+Đи ĐŧĐžĐļĐĩŅĐĩ ĐžŅŅиĐŧаŅи ĐŧĐĩŅадаĐŊŅ ĐŋŅĐž СаваĐŊŅаĐļĐĩĐŊиК ŅаКĐģ.
+* ĐŅĐŊ ĐŧĐ°Ņ file-like `аŅиĐŊŅ
ŅĐžĐŊĐŊиК ŅаКĐģОвиК ŅĐŊŅĐĩŅŅĐĩĐšŅ` interface.
+* ĐŅĐŊ ĐŊĐ°Đ´Đ°Ņ ŅаĐēŅиŅĐŊиК Ой'ŅĐēŅ Python `SpooledTemporaryFile` , ŅĐēиК ĐŧĐžĐļĐŊа ĐŋĐĩŅĐĩдаваŅи ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž ŅĐŊŅиĐŧ ĐąŅĐąĐģŅĐžŅĐĩĐēаĐŧ.
+
+### `UploadFile`
+
+`UploadFile` ĐŧĐ°Ņ ŅаĐēŅ Đ°ŅŅийŅŅи:
+
+* `filename`: Đ ŅĐ´ĐžĐē `str` С ĐžŅĐ¸ĐŗŅĐŊаĐģŅĐŊĐžŅ ĐŊĐ°ĐˇĐ˛ĐžŅ ŅаКĐģŅ, ŅĐēиК ĐąŅв СаваĐŊŅаĐļĐĩĐŊиК (ĐŊаĐŋŅиĐēĐģад, `myimage.jpg`).
+* `content_type`: Đ ŅĐ´ĐžĐē `str` С MIME-ŅиĐŋĐžĐŧ (ĐŊаĐŋŅиĐēĐģад, `image/jpeg`).
+* `file`: ĐĐą'ŅĐēŅ SpooledTemporaryFile (ŅаКĐģĐžĐŋОдŅĐąĐŊиК Ой'ŅĐēŅ). ĐĻĐĩ ŅаĐēŅиŅĐŊиК ŅаКĐģОвиК Ой'ŅĐēŅ Python, ŅĐēиК ĐŧĐžĐļĐŊа ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž ĐŋĐĩŅĐĩдаваŅи ŅĐŊŅиĐŧ ŅŅĐŊĐēŅŅŅĐŧ айО ĐąŅĐąĐģŅĐžŅĐĩĐēаĐŧ, ŅĐž ĐžŅŅĐēŅŅŅŅ "ŅаКĐģĐžĐŋОдŅĐąĐŊиК" Ой'ŅĐēŅ.
+
+`UploadFile` ĐŧĐ°Ņ ŅаĐēŅ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊŅ `async` ĐŧĐĩŅОди. ĐĐžĐŊи виĐēĐģиĐēаŅŅŅ Đ˛ŅĐ´ĐŋОвŅĐ´ĐŊŅ ĐŧĐĩŅОди ŅаКĐģŅ ĐŋŅĐ´ ĐēаĐŋĐžŅĐžĐŧ (виĐēĐžŅиŅŅОвŅŅŅи вĐŊŅŅŅŅŅĐŊŅĐš `SpooledTemporaryFile`).
+
+* `write(data)`: ĐаĐŋиŅŅŅ `data` (`str` айО `bytes`) Ņ ŅаКĐģ.
+* `read(size)`: ЧиŅĐ°Ņ `size` (`int`) йаКŅŅв/ŅиĐŧвОĐģŅв С ŅаКĐģŅ.
+* `seek(offset)`: ĐĐĩŅĐĩĐŧŅŅŅŅŅŅŅŅ Đ´Đž ĐŋОСиŅŅŅ `offset` (`int`) Ņ ŅаКĐģŅ.
+ * ĐаĐŋŅиĐēĐģад, `await myfile.seek(0)` ĐŋОвĐĩŅĐŊĐĩ ĐēŅŅŅĐžŅ ĐŊа ĐŋĐžŅаŅĐžĐē ŅаКĐģŅ.
+ * This is especially useful if you run `await myfile.read()` once and then need to read the contents again. ĐĻĐĩ ĐžŅОйĐģивО ĐēĐžŅиŅĐŊĐž, ŅĐēŅĐž Đи виĐēĐžĐŊŅŅŅĐĩ await `await myfile.read()` ОдиĐŊ ŅаС, а ĐŋĐžŅŅĐŧ ĐŋĐžŅŅŅĐąĐŊĐž СĐŊĐžĐ˛Ņ ĐŋŅĐžŅиŅаŅи вĐŧŅŅŅ.
+* `close()`: ĐаĐēŅĐ¸Đ˛Đ°Ņ ŅаКĐģ.
+
+ĐŅĐēŅĐģŅĐēи вŅŅ ŅŅ ĐŧĐĩŅОди Ņ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊиĐŧи `async`, ĐаĐŧ ĐŋĐžŅŅŅĐąĐŊĐž виĐēĐžŅиŅŅОвŅваŅи "await":
+
+ĐаĐŋŅиĐēĐģад, вŅĐĩŅĐĩдиĐŊŅ `async` *ŅŅĐŊĐēŅŅŅ ĐžĐąŅОйĐēи ŅĐģŅŅ
Ņ* Đи ĐŧĐžĐļĐĩŅĐĩ ĐžŅŅиĐŧаŅи вĐŧŅŅŅ ĐˇĐ° Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ:
+
+```Python
+contents = await myfile.read()
+```
+Đ¯ĐēŅĐž Đи СĐŊаŅ
ОдиŅĐĩŅŅ Ņ ĐˇĐ˛Đ¸ŅаКĐŊŅĐš `def` *ŅŅĐŊĐēŅŅŅ ĐžĐąŅОйĐēи ŅĐģŅŅ
Ņ*, Đи ĐŧĐžĐļĐĩŅĐĩ ĐžŅŅиĐŧаŅи Đ´ĐžŅŅŅĐŋ Đ´Đž `UploadFile.file` ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž, ĐŊаĐŋŅиĐēĐģад:
+
+```Python
+contents = myfile.file.read()
+```
+
+/// note | ĐĸĐĩŅ
ĐŊŅŅĐŊŅ Đ´ĐĩŅаĐģŅ `async`
+
+ĐĐžĐģи Đи виĐēĐžŅиŅŅОвŅŅŅĐĩ `async` ĐŧĐĩŅОди, **FastAPI** виĐēĐžĐŊŅŅ ŅаКĐģĐžĐ˛Ņ ĐžĐŋĐĩŅаŅŅŅ Ņ ĐŋŅĐģŅ ĐŋĐžŅĐžĐēŅв Ņа ĐžŅŅĐēŅŅ ŅŅ
СавĐĩŅŅĐĩĐŊĐŊŅ.
+
+///
+
+/// note | ĐĸĐĩŅ
ĐŊŅŅĐŊŅ Đ´ĐĩŅаĐģŅ Starlette
+
+`UploadFile` Ņ **FastAPI** ŅŅĐŋадĐēОвŅŅŅŅŅŅ ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž вŅĐ´ `UploadFile` Ņ **Starlette**, аĐģĐĩ Đ´ĐžĐ´Đ°Ņ Đ´ĐĩŅĐēŅ ĐŊĐĩОйŅ
ŅĐ´ĐŊŅ ŅаŅŅиĐŊи, ŅОй СŅОйиŅи ĐšĐžĐŗĐž ŅŅĐŧŅŅĐŊиĐŧ ŅС **Pydantic** Ņа ŅĐŊŅиĐŧи ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅаĐŧи FastAPI.
+
+///
+
+## ĐŠĐž ŅаĐēĐĩ "Form Data"
+
+ĐĄĐŋĐžŅŅĐą, Ņ ŅĐēиК HTML-ŅĐžŅĐŧи (``) ĐŊадŅиĐģаŅŅŅ Đ´Đ°ĐŊŅ ĐŊа ŅĐĩŅвĐĩŅ, СаСвиŅаК виĐēĐžŅиŅŅОвŅŅ "ŅĐŋĐĩŅŅаĐģŅĐŊĐĩ" ĐēОдŅваĐŊĐŊŅ, вŅĐ´ĐŧŅĐŊĐŊĐĩ вŅĐ´ JSON.
+
+**FastAPI** СайĐĩСĐŋĐĩŅŅŅ ĐŋŅавиĐģŅĐŊĐĩ СŅиŅŅваĐŊĐŊŅ ŅиŅ
даĐŊиŅ
С вŅĐ´ĐŋОвŅĐ´ĐŊĐžŅ ŅаŅŅиĐŊи СаĐŋиŅŅ, а ĐŊĐĩ С JSON.
+
+/// note | ĐĸĐĩŅ
ĐŊŅŅĐŊŅ Đ´ĐĩŅаĐģŅ
+
+ĐаĐŊŅ Đˇ ŅĐžŅĐŧ СаСвиŅаК ĐēОдŅŅŅŅŅŅ ĐˇĐ° Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ "media type" `application/x-www-form-urlencoded`, ŅĐēŅĐž вОĐŊи ĐŊĐĩ ĐŧŅŅŅŅŅŅ ŅаКĐģŅв.
+
+ĐĐģĐĩ ŅĐēŅĐž ŅĐžŅĐŧа ĐŧŅŅŅиŅŅ ŅаКĐģи, вОĐŊа ĐēОдŅŅŅŅŅŅ Ņ ŅĐžŅĐŧаŅŅ `multipart/form-data`. Đ¯ĐēŅĐž Đи виĐēĐžŅиŅŅОвŅŅŅĐĩ `File`, **FastAPI** виСĐŊаŅиŅŅ, ŅĐž ĐŋĐžŅŅŅĐąĐŊĐž ĐžŅŅиĐŧаŅи ŅаКĐģи С вŅĐ´ĐŋОвŅĐ´ĐŊĐžŅ ŅаŅŅиĐŊи ŅŅĐģа СаĐŋиŅŅ.
+
+ЊОй Đ´ŅСĐŊаŅиŅŅ ĐąŅĐģŅŅĐĩ ĐŋŅĐž ŅŅ ŅиĐŋи ĐēОдŅваĐŊĐŊŅ Ņа ŅĐžŅĐŧĐžĐ˛Ņ ĐŋĐžĐģŅ, ОСĐŊаКОĐŧŅĐĩŅŅ Đˇ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅŅ MDN ŅОдО POST
.
+
+///
+
+/// warning | ĐŖĐ˛Đ°ĐŗĐ°
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅиŅи ĐēŅĐģŅĐēа ĐŋаŅаĐŧĐĩŅŅŅв `File` Ņ `Form` в *ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ*, аĐģĐĩ Đи ĐŊĐĩ ĐŧĐžĐļĐĩŅĐĩ ОдĐŊĐžŅаŅĐŊĐž ĐžĐŗĐžĐģĐžŅŅваŅи ĐŋĐžĐģŅ `Body`, ŅĐēŅ ĐŧаŅŅŅ ĐŊадŅ
ОдиŅи Ņ ŅĐžŅĐŧаŅŅ JSON, ĐžŅĐēŅĐģŅĐēи ŅŅĐģĐž СаĐŋиŅŅ ĐąŅĐ´Đĩ СаĐēОдОваĐŊĐĩ Ņ ŅĐžŅĐŧаŅŅ `multipart/form-data`, а ĐŊĐĩ `application/json`.
+
+ĐĻĐĩ ĐŊĐĩ ОйĐŧĐĩĐļĐĩĐŊĐŊŅ **FastAPI**, а ĐžŅОйĐģивŅŅŅŅ ĐŋŅĐžŅĐžĐēĐžĐģŅ HTTP.
+
+///
+
+## ĐĐŋŅŅĐžĐŊаĐģŅĐŊĐĩ ĐаваĐŊŅаĐļĐĩĐŊĐŊŅ Đ¤Đ°ĐšĐģŅв
+
+ФаКĐģ ĐŧĐžĐļĐŊа СŅОйиŅи ĐŊĐĩОйОвâŅСĐēОвиĐŧ, виĐēĐžŅиŅŅОвŅŅŅи ŅŅаĐŊдаŅŅĐŊŅ Đ°ĐŊĐžŅаŅŅŅ ŅиĐŋŅв Ņ Đ˛ŅŅаĐŊОвĐģŅŅŅи СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ `None`:
+
+{* ../../docs_src/request_files/tutorial001_02_an_py310.py hl[9,17] *}
+
+## `UploadFile` ŅС ĐОдаŅĐēОвиĐŧи ĐĐĩŅа ĐаĐŊиĐŧи
+
+Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи `File()` ŅаСОĐŧ ŅС `UploadFile`, ĐŊаĐŋŅиĐēĐģад, Đ´ĐģŅ Đ˛ŅŅаĐŊОвĐģĐĩĐŊĐŊŅ Đ´ĐžĐ´Đ°ŅĐēОвиŅ
ĐŧĐĩŅадаĐŊиŅ
:
+
+{* ../../docs_src/request_files/tutorial001_03_an_py39.py hl[9,15] *}
+
+## ĐаваĐŊŅаĐļĐĩĐŊĐŊŅ ĐŅĐģŅĐēĐžŅ
ФаКĐģŅв
+
+ĐĐžĐļĐŊа СаваĐŊŅаĐļŅваŅи ĐēŅĐģŅĐēа ŅаКĐģŅв ОдĐŊĐžŅаŅĐŊĐž.
+
+ĐĐžĐŊи ĐąŅĐ´ŅŅŅ ĐŋОвâŅСаĐŊŅ Đˇ ОдĐŊиĐŧ Ņ ŅиĐŧ ŅаĐŧиĐŧ "form field", ŅĐēиК ĐŋĐĩŅĐĩдаŅŅŅŅŅ Ņ Đ˛Đ¸ĐŗĐģŅĐ´Ņ "form data".
+
+ЊОй ŅĐĩ ŅĐĩаĐģŅСŅваŅи, ĐŋĐžŅŅŅĐąĐŊĐž ĐžĐŗĐžĐģĐžŅиŅи ŅĐŋиŅĐžĐē `bytes` айО `UploadFile`:
+
+{* ../../docs_src/request_files/tutorial002_an_py39.py hl[10,15] *}
+
+Đи ĐžŅŅиĐŧаŅŅĐĩ, ŅĐē Ņ ĐąŅĐģĐž ĐžĐŗĐžĐģĐžŅĐĩĐŊĐž, `list` ŅС `bytes` айО `UploadFile`.
+
+/// note | ĐĸĐĩŅ
ĐŊŅŅĐŊŅ Đ´ĐĩŅаĐģŅ
+
+Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅаŅи `from starlette.responses import HTMLResponse`.
+
+**FastAPI** ĐŊĐ°Đ´Đ°Ņ ŅŅ Đļ ŅаĐŧŅ `starlette.responses`, ŅĐž Đš `fastapi.responses`, Đ´ĐģŅ ĐˇŅŅŅĐŊĐžŅŅŅ ŅОСŅОйĐŊиĐēŅв. ĐĐ´ĐŊаĐē ĐąŅĐģŅŅŅŅŅŅ Đ´ĐžŅŅŅĐŋĐŊиŅ
вŅĐ´ĐŋОвŅĐ´ĐĩĐš ĐŊадŅ
ОдŅŅŅ ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž вŅĐ´ Starlette.
+
+///
+
+### ĐаваĐŊŅаĐļĐĩĐŊĐŊŅ Đ´ĐĩĐēŅĐģŅĐēĐžŅ
ŅаКĐģŅв ŅС дОдаŅĐēОвиĐŧи ĐŧĐĩŅадаĐŊиĐŧи
+
+ĐĸаĐē ŅаĐŧĐž ŅĐē Ņ ŅаĐŊŅŅĐĩ, Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи `File()`, ŅОй вŅŅаĐŊОвиŅи дОдаŅĐēĐžĐ˛Ņ ĐŋаŅаĐŧĐĩŅŅи ĐŊавŅŅŅ Đ´ĐģŅ `UploadFile`:
+
+{* ../../docs_src/request_files/tutorial003_an_py39.py hl[11,18:20] *}
+
+## ĐŅĐ´ŅŅĐŧĐžĐē
+
+ĐиĐēĐžŅиŅŅОвŅĐšŅĐĩ `File`, `bytes`Ņа `UploadFile`, ŅОй ĐžĐŗĐžĐģĐžŅŅваŅи ŅаКĐģи Đ´ĐģŅ ĐˇĐ°Đ˛Đ°ĐŊŅаĐļĐĩĐŊĐŊŅ Ņ ĐˇĐ°ĐŋиŅаŅ
, ŅĐēŅ ĐŊадŅиĐģаŅŅŅŅŅ Ņ Đ˛Đ¸ĐŗĐģŅĐ´Ņ form data.
diff --git a/docs/uk/docs/tutorial/request-form-models.md b/docs/uk/docs/tutorial/request-form-models.md
new file mode 100644
index 000000000..7f5759e79
--- /dev/null
+++ b/docs/uk/docs/tutorial/request-form-models.md
@@ -0,0 +1,78 @@
+# ĐОдĐĩĐģŅ ŅĐžŅĐŧ (Form Models)
+
+ĐŖ FastAPI Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи **Pydantic-ĐŧОдĐĩĐģŅ** Đ´ĐģŅ ĐžĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ **ĐŋĐžĐģŅв ŅĐžŅĐŧи**.
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+ЊОй виĐēĐžŅиŅŅОвŅваŅи ŅĐžŅĐŧи, ŅĐŋĐžŅаŅĐēŅ Đ˛ŅŅаĐŊОвŅŅŅ python-multipart .
+
+ĐĐĩŅĐĩĐēĐžĐŊаКŅĐĩŅŅ, ŅĐž Đи ŅŅвОŅиĐģи [вŅŅŅŅаĐģŅĐŊĐĩ ŅĐĩŅĐĩдОвиŅĐĩ](../virtual-environments.md){.internal-link target=_blank}, аĐēŅивŅваĐģи ĐšĐžĐŗĐž, а ĐŋĐžŅŅĐŧ вŅŅаĐŊОвиĐģи ĐąŅĐąĐģŅĐžŅĐĩĐēŅ, ĐŊаĐŋŅиĐēĐģад:
+
+```console
+$ pip install python-multipart
+```
+
+///
+
+/// note | ĐŅĐ´ĐēаСĐēа
+
+ĐĻŅ ŅŅĐŊĐēŅŅŅ ĐŋŅĐ´ŅŅиĐŧŅŅŅŅŅŅ, ĐŋĐžŅиĐŊаŅŅи С FastAPI вĐĩŅŅŅŅ `0.113.0`. đ¤
+
+///
+
+## ĐиĐēĐžŅиŅŅаĐŊĐŊŅ Pydantic-ĐŧОдĐĩĐģĐĩĐš Đ´ĐģŅ ŅĐžŅĐŧ
+
+ĐаĐŧ ĐŋŅĐžŅŅĐž ĐŋĐžŅŅŅĐąĐŊĐž ĐžĐŗĐžĐģĐžŅиŅи **Pydantic-ĐŧОдĐĩĐģŅ** С ĐŋĐžĐģŅĐŧи, ŅĐēŅ Đи Ņ
ĐžŅĐĩŅĐĩ ĐžŅŅиĐŧаŅи ŅĐē **ĐŋĐžĐģŅ ŅĐžŅĐŧи**, а ĐŋĐžŅŅĐŧ ĐžĐŗĐžĐģĐžŅиŅи ĐŋаŅаĐŧĐĩŅŅ ŅĐē `Form`:
+
+{* ../../docs_src/request_form_models/tutorial001_an_py39.py hl[9:11,15] *}
+
+**FastAPI** **виŅŅĐŗĐŊĐĩ** даĐŊŅ Đ´ĐģŅ **ĐēĐžĐļĐŊĐžĐŗĐž ĐŋĐžĐģŅ** С **ŅĐžŅĐŧОвиŅ
даĐŊиŅ
** Ņ ĐˇĐ°ĐŋиŅŅ Ņа ĐŊадаŅŅŅ Đ˛Đ°Đŧ Pydantic-ĐŧОдĐĩĐģŅ, ŅĐēŅ Đи виСĐŊаŅиĐģи.
+
+## ĐĐĩŅĐĩвŅŅĐēа Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ĐŋĐĩŅĐĩвŅŅиŅи ŅĐĩ в UI Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ ĐˇĐ° `/docs`:
+
+
+
+
+
+## ĐайОŅĐžĐŊа дОдаŅĐēОвиŅ
ĐŋĐžĐģŅв ŅĐžŅĐŧи
+
+ĐŖ Đ´ĐĩŅĐēиŅ
ĐžŅОйĐģивиŅ
виĐŋадĐēаŅ
(ĐšĐŧОвŅŅĐŊĐž, ŅŅĐ´ĐēĐž) Đи ĐŧĐžĐļĐĩŅĐĩ **ОйĐŧĐĩĐļиŅи** ŅĐžŅĐŧŅ ĐģиŅĐĩ ŅиĐŧи ĐŋĐžĐģŅĐŧи, ŅĐēŅ ĐąŅĐģи ĐžĐŗĐžĐģĐžŅĐĩĐŊŅ Đ˛ Pydantic-ĐŧОдĐĩĐģŅ, Ņ **СайОŅĐžĐŊиŅи** ĐąŅĐ´Ņ-ŅĐēŅ **дОдаŅĐēОвŅ** ĐŋĐžĐģŅ.
+
+/// note | ĐŅĐ´ĐēаСĐēа
+
+ĐĻŅ ŅŅĐŊĐēŅŅŅ ĐŋŅĐ´ŅŅиĐŧŅŅŅŅŅŅ, ĐŋĐžŅиĐŊаŅŅи С FastAPI вĐĩŅŅŅŅ `0.114.0`. đ¤
+
+///
+
+Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅаŅи ĐēĐžĐŊŅŅĐŗŅŅаŅŅŅ Pydantic-ĐŧОдĐĩĐģŅ, ŅОй СайОŅĐžĐŊиŅи `forbid` ĐąŅĐ´Ņ-ŅĐēŅ Đ´ĐžĐ´Đ°ŅĐēĐžĐ˛Ņ `extra` ĐŋĐžĐģŅ:
+
+{* ../../docs_src/request_form_models/tutorial002_an_py39.py hl[12] *}
+
+Đ¯ĐēŅĐž ĐēĐģŅŅĐŊŅ ŅĐŋŅОйŅŅ ĐŊадŅŅĐģаŅи дОдаŅĐēĐžĐ˛Ņ Đ´Đ°ĐŊŅ, вŅĐŊ ĐžŅŅиĐŧĐ°Ņ **вŅĐ´ĐŋОвŅĐ´Ņ Đˇ ĐŋĐžĐŧиĐģĐēĐžŅ**.
+
+ĐаĐŋŅиĐēĐģад, ŅĐēŅĐž ĐēĐģŅŅĐŊŅ ŅĐŋŅОйŅŅ ĐŊадŅŅĐģаŅи ĐŊаŅŅŅĐŋĐŊŅ ĐŋĐžĐģŅ ŅĐžŅĐŧи:
+
+* `username`: `Rick`
+* `password`: `Portal Gun`
+* `extra`: `Mr. Poopybutthole`
+
+ĐŅĐŊ ĐžŅŅиĐŧĐ°Ņ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ ŅС ĐŋĐžĐŧиĐģĐēĐžŅ, ŅĐēа ĐŋОвŅĐ´ĐžĐŧĐģŅŅ, ŅĐž ĐŋĐžĐģĐĩ `extra` ĐŊĐĩ дОСвОĐģĐĩĐŊĐž:
+
+```json
+{
+ "detail": [
+ {
+ "type": "extra_forbidden",
+ "loc": ["body", "extra"],
+ "msg": "Extra inputs are not permitted",
+ "input": "Mr. Poopybutthole"
+ }
+ ]
+}
+```
+
+## ĐŅĐ´ŅŅĐŧĐžĐē
+
+Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи Pydantic-ĐŧОдĐĩĐģŅ Đ´ĐģŅ ĐžĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ ĐŋĐžĐģŅв ŅĐžŅĐŧи Ņ FastAPI. đ
diff --git a/docs/uk/docs/tutorial/request-forms-and-files.md b/docs/uk/docs/tutorial/request-forms-and-files.md
new file mode 100644
index 000000000..a089ef945
--- /dev/null
+++ b/docs/uk/docs/tutorial/request-forms-and-files.md
@@ -0,0 +1,41 @@
+# ĐаĐŋиŅи С ŅĐžŅĐŧаĐŧи Ņа ŅаКĐģаĐŧи
+
+ĐŖ FastAPI Đи ĐŧĐžĐļĐĩŅĐĩ ОдĐŊĐžŅаŅĐŊĐž ĐžŅŅиĐŧŅваŅи ŅаКĐģи Ņа ĐŋĐžĐģŅ ŅĐžŅĐŧи, виĐēĐžŅиŅŅОвŅŅŅи `File` Ņ `Form`.
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+ЊОй ĐžŅŅиĐŧŅваŅи СаваĐŊŅаĐļĐĩĐŊŅ ŅаКĐģи Ņа/айО даĐŊŅ ŅĐžŅĐŧи, ŅĐŋĐžŅаŅĐēŅ Đ˛ŅŅаĐŊОвŅŅŅ python-multipart .
+
+ĐĐĩŅĐĩĐēĐžĐŊаКŅĐĩŅŅ, ŅĐž Đи ŅŅвОŅиĐģи [вŅŅŅŅаĐģŅĐŊĐĩ ŅĐĩŅĐĩдОвиŅĐĩ](../virtual-environments.md){.internal-link target=_blank}, аĐēŅивŅваĐģи ĐšĐžĐŗĐž, а ĐŋĐžŅŅĐŧ вŅŅаĐŊОвиĐģи ĐąŅĐąĐģŅĐžŅĐĩĐēŅ, ĐŊаĐŋŅиĐēĐģад:
+
+```console
+$ pip install python-multipart
+```
+
+///
+
+## ĐĐŧĐŋĐžŅŅ `File` Ņа `Form`
+
+{* ../../docs_src/request_forms_and_files/tutorial001_an_py39.py hl[3] *}
+
+## ĐĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ ĐŋаŅаĐŧĐĩŅŅŅв `File` Ņа `Form`
+
+ĐĄŅвОŅŅŅŅ ĐŋаŅаĐŧĐĩŅŅи ŅаКĐģŅв Ņа ŅĐžŅĐŧи ŅаĐē ŅаĐŧĐž ŅĐē Ņ Đ´ĐģŅ `Body` айО `Query`:
+
+{* ../../docs_src/request_forms_and_files/tutorial001_an_py39.py hl[10:12] *}
+
+ФаКĐģи Ņа ĐŋĐžĐģŅ ŅĐžŅĐŧи ĐąŅĐ´ŅŅŅ ĐˇĐ°Đ˛Đ°ĐŊŅаĐļĐĩĐŊŅ ŅĐē ŅĐžŅĐŧĐžĐ˛Ņ Đ´Đ°ĐŊŅ, Ņ Đи ĐžŅŅиĐŧаŅŅĐĩ ŅĐē ŅаКĐģи, ŅаĐē Ņ Đ˛Đ˛ĐĩĐ´ĐĩĐŊŅ ĐēĐžŅиŅŅŅваŅĐĩĐŧ ĐŋĐžĐģŅ.
+
+Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅиŅи Đ´ĐĩŅĐēŅ ŅаКĐģи ŅĐē `bytes`, а Đ´ĐĩŅĐēŅ ŅĐē `UploadFile`.
+
+/// warning | ĐŖĐ˛Đ°ĐŗĐ°
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅиŅи ĐēŅĐģŅĐēа ĐŋаŅаĐŧĐĩŅŅŅв `File` Ņ `Form` в ĐžĐŋĐĩŅаŅŅŅ *ŅĐģŅŅ
Ņ*, аĐģĐĩ ĐŊĐĩ ĐŧĐžĐļĐĩŅĐĩ ОдĐŊĐžŅаŅĐŊĐž ĐžĐŗĐžĐģĐžŅŅваŅи `Body`-ĐŋĐžĐģŅ, ŅĐēŅ ĐžŅŅĐēŅŅŅĐĩ ĐžŅŅиĐŧаŅи Ņ ŅĐžŅĐŧаŅŅ JSON, ĐžŅĐēŅĐģŅĐēи СаĐŋĐ¸Ņ ĐŧаŅиĐŧĐĩ ŅŅĐģĐž, СаĐēОдОваĐŊĐĩ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ `multipart/form-data`, а ĐŊĐĩ `application/json`.
+
+ĐĻĐĩ ĐŊĐĩ ОйĐŧĐĩĐļĐĩĐŊĐŊŅ **FastAPI**, а ŅаŅŅиĐŊа ĐŋŅĐžŅĐžĐēĐžĐģŅ HTTP.
+
+///
+
+## ĐŅĐ´ŅŅĐŧĐžĐē
+
+ĐиĐēĐžŅиŅŅОвŅĐšŅĐĩ `File` Ņа `Form` ŅаСОĐŧ, ĐēĐžĐģи ваĐŧ ĐŋĐžŅŅŅĐąĐŊĐž ĐžŅŅиĐŧŅваŅи даĐŊŅ ŅĐžŅĐŧи Ņа ŅаКĐģи в ОдĐŊĐžĐŧŅ ĐˇĐ°ĐŋиŅŅ.
diff --git a/docs/uk/docs/tutorial/request-forms.md b/docs/uk/docs/tutorial/request-forms.md
new file mode 100644
index 000000000..10c58a73e
--- /dev/null
+++ b/docs/uk/docs/tutorial/request-forms.md
@@ -0,0 +1,73 @@
+# ĐаĐŊŅ ŅĐžŅĐŧи
+
+Đ¯ĐēŅĐž ĐаĐŧ ĐŋĐžŅŅŅĐąĐŊĐž ĐžŅŅиĐŧŅваŅи ĐŋĐžĐģŅ ŅĐžŅĐŧи СаĐŧŅŅŅŅ JSON, Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи `Form`.
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+ЊОй виĐēĐžŅиŅŅОвŅваŅи ŅĐžŅĐŧи, ŅĐŋĐžŅаŅĐēŅ Đ˛ŅŅаĐŊОвŅŅŅ `python-multipart` .
+
+ĐĐĩŅĐĩĐēĐžĐŊаКŅĐĩŅŅ, ŅĐž Đи ŅŅвОŅиĐģи [вŅŅŅŅаĐģŅĐŊĐĩ ŅĐĩŅĐĩдОвиŅĐĩ](../virtual-environments.md){.internal-link target=_blank}, аĐēŅивŅваĐģи ĐšĐžĐŗĐž, Ņ ĐŋĐžŅŅĐŧ вŅŅаĐŊОвиĐģи ĐąŅĐąĐģŅĐžŅĐĩĐēŅ, ĐŊаĐŋŅиĐēĐģад:
+
+```console
+$ pip install python-multipart
+```
+
+///
+
+## ĐĐŧĐŋĐžŅŅ `Form`
+
+ĐĐŧĐŋĐžŅŅŅĐšŅĐĩ `Form` С `fastapi`:
+
+{* ../../docs_src/request_forms/tutorial001_an_py39.py hl[3] *}
+
+## ĐĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ ĐŋаŅаĐŧĐĩŅŅŅв `Form`
+
+ĐĄŅвОŅŅĐšŅĐĩ ĐŋаŅаĐŧĐĩŅŅи ŅĐžŅĐŧи ŅаĐē ŅаĐŧĐž ŅĐē Đи Đą ŅŅвОŅŅваĐģи `Body` айО `Query`:
+
+{* ../../docs_src/request_forms/tutorial001_an_py39.py hl[9] *}
+
+ĐаĐŋŅиĐēĐģад, ОдиĐŊ ĐˇŅ ŅĐŋĐžŅОйŅв виĐēĐžŅиŅŅаĐŊĐŊŅ ŅĐŋĐĩŅиŅŅĐēаŅŅŅ OAuth2 (ŅаĐē СваĐŊиК "password flow") виĐŧĐ°ĐŗĐ°Ņ ĐŊадŅиĐģаŅи `username` Ņа `password` ŅĐē ĐŋĐžĐģŅ ŅĐžŅĐŧи.
+
+spec виĐŧĐ°ĐŗĐ°Ņ, ŅОй ŅŅ ĐŋĐžĐģŅ ĐŧаĐģи ŅĐžŅĐŊŅ ĐŊаСви `username` Ņ `password` Ņа ĐŊадŅиĐģаĐģиŅŅ Ņ Đ˛Đ¸ĐŗĐģŅĐ´Ņ ĐŋĐžĐģŅв ŅĐžŅĐŧи, а ĐŊĐĩ JSON.
+
+Đ `Form` Đи ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅŅваŅи ŅŅ Đļ ĐēĐžĐŊŅŅĐŗŅŅаŅŅŅ, ŅĐž Ņ Đˇ `Body` (Ņа `Query`, `Path`, `Cookie`), вĐēĐģŅŅаŅŅи ваĐģŅдаŅŅŅ, ĐŋŅиĐēĐģади, ĐŋŅĐĩвдОĐŊŅĐŧи (ĐŊаĐŋŅиĐēĐģад, `user-name` СаĐŧŅŅŅŅ `username`) ŅĐžŅĐž.
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+`Form` â ŅĐĩ ĐēĐģаŅ, ŅĐēиК ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž ĐŊаŅĐģŅĐ´ŅŅŅŅŅŅ Đ˛ŅĐ´ `Body`.
+
+///
+
+/// tip | ĐĐžŅада
+
+ЊОй ĐžĐŗĐžĐģĐžŅиŅи ŅŅĐģĐž ŅĐžŅĐŧи, ĐŋĐžŅŅŅĐąĐŊĐž ŅвĐŊĐž виĐēĐžŅиŅŅОвŅваŅи `Form`, ĐžŅĐēŅĐģŅĐēи ĐąĐĩС ĐŊŅĐžĐŗĐž ĐŋаŅаĐŧĐĩŅŅи ĐąŅĐ´ŅŅŅ ŅĐŊŅĐĩŅĐŋŅĐĩŅŅваŅиŅŅ ŅĐē ĐŋаŅаĐŧĐĩŅŅи СаĐŋиŅŅ Đ°ĐąĐž ŅŅĐģа (JSON).
+
+///
+
+## ĐŅĐž "ĐŋĐžĐģŅ ŅĐžŅĐŧи"
+
+HTML-ŅĐžŅĐŧи (``) ĐŊадŅиĐģаŅŅŅ Đ´Đ°ĐŊŅ ĐŊа ŅĐĩŅвĐĩŅ Ņ "ŅĐŋĐĩŅŅаĐģŅĐŊĐžĐŧŅ" ĐēОдŅваĐŊĐŊŅ, ŅĐēĐĩ вŅĐ´ŅŅСĐŊŅŅŅŅŅŅ Đ˛ŅĐ´ JSON.
+
+**FastAPI** ĐŋĐžĐ´ĐąĐ°Ņ ĐŋŅĐž ŅĐĩ, ŅОй СŅиŅаŅи ŅŅ Đ´Đ°ĐŊŅ Đˇ ĐŋŅавиĐģŅĐŊĐžĐŗĐž ĐŧŅŅŅŅ, а ĐŊĐĩ С JSON.
+
+/// note | ĐĸĐĩŅ
ĐŊŅŅĐŊŅ Đ´ĐĩŅаĐģŅ
+
+ĐаĐŊŅ Đˇ ŅĐžŅĐŧ СаСвиŅаК ĐēОдŅŅŅŅŅŅ ĐˇĐ° Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ "ŅиĐŋŅ ĐŧĐĩĐ´Ņа" `application/x-www-form-urlencoded`.
+
+ĐĐģĐĩ ŅĐēŅĐž ŅĐžŅĐŧа ĐŧŅŅŅиŅŅ ŅаКĐģи, вОĐŊа ĐēОдŅŅŅŅŅŅ ŅĐē `multipart/form-data`. Đи Đ´ŅСĐŊаŅŅĐĩŅŅ ĐŋŅĐž ОйŅОйĐēŅ ŅаКĐģŅв Ņ ĐŊаŅŅŅĐŋĐŊĐžĐŧŅ ŅОСдŅĐģŅ.
+
+Đ¯ĐēŅĐž Đи Ņ
ĐžŅĐĩŅĐĩ Đ´ŅСĐŊаŅиŅŅ ĐąŅĐģŅŅĐĩ ĐŋŅĐž ŅŅ ĐēОдŅваĐŊĐŊŅ Ņа ĐŋĐžĐģŅ ŅĐžŅĐŧ, СвĐĩŅĐŊŅŅŅŅŅ Đ´Đž MDN вĐĩйдОĐēŅĐŧĐĩĐŊŅаŅŅŅ Đ´ĐģŅ POST
.
+
+///
+
+/// warning | ĐĐžĐŋĐĩŅĐĩĐ´ĐļĐĩĐŊĐŊŅ
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅиŅи ĐēŅĐģŅĐēа ĐŋаŅаĐŧĐĩŅŅŅв `Form` в *ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ*, аĐģĐĩ ĐŊĐĩ ĐŧĐžĐļĐĩŅĐĩ ОдĐŊĐžŅаŅĐŊĐž ĐžĐŗĐžĐģĐžŅиŅи ĐŋĐžĐģŅ `Body`, ŅĐēŅ Đи ĐžŅŅĐēŅŅŅĐĩ ĐžŅŅиĐŧаŅи Ņ ŅĐžŅĐŧаŅŅ JSON, ĐžŅĐēŅĐģŅĐēи ŅŅĐģĐž СаĐŋиŅŅ ĐąŅĐ´Đĩ СаĐēОдОваĐŊĐž Ņ ŅĐžŅĐŧаŅŅ `application/x-www-form-urlencoded`, а ĐŊĐĩ `application/json`.
+
+ĐĻĐĩ ĐŊĐĩ ОйĐŧĐĩĐļĐĩĐŊĐŊŅ **FastAPI**, а ŅаŅŅиĐŊа HTTP-ĐŋŅĐžŅĐžĐēĐžĐģŅ.
+
+///
+
+## ĐŅĐ´ŅŅĐŧĐžĐē
+
+ĐиĐēĐžŅиŅŅОвŅĐšŅĐĩ `Form` Đ´ĐģŅ ĐžĐŗĐžĐģĐžŅĐĩĐŊĐŊŅ Đ˛Ņ
ŅĐ´ĐŊиŅ
ĐŋаŅаĐŧĐĩŅŅŅв Ņ Đ˛Đ¸ĐŗĐģŅĐ´Ņ Đ´Đ°ĐŊиŅ
ŅĐžŅĐŧи.
diff --git a/docs/uk/docs/tutorial/response-model.md b/docs/uk/docs/tutorial/response-model.md
new file mode 100644
index 000000000..def1f8a2d
--- /dev/null
+++ b/docs/uk/docs/tutorial/response-model.md
@@ -0,0 +1,358 @@
+# ĐОдĐĩĐģŅ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ â ĐĸиĐŋ, ŅĐž ĐŋОвĐĩŅŅаŅŅŅŅŅ
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅиŅи ŅиĐŋ, ŅĐēиК виĐēĐžŅиŅŅОвŅваŅиĐŧĐĩŅŅŅŅ Ņ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ, Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ *аĐŊĐžŅаŅŅŅ ŅиĐŋŅ, ŅĐž ĐŋОвĐĩŅŅаŅŅŅŅŅ* *ŅŅĐŊĐēŅŅŅŅ ĐžĐŋĐĩŅаŅŅŅŅ ŅĐģŅŅ
Ņ* (path operation)
+
+**ĐĐŊĐžŅаŅŅŅ ŅиĐŋŅ** ĐŧĐžĐļĐŊа вĐēаСаŅи ŅаĐē ŅаĐŧĐž ŅĐē Ņ Đ´ĐģŅ Đ˛Ņ
ŅĐ´ĐŊиŅ
**ĐŋаŅаĐŧĐĩŅŅŅв** ŅŅĐŊĐēŅŅŅ: ŅĐĩ ĐŧĐžĐļŅŅŅ ĐąŅŅи ĐŧОдĐĩĐģŅ Pydantic, ŅĐŋиŅĐēи (lists), ŅĐģОвĐŊиĐēи (dictionaries), ŅĐēаĐģŅŅĐŊŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ, ŅĐē-ĐžŅ ŅŅĐģŅ ŅиŅĐģа (integers), ĐąŅĐģĐĩĐ˛Ņ ĐˇĐŊаŅĐĩĐŊĐŊŅ (booleans) ŅĐžŅĐž.
+
+{* ../../docs_src/response_model/tutorial001_01_py310.py hl[16,21] *}
+
+FastAPI виĐēĐžŅиŅŅОвŅваŅиĐŧĐĩ ŅĐĩĐš ŅиĐŋ, ŅОй:
+
+* **ĐĐĩŅĐĩвŅŅиŅи ĐŋŅавиĐģŅĐŊŅŅŅŅ** ĐŋОвĐĩŅĐŊĐĩĐŊиŅ
даĐŊиŅ
.
+ * Đ¯ĐēŅĐž даĐŊŅ ĐŊĐĩ ваĐģŅĐ´ĐŊŅ (ĐŊаĐŋŅиĐēĐģад, вŅĐ´ŅŅŅĐŊŅ ĐŋĐžĐģĐĩ), ŅĐĩ ОСĐŊаŅаŅ, ŅĐž ĐĐ°Ņ ĐēОд дОдаŅĐēŅ ĐŋŅаŅŅŅ ĐŊĐĩĐēĐžŅĐĩĐēŅĐŊĐž Ņ ĐŊĐĩ ĐŋОвĐĩŅŅĐ°Ņ ŅĐĩ, ŅĐž ĐŋОвиĐŊĐĩĐŊ. ĐŖ ŅаĐēĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ FastAPI ĐŋОвĐĩŅĐŊĐĩ ĐŋĐžĐŧиĐģĐēŅ ŅĐĩŅвĐĩŅа, СаĐŧŅŅŅŅ ŅĐžĐŗĐž ŅОй вŅддаŅи ĐŊĐĩĐ´ĐžĐŋŅŅŅиĐŧŅ Đ´Đ°ĐŊŅ. ĐĸаĐē Đи Ņа ĐаŅŅ ĐēĐģŅŅĐŊŅи ĐąŅĐ´ĐĩŅĐĩ вĐŋĐĩвĐŊĐĩĐŊŅ, ŅĐž ĐžŅŅиĐŧŅŅŅĐĩ ĐžŅŅĐēŅваĐŊŅ Đ´Đ°ĐŊŅ Ņ ĐŋŅавиĐģŅĐŊĐžĐŧŅ ŅĐžŅĐŧаŅŅ.
+
+* ĐОдаŅи **JSON Schema** вŅĐ´ĐŋОвŅĐ´Ņ Đ´Đž ŅĐŋĐĩŅиŅŅĐēаŅŅŅ OpenAPI в *ĐžĐŋĐĩŅаŅŅŅŅ
ŅĐģŅŅ
Ņ*.
+ * ĐĻĐĩ ĐąŅĐ´Đĩ виĐēĐžŅиŅŅаĐŊĐž в **авŅĐžĐŧаŅиŅĐŊŅĐš Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ**.
+ * Đ ŅаĐēĐžĐļ ŅĐŊŅŅŅŅĐŧĐĩĐŊŅаĐŧи, ŅĐēŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐŊĐž ĐŗĐĩĐŊĐĩŅŅŅŅŅ ĐēĐģŅŅĐŊŅŅŅĐēиК ĐēОд.
+
+ĐĐģĐĩ ĐŊĐ°ĐšĐŗĐžĐģОвĐŊŅŅĐĩ:
+
+* FastAPI **ОйĐŧĐĩĐļиŅŅ Ņа вŅĐ´ŅŅĐģŅŅŅŅŅ** виŅ
ŅĐ´ĐŊŅ Đ´Đ°ĐŊŅ Đ˛ŅĐ´ĐŋОвŅĐ´ĐŊĐž Đ´Đž ŅиĐŋŅ, вĐēаСаĐŊĐžĐŗĐž Ņ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ.
+ * ĐĻĐĩ ĐžŅОйĐģивО ваĐļĐģивО Đ´ĐģŅ **ĐąĐĩСĐŋĐĩĐēи**. ĐĐĩŅаĐģŅ ĐŊиĐļŅĐĩ.
+
+## ĐаŅаĐŧĐĩŅŅ `response_model`
+
+ĐĐŊĐžĐ´Ņ ĐаĐŧ ĐŋĐžŅŅŅĐąĐŊĐž айО СŅŅŅĐŊĐž ĐŋОвĐĩŅŅаŅи ŅĐŊŅŅ ŅиĐŋи даĐŊиŅ
, ĐŊŅĐļ ŅŅ, ŅĐž СаСĐŊаŅĐĩĐŊŅ ŅĐē ŅиĐŋ вŅĐ´ĐŋОвŅĐ´Ņ.
+
+ĐаĐŋŅиĐēĐģад, Đи ĐŧĐžĐļĐĩŅĐĩ **ĐŋОвĐĩŅŅаŅи ŅĐģОвĐŊиĐē** айО ОйâŅĐēŅ ĐąĐ°ĐˇĐ¸ даĐŊиŅ
, аĐģĐĩ **ĐžĐŗĐžĐģĐžŅиŅи ĐŧОдĐĩĐģŅ Pydantic** ŅĐē ĐŧОдĐĩĐģŅ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ. ĐĸĐžĐ´Ņ ĐŧОдĐĩĐģŅ Pydantic авŅĐžĐŧаŅиŅĐŊĐž ОйŅОйĐģŅŅиĐŧĐĩ ваĐģŅдаŅŅŅ, Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ ŅĐžŅĐž.
+
+Đ¯ĐēŅĐž Đи дОдаŅŅĐĩ аĐŊĐžŅаŅŅŅ ŅиĐŋŅ Đ´ĐģŅ ĐŋОвĐĩŅĐŊĐĩĐŊĐŊŅ, ŅĐĩдаĐēŅĐžŅ ĐēĐžĐ´Ņ Đ°ĐąĐž mypy ĐŧĐžĐļŅŅŅ ĐŋĐžŅĐēаŅĐļиŅиŅŅ, ŅĐž ŅŅĐŊĐēŅŅŅ ĐŋОвĐĩŅŅĐ°Ņ ŅĐŊŅиК ŅиĐŋ (ĐŊаĐŋŅиĐēĐģад, dict СаĐŧŅŅŅŅ Item).
+
+ĐŖ ŅаĐēиŅ
виĐŋадĐēаŅ
ĐŧĐžĐļĐŊа ŅĐēĐžŅиŅŅаŅиŅŅ ĐŋаŅаĐŧĐĩŅŅĐžĐŧ `response_model` в Đ´ĐĩĐēĐžŅаŅĐžŅŅ ĐŧаŅŅŅŅŅŅ (ĐŊаĐŋŅиĐēĐģад, @app.get()).
+
+ĐаŅаĐŧĐĩŅŅ `response_model` ĐŋŅаŅŅŅ Đˇ ĐąŅĐ´Ņ-ŅĐēиĐŧ *ĐžĐŋĐĩŅаŅĐžŅĐžĐŧ ŅĐģŅŅ
Ņ*:
+
+* `@app.get()`
+* `@app.post()`
+* `@app.put()`
+* `@app.delete()`
+* ŅĐžŅĐž.
+
+{* ../../docs_src/response_model/tutorial001_py310.py hl[17,22,24:27] *}
+
+/// note | ĐŅиĐŧŅŅĐēа
+
+ĐвĐĩŅĐŊŅŅŅ ŅĐ˛Đ°ĐŗŅ, ŅĐž `response_model` Ņ ĐŋаŅаĐŧĐĩŅŅĐžĐŧ ĐŧĐĩŅОдŅ-Đ´ĐĩĐēĐžŅаŅĐžŅа (`get`, `post`, ŅĐžŅĐž), а ĐŊĐĩ *ŅŅĐŊĐēŅŅŅŅ ĐžĐŋĐĩŅаŅŅŅŅ ŅĐģŅŅ
Ņ* (path operation function), ŅĐē ŅĐĩ ŅОйиŅŅŅŅ Đˇ ĐŋаŅаĐŧĐĩŅŅаĐŧи айО ŅŅĐģĐžĐŧ СаĐŋиŅŅ.
+
+///
+
+`response_model` ĐŋŅиКĐŧĐ°Ņ ŅаĐēиК ŅаĐŧиК ŅиĐŋ, ŅĐēиК Đи Đą вĐēаСаĐģи Đ´ĐģŅ ĐŋĐžĐģŅ ĐŧОдĐĩĐģŅ Pydantic. ĐĸОйŅĐž ŅĐĩ ĐŧĐžĐļĐĩ ĐąŅŅи ŅĐē Pydantic-ĐŧОдĐĩĐģŅ, ŅаĐē Ņ, ĐŊаĐŋŅиĐēĐģад, `list` ŅС ĐŧОдĐĩĐģĐĩĐš Pydantic â `List[Item]`.
+
+FastAPI виĐēĐžŅиŅŅОвŅваŅиĐŧĐĩ `response_model` Đ´ĐģŅ ŅŅвОŅĐĩĐŊĐŊŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ, ваĐģŅдаŅŅŅ Đ´Đ°ĐŊиŅ
Ņа â ĐŊаКваĐļĐģивŅŅĐĩ â **ĐŋĐĩŅĐĩŅвОŅĐĩĐŊĐŊŅ Ņа ŅŅĐģŅŅŅаŅŅŅ Đ˛Đ¸Ņ
ŅĐ´ĐŊиŅ
даĐŊиŅ
** ĐˇĐŗŅĐ´ĐŊĐž С ĐžĐŗĐžĐģĐžŅĐĩĐŊиĐŧ ŅиĐŋĐžĐŧ.
+
+/// tip | ĐĐžŅада
+
+Đ¯ĐēŅĐž Ņ ĐĐ°Ņ ŅвŅĐŧĐēĐŊĐĩĐŊĐž ŅŅвОŅŅ ĐŋĐĩŅĐĩвŅŅĐēŅ ŅиĐŋŅв Ņ ŅĐĩдаĐēŅĐžŅŅ, mypy ŅĐžŅĐž, Đи ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅиŅи ŅиĐŋ ĐŋОвĐĩŅĐŊĐĩĐŊĐŊŅ ŅŅĐŊĐēŅŅŅ ŅĐē `Any`.
+
+ĐĸаĐēиĐŧ ŅиĐŊĐžĐŧ, Đи ĐŋОвŅĐ´ĐžĐŧĐģŅŅŅĐĩ ŅĐĩдаĐēŅĐžŅŅ, ŅĐž ŅвŅĐ´ĐžĐŧĐž ĐŋОвĐĩŅŅаŅŅĐĩ ĐąŅĐ´Ņ-ŅĐž. ĐĐģĐĩ FastAPI ŅŅĐĩ ОдĐŊĐž виĐēĐžĐŊŅваŅиĐŧĐĩ ŅŅвОŅĐĩĐŊĐŊŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ, ваĐģŅдаŅŅŅ, ŅŅĐģŅŅŅаŅŅŅ ŅĐžŅĐž Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ ĐŋаŅаĐŧĐĩŅŅа `response_model`.
+
+///
+
+### ĐŅŅĐžŅиŅĐĩŅ `response_model`
+
+Đ¯ĐēŅĐž Đи вĐēаСŅŅŅĐĩ Ņ ŅиĐŋ ĐŋОвĐĩŅĐŊĐĩĐŊĐŊŅ, Ņ `response_model`, ŅĐž FastAPI виĐēĐžŅиŅŅОвŅваŅиĐŧĐĩ `response_model` С ĐŋŅŅĐžŅиŅĐĩŅĐžĐŧ.
+
+ĐĸаĐēиĐŧ ŅиĐŊĐžĐŧ, Đи ĐŧĐžĐļĐĩŅĐĩ дОдаŅи ĐŋŅавиĐģŅĐŊŅ Đ°ĐŊĐžŅаŅŅŅ ŅиĐŋŅв Đ´Đž ваŅиŅ
ŅŅĐŊĐēŅŅĐš, ĐŊавŅŅŅ ŅĐēŅĐž вОĐŊи ĐŋОвĐĩŅŅаŅŅŅ ŅиĐŋ, вŅĐ´ĐŧŅĐŊĐŊиК вŅĐ´ `response_model`. ĐĻĐĩ ĐąŅĐ´Đĩ ĐēĐžŅиŅĐŊĐž Đ´ĐģŅ ŅĐĩдаĐēŅĐžŅŅв ĐēĐžĐ´Ņ Ņа ŅĐŊŅŅŅŅĐŧĐĩĐŊŅŅв, ŅаĐēиŅ
ŅĐē mypy. Đ ĐŋŅи ŅŅĐžĐŧŅ FastAPI ĐŋŅОдОвĐļиŅŅ Đ˛Đ¸ĐēĐžĐŊŅваŅи ваĐģŅдаŅŅŅ Đ´Đ°ĐŊиŅ
, ĐŗĐĩĐŊĐĩŅŅваŅи Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ ŅĐžŅĐž ĐŊа ĐžŅĐŊĐžĐ˛Ņ `response_model`.
+
+Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅаŅи `response_model=None`, ŅОй виĐŧĐēĐŊŅŅи ŅŅвОŅĐĩĐŊĐŊŅ ĐŧОдĐĩĐģŅ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ Đ´ĐģŅ ŅŅŅŅ *ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ*. ĐĻĐĩ ĐŧĐžĐļĐĩ СĐŊадОйиŅиŅŅ, ŅĐēŅĐž Đи дОдаŅŅĐĩ аĐŊĐžŅаŅŅŅ ŅиĐŋŅв Đ´Đž Ой'ŅĐēŅŅв, ŅĐēŅ ĐŊĐĩ Ņ Đ´ĐžĐŋŅŅŅиĐŧиĐŧи ĐŋĐžĐģŅĐŧи Pydantic â ĐŋŅиĐēĐģад ŅŅĐžĐŗĐž Đи ĐŋОйаŅиŅĐĩ в ОдĐŊĐžĐŧŅ Đˇ ĐŊаŅŅŅĐŋĐŊиŅ
ŅОСдŅĐģŅв.
+
+## ĐОвĐĩŅĐŊŅŅи ŅŅ ŅаĐŧŅ Đ˛Ņ
ŅĐ´ĐŊŅ Đ´Đ°ĐŊŅ
+
+ĐĸŅŅ Đŧи ĐžĐŗĐžĐģĐžŅŅŅĐŧĐž ĐŧОдĐĩĐģŅ `UserIn`, ŅĐēа ĐŧŅŅŅиŅŅ ĐˇĐ˛Đ¸ŅаКĐŊиК ŅĐĩĐēŅŅОвиК ĐŋаŅĐžĐģŅ:
+
+{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+ЊОй виĐēĐžŅиŅŅОвŅваŅи `EmailStr`, ŅĐŋĐžŅаŅĐēŅ Đ˛ŅŅаĐŊОвŅŅŅ `email-validator` .
+
+ĐĐĩŅĐĩĐēĐžĐŊаКŅĐĩŅŅ, ŅĐž Đи ŅŅвОŅиĐģи [вŅŅŅŅаĐģŅĐŊĐĩ ŅĐĩŅĐĩдОвиŅĐĩ](../virtual-environments.md){.internal-link target=_blank}, аĐēŅивŅваĐģи ĐšĐžĐŗĐž, а ĐŋĐžŅŅĐŧ вŅŅаĐŊОвиĐģи ĐŋаĐēĐĩŅ, ĐŊаĐŋŅиĐēĐģад:
+
+```console
+$ pip install email-validator
+```
+
+or with:
+
+```console
+$ pip install "pydantic[email]"
+```
+
+///
+
+Đ Đŧи виĐēĐžŅиŅŅОвŅŅĐŧĐž ŅŅ ĐŧОдĐĩĐģŅ, ŅОй ĐžĐŗĐžĐģĐžŅиŅи Ņ Đ˛Ņ
ŅĐ´ĐŊŅ, Ņ Đ˛Đ¸Ņ
ŅĐ´ĐŊŅ Đ´Đ°ĐŊŅ:
+
+{* ../../docs_src/response_model/tutorial002_py310.py hl[16] *}
+
+ĐĸĐĩĐŋĐĩŅ, ĐēĐžĐģи ĐąŅаŅСĐĩŅ ŅŅвОŅŅŅ ĐēĐžŅиŅŅŅваŅа С ĐŋаŅĐžĐģĐĩĐŧ, API ĐŋОвĐĩŅĐŊĐĩ ŅОК ŅаĐŧиК ĐŋаŅĐžĐģŅ Ņ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ.
+
+ĐŖ ŅŅĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ ŅĐĩ ĐŧĐžĐļĐĩ ĐŊĐĩ ĐąŅŅи ĐŋŅОйĐģĐĩĐŧĐžŅ, адĐļĐĩ ŅаĐŧĐĩ ĐēĐžŅиŅŅŅĐ˛Đ°Ņ ĐŊадŅŅĐģав ĐŋаŅĐžĐģŅ.
+
+ĐĐģĐĩ ŅĐēŅĐž Đŧи виĐēĐžŅиŅŅаŅĐŧĐž ŅŅ Đļ ĐŧОдĐĩĐģŅ Đ´ĐģŅ ŅĐŊŅĐžŅ ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ, Đŧи ĐŧĐžĐļĐĩĐŧĐž виĐŋадĐēОвО ĐŊадŅŅĐģаŅи ĐŋаŅĐžĐģŅ ĐŊаŅиŅ
ĐēĐžŅиŅŅŅваŅŅв ĐēĐžĐļĐŊĐžĐŧŅ ĐēĐģŅŅĐŊŅŅ.
+
+/// danger | ĐĐąĐĩŅĐĩĐļĐŊĐž
+
+ĐŅĐēĐžĐģи ĐŊĐĩ СйĐĩŅŅĐŗĐ°ĐšŅĐĩ ĐŋаŅĐžĐģŅ ĐēĐžŅиŅŅŅваŅа Ņ Đ˛ŅĐ´ĐēŅиŅĐžĐŧŅ Đ˛Đ¸ĐŗĐģŅĐ´Ņ Ņа ĐŊĐĩ ĐŊадŅиĐģаКŅĐĩ ĐšĐžĐŗĐž Ņ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ, ŅĐēŅĐž ŅŅĐģŅĐēи Đи ĐŊĐĩ СĐŊаŅŅĐĩ вŅŅ ŅиСиĐēи Ņ ŅĐžŅĐŊĐž ŅОСŅĐŧŅŅŅĐĩ, ŅĐž ŅОйиŅĐĩ.
+
+///
+
+## ĐОдаКŅĐĩ ĐžĐēŅĐĩĐŧŅ Đ˛Đ¸Ņ
ŅĐ´ĐŊŅ ĐŧОдĐĩĐģŅ
+
+ĐаĐŧŅŅŅŅ ŅŅĐžĐŗĐž Đŧи ĐŧĐžĐļĐĩĐŧĐž ŅŅвОŅиŅи вŅ
ŅĐ´ĐŊŅ ĐŧОдĐĩĐģŅ Đˇ вŅĐ´ĐēŅиŅиĐŧ ĐŋаŅĐžĐģĐĩĐŧ Ņ Đ˛Đ¸Ņ
ŅĐ´ĐŊŅ ĐŧОдĐĩĐģŅ ĐąĐĩС ĐŊŅĐžĐŗĐž:
+
+{* ../../docs_src/response_model/tutorial003_py310.py hl[9,11,16] *}
+
+ĐĸŅŅ, ĐŊавŅŅŅ ŅĐēŅĐž *ŅŅĐŊĐēŅŅŅ ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ* ĐŋОвĐĩŅŅĐ°Ņ ĐžĐą'ŅĐēŅ ĐēĐžŅиŅŅŅваŅа, ŅĐēиК ĐŧŅŅŅиŅŅ ĐŋаŅĐžĐģŅ:
+
+{* ../../docs_src/response_model/tutorial003_py310.py hl[24] *}
+
+...Đŧи ĐžĐŗĐžĐģĐžŅиĐģи `response_model` ŅĐē ĐŊаŅŅ ĐŧОдĐĩĐģŅ `UserOut`, ŅĐēа ĐŊĐĩ ĐŧŅŅŅиŅŅ ĐŋаŅĐžĐģŅ:
+
+{* ../../docs_src/response_model/tutorial003_py310.py hl[22] *}
+
+ĐĸаĐēиĐŧ ŅиĐŊĐžĐŧ, **FastAPI** авŅĐžĐŧаŅиŅĐŊĐž вŅĐ´ŅŅĐģŅŅŅŅŅ Đ˛ŅŅ Đ´Đ°ĐŊŅ, ŅĐēŅ ĐŊĐĩ вĐēаСаĐŊŅ Ņ Đ˛Đ¸Ņ
ŅĐ´ĐŊŅĐš ĐŧОдĐĩĐģŅ (Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ Pydantic).
+
+### `response_model` айО ŅиĐŋ ĐŋОвĐĩŅĐŊĐĩĐŊĐŊŅ
+
+ĐŖ ŅŅĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ, ĐžŅĐēŅĐģŅĐēи Đ´Đ˛Ņ ĐŧОдĐĩĐģŅ ŅŅСĐŊŅ, ŅĐēŅĐž Đŧи аĐŊĐžŅŅŅĐŧĐž ŅиĐŋ ĐŋОвĐĩŅĐŊĐĩĐŊĐŊŅ ŅŅĐŊĐēŅŅŅ ŅĐē `UserOut`, ŅĐĩдаĐēŅĐžŅ Ņ ŅаĐēŅ ŅĐŊŅŅŅŅĐŧĐĩĐŊŅи, ŅĐē mypy, видадŅŅŅ ĐŋĐžĐŧиĐģĐēŅ, йО ŅаĐēŅиŅĐŊĐž Đŧи ĐŋОвĐĩŅŅаŅĐŧĐž ŅĐŊŅиК ŅиĐŋ.
+
+ĐĸĐžĐŧŅ Đ˛ ŅŅĐžĐŧŅ ĐŋŅиĐēĐģĐ°Đ´Ņ Đŧи виĐēĐžŅиŅŅОвŅŅĐŧĐž ĐŋаŅаĐŧĐĩŅŅ `response_model`, а ĐŊĐĩ аĐŊĐžŅаŅŅŅ ŅиĐŋŅ ĐŋОвĐĩŅĐŊĐĩĐŊĐŊŅ.
+
+...аĐģĐĩ ŅиŅаКŅĐĩ даĐģŅ, ŅОй Đ´ŅСĐŊаŅиŅŅ, ŅĐē ОйŅĐšŅи ŅĐĩ ОйĐŧĐĩĐļĐĩĐŊĐŊŅ.
+
+## ĐĸиĐŋ ĐŋОвĐĩŅĐŊĐĩĐŊĐŊŅ Ņ ŅŅĐģŅŅŅаŅŅŅ Đ´Đ°ĐŊиŅ
+
+ĐŅОдОвĐļиĐŧĐž С ĐŋĐžĐŋĐĩŅĐĩĐ´ĐŊŅĐžĐŗĐž ĐŋŅиĐēĐģадŅ. Đи Ņ
ĐžŅŅĐģи **аĐŊĐžŅŅваŅи ŅŅĐŊĐēŅŅŅ ĐžĐ´ĐŊиĐŧ ŅиĐŋĐžĐŧ**, аĐģĐĩ ĐŋŅи ŅŅĐžĐŧŅ ĐŋОвĐĩŅŅаŅи С ĐŊĐĩŅ ĐąŅĐģŅŅĐĩ даĐŊиŅ
.
+
+Đи Ņ
ĐžŅĐĩĐŧĐž, ŅОй FastAPI ĐŋŅОдОвĐļŅвав **ŅŅĐģŅŅŅŅваŅи** ŅŅ Đ´Đ°ĐŊŅ ĐˇĐ° Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ response_model. ĐĸОйŅĐž ĐŊавŅŅŅ ŅĐēŅĐž ŅŅĐŊĐēŅŅŅ ĐŋОвĐĩŅŅĐ°Ņ ĐąŅĐģŅŅĐĩ ŅĐŊŅĐžŅĐŧаŅŅŅ, Ņ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ ĐąŅĐ´ŅŅŅ ĐģиŅĐĩ ŅŅ ĐŋĐžĐģŅ, ŅĐēŅ Đ˛ĐēаСаĐŊŅ Ņ response_model.
+
+ĐŖ ĐŋĐžĐŋĐĩŅĐĩĐ´ĐŊŅĐžĐŧŅ ĐŋŅиĐēĐģадŅ, ĐžŅĐēŅĐģŅĐēи ĐēĐģаŅи ĐąŅĐģи ŅŅСĐŊŅ, ĐŊаĐŧ дОвĐĩĐģĐžŅŅ Đ˛Đ¸ĐēĐžŅиŅŅОвŅваŅи ĐŋаŅаĐŧĐĩŅŅ `response_model`. ĐĐģĐĩ ŅĐĩ ОСĐŊаŅаŅ, ŅĐž Đŧи ĐŊĐĩ ĐžŅŅиĐŧŅŅĐŧĐž ĐŋŅĐ´ŅŅиĐŧĐēи С йОĐēŅ ŅĐĩдаĐēŅĐžŅа ĐēĐžĐ´Ņ Ņа ŅĐŊŅŅŅŅĐŧĐĩĐŊŅŅв ĐŋĐĩŅĐĩвŅŅĐēи ŅиĐŋŅв ŅОдО ŅиĐŋŅ, ŅĐēиК ĐŋОвĐĩŅŅĐ°Ņ ŅŅĐŊĐēŅŅŅ.
+
+ĐŅĐžŅĐĩ в ĐąŅĐģŅŅĐžŅŅŅ Đ˛Đ¸ĐŋадĐēŅв, ĐēĐžĐģи ĐŊаĐŧ ĐŋĐžŅŅŅĐąĐŊĐž СŅОйиŅи ŅĐžŅŅ ĐŋОдŅĐąĐŊĐĩ, Đŧи ĐŋŅĐžŅŅĐž Ņ
ĐžŅĐĩĐŧĐž, ŅОй ĐŧОдĐĩĐģŅ **вŅĐ´ŅŅĐģŅŅŅŅваĐģа айО ĐŋŅийŅаĐģа** ŅаŅŅиĐŊŅ Đ´Đ°ĐŊиŅ
, ŅĐē Ņ ŅŅĐžĐŧŅ ĐŋŅиĐēĐģадŅ.
+
+ĐŖ ŅаĐēиŅ
виĐŋадĐēаŅ
Đŧи ĐŧĐžĐļĐĩĐŧĐž виĐēĐžŅиŅŅаŅи ĐēĐģаŅи Ņа ŅĐŋадĐēŅваĐŊĐŊŅ, ŅОй ŅĐēĐžŅиŅŅаŅиŅŅ **аĐŊĐžŅаŅŅŅĐŧи ŅиĐŋŅв** ŅŅĐŊĐēŅŅĐš â ŅĐĩ Đ´Đ°Ņ ĐēŅаŅŅ ĐŋŅĐ´ŅŅиĐŧĐēŅ Đˇ йОĐēŅ ŅĐĩдаĐēŅĐžŅа Ņа ŅĐŊŅŅŅŅĐŧĐĩĐŊŅŅв ŅиĐŋŅ mypy, Ņ ĐŋŅи ŅŅĐžĐŧŅ FastAPI ĐŋŅОдОвĐļŅŅ Đ˛Đ¸ĐēĐžĐŊŅваŅи **ŅŅĐģŅŅŅаŅŅŅ Đ´Đ°ĐŊиŅ
** Ņ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ.
+
+{* ../../docs_src/response_model/tutorial003_01_py310.py hl[7:10,13:14,18] *}
+
+ĐавдŅĐēи ŅŅĐžĐŧŅ Đŧи ĐžŅŅиĐŧŅŅĐŧĐž ĐŋŅĐ´ŅŅиĐŧĐēŅ ŅĐŊŅŅŅŅĐŧĐĩĐŊŅŅв â вŅĐ´ ŅĐĩдаĐēŅĐžŅŅв Ņ mypy, ĐžŅĐēŅĐģŅĐēи ŅĐĩĐš ĐēОд Ņ ĐēĐžŅĐĩĐēŅĐŊиĐŧ С ŅĐžŅĐēи СОŅŅ ŅиĐŋŅв, â аĐģĐĩ Đŧи ŅаĐēĐžĐļ ĐžŅŅиĐŧŅŅĐŧĐž ŅŅĐģŅŅŅаŅŅŅ Đ´Đ°ĐŊиŅ
вŅĐ´ FastAPI.
+
+Đ¯Đē ŅĐĩ ĐŋŅаŅŅŅ? ĐаваКŅĐĩ ŅОСйĐĩŅĐĩĐŧĐžŅŅ. đ¤
+
+### ĐĸиĐŋи Ņа ĐŋŅĐ´ŅŅиĐŧĐēа ŅĐŊŅŅŅŅĐŧĐĩĐŊŅŅв
+
+ĐĄĐŋĐĩŅŅŅ ĐŋОдивиĐŧĐžŅŅ, ŅĐē ŅĐĩ йаŅаŅŅ ŅĐĩдаĐēŅĐžŅи, mypy Ņа ŅĐŊŅŅ ŅĐŊŅŅŅŅĐŧĐĩĐŊŅи.
+
+`BaseUser` ĐŧĐ°Ņ ĐąĐ°ĐˇĐžĐ˛Ņ ĐŋĐžĐģŅ. ĐĐžŅŅĐŧ `UserIn` ŅŅĐŋадĐēОвŅŅ `BaseUser` Ņ Đ´ĐžĐ´Đ°Ņ ĐŋĐžĐģĐĩ `password`, ĐžŅĐļĐĩ, вŅĐŊ ĐŧаŅиĐŧĐĩ вŅŅ ĐŋĐžĐģŅ Đˇ ОйОŅ
ĐŧОдĐĩĐģĐĩĐš.
+
+Đи СаСĐŊаŅаŅĐŧĐž ŅиĐŋ ĐŋОвĐĩŅĐŊĐĩĐŊĐŊŅ ŅŅĐŊĐēŅŅŅ ŅĐē `BaseUser`, аĐģĐĩ ŅаĐēŅиŅĐŊĐž ĐŋОвĐĩŅŅаŅĐŧĐž ĐĩĐēСĐĩĐŧĐŋĐģŅŅ `UserIn`.
+
+Đ ĐĩдаĐēŅĐžŅ, mypy Ņа ŅĐŊŅŅ ŅĐŊŅŅŅŅĐŧĐĩĐŊŅи ĐŊĐĩ ŅĐēаŅĐļиŅиĐŧŅŅŅŅŅ ĐŊа ŅĐĩ, ŅĐžĐŧŅ ŅĐž С ŅĐžŅĐēи СОŅŅ ŅиĐŋŅСаŅŅŅ `UserIn` Ņ ĐŋŅĐ´ĐēĐģаŅĐžĐŧ `BaseUser`, а ŅĐĩ ОСĐŊаŅаŅ, ŅĐž вŅĐŊ Ņ `ваĐģŅĐ´ĐŊиĐŧ` ŅиĐŋĐžĐŧ, ĐēĐžĐģи ĐžŅŅĐēŅŅŅŅŅŅ ĐąŅĐ´Ņ-ŅĐž, ŅĐž Ņ `BaseUser`.
+
+### ФŅĐģŅŅŅаŅŅŅ Đ´Đ°ĐŊиŅ
Ņ FastAPI
+
+ĐĸĐĩĐŋĐĩŅ Đ´ĐģŅ FastAPI вŅĐŊ йаŅиŅŅ ŅиĐŋ ĐŋОвĐĩŅĐŊĐĩĐŊĐŊŅ Ņ ĐŋĐĩŅĐĩĐēĐžĐŊŅŅŅŅŅŅ, ŅĐž ŅĐĩ, ŅĐž Đи ĐŋОвĐĩŅŅаŅŅĐĩ, ĐŧŅŅŅиŅŅ **ŅŅĐģŅĐēи** ĐŋĐžĐģŅ, ŅĐēŅ ĐžĐŗĐžĐģĐžŅĐĩĐŊŅ Ņ ŅŅĐžĐŧŅ ŅиĐŋŅ.
+
+FastAPI виĐēĐžĐŊŅŅ ĐēŅĐģŅĐēа вĐŊŅŅŅŅŅĐŊŅŅ
ĐžĐŋĐĩŅаŅŅĐš С Pydantic, ŅОй ĐŗĐ°ŅаĐŊŅŅваŅи, ŅĐž ĐŋŅавиĐģа ĐŊаŅĐģŅĐ´ŅваĐŊĐŊŅ ĐēĐģаŅŅв ĐŊĐĩ СаŅŅĐžŅОвŅŅŅŅŅŅ Đ´ĐģŅ ŅŅĐģŅŅŅаŅŅŅ ĐŋОвĐĩŅĐŊĐĩĐŊиŅ
даĐŊиŅ
, ŅĐŊаĐēŅĐĩ Đи ĐŧĐžĐŗĐģи Đą ĐŋОвĐĩŅĐŊŅŅи СĐŊаŅĐŊĐž ĐąŅĐģŅŅĐĩ даĐŊиŅ
, ĐŊŅĐļ ĐžŅŅĐēŅваĐģи.
+
+ĐĸаĐēиĐŧ ŅиĐŊĐžĐŧ, Đи ĐžŅŅиĐŧŅŅŅĐĩ ĐŊаКĐēŅаŅĐĩ С двОŅ
ŅвŅŅŅв: аĐŊĐžŅаŅŅŅ ŅиĐŋŅв **С ĐŋŅĐ´ŅŅиĐŧĐēĐžŅ ŅĐŊŅŅŅŅĐŧĐĩĐŊŅŅв** Ņ **ŅŅĐģŅŅŅаŅŅŅ Đ´Đ°ĐŊиŅ
**.
+
+## ĐОдивиŅиŅŅ Ņ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ
+
+ĐĐžĐģи Đи дивиŅĐĩŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐŊŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ, Đи ĐŧĐžĐļĐĩŅĐĩ ĐŋОйаŅиŅи, ŅĐž вŅ
ŅĐ´ĐŊа ĐŧОдĐĩĐģŅ Ņ Đ˛Đ¸Ņ
ŅĐ´ĐŊа ĐŧОдĐĩĐģŅ ĐŧаŅŅŅ Đ˛ĐģаŅĐŊŅ JSON-ŅŅ
ĐĩĐŧŅ:
+
+
+
+Đ ĐžĐąĐ¸Đ´Đ˛Ņ ĐŧОдĐĩĐģŅ Đ˛Đ¸ĐēĐžŅиŅŅОвŅŅŅŅŅŅ Đ´ĐģŅ ŅĐŊŅĐĩŅаĐēŅивĐŊĐžŅ API-Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ:
+
+
+
+## ĐĐŊŅŅ Đ°ĐŊĐžŅаŅŅŅ ŅиĐŋŅв ĐŋОвĐĩŅĐŊĐĩĐŊĐŊŅ
+
+ĐŅĐŊŅŅŅŅ Đ˛Đ¸ĐŋадĐēи, ĐēĐžĐģи Đи ĐŋОвĐĩŅŅаŅŅĐĩ ŅĐžŅŅ, ŅĐž ĐŊĐĩ Ņ Đ´ĐžĐŋŅŅŅиĐŧиĐŧ ĐŋĐžĐģĐĩĐŧ Pydantic, аĐģĐĩ аĐŊĐžŅŅŅŅĐĩ ŅĐĩ Ņ ŅŅĐŊĐēŅŅŅ ĐģиŅĐĩ Đ´ĐģŅ ŅĐžĐŗĐž, ŅОй ĐžŅŅиĐŧаŅи ĐŋŅĐ´ŅŅиĐŧĐēŅ Đ˛ŅĐ´ ŅĐŊŅŅŅŅĐŧĐĩĐŊŅŅв (ŅĐĩдаĐēŅĐžŅа, mypy ŅĐžŅĐž).
+
+### ĐОвĐĩŅĐŊĐĩĐŊĐŊŅ Response ĐŊаĐŋŅŅĐŧŅ
+
+ĐаКĐŋĐžŅиŅĐĩĐŊŅŅиĐŧ виĐŋадĐēĐžĐŧ ĐąŅĐ´Đĩ [ĐŋОвĐĩŅĐŊĐĩĐŊĐŊŅ Response ĐŊаĐŋŅŅĐŧŅ, ŅĐē ĐŋĐžŅŅĐŊŅŅŅŅŅŅ ĐŋŅСĐŊŅŅĐĩ Ņ ŅОСŅиŅĐĩĐŊŅĐš Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ](../advanced/response-directly.md){.internal-link target=_blank}.
+
+{* ../../docs_src/response_model/tutorial003_02.py hl[8,10:11] *}
+
+ĐĻĐĩĐš ĐŋŅĐžŅŅиК виĐŋадОĐē авŅĐžĐŧаŅиŅĐŊĐž ОйŅОйĐģŅŅŅŅŅŅ FastAPI, ŅĐžĐŧŅ ŅĐž аĐŊĐžŅаŅŅŅ ŅиĐŋŅ ĐŋОвĐĩŅĐŊĐĩĐŊĐŊŅ â ŅĐĩ ĐēĐģĐ°Ņ (айО ĐŋŅĐ´ĐēĐģаŅ) `Response`.
+
+Đ ŅĐŊŅŅŅŅĐŧĐĩĐŊŅи ŅаĐēĐžĐļ ĐąŅĐ´ŅŅŅ ĐˇĐ°Đ´ĐžĐ˛ĐžĐģĐĩĐŊŅ, йО Ņ `RedirectResponse`, Ņ `JSONResponse` Ņ ĐŋŅĐ´ĐēĐģаŅаĐŧи `Response`, ĐžŅĐļĐĩ аĐŊĐžŅаŅŅŅ ŅиĐŋŅ ĐēĐžŅĐĩĐēŅĐŊа.
+
+### ĐĐŊĐžŅаŅŅŅ ĐŋŅĐ´ĐēĐģаŅŅ Response
+
+ĐĸаĐēĐžĐļ ĐŧĐžĐļĐŊа виĐēĐžŅиŅŅОвŅваŅи ĐŋŅĐ´ĐēĐģĐ°Ņ `Response` Ņ Đ°ĐŊĐžŅаŅŅŅ ŅиĐŋŅ:
+
+{* ../../docs_src/response_model/tutorial003_03.py hl[8:9] *}
+
+ĐĻĐĩ ŅĐĩĐļ ĐŋŅаŅŅваŅиĐŧĐĩ, йО `RedirectResponse` â ĐŋŅĐ´ĐēĐģĐ°Ņ `Response`, Ņ FastAPI авŅĐžĐŧаŅиŅĐŊĐž ОйŅОйиŅŅ ŅĐĩĐš ĐŋŅĐžŅŅиК виĐŋадОĐē.
+
+### ĐĐĩĐēĐžŅĐĩĐēŅĐŊŅ Đ°ĐŊĐžŅаŅŅŅ ŅиĐŋŅ ĐŋОвĐĩŅĐŊĐĩĐŊĐŊŅ
+
+ĐĐģĐĩ ĐēĐžĐģи Đи ĐŋОвĐĩŅŅаŅŅĐĩ ŅĐēиКŅŅ ŅĐŊŅиК дОвŅĐģŅĐŊиК ОйâŅĐēŅ, ŅĐž ĐŊĐĩ Ņ Đ˛Đ°ĐģŅĐ´ĐŊиĐŧ ŅиĐŋĐžĐŧ Pydantic (ĐŊаĐŋŅиĐēĐģад, ОйâŅĐēŅ ĐąĐ°ĐˇĐ¸ даĐŊиŅ
), Ņ Đ°ĐŊĐžŅŅŅŅĐĩ ĐšĐžĐŗĐž ŅаĐē Ņ ŅŅĐŊĐēŅŅŅ, FastAPI ŅĐŋŅОйŅŅ ŅŅвОŅиŅи Pydantic ĐŧОдĐĩĐģŅ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ ĐŊа ĐžŅĐŊĐžĐ˛Ņ ŅŅŅŅ Đ°ĐŊĐžŅаŅŅŅ ŅиĐŋŅ, Ņ ŅĐĩ СавĐĩŅŅиŅŅŅŅ ĐŋĐžĐŧиĐģĐēĐžŅ.
+
+ĐĸĐĩ ŅаĐŧĐĩ ŅŅаĐŊĐĩŅŅŅŅ, ŅĐēŅĐž Đи виĐēĐžŅиŅŅОвŅŅŅĐĩ union ĐŧŅĐļ ŅŅСĐŊиĐŧи ŅиĐŋаĐŧи, Đ´Đĩ ОдиĐŊ айО ĐąŅĐģŅŅĐĩ ĐŊĐĩ Ņ Đ˛Đ°ĐģŅĐ´ĐŊиĐŧи ŅиĐŋаĐŧи Pydantic, ĐŊаĐŋŅиĐēĐģад, ŅĐĩ ŅĐŋŅиŅиĐŊиŅŅ ĐŋĐžĐŧиĐģĐēŅ đĨ:
+
+{* ../../docs_src/response_model/tutorial003_04_py310.py hl[8] *}
+
+...ŅĐĩ ĐŊĐĩ ĐŋŅаŅŅŅ, ŅĐžĐŧŅ ŅĐž ŅиĐŋ аĐŊĐžŅаŅŅŅ ĐŊĐĩ Ņ ŅиĐŋĐžĐŧ Pydantic Ņ ĐŊĐĩ Ņ ĐŋŅĐžŅŅĐž ĐēĐģаŅĐžĐŧ `Response` айО ĐšĐžĐŗĐž ĐŋŅĐ´ĐēĐģаŅĐžĐŧ, а Ņ ĐžĐąâŅĐ´ĐŊаĐŊĐŊŅĐŧ (union) â айО `Response`, айО `dict`.
+
+### ĐŅĐ´ĐēĐģŅŅĐĩĐŊĐŊŅ ĐОдĐĩĐģŅ ĐŅĐ´ĐŋОвŅĐ´Ņ
+
+ĐŅОдОвĐļŅŅŅи ĐŋŅиĐēĐģад виŅĐĩ, ĐŧĐžĐļĐģивО, Đи ĐŊĐĩ Ņ
ĐžŅĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи ŅŅаĐŊдаŅŅĐŊŅ Đ˛Đ°ĐģŅдаŅŅŅ Đ´Đ°ĐŊиŅ
, авŅĐžĐŧаŅиŅĐŊŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ, ŅŅĐģŅŅŅаŅŅŅ ŅĐžŅĐž, ŅĐēŅ FastAPI виĐēĐžĐŊŅŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ.
+
+ĐĐģĐĩ ви вŅĐĩ ОдĐŊĐž ĐŧĐžĐļĐĩŅĐĩ СаĐģиŅиŅи аĐŊĐžŅаŅŅŅ ŅиĐŋŅ Ņ ŅŅĐŊĐēŅŅŅ, ŅОй СйĐĩŅĐĩĐŗŅи ĐŋŅĐ´ŅŅиĐŧĐēŅ Đˇ йОĐēŅ ŅĐŊŅŅŅŅĐŧĐĩĐŊŅŅв, ŅаĐēиŅ
ŅĐē ŅĐĩдаĐēŅĐžŅи ĐēĐžĐ´Ņ Đ°ĐąĐž ŅŅаŅиŅĐŊŅ ĐŋĐĩŅĐĩвŅŅĐēи ŅиĐŋŅв (ĐŊаĐŋŅиĐēĐģад, mypy).
+
+ĐŖ ŅаĐēĐžĐŧŅ Đ˛Đ¸ĐŋадĐēŅ Đ˛Đ¸ ĐŧĐžĐļĐĩŅĐĩ виĐŧĐēĐŊŅŅи ĐŗĐĩĐŊĐĩŅаŅŅŅ ĐŧОдĐĩĐģŅ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ, вŅŅаĐŊОвивŅи `response_model=None`:
+
+{* ../../docs_src/response_model/tutorial003_05_py310.py hl[7] *}
+
+ĐĻĐĩ СĐŧŅŅиŅŅ FastAPI ĐŋŅĐžĐŋŅŅŅиŅи ĐŗĐĩĐŊĐĩŅаŅŅŅ ĐŧОдĐĩĐģŅ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ, Ņ ŅаĐēиĐŧ ŅиĐŊĐžĐŧ Đи СĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи ĐąŅĐ´Ņ-ŅĐēŅ Đ°ĐŊĐžŅаŅŅŅ ŅиĐŋŅв ĐŋОвĐĩŅĐŊĐĩĐŊĐŊŅ ĐąĐĩС вĐŋĐģĐ¸Đ˛Ņ ĐŊа ваŅŅ FastAPI аĐŋĐģŅĐēаŅŅŅ. đ¤
+
+## ĐаŅаĐŧĐĩŅŅи ĐēОдŅваĐŊĐŊŅ ĐŧОдĐĩĐģŅ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ
+
+ĐаŅа ĐŧОдĐĩĐģŅ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ ĐŧĐžĐļĐĩ ĐŧаŅи СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ, ĐŊаĐŋŅиĐēĐģад:
+
+{* ../../docs_src/response_model/tutorial004_py310.py hl[9,11:12] *}
+
+* `description: Union[str, None] = None` (айО `str | None = None` Ņ Python 3.10) ĐŧĐ°Ņ ĐˇĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ `None`.
+* `tax: float = 10.5` ĐŧĐ°Ņ ĐˇĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ `10.5`.
+* `tags: List[str] = []` ĐŧĐ°Ņ ĐˇĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ ĐŋĐžŅĐžĐļĐŊŅĐš ŅĐŋиŅĐžĐē: `[]`.
+
+ĐĐģĐĩ Đи ĐŧĐžĐļĐĩŅĐĩ СаŅ
ĐžŅŅŅи ĐŊĐĩ вĐēĐģŅŅаŅи ŅŅ
Ņ ŅĐĩСŅĐģŅŅаŅ, ŅĐēŅĐž вОĐŊи ŅаĐēŅиŅĐŊĐž ĐŊĐĩ ĐąŅĐģи СйĐĩŅĐĩĐļĐĩĐŊŅ.
+
+ĐаĐŋŅиĐēĐģад, ŅĐēŅĐž Ņ ĐĐ°Ņ Ņ ĐŧОдĐĩĐģŅ Đˇ ĐąĐ°ĐŗĐ°ŅŅĐŧа ĐŊĐĩОйОвâŅСĐēОвиĐŧи аŅŅийŅŅаĐŧи Ņ NoSQL ĐąĐ°ĐˇŅ Đ´Đ°ĐŊиŅ
, аĐģĐĩ Đи ĐŊĐĩ Ņ
ĐžŅĐĩŅĐĩ вŅĐ´ĐŋŅавĐģŅŅи Đ´ŅĐļĐĩ Đ´ĐžĐ˛ĐŗŅ JSON-вŅĐ´ĐŋОвŅĐ´Ņ, ĐŋОвĐŊŅ ĐˇĐŊаŅĐĩĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ.
+
+### ĐиĐēĐžŅиŅŅОвŅĐšŅĐĩ ĐŋаŅаĐŧĐĩŅŅ `response_model_exclude_unset`
+
+Đи ĐŧĐžĐļĐĩŅĐĩ вŅŅаĐŊОвиŅи ĐŋаŅаĐŧĐĩŅŅ Đ´ĐĩĐēĐžŅаŅĐžŅа ŅĐģŅŅ
Ņ `response_model_exclude_unset=True`:
+
+{* ../../docs_src/response_model/tutorial004_py310.py hl[22] *}
+
+Ņ ŅŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ ĐŊĐĩ ĐąŅĐ´ŅŅŅ Đ˛ĐēĐģŅŅĐĩĐŊŅ Ņ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ, ŅŅĐģŅĐēи ŅаĐēŅиŅĐŊĐž вŅŅаĐŊОвĐģĐĩĐŊŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ.
+
+ĐŅĐļĐĩ, ŅĐēŅĐž Đи ĐŊадŅŅĐģĐĩŅĐĩ СаĐŋĐ¸Ņ Đ´Đž ŅŅĐžĐŗĐž ĐžĐŋĐĩŅаŅĐžŅа ŅĐģŅŅ
Ņ Đ´ĐģŅ ĐĩĐģĐĩĐŧĐĩĐŊŅа С item_id `foo`, вŅĐ´ĐŋОвŅĐ´Ņ (ĐąĐĩС вĐēĐģŅŅĐĩĐŊĐŊŅ ĐˇĐŊаŅĐĩĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ) ĐąŅĐ´Đĩ:
+
+```JSON
+{
+ "name": "Foo",
+ "price": 50.2
+}
+```
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+ĐŖ Pydantic вĐĩŅŅŅŅ 1 ĐŧĐĩŅОд ĐŊаСивавŅŅ `.dict()`, вŅĐŊ ĐąŅв СаŅŅаŅŅĐģиК (аĐģĐĩ ŅĐĩ ĐŋŅĐ´ŅŅиĐŧŅŅŅŅŅŅ) Ņ Pydantic вĐĩŅŅŅŅ 2 Ņ ĐŋĐĩŅĐĩĐšĐŧĐĩĐŊОваĐŊиК Ņ `.model_dump()`.
+
+ĐŅиĐēĐģади ŅŅŅ Đ˛Đ¸ĐēĐžŅиŅŅОвŅŅŅŅ `.dict()` Đ´ĐģŅ ŅŅĐŧŅŅĐŊĐžŅŅŅ Đˇ Pydantic v1, аĐģĐĩ ĐаĐŧ ŅĐģŅĐ´ виĐēĐžŅиŅŅОвŅваŅи `.model_dump()`, ŅĐēŅĐž Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи Pydantic v2.
+
+///
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+FastAPI виĐēĐžŅиŅŅОвŅŅ `.dict()` ĐŧОдĐĩĐģŅ Pydantic С ĐŋаŅаĐŧĐĩŅŅĐžĐŧ `exclude_unset` , ŅОй Đ´ĐžŅŅĐŗŅи ŅŅĐžĐŗĐž.
+
+///
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи:
+
+* `response_model_exclude_defaults=True`
+* `response_model_exclude_none=True`
+
+ŅĐē ĐžĐŋиŅаĐŊĐž в Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ Pydantic for `exclude_defaults` Ņа `exclude_none`.
+
+///
+
+#### ĐаĐŊŅ ĐˇŅ ĐˇĐŊаŅĐĩĐŊĐŊŅĐŧи Đ´ĐģŅ ĐŋĐžĐģŅв ŅС ŅиĐŋОвиĐŧи СĐŊаŅĐĩĐŊĐŊŅĐŧи
+
+ĐĐģĐĩ ŅĐēŅĐž ĐаŅŅ Đ´Đ°ĐŊŅ ĐŧаŅŅŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ Đ´ĐģŅ ĐŋĐžĐģŅв ĐŧОдĐĩĐģŅ Đˇ ŅиĐŋОвиĐŧи СĐŊаŅĐĩĐŊĐŊŅĐŧи, ŅĐē Ņ ĐĩĐģĐĩĐŧĐĩĐŊŅа С item_id `bar`:
+
+```Python hl_lines="3 5"
+{
+ "name": "Bar",
+ "description": "The bartenders",
+ "price": 62,
+ "tax": 20.2
+}
+```
+вОĐŊи ĐąŅĐ´ŅŅŅ Đ˛ĐēĐģŅŅĐĩĐŊŅ Ņ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ.
+
+#### ĐаĐŊŅ Đˇ ŅиĐŧи ŅаĐŧиĐŧи СĐŊаŅĐĩĐŊĐŊŅĐŧи, ŅĐž Đš ŅиĐŋОвŅ
+
+Đ¯ĐēŅĐž даĐŊŅ ĐŧаŅŅŅ ŅŅ ŅаĐŧŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ, ŅĐž Đš ŅиĐŋОвŅ, ŅĐē Ņ ĐĩĐģĐĩĐŧĐĩĐŊŅа С item_id `baz`:
+
+```Python hl_lines="3 5-6"
+{
+ "name": "Baz",
+ "description": None,
+ "price": 50.2,
+ "tax": 10.5,
+ "tags": []
+}
+```
+
+FastAPI Đ´ĐžŅŅаŅĐŊŅĐž ŅОСŅĐŧĐŊиК (ĐŊаŅĐŋŅавдŅ, Pydantic Đ´ĐžŅŅаŅĐŊŅĐž ŅОСŅĐŧĐŊиК), ŅОй СŅОСŅĐŧŅŅи, ŅĐž, Ņ
ĐžŅа `description`, `tax` Ņ `tags` ĐŧаŅŅŅ ŅŅ ŅаĐŧŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ, ŅĐž Đš ŅиĐŋОвŅ, вОĐŊи ĐąŅĐģи вŅŅаĐŊОвĐģĐĩĐŊŅ ŅвĐŊĐž (а ĐŊĐĩ вСŅŅŅ ŅĐē СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ).
+
+ĐŅĐļĐĩ, вОĐŊи ĐąŅĐ´ŅŅŅ Đ˛ĐēĐģŅŅĐĩĐŊŅ Ņ JSON-вŅĐ´ĐŋОвŅĐ´Ņ.
+
+/// tip | ĐĐžŅада
+
+ĐвĐĩŅĐŊŅŅŅ ŅĐ˛Đ°ĐŗŅ, ŅĐž ŅиĐŋĐžĐ˛Ņ ĐˇĐŊаŅĐĩĐŊĐŊŅ ĐŧĐžĐļŅŅŅ ĐąŅŅи ĐąŅĐ´Ņ-ŅĐēиĐŧи, ĐŊĐĩ ĐģиŅĐĩ `None`.
+
+ĐĻĐĩ ĐŧĐžĐļĐĩ ĐąŅŅи list (`[]`), `float` 10.5 ŅĐžŅĐž.
+
+///
+
+### `response_model_include` Ņа `response_model_exclude`
+
+Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи ĐŋаŅаĐŧĐĩŅŅи *Đ´ĐĩĐēĐžŅаŅĐžŅа ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ* `response_model_include` Ņа `response_model_exclude`.
+
+ĐĐžĐŊи ĐŋŅиКĐŧаŅŅŅ `set` (ĐŧĐŊĐžĐļиĐŊŅ) ŅŅĐ´ĐēŅв (`str`) С ŅĐŧĐĩĐŊаĐŧи аŅŅийŅŅŅв, ŅĐēŅ ĐŋĐžŅŅŅĐąĐŊĐž вĐēĐģŅŅиŅи (ĐŋŅĐžĐŋŅŅĐēаŅŅи ŅĐŊŅŅ) айО виĐēĐģŅŅиŅи (вĐēĐģŅŅаŅŅи ŅĐŊŅŅ).
+
+ĐĻĐĩ ĐŧĐžĐļĐŊа виĐēĐžŅиŅŅОвŅваŅи ŅĐē ŅвидĐēиК ŅĐŋĐžŅŅĐą, ŅĐēŅĐž Ņ ĐĐ°Ņ Ņ ĐģиŅĐĩ ОдĐŊа ĐŧОдĐĩĐģŅ Pydantic Ņ Đи Ņ
ĐžŅĐĩŅĐĩ видаĐģиŅи Đ´ĐĩŅĐēŅ Đ´Đ°ĐŊŅ Đˇ вивОдŅ.
+
+/// tip | ĐĐžŅада
+
+ĐĐģĐĩ вŅĐĩ Đļ ŅĐĩĐēĐžĐŧĐĩĐŊĐ´ŅŅŅŅŅŅ Đ˛Đ¸ĐēĐžŅиŅŅОвŅваŅи ĐžĐŋиŅаĐŊŅ Đ˛Đ¸ŅĐĩ ĐŋŅĐ´Ņ
Оди, ŅС СаŅŅĐžŅŅваĐŊĐŊŅĐŧ ĐēŅĐģŅĐēĐžŅ
ĐēĐģаŅŅв, СаĐŧŅŅŅŅ ŅиŅ
ĐŋаŅаĐŧĐĩŅŅŅв.
+
+
+ĐĻĐĩ ŅĐžĐŧŅ, ŅĐž JSON Schema, ŅĐēиК ĐŗĐĩĐŊĐĩŅŅŅŅŅŅŅ Ņ Đ˛Đ°ŅĐžĐŧŅ OpenAPI дОдаŅĐēŅ (Ņ Đ˛ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ), вŅĐĩ ОдĐŊĐž ĐąŅĐ´Đĩ вŅĐ´ĐŋОвŅдаŅи ĐŋОвĐŊŅĐš ĐŧОдĐĩĐģŅ, ĐŊавŅŅŅ ŅĐēŅĐž Đи виĐēĐžŅиŅŅОвŅŅŅĐĩ `response_model_include` айО `response_model_exclude` Đ´ĐģŅ Đ˛Đ¸ĐēĐģŅŅĐĩĐŊĐŊŅ Đ´ĐĩŅĐēиŅ
аŅŅийŅŅŅв.
+
+ĐĻĐĩ ŅаĐēĐžĐļ ŅŅĐžŅŅŅŅŅŅŅ `response_model_by_alias`, ŅĐēиК ĐŋŅаŅŅŅ ĐŋОдŅĐąĐŊиĐŧ ŅиĐŊĐžĐŧ.
+
+///
+
+{* ../../docs_src/response_model/tutorial005_py310.py hl[29,35] *}
+
+/// tip | ĐĐžŅада
+
+ХиĐŊŅаĐēŅĐ¸Ņ `{"name", "description"}` ŅŅвОŅŅŅ `set` С ŅиĐŧи двОĐŧа СĐŊаŅĐĩĐŊĐŊŅĐŧи.
+
+ĐŅĐŊ ĐĩĐēвŅваĐģĐĩĐŊŅĐŊиК `set(["name", "description"])`.
+
+///
+
+#### ĐиĐēĐžŅиŅŅаĐŊĐŊŅ `list` СаĐŧŅŅŅŅ `set`
+
+Đ¯ĐēŅĐž Đи СайŅĐ´ĐĩŅĐĩ виĐēĐžŅиŅŅаŅи `set` Ņ ĐŊаŅĐžĐŧŅŅŅŅ ĐˇĐ°ŅŅĐžŅŅŅŅĐĩ `list` айО `tuple`, FastAPI вŅĐĩ ОдĐŊĐž ĐŋĐĩŅĐĩŅвОŅиŅŅ ŅĐĩ ĐŊа `set`, Ņ Đ˛ŅĐĩ ĐŋŅаŅŅваŅиĐŧĐĩ ĐŋŅавиĐģŅĐŊĐž:
+
+{* ../../docs_src/response_model/tutorial006_py310.py hl[29,35] *}
+
+## ĐŅĐ´ŅŅĐŧĐžĐē
+
+ĐиĐēĐžŅиŅŅОвŅĐšŅĐĩ ĐŋаŅаĐŧĐĩŅŅ `response_model` *Đ´ĐĩĐēĐžŅаŅĐžŅа ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ*, ŅОй виСĐŊаŅаŅи ĐŧОдĐĩĐģŅ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ, ĐžŅОйĐģивО ŅОй ĐŗĐ°ŅаĐŊŅŅваŅи ŅŅĐģŅŅŅаŅŅŅ ĐŋŅиваŅĐŊиŅ
даĐŊиŅ
.
+
+ĐиĐēĐžŅиŅŅОвŅĐšŅĐĩ `response_model_exclude_unset`, ŅОй ĐŋОвĐĩŅŅаŅи ĐģиŅĐĩ ŅвĐŊĐž вŅŅаĐŊОвĐģĐĩĐŊŅ ĐˇĐŊаŅĐĩĐŊĐŊŅ.
diff --git a/docs/uk/docs/tutorial/response-status-code.md b/docs/uk/docs/tutorial/response-status-code.md
new file mode 100644
index 000000000..1ed69d6f2
--- /dev/null
+++ b/docs/uk/docs/tutorial/response-status-code.md
@@ -0,0 +1,100 @@
+# ĐĄŅаŅŅŅ ĐēОди ĐŅĐ´ĐŋОвŅĐ´ĐĩĐš
+
+ĐĸаĐē ŅаĐŧĐž ŅĐē Đи ĐŧĐžĐļĐĩŅĐĩ вĐēаСаŅи ĐŧОдĐĩĐģŅ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ, Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅиŅи HTTP ĐēОд ŅŅаŅŅŅŅ Đ´ĐģŅ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ ĐˇĐ° Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ ĐŋаŅаĐŧĐĩŅŅа `status_code` в ĐąŅĐ´Ņ-ŅĐēŅĐš С *ĐžĐŋĐĩŅаŅŅĐš ŅĐģŅŅ
Ņ*:
+
+* `@app.get()`
+* `@app.post()`
+* `@app.put()`
+* `@app.delete()`
+* ŅĐžŅĐž.
+
+{* ../../docs_src/response_status_code/tutorial001.py hl[6] *}
+
+/// note | ĐĐžŅаŅĐēа
+
+ĐвĐĩŅĐŊŅŅŅ ŅĐ˛Đ°ĐŗŅ, ŅĐž `status_code` Ņ ĐŋаŅаĐŧĐĩŅŅĐžĐŧ ĐŧĐĩŅĐžĐ´Ņ "Đ´ĐĩĐēĐžŅаŅĐžŅа" (`get`, `post` Ņ Ņ.Đ´.), а ĐŊĐĩ ĐаŅĐžŅ *ŅŅĐŊĐēŅŅŅ ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ*, ŅĐē ŅŅŅ ŅĐŊŅŅ ĐŋаŅаĐŧĐĩŅŅи Ņа ŅŅĐģĐž СаĐŋиŅŅ.
+
+///
+
+ĐаŅаĐŧĐĩŅŅ `status_code` ĐŋŅиКĐŧĐ°Ņ ŅиŅĐģĐž, ŅĐēĐĩ вŅĐ´ĐŋОвŅĐ´Đ°Ņ HTTP ĐēĐžĐ´Ņ ŅŅаŅŅŅŅ.
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+`status_code` ŅаĐēĐžĐļ ĐŧĐžĐļĐĩ ĐžŅŅиĐŧŅваŅи СĐŊаŅĐĩĐŊĐŊŅ Đˇ `IntEnum`, ĐŊаĐŋŅиĐēĐģад, С Python `http.HTTPStatus` .
+
+///
+
+ĐŅĐŊ ĐąŅĐ´Đĩ:
+
+* ĐОвĐĩŅŅаŅи вĐēаСаĐŊиК ĐēОд ŅŅаŅŅŅŅ Ņ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ.
+* ĐĐžĐēŅĐŧĐĩĐŊŅŅваŅи ĐšĐžĐŗĐž ŅĐē ŅаĐēиК Ņ ŅŅ
ĐĩĐŧŅ OpenAPI (Ņ, ŅаĐēиĐŧ ŅиĐŊĐžĐŧ, в ŅĐŊŅĐĩŅŅĐĩĐšŅŅ ĐēĐžŅиŅŅŅваŅа):
+
+
+
+/// note | ĐĐžŅаŅĐēа
+
+ĐĐĩŅĐēŅ ĐēОди вŅĐ´ĐŋОвŅĐ´Ņ (див. ĐŊаŅŅŅĐŋĐŊиК ŅОСдŅĐģ) вĐēаСŅŅŅŅ, ŅĐž вŅĐ´ĐŋОвŅĐ´Ņ ĐŊĐĩ ĐŧĐ°Ņ ŅŅĐģа.
+
+FastAPI СĐŊĐ°Ņ ĐŋŅĐž ŅĐĩ Ņ ŅŅвОŅиŅŅ OpenAPI Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ, ŅĐēа вĐēаСŅŅ, ŅĐž ŅŅĐģа вŅĐ´ĐŋОвŅĐ´Ņ ĐŊĐĩĐŧаŅ.
+
+///
+
+## ĐŅĐž HTTP ŅŅаŅŅŅ ĐēОди
+
+/// note | ĐĐžŅаŅĐēа
+
+Đ¯ĐēŅĐž Đи вĐļĐĩ СĐŊаŅŅĐĩ, ŅĐž ŅаĐēĐĩ HTTP ĐēОди ŅŅаŅŅŅŅ, ĐŋĐĩŅĐĩŅ
ОдŅŅĐĩ Đ´Đž ĐŊаŅŅŅĐŋĐŊĐžĐŗĐž ŅОСдŅĐģŅ.
+
+///
+
+Đ HTTP Đи ĐŊадŅиĐģаŅŅĐĩ ŅиŅĐģОвиК ĐēОд ŅŅаŅŅŅŅ Đˇ 3 ŅиŅŅ ŅĐē ŅаŅŅиĐŊŅ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ.
+
+ĐĻŅ ĐēОди ŅŅаŅŅŅŅ ĐŧаŅŅŅ ĐŋОвâŅСаĐŊŅ ĐŊĐ°ĐˇĐ˛Ņ Đ´ĐģŅ ŅŅ
ŅОСĐŋŅСĐŊаваĐŊĐŊŅ, аĐģĐĩ ĐŊаКваĐļĐģивŅŅĐžŅ ŅаŅŅиĐŊĐžŅ Ņ ŅаĐŧĐĩ ŅиŅĐģĐž.
+
+ĐĐžŅĐžŅĐēĐž:
+
+* **`100 - 199`** "ĐĐŊŅĐžŅĐŧаŅŅĐšĐŊŅ" вŅĐ´ĐŋОвŅĐ´Ņ. Đи ŅŅĐ´ĐēĐž виĐēĐžŅиŅŅОвŅŅŅĐĩ ŅŅ
ĐŊаĐŋŅŅĐŧŅ. ĐŅĐ´ĐŋОвŅĐ´Ņ Đˇ ŅаĐēиĐŧи ĐēОдаĐŧи ĐŊĐĩ ĐŧĐžĐļŅŅŅ ĐŧаŅи ŅŅĐģа.
+* **`200 - 299`** "ĐŖŅĐŋŅŅĐŊŅ" вŅĐ´ĐŋОвŅĐ´Ņ. ĐĻĐĩ ŅŅ, ŅĐēŅ Đи виĐēĐžŅиŅŅОвŅваŅиĐŧĐĩŅĐĩ ĐŊаКŅаŅŅŅŅĐĩ.
+ * `200` - ĐēОд Са СаĐŧОвŅŅваĐŊĐŊŅĐŧ, ŅĐēиК ОСĐŊаŅаŅ, ŅĐž вŅĐĩ ĐŋŅОКŅĐģĐž "OK".
+ * ĐĐŊŅиК ĐŋŅиĐēĐģад â `201`, "Created" (ŅŅвОŅĐĩĐŊĐž). ĐĐžĐŗĐž СаСвиŅаК виĐēĐžŅиŅŅОвŅŅŅŅ ĐŋŅŅĐģŅ ŅŅвОŅĐĩĐŊĐŊŅ ĐŊĐžĐ˛ĐžĐŗĐž СаĐŋиŅŅ Đ˛ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊиŅ
.
+ * ĐŅОйĐģивиК виĐŋадОĐē â `204`, "No Content" (ĐŊĐĩĐŧĐ°Ņ Đ˛ĐŧŅŅŅŅ). ĐĻŅ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ Đ˛Đ¸ĐēĐžŅиŅŅОвŅŅŅŅŅŅ, ĐēĐžĐģи ĐŊĐĩĐŧĐ°Ņ Đ´Đ°ĐŊиŅ
Đ´ĐģŅ ĐŋОвĐĩŅĐŊĐĩĐŊĐŊŅ ĐēĐģŅŅĐŊŅŅ, ŅĐžĐŧŅ Đ˛ŅĐ´ĐŋОвŅĐ´Ņ ĐŊĐĩ ĐŋОвиĐŊĐŊа ĐŧаŅи ŅŅĐģа.
+* **`300 - 399`** "ĐĐĩŅĐĩĐŊаĐŋŅавĐģĐĩĐŊĐŊŅ". ĐŅĐ´ĐŋОвŅĐ´Ņ Đˇ ŅиĐŧи ĐēОдаĐŧи ĐŧĐžĐļŅŅŅ ĐŧаŅи айО ĐŊĐĩ ĐŧаŅи ŅŅĐģа, Са виĐŊŅŅĐēĐžĐŧ `304`, "Not Modified" (ĐŊĐĩ СĐŧŅĐŊĐĩĐŊĐž), ŅĐēа ĐŊĐĩ ĐŋОвиĐŊĐŊа ĐŧаŅи ŅŅĐģа.
+* **`400 - 499`** "ĐĐžĐŧиĐģĐēа ĐēĐģŅŅĐŊŅа". ĐĻĐĩ Đ´ŅŅĐŗĐ¸Đš ŅиĐŋ, ŅĐēиК Đи, ĐšĐŧОвŅŅĐŊĐž, ĐąŅĐ´ĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи ĐŊаКŅаŅŅŅŅĐĩ.
+ * ĐŅиĐēĐģад `404`, "Not Found" (ĐŊĐĩ СĐŊаКдĐĩĐŊĐž).
+ * ĐĐģŅ ĐˇĐ°ĐŗĐ°ĐģŅĐŊиŅ
ĐŋĐžĐŧиĐģĐžĐē ĐēĐģŅŅĐŊŅа ĐŧĐžĐļĐŊа виĐēĐžŅиŅŅОвŅваŅи `400`.
+* `500 - 599` "ĐĐžĐŧиĐģĐēи ŅĐĩŅвĐĩŅа". Đи ĐŧаКĐļĐĩ ĐŊŅĐēĐžĐģи ĐŊĐĩ виĐēĐžŅиŅŅОвŅŅŅĐĩ ŅŅ
ĐŊаĐŋŅŅĐŧŅ. Đ¯ĐēŅĐž в ĐēĐžĐ´Ņ ĐаŅĐžĐŗĐž СаŅŅĐžŅŅĐŊĐēŅ Đ°ĐąĐž ĐŊа ŅĐĩŅвĐĩŅŅ ŅĐžŅŅ ĐŋŅŅĐģĐž ĐŊĐĩ ŅаĐē, авŅĐžĐŧаŅиŅĐŊĐž ĐąŅĐ´Đĩ ĐŋОвĐĩŅĐŊĐĩĐŊĐž ОдиĐŊ ŅС ŅиŅ
ĐēОдŅв ŅŅаŅŅŅŅ.
+
+/// tip | ĐĐžŅада
+
+ЊОй Đ´ŅСĐŊаŅиŅŅ ĐąŅĐģŅŅĐĩ ĐŋŅĐž ĐēĐžĐļĐĩĐŊ ĐēОд ŅŅаŅŅŅŅ Ņ ĐŋŅиСĐŊаŅĐĩĐŊĐŊŅ ĐēĐžĐļĐŊĐžĐŗĐž С ĐŊиŅ
, ĐŋĐĩŅĐĩĐŗĐģŅĐŊŅŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ MDN ĐŋŅĐž HTTP ĐēОди ŅŅаŅŅŅŅ .
+
+///
+
+## ĐĐĩĐŗĐēиК ŅĐŋĐžŅŅĐą СаĐŋаĐŧ'ŅŅаŅи ĐŊаСви
+
+Đ ĐžĐˇĐŗĐģŅĐŊĐĩĐŧĐž ŅĐĩ ŅаС ĐŋĐžĐŋĐĩŅĐĩĐ´ĐŊŅĐš ĐŋŅиĐēĐģад:
+
+{* ../../docs_src/response_status_code/tutorial001.py hl[6] *}
+
+`201` - ŅĐĩ ĐēОд ŅŅаŅŅŅŅ Đ´ĐģŅ "Created" (ŅŅвОŅĐĩĐŊĐž).
+
+ĐĐģĐĩ ĐаĐŧ ĐŊĐĩ ĐŋĐžŅŅŅĐąĐŊĐž СаĐŋаĐŧ'ŅŅОвŅваŅи, ŅĐž ОСĐŊаŅĐ°Ņ ĐēĐžĐļĐĩĐŊ ŅС ŅиŅ
ĐēОдŅв.
+
+Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи СŅŅŅĐŊŅ ĐˇĐŧŅĐŊĐŊŅ Đˇ `fastapi.status`
+
+{* ../../docs_src/response_status_code/tutorial002.py hl[1,6] *}
+
+ĐĻŅ ĐˇĐŧŅĐŊĐŊŅ ĐŋŅĐžŅŅĐž Đ´ĐģŅ ĐˇŅŅŅĐŊĐžŅŅŅ. ĐĐžĐŊи ĐŧŅŅŅŅŅŅ ŅŅ Đļ ŅаĐŧŅ ŅиŅĐģа, аĐģĐĩ Đи ĐŧĐžĐļĐĩŅĐĩ ŅĐēĐžŅиŅŅаŅиŅŅ Đ°Đ˛ŅОСаĐŋОвĐŊĐĩĐŊĐŊŅĐŧ в ŅĐĩдаĐēŅĐžŅŅ:
+
+
+
+/// note | ĐĸĐĩŅ
ĐŊŅŅĐŊŅ Đ´ĐĩŅаĐģŅ
+
+Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅаŅи `from starlette import status`.
+
+**FastAPI** ĐŊĐ°Đ´Đ°Ņ ŅŅ Đļ ŅаĐŧŅ ĐˇĐŧŅĐŊĐŊŅ `starlette.status` ŅĐē `fastapi.status`, ĐŋŅĐžŅŅĐž Đ´ĐģŅ ĐˇŅŅŅĐŊĐžŅŅŅ ŅОСŅОйĐŊиĐēа. ĐĐ´ĐŊаĐē вОĐŊи ĐŋĐžŅ
ОдŅŅŅ ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž ĐˇŅ Starlette.
+
+///
+
+## ĐĐŧŅĐŊа СĐŊаŅĐĩĐŊĐŊŅ ĐˇĐ° СаĐŧОвŅŅваĐŊĐŊŅĐŧ
+
+ĐаĐģŅ, Ņ ĐĐžŅŅĐąĐŊиĐēŅ Đ´ĐģŅ Đ´ĐžŅвŅĐ´ŅĐĩĐŊиŅ
ĐēĐžŅиŅŅŅваŅŅв{.internal-link target=_blank}, Đи Đ´ŅСĐŊаŅŅĐĩŅŅ, ŅĐē ĐŋОвĐĩŅĐŊŅŅи ŅĐŊŅиК ĐēОд ŅŅаŅŅŅŅ, ĐŊŅĐļ ŅОК, ŅĐēиК Đи ĐžĐŗĐžĐģĐžŅиĐģи ŅŅŅ.
diff --git a/docs/uk/docs/tutorial/schema-extra-example.md b/docs/uk/docs/tutorial/schema-extra-example.md
new file mode 100644
index 000000000..853fd5e65
--- /dev/null
+++ b/docs/uk/docs/tutorial/schema-extra-example.md
@@ -0,0 +1,222 @@
+# ĐĐĩĐēĐģаŅŅваĐŊĐŊŅ ĐŋŅиĐēĐģадŅв вŅ
ŅĐ´ĐŊиŅ
даĐŊиŅ
+
+Đи ĐŧĐžĐļĐĩŅĐĩ СадаŅи ĐŋŅиĐēĐģади даĐŊиŅ
, ŅĐēŅ ĐĐ°Ņ ĐˇĐ°ŅŅĐžŅŅĐŊĐžĐē ĐŧĐžĐļĐĩ ĐžŅŅиĐŧŅваŅи.
+
+ĐŅŅ ĐēŅĐģŅĐēа ŅĐŋĐžŅОйŅв, ŅĐē ŅĐĩ СŅОйиŅи.
+
+## ĐОдаŅĐēĐžĐ˛Ņ Đ´Đ°ĐŊŅ JSON-ŅŅ
ĐĩĐŧи в ĐŧОдĐĩĐģŅŅ
Pydantic
+
+Đи ĐŧĐžĐļĐĩŅĐĩ СадаŅи `examples` Đ´ĐģŅ ĐŧОдĐĩĐģŅ Pydantic, ŅĐēŅ ĐąŅĐ´Đĩ дОдаĐŊĐž Đ´Đž ĐˇĐŗĐĩĐŊĐĩŅОваĐŊĐžŅ JSON-ŅŅ
ĐĩĐŧи.
+
+//// tab | Pydantic v2
+
+{* ../../docs_src/schema_extra_example/tutorial001_py310.py hl[13:24] *}
+
+////
+
+//// tab | Pydantic v1
+
+{* ../../docs_src/schema_extra_example/tutorial001_pv1_py310.py hl[13:23] *}
+
+////
+
+ĐĻŅ Đ´ĐžĐ´Đ°ŅĐēОва ŅĐŊŅĐžŅĐŧаŅŅŅ ĐąŅĐ´Đĩ дОдаĐŊа ŅĐē Ņ Đ´Đž **JSON-ŅŅ
ĐĩĐŧи**, Ņ Đ˛ĐžĐŊа ĐąŅĐ´Đĩ виĐēĐžŅиŅŅОвŅваŅиŅŅ Đ˛ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ Đ´Đž API.
+
+//// tab | Pydantic v2
+
+ĐŖ вĐĩŅŅŅŅ Pydantic 2 виĐēĐžŅиŅŅОвŅŅŅŅŅŅ Đ°ŅŅийŅŅ `model_config`, ŅĐēиК ĐŋŅиКĐŧĐ°Ņ `dict`, ŅĐē ĐžĐŋиŅаĐŊĐž в Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ Pydantic: ĐĐžĐŊŅŅĐŗŅŅаŅŅŅ .
+
+Đи ĐŧĐžĐļĐĩŅĐĩ вŅŅаĐŊОвиŅи `"json_schema_extra"` ŅĐē `dict`, ŅĐž ĐŧŅŅŅиŅŅ ĐąŅĐ´Ņ-ŅĐēŅ Đ´ĐžĐ´Đ°ŅĐēĐžĐ˛Ņ Đ´Đ°ĐŊŅ, ŅĐēŅ Đи Ņ
ĐžŅĐĩŅĐĩ вŅдОйŅаСиŅи Ņ ĐˇĐŗĐĩĐŊĐĩŅОваĐŊŅĐš JSON-ŅŅ
ĐĩĐŧŅ, вĐēĐģŅŅаŅŅи `examples`.
+
+////
+
+//// tab | Pydantic v1
+
+ĐŖ вĐĩŅŅŅŅ Pydantic 1 виĐēĐžŅиŅŅОвŅŅŅŅŅŅ Đ˛ĐŊŅŅŅŅŅĐŊŅĐš ĐēĐģĐ°Ņ `Config` Ņ ĐŋаŅаĐŧĐĩŅŅ `schema_extra`, ŅĐē ĐžĐŋиŅаĐŊĐž в Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ Pydantic: ĐаĐģаŅŅŅваĐŊĐŊŅ ŅŅ
ĐĩĐŧи .
+
+Đи ĐŧĐžĐļĐĩŅĐĩ СадаŅи `schema_extra` ŅĐē `dict`, ŅĐž ĐŧŅŅŅиŅŅ ĐąŅĐ´Ņ-ŅĐēŅ Đ´ĐžĐ´Đ°ŅĐēĐžĐ˛Ņ Đ´Đ°ĐŊŅ, ŅĐēŅ Đи Ņ
ĐžŅĐĩŅĐĩ йаŅиŅи Ņ ĐˇĐŗĐĩĐŊĐĩŅОваĐŊŅĐš JSON-ŅŅ
ĐĩĐŧŅ, вĐēĐģŅŅаŅŅи `examples`.
+
+////
+
+/// tip | ĐŅĐ´ĐēаСĐēа
+
+Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅаŅи ŅŅ Đļ ŅĐĩŅ
ĐŊŅĐēŅ, ŅОй ŅОСŅиŅиŅи JSON-ŅŅ
ĐĩĐŧŅ Ņ Đ´ĐžĐ´Đ°Ņи вĐģаŅĐŊŅ Đ´ĐžĐ´Đ°ŅĐēĐžĐ˛Ņ ŅĐŊŅĐžŅĐŧаŅŅŅ.
+
+ĐаĐŋŅиĐēĐģад, Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅаŅи ŅŅ Đ´ĐģŅ Đ´ĐžĐ´Đ°Đ˛Đ°ĐŊĐŊŅ ĐŧĐĩŅадаĐŊиŅ
Đ´ĐģŅ ŅĐŊŅĐĩŅŅĐĩĐšŅŅ ĐēĐžŅиŅŅŅваŅа ĐŊа ŅŅĐžĐŊŅĐĩĐŊĐ´Ņ ŅĐžŅĐž.
+
+///
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+OpenAPI 3.1.0 (ŅĐēиК виĐēĐžŅиŅŅОвŅŅŅŅŅŅ ĐŋĐžŅиĐŊаŅŅи С FastAPI 0.99.0) дОдав ĐŋŅĐ´ŅŅиĐŧĐēŅ `examples`, ŅĐž Ņ ŅаŅŅиĐŊĐžŅ ŅŅаĐŊдаŅŅŅ **JSON-ŅŅ
ĐĩĐŧи**.
+
+ĐĐž ŅŅĐžĐŗĐž ĐŋŅĐ´ŅŅиĐŧŅвавŅŅ ĐģиŅĐĩ ĐēĐģŅŅ `example` С ОдĐŊиĐŧ ĐŋŅиĐēĐģадОĐŧ. ĐŅĐŊ вŅĐĩ ŅĐĩ ĐŋŅĐ´ŅŅиĐŧŅŅŅŅŅŅ Đ˛ OpenAPI 3.1.0, аĐģĐĩ Ņ ĐˇĐ°ŅŅаŅŅĐģиĐŧ Ņ ĐŊĐĩ вŅ
ОдиŅŅ Đ´Đž ŅŅаĐŊдаŅŅŅ JSON Schema. ĐĸĐžĐŧŅ ŅĐĩĐēĐžĐŧĐĩĐŊĐ´ŅŅŅŅŅŅ ĐŋĐĩŅĐĩĐšŅи С `example` ĐŊа `examples`. đ¤
+
+ĐŅĐģŅŅĐĩ ĐŋŅĐž ŅĐĩ ĐŧĐžĐļĐŊа ĐŋŅĐžŅиŅаŅи в ĐēŅĐŊŅŅ ŅŅŅŅ ŅŅĐžŅŅĐŊĐēи.
+
+///
+
+## ĐОдаŅĐēĐžĐ˛Ņ Đ°ŅĐŗŅĐŧĐĩĐŊŅи `Field`
+
+ĐĐžĐģи ви виĐēĐžŅиŅŅОвŅŅŅĐĩ `Field()` Ņ ĐŧОдĐĩĐģŅŅ
Pydantic, Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ вĐēаСаŅи дОдаŅĐēĐžĐ˛Ņ `examples`:
+
+{* ../../docs_src/schema_extra_example/tutorial002_py310.py hl[2,8:11] *}
+
+## `examples` Ņ JSON-ŅŅ
ĐĩĐŧŅ â OpenAPI
+
+ĐŅи виĐēĐžŅиŅŅаĐŊĐŊŅ ĐąŅĐ´Ņ-ĐēĐžĐŗĐž С ĐŊаŅŅŅĐŋĐŊĐžĐŗĐž:
+
+* `Path()`
+* `Query()`
+* `Header()`
+* `Cookie()`
+* `Body()`
+* `Form()`
+* `File()`
+
+Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ СадаŅи ĐŊайŅŅ `examples` С дОдаŅĐēĐžĐ˛ĐžŅ ŅĐŊŅĐžŅĐŧаŅŅŅŅ, ŅĐēа ĐąŅĐ´Đĩ дОдаĐŊа Đ´Đž ŅŅ
ĐŊŅŅ
**JSON-ŅŅ
ĐĩĐŧ** Ņ **OpenAPI**.
+
+### `Body` С `examples`
+
+ĐĸŅŅ Đŧи ĐŋĐĩŅĐĩдаŅĐŧĐž `examples`, ŅĐēŅ ĐŧŅŅŅŅŅŅ ĐžĐ´Đ¸ĐŊ ĐŋŅиĐēĐģад ĐžŅŅĐēŅваĐŊиŅ
даĐŊиŅ
Ņ `Body()`:
+
+{* ../../docs_src/schema_extra_example/tutorial003_an_py310.py hl[22:29] *}
+
+### ĐŅиĐēĐģад Ņ UI Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ
+
+Đа Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ ĐąŅĐ´Ņ-ŅĐēĐžĐŗĐž С ĐŊавĐĩĐ´ĐĩĐŊиŅ
виŅĐĩ ĐŧĐĩŅОдŅв ŅĐĩ Đ˛Đ¸ĐŗĐģŅдаŅиĐŧĐĩ ŅаĐē Ņ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ ĐˇĐ° `/docs`:
+
+
+
+### `Body` С ĐēŅĐģŅĐēĐžĐŧа `examples`
+
+ĐвиŅаКĐŊĐž, Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ ĐŋĐĩŅĐĩдаŅи ĐēŅĐģŅĐēа `examples`:
+
+{* ../../docs_src/schema_extra_example/tutorial004_an_py310.py hl[23:38] *}
+
+ĐĐžĐģи Đи ŅĐĩ ŅОйиŅĐĩ, ĐŋŅиĐēĐģади ĐąŅĐ´ŅŅŅ ŅаŅŅиĐŊĐžŅ Đ˛ĐŊŅŅŅŅŅĐŊŅĐžŅ **JSON-ŅŅ
ĐĩĐŧи** Đ´ĐģŅ ŅиŅ
даĐŊиŅ
.
+
+ĐŅŅĐŧ, ĐŊа ĐŧĐžĐŧĐĩĐŊŅ ĐŊаĐŋиŅаĐŊĐŊŅ ŅŅĐžĐŗĐž (26 ŅĐĩŅĐŋĐŊŅ 2023 ), Swagger UI â ŅĐŊŅŅŅŅĐŧĐĩĐŊŅ, ŅĐēиК вŅĐ´ĐŋОвŅĐ´Đ°Ņ ĐˇĐ° вŅдОйŅаĐļĐĩĐŊĐŊŅ UI Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ â ĐŊĐĩ ĐŋŅĐ´ŅŅиĐŧŅŅ ĐŋĐžĐēаС ĐēŅĐģŅĐēĐžŅ
ĐŋŅиĐēĐģадŅв Ņ **JSON-ŅŅ
ĐĩĐŧи**. ĐĐģĐĩ ĐŊиĐļŅĐĩ ĐŧĐžĐļĐŊа ĐŋŅĐžŅиŅаŅи ĐŋŅĐž ОйŅ
ŅĐ´ĐŊиК ŅĐģŅŅ
.
+
+### ĐĄĐŋĐĩŅиŅŅŅĐŊŅ Đ´ĐģŅ OpenAPI `examples`
+
+ĐŠĐĩ Đ´Đž ŅĐžĐŗĐž, ŅĐē **JSON-ŅŅ
ĐĩĐŧа** ĐŋĐžŅаĐģа ĐŋŅĐ´ŅŅиĐŧŅваŅи `examples`, OpenAPI вĐļĐĩ ĐŧаĐģа ĐŋŅĐ´ŅŅиĐŧĐēŅ ĐŋĐžĐģŅ Đˇ ŅаĐēĐžŅ Đļ ĐŊĐ°ĐˇĐ˛ĐžŅ â `examples`.
+
+ĐĻĐĩ **ŅĐŋĐĩŅиŅŅŅĐŊĐĩ Đ´ĐģŅ OpenAPI** ĐŋĐžĐģĐĩ `examples` ŅОСĐŧŅŅŅŅŅŅŅŅ Đ˛ ŅĐŊŅŅĐš ŅаŅŅиĐŊŅ ŅĐŋĐĩŅиŅŅĐēаŅŅŅ OpenAPI â Ņ **Đ´ĐĩŅаĐģŅŅ
ĐēĐžĐļĐŊĐžŅ *ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ***, а ĐŊĐĩ вŅĐĩŅĐĩдиĐŊŅ ŅаĐŧĐžŅ JSON-ŅŅ
ĐĩĐŧи.
+
+Swagger UI вĐļĐĩ давĐŊĐž ĐŋŅĐ´ŅŅиĐŧŅŅ ŅĐĩ ĐŋĐžĐģĐĩ `examples`. ĐĸĐžĐŧŅ Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи ĐšĐžĐŗĐž, ŅОй **вŅдОйŅаĐļаŅи** ĐēŅĐģŅĐēа **ĐŋŅиĐēĐģадŅв Ņ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ**.
+
+ĐĻĐĩ ĐŋĐžĐģĐĩ `examples` Ņ ŅĐŋĐĩŅиŅŅĐēаŅŅŅ OpenAPI â ŅĐĩ `dict` (ŅĐģОвĐŊиĐē) С **ĐēŅĐģŅĐēĐžĐŧа ĐŋŅиĐēĐģадаĐŧи** (а ĐŊĐĩ ŅĐŋиŅĐžĐē `list`), ĐēĐžĐļĐĩĐŊ ŅС ŅĐēиŅ
ĐŧĐžĐļĐĩ ĐŧŅŅŅиŅи дОдаŅĐēĐžĐ˛Ņ ŅĐŊŅĐžŅĐŧаŅŅŅ, ŅĐž ĐąŅĐ´Đĩ дОдаĐŊа Đ´Đž **OpenAPI**.
+
+ĐĐžĐŊĐž ĐŊĐĩ вĐēĐģŅŅаŅŅŅŅŅ Đ´Đž JSON Schema ĐēĐžĐļĐŊĐžĐŗĐž ĐŋаŅаĐŧĐĩŅŅа, а ŅОСĐŧŅŅŅŅŅŅŅŅ ĐˇĐžĐ˛ĐŊŅ, ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž в *ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ*.
+
+### ĐиĐēĐžŅиŅŅаĐŊĐŊŅ ĐŋаŅаĐŧĐĩŅŅа `openapi_examples`
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗĐžĐģĐžŅиŅи ŅĐŋĐĩŅиŅŅŅĐŊŅ Đ´ĐģŅ OpenAPI `examples` Ņ FastAPI Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ ĐŋаŅаĐŧĐĩŅŅа `openapi_examples` Đ´ĐģŅ:
+
+* `Path()`
+* `Query()`
+* `Header()`
+* `Cookie()`
+* `Body()`
+* `Form()`
+* `File()`
+
+ĐĐģŅŅŅ ŅĐģОвĐŊиĐēа (`dict`) ŅĐ´ĐĩĐŊŅиŅŅĐēŅŅŅŅ ĐēĐžĐļĐĩĐŊ ĐŋŅиĐēĐģад, а ĐēĐžĐļĐŊĐĩ СĐŊаŅĐĩĐŊĐŊŅ `dict` â ĐēĐžĐļĐĩĐŊ ŅĐŋĐĩŅиŅŅŅĐŊиК ŅĐģОвĐŊиĐē `dict` в `examples` ĐŧĐžĐļĐĩ ĐŧŅŅŅиŅи:
+
+* `summary`: ĐēĐžŅĐžŅĐēиК ĐžĐŋĐ¸Ņ ĐŋŅиĐēĐģадŅ.
+* `description`: ŅĐžĐˇĐŗĐžŅĐŊŅŅиК ĐžĐŋĐ¸Ņ (ĐŧĐžĐļĐĩ ĐŧŅŅŅиŅи Markdown).
+* `value`: ŅаĐŧ ĐŋŅиĐēĐģад, ĐŊаĐŋŅиĐēĐģад, ŅĐģОвĐŊиĐē (`dict`).
+* `externalValue`: аĐģŅŅĐĩŅĐŊаŅива `value`, URL-адŅĐĩŅа, ŅĐž вĐēаСŅŅ ĐŊа ĐŋŅиĐēĐģад. ĐŅĐžŅĐĩ ŅŅ ĐžĐŋŅŅŅ ĐŧĐžĐļĐĩ ĐŊĐĩ ĐŋŅĐ´ŅŅиĐŧŅваŅиŅŅ ĐąŅĐģŅŅŅŅŅŅ ŅĐŊŅŅŅŅĐŧĐĩĐŊŅŅв, ĐŊа вŅĐ´ĐŧŅĐŊŅ Đ˛ŅĐ´ `value`.
+
+ĐиĐēĐžŅиŅŅаĐŊĐŊŅ Đ˛Đ¸ĐŗĐģŅĐ´Đ°Ņ ŅаĐē:
+
+{* ../../docs_src/schema_extra_example/tutorial005_an_py310.py hl[23:49] *}
+
+### ĐŅиĐēĐģади OpenAPI Ņ UI Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ
+
+Đ ĐŋаŅаĐŧĐĩŅŅĐžĐŧ `openapi_examples`, дОдаĐŊиĐŧ Đ´Đž `Body()`, Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ `/docs` Đ˛Đ¸ĐŗĐģŅдаŅиĐŧĐĩ ŅаĐē:
+
+
+
+## ĐĸĐĩŅ
ĐŊŅŅĐŊŅ Đ´ĐĩŅаĐģŅ
+
+/// tip | ĐŅĐ´ĐēаСĐēа
+
+Đ¯ĐēŅĐž Đи вĐļĐĩ виĐēĐžŅиŅŅОвŅŅŅĐĩ **FastAPI** вĐĩŅŅŅŅ **0.99.0 айО виŅĐĩ**, Đи ĐŧĐžĐļĐĩŅĐĩ **ĐŋŅĐžĐŋŅŅŅиŅи** ŅĐĩĐš ŅОСдŅĐģ.
+
+ĐŅĐŊ ĐąŅĐģŅŅ Đ°ĐēŅŅаĐģŅĐŊиК Đ´ĐģŅ ŅŅаŅиŅ
вĐĩŅŅŅĐš, Đ´Đž ĐŋĐžŅви OpenAPI 3.1.0.
+
+ĐĐžĐļĐŊа вваĐļаŅи ŅĐĩ ĐēĐžŅĐžŅĐēиĐŧ **ŅŅŅĐžŅиŅĐŊиĐŧ ĐĩĐēŅĐēŅŅŅĐžĐŧ** Ņ OpenAPI Ņа JSON Schema. đ¤
+
+///
+
+/// warning | ĐĐžĐŋĐĩŅĐĩĐ´ĐļĐĩĐŊĐŊŅ
+
+ĐĻĐĩ Đ´ŅĐļĐĩ ŅĐĩŅ
ĐŊŅŅĐŊа ŅĐŊŅĐžŅĐŧаŅŅŅ ĐŋŅĐž ŅŅаĐŊдаŅŅи **JSON Schema** Ņ **OpenAPI**.
+
+Đ¯ĐēŅĐž виŅĐĩĐˇĐŗĐ°Đ´Đ°ĐŊŅ ŅĐ´ĐĩŅ Đ˛ĐļĐĩ ĐŋŅаŅŅŅŅŅ Ņ ĐĐ°Ņ â ĐŧĐžĐļĐĩŅĐĩ ĐŊĐĩ ĐˇĐ°ĐŗĐģийĐģŅваŅиŅŅ Đ˛ ŅŅ Đ´ĐĩŅаĐģŅ.
+
+///
+
+ĐĐž OpenAPI 3.1.0 ŅĐŋĐĩŅиŅŅĐēаŅŅŅ Đ˛Đ¸ĐēĐžŅиŅŅОвŅваĐģа ŅŅаŅŅ Ņа ĐŧОдиŅŅĐēОваĐŊŅ Đ˛ĐĩŅŅŅŅ **JSON Schema**.
+
+ĐŅĐēŅĐģŅĐēи JSON Schema ŅаĐŊŅŅĐĩ ĐŊĐĩ ĐŋŅĐ´ŅŅиĐŧŅваĐģа `examples`, OpenAPI дОдаĐģа вĐģаŅĐŊĐĩ ĐŋĐžĐģĐĩ `examples`.
+
+OpenAPI ŅаĐēĐžĐļ дОдаĐģа `example` Ņ `examples` Đ´Đž ŅĐŊŅиŅ
ŅаŅŅиĐŊ ŅĐŋĐĩŅиŅŅĐēаŅŅŅ:
+
+* `Parameter Object` (в ŅĐŋĐĩŅиŅŅĐēаŅŅŅ) виĐēĐžŅиŅŅОвŅŅŅŅŅŅ FastAPI Đ´ĐģŅ:
+ * `Path()`
+ * `Query()`
+ * `Header()`
+ * `Cookie()`
+* `Request Body Object`, в ĐŋĐžĐģŅ `content`, в `Media Type Object` (в ŅĐŋĐĩŅиŅŅĐēаŅŅŅ) виĐēĐžŅиŅŅОвŅŅŅŅŅŅ FastAPI Đ´ĐģŅ:
+ * `Body()`
+ * `File()`
+ * `Form()`
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+ĐĻĐĩĐš ŅŅаŅиК ĐŋаŅаĐŧĐĩŅŅ `examples`, ŅĐŋĐĩŅиŅŅŅĐŊиК Đ´ĐģŅ OpenAPI, ŅĐĩĐŋĐĩŅ ĐŊаСиваŅŅŅŅŅ `openapi_examples`, ĐŋĐžŅиĐŊаŅŅи С FastAPI вĐĩŅŅŅŅ `0.103.0`.
+
+///
+
+### ĐĐžĐģĐĩ `examples` Ņ JSON Schema
+
+ĐŅСĐŊŅŅĐĩ JSON Schema дОдаĐģа ĐŋĐžĐģĐĩ `examples` Ņ ĐŊĐžĐ˛Ņ Đ˛ĐĩŅŅŅŅ ŅĐŋĐĩŅиŅŅĐēаŅŅŅ.
+
+РвĐļĐĩ OpenAPI 3.1.0 йаСŅŅŅŅŅŅ ĐŊа ŅŅĐš ĐŊОвŅĐš вĐĩŅŅŅŅ (JSON Schema 2020-12), ŅĐēа вĐēĐģŅŅĐ°Ņ ĐŋĐžĐģĐĩ `examples`.
+
+ĐĸĐĩĐŋĐĩŅ ŅĐĩ ĐŋĐžĐģĐĩ `examples` Ņ ĐŋŅŅĐžŅиŅĐĩŅĐŊиĐŧ Ņ ĐˇĐ°ĐŧŅĐŊŅŅ ŅŅаŅĐĩ (Ņ ĐēаŅŅĐžĐŧĐŊĐĩ) ĐŋĐžĐģĐĩ `example`, ŅĐēĐĩ ŅŅаĐģĐž СаŅŅаŅŅĐģиĐŧ.
+
+ĐОвĐĩ ĐŋĐžĐģĐĩ `examples` Ņ JSON Schema â ŅĐĩ **ĐŋŅĐžŅŅĐž ŅĐŋиŅĐžĐē (`list`)** ĐŋŅиĐēĐģадŅв, ĐąĐĩС дОдаŅĐēОвиŅ
ĐŧĐĩŅадаĐŊиŅ
(ĐŊа вŅĐ´ĐŧŅĐŊŅ Đ˛ŅĐ´ OpenAPI).
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+ĐавŅŅŅ ĐŋŅŅĐģŅ ŅĐžĐŗĐž, ŅĐē С'ŅвивŅŅ OpenAPI 3.1.0, ŅĐēиК ĐŋŅĐ´ŅŅиĐŧŅвав examples Ņ JSON Schema, ŅĐŊŅŅŅŅĐŧĐĩĐŊŅ Swagger UI ŅĐĩ Đ´ĐĩŅĐēиК ŅĐ°Ņ ĐŊĐĩ ĐŋŅĐ´ŅŅиĐŧŅвав ŅŅ Đ˛ĐĩŅŅŅŅ (ĐŋŅĐ´ŅŅиĐŧĐēа СâŅвиĐģаŅŅ Đˇ вĐĩŅŅŅŅ 5.0.0 đ).
+
+ЧĐĩŅĐĩС ŅĐĩ вĐĩŅŅŅŅ FastAPI Đ´Đž 0.99.0 вŅĐĩ ŅĐĩ виĐēĐžŅиŅŅОвŅваĐģи вĐĩŅŅŅŅ OpenAPI ĐŊиĐļŅŅ ĐˇĐ° 3.1.0.
+
+///
+
+### `Examples` в Pydantic Ņ FastAPI
+
+ĐĐžĐģи Đи дОдаŅŅĐĩ `examples` Ņ ĐŧОдĐĩĐģŅ Pydantic ŅĐĩŅĐĩС `schema_extra` айО `Field(examples=["something"])`, ŅŅ ĐŋŅиĐēĐģади дОдаŅŅŅŅŅ Đ´Đž **JSON Schema** ŅŅŅŅ ĐŧОдĐĩĐģŅ.
+
+Đ ŅŅ **JSON Schema** Pydantic-ĐŧОдĐĩĐģŅ Đ˛ĐēĐģŅŅаŅŅŅŅŅ Đ´Đž **OpenAPI** ĐаŅĐžĐŗĐž API, а ĐŋĐžŅŅĐŧ виĐēĐžŅиŅŅОвŅŅŅŅŅŅ Đ˛ UI Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ (docs UI).
+
+ĐŖ вĐĩŅŅŅŅŅ
FastAPI Đ´Đž 0.99.0 (ĐŋĐžŅиĐŊаŅŅи С 0.99.0 виĐēĐžŅиŅŅОвŅŅŅŅŅŅ ĐŊОвŅŅиК OpenAPI 3.1.0), ĐēĐžĐģи Đи виĐēĐžŅиŅŅОвŅваĐģи `example` айО `examples` С ŅĐŊŅиĐŧи ŅŅиĐģŅŅаĐŧи (`Query()`, `Body()` ŅĐžŅĐž), ŅŅ ĐŋŅиĐēĐģади ĐŊĐĩ дОдаваĐģиŅŅ Đ´Đž JSON Schema, ŅĐēиК ĐžĐŋиŅŅŅ ŅŅ Đ´Đ°ĐŊŅ (ĐŊавŅŅŅ ĐŊĐĩ Đ´Đž вĐģаŅĐŊĐžŅ Đ˛ĐĩŅŅŅŅ JSON Schema Ņ OpenAPI). ĐаŅĐžĐŧŅŅŅŅ Đ˛ĐžĐŊи дОдаваĐģиŅŅ ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž Đ´Đž ĐžĐŋиŅŅ *ОйŅОйĐŊиĐēа ŅĐģŅŅ
Ņ* *(path operation)* в OpenAPI (ŅОйŅĐž ĐŋОСа ĐŧĐĩĐļаĐŧи ŅаŅŅиĐŊ, ŅĐēŅ Đ˛Đ¸ĐēĐžŅиŅŅОвŅŅŅŅ JSON Schema).
+
+ĐĐģĐĩ ŅĐĩĐŋĐĩŅ, ĐēĐžĐģи FastAPI 0.99.0 Ņ Đ˛Đ¸ŅĐĩ виĐēĐžŅиŅŅОвŅŅŅŅ OpenAPI 3.1.0, а ŅОК â JSON Schema 2020-12, ŅаСОĐŧ ŅС Swagger UI 5.0.0 Ņ Đ˛Đ¸ŅĐĩ â вŅĐĩ ŅŅаĐģĐž ĐąŅĐģŅŅ ŅĐˇĐŗĐžĐ´ĐļĐĩĐŊиĐŧ, Ņ examples ŅĐĩĐŋĐĩŅ Đ˛ĐēĐģŅŅаŅŅŅŅŅ Đ´Đž JSON Schema.
+
+### Swagger UI Ņа ŅĐŋĐĩŅиŅŅŅĐŊŅ Đ´ĐģŅ OpenAPI `examples`
+
+РаĐŊŅŅĐĩ (ŅŅаĐŊĐžĐŧ ĐŊа 26 ŅĐĩŅĐŋĐŊŅ 2023 ŅĐžĐēŅ) Swagger UI ĐŊĐĩ ĐŋŅĐ´ŅŅиĐŧŅвав ĐēŅĐģŅĐēа ĐŋŅиĐēĐģадŅв Ņ JSON Schema, ŅĐžĐŧŅ ĐēĐžŅиŅŅŅваŅŅ ĐŊĐĩ ĐŧаĐģи ĐŧĐžĐļĐģивОŅŅŅ ĐŋĐžĐēаСаŅи Đ´ĐĩĐēŅĐģŅĐēа ĐŋŅиĐēĐģадŅв Ņ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ.
+
+ЊОй виŅŅŅиŅи ŅĐĩ, FastAPI ĐŋĐžŅиĐŊаŅŅи С вĐĩŅŅŅŅ 0.103.0 **дОдав ĐŋŅĐ´ŅŅиĐŧĐēŅ** ŅŅаŅĐžĐŗĐž **OpenAPI-ŅĐŋĐĩŅиŅŅŅĐŊĐžĐŗĐž** ĐŋĐžĐģŅ `examples` ŅĐĩŅĐĩС ĐŊОвиК ĐŋаŅаĐŧĐĩŅŅ `openapi_examples`. đ¤
+
+### ĐŅĐ´ŅŅĐŧĐžĐē
+
+РаĐŊŅŅĐĩ Ņ ĐēаСав, ŅĐž ĐŊĐĩ ĐģŅĐąĐģŅ ŅŅŅĐžŅŅŅ... а ŅĐĩĐŋĐĩŅ ĐžŅŅ Ņ â ŅОСĐŋОвŅĐ´Đ°Ņ "ŅĐĩŅ
ĐŊŅŅĐŊŅ ŅŅŅĐžŅиŅĐŊŅ" ĐģĐĩĐēŅŅŅ. đ
+
+ĐĐžŅĐžŅĐēĐž: **ĐžĐŊОвŅŅŅŅŅ Đ´Đž FastAPI 0.99.0 айО виŅĐĩ** â Ņ Đ˛ŅĐĩ ŅŅаĐŊĐĩ СĐŊаŅĐŊĐž **ĐŋŅĐžŅŅŅŅиĐŧ, ŅĐˇĐŗĐžĐ´ĐļĐĩĐŊиĐŧ Ņа ŅĐŊŅŅŅŅивĐŊĐž СŅОСŅĐŧŅĐģиĐŧ**, Ņ ĐаĐŧ ĐŊĐĩ дОвĐĩĐ´ĐĩŅŅŅŅ ĐˇĐŊаŅи вŅŅ ŅŅ ŅŅŅĐžŅиŅĐŊŅ Đ´ĐĩŅаĐģŅ. đ
diff --git a/docs/uk/docs/tutorial/security/index.md b/docs/uk/docs/tutorial/security/index.md
new file mode 100644
index 000000000..c3d94be8d
--- /dev/null
+++ b/docs/uk/docs/tutorial/security/index.md
@@ -0,0 +1,104 @@
+# ĐĐĩСĐŋĐĩĐēа
+
+ĐŅĐŊŅŅ ĐąĐ°ĐŗĐ°ŅĐž ŅĐŋĐžŅОйŅв ŅĐĩаĐģŅСŅваŅи ĐąĐĩСĐŋĐĩĐēŅ, авŅĐĩĐŊŅиŅŅĐēаŅŅŅ Ņа авŅĐžŅиСаŅŅŅ.
+
+ĐĻĐĩ СаСвиŅаК ŅĐēĐģадĐŊа Ņ "ĐŊĐĩĐŋŅĐžŅŅа" ŅĐĩĐŧа.
+
+ĐŖ ĐąĐ°ĐŗĐ°ŅŅĐžŅ
ŅŅĐĩĐšĐŧвОŅĐēаŅ
Ņ ŅиŅŅĐĩĐŧаŅ
СайĐĩСĐŋĐĩŅĐĩĐŊĐŊŅ ĐąĐĩСĐŋĐĩĐēи Ņа авŅĐĩĐŊŅиŅŅĐēаŅŅŅ ĐˇĐ°ĐšĐŧĐ°Ņ Đ˛ĐĩĐģиŅĐĩСĐŊŅ ŅаŅŅиĐŊŅ ĐˇŅŅиĐģŅ Ņ ĐēĐžĐ´Ņ (ŅĐŊĐžĐ´Ņ â ĐŋĐžĐŊад 50% вŅŅĐžĐŗĐž ĐŊаĐŋиŅаĐŊĐžĐŗĐž ĐēОдŅ).
+
+**FastAPI** ĐŊĐ°Đ´Đ°Ņ ĐēŅĐģŅĐēа ŅĐŊŅŅŅŅĐŧĐĩĐŊŅŅв, ŅĐēŅ Đ´ĐžĐŋĐžĐŧĐžĐļŅŅŅ ĐаĐŧ вĐŋĐžŅаŅиŅŅ Đˇ **ĐąĐĩСĐŋĐĩĐēĐžŅ** ĐģĐĩĐŗĐēĐž, ŅвидĐēĐž, ŅŅаĐŊдаŅŅĐŊиĐŧ ŅĐŋĐžŅОйОĐŧ, ĐąĐĩС ĐŊĐĩОйŅ
ŅĐ´ĐŊĐžŅŅŅ Đ˛Đ¸Đ˛ŅаŅи вŅŅ ŅĐŋĐĩŅиŅŅĐēаŅŅŅ ĐąĐĩСĐŋĐĩĐēи.
+
+ĐĐģĐĩ ŅĐŋĐžŅаŅĐēŅ â ĐēŅĐģŅĐēа ĐēĐžŅĐžŅĐēиŅ
ĐŋĐžĐŊŅŅŅ.
+
+## ĐĐžŅĐŋŅŅаŅŅĐĩ?
+
+Đ¯ĐēŅĐž ĐаĐŧ ĐŊĐĩ ŅŅĐēĐ°Đ˛Ņ Đ˛ŅŅ ŅŅ ŅĐĩŅĐŧŅĐŊи Đš ĐŋŅĐžŅŅĐž ĐŋĐžŅŅŅĐąĐŊĐž *ŅвидĐēĐž* дОдаŅи авŅĐĩĐŊŅиŅŅĐēаŅŅŅ ĐˇĐ° ĐģĐžĐŗŅĐŊĐžĐŧ Ņ ĐŋаŅĐžĐģĐĩĐŧ â ĐŋĐĩŅĐĩŅ
ОдŅŅĐĩ Đ´Đž ĐŊаŅŅŅĐŋĐŊиŅ
ŅОСдŅĐģŅв.
+
+## OAuth2
+
+OAuth2 â ŅĐĩ ŅĐŋĐĩŅиŅŅĐēаŅŅŅ, ŅĐž ĐžĐŋиŅŅŅ ĐēŅĐģŅĐēа ŅĐŋĐžŅОйŅв ОйŅОйĐēи авŅĐĩĐŊŅиŅŅĐēаŅŅŅ Ņа авŅĐžŅиСаŅŅŅ.
+
+ĐĻĐĩ Đ´ĐžŅиŅŅ ĐžĐą'ŅĐŧĐŊа ŅĐŋĐĩŅиŅŅĐēаŅŅŅ, ŅĐēа ĐžŅ
ĐžĐŋĐģŅŅ ŅĐēĐģадĐŊŅ Đ˛Đ¸ĐŋадĐēи виĐēĐžŅиŅŅаĐŊĐŊŅ.
+
+ĐĐžĐŊа вĐēĐģŅŅĐ°Ņ ŅĐŋĐžŅОйи авŅĐĩĐŊŅиŅŅĐēаŅŅŅ ŅĐĩŅĐĩС "ŅŅĐĩŅŅ ŅŅĐžŅĐžĐŊŅ".
+
+ХаĐŧĐĩ ŅĐĩ ĐģĐĩĐļиŅŅ Đ˛ ĐžŅĐŊĐžĐ˛Ņ "вŅ
ĐžĐ´Ņ ŅĐĩŅĐĩС Google, Facebook, X (Twitter), GitHub" ŅĐžŅĐž.
+
+### OAuth 1
+
+РаĐŊŅŅĐĩ ŅŅĐŊŅвав OAuth 1, ŅĐēиК СĐŊаŅĐŊĐž вŅĐ´ŅŅСĐŊŅŅŅŅŅŅ Đ˛ŅĐ´ OAuth2 Ņ Ņ ŅĐēĐģадĐŊŅŅиĐŧ, ĐžŅĐēŅĐģŅĐēи ĐŧŅŅŅив ŅĐŋĐĩŅиŅŅĐēаŅŅŅ Đ´ĐģŅ ŅиŅŅŅваĐŊĐŊŅ ĐēĐžĐŧŅĐŊŅĐēаŅŅĐš.
+
+ĐаŅаС ĐŧаКĐļĐĩ ĐŊĐĩ виĐēĐžŅиŅŅОвŅŅŅŅŅŅ.
+
+OAuth2 ĐŊĐĩ вĐēаСŅŅ, ŅĐē ŅаĐŧĐĩ ŅиŅŅŅваŅи С'ŅĐ´ĐŊаĐŊĐŊŅ â вОĐŊĐž ĐžŅŅĐēŅŅ, ŅĐž Đ˛Đ°Ņ ĐˇĐ°ŅŅĐžŅŅĐŊĐžĐē ĐŋŅаŅŅŅ ŅĐĩŅĐĩС HTTPS.
+
+/// tip | ĐĐžŅада
+
+ĐŖ ŅОСдŅĐģŅ ĐŋŅĐž **Đ´ĐĩĐŋĐģОК** Đи ĐŋОйаŅиŅĐĩ, ŅĐē ĐŊаĐģаŅŅŅваŅи HTTPS ĐąĐĩСĐēĐžŅŅОвĐŊĐž С Traefik Ņа Let's Encrypt.
+
+///
+
+## OpenID Connect
+
+OpenID Connect â ŅĐĩ ОдĐŊа ŅĐŋĐĩŅиŅŅĐēаŅŅŅ, ĐŋОйŅдОваĐŊа ĐŊа ĐžŅĐŊĐžĐ˛Ņ **OAuth2**.
+
+ĐĐžĐŊа ŅОСŅиŅŅŅ OAuth2, ŅŅĐžŅĐŊŅŅŅи Đ´ĐĩŅĐēŅ ĐŊĐĩОдĐŊОСĐŊаŅĐŊĐžŅŅŅ Đ´ĐģŅ Đ´ĐžŅŅĐŗĐŊĐĩĐŊĐŊŅ ĐēŅаŅĐžŅ ŅŅĐŧŅŅĐŊĐžŅŅŅ.
+
+ĐаĐŋŅиĐēĐģад, вŅ
ŅĐ´ ŅĐĩŅĐĩС Google виĐēĐžŅиŅŅОвŅŅ OpenID Connect (ŅĐēиК йаСŅŅŅŅŅŅ ĐŊа OAuth2).
+
+ĐĐģĐĩ вŅ
ŅĐ´ ŅĐĩŅĐĩС Facebook â ĐŊŅ. ĐŅĐŊ ĐŧĐ°Ņ Đ˛ĐģаŅĐŊŅ ŅĐĩаĐģŅСаŅŅŅ ĐŊа ĐąĐ°ĐˇŅ OAuth2.
+
+### OpenID (ĐŊĐĩ "OpenID Connect")
+
+ĐŅĐŊŅваĐģа ŅаĐēĐžĐļ ŅĐŋĐĩŅиŅŅĐēаŅŅŅ "OpenID", ŅĐēа ĐŊаĐŧĐ°ĐŗĐ°ĐģаŅŅ ŅОСвĘŧŅСаŅи ŅŅ ŅаĐŧŅ ĐˇĐ°Đ´Đ°ŅŅ, ŅĐž Đš **OpenID Connect**, аĐģĐĩ ĐŊĐĩ йаСŅваĐģаŅŅ ĐŊа OAuth2.
+
+ĐĻĐĩ ĐąŅĐģа СОвŅŅĐŧ ŅĐŊŅа ŅиŅŅĐĩĐŧа, Ņ ŅŅĐžĐŗĐžĐ´ĐŊŅ Đ˛ĐžĐŊа ĐŧаКĐļĐĩ ĐŊĐĩ виĐēĐžŅиŅŅОвŅŅŅŅŅŅ.
+
+## OpenAPI
+
+OpenAPI (ŅаĐŊŅŅĐĩ Swagger) â ŅĐĩ ŅĐŋĐĩŅиŅŅĐēаŅŅŅ Đ´ĐģŅ ĐŋОйŅдОви API (ŅĐĩĐŋĐĩŅ ĐŋŅĐ´ ĐĩĐŗŅĐ´ĐžŅ Linux Foundation).
+
+**FastAPI** йаСŅŅŅŅŅŅ ĐŊа **OpenAPI**.
+
+ĐавдŅĐēи ŅŅĐžĐŧŅ Đи ĐžŅŅиĐŧŅŅŅĐĩ авŅĐžĐŧаŅиŅĐŊŅ ŅĐŊŅĐĩŅаĐēŅивĐŊŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ, ĐŗĐĩĐŊĐĩŅаŅŅŅ ĐēĐžĐ´Ņ Ņа ĐąĐ°ĐŗĐ°ŅĐž ŅĐŊŅĐžĐŗĐž.
+
+OpenAPI дОСвОĐģŅŅ ĐžĐŋиŅŅваŅи ŅŅСĐŊŅ "ŅŅ
ĐĩĐŧи" ĐąĐĩСĐŋĐĩĐēи.
+
+ĐиĐēĐžŅиŅŅОвŅŅŅи ŅŅ
, Đи ĐŧĐžĐļĐĩŅĐĩ ŅĐēĐžŅиŅŅаŅиŅŅ Đ˛ŅŅĐŧа ŅиĐŧи ŅĐŊŅŅŅŅĐŧĐĩĐŊŅаĐŧи, ŅĐž йаСŅŅŅŅŅŅ ĐŊа ŅŅаĐŊдаŅŅаŅ
, СОĐēŅĐĩĐŧа ŅĐŊŅĐĩŅаĐēŅивĐŊиĐŧи ŅиŅŅĐĩĐŧаĐŧи Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ.
+
+OpenAPI виСĐŊаŅĐ°Ņ ŅаĐēŅ ŅŅ
ĐĩĐŧи ĐąĐĩСĐŋĐĩĐēи:
+
+* `apiKey`: ŅĐŋĐĩŅиŅŅŅĐŊиК Đ´ĐģŅ ĐˇĐ°ŅŅĐžŅŅĐŊĐēŅ ĐēĐģŅŅ, ŅĐēиК ĐŧĐžĐļĐĩ ĐŋĐĩŅĐĩдаваŅиŅŅ ŅĐĩŅĐĩС:
+ * ĐаŅаĐŧĐĩŅŅ ĐˇĐ°ĐŋиŅŅ.
+ * ĐĐ°ĐŗĐžĐģОвОĐē.
+ * Cookie.
+* `http`: ŅŅаĐŊдаŅŅĐŊŅ ĐŧĐĩŅОди HTTP-авŅĐĩĐŊŅиŅŅĐēаŅŅŅ, вĐēĐģŅŅаŅŅи:
+ * `bearer`: ĐˇĐ°ĐŗĐžĐģОвОĐē `Authorization` ĐˇŅ ĐˇĐŊаŅĐĩĐŊĐŊŅĐŧ `Bearer` Ņа ŅĐžĐēĐĩĐŊĐžĐŧ. ĐĻĐĩ ŅŅĐŋадĐēОваĐŊĐž С OAuth2.
+ * HTTP Basic авŅĐĩĐŊŅиŅŅĐēаŅŅŅ
+ * HTTP Digest, ŅĐžŅĐž.
+* `oauth2`: ŅŅŅ ŅĐŋĐžŅОйи ОйŅОйĐēи ĐąĐĩСĐŋĐĩĐēи Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ OAuth2 (ŅаĐē СваĐŊŅ ÂĢĐŋĐžŅĐžĐēиÂģ).
+ * ĐĐĩŅĐēŅ Đˇ ŅиŅ
ĐŋĐžŅĐžĐēŅв ĐŋŅĐ´Ņ
ОдŅŅŅ Đ´ĐģŅ ŅŅвОŅĐĩĐŊĐŊŅ Đ˛ĐģаŅĐŊĐžĐŗĐž ĐŋŅОваКдĐĩŅа авŅĐĩĐŊŅиŅŅĐēаŅŅŅ OAuth 2.0 (ĐŊаĐŋŅиĐēĐģад, Google, Facebook, X (Twitter), GitHub ŅĐžŅĐž):
+ * `implicit`â ĐŊĐĩŅвĐŊиК
+ * `clientCredentials`â ОйĐģŅĐēĐžĐ˛Ņ Đ´Đ°ĐŊŅ ĐēĐģŅŅĐŊŅа
+ * `authorizationCode` â ĐēОд авŅĐžŅиСаŅŅŅ
+ * ĐĐģĐĩ Ņ ĐžĐ´Đ¸ĐŊ ĐžĐēŅĐĩĐŧиК ÂĢĐŋĐžŅŅĐēÂģ, ŅĐēиК ŅĐ´ĐĩаĐģŅĐŊĐž ĐŋŅĐ´Ņ
ОдиŅŅ Đ´ĐģŅ ŅĐĩаĐģŅСаŅŅŅ Đ°Đ˛ŅĐĩĐŊŅиŅŅĐēаŅŅŅ Đ˛ŅĐĩŅĐĩдиĐŊŅ ĐžĐ´ĐŊĐžĐŗĐž дОдаŅĐēŅ:
+ * `password`: Ņ ĐŊаŅŅŅĐŋĐŊиŅ
ŅОСдŅĐģаŅ
ĐąŅĐ´Đĩ ĐŋŅиĐēĐģад виĐēĐžŅиŅŅаĐŊĐŊŅ ŅŅĐžĐŗĐž ĐŋĐžŅĐžĐēŅ.
+* `openIdConnect`: дОСвОĐģŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐŊĐž виŅвĐģŅŅи ĐŋаŅаĐŧĐĩŅŅи авŅĐĩĐŊŅиŅŅĐēаŅŅŅ OAuth2.
+ * ĐĻĐĩ авŅĐžĐŧаŅиŅĐŊĐĩ виŅвĐģĐĩĐŊĐŊŅ Đ˛Đ¸ĐˇĐŊаŅаŅŅŅŅŅ Ņ ŅĐŋĐĩŅиŅŅĐēаŅŅŅ OpenID Connect.
+
+
+/// tip | ĐĐžŅада
+
+ĐĐŊŅĐĩĐŗŅаŅŅŅ ŅĐŊŅиŅ
ĐŋŅОваКдĐĩŅŅв авŅĐĩĐŊŅиŅŅĐēаŅŅŅ/авŅĐžŅиСаŅŅŅ, ŅаĐēиŅ
ŅĐē Google, Facebook, X (Twitter), GitHub ŅĐžŅĐž â ŅаĐēĐžĐļ ĐŧĐžĐļĐģива Ņ Đ˛ŅĐ´ĐŊĐžŅĐŊĐž ĐŋŅĐžŅŅа.
+
+ĐаКŅĐēĐģадĐŊŅŅĐĩ â ŅĐĩ ŅŅвОŅиŅи вĐģаŅĐŊĐžĐŗĐž ĐŋŅОваКдĐĩŅа авŅĐĩĐŊŅиŅŅĐēаŅŅŅ/авŅĐžŅиСаŅŅŅ, ŅĐē Google Ņи Facebook. ĐĐģĐĩ **FastAPI** ĐŊĐ°Đ´Đ°Ņ ĐаĐŧ ŅĐŊŅŅŅŅĐŧĐĩĐŊŅи, ŅОй СŅОйиŅи ŅĐĩ ĐģĐĩĐŗĐēĐž, ĐąĐĩŅŅŅи ĐŊа ŅĐĩĐąĐĩ ваĐļĐēŅ ŅаŅŅиĐŊŅ ŅОйОŅи.
+
+///
+
+## ĐĐŊŅŅŅŅĐŧĐĩĐŊŅи **FastAPI**
+
+FastAPI ĐŊĐ°Đ´Đ°Ņ ĐēŅĐģŅĐēа ŅĐŊŅŅŅŅĐŧĐĩĐŊŅŅв Đ´ĐģŅ ĐēĐžĐļĐŊĐžŅ Đˇ ĐžĐŋиŅаĐŊиŅ
ŅŅ
ĐĩĐŧ ĐąĐĩСĐŋĐĩĐēи в ĐŧОдŅĐģŅ `fastapi.security`, ŅĐēŅ ŅĐŋŅĐžŅŅŅŅŅ Đ˛Đ¸ĐēĐžŅиŅŅаĐŊĐŊŅ ŅиŅ
ĐŧĐĩŅ
аĐŊŅСĐŧŅв СаŅ
иŅŅŅ.
+
+ĐŖ ĐŊаŅŅŅĐŋĐŊиŅ
ŅОСдŅĐģаŅ
Đи ĐŋОйаŅиŅĐĩ, ŅĐē дОдаŅи ĐąĐĩСĐŋĐĩĐēŅ Đ´Đž ŅĐ˛ĐžĐŗĐž API Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ ŅиŅ
ŅĐŊŅŅŅŅĐŧĐĩĐŊŅŅв **FastAPI**.
+
+Đ ŅаĐēĐžĐļ ĐŋОйаŅиŅĐĩ, ŅĐē вОĐŊа авŅĐžĐŧаŅиŅĐŊĐž ŅĐŊŅĐĩĐŗŅŅŅŅŅŅŅ Đ˛ ŅĐŊŅĐĩŅаĐēŅивĐŊŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ Đ˛Đ°ŅĐžĐŗĐž API.
diff --git a/docs/uk/docs/tutorial/static-files.md b/docs/uk/docs/tutorial/static-files.md
new file mode 100644
index 000000000..a84782d8f
--- /dev/null
+++ b/docs/uk/docs/tutorial/static-files.md
@@ -0,0 +1,40 @@
+# ĐĄŅаŅиŅĐŊŅ ŅаКĐģи
+
+Đи ĐŧĐžĐļĐĩŅĐĩ авŅĐžĐŧаŅиŅĐŊĐž ĐŊадаваŅи ŅŅаŅиŅĐŊŅ ŅаКĐģи С ĐēаŅаĐģĐžĐŗŅ, виĐēĐžŅиŅŅОвŅŅŅи `StaticFiles`.
+
+## ĐиĐēĐžŅиŅŅаĐŊĐŊŅ `StaticFiles`
+
+* ĐĐŧĐŋĐžŅŅŅĐšŅĐĩ `StaticFiles`.
+* "ĐŅĐ´'ŅĐ´ĐŊаŅи" ĐĩĐēСĐĩĐŧĐŋĐģŅŅ `StaticFiles()` С вĐēаСаĐŊĐŊŅĐŧ ĐŊĐĩОйŅ
ŅĐ´ĐŊĐžĐŗĐž ŅĐģŅŅ
Ņ.
+
+{* ../../docs_src/static_files/tutorial001.py hl[2,6] *}
+
+/// note | ĐĸĐĩŅ
ĐŊŅŅĐŊŅ Đ´ĐĩŅаĐģŅ
+
+Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи `from starlette.staticfiles import StaticFiles`.
+
+**FastAPI** ĐŊĐ°Đ´Đ°Ņ ŅОК ŅаĐŧиК `starlette.staticfiles`, ŅĐž Đš `fastapi.staticfiles` Đ´ĐģŅ ĐˇŅŅŅĐŊĐžŅŅŅ ŅОСŅОйĐŊиĐēŅв. ĐĐģĐĩ ŅаĐēŅиŅĐŊĐž вŅĐŊ ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž ĐŋĐžŅ
ОдиŅŅ ŅС Starlette.
+
+///
+
+### ĐŠĐž ŅаĐēĐĩ "ĐŅĐ´'ŅĐ´ĐŊаĐŊĐŊŅ"
+
+"ĐŅĐ´'ŅĐ´ĐŊаĐŊĐŊŅ" ОСĐŊаŅĐ°Ņ Đ´ĐžĐ´Đ°Đ˛Đ°ĐŊĐŊŅ ĐŋОвĐŊĐžŅŅĐŊĐŊĐžĐŗĐž "ĐŊĐĩСаĐģĐĩĐļĐŊĐžĐŗĐž" СаŅŅĐžŅŅĐŊĐēŅ ĐˇĐ° ĐŋĐĩвĐŊиĐŧ ŅĐģŅŅ
ĐžĐŧ, ŅĐēиК ĐŋĐžŅŅĐŧ ОйŅОйĐģŅŅ Đ˛ŅŅ ĐŋŅĐ´ ŅĐģŅŅ
и.
+
+ĐĻĐĩ вŅĐ´ŅŅСĐŊŅŅŅŅŅŅ Đ˛ŅĐ´ виĐēĐžŅиŅŅаĐŊĐŊŅ `APIRouter`, ĐžŅĐēŅĐģŅĐēи ĐŋŅĐ´'ŅĐ´ĐŊаĐŊиК СаŅŅĐžŅŅĐŊĐžĐē Ņ ĐŋОвĐŊŅŅŅŅ ĐŊĐĩСаĐģĐĩĐļĐŊиĐŧ. OpenAPI Ņа Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ Đ˛Đ°ŅĐžĐŗĐž ĐžŅĐŊОвĐŊĐžĐŗĐž СаŅŅĐžŅŅĐŊĐēŅ ĐŊĐĩ ĐąŅĐ´ŅŅŅ ĐˇĐŊаŅи ĐŊŅŅĐžĐŗĐž ĐŋŅĐž Đ˛Đ°Ņ ĐŋŅĐ´'ŅĐ´ĐŊаĐŊиК СаŅŅĐžŅŅĐŊĐžĐē.
+
+Đи ĐŧĐžĐļĐĩŅĐĩ Đ´ŅСĐŊаŅиŅŅ ĐąŅĐģŅŅĐĩ ĐŋŅĐž ŅĐĩ в [ĐĐžŅŅĐąĐŊиĐēŅ Đ´ĐģŅ ĐŋŅĐžŅŅĐŊŅŅиŅ
ĐēĐžŅиŅŅŅваŅŅв](../advanced/index.md){.internal-link target=_blank}.
+
+## ĐĐĩŅаĐģŅ
+
+ĐĐĩŅŅĐĩ `"/static"` вĐēаСŅŅ ĐŊа ĐŋŅĐ´ ŅĐģŅŅ
, Са ŅĐēиĐŧ ĐąŅĐ´Đĩ "ĐŋŅĐ´'ŅĐ´ĐŊаĐŊĐž" ŅĐĩĐš ĐŊОвиК "СаŅŅĐžŅŅĐŊĐžĐē". ĐĸĐžĐŧŅ ĐąŅĐ´Ņ-ŅĐēиК ŅĐģŅŅ
, ŅĐēиК ĐŋĐžŅиĐŊаŅŅŅŅŅ Đˇ `"/static"`, ĐąŅĐ´Đĩ ОйŅОйĐģŅŅиŅŅ ĐŊиĐŧ.
+
+`directory="static"` виСĐŊаŅĐ°Ņ ĐēаŅаĐģĐžĐŗ, ŅĐž ĐŧŅŅŅиŅŅ Đ˛Đ°ŅŅ ŅŅаŅиŅĐŊŅ ŅаКĐģи.
+
+`name="static"` ŅĐĩ ŅĐŧ'Ņ, ŅĐēĐĩ ĐŧĐžĐļĐŊа виĐēĐžŅиŅŅОвŅваŅи вŅĐĩŅĐĩдиĐŊŅ **FastAPI**.
+
+ĐŖŅŅ ŅŅ ĐŋаŅаĐŧĐĩŅŅи ĐŧĐžĐļŅŅŅ ĐąŅŅи СĐŧŅĐŊĐĩĐŊŅ Đ˛ŅĐ´ĐŋОвŅĐ´ĐŊĐž Đ´Đž ĐŋĐžŅŅĐĩĐą Ņ ĐžŅОйĐģивОŅŅĐĩĐš ваŅĐžĐŗĐž СаŅŅĐžŅŅĐŊĐēŅ.
+
+## ĐОдаŅĐēОва ŅĐŊŅĐžŅĐŧаŅŅŅ
+
+ĐĐĩŅаĐģŅĐŊŅŅĐĩ ĐŋŅĐž ĐŊаĐģаŅŅŅваĐŊĐŊŅ Ņа ĐŧĐžĐļĐģивОŅŅŅ ĐŧĐžĐļĐŊа Đ´ŅСĐŊаŅиŅŅ Đ˛ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ Starlette ĐŋŅĐž ŅŅаŅиŅĐŊŅ ŅаКĐģи .
diff --git a/docs/uk/docs/tutorial/testing.md b/docs/uk/docs/tutorial/testing.md
new file mode 100644
index 000000000..25fc370d6
--- /dev/null
+++ b/docs/uk/docs/tutorial/testing.md
@@ -0,0 +1,240 @@
+# ĐĸĐĩŅŅŅваĐŊĐŊŅ
+
+ĐĸĐĩŅŅŅваĐŊĐŊŅ **FastAPI** дОдаŅĐēŅв Ņ ĐŋŅĐžŅŅиĐŧ Ņа ĐĩŅĐĩĐēŅивĐŊиĐŧ СавдŅĐēи ĐąŅĐąĐģŅĐžŅĐĩŅŅ Starlette , ŅĐēа йаСŅŅŅŅŅŅ ĐŊа HTTPX .
+ĐŅĐēŅĐģŅĐēи HTTPX ŅОСŅОйĐģĐĩĐŊиК ĐŊа ĐžŅĐŊĐžĐ˛Ņ Requests, ĐšĐžĐŗĐž API Ņ ŅĐŊŅŅŅŅивĐŊĐž СŅОСŅĐŧŅĐģиĐŧ Đ´ĐģŅ ŅиŅ
, Ņ
ŅĐž вĐļĐĩ СĐŊаКОĐŧиК С Requests.
+
+Đ ĐšĐžĐŗĐž Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи pytest ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž С **FastAPI**.
+
+## ĐиĐēĐžŅиŅŅаĐŊĐŊŅ `TestClient`
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+ЊОй виĐēĐžŅиŅŅОвŅваŅи `TestClient`, ŅĐŋĐžŅаŅĐēŅ Đ˛ŅŅаĐŊОвŅŅŅ `httpx` .
+
+ĐĐĩŅĐĩĐēĐžĐŊаКŅĐĩŅŅ, ŅĐž Đи ŅŅвОŅиĐģи [вŅŅŅŅаĐģŅĐŊĐĩ ŅĐĩŅĐĩдОвиŅĐĩ](../virtual-environments.md){.internal-link target=_blank}, аĐēŅивŅваĐģи ĐšĐžĐŗĐž, а ĐŋĐžŅŅĐŧ вŅŅаĐŊОвиĐģи ŅаĐŧŅ ĐąŅĐąĐģŅĐžŅĐĩĐēŅ, ĐŊаĐŋŅиĐēĐģад:
+
+```console
+$ pip install httpx
+```
+
+///
+
+ĐĐŧĐŋĐžŅŅŅĐšŅĐĩ `TestClient`.
+
+ĐĄŅвОŅŅŅŅ `TestClient`, ĐŋĐĩŅĐĩдавŅи КОĐŧŅ ĐĐ°Ņ ĐˇĐ°ŅŅĐžŅŅĐŊĐžĐē **FastAPI**.
+
+ĐĄŅвОŅŅĐšŅĐĩ ŅŅĐŊĐēŅŅŅ Đˇ ŅĐŧĐĩĐŊаĐŧи, ŅĐž ĐŋĐžŅиĐŊаŅŅŅŅŅ Đˇ `test_` (ŅĐĩ ŅŅаĐŊдаŅŅĐŊа ŅĐŗĐžĐ´Đ° Đ´ĐģŅ `pytest`).
+
+ĐиĐēĐžŅиŅŅОвŅĐšŅĐĩ Ой'ŅĐēŅ `TestClient` ŅаĐē ŅаĐŧĐž ŅĐē Ņ `httpx`.
+
+ĐаĐŋиŅŅĐšŅĐĩ ĐŋŅĐžŅŅŅ `assert`-виŅаСи ĐˇŅ ŅŅаĐŊдаŅŅĐŊиĐŧи виŅаСаĐŧи Python, ŅĐēŅ ĐŋĐžŅŅŅĐąĐŊĐž ĐŋĐĩŅĐĩвŅŅиŅи (ŅĐĩ ŅаĐēĐžĐļ ŅŅаĐŊдаŅŅ Đ´ĐģŅ `pytest`).
+
+{* ../../docs_src/app_testing/tutorial001.py hl[2,12,15:18] *}
+
+
+/// tip | ĐĐžŅада
+
+ĐвĐĩŅĐŊŅŅŅ ŅĐ˛Đ°ĐŗŅ, ŅĐž ŅĐĩŅŅĐžĐ˛Ņ ŅŅĐŊĐēŅŅŅ â ŅĐĩ СвиŅаКĐŊŅ `def`, а ĐŊĐĩ `async def`.
+
+ĐиĐēĐģиĐēи ĐēĐģŅŅĐŊŅа ŅаĐēĐžĐļ СвиŅаКĐŊŅ, ĐąĐĩС виĐēĐžŅиŅŅаĐŊĐŊŅ `await`.
+
+ĐĻĐĩ дОСвОĐģŅŅ Đ˛Đ¸ĐēĐžŅиŅŅОвŅваŅи `pytest` ĐąĐĩС СаКвиŅ
ŅŅĐēĐģадĐŊĐĩĐŊŅ.
+
+///
+
+/// note | ĐĸĐĩŅ
ĐŊŅŅĐŊŅ Đ´ĐĩŅаĐģŅ
+
+Đи ŅаĐēĐžĐļ ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи `from starlette.testclient import TestClient`.
+
+**FastAPI** ĐŊĐ°Đ´Đ°Ņ ŅОК ŅаĐŧиК `starlette.testclient` ĐŋŅĐ´ ĐŊĐ°ĐˇĐ˛ĐžŅ `fastapi.testclient` Đ´ĐģŅ ĐˇŅŅŅĐŊĐžŅŅŅ ŅОСŅОйĐŊиĐēŅв, аĐģĐĩ вŅĐŊ ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž ĐŋĐžŅ
ОдиŅŅ ŅС Starlette.
+
+///
+
+/// tip | ĐĐžŅада
+
+Đ¯ĐēŅĐž ĐаĐŧ ĐŋĐžŅŅŅĐąĐŊĐž виĐēĐģиĐēаŅи `async`-ŅŅĐŊĐēŅŅŅ Ņ Đ˛Đ°ŅиŅ
ŅĐĩŅŅаŅ
, ĐžĐēŅŅĐŧ вŅĐ´ĐŋŅавĐģĐĩĐŊĐŊŅ ĐˇĐ°ĐŋиŅŅв Đ´Đž FastAPI-СаŅŅĐžŅŅĐŊĐēŅ (ĐŊаĐŋŅиĐēĐģад, аŅиĐŊŅ
ŅĐžĐŊĐŊŅ ŅŅĐŊĐēŅŅŅ ŅОйОŅи С ĐąĐ°ĐˇĐžŅ Đ´Đ°ĐŊиŅ
), ĐŋĐĩŅĐĩĐŗĐģŅĐŊŅŅĐĩ [ĐŅиĐŊŅ
ŅĐžĐŊĐŊŅ ŅĐĩŅŅи](../advanced/async-tests.md){.internal-link target=_blank} Ņ ŅОСŅиŅĐĩĐŊĐžĐŧŅ ĐēĐĩŅŅвĐŊиŅŅвŅ.
+
+///
+
+## РОСдŅĐģĐĩĐŊĐŊŅ ŅĐĩŅŅŅв
+
+ĐŖ ŅĐĩаĐģŅĐŊĐžĐŧŅ ĐˇĐ°ŅŅĐžŅŅĐŊĐēŅ ĐаŅŅ ŅĐĩŅŅи, ĐšĐŧОвŅŅĐŊĐž, ĐąŅĐ´ŅŅŅ Đ˛ ĐžĐēŅĐĩĐŧĐžĐŧŅ ŅаКĐģŅ.
+
+ĐĸаĐēĐžĐļ ĐĐ°Ņ **FastAPI**-СаŅŅĐžŅŅĐŊĐžĐē ĐŧĐžĐļĐĩ ŅĐēĐģадаŅиŅŅ Đˇ ĐēŅĐģŅĐēĐžŅ
ŅаКĐģŅв айО ĐŧОдŅĐģŅв ŅĐžŅĐž.
+
+### ФаКĐģ СаŅŅĐžŅŅĐŊĐēŅ **FastAPI**
+
+ĐŅиĐŋŅŅŅиĐŧĐž, Ņ ĐĐ°Ņ Ņ ŅŅŅŅĐēŅŅŅа ŅаКĐģŅв, ĐžĐŋиŅаĐŊа в ŅОСдŅĐģŅ [ĐŅĐģŅŅŅ ĐˇĐ°ŅŅĐžŅŅĐŊĐēи](bigger-applications.md){.internal-link target=_blank}:
+
+```
+.
+âââ app
+â  âââ __init__.py
+â  âââ main.py
+```
+ĐŖ ŅаКĐģŅ `main.py` СĐŊаŅ
ОдиŅŅŅŅ ĐĐ°Ņ ĐˇĐ°ŅŅĐžŅŅĐŊĐžĐē **FastAPI** :
+
+{* ../../docs_src/app_testing/main.py *}
+
+### ФаКĐģ ŅĐĩŅŅŅваĐŊĐŊŅ
+
+Đи ĐŧĐžĐļĐĩŅĐĩ ŅŅвОŅиŅи ŅаКĐģ `test_main.py` С ĐаŅиĐŧи ŅĐĩŅŅаĐŧи. ĐŅĐŊ ĐŧĐžĐļĐĩ СĐŊаŅ
ОдиŅиŅŅ Đ˛ ŅĐžĐŧŅ Đļ ĐŋаĐēĐĩŅŅ Python (Ņ ŅŅĐš ŅаĐŧŅĐš диŅĐĩĐēŅĐžŅŅŅ Đˇ ŅаКĐģĐžĐŧ `__init__.py`):
+
+
+``` hl_lines="5"
+.
+âââ app
+â  âââ __init__.py
+â  âââ main.py
+â  âââ test_main.py
+```
+
+ĐŅĐēŅĐģŅĐēи ŅĐĩĐš ŅаКĐģ СĐŊаŅ
ОдиŅŅŅŅ Đ˛ ŅĐžĐŧŅ Đļ ĐŋаĐēĐĩŅŅ, Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅОвŅваŅи вŅĐ´ĐŊĐžŅĐŊиК ŅĐŧĐŋĐžŅŅ, ŅОй ŅĐŧĐŋĐžŅŅŅваŅи Ой'ŅĐēŅ `app` ŅС ĐŧОдŅĐģŅ `main` (`main.py`):
+
+{* ../../docs_src/app_testing/test_main.py hl[3] *}
+
+
+...Ņ ĐŊаĐŋиŅаŅи ĐēОд Đ´ĐģŅ ŅĐĩŅŅŅв ŅаĐē ŅаĐŧĐž ŅĐē Ņ ŅаĐŊŅŅĐĩ.
+
+## ĐĸĐĩŅŅŅваĐŊĐŊŅ: ŅОСŅиŅĐĩĐŊиК ĐŋŅиĐēĐģад
+
+ĐĸĐĩĐŋĐĩŅ ŅОСŅиŅиĐŧĐž ŅĐĩĐš ĐŋŅиĐēĐģад Ņ Đ´ĐžĐ´Đ°ĐŧĐž ĐąŅĐģŅŅĐĩ Đ´ĐĩŅаĐģĐĩĐš, ŅОй ĐŋОйаŅиŅи, ŅĐē ŅĐĩŅŅŅваŅи ŅŅСĐŊŅ ŅаŅŅиĐŊи.
+
+### РОСŅиŅĐĩĐŊиК ŅаКĐģ СаŅŅĐžŅŅĐŊĐēŅ **FastAPI**
+
+ĐаĐģиŅиĐŧĐž ŅŅ ŅаĐŧŅ ŅŅŅŅĐēŅŅŅŅ ŅаКĐģŅв:
+
+```
+.
+âââ app
+â  âââ __init__.py
+â  âââ main.py
+â  âââ test_main.py
+```
+
+ĐŅиĐŋŅŅŅиĐŧĐž, ŅĐž ŅĐĩĐŋĐĩŅ ŅаКĐģ `main.py` ŅС ĐаŅиĐŧ **FastAPI**-СаŅŅĐžŅŅĐŊĐēĐžĐŧ ĐŧŅŅŅиŅŅ Đ´ĐžĐ´Đ°ŅĐēĐžĐ˛Ņ ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ (**path operations**).
+
+ĐŅĐŊ ĐŧĐ°Ņ `GET`-ĐžĐŋĐĩŅаŅŅŅ, ŅĐēа ĐŧĐžĐļĐĩ ĐŋОвĐĩŅŅаŅи ĐŋĐžĐŧиĐģĐēŅ.
+
+ĐŅĐŊ ĐŧĐ°Ņ `POST`-ĐžĐŋĐĩŅаŅŅŅ, ŅĐēа ĐŧĐžĐļĐĩ ĐŋОвĐĩŅŅаŅи ĐēŅĐģŅĐēа ĐŋĐžĐŧиĐģĐžĐē.
+
+ĐĐąĐ¸Đ´Đ˛Ņ ĐžĐŋĐĩŅаŅŅŅ ŅĐģŅŅ
Ņ Đ˛Đ¸ĐŧĐ°ĐŗĐ°ŅŅŅ ĐˇĐ°ĐŗĐžĐģОвОĐē `X-Token`.
+
+//// tab | Python 3.10+
+
+```Python
+{!> ../../docs_src/app_testing/app_b_an_py310/main.py!}
+```
+
+////
+
+//// tab | Python 3.9+
+
+```Python
+{!> ../../docs_src/app_testing/app_b_an_py39/main.py!}
+```
+
+////
+
+//// tab | Python 3.8+
+
+```Python
+{!> ../../docs_src/app_testing/app_b_an/main.py!}
+```
+
+////
+
+//// tab | Python 3.10+ non-Annotated
+
+/// tip | ĐĐžŅада
+
+ĐаĐļаĐŊĐž виĐēĐžŅиŅŅОвŅваŅи вĐĩŅŅŅŅ Đˇ `Annotated`, ŅĐēŅĐž ŅĐĩ ĐŧĐžĐļĐģивО
+
+///
+
+```Python
+{!> ../../docs_src/app_testing/app_b_py310/main.py!}
+```
+
+////
+
+//// tab | Python 3.8+ non-Annotated
+
+/// tip | ĐĐžŅада
+
+ĐаĐļаĐŊĐž виĐēĐžŅиŅŅОвŅваŅи вĐĩŅŅŅŅ Đˇ `Annotated`, ŅĐēŅĐž ŅĐĩ ĐŧĐžĐļĐģивО
+
+///
+
+```Python
+{!> ../../docs_src/app_testing/app_b/main.py!}
+```
+
+////
+
+### РОСŅиŅĐĩĐŊиК ŅĐĩŅŅОвиК ŅаКĐģ
+
+ĐĐžŅŅĐŧ Đи ĐŧĐžĐļĐĩŅĐĩ ĐžĐŊОвиŅи `test_main.py`, дОдавŅи ŅОСŅиŅĐĩĐŊŅ ŅĐĩŅŅи:
+
+{* ../../docs_src/app_testing/app_b/test_main.py *}
+
+ĐĐžĐģи ĐаĐŧ ĐŋĐžŅŅŅĐąĐŊĐž ĐŋĐĩŅĐĩдаŅи ĐēĐģŅŅĐŊŅŅ ŅĐŊŅĐžŅĐŧаŅŅŅ Đ˛ СаĐŋиŅŅ, аĐģĐĩ Đи ĐŊĐĩ СĐŊаŅŅĐĩ, ŅĐē ŅĐĩ СŅОйиŅи, Đи ĐŧĐžĐļĐĩŅĐĩ ĐŋĐžŅŅĐēаŅи (ĐŊаĐŋŅиĐēĐģад, Ņ Google) ŅĐŋĐžŅŅĐą ŅĐĩаĐģŅСаŅŅŅ Đ˛ `httpx`, айО ĐŊавŅŅŅ Ņ `requests`, ĐžŅĐēŅĐģŅĐēи HTTPX ŅОСŅОйĐģĐĩĐŊиК ĐŊа ĐžŅĐŊĐžĐ˛Ņ Đ´Đ¸ĐˇĐ°ĐšĐŊŅ Requests.
+
+ĐаĐģŅ Đи ĐŋŅĐžŅŅĐž ĐŋОвŅĐžŅŅŅŅĐĩ ŅŅ Đļ Đ´ŅŅ Ņ Đ˛Đ°ŅиŅ
ŅĐĩŅŅаŅ
.
+
+ĐаĐŋŅиĐēĐģад:
+
+* ЊОй ĐŋĐĩŅĐĩдаŅи *path* айО *query* ĐŋаŅаĐŧĐĩŅŅ, дОдаКŅĐĩ ĐšĐžĐŗĐž ĐąĐĩСĐŋĐžŅĐĩŅĐĩĐ´ĐŊŅĐž Đ´Đž URL.
+* ЊОй ĐŋĐĩŅĐĩдаŅи ŅŅĐģĐž JSON, ĐŋĐĩŅĐĩдаКŅĐĩ Python-Ой'ŅĐēŅ (ĐŊаĐŋŅиĐēĐģад, `dict`) Ņ ĐŋаŅаĐŧĐĩŅŅ `json`.
+* Đ¯ĐēŅĐž ĐŋĐžŅŅŅĐąĐŊĐž ĐŊадŅŅĐģаŅи *Form Data* СаĐŧŅŅŅŅ JSON, виĐēĐžŅиŅŅОвŅĐšŅĐĩ ĐŋаŅаĐŧĐĩŅŅ `data`.
+* ЊОй ĐŋĐĩŅĐĩдаŅи ĐˇĐ°ĐŗĐžĐģОвĐēи *headers*, виĐēĐžŅиŅŅОвŅĐšŅĐĩ `dict` Ņ ĐŋаŅаĐŧĐĩŅŅŅ `headers`.
+* ĐĐģŅ *cookies* виĐēĐžŅиŅŅОвŅĐšŅĐĩ `dict` Ņ ĐŋаŅаĐŧĐĩŅŅŅ `cookies`.
+
+ĐĐžĐēĐģадĐŊŅŅĐĩ ĐŋŅĐž ĐŋĐĩŅĐĩдаŅŅ Đ´Đ°ĐŊиŅ
Ņ ĐąĐĩĐēĐĩĐŊĐ´ (Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ `httpx` айО `TestClient`) ĐŧĐžĐļĐŊа СĐŊаКŅи в Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅŅŅ HTTPX .
+
+/// info | ĐĐŊŅĐžŅĐŧаŅŅŅ
+
+ĐвĐĩŅĐŊŅŅŅ ŅĐ˛Đ°ĐŗŅ, ŅĐž `TestClient` ĐžŅŅиĐŧŅŅ Đ´Đ°ĐŊŅ, ŅĐēŅ ĐŧĐžĐļĐŊа ĐēĐžĐŊвĐĩŅŅŅваŅи в JSON, а ĐŊĐĩ Pydantic-ĐŧОдĐĩĐģŅ.
+Đ¯ĐēŅĐž Ņ ĐĐ°Ņ Ņ Pydantic-ĐŧОдĐĩĐģŅ Ņ ŅĐĩŅŅŅ, Ņ Đи Ņ
ĐžŅĐĩŅĐĩ ĐŋĐĩŅĐĩдаŅи ŅŅ Đ´Đ°ĐŊŅ Đ˛ дОдаŅĐžĐē ĐŋŅĐ´ ŅĐ°Ņ ŅĐĩŅŅŅваĐŊĐŊŅ, Đи ĐŧĐžĐļĐĩŅĐĩ виĐēĐžŅиŅŅаŅи `jsonable_encoder`, ĐžĐŋиŅаĐŊиК Ņ ŅОСдŅĐģŅ [JSON Compatible Encoder](encoder.md){.internal-link target=_blank}.
+
+///
+
+## ĐаĐŋŅŅĐē ŅĐĩŅŅŅв
+
+ĐŅŅĐģŅ ŅŅĐžĐŗĐž ваĐŧ ĐŋĐžŅŅŅĐąĐŊĐž вŅŅаĐŊОвиŅи `pytest`.
+
+ĐĐĩŅĐĩĐēĐžĐŊаКŅĐĩŅŅ, ŅĐž Đи ŅŅвОŅиĐģи [вŅŅŅŅаĐģŅĐŊĐĩ ŅĐĩŅĐĩдОвиŅĐĩ]{.internal-link target=_blank}, аĐēŅивŅваĐģи ĐšĐžĐŗĐž Ņ Đ˛ŅŅаĐŊОвиĐģи ĐŊĐĩОйŅ
ŅĐ´ĐŊŅ ĐŋаĐēĐĩŅи, ĐŊаĐŋŅиĐēĐģад:
+
+
+
+```console
+$ pip install pytest
+
+---> 100%
+```
+
+
+
+`pytest` авŅĐžĐŧаŅиŅĐŊĐž СĐŊаКдĐĩ ŅаКĐģи С ŅĐĩŅŅаĐŧи, виĐēĐžĐŊĐ°Ņ ŅŅ
Ņ ĐŊадаŅŅŅ Đ˛Đ°Đŧ ŅĐĩСŅĐģŅŅаŅи.
+
+ĐаĐŋŅŅŅŅŅŅ ŅĐĩŅŅи Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅ:
+
+
+
+```console
+$ pytest
+
+================ test session starts ================
+platform linux -- Python 3.6.9, pytest-5.3.5, py-1.8.1, pluggy-0.13.1
+rootdir: /home/user/code/superawesome-cli/app
+plugins: forked-1.1.3, xdist-1.31.0, cov-2.8.1
+collected 6 items
+
+---> 100%
+
+test_main.py ...... [100%]
+
+================= 1 passed in 0.03s =================
+```
+
+
diff --git a/docs/vi/docs/deployment/cloud.md b/docs/vi/docs/deployment/cloud.md
new file mode 100644
index 000000000..9ab72769d
--- /dev/null
+++ b/docs/vi/docs/deployment/cloud.md
@@ -0,0 +1,17 @@
+# Triáģn khai FastAPI trÃĒn cÃĄc Dáģch váģĨ Cloud
+
+BáēĄn cÃŗ tháģ sáģ dáģĨng **báēĨt káģŗ nhà cung cáēĨp dáģch váģĨ cloud** nà o Äáģ triáģn khai áģŠng dáģĨng FastAPI cáģ§a mÃŦnh.
+
+Trong háē§u háēŋt cÃĄc trưáģng háģŖp, cÃĄc nhà cung cáēĨp dáģch váģĨ cloud láģn Äáģu cÃŗ hưáģng dáēĢn triáģn khai FastAPI váģi háģ.
+
+## Nhà cung cáēĨp dáģch váģĨ Cloud - Nhà tà i tráģŖ
+Máģt và i nhà cung cáēĨp dáģch váģĨ cloud ⨠[**tà i tráģŖ cho FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} â¨, Äiáģu nà y giÃēp ÄáēŖm báēŖo sáģą phÃĄt triáģn liÃĒn táģĨc và kháģe máēĄnh cáģ§a FastAPI và háģ sinh thÃĄi cáģ§a nÃŗ.
+
+ThÃĒm náģ¯a, Äiáģu nà y cÅŠng tháģ hiáģn cam káēŋt tháģąc sáģą cáģ§a háģ Äáģi váģi FastAPI và **cáģng Äáģng ngưáģi dÚng** (báēĄn), vÃŦ háģ không cháģ muáģn cung cáēĨp cho báēĄn máģt **dáģch váģĨ táģt** mà cÃ˛n muáģn ÄáēŖm báēŖo ráēąng báēĄn cÃŗ máģt **framework táģt và báģn váģ¯ng**, ÄÃŗ chÃnh là FastAPI. đ
+
+BáēĄn cÃŗ tháģ tháģ cÃĄc dáģch váģĨ cáģ§a háģ và là m theo hưáģng dáēĢn cáģ§a háģ:
+
+* Platform.sh
+* Porter
+* Coherence
+* Render
diff --git a/docs/vi/docs/deployment/index.md b/docs/vi/docs/deployment/index.md
new file mode 100644
index 000000000..24ffdc71b
--- /dev/null
+++ b/docs/vi/docs/deployment/index.md
@@ -0,0 +1,21 @@
+# Triáģn khai
+
+Triáģn khai máģt áģŠng dáģĨng **FastAPI** khÃĄ dáģ
dà ng.
+
+## Triáģn khai là gÃŦ
+
+Triáģn khai máģt áģŠng dáģĨng cÃŗ nghÄŠa là tháģąc hiáģn cÃĄc bưáģc cáē§n thiáēŋt Äáģ là m cho nÃŗ **sáēĩn sà ng pháģĨc váģĨ ngưáģi dÚng**.
+
+Äáģi váģi máģt **API web**, Äiáģu nà y cÃŗ nghÄŠa là Äáēˇt nÃŗ trong máģt **mÃĄy cháģ§ táģĢ xa**, váģi máģt **chÆ°ÆĄng trÃŦnh mÃĄy cháģ§** cung cáēĨp hiáģu suáēĨt táģt, áģn Äáģnh, v.v., Äáģ ngưáģi dÚng cáģ§a báēĄn cÃŗ tháģ truy cáēp áģŠng dáģĨng cáģ§a báēĄn máģt cÃĄch hiáģu quáēŖ và không báģ giÃĄn ÄoáēĄn hoáēˇc gáēˇp váēĨn Äáģ.
+
+Äiáģu nà y trÃĄi ngưáģŖc váģi cÃĄc **giai ÄoáēĄn phÃĄt triáģn**, trong ÄÃŗ báēĄn liÃĒn táģĨc thay Äáģi mÃŖ, phÃĄ váģĄ nÃŗ và sáģa nÃŗ, ngáģĢng và kháģi Äáģng láēĄi mÃĄy cháģ§ phÃĄt triáģn, v.v.
+
+## CÃĄc Chiáēŋn lưáģŖc Triáģn khai
+
+CÃŗ nhiáģu cÃĄch Äáģ triáģn khai áģŠng dáģĨng cáģ§a báēĄn tÚy thuáģc và o trưáģng háģŖp sáģ dáģĨng cáģ§a báēĄn và cÃĄc công cáģĨ mà báēĄn sáģ dáģĨng.
+
+BáēĄn cÃŗ tháģ **triáģn khai máģt mÃĄy cháģ§** cáģ§a riÃĒng báēĄn báēąng cÃĄch sáģ dáģĨng máģt sáģą káēŋt háģŖp cÃĄc công cáģĨ, hoáēˇc báēĄn cÃŗ tháģ sáģ dáģĨng máģt **dáģch váģĨ cloud** Äáģ là m máģt sáģ công viáģc cho báēĄn, hoáēˇc cÃĄc tÚy cháģn khÃĄc.
+
+Tôi sáēŊ cháģ ra máģt sáģ khÃĄi niáģm chÃnh cáē§n thiáēŋt khi triáģn khai máģt áģŠng dáģĨng **FastAPI** (máēˇc dÚ háē§u háēŋt nÃŗ ÃĄp dáģĨng cho báēĨt káģŗ loáēĄi áģŠng dáģĨng web nà o).
+
+BáēĄn sáēŊ tháēĨy nhiáģu chi tiáēŋt cáē§n thiáēŋt và máģt sáģ káģš thuáēt Äáģ triáģn khai trong cÃĄc pháē§n tiáēŋp theo. â¨
diff --git a/docs/vi/docs/deployment/versions.md b/docs/vi/docs/deployment/versions.md
new file mode 100644
index 000000000..04de393e7
--- /dev/null
+++ b/docs/vi/docs/deployment/versions.md
@@ -0,0 +1,93 @@
+# Váģ cÃĄc phiÃĒn báēŖn cáģ§a FastAPI
+
+**FastAPI** ÄÃŖ ÄÆ°áģŖc sáģ dáģĨng áģ quy mô tháģąc táēŋ (production) trong nhiáģu áģŠng dáģĨng và háģ tháģng. Và pháēĄm vi kiáģm tháģ ÄÆ°áģŖc giáģ¯ áģ máģŠc 100%. Nhưng viáģc phÃĄt triáģn cáģ§a nÃŗ váēĢn Äang diáģ
n ra nhanh chÃŗng.
+
+CÃĄc tÃnh nÄng máģi ÄÆ°áģŖc báģ sung thưáģng xuyÃĒn, láģi ÄÆ°áģŖc sáģa Äáģnh káģŗ, và mÃŖ nguáģn váēĢn Äang ÄÆ°áģŖc cáēŖi thiáģn liÃĒn táģĨc
+
+ÄÃŗ là là do cÃĄc phiÃĒn báēŖn hiáģn táēĄi váēĢn cÃ˛n là 0.x.x, Äiáģu nà y pháēŖn ÃĄnh ráēąng máģi phiÃĒn báēŖn cÃŗ tháģ cÃŗ cÃĄc thay Äáģi gÃĸy máēĨt tÆ°ÆĄng thÃch. Äiáģu nà y tuÃĸn theo cÃĄc quy ưáģc váģ Semantic Versioning .
+
+BáēĄn cÃŗ tháģ táēĄo ra sáēŖn pháēŠm tháģąc táēŋ váģi **FastAPI** ngay bÃĸy giáģ (và báēĄn cÃŗ tháģ ÄÃŖ là m Äiáģu nà y trong máģt tháģi gian dà i), báēĄn cháģ cáē§n ÄáēŖm báēŖo ráēąng báēĄn sáģ dáģĨng máģt phiÃĒn báēŖn hoáēĄt Äáģng ÄÃēng váģi cÃĄc ÄoáēĄn mÃŖ cÃ˛n láēĄi cáģ§a báēĄn.
+
+## Cáģ Äáģnh phiÃĒn báēŖn cáģ§a `fastapi`
+
+Äiáģu Äáē§u tiÃĒn báēĄn nÃĒn là m là "cáģ Äáģnh" phiÃĒn báēŖn cáģ§a **FastAPI** báēĄn Äang sáģ dáģĨng Äáģ phiÃĒn báēŖn máģi nháēĨt mà báēĄn biáēŋt hoáēĄt Äáģng ÄÃēng váģi áģŠng dáģĨng cáģ§a báēĄn.
+
+Và dáģĨ, giáēŖ sáģ báēĄn Äang sáģ dáģĨng phiÃĒn báēŖn `0.112.0` trong áģŠng dáģĨng cáģ§a báēĄn.
+
+Náēŋu báēĄn sáģ dáģĨng máģt táģp `requirements.txt` báēĄn cÃŗ tháģ cháģ Äáģnh phiÃĒn báēŖn váģi:
+
+```txt
+fastapi[standard]==0.112.0
+```
+
+Như váēy, báēĄn sáēŊ sáģ dáģĨng chÃnh xÃĄc phiÃĒn báēŖn `0.112.0`.
+
+Hoáēˇc báēĄn cÅŠng cÃŗ tháģ cáģ Äáģnh nÃŗ váģi:
+
+```txt
+fastapi[standard]>=0.112.0,<0.113.0
+```
+
+Như váēy, báēĄn sáēŊ sáģ dáģĨng cÃĄc phiÃĒn báēŖn `0.112.0` tráģ lÃĒn, nhưng nháģ hÆĄn `0.113.0`, và dáģĨ, máģt phiÃĒn báēŖn `0.112.2` váēĢn ÄÆ°áģŖc cháēĨp nháēn.
+
+Náēŋu báēĄn sáģ dáģĨng báēĨt káģŗ công cáģĨ nà o Äáģ quáēŖn lÃŊ cà i Äáēˇt cáģ§a báēĄn, như `uv`, Poetry, Pipenv, hoáēˇc báēĨt káģŗ công cáģĨ nà o khÃĄc, chÃēng Äáģu cÃŗ máģt cÃĄch Äáģ báēĄn cÃŗ tháģ Äáģnh nghÄŠa cÃĄc phiÃĒn báēŖn cáģĨ tháģ cho cÃĄc gÃŗi cáģ§a báēĄn.
+
+## CÃĄc phiÃĒn báēŖn cÃŗ sáēĩn
+
+BáēĄn cÃŗ tháģ xem cÃĄc phiÃĒn báēŖn cÃŗ sáēĩn (và dáģĨ Äáģ kiáģm tra phiÃĒn báēŖn máģi nháēĨt) trong [Release Notes](../release-notes.md){.internal-link target=_blank}.
+
+## Váģ cÃĄc phiÃĒn báēŖn
+
+Theo quy ưáģc váģ Semantic Versioning, báēĨt káģŗ phiÃĒn báēŖn nà o bÃĒn dưáģi `1.0.0` cÃŗ tháģ thÃĒm cÃĄc thay Äáģi gÃĸy máēĨt tÆ°ÆĄng thÃch.
+
+**FastAPI** cÅŠng theo quy ưáģc ráēąng báēĨt káģŗ thay Äáģi phiÃĒn báēŖn "PATCH" nà o là cho cÃĄc láģi và cÃĄc thay Äáģi không gÃĸy máēĨt tÆ°ÆĄng thÃch.
+
+/// tip
+
+"PATCH" là sáģ cuáģi cÚng, và dáģĨ, trong `0.2.3`, phiÃĒn báēŖn PATCH là `3`.
+
+///
+
+VÃŦ váēy, báēĄn cÃŗ tháģ cáģ Äáģnh Äáēŋn máģt phiÃĒn báēŖn như:
+
+```txt
+fastapi>=0.45.0,<0.46.0
+```
+
+CÃĄc thay Äáģi gÃĸy máēĨt tÆ°ÆĄng thÃch và cÃĄc tÃnh nÄng máģi ÄÆ°áģŖc thÃĒm và o trong cÃĄc phiÃĒn báēŖn "MINOR".
+
+/// tip
+
+"MINOR" là sáģ áģ giáģ¯a, và dáģĨ, trong `0.2.3`, phiÃĒn báēŖn MINOR là `2`.
+
+///
+
+## NÃĸng cáēĨp cÃĄc phiÃĒn báēŖn cáģ§a FastAPI
+
+BáēĄn nÃĒn thÃĒm cÃĄc bà i kiáģm tra (tests) cho áģŠng dáģĨng cáģ§a báēĄn.
+
+Váģi **FastAPI** Äiáģu nà y ráēĨt dáģ
dà ng (nháģ và o Starlette), kiáģm tra tà i liáģu: [Testing](../tutorial/testing.md){.internal-link target=_blank}
+
+Sau khi báēĄn cÃŗ cÃĄc bà i kiáģm tra, báēĄn cÃŗ tháģ nÃĸng cáēĨp phiÃĒn báēŖn **FastAPI** lÃĒn máģt phiÃĒn báēŖn máģi hÆĄn, và ÄáēŖm báēŖo ráēąng táēĨt cáēŖ mÃŖ cáģ§a báēĄn hoáēĄt Äáģng ÄÃēng báēąng cÃĄch cháēĄy cÃĄc bà i kiáģm tra cáģ§a báēĄn.
+
+Náēŋu máģi tháģŠ Äang hoáēĄt Äáģng, hoáēˇc sau khi báēĄn tháģąc hiáģn cÃĄc thay Äáģi cáē§n thiáēŋt, và táēĨt cáēŖ cÃĄc bà i kiáģm tra cáģ§a báēĄn Äáģu Äi qua, thÃŦ báēĄn cÃŗ tháģ cáģ Äáģnh phiÃĒn báēŖn cáģ§a `fastapi` Äáēŋn phiÃĒn báēŖn máģi hÆĄn.
+
+## Váģ Starlette
+
+BáēĄn không nÃĒn cáģ Äáģnh phiÃĒn báēŖn cáģ§a `starlette`.
+
+CÃĄc phiÃĒn báēŖn khÃĄc nhau cáģ§a **FastAPI** sáēŊ sáģ dáģĨng máģt phiÃĒn báēŖn Starlette máģi hÆĄn.
+
+VÃŦ váēy, báēĄn cÃŗ tháģ Äáģ **FastAPI** sáģ dáģĨng phiÃĒn báēŖn Starlette phÚ háģŖp.
+
+## Váģ Pydantic
+
+Pydantic bao gáģm cÃĄc bà i kiáģm tra cáģ§a riÃĒng nÃŗ cho **FastAPI**, vÃŦ váēy cÃĄc phiÃĒn báēŖn máģi hÆĄn cáģ§a Pydantic (trÃĒn `1.0.0`) luôn tÆ°ÆĄng thÃch váģi **FastAPI**.
+
+BáēĄn cÃŗ tháģ cáģ Äáģnh Pydantic Äáēŋn báēĨt káģŗ phiÃĒn báēŖn nà o trÃĒn `1.0.0` mà báēĄn muáģn.
+
+VÃ dáģĨ:
+
+```txt
+pydantic>=2.7.0,<3.0.0
+```
diff --git a/docs/vi/docs/environment-variables.md b/docs/vi/docs/environment-variables.md
new file mode 100644
index 000000000..dd06f8959
--- /dev/null
+++ b/docs/vi/docs/environment-variables.md
@@ -0,0 +1,300 @@
+# Biáēŋn môi trưáģng (Environment Variables)
+
+/// tip
+
+Náēŋu báēĄn ÄÃŖ biáēŋt váģ "biáēŋn môi trưáģng" và cÃĄch sáģ dáģĨng chÃēng, báēĄn cÃŗ tháģ báģ qua pháē§n nà y.
+
+///
+
+Máģt biáēŋn môi trưáģng (cÃ˛n ÄÆ°áģŖc gáģi là "**env var**") là máģt biáēŋn mà táģn táēĄi **bÃĒn ngoà i** ÄoáēĄn mÃŖ Python, áģ trong **háģ Äiáģu hà nh**, và cÃŗ tháģ ÄÆ°áģŖc Äáģc báģi ÄoáēĄn mÃŖ Python cáģ§a báēĄn (hoáēˇc báģi cÃĄc chÆ°ÆĄng trÃŦnh khÃĄc).
+
+CÃĄc biáēŋn môi trưáģng cÃŗ tháģ ÄÆ°áģŖc sáģ dáģĨng Äáģ xáģ là **cÃĄc thiáēŋt láēp** cáģ§a áģŠng dáģĨng, như máģt pháē§n cáģ§a **cÃĄc quÃĄ trÃŦnh cà i Äáēˇt** Python, v.v.
+
+## TáēĄo và Sáģ dáģĨng cÃĄc Biáēŋn Môi Trưáģng
+
+BáēĄn cÃŗ tháģ **táēĄo** và sáģ dáģĨng cÃĄc biáēŋn môi trưáģng trong **shell (terminal)**, mà không cáē§n sáģ dáģĨng Python:
+
+//// tab | Linux, macOS, Windows Bash
+
+
+
+```console
+// BáēĄn cÃŗ tháģ táēĄo máģt biáēŋn môi trưáģng MY_NAME váģi
+$ export MY_NAME="Wade Wilson"
+
+// Sau ÄÃŗ báēĄn cÃŗ tháģ sáģ dáģĨng nÃŗ váģi cÃĄc chÆ°ÆĄng trÃŦnh khÃĄc, như
+$ echo "Hello $MY_NAME"
+
+Hello Wade Wilson
+```
+
+
+
+////
+
+//// tab | Windows PowerShell
+
+
+
+```console
+// TáēĄo máģt biáēŋn môi trưáģng MY_NAME
+$ $Env:MY_NAME = "Wade Wilson"
+
+// Sáģ dáģĨng nÃŗ váģi cÃĄc chÆ°ÆĄng trÃŦnh khÃĄc, như lÃ
+$ echo "Hello $Env:MY_NAME"
+
+Hello Wade Wilson
+```
+
+
+
+////
+
+## Äáģc cÃĄc Biáēŋn Môi Trưáģng trong Python
+
+BáēĄn cÅŠng cÃŗ tháģ táēĄo cÃĄc biáēŋn môi trưáģng **bÃĒn ngoà i** ÄoáēĄn mÃŖ Python, trong terminal (hoáēˇc báēąng báēĨt káģŗ phÆ°ÆĄng phÃĄp nà o khÃĄc), và sau ÄÃŗ **Äáģc chÃēng trong Python**.
+
+Và dáģĨ, báēĄn cÃŗ máģt file `main.py` váģi:
+
+```Python hl_lines="3"
+import os
+
+name = os.getenv("MY_NAME", "World")
+print(f"Hello {name} from Python")
+```
+
+/// tip
+
+Tham sáģ tháģŠ hai cho `os.getenv()` là giÃĄ tráģ máēˇc Äáģnh Äáģ tráēŖ váģ.
+
+Náēŋu không ÄÆ°áģŖc cung cáēĨp, nÃŗ máēˇc Äáģnh là `None`, áģ ÄÃĸy chÃēng ta cung cáēĨp `"World"` là giÃĄ tráģ máēˇc Äáģnh Äáģ sáģ dáģĨng.
+
+///
+
+Sau ÄÃŗ báēĄn cÃŗ tháģ gáģi chÆ°ÆĄng trÃŦnh Python:
+
+//// tab | Linux, macOS, Windows Bash
+
+
+
+```console
+// áģ ÄÃĸy chÃēng ta chưa cà i Äáēˇt biáēŋn môi trưáģng
+$ python main.py
+
+// VÃŦ chÃēng ta chưa cà i Äáēˇt biáēŋn môi trưáģng, chÃēng ta nháēn ÄÆ°áģŖc giÃĄ tráģ máēˇc Äáģnh
+
+Hello World from Python
+
+// Nhưng náēŋu chÃēng ta táēĄo máģt biáēŋn môi trưáģng trưáģc ÄÃŗ
+$ export MY_NAME="Wade Wilson"
+
+// Và sau ÄÃŗ gáģi chÆ°ÆĄng trÃŦnh láēĄi
+$ python main.py
+
+// BÃĸy giáģ nÃŗ cÃŗ tháģ Äáģc biáēŋn môi trưáģng
+
+Hello Wade Wilson from Python
+```
+
+
+
+////
+
+//// tab | Windows PowerShell
+
+
+
+```console
+// áģ ÄÃĸy chÃēng ta chưa cà i Äáēˇt biáēŋn môi trưáģng
+$ python main.py
+
+// VÃŦ chÃēng ta chưa cà i Äáēˇt biáēŋn môi trưáģng, chÃēng ta nháēn ÄÆ°áģŖc giÃĄ tráģ máēˇc Äáģnh
+
+Hello World from Python
+
+// Nhưng náēŋu chÃēng ta táēĄo máģt biáēŋn môi trưáģng trưáģc ÄÃŗ
+$ $Env:MY_NAME = "Wade Wilson"
+
+// Và sau ÄÃŗ gáģi chÆ°ÆĄng trÃŦnh láēĄi
+$ python main.py
+
+// BÃĸy giáģ nÃŗ cÃŗ tháģ Äáģc biáēŋn môi trưáģng
+
+Hello Wade Wilson from Python
+```
+
+
+
+////
+
+VÃŦ cÃĄc biáēŋn môi trưáģng cÃŗ tháģ ÄÆ°áģŖc táēĄo bÃĒn ngoà i ÄoáēĄn mÃŖ Python, nhưng cÃŗ tháģ ÄÆ°áģŖc Äáģc báģi ÄoáēĄn mÃŖ Python, và không cáē§n ÄÆ°áģŖc lưu tráģ¯ (commit và o `git`) cÚng váģi cÃĄc file khÃĄc, nÃĒn chÃēng thưáģng ÄÆ°áģŖc sáģ dáģĨng Äáģ lưu cÃĄc thiáēŋt láēp hoáēˇc **cáēĨu hÃŦnh**.
+
+BáēĄn cÅŠng cÃŗ tháģ táēĄo ra máģt biáēŋn môi trưáģng dà nh riÃĒng cho máģt **láē§n gáģi chÆ°ÆĄng trÃŦnh**, cháģ cÃŗ tháģ ÄÆ°áģŖc sáģ dáģĨng báģi chÆ°ÆĄng trÃŦnh ÄÃŗ, và cháģ trong tháģi gian cháēĄy cáģ§a chÆ°ÆĄng trÃŦnh.
+
+Äáģ là m Äiáģu nà y, táēĄo nÃŗ ngay trưáģc chÆ°ÆĄng trÃŦnh ÄÃŗ, trÃĒn cÚng máģt dÃ˛ng:
+
+
+
+```console
+// TáēĄo máģt biáēŋn môi trưáģng MY_NAME cho láē§n gáģi chÆ°ÆĄng trÃŦnh nà y
+$ MY_NAME="Wade Wilson" python main.py
+
+// BÃĸy giáģ nÃŗ cÃŗ tháģ Äáģc biáēŋn môi trưáģng
+
+Hello Wade Wilson from Python
+
+// Biáēŋn môi trưáģng không cÃ˛n táģn táēĄi sau ÄÃŗ
+$ python main.py
+
+Hello World from Python
+```
+
+
+
+/// tip
+
+BáēĄn cÃŗ tháģ Äáģc thÃĒm váģ Äiáģu nà y táēĄi The Twelve-Factor App: Config .
+
+///
+
+## CÃĄc Kiáģu (Types) và Kiáģm tra (Validation)
+
+CÃĄc biáēŋn môi trưáģng cÃŗ tháģ cháģ xáģ là **chuáģi kÃŊ táģą**, vÃŦ chÃēng náēąm bÃĒn ngoà i ÄoáēĄn mÃŖ Python và pháēŖi tÆ°ÆĄng thÃch váģi cÃĄc chÆ°ÆĄng trÃŦnh khÃĄc và pháē§n cÃ˛n láēĄi cáģ§a háģ tháģng (và tháēm chà váģi cÃĄc háģ Äiáģu hà nh khÃĄc, như Linux, Windows, macOS).
+
+Äiáģu nà y cÃŗ nghÄŠa là **báēĨt káģŗ giÃĄ tráģ nà o** ÄÆ°áģŖc Äáģc trong Python táģĢ máģt biáēŋn môi trưáģng **sáēŊ là máģt `str`**, và báēĨt káģŗ hà nh Äáģng chuyáģn Äáģi sang kiáģu dáģ¯ liáģu khÃĄc hoáēˇc hà nh Äáģng kiáģm tra nà o cÅŠng pháēŖi ÄÆ°áģŖc tháģąc hiáģn trong ÄoáēĄn mÃŖ.
+
+BáēĄn sáēŊ háģc thÃĒm váģ viáģc sáģ dáģĨng biáēŋn môi trưáģng Äáģ xáģ là **cÃĄc thiáēŋt láēp áģŠng dáģĨng** trong [Hưáģng dáēĢn nÃĸng cao - CÃĄc thiáēŋt láēp và biáēŋn môi trưáģng](./advanced/settings.md){.internal-link target=_blank}.
+
+## Biáēŋn môi trưáģng `PATH`
+
+CÃŗ máģt biáēŋn môi trưáģng **Äáēˇc biáģt** ÄÆ°áģŖc gáģi là **`PATH`** ÄÆ°áģŖc sáģ dáģĨng báģi cÃĄc háģ Äiáģu hà nh (Linux, macOS, Windows) nháēąm tÃŦm cÃĄc chÆ°ÆĄng trÃŦnh Äáģ tháģąc thi.
+
+GiÃĄ tráģ cáģ§a biáēŋn môi trưáģng `PATH` là máģt chuáģi dà i ÄÆ°áģŖc táēĄo báģi cÃĄc thư máģĨc ÄÆ°áģŖc phÃĸn tÃĄch báģi dáēĨu hai cháēĨm `:` trÃĒn Linux và macOS, và báģi dáēĨu cháēĨm pháēŠy `;` trÃĒn Windows.
+
+Và dáģĨ, biáēŋn môi trưáģng `PATH` cÃŗ tháģ cÃŗ dáēĄng như sau:
+
+//// tab | Linux, macOS
+
+```plaintext
+/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
+```
+
+Äiáģu nà y cÃŗ nghÄŠa là háģ tháģng sáēŊ tÃŦm kiáēŋm cÃĄc chÆ°ÆĄng trÃŦnh trong cÃĄc thư máģĨc:
+
+* `/usr/local/bin`
+* `/usr/bin`
+* `/bin`
+* `/usr/sbin`
+* `/sbin`
+
+////
+
+//// tab | Windows
+
+```plaintext
+C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32
+```
+
+Äiáģu nà y cÃŗ nghÄŠa là háģ tháģng sáēŊ tÃŦm kiáēŋm cÃĄc chÆ°ÆĄng trÃŦnh trong cÃĄc thư máģĨc:
+
+* `C:\Program Files\Python312\Scripts`
+* `C:\Program Files\Python312`
+* `C:\Windows\System32`
+
+////
+
+Khi báēĄn gÃĩ máģt **láģnh** trong terminal, háģ Äiáģu hà nh **tÃŦm kiáēŋm** chÆ°ÆĄng trÃŦnh trong **máģi thư máģĨc** ÄÆ°áģŖc liáģt kÃĒ trong biáēŋn môi trưáģng `PATH`.
+
+Và dáģĨ, khi báēĄn gÃĩ `python` trong terminal, háģ Äiáģu hà nh tÃŦm kiáēŋm máģt chÆ°ÆĄng trÃŦnh ÄÆ°áģŖc gáģi `python` trong **thư máģĨc Äáē§u tiÃĒn** trong danh sÃĄch ÄÃŗ.
+
+Náēŋu tÃŦm tháēĨy, nÃŗ sáēŊ **sáģ dáģĨng** nÃŗ. Náēŋu không tÃŦm tháēĨy, nÃŗ sáēŊ tiáēŋp táģĨc tÃŦm kiáēŋm trong **cÃĄc thư máģĨc khÃĄc**.
+
+### Cà i Äáēˇt Python và cáēp nháēt biáēŋn môi trưáģng `PATH`
+
+Khi báēĄn cà i Äáēˇt Python, báēĄn cÃŗ tháģ ÄÆ°áģŖc háģi náēŋu báēĄn muáģn cáēp nháēt biáēŋn môi trưáģng `PATH`.
+
+//// tab | Linux, macOS
+
+GiáēŖ sáģ báēĄn cà i Äáēˇt Python và o thư máģĨc `/opt/custompython/bin`.
+
+Náēŋu báēĄn cháģn cáēp nháēt biáēŋn môi trưáģng `PATH`, thÃŦ cà i Äáēˇt sáēŊ thÃĒm `/opt/custompython/bin` và o biáēŋn môi trưáģng `PATH`.
+
+NÃŗ cÃŗ tháģ cÃŗ dáēĄng như sau:
+
+```plaintext
+/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/custompython/bin
+```
+
+Như váēy, khi báēĄn gÃĩ `python` trong terminal, háģ tháģng sáēŊ tÃŦm tháēĨy chÆ°ÆĄng trÃŦnh Python trong `/opt/custompython/bin` (thư máģĨc cuáģi) và sáģ dáģĨng nÃŗ.
+
+////
+
+//// tab | Windows
+
+GiáēŖ sáģ báēĄn cà i Äáēˇt Python và o thư máģĨc `C:\opt\custompython\bin`.
+
+Náēŋu báēĄn cháģn cáēp nháēt biáēŋn môi trưáģng `PATH`, thÃŦ cà i Äáēˇt sáēŊ thÃĒm `C:\opt\custompython\bin` và o biáēŋn môi trưáģng `PATH`.
+
+NÃŗ cÃŗ tháģ cÃŗ dáēĄng như sau:
+
+```plaintext
+C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32;C:\opt\custompython\bin
+```
+
+Như váēy, khi báēĄn gÃĩ `python` trong terminal, háģ tháģng sáēŊ tÃŦm tháēĨy chÆ°ÆĄng trÃŦnh Python trong `C:\opt\custompython\bin` (thư máģĨc cuáģi) và sáģ dáģĨng nÃŗ.
+
+////
+
+Váēy, náēŋu báēĄn gÃĩ:
+
+
+
+```console
+$ python
+```
+
+
+
+//// tab | Linux, macOS
+
+Háģ tháģng sáēŊ **tÃŦm kiáēŋm** chÆ°ÆĄng trÃŦnh `python` trong `/opt/custompython/bin` và tháģąc thi nÃŗ.
+
+NÃŗ tÆ°ÆĄng ÄÆ°ÆĄng váģi viáģc báēĄn gÃĩ:
+
+
+
+```console
+$ /opt/custompython/bin/python
+```
+
+
+
+////
+
+//// tab | Windows
+
+Háģ tháģng sáēŊ **tÃŦm kiáēŋm** chÆ°ÆĄng trÃŦnh `python` trong `C:\opt\custompython\bin\python` và tháģąc thi nÃŗ.
+
+NÃŗ tÆ°ÆĄng ÄÆ°ÆĄng váģi viáģc báēĄn gÃĩ:
+
+
+
+```console
+$ C:\opt\custompython\bin\python
+```
+
+
+
+////
+
+Thông tin nà y sáēŊ háģ¯u Ãch khi báēĄn háģc váģ [Môi trưáģng áēŖo](virtual-environments.md){.internal-link target=_blank}.
+
+## Káēŋt luáēn
+
+Váģi nháģ¯ng thông tin nà y, báēĄn cÃŗ tháģ hiáģu ÄÆ°áģŖc **cÃĄc biáēŋn môi trưáģng là gÃŦ** và **cÃĄch sáģ dáģĨng chÃēng trong Python**.
+
+BáēĄn cÃŗ tháģ Äáģc thÃĒm váģ chÃēng táēĄi Wikipedia cho Biáēŋn môi trưáģng .
+
+Trong nhiáģu trưáģng háģŖp, cÃĄch cÃĄc biáēŋn môi trưáģng tráģ nÃĒn háģ¯u Ãch và cÃŗ tháģ ÃĄp dáģĨng không tháģąc sáģą rÃĩ rà ng ngay táģĢ Äáē§u, nhưng chÃēng sáēŊ liÃĒn táģĨc xuáēĨt hiáģn trong ráēĨt nhiáģu tÃŦnh huáģng khi báēĄn phÃĄt triáģn áģŠng dáģĨng, vÃŦ váēy viáģc hiáģu biáēŋt váģ chÃēng là háģ¯u Ãch.
+
+Cháēŗng háēĄn, báēĄn sáēŊ cáē§n nháģ¯ng thông tin nà y khi báēĄn háģc váģ [Môi trưáģng áēŖo](virtual-environments.md).
diff --git a/docs/vi/docs/fastapi-cli.md b/docs/vi/docs/fastapi-cli.md
new file mode 100644
index 000000000..d9e315ae4
--- /dev/null
+++ b/docs/vi/docs/fastapi-cli.md
@@ -0,0 +1,75 @@
+# FastAPI CLI
+
+**FastAPI CLI** là máģt chÆ°ÆĄng trÃŦnh dÃ˛ng láģnh cÃŗ tháģ ÄÆ°áģŖc sáģ dáģĨng Äáģ pháģĨc váģĨ áģŠng dáģĨng FastAPI cáģ§a báēĄn, quáēŖn lÃŊ dáģą ÃĄn FastAPI cáģ§a báēĄn và nhiáģu hoáēĄt Äáģng khÃĄc.
+
+Khi báēĄn cà i Äáēˇt FastAPI (vd váģi `pip install "fastapi[standard]"`), nÃŗ sáēŊ bao gáģm máģt gÃŗi ÄÆ°áģŖc gáģi là `fastapi-cli`, gÃŗi nà y cung cáēĨp láģnh `fastapi` trong terminal.
+
+Äáģ cháēĄy áģŠng dáģĨng FastAPI cáģ§a báēĄn cho quÃĄ trÃŦnh phÃĄt triáģn (development), báēĄn cÃŗ tháģ sáģ dáģĨng láģnh `fastapi dev`:
+
+
+
+```console
+$ fastapi dev main.py
+
+ FastAPI Starting development server đ
+
+ Searching for package file structure from directories with
+ __init__.py files
+ Importing from /home/user/code/ awesomeapp
+
+ module đ main.py
+
+ code Importing the FastAPI app object from the module with the
+ following code:
+
+ from main import app
+
+ app Using import string: main:app
+
+ server Server started at http://127.0.0.1:8000
+ server Documentation at http://127.0.0.1:8000/docs
+
+ tip Running in development mode, for production use:
+ fastapi run
+
+ Logs:
+
+ INFO Will watch for changes in these directories:
+ [ '/home/user/code/awesomeapp' ]
+ INFO Uvicorn running on http://127.0.0.1:8000 ( Press CTRL+C to
+ quit)
+ INFO Started reloader process [ 383138 ] using WatchFiles
+ INFO Started server process [ 383153 ]
+ INFO Waiting for application startup.
+ INFO Application startup complete.
+```
+
+
+
+ChÆ°ÆĄng trÃŦnh dÃ˛ng láģnh `fastapi` là **FastAPI CLI**.
+
+FastAPI CLI nháēn ÄÆ°áģng dáēĢn Äáēŋn chÆ°ÆĄng trÃŦnh Python cáģ§a báēĄn (vd `main.py`) và táģą Äáģng phÃĄt hiáģn Äáģi tưáģŖng `FastAPI` (thưáģng ÄÆ°áģŖc gáģi là `app`), xÃĄc Äáģnh quÃĄ trÃŦnh nháēp ÄÃēng, và sau ÄÃŗ cháēĄy nÃŗ (serve).
+
+Äáģi váģi váēn hà nh tháģąc táēŋ (production), báēĄn sáēŊ sáģ dáģĨng `fastapi run` thay tháēŋ. đ
+
+áģ bÃĒn trong, **FastAPI CLI** sáģ dáģĨng Uvicorn , máģt server ASGI cÃŗ hiáģu suáēĨt cao, sáēĩn sà ng cho váēn hà nh tháģąc táēŋ (production). đ
+
+## `fastapi dev`
+
+CháēĄy `fastapi dev` sáēŊ kháģi Äáģng quÃĄ trÃŦnh phÃĄt triáģn.
+
+Máēˇc Äáģnh, **auto-reload** ÄÆ°áģŖc báēt, táģą Äáģng táēŖi láēĄi server khi báēĄn thay Äáģi code cáģ§a báēĄn. Äiáģu nà y táģn nhiáģu tà i nguyÃĒn và cÃŗ tháģ kÊm áģn Äáģnh hÆĄn khi nÃŗ báģ táē¯t. BáēĄn nÃĒn sáģ dáģĨng nÃŗ cho quÃĄ trÃŦnh phÃĄt triáģn. NÃŗ cÅŠng láē¯ng nghe Äáģa cháģ IP `127.0.0.1`, ÄÃŗ là Äáģa cháģ IP cáģ§a mÃĄy tÃnh Äáģ táģą giao tiáēŋp váģi chÃnh nÃŗ (`localhost`).
+
+## `fastapi run`
+
+CháēĄy `fastapi run` máēˇc Äáģnh sáēŊ kháģi Äáģng FastAPI cho quÃĄ trÃŦnh váēn hà nh tháģąc táēŋ.
+
+Máēˇc Äáģnh, **auto-reload** báģ táē¯t. NÃŗ cÅŠng láē¯ng nghe Äáģa cháģ IP `0.0.0.0`, ÄÃŗ là táēĨt cáēŖ cÃĄc Äáģa cháģ IP cÃŗ sáēĩn, như váēy nÃŗ sáēŊ ÄÆ°áģŖc truy cáēp công khai báģi báēĨt káģŗ ai cÃŗ tháģ giao tiáēŋp váģi mÃĄy tÃnh. ÄÃĸy là cÃĄch báēĄn thưáģng cháēĄy nÃŗ trong sáēŖn pháēŠm hoà n thiáģn, và dáģĨ trong máģt container.
+
+Trong háē§u háēŋt cÃĄc trưáģng háģŖp, báēĄn sáēŊ (và nÃĒn) cÃŗ máģt "proxy Äiáģm cuáģi (termination proxy)" xáģ lÃŊ HTTPS cho báēĄn, Äiáģu nà y sáēŊ pháģĨ thuáģc và o cÃĄch báēĄn triáģn khai áģŠng dáģĨng cáģ§a báēĄn, nhà cung cáēĨp cÃŗ tháģ là m Äiáģu nà y cho báēĄn, hoáēˇc báēĄn cÃŗ tháģ cáē§n thiáēŋt láēp nÃŗ.
+
+/// tip
+
+BáēĄn cÃŗ tháģ tÃŦm hiáģu thÃĒm váģ FastAPI CLI trong [tà i liáģu triáģn khai](deployment/index.md){.internal-link target=_blank}.
+
+///
diff --git a/docs/vi/docs/index.md b/docs/vi/docs/index.md
index 5e346ded8..5c6b7e8a4 100644
--- a/docs/vi/docs/index.md
+++ b/docs/vi/docs/index.md
@@ -12,7 +12,7 @@
-
+
diff --git a/docs/vi/docs/tutorial/static-files.md b/docs/vi/docs/tutorial/static-files.md
new file mode 100644
index 000000000..ecf8c2485
--- /dev/null
+++ b/docs/vi/docs/tutorial/static-files.md
@@ -0,0 +1,40 @@
+# Táģp tÄŠnh (Static Files)
+
+BáēĄn cÃŗ tháģ triáģn khai táģp tÄŠnh táģą Äáģng táģĢ máģt thư máģĨc báēąng cÃĄch sáģ dáģĨng StaticFiles.
+
+## Sáģ dáģĨng `Táģp tÄŠnh`
+
+- Nháēp `StaticFiles`.
+- "Mount" a `StaticFiles()` instance in a specific path.
+
+{* ../../docs_src/static_files/tutorial001.py hl[2,6] *}
+
+/// note | Chi tiáēŋt káģš thuáēt
+
+BáēĄn cÅŠng cÃŗ tháģ sáģ dáģĨng `from starlette.staticfiles import StaticFiles`.
+
+**FastAPI** cung cáēĨp cÚng `starlette.staticfiles` như `fastapi.staticfiles` giÃēp ÄÆĄn giáēŖn hÃŗa viáģc sáģ dáģĨng, nhưng nÃŗ tháģąc sáģą Äáēŋn táģĢ Starlette.
+
+///
+
+### "Mounting" là gÃŦ
+
+"Mounting" cÃŗ nghÄŠa là thÃĒm máģt áģŠng dáģĨng "Äáģc láēp" hoà n cháģnh và o máģt ÄÆ°áģng dáēĢn cáģĨ tháģ, sau ÄÃŗ áģŠng dáģĨng ÄÃŗ sáēŊ cháģu trÃĄch nhiáģm xáģ lÃŊ táēĨt cáēŖ cÃĄc ÄÆ°áģng dáēĢn con.
+
+Äiáģu nà y khÃĄc váģi viáģc sáģ dáģĨng `APIRouter` vÃŦ máģt áģŠng dáģĨng ÄÆ°áģŖc gáē¯n káēŋt là hoà n toà n Äáģc láēp. OpenAPI và tà i liáģu táģĢ áģŠng dáģĨng chÃnh cáģ§a báēĄn sáēŊ không bao gáģm báēĨt káģŗ tháģŠ gÃŦ táģĢ áģŠng dáģĨng ÄÆ°áģŖc gáē¯n káēŋt, v.v.
+
+BáēĄn cÃŗ tháģ Äáģc thÃĒm váģ Äiáģu nà y trong [Hưáģng dáēĢn Ngưáģi dÚng NÃĸng cao](../advanced/index.md){.internal-link target=\_blank}.
+
+## Chi tiáēŋt
+
+ÄÆ°áģng dáēĢn Äáē§u tiÃĒn `"/static"` lÃ ÄÆ°áģng dáēĢn con mà "áģŠng dáģĨng con" nà y sáēŊ ÄÆ°áģŖc "gáē¯n" và o. VÃŦ váēy, báēĨt káģŗ ÄÆ°áģng dáēĢn nà o báē¯t Äáē§u báēąng `"/static"` sáēŊ ÄÆ°áģŖc xáģ lÃŊ báģi nÃŗ.
+
+ÄÆ°áģng dáēĢn `directory="static"` là tÃĒn cáģ§a thư máģĨc cháģŠa táģp tÄŠnh cáģ§a báēĄn.
+
+Tham sáģ `name="static"` Äáēˇt tÃĒn cho nÃŗ Äáģ cÃŗ tháģ ÄÆ°áģŖc sáģ dáģĨng bÃĒn trong **FastAPI**.
+
+TáēĨt cáēŖ cÃĄc tham sáģ nà y cÃŗ tháģ khÃĄc váģi `static`, Äiáģu cháģnh chÃēng váģi phÚ háģŖp váģi áģŠng dáģĨng cáģ§a báēĄn.
+
+## Thông tin thÃĒm
+
+Äáģ biáēŋt thÃĒm chi tiáēŋt và tÚy cháģn, hÃŖy xem Starlette's docs about Static Files .
diff --git a/docs/vi/docs/virtual-environments.md b/docs/vi/docs/virtual-environments.md
new file mode 100644
index 000000000..22d8e153e
--- /dev/null
+++ b/docs/vi/docs/virtual-environments.md
@@ -0,0 +1,842 @@
+# Môi trưáģng áēŖo (Virtual Environments)
+
+Khi báēĄn là m viáģc trong cÃĄc dáģą ÃĄn Python, báēĄn cÃŗ tháģ sáģ dáģĨng máģt **môi trưáģng áēŖo** (hoáēˇc máģt cÆĄ cháēŋ tÆ°ÆĄng táģą) Äáģ cÃĄch ly cÃĄc gÃŗi báēĄn cà i Äáēˇt cho máģi dáģą ÃĄn.
+
+/// info
+Náēŋu báēĄn ÄÃŖ biáēŋt váģ cÃĄc môi trưáģng áēŖo, cÃĄch táēĄo chÃēng và sáģ dáģĨng chÃēng, báēĄn cÃŗ tháģ báģ qua pháē§n nà y. đ¤
+
+///
+
+/// tip
+
+Máģt **môi trưáģng áēŖo** khÃĄc váģi máģt **biáēŋn môi trưáģng (environment variable)**.
+
+Máģt **biáēŋn môi trưáģng** là máģt biáēŋn trong háģ tháģng cÃŗ tháģ ÄÆ°áģŖc sáģ dáģĨng báģi cÃĄc chÆ°ÆĄng trÃŦnh.
+
+Máģt **môi trưáģng áēŖo** là máģt thư máģĨc váģi máģt sáģ táģp trong ÄÃŗ.
+
+///
+
+/// info
+
+Trang nà y sáēŊ hưáģng dáēĢn báēĄn cÃĄch sáģ dáģĨng cÃĄc **môi trưáģng áēŖo** và cÃĄch chÃēng hoáēĄt Äáģng.
+
+Náēŋu báēĄn ÄÃŖ sáēĩn sà ng sáģ dáģĨng máģt **công cáģĨ cÃŗ tháģ quáēŖn lÃŊ táēĨt cáēŖ máģi tháģŠ** cho báēĄn (bao gáģm cáēŖ viáģc cà i Äáēˇt Python), hÃŖy tháģ uv .
+
+///
+
+## TáēĄo máģt Dáģą ÃĄn
+
+Äáē§u tiÃĒn, táēĄo máģt thư máģĨc cho dáģą ÃĄn cáģ§a báēĄn.
+
+CÃĄch tôi thưáģng là m là táēĄo máģt thư máģĨc cÃŗ tÃĒn `code` trong thư máģĨc `home/user`.
+
+Và trong thư máģĨc ÄÃŗ, tôi táēĄo máģt thư máģĨc cho máģi dáģą ÃĄn.
+
+
+
+```console
+// Äi Äáēŋn thư máģĨc home
+$ cd
+// TáēĄo máģt thư máģĨc cho táēĨt cáēŖ cÃĄc dáģą ÃĄn cáģ§a báēĄn
+$ mkdir code
+// Và o thư máģĨc code
+$ cd code
+// TáēĄo máģt thư máģĨc cho dáģą ÃĄn nà y
+$ mkdir awesome-project
+// Và o thư máģĨc dáģą ÃĄn
+$ cd awesome-project
+```
+
+
+
+## TáēĄo máģt Môi trưáģng áēŖo
+
+Khi báēĄn báē¯t Äáē§u là m viáģc váģi máģt dáģą ÃĄn Python **trong láē§n Äáē§u**, hÃŖy táēĄo máģt môi trưáģng áēŖo **trong thư máģĨc dáģą ÃĄn cáģ§a báēĄn **.
+
+/// tip
+
+BáēĄn cáē§n là m Äiáģu nà y **máģt láē§n cho máģi dáģą ÃĄn**, không pháēŖi máģi khi báēĄn là m viáģc.
+///
+
+//// tab | `venv`
+
+Äáģ táēĄo máģt môi trưáģng áēŖo, báēĄn cÃŗ tháģ sáģ dáģĨng module `venv` cÃŗ sáēĩn cáģ§a Python.
+
+
+
+```console
+$ python -m venv .venv
+```
+
+
+
+/// details | CÃĄch cÃĄc láģnh hoáēĄt Äáģng
+
+* `python`: sáģ dáģĨng chÆ°ÆĄng trÃŦnh `python`
+* `-m`: gáģi máģt module như máģt script, chÃēng ta sáēŊ nÃŗi váģ module ÄÃŗ sau
+* `venv`: sáģ dáģĨng module `venv` ÄÆ°áģŖc cà i Äáēˇt sáēĩn cáģ§a Python
+* `.venv`: táēĄo môi trưáģng áēŖo trong thư máģĨc máģi `.venv`
+
+///
+
+////
+
+//// tab | `uv`
+
+Náēŋu báēĄn cÃŗ `uv` ÄÆ°áģŖc cà i Äáēˇt, báēĄn cÃŗ tháģ sáģ dáģĨng nÃŗ Äáģ táēĄo máģt môi trưáģng áēŖo.
+
+
+
+```console
+$ uv venv
+```
+
+
+
+/// tip
+
+Máēˇc Äáģnh, `uv` sáēŊ táēĄo máģt môi trưáģng áēŖo trong máģt thư máģĨc cÃŗ tÃĒn `.venv`.
+
+Nhưng báēĄn cÃŗ tháģ tÚy cháģnh nÃŗ báēąng cÃĄch thÃĒm máģt Äáģi sáģ váģi tÃĒn thư máģĨc.
+
+///
+
+////
+
+Láģnh nà y táēĄo máģt môi trưáģng áēŖo máģi trong máģt thư máģĨc cÃŗ tÃĒn `.venv`.
+
+/// details | `.venv` hoáēˇc tÃĒn khÃĄc
+
+BáēĄn cÃŗ tháģ táēĄo môi trưáģng áēŖo trong máģt thư máģĨc khÃĄc, nhưng thưáģng ngưáģi ta quy ưáģc Äáēˇt nÃŗ là `.venv`.
+
+///
+
+## KÃch hoáēĄt Môi trưáģng áēŖo
+
+KÃch hoáēĄt môi trưáģng áēŖo máģi Äáģ báēĨt káģŗ láģnh Python nà o báēĄn cháēĄy hoáēˇc gÃŗi nà o báēĄn cà i Äáēˇt sáēŊ sáģ dáģĨng nÃŗ.
+
+/// tip
+
+Là m Äiáģu nà y **máģi khi** báēĄn báē¯t Äáē§u máģt **phiÃĒn terminal máģi** Äáģ là m viáģc trÃĒn dáģą ÃĄn.
+
+///
+
+//// tab | Linux, macOS
+
+
+
+```console
+$ source .venv/bin/activate
+```
+
+
+
+////
+
+//// tab | Windows PowerShell
+
+
+
+```console
+$ .venv\Scripts\Activate.ps1
+```
+
+
+
+////
+
+//// tab | Windows Bash
+
+Náēŋu báēĄn sáģ dáģĨng Bash cho Windows (và dáģĨ: Git Bash ):
+
+
+
+```console
+$ source .venv/Scripts/activate
+```
+
+
+
+////
+
+/// tip
+
+Máģi khi báēĄn cà i Äáēˇt thÃĒm máģt **package máģi** trong môi trưáģng ÄÃŗ, hÃŖy **kÃch hoáēĄt** môi trưáģng ÄÃŗ láēĄi.
+
+Äiáģu nà y ÄáēŖm báēŖo ráēąng khi báēĄn sáģ dáģĨng máģt **chÆ°ÆĄng trÃŦnh dÃ˛ng láģnh (CLI )** ÄÆ°áģŖc cà i Äáēˇt táģĢ gÃŗi ÄÃŗ, báēĄn sáēŊ dÚng báēŖn cà i Äáēˇt táģĢ môi trưáģng áēŖo cáģ§a mÃŦnh thay vÃŦ báēŖn ÄÆ°áģŖc cà i Äáēˇt toà n cáģĨc khÃĄc cÃŗ tháģ cÃŗ phiÃĒn báēŖn khÃĄc váģi phiÃĒn báēŖn báēĄn cáē§n.
+
+///
+
+## Kiáģm tra xem Môi trưáģng áēŖo ÄÃŖ ÄÆ°áģŖc KÃch hoáēĄt chưa
+
+Kiáģm tra xem môi trưáģng áēŖo ÄÃŖ ÄÆ°áģŖc kÃch hoáēĄt chưa (láģnh trưáģc ÄÃŗ ÄÃŖ hoáēĄt Äáģng).
+
+/// tip
+
+Äiáģu nà y là **không báē¯t buáģc**, nhưng nÃŗ là máģt cÃĄch táģt Äáģ **kiáģm tra** ráēąng máģi tháģŠ Äang hoáēĄt Äáģng như mong ÄáģŖi và báēĄn Äang sáģ dáģĨng ÄÃēng môi trưáģng áēŖo mà báēĄn ÄÃŖ Äáģnh.
+
+///
+
+//// tab | Linux, macOS, Windows Bash
+
+
+
+```console
+$ which python
+
+/home/user/code/awesome-project/.venv/bin/python
+```
+
+
+
+Náēŋu nÃŗ hiáģn tháģ `python` binary táēĄi `.venv/bin/python`, trong dáģą ÃĄn cáģ§a báēĄn (trong trưáģng háģŖp `awesome-project`), thÃŦ táģŠc là nÃŗ hoáēĄt Äáģng. đ
+
+////
+
+//// tab | Windows PowerShell
+
+
+
+```console
+$ Get-Command python
+
+C:\Users\user\code\awesome-project\.venv\Scripts\python
+```
+
+
+
+Náēŋu nÃŗ hiáģn tháģ `python` binary táēĄi `.venv\Scripts\python`, trong dáģą ÃĄn cáģ§a báēĄn (trong trưáģng háģŖp `awesome-project`), thÃŦ táģŠc là nÃŗ hoáēĄt Äáģng. đ
+
+////
+
+## NÃĸng cáēĨp `pip`
+
+/// tip
+
+Náēŋu báēĄn sáģ dáģĨng `uv` báēĄn sáģ dáģĨng nÃŗ Äáģ cà i Äáēˇt thay vÃŦ `pip`, thÃŦ báēĄn không cáē§n cáēp nháēt `pip`. đ
+
+///
+
+Náēŋu báēĄn sáģ dáģĨng `pip` Äáģ cà i Äáēˇt gÃŗi (nÃŗ ÄÆ°áģŖc cà i Äáēˇt máēˇc Äáģnh váģi Python), báēĄn nÃĒn **nÃĸng cáēĨp** nÃŗ lÃĒn phiÃĒn báēŖn máģi nháēĨt.
+
+Nhiáģu láģi khÃĄc nhau trong khi cà i Äáēˇt gÃŗi ÄÆ°áģŖc giáēŖi quyáēŋt cháģ báēąng cÃĄch nÃĸng cáēĨp `pip` trưáģc.
+
+/// tip
+
+BáēĄn thưáģng là m Äiáģu nà y **máģt láē§n**, ngay sau khi báēĄn táēĄo môi trưáģng áēŖo.
+
+///
+
+ÄáēŖm báēŖo ráēąng môi trưáģng áēŖo ÄÃŖ ÄÆ°áģŖc kÃch hoáēĄt (váģi láģnh trÃĒn) và sau ÄÃŗ cháēĄy:
+
+
+
+```console
+$ python -m pip install --upgrade pip
+
+---> 100%
+```
+
+
+
+## ThÃĒm `.gitignore`
+
+Náēŋu báēĄn sáģ dáģĨng **Git** (nÃĒn là m), hÃŖy thÃĒm máģt file `.gitignore` Äáģ Git báģ qua máģi tháģŠ trong `.venv`.
+
+/// tip
+
+Náēŋu báēĄn sáģ dáģĨng `uv` Äáģ táēĄo môi trưáģng áēŖo, nÃŗ ÄÃŖ táģą Äáģng là m Äiáģu nà y cho báēĄn, báēĄn cÃŗ tháģ báģ qua bưáģc nà y. đ
+
+///
+
+/// tip
+
+Là m Äiáģu nà y **máģt láē§n**, ngay sau khi báēĄn táēĄo môi trưáģng áēŖo.
+
+///
+
+
+
+```console
+$ echo "*" > .venv/.gitignore
+```
+
+
+
+/// details | CÃĄch láģnh hoáēĄt Äáģng
+
+* `echo "*"`: sáēŊ "in" vÄn báēŖn `*` trong terminal (pháē§n tiáēŋp theo sáēŊ thay Äáģi Äiáģu ÄÃŗ máģt chÃēt)
+* `>`: báēĨt káģŗ vÄn báēŖn nà o ÄÆ°áģŖc in ra terminal báģi láģnh trưáģc `>` không ÄÆ°áģŖc in ra mà thay và o ÄÃŗ ÄÆ°áģŖc viáēŋt và o file áģ phÃa bÃĒn pháēŖi cáģ§a `>`
+* `.gitignore`: tÃĒn cáģ§a file mà vÄn báēŖn sáēŊ ÄÆ°áģŖc viáēŋt và o
+
+Và `*` váģi Git cÃŗ nghÄŠa là "máģi tháģŠ". VÃŦ váēy, nÃŗ sáēŊ báģ qua máģi tháģŠ trong thư máģĨc `.venv`.
+
+Láģnh nà y sáēŊ táēĄo máģt file `.gitignore` váģi náģi dung:
+
+```gitignore
+*
+```
+
+///
+
+## Cà i Äáēˇt gÃŗi (packages)
+
+Sau khi kÃch hoáēĄt môi trưáģng, báēĄn cÃŗ tháģ cà i Äáēˇt cÃĄc gÃŗi trong ÄÃŗ.
+
+/// tip
+
+Tháģąc hiáģn Äiáģu nà y **máģt láē§n** khi cà i Äáēˇt hoáēˇc cáēp nháēt gÃŗi cáē§n thiáēŋt cho dáģą ÃĄn cáģ§a báēĄn.
+
+Náēŋu báēĄn cáē§n cáēp nháēt phiÃĒn báēŖn hoáēˇc thÃĒm máģt gÃŗi máģi, báēĄn sáēŊ **tháģąc hiáģn Äiáģu nà y láēĄi**.
+
+///
+
+### Cà i Äáēˇt gÃŗi tráģąc tiáēŋp
+
+Náēŋu báēĄn cáē§n cáēp nháēt phiÃĒn báēŖn hoáēˇc thÃĒm máģt gÃŗi máģi, báēĄn sáēŊ **tháģąc hiáģn Äiáģu nà y láēĄi**.
+
+/// tip
+Äáģ quáēŖn lÃŊ dáģą ÃĄn táģt hÆĄn, hÃŖy liáģt kÃĒ táēĨt cáēŖ cÃĄc gÃŗi và phiÃĒn báēŖn cáē§n thiáēŋt trong máģt file (và dáģĨ `requirements.txt` hoáēˇc `pyproject.toml`).
+
+///
+
+//// tab | `pip`
+
+
+
+```console
+$ pip install "fastapi[standard]"
+
+---> 100%
+```
+
+
+
+////
+
+//// tab | `uv`
+
+Náēŋu báēĄn cÃŗ `uv` :
+
+
+
+```console
+$ uv pip install "fastapi[standard]"
+---> 100%
+```
+
+
+
+////
+
+### Cà i Äáēˇt táģĢ `requirements.txt`
+
+Náēŋu báēĄn cÃŗ máģt táģp `requirements.txt`, báēĄn cÃŗ tháģ sáģ dáģĨng nÃŗ Äáģ cà i Äáēˇt cÃĄc gÃŗi.
+
+//// tab | `pip`
+
+
+
+```console
+$ pip install -r requirements.txt
+---> 100%
+```
+
+
+
+////
+
+//// tab | `uv`
+
+Náēŋu báēĄn cÃŗ `uv` :
+
+
+
+```console
+$ uv pip install -r requirements.txt
+---> 100%
+```
+
+
+
+////
+
+/// details | `requirements.txt`
+
+Máģt táģp `requirements.txt` váģi máģt sáģ gÃŗi sáēŊ trông như tháēŋ nà y:
+
+```requirements.txt
+fastapi[standard]==0.113.0
+pydantic==2.8.0
+```
+
+///
+
+## CháēĄy ChÆ°ÆĄng trÃŦnh cáģ§a báēĄn
+
+Sau khi kÃch hoáēĄt môi trưáģng áēŖo, báēĄn cÃŗ tháģ cháēĄy chÆ°ÆĄng trÃŦnh cáģ§a mÃŦnh, nÃŗ sáēŊ sáģ dáģĨng Python trong môi trưáģng áēŖo cáģ§a báēĄn váģi cÃĄc gÃŗi báēĄn ÄÃŖ cà i Äáēˇt.
+
+
+
+```console
+$ python main.py
+
+Hello World
+```
+
+
+
+## CáēĨu hÃŦnh TrÃŦnh soáēĄn tháēŖo cáģ§a báēĄn
+
+Náēŋu báēĄn sáģ dáģĨng máģt trÃŦnh soáēĄn tháēŖo, hÃŖy ÄáēŖm báēŖo báēĄn cáēĨu hÃŦnh nÃŗ Äáģ sáģ dáģĨng cÚng môi trưáģng áēŖo mà báēĄn ÄÃŖ táēĄo (trÃŦnh soáēĄn tháēŖo sáēŊ táģą Äáģng phÃĄt hiáģn môi trưáģng áēŖo) Äáģ báēĄn cÃŗ tháģ nháēn ÄÆ°áģŖc tÃnh nÄng táģą Äáģng hoà n thà nh cÃĸu láģnh (autocomplete) và in láģi tráģąc tiáēŋp trong trÃŦnh soáēĄn tháēŖo (inline errors).
+
+VÃ dáģĨ:
+
+* VS Code
+* PyCharm
+
+/// tip
+
+BáēĄn thưáģng cháģ cáē§n là m Äiáģu nà y **máģt láē§n**, khi báēĄn táēĄo môi trưáģng áēŖo.
+
+///
+
+## Huáģˇ kÃch hoáēĄt Môi trưáģng áēŖo
+
+Khi báēĄn hoà n táēĨt viáģc là m trÃĒn dáģą ÃĄn cáģ§a báēĄn, báēĄn cÃŗ tháģ **huáģˇ kÃch hoáēĄt** môi trưáģng áēŖo.
+
+
+
+```console
+$ deactivate
+```
+
+
+
+Như váēy, khi báēĄn cháēĄy `python`, nÃŗ sáēŊ không cháēĄy táģĢ môi trưáģng áēŖo ÄÃŗ váģi cÃĄc gÃŗi ÄÃŖ cà i Äáēˇt.
+
+## Sáēĩn sà ng Äáģ Là m viáģc
+
+BÃĸy giáģ báēĄn ÄÃŖ sáēĩn sà ng Äáģ là m viáģc trÃĒn dáģą ÃĄn cáģ§a mÃŦnh ráģi ÄáēĨy.
+
+/// tip
+
+BáēĄn muáģn hiáģu táēĨt cáēŖ nháģ¯ng gÃŦ áģ trÃĒn?
+
+Tiáēŋp táģĨc Äáģc. đđ¤
+
+///
+
+## TáēĄi sao cáē§n Môi trưáģng áēŖo
+
+Äáģ là m viáģc váģi FastAPI, báēĄn cáē§n cà i Äáēˇt Python .
+
+Sau ÄÃŗ, báēĄn sáēŊ cáē§n **cà i Äáēˇt** FastAPI và báēĨt káģŗ **gÃŗi** nà o mà báēĄn muáģn sáģ dáģĨng.
+
+Äáģ cà i Äáēˇt gÃŗi, báēĄn thưáģng sáģ dáģĨng láģnh `pip` cÃŗ sáēĩn váģi Python (hoáēˇc cÃĄc phiÃĒn báēŖn tÆ°ÆĄng táģą).
+
+Tuy nhiÃĒn, náēŋu báēĄn sáģ dáģĨng `pip` tráģąc tiáēŋp, cÃĄc gÃŗi sáēŊ ÄÆ°áģŖc cà i Äáēˇt trong **môi trưáģng Python toà n cáģĨc** cáģ§a báēĄn (pháē§n cà i Äáēˇt toà n cáģĨc cáģ§a Python).
+
+### VáēĨn Äáģ
+
+Váēy, váēĨn Äáģ gÃŦ khi cà i Äáēˇt gÃŗi trong môi trưáģng Python toà n cáģĨc?
+
+Trong máģt và i tháģi Äiáģm, báēĄn sáēŊ pháēŖi viáēŋt nhiáģu chÆ°ÆĄng trÃŦnh khÃĄc nhau pháģĨ thuáģc và o **cÃĄc gÃŗi khÃĄc nhau**. Và máģt sáģ dáģą ÃĄn báēĄn tháģąc hiáģn láēĄi pháģĨ thuáģc và o **cÃĄc phiÃĒn báēŖn khÃĄc nhau** cáģ§a cÚng máģt gÃŗi. đą
+
+Và dáģĨ, báēĄn cÃŗ tháģ táēĄo máģt dáģą ÃĄn ÄÆ°áģŖc gáģi là `philosophers-stone`, chÆ°ÆĄng trÃŦnh nà y pháģĨ thuáģc và o máģt gÃŗi khÃĄc ÄÆ°áģŖc gáģi là **`harry`, sáģ dáģĨng phiÃĒn báēŖn `1`**. VÃŦ váēy, báēĄn cáē§n cà i Äáēˇt `harry`.
+
+```mermaid
+flowchart LR
+ stone(philosophers-stone) -->|pháģĨ thuáģc| harry-1[harry v1]
+```
+
+Sau ÄÃŗ, và o máģt và i tháģi Äiáģm sau, báēĄn táēĄo máģt dáģą ÃĄn khÃĄc ÄÆ°áģŖc gáģi là `prisoner-of-azkaban`, và dáģą ÃĄn nà y cÅŠng pháģĨ thuáģc và o `harry`, nhưng dáģą ÃĄn nà y cáē§n **`harry` phiÃĒn báēŖn `3`**.
+
+```mermaid
+flowchart LR
+ azkaban(prisoner-of-azkaban) --> |pháģĨ thuáģc| harry-3[harry v3]
+```
+
+BÃĸy giáģ, váēĨn Äáģ là , náēŋu báēĄn cà i Äáēˇt cÃĄc gÃŗi toà n cáģĨc (trong môi trưáģng toà n cáģĨc) thay vÃŦ trong máģt **môi trưáģng áēŖo cáģĨc báģ**, báēĄn sáēŊ pháēŖi cháģn phiÃĒn báēŖn `harry` nà o Äáģ cà i Äáēˇt.
+
+Náēŋu báēĄn muáģn cháēĄy `philosophers-stone` báēĄn sáēŊ cáē§n pháēŖi cà i Äáēˇt `harry` phiÃĒn báēŖn `1`, và dáģĨ váģi:
+
+
+
+```console
+$ pip install "harry==1"
+```
+
+
+
+Và sau ÄÃŗ báēĄn sáēŊ cÃŗ `harry` phiÃĒn báēŖn `1` ÄÆ°áģŖc cà i Äáēˇt trong môi trưáģng Python toà n cáģĨc cáģ§a báēĄn.
+
+```mermaid
+flowchart LR
+ subgraph global[môi trưáģng toà n cáģĨc]
+ harry-1[harry v1]
+ end
+ subgraph stone-project[dáģą ÃĄn philosophers-stone ]
+ stone(philosophers-stone) -->|pháģĨ thuáģc| harry-1
+ end
+```
+
+Nhưng sau ÄÃŗ, náēŋu báēĄn muáģn cháēĄy `prisoner-of-azkaban`, báēĄn sáēŊ cáē§n pháēŖi gáģĄ báģ `harry` phiÃĒn báēŖn `1` và cà i Äáēˇt `harry` phiÃĒn báēŖn `3` (hoáēˇc cháģ cáē§n cà i Äáēˇt phiÃĒn báēŖn `3` sáēŊ táģą Äáģng gáģĄ báģ phiÃĒn báēŖn `1`).
+
+
+
+```console
+$ pip install "harry==3"
+```
+
+
+
+Và sau ÄÃŗ báēĄn sáēŊ cÃŗ `harry` phiÃĒn báēŖn `3` ÄÆ°áģŖc cà i Äáēˇt trong môi trưáģng Python toà n cáģĨc cáģ§a báēĄn.
+
+Và náēŋu báēĄn cáģ gáē¯ng cháēĄy `philosophers-stone` láēĄi, cÃŗ kháēŖ nÄng nÃŗ sáēŊ **không hoáēĄt Äáģng** vÃŦ nÃŗ cáē§n `harry` phiÃĒn báēŖn `1`.
+
+```mermaid
+flowchart LR
+ subgraph global[môi trưáģng toà n cáģĨc]
+ harry-1[harry v1 ]
+ style harry-1 fill:#ccc,stroke-dasharray: 5 5
+ harry-3[harry v3]
+ end
+ subgraph stone-project[dáģą ÃĄn philosophers-stone ]
+ stone(philosophers-stone) -.-x|âī¸| harry-1
+ end
+ subgraph azkaban-project[dáģą ÃĄn prisoner-of-azkaban ]
+ azkaban(prisoner-of-azkaban) --> |pháģĨ thuáģc| harry-3
+ end
+```
+
+/// tip
+
+Máēˇc dÚ cÃĄc gÃŗi Python thưáģng cáģ gáē¯ng **trÃĄnh cÃĄc thay Äáģi là m háģng code** trong **phiÃĒn báēŖn máģi**, nhưng Äáģ ÄáēŖm báēŖo an toà n, báēĄn nÃĒn cháģ§ Äáģng cà i Äáēˇt phiÃĒn báēŖn máģi và cháēĄy kiáģm tháģ Äáģ xÃĄc nháēn máģi tháģŠ váēĢn hoáēĄt Äáģng ÄÃēng.
+
+///
+
+BÃĸy giáģ, hÃŖy hÃŦnh dung váģ **nhiáģu** gÃŗi khÃĄc nhau mà táēĨt cáēŖ cÃĄc dáģą ÃĄn cáģ§a báēĄn pháģĨ thuáģc và o. RÃĩ rà ng ráēĨt khÃŗ Äáģ quáēŖn lÃŊ. Äiáģu nà y dáēĢn táģi viáģc là báēĄn sáēŊ cÃŗ nhiáģu dáģą ÃĄn váģi **cÃĄc phiÃĒn báēŖn không tÆ°ÆĄng thÃch** cáģ§a cÃĄc gÃŗi, và báēĄn cÃŗ tháģ không biáēŋt táēĄi sao máģt sáģ tháģŠ không hoáēĄt Äáģng.
+
+HÆĄn náģ¯a, tuáģŗ và o háģ Äiáģu hà nh cáģ§a báēĄn (vd Linux, Windows, macOS), cÃŗ tháģ ÄÃŖ cÃŗ Python ÄÆ°áģŖc cà i Äáēˇt sáēĩn. Trong trưáģng háģŖp áēĨy, máģt và i gÃŗi nhiáģu kháēŖ nÄng ÄÃŖ ÄÆ°áģŖc cà i Äáēˇt trưáģc váģi cÃĄc phiÃĒn báēŖn **cáē§n thiáēŋt cho háģ tháģng cáģ§a báēĄn**. Náēŋu báēĄn cà i Äáēˇt cÃĄc gÃŗi trong môi trưáģng Python toà n cáģĨc, báēĄn cÃŗ tháģ sáēŊ **phÃĄ váģĄ** máģt sáģ chÆ°ÆĄng trÃŦnh ÄÃŖ ÄÆ°áģŖc cà i Äáēˇt sáēĩn cÚng háģ tháģng.
+
+## NÆĄi cÃĄc GÃŗi ÄÆ°áģŖc Cà i Äáēˇt
+
+Khi báēĄn cà i Äáēˇt Python, nÃŗ sáēŊ táēĄo ra máģt và i thư máģĨc và táģp trong mÃĄy tÃnh cáģ§a báēĄn.
+
+Máģt và i thư máģĨc nà y là nháģ¯ng thư máģĨc cháģu trÃĄch nhiáģm cÃŗ táēĨt cáēŖ cÃĄc gÃŗi báēĄn cà i Äáēˇt.
+
+Khi báēĄn cháēĄy:
+
+
+
+```console
+// ÄáģĢng cháēĄy láģnh nà y ngay, ÄÃĸy cháģ là máģt và dáģĨ đ¤
+$ pip install "fastapi[standard]"
+---> 100%
+```
+
+
+
+Láģnh nà y sáēŊ táēŖi xuáģng máģt táģp nÊn váģi mÃŖ nguáģn FastAPI, thưáģng là táģĢ PyPI .
+
+NÃŗ cÅŠng sáēŊ **táēŖi xuáģng** cÃĄc táģp cho cÃĄc gÃŗi khÃĄc mà FastAPI pháģĨ thuáģc và o.
+
+Sau ÄÃŗ, nÃŗ sáēŊ **giáēŖi nÊn** táēĨt cáēŖ cÃĄc táģp ÄÃŗ vÃ ÄÆ°a chÃēng và o máģt thư máģĨc trong mÃĄy tÃnh cáģ§a báēĄn.
+
+Máēˇc Äáģnh, nÃŗ sáēŊ ÄÆ°a cÃĄc táģp ÄÃŖ táēŖi xuáģng và giáēŖi nÊn và o thư máģĨc ÄÆ°áģŖc cà i Äáēˇt cÚng Python cáģ§a báēĄn, ÄÃŗ là **môi trưáģng toà n cáģĨc**.
+
+## Nháģ¯ng Môi trưáģng áēŖo là gÃŦ?
+
+CÃĄch giáēŖi quyáēŋt cho váēĨn Äáģ cÃŗ táēĨt cáēŖ cÃĄc gÃŗi trong môi trưáģng toà n cáģĨc là sáģ dáģĨng máģt **môi trưáģng áēŖo cho máģi dáģą ÃĄn** báēĄn là m viáģc.
+
+Máģt môi trưáģng áēŖo là máģt **thư máģĨc**, ráēĨt giáģng váģi môi trưáģng toà n cáģĨc, trong ÄÃŗ báēĄn cÃŗ tháģ cà i Äáēˇt cÃĄc gÃŗi cho máģt dáģą ÃĄn.
+
+VÃŦ váēy, máģi dáģą ÃĄn sáēŊ cÃŗ máģt môi trưáģng áēŖo riÃĒng cáģ§a nÃŗ (thư máģĨc `.venv`) váģi cÃĄc gÃŗi riÃĒng cáģ§a nÃŗ.
+
+```mermaid
+flowchart TB
+ subgraph stone-project[dáģą ÃĄn philosophers-stone ]
+ stone(philosophers-stone) --->|pháģĨ thuáģc| harry-1
+ subgraph venv1[.venv]
+ harry-1[harry v1]
+ end
+ end
+ subgraph azkaban-project[dáģą ÃĄn prisoner-of-azkaban ]
+ azkaban(prisoner-of-azkaban) --->|pháģĨ thuáģc| harry-3
+ subgraph venv2[.venv]
+ harry-3[harry v3]
+ end
+ end
+ stone-project ~~~ azkaban-project
+```
+
+## KÃch hoáēĄt Môi trưáģng áēŖo nghÄŠa là gÃŦ
+
+Khi báēĄn kÃch hoáēĄt máģt môi trưáģng áēŖo, và dáģĨ váģi:
+
+//// tab | Linux, macOS
+
+
+
+```console
+$ source .venv/bin/activate
+```
+
+
+
+////
+
+//// tab | Windows PowerShell
+
+
+
+```console
+$ .venv\Scripts\Activate.ps1
+```
+
+
+
+////
+
+//// tab | Windows Bash
+
+Náēŋu báēĄn sáģ dáģĨng Bash cho Windows (và dáģĨ Git Bash ):
+
+
+
+```console
+$ source .venv/Scripts/activate
+```
+
+
+
+////
+
+Láģnh nà y sáēŊ táēĄo hoáēˇc sáģa Äáģi máģt sáģ [biáēŋn môi trưáģng](environment-variables.md){.internal-link target=_blank} mà sáēŊ ÄÆ°áģŖc sáģ dáģĨng cho cÃĄc láģnh tiáēŋp theo.
+
+Máģt trong sáģ ÄÃŗ là biáēŋn `PATH`.
+
+/// tip
+
+BáēĄn cÃŗ tháģ tÃŦm hiáģu thÃĒm váģ biáēŋn `PATH` trong [Biáēŋn môi trưáģng](environment-variables.md#path-environment-variable){.internal-link target=_blank} section.
+
+///
+
+KÃch hoáēĄt môi trưáģng áēŖo thÃĒm ÄÆ°áģng dáēĢn `.venv/bin` (trÃĒn Linux và macOS) hoáēˇc `.venv\Scripts` (trÃĒn Windows) và o biáēŋn `PATH`.
+
+GiáēŖ sáģ ráēąng trưáģc khi kÃch hoáēĄt môi trưáģng, biáēŋn `PATH` như sau:
+
+//// tab | Linux, macOS
+
+```plaintext
+/usr/bin:/bin:/usr/sbin:/sbin
+```
+
+NghÄŠa là háģ tháģng sáēŊ tÃŦm kiáēŋm chÆ°ÆĄng trÃŦnh trong:
+
+* `/usr/bin`
+* `/bin`
+* `/usr/sbin`
+* `/sbin`
+
+////
+
+//// tab | Windows
+
+```plaintext
+C:\Windows\System32
+```
+
+NghÄŠa là háģ tháģng sáēŊ tÃŦm kiáēŋm chÆ°ÆĄng trÃŦnh trong:
+
+* `C:\Windows\System32`
+
+////
+
+Sau khi kÃch hoáēĄt môi trưáģng áēŖo, biáēŋn `PATH` sáēŊ như sau:
+
+//// tab | Linux, macOS
+
+```plaintext
+/home/user/code/awesome-project/.venv/bin:/usr/bin:/bin:/usr/sbin:/sbin
+```
+
+NghÄŠa là háģ tháģng sáēŊ báē¯t Äáē§u tÃŦm kiáēŋm chÆ°ÆĄng trÃŦnh trong:
+
+```plaintext
+/home/user/code/awesome-project/.venv/bin
+```
+
+trưáģc khi tÃŦm kiáēŋm trong cÃĄc thư máģĨc khÃĄc.
+
+VÃŦ váēy, khi báēĄn gÃĩ `python` trong terminal, háģ tháģng sáēŊ tÃŦm tháēĨy chÆ°ÆĄng trÃŦnh Python trong:
+
+```plaintext
+/home/user/code/awesome-project/.venv/bin/python
+```
+
+và sáģ dáģĨng chÆ°ÆĄng trÃŦnh ÄÃŗ.
+
+////
+
+//// tab | Windows
+
+```plaintext
+C:\Users\user\code\awesome-project\.venv\Scripts;C:\Windows\System32
+```
+
+NghÄŠa là háģ tháģng sáēŊ báē¯t Äáē§u tÃŦm kiáēŋm chÆ°ÆĄng trÃŦnh trong:
+
+```plaintext
+C:\Users\user\code\awesome-project\.venv\Scripts
+```
+
+trưáģc khi tÃŦm kiáēŋm trong cÃĄc thư máģĨc khÃĄc.
+
+VÃŦ váēy, khi báēĄn gÃĩ `python` trong terminal, háģ tháģng sáēŊ tÃŦm tháēĨy chÆ°ÆĄng trÃŦnh Python trong:
+
+```plaintext
+C:\Users\user\code\awesome-project\.venv\Scripts\python
+```
+
+và sáģ dáģĨng chÆ°ÆĄng trÃŦnh ÄÃŗ.
+
+////
+
+Máģt chi tiáēŋt quan tráģng là nÃŗ sáēŊ ÄÆ°a Äáģa cháģ cáģ§a môi trưáģng áēŖo và o **Äáē§u** cáģ§a biáēŋn `PATH`. Háģ tháģng sáēŊ tÃŦm kiáēŋm nÃŗ **trưáģc** khi tÃŦm kiáēŋm báēĨt káģŗ Python nà o khÃĄc cÃŗ sáēĩn. VÃŦ váēy, khi báēĄn cháēĄy `python`, nÃŗ sáēŊ sáģ dáģĨng Python **táģĢ môi trưáģng áēŖo** thay vÃŦ báēĨt káģŗ Python nà o khÃĄc (và dáģĨ, Python táģĢ môi trưáģng toà n cáģĨc).
+
+KÃch hoáēĄt máģt môi trưáģng áēŖo cÅŠng thay Äáģi máģt và i tháģŠ khÃĄc, nhưng ÄÃĸy là máģt trong nháģ¯ng Äiáģu quan tráģng nháēĨt mà nÃŗ tháģąc hiáģn.
+
+## Kiáģm tra máģt Môi trưáģng áēŖo
+
+Khi báēĄn kiáģm tra máģt môi trưáģng áēŖo ÄÃŖ ÄÆ°áģŖc kÃch hoáēĄt chưa, và dáģĨ váģi:
+
+//// tab | Linux, macOS, Windows Bash
+
+
+
+```console
+$ which python
+
+/home/user/code/awesome-project/.venv/bin/python
+```
+
+
+
+////
+
+//// tab | Windows PowerShell
+
+
+
+```console
+$ Get-Command python
+
+C:\Users\user\code\awesome-project\.venv\Scripts\python
+```
+
+
+
+////
+
+
+Äiáģu ÄÃŗ cÃŗ nghÄŠa là chÆ°ÆĄng trÃŦnh `python` sáēŊ ÄÆ°áģŖc sáģ dáģĨng là chÆ°ÆĄng trÃŦnh **trong môi trưáģng áēŖo**.
+
+BáēĄn sáģ dáģĨng `which` trÃĒn Linux và macOS và `Get-Command` trÃĒn Windows PowerShell.
+
+CÃĄch hoáēĄt Äáģng cáģ§a láģnh nà y là nÃŗ sáēŊ Äi và kiáģm tra biáēŋn `PATH`, Äi qua **máģi ÄÆ°áģng dáēĢn theo tháģŠ táģą**, tÃŦm kiáēŋm chÆ°ÆĄng trÃŦnh ÄÆ°áģŖc gáģi là `python`. Khi nÃŗ tÃŦm tháēĨy nÃŗ, nÃŗ sáēŊ **hiáģn tháģ cho báēĄn ÄÆ°áģng dáēĢn** Äáēŋn chÆ°ÆĄng trÃŦnh ÄÃŗ.
+
+Äiáģu quan tráģng nháēĨt là khi báēĄn gáģi `python`, ÄÃŗ chÃnh là chÆ°ÆĄng trÃŦnh `python` ÄÆ°áģŖc tháģąc thi.
+
+VÃŦ váēy, báēĄn cÃŗ tháģ xÃĄc nháēn náēŋu báēĄn Äang áģ trong môi trưáģng áēŖo ÄÃēng.
+
+/// tip
+
+Dáģ
dà ng kÃch hoáēĄt máģt môi trưáģng áēŖo, cà i Äáēˇt Python, và sau ÄÃŗ **chuyáģn Äáēŋn máģt dáģą ÃĄn khÃĄc**.
+
+Và dáģą ÃĄn tháģŠ hai **sáēŊ không hoáēĄt Äáģng** vÃŦ báēĄn Äang sáģ dáģĨng **Python không ÄÃēng**, táģĢ máģt môi trưáģng áēŖo cho máģt dáģą ÃĄn khÃĄc.
+
+Tháēt tiáģn láģŖi khi cÃŗ tháģ kiáģm tra `python` nà o Äang ÄÆ°áģŖc sáģ dáģĨng đ¤
+
+///
+
+## TáēĄi sao láēĄi Huáģˇ kÃch hoáēĄt máģt Môi trưáģng áēŖo
+
+Và dáģĨ, báēĄn cÃŗ tháģ là m viáģc trÃĒn máģt dáģą ÃĄn `philosophers-stone`, **kÃch hoáēĄt môi trưáģng áēŖo**, cà i Äáēˇt cÃĄc gÃŗi và là m viáģc váģi môi trưáģng áēŖo ÄÃŗ.
+
+Sau ÄÃŗ, báēĄn muáģn là m viáģc trÃĒn **dáģą ÃĄn khÃĄc** `prisoner-of-azkaban`.
+
+BáēĄn Äi Äáēŋn dáģą ÃĄn ÄÃŗ:
+
+
+
+```console
+$ cd ~/code/prisoner-of-azkaban
+```
+
+
+
+Náēŋu báēĄn không táē¯t môi trưáģng áēŖo cho `philosophers-stone`, khi báēĄn cháēĄy `python` trong terminal, nÃŗ sáēŊ cáģ gáē¯ng sáģ dáģĨng Python táģĢ `philosophers-stone`.
+
+
+
+```console
+$ cd ~/code/prisoner-of-azkaban
+
+$ python main.py
+
+// Láģi khi import sirius, nÃŗ không ÄÆ°áģŖc cà i Äáēˇt đą
+Traceback (most recent call last):
+ File "main.py", line 1, in
+ import sirius
+```
+
+
+
+Náēŋu báēĄn huáģˇ kÃch hoáēĄt môi trưáģng áēŖo hiáģn táēĄi và kÃch hoáēĄt môi trưáģng áēŖo máģi cho `prisoner-of-azkaban`, khi báēĄn cháēĄy `python`, nÃŗ sáēŊ sáģ dáģĨng Python táģĢ môi trưáģng áēŖo trong `prisoner-of-azkaban`.
+
+
+
+```console
+$ cd ~/code/prisoner-of-azkaban
+
+// BáēĄn không cáē§n pháēŖi áģ trong thư máģĨc trưáģc Äáģ huáģˇ kÃch hoáēĄt, báēĄn cÃŗ tháģ là m Äiáģu ÄÃŗ áģ báēĨt káģŗ ÄÃĸu, ngay cáēŖ sau khi Äi Äáēŋn dáģą ÃĄn khÃĄc đ
+$ deactivate
+
+// KÃch hoáēĄt môi trưáģng áēŖo trong prisoner-of-azkaban/.venv đ
+$ source .venv/bin/activate
+
+// BÃĸy giáģ khi báēĄn cháēĄy python, nÃŗ sáēŊ tÃŦm tháēĨy gÃŗi sirius ÄÆ°áģŖc cà i Äáēˇt trong môi trưáģng áēŖo nà y â¨
+$ python main.py
+
+I solemnly swear đē
+
+(Tôi long tráģng tháģ đē - cÃĸu nà y ÄÆ°áģŖc láēĨy táģĢ Harry Potter, chÃē thÃch cáģ§a ngưáģi dáģch)
+```
+
+
+
+## CÃĄc cÃĄch là m tÆ°ÆĄng táģą
+
+ÄÃĸy là máģt hưáģng dáēĢn ÄÆĄn giáēŖn Äáģ báēĄn cÃŗ tháģ báē¯t Äáē§u và hiáģu cÃĄch máģi tháģŠ hoáēĄt Äáģng **bÃĒn trong**.
+
+CÃŗ nhiáģu **cÃĄch khÃĄc nhau** Äáģ quáēŖn là cÃĄc môi trưáģng áēŖo, cÃĄc gÃŗi pháģĨ thuáģc (requirements), và cÃĄc dáģą ÃĄn.
+
+Máģt khi báēĄn ÄÃŖ sáēĩn sà ng và muáģn sáģ dáģĨng máģt công cáģĨ Äáģ **quáēŖn là cáēŖ dáģą ÃĄn**, cÃĄc gÃŗi pháģĨ thuáģc, cÃĄc môi trưáģng áēŖo, v.v. Tôi sáēŊ khuyÃĒn báēĄn nÃĒn tháģ uv .
+
+`uv` cÃŗ tháģ là m nhiáģu tháģŠ, cháēŗng háēĄn:
+
+* **Cà i Äáēˇt Python** cho báēĄn, bao gáģm nhiáģu phiÃĒn báēŖn khÃĄc nhau
+* QuáēŖn là **cÃĄc môi trưáģng áēŖo** cho cÃĄc dáģą ÃĄn cáģ§a báēĄn
+* Cà i Äáēˇt **cÃĄc gÃŗi (packages)**
+* QuáēŖn là **cÃĄc thà nh pháē§n pháģĨ thuáģc và phiÃĒn báēŖn** cáģ§a cÃĄc gÃŗi cho dáģą ÃĄn cáģ§a báēĄn
+* ÄáēŖm báēŖo ráēąng báēĄn cÃŗ máģt **táēp háģŖp chÃnh xÃĄc** cÃĄc gÃŗi và phiÃĒn báēŖn Äáģ cà i Äáēˇt, bao gáģm cÃĄc thà nh pháē§n pháģĨ thuáģc cáģ§a chÃēng, Äáģ báēĄn cÃŗ tháģ ÄáēŖm báēŖo ráēąng báēĄn cÃŗ tháģ cháēĄy dáģą ÃĄn cáģ§a báēĄn trong sáēŖn xuáēĨt chÃnh xÃĄc như trong mÃĄy tÃnh cáģ§a báēĄn trong khi phÃĄt triáģn, Äiáģu nà y ÄÆ°áģŖc gáģi là **locking**
+* Và cÃ˛n nhiáģu tháģŠ khÃĄc náģ¯a
+
+## Káēŋt luáēn
+
+Náēŋu báēĄn ÄÃŖ Äáģc và hiáģu háēŋt nháģ¯ng Äiáģu nà y, khÃĄ cháē¯c là bÃĸy giáģ báēĄn ÄÃŖ **biáēŋt nhiáģu hÆĄn** váģ môi trưáģng áēŖo so váģi kha khÃĄ láēp trÃŦnh viÃĒn khÃĄc ÄáēĨy. đ¤
+
+Nháģ¯ng hiáģu biáēŋt chi tiáēŋt nà y cÃŗ tháģ sáēŊ háģ¯u Ãch váģi báēĄn trong tÆ°ÆĄng lai khi mà báēĄn cáē§n gáģĄ láģi máģt và i tháģŠ pháģŠc táēĄp, và báēĄn ÄÃŖ cÃŗ nháģ¯ng hiáģu biáēŋt váģ **ngáģn ngà nh gáģc ráģ
cÃĄch nÃŗ hoáēĄt Äáģng**. đ
diff --git a/docs/yo/docs/index.md b/docs/yo/docs/index.md
index 3ad1483de..d6aa78b3d 100644
--- a/docs/yo/docs/index.md
+++ b/docs/yo/docs/index.md
@@ -12,7 +12,7 @@
-
+
diff --git a/docs/zh-hant/docs/index.md b/docs/zh-hant/docs/index.md
index 137a17284..81d99ede4 100644
--- a/docs/zh-hant/docs/index.md
+++ b/docs/zh-hant/docs/index.md
@@ -6,7 +6,7 @@
-
+
diff --git a/docs/zh/docs/deployment/concepts.md b/docs/zh/docs/deployment/concepts.md
index 7a0b6c3d2..f7208da7c 100644
--- a/docs/zh/docs/deployment/concepts.md
+++ b/docs/zh/docs/deployment/concepts.md
@@ -220,7 +220,7 @@
čŋäēåˇĨäŊčŋį¨å°æ¯čŋčĄæ¨įåēį¨į¨åēįčŋį¨īŧåŽäģŦå°æ§čĄä¸ģčĻ莥įŽäģĨæĨæļ **蝎æą** åšļčŋå **ååē**īŧåšļä¸åŽäģŦå°å čŊŊæ¨æžå
Ĩ RAM ä¸įåéä¸įäģģäŊå
厚ã
-
+
åŊįļīŧé¤ä翍įåēį¨į¨åēäšå¤īŧåä¸å°æēå¨å¯čŊčŋčŋčĄ**å
ļäģčŋį¨**ã
diff --git a/docs/zh/docs/deployment/https.md b/docs/zh/docs/deployment/https.md
index 9c963d587..d994c4add 100644
--- a/docs/zh/docs/deployment/https.md
+++ b/docs/zh/docs/deployment/https.md
@@ -86,7 +86,7 @@
DNS æåĄå¨äŧå蝿ĩč§å¨äŊŋ፿ä¸ĒįšåŽį **IP å°å**ã čŋå°æ¯äŊ å¨ DNS æåĄå¨ä¸ä¸ēäŊ įæåĄå¨é
įŊŽįå
Ŧå
ą IP å°åã
-
+
### TLS æĄæåŧå§
@@ -94,7 +94,7 @@ DNS æåĄå¨äŧå蝿ĩč§å¨äŊŋ፿ä¸ĒįšåŽį **IP å°å**ã čŋå°æ¯
éäŋĄįįŦŦä¸é¨ååĒæ¯åģēįĢåŽĸæˇį̝åæåĄå¨äšé´įčŋæĨåšļåŗåŽåŽäģŦå°äŊŋį¨įå å¯å¯éĨįã
-
+
åŽĸæˇį̝åæåĄå¨äšé´åģēįĢ TLS čŋæĨįčŋį¨į§°ä¸ē **TLS æĄæ**ã
@@ -112,7 +112,7 @@ TLS įģæĸäģŖįå¯äģĨčŽŋéŽä¸ä¸Ēæå¤ä¸Ē **TLS č¯äšĻ**īŧHTTPS č¯äšĻīŧã
å¨čŋį§æ
åĩä¸īŧåŽå°äŊŋį¨`someapp.example.com`įč¯äšĻã
-
+
åŽĸæˇį̝厞įģ**äŋĄäģģ**įæč¯Ĩ TLS č¯äšĻįåŽäŊīŧ卿Ŧäžä¸ä¸ē Let's EncryptīŧäŊæäģŦį¨åäŧįå°īŧīŧå æ¤åŽå¯äģĨ**éĒč¯**č¯Ĩč¯äšĻæ¯åĻææã
@@ -134,19 +134,19 @@ TLS įģæĸäģŖįå¯äģĨčŽŋéŽä¸ä¸Ēæå¤ä¸Ē **TLS č¯äšĻ**īŧHTTPS č¯äšĻīŧã
æĨ䏿ĨīŧåŽĸæˇį̝åéä¸ä¸Ē **HTTPS 蝎æą**ã čŋå
ļåŽåĒæ¯ä¸ä¸Ēéčŋ TLS å å¯čŋæĨį HTTP 蝎æąã
-
+
### č§Ŗå¯č¯ˇæą
TLS įģæĸäģŖįå°äŊŋį¨åååĨŊįå å¯įŽæŗ**č§Ŗå¯č¯ˇæą**īŧåšļå°**īŧč§Ŗå¯įīŧHTTP 蝎æą**äŧ čžå°čŋčĄåēį¨į¨åēįčŋį¨īŧäžåĻčŋčĄ FastAPI åēį¨į Uvicorn čŋį¨īŧã
-
+
### HTTP ååē
åēį¨į¨åēå°å¤į蝎æąåšļå TLS įģæĸäģŖįåé**īŧæĒå å¯īŧHTTP ååē**ã
-
+
### HTTPS ååē
@@ -154,7 +154,7 @@ TLS įģæĸäģŖįå°äŊŋį¨åååĨŊįå å¯įŽæŗ**č§Ŗå¯č¯ˇæą**īŧåšļå°**īŧ
æĨ䏿Ĩīŧæĩč§å¨å°éĒč¯åå翝åĻææåæ¯åĻäŊŋį¨äēæŖįĄŽįå å¯å¯éĨįãįļååŽäŧ**č§Ŗå¯ååē**åšļå¤įåŽã
-
+
åŽĸæˇį̝īŧæĩč§å¨īŧå°įĨéååēæĨčĒæŖįĄŽįæåĄå¨īŧå ä¸ēåŽäŊŋį¨äēäģäģŦäšåäŊŋ፠**HTTPS č¯äšĻ** åååēįå å¯įŽæŗã
@@ -164,7 +164,7 @@ TLS įģæĸäģŖįå°äŊŋį¨åååĨŊįå å¯įŽæŗ**č§Ŗå¯č¯ˇæą**īŧåšļå°**īŧ
åĒæä¸ä¸Ēčŋį¨å¯äģĨå¤įįšåŽį IP åį̝åŖīŧ卿äģŦįį¤ēäžä¸ä¸ē TLS įģæĸäģŖįīŧīŧäŊå
ļäģåēį¨į¨åē/čŋį¨äšå¯äģĨ卿åĄå¨ä¸čŋčĄīŧåĒčĻåŽäģŦä¸å°č¯äŊŋį¨į¸åį **å
Ŧå
ą IP åį̝åŖįįģå**ã
-
+
čŋæ ˇīŧTLS įģæĸäģŖįå°ąå¯äģĨä¸ēå¤ä¸Ēåēį¨į¨åēå¤į**å¤ä¸Ēåå**į HTTPS åč¯äšĻīŧįļå卿¯į§æ
åĩä¸å°č¯ˇæąäŧ čžå°æŖįĄŽįåēį¨į¨åēã
@@ -174,7 +174,7 @@ TLS įģæĸäģŖįå°äŊŋį¨åååĨŊįå å¯įŽæŗ**č§Ŗå¯č¯ˇæą**īŧåšļå°**īŧ
įļåīŧäŧæåĻä¸ä¸Ēį¨åēīŧ卿äēæ
åĩ䏿¯åĻä¸ä¸Ēį¨åēīŧ卿äēæ
åĩä¸å¯čŊæ¯åä¸ä¸Ē TLS įģæĸäģŖįīŧä¸ Let's Encrypt éäŋĄåšļæ´æ°č¯äšĻã
-
+
**TLS č¯äšĻ** **ä¸ååį¸å
ŗč**īŧč䏿¯ä¸ IP å°åį¸å
ŗčã
diff --git a/docs/zh/docs/deployment/manually.md b/docs/zh/docs/deployment/manually.md
index 30ee7a1e9..3dc5942e3 100644
--- a/docs/zh/docs/deployment/manually.md
+++ b/docs/zh/docs/deployment/manually.md
@@ -1,159 +1,157 @@
-# æå¨čŋčĄæåĄå¨ - Uvicorn
+# æå¨čŋčĄæåĄå¨
-å¨čŋ፿åĄå¨čŽĄįŽæēä¸čŋčĄ **FastAPI** åēį¨į¨åēæéįä¸ģčĻä¸čĨŋæ¯ ASGI æåĄå¨į¨åēīŧäžåĻ **Uvicorn**ã
+## äŊŋ፠`fastapi run` åŊäģ¤
-æ 3 ä¸Ēä¸ģčĻå¯éæšæĄīŧ
+įŽčč¨äšīŧäŊŋ፠`fastapi run` æĨčŋčĄæ¨į FastAPI åēį¨į¨åēīŧ
-* Uvicorn īŧéĢæ§čŊ ASGI æåĄå¨ã
-* Hypercorn īŧä¸ HTTP/2 å Trio įå
ŧ厚į ASGI æåĄå¨ã
-* Daphne īŧä¸ē Django Channels æåģēį ASGI æåĄå¨ã
-
-## æåĄå¨ä¸ģæēåæåĄå¨į¨åē
-
-å
ŗäēåį§°īŧæä¸ä¸Ēå°įģčéčĻ莰äŊã đĄ
-
-â**æåĄå¨**âä¸č¯é常į¨äēæčŋį¨/äēčŽĄįŽæēīŧįŠįæēæčææēīŧäģĨåå¨č¯ĨčŽĄįŽæēä¸čŋčĄįį¨åēīŧäžåĻ Uvicornīŧã
+
-č¯ˇčŽ°äŊīŧåŊæ¨ä¸čŦč¯ģå°âæåĄå¨âčŋä¸Ēå蝿ļīŧåŽå¯čŊæįæ¯čŋ两č
äšä¸ã
+```console
+$
fastapi run
main.py
-åŊæå°čŋį¨ä¸ģæēæļīŧé常å°å
ļį§°ä¸ē**æåĄå¨**īŧäŊäšį§°ä¸ē**æēå¨**(machine)ã**VM**īŧčææēīŧã**čįš**ã čŋäēéŊæ¯ææį§įąģåįčŋį¨čŽĄįŽæēīŧé常čŋčĄ Linuxīŧæ¨å¯äģĨå¨å
ļä¸čŋčĄį¨åēã
+
FastAPI Starting production server đ
+ Searching for package file structure from directories
+ with
__init__.py files
+ Importing from
/home/user/code/ awesomeapp
-## åŽčŖ
æåĄå¨į¨åē
+
module đ main.py
-æ¨å¯äģĨäŊŋį¨äģĨä¸åŊäģ¤åŽčŖ
ASGI å
ŧ厚æåĄå¨īŧ
+
code Importing the FastAPI app object from the module with
+ the following code:
-//// tab | Uvicorn
+
from main import app
-*
Uvicorn īŧä¸ä¸ĒåŋĢåĻéĒįĩ ASGI æåĄå¨īŧåēäē uvloop å httptools æåģēã
+
app Using import string:
main:app
-
+ server Server started at http://0.0.0.0:8000
+ server Documentation at http://0.0.0.0:8000/docs
-```console
-$ pip install "uvicorn[standard]"
+ Logs:
----> 100%
+ INFO Started server process [ 2306215 ]
+ INFO Waiting for application startup.
+ INFO Application startup complete.
+ INFO Uvicorn running on http://0.0.0.0:8000 ( Press CTRL+C
+ to quit)
```
-/// tip
+čŋå¨å¤§å¤æ°æ
åĩä¸éŊčŊæŖå¸¸čŋčĄãđ
-éčŋæˇģå `standard`īŧUvicorn å°åŽčŖ
åšļäŊŋį¨ä¸ä翍čįéĸå¤äžčĩ饚ã
+äžåĻīŧæ¨å¯äģĨäŊŋį¨č¯ĨåŊäģ¤å¨åŽšå¨ãæåĄå¨įį¯åĸä¸å¯å¨æ¨į **FastAPI** åēį¨ã
-å
ļä¸å
æŦ`uvloop`īŧåŽæ¯`asyncio`įéĢæ§čŊæŋäģŖåīŧåŽæäžäē厍大įåšļåæ§čŊæåã
+## ASGI æåĄå¨
-///
+莊æäģŦæˇąå
Ĩäēč§Ŗä¸äēįģčã
-////
+FastAPI äŊŋį¨äēä¸į§į¨äēæåģē Python Web æĄæļåæåĄå¨įæ åīŧį§°ä¸ē
ASGI ãFastAPI æŦ贍䏿¯ä¸ä¸Ē ASGI Web æĄæļã
-//// tab | Hypercorn
+čĻå¨čŋ፿åĄå¨ä¸čŋčĄ **FastAPI** åēį¨īŧæäģģäŊå
ļäģ ASGI åēį¨īŧīŧæ¨éčĻä¸ä¸Ē ASGI æåĄå¨į¨åēīŧäžåĻ **Uvicorn**ãåŽæ¯ `fastapi` åŊäģ¤éģ莤äŊŋį¨į ASGI æåĄå¨ã
-*
Hypercorn īŧä¸ä¸Ēäšä¸ HTTP/2 å
ŧ厚į ASGI æåĄå¨ã
-
-
+餿¤äšå¤īŧčŋæå
ļäģä¸äēå¯éį ASGI æåĄå¨īŧäžåĻīŧ
-```console
-$ pip install hypercorn
-
----> 100%
-```
-
-
+*
Uvicorn īŧéĢæ§čŊ ASGI æåĄå¨ã
+*
Hypercorn īŧä¸ HTTP/2 å Trio įå
ŧ厚į ASGI æåĄå¨ã
+*
Daphne īŧä¸ē Django Channels æåģēį ASGI æåĄå¨ã
+*
Granian īŧåēäē Rust į HTTP æåĄå¨īŧä¸ä¸ē Python åēį¨čŽžčŽĄã
+*
NGINX Unit īŧNGINX Unit æ¯ä¸ä¸ĒčŊģéįē§ä¸įĩæ´ģį Web åēį¨čŋčĄæļį¯åĸã
-...æäģģäŊå
ļäģ ASGI æåĄå¨ã
+## æåĄå¨ä¸ģæēåæåĄå¨į¨åē
-////
+å
ŗäēåį§°īŧæä¸ä¸Ēå°įģčéčĻ莰äŊã đĄ
-## čŋčĄæåĄå¨į¨åē
+â**æåĄå¨**âä¸č¯é常į¨äēæčŋį¨/äēčŽĄįŽæēīŧįŠįæēæčææēīŧäģĨåå¨č¯ĨčŽĄįŽæēä¸čŋčĄįį¨åēīŧäžåĻ Uvicornīŧã
-æ¨å¯äģĨæį
§äšåæį¨ä¸įį¸åæšåŧčŋčĄåēį¨į¨åēīŧäŊä¸äŊŋį¨`--reload`é饚īŧäžåĻīŧ
+č¯ˇčŽ°äŊīŧåŊæ¨ä¸čŦč¯ģå°âæåĄå¨âčŋä¸Ēå蝿ļīŧåŽå¯čŊæįæ¯čŋ两č
äšä¸ã
-//// tab | Uvicorn
+åŊæå°čŋį¨ä¸ģæēæļīŧé常å°å
ļį§°ä¸ē**æåĄå¨**īŧäŊäšį§°ä¸ē**æēå¨**(machine)ã**VM**īŧčææēīŧã**čįš**ã čŋäēéŊæ¯ææį§įąģåįčŋį¨čŽĄįŽæēīŧé常čŋčĄ Linuxīŧæ¨å¯äģĨå¨å
ļä¸čŋčĄį¨åēã
-
-```console
-$ uvicorn main:app --host 0.0.0.0 --port 80
+## åŽčŖ
æåĄå¨į¨åē
-INFO : Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)
-```
+åŊæ¨åŽčŖ
FastAPI æļīŧåŽčĒå¸Ļä¸ä¸Ēįäē§į¯åĸæåĄå¨ââUvicornīŧåšļ䏿¨å¯äģĨäŊŋ፠`fastapi run` åŊä줿Ĩå¯å¨åŽã
-
+ä¸čŋīŧæ¨äšå¯äģĨæå¨åŽčŖ
ASGI æåĄå¨ã
-////
+č¯ˇįĄŽäŋæ¨ååģēåšļæŋæ´ģä¸ä¸Ē[čæį¯åĸ](../virtual-environments.md){.internal-link target=_blank}īŧįļåååŽčŖ
æåĄå¨åēį¨į¨åēã
-//// tab | Hypercorn
+äžåĻīŧčĻåŽčŖ
Uvicornīŧå¯äģĨčŋčĄäģĨä¸åŊäģ¤īŧ
```console
-$ hypercorn main:app --bind 0.0.0.0:80
+$ pip install "uvicorn[standard]"
-Running on 0.0.0.0:8080 over http (CTRL + C to quit)
+---> 100%
```
-////
+įąģäŧŧįæĩį¨äšéį¨äēäģģäŊå
ļäģ ASGI æåĄå¨į¨åēã
-/// warning
+/// tip
-åĻææ¨æŖå¨äŊŋį¨`--reload`é饚īŧč¯ˇčŽ°äŊå é¤åŽã
+éčŋæˇģå `standard` é饚īŧUvicorn å°åŽčŖ
åšļäŊŋį¨ä¸ä翍čįéĸå¤äžčĩ饚ã
- `--reload` é饚æļčæ´å¤čĩæēīŧåšļ䏿´ä¸į¨ŗåŽã
+å
ļä¸å
æŦ `uvloop`īŧčŋæ¯ `asyncio` įéĢæ§čŊæŋäģŖæšæĄīŧčŊ夿žčæååšļåæ§čŊã
- åŽå¨**åŧå**æé´æåžå¤§å¸ŽåŠīŧäŊæ¨**ä¸åēč¯Ĩ**å¨**įäē§į¯åĸ**ä¸äŊŋį¨åŽã
+åŊæ¨äŊŋ፠`pip install "fastapi[standard]"` åŽčŖ
FastAPI æļīŧåŽé
ä¸äšäŧåŽčŖ
`uvicorn[standard]`ã
///
-## Hypercorn with Trio
-
-Starlette å **FastAPI** åēäē
AnyIO īŧ æäģĨåŽäģŦæčŊåæļä¸ Python įæ ååē
asyncio å
Trio å
ŧ厚ã
-
-å°ŊįŽĄåĻæ¤īŧUvicorn įŽåäģ
ä¸ asyncio å
ŧ厚īŧåšļä¸é常äŊŋį¨
`uvloop` , åŽæ¯`asyncio`įéĢæ§čŊæŋäģŖåã
-
-äŊåĻæäŊ æŗį´æĨäŊŋį¨**Trio**īŧéŖäšäŊ å¯äģĨäŊŋį¨**Hypercorn**īŧå ä¸ēåŽæ¯æåŽã â¨
-
-### åŽčŖ
å
ˇæ Trio į Hypercorn
+## čŋčĄæåĄå¨į¨åē
-éĻå
īŧæ¨éčĻåŽčŖ
å
ˇæ Trio æ¯æį Hypercornīŧ
+åĻææ¨æå¨åŽčŖ
äē ASGI æåĄå¨īŧé常éčĻäģĨįšåŽæ ŧåŧäŧ éä¸ä¸Ēå¯ŧå
ĨåįŦĻ串īŧäģĨäžŋæåĄå¨čŊ夿ŖįĄŽå¯ŧå
Ĩæ¨į FastAPI åēį¨īŧ
```console
-$ pip install "hypercorn[trio]"
----> 100%
+$ uvicorn main:app --host 0.0.0.0 --port 80
+
+INFO : Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)
```
-### Run with Trio
+/// note
-įļåäŊ å¯äģĨäŧ éåŧ`trio`įģåŊäģ¤čĄé饚`--worker-class`:
+åŊäģ¤ `uvicorn main:app` įåĢäšåĻä¸īŧ
-
+* `main`īŧæįæ¯ `main.py` æäģļīŧåŗ Python âæ¨Ąåâīŧã
+* `app`īŧæįæ¯ `main.py` æäģļä¸éčŋ `app = FastAPI()` ååģēįå¯ščąĄã
-```console
-$ hypercorn main:app --worker-class trio
+åŽįäģˇäēäģĨä¸å¯ŧå
Ĩč¯åĨīŧ
+
+```Python
+from main import app
```
-
+///
+
+æ¯į§ ASGI æåĄå¨į¨åēé常éŊäŧæįąģäŧŧįåŊäģ¤īŧæ¨å¯äģĨå¨åŽäģŦįåŽæšææĄŖä¸æžå°æ´å¤äŋĄæ¯ã
+
+/// warning
+
+Uvicorn åå
ļäģæåĄå¨æ¯æ `--reload` é饚īŧč¯Ĩé饚å¨åŧåčŋį¨ä¸é常æį¨ã
-čŋå°éčŋæ¨įåēį¨į¨åēå¯å¨ HypercornīŧåšļäŊŋ፠Trio äŊä¸ēåį̝ã
+äŊ `--reload` é饚äŧæļčæ´å¤čĩæēīŧä¸į¸å¯šä¸į¨ŗåŽã
-į°å¨æ¨å¯äģĨå¨åēį¨į¨åēå
é¨äŊŋ፠Trioã æč
æ´åĨŊ῝īŧæ¨å¯äģĨäŊŋ፠AnyIOīŧäŊŋæ¨įäģŖį ä¸ Trio å asyncio å
ŧ厚ã đ
+åŽå¯šäē**åŧåéļæŽĩ**é常æå¸ŽåŠīŧäŊå¨**įäē§į¯åĸ**ä¸**ä¸åēč¯Ĩ**äŊŋį¨ã
+
+///
## é¨įŊ˛æĻåŋĩ
-čŋäēį¤ēäžčŋčĄæåĄå¨į¨åēīŧäžåĻ Uvicornīŧīŧå¯å¨**åä¸Ēčŋį¨**īŧ卿æ IPīŧ`0.0.0.0`)ä¸įåŦéĸåŽäšį̝åŖīŧäžåĻ`80`)ã
+čŋäēį¤ēäžčŋčĄæåĄå¨į¨åēīŧäžåĻ Uvicornīŧīŧå¯å¨**åä¸Ēčŋį¨**īŧ卿æ IPīŧ`0.0.0.0`īŧä¸įåŦéĸåŽäšį̝åŖīŧäžåĻ`80`īŧã
čŋæ¯åēæŦæčˇ¯ã äŊæ¨å¯čŊéčĻå¤įä¸äēå
ļäģäēæ
īŧäžåĻīŧ
* åŽå
¨æ§ - HTTPS
* å¯å¨æļčŋčĄ
* éæ°å¯å¨
-* ReplicationīŧčŋčĄįčŋ፿°īŧ
+* å¤åļīŧčŋčĄįčŋ፿°īŧ
* å
å
* åŧå§åįæĨéǤ
diff --git a/docs/zh/docs/deployment/server-workers.md b/docs/zh/docs/deployment/server-workers.md
index eb0252a5c..e46ba7a09 100644
--- a/docs/zh/docs/deployment/server-workers.md
+++ b/docs/zh/docs/deployment/server-workers.md
@@ -1,4 +1,4 @@
-# Server Workers - Gunicorn with Uvicorn
+# æåĄå¨åˇĨäŊčŋį¨īŧWorkersīŧ - äŊŋ፠Uvicorn įå¤åˇĨäŊčŋ፿¨Ąåŧ
莊æäģŦå饞ä¸ä¸äšåįé¨įŊ˛æĻåŋĩīŧ
@@ -9,125 +9,79 @@
* å
å
* å¯å¨åįå
åæĨéǤ
-å°įŽåä¸ēæĸīŧéčŋææĄŖä¸įæææį¨īŧæ¨å¯čŊ厞įģå¨**åä¸Ēčŋį¨**ä¸čŋčĄäēå Uvicorn čŋæ ˇį**æåĄå¨į¨åē**ã
+å°įŽåä¸ēæĸīŧå¨ææĄŖä¸įæææį¨ä¸īŧæ¨å¯čŊä¸į´æ¯å¨čŋčĄä¸ä¸Ē**æåĄå¨į¨åē**īŧäžåĻäŊŋ፠`fastapi` åŊä줿Ĩå¯å¨ UvicornīŧčåŽéģ莤čŋčĄįæ¯**åčŋ፿¨Ąåŧ**ã
-é¨įŊ˛åēį¨į¨åēæļīŧæ¨å¯čŊ叿čŋčĄä¸äē**čŋį¨å¤åļ**īŧäģĨåŠį¨**夿 ¸**åšļčŊå¤å¤įæ´å¤č¯ˇæąã
+é¨įŊ˛åēį¨į¨åēæļīŧæ¨å¯čŊ叿čŋčĄä¸äē**čŋį¨å¤åļ**īŧäģĨåŠį¨**夿 ¸** CPU åšļčŊå¤å¤įæ´å¤č¯ˇæąã
æŖåĻæ¨å¨ä¸ä¸įĢ æå
ŗ[é¨įŊ˛æĻåŋĩ](concepts.md){.internal-link target=_blank}ä¸įå°įīŧæ¨å¯äģĨäŊŋį¨å¤į§įįĨã
-å¨čŋéæå°åæ¨åąį¤ēåĻäŊå°
**Gunicorn** ä¸ **Uvicorn worker čŋį¨** ä¸čĩˇäŊŋį¨ã
+卿ŦįĢ čä¸īŧæå°åæ¨åąį¤ēåĻäŊäŊŋ፠`fastapi` åŊä줿ᴿĨäŊŋ፠`uvicorn` åŊäģ¤äģĨ**å¤åˇĨäŊčŋ፿¨Ąåŧ**čŋčĄ **Uvicorn**ã
/// info
åĻææ¨æŖå¨äŊŋį¨åŽšå¨īŧäžåĻ Docker æ Kubernetesīŧæå°å¨ä¸ä¸įĢ ä¸å蝿¨æ´å¤į¸å
ŗäŋĄæ¯īŧ[厚å¨ä¸į FastAPI - Docker](docker.md){.internal-link target=_blank}ã
-įšåĢæ¯īŧåŊå¨ **Kubernetes** ä¸čŋčĄæļīŧæ¨å¯čŊ**䏿ŗ**äŊŋ፠Gunicornīŧ违čŋčĄ **æ¯ä¸Ē厚å¨ä¸ä¸Ē Uvicorn čŋį¨**īŧäŊæå°å¨æŦįĢ åéĸå蝿¨čŋä¸įšã
+æ¯čžįšåĢ῝īŧå¨ **Kubernetes** į¯åĸä¸čŋčĄæļīŧæ¨é常**ä¸éčĻ**äŊŋį¨å¤ä¸ĒåˇĨäŊčŋį¨īŧ违**æ¯ä¸Ē厚å¨čŋčĄä¸ä¸Ē Uvicorn čŋį¨**ãä¸čŋīŧæäŧ卿ŦįĢ čįåįģé¨åč¯Ļįģäģįģčŋä¸įšã
///
-## Gunicorn with Uvicorn Workers
+## å¤ä¸ĒåˇĨäŊčŋį¨
-**Gunicorn**ä¸ģčĻæ¯ä¸ä¸ĒäŊŋį¨**WSGIæ å**įåē፿åĄå¨ã čŋæåŗį Gunicorn å¯äģĨä¸ē Flask å Django įåēį¨į¨åēæäžæåĄã Gunicorn æŦčēĢä¸ **FastAPI** ä¸å
ŧ厚īŧå ä¸ē FastAPI äŊŋ፿æ°į **
ASGI æ å **ã
+æ¨å¯äģĨäŊŋ፠`--workers` åŊäģ¤čĄé饚æĨå¯å¨å¤ä¸ĒåˇĨäŊčŋį¨īŧ
-äŊ Gunicorn æ¯æå
åŊ **čŋį¨įŽĄįå¨** åšļå
čŽ¸į¨æˇåč¯åŽčĻäŊŋį¨åĒä¸ĒįšåŽį **workerįąģ**ã įļå Gunicorn å°äŊŋį¨č¯Ĩįąģå¯å¨ä¸ä¸Ēæå¤ä¸Ē **workerčŋį¨**ã
+//// tab | `fastapi`
-**Uvicorn** æä¸ä¸Ē Gunicorn å
ŧ厚įworkerįąģã
-
-äŊŋį¨čŋį§įģåīŧGunicorn å°å
åŊ **čŋį¨įŽĄįå¨**īŧįåŦ **į̝åŖ** å **IP**ã åŽäŧå°éäŋĄ**äŧ čž**å°čŋčĄ**Uvicornįąģ**įworkerčŋį¨ã
-
-įļåä¸Gunicornå
ŧ厚į**Uvicorn worker**įąģå°č´č´Ŗå°Gunicornåéįæ°æŽčŊŦæĸä¸ēASGIæ åäģĨäžFastAPIäŊŋį¨ã
-
-## åŽčŖ
Gunicorn å Uvicorn
+åĻææ¨äŊŋ፠`fastapi` åŊäģ¤īŧ
```console
-$ pip install "uvicorn[standard]" gunicorn
-
----> 100%
-```
-
-
+$
fastapi run --workers 4
main.py
-čŋå°åŽčŖ
å¸Ļæ`standard`æŠåąå
īŧäģĨčˇåžéĢæ§čŊīŧį Uvicorn å Gunicornã
+
FastAPI Starting production server đ
-## Run Gunicorn with Uvicorn Workers
+ Searching for package file structure from directories with
+
__init__.py files
+ Importing from
/home/user/code/ awesomeapp
-æĨ䏿ĨäŊ å¯äģĨéčŋäģĨä¸åŊäģ¤čŋčĄGunicorn:
-
-
-
-```console
-$ gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80
-
-[19499] [INFO] Starting gunicorn 20.1.0
-[19499] [INFO] Listening at: http://0.0.0.0:80 (19499)
-[19499] [INFO] Using worker: uvicorn.workers.UvicornWorker
-[19511] [INFO] Booting worker with pid: 19511
-[19513] [INFO] Booting worker with pid: 19513
-[19514] [INFO] Booting worker with pid: 19514
-[19515] [INFO] Booting worker with pid: 19515
-[19511] [INFO] Started server process [19511]
-[19511] [INFO] Waiting for application startup.
-[19511] [INFO] Application startup complete.
-[19513] [INFO] Started server process [19513]
-[19513] [INFO] Waiting for application startup.
-[19513] [INFO] Application startup complete.
-[19514] [INFO] Started server process [19514]
-[19514] [INFO] Waiting for application startup.
-[19514] [INFO] Application startup complete.
-[19515] [INFO] Started server process [19515]
-[19515] [INFO] Waiting for application startup.
-[19515] [INFO] Application startup complete.
-```
-
-
+
module đ main.py
+
code Importing the FastAPI app object from the module with the
+ following code:
-莊æäģŦį῝ä¸Ēé饚įåĢäšīŧ
+
from main import app
-* `main:app`īŧčŋä¸ Uvicorn äŊŋį¨į蝿ŗį¸åīŧ`main` 襨į¤ēåä¸ē"`main`"į Python æ¨Ąåīŧå æ¤æ¯æäģļ `main.py`ã `app` æ¯ **FastAPI** åēį¨į¨åēįåéåį§°ã
- * äŊ å¯äģĨæŗčąĄ `main:app` į¸åŊäēä¸ä¸Ē Python `import` č¯åĨīŧäžåĻīŧ
+
app Using import string:
main:app
- ```Python
- from main import app
- ```
+
server Server started at
http://0.0.0.0:8000
+
server Documentation at
http://0.0.0.0:8000/docs
- * å æ¤īŧ`main:app` ä¸įååˇį¸åŊäē `from main import app` ä¸į Python `import` é¨åã
+ Logs:
-* `--workers`īŧčĻäŊŋį¨įworkerčŋ፿°éīŧæ¯ä¸Ēčŋį¨å°čŋčĄä¸ä¸Ē Uvicorn workerčŋį¨īŧ卿Ŧäžä¸ä¸ē 4 ä¸Ēworkerčŋį¨ã
-
-* `--worker-class`īŧå¨workerčŋį¨ä¸äŊŋį¨įä¸ Gunicorn å
ŧ厚įåˇĨäŊįąģã
- * čŋéæäģŦäŧ éäē Gunicorn å¯äģĨå¯ŧå
ĨåäŊŋį¨įįąģīŧ
-
- ```Python
- import uvicorn.workers.UvicornWorker
- ```
-
-* `--bind`īŧčŋåč¯ Gunicorn čĻįåŦį IP åį̝åŖīŧäŊŋį¨ååˇ (`:`) åé IP åį̝åŖã
- * åĻææ¨į´æĨčŋčĄ Uvicornīŧåå¯äģĨäŊŋį¨`--host 0.0.0.0`å`--port 80`īŧč䏿¯`--bind 0.0.0.0:80`īŧGunicorn é饚īŧã
-
-
-å¨čžåēä¸īŧæ¨å¯äģĨįå°åŽæžį¤ēä翝ä¸Ēčŋį¨į **PID**īŧčŋ፠IDīŧīŧåŽåĒæ¯ä¸ä¸Ēæ°åīŧã
-
-äŊ å¯äģĨįå°īŧ
-
-* Gunicorn **čŋį¨įŽĄįå¨** äģĨ PID `19499` åŧ头īŧ卿¨įæ
åĩä¸īŧåŽå°æ¯ä¸ä¸Ēä¸åįæ°åīŧã
-* įļååŽåŧå§`Listening at: http://0.0.0.0:80`ã
-* įļååŽæŖæĩå°åŽåŋ
éĄģäŊŋ፠`uvicorn.workers.UvicornWorker` å¤įworkerįąģã
-* įļååŽå¯å¨**4ä¸Ēworker**īŧæ¯ä¸ĒéŊæčĒåˇąįPIDīŧ`19511`ã`19513`ã`19514`å`19515`ã
-
-Gunicorn čŋå°č´č´ŖįŽĄį**æģčŋį¨**å**éæ°å¯å¨**æ°čŋį¨īŧåĻæéčĻäŋæworkeræ°éīŧã å æ¤īŧčŋå¨ä¸åŽį¨åēĻ䏿åŠäēä¸éĸå襨ä¸**éå¯**įæĻåŋĩã
-
-å°ŊįŽĄåĻæ¤īŧæ¨å¯čŊčŋ叿æä¸äēå¤é¨įä¸čĨŋīŧäģĨįĄŽäŋå¨åŋ
čĻæļ**éæ°å¯å¨ Gunicorn**īŧåšļä¸**å¨å¯å¨æļčŋčĄåŽ**įã
+
INFO Uvicorn running on
http://0.0.0.0:8000 ( Press CTRL+C to
+ quit
)
+
INFO Started parent process
[ 27365 ]
+
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 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.
+```
-## Uvicorn with Workers
+
-Uvicorn äšæä¸ä¸Ēé饚å¯äģĨå¯å¨åčŋčĄå¤ä¸Ē **workerčŋį¨**ã
+////
-įļčīŧå°įŽåä¸ēæĸīŧUvicorn å¤įworkerčŋį¨įčŊ忝 Gunicorn æ´æéã å æ¤īŧåĻææ¨æŗæĨæčŋä¸Ēįē§åĢīŧPython įē§åĢīŧįčŋį¨įŽĄįå¨īŧéŖäšæåĨŊå°č¯äŊŋ፠Gunicorn äŊä¸ēčŋį¨įŽĄįå¨ã
+//// tab | `uvicorn`
-æ čŽēåĻäŊīŧæ¨éŊå¯äģĨåčŋæ ˇčŋčĄåŽīŧ
+åĻææ¨æ´æŗčĻį´æĨäŊŋ፠`uvicorn` åŊäģ¤īŧ
@@ -151,13 +105,15 @@ $ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4
+////
+
čŋéå¯ä¸įæ°ééĄšæ¯ `--workers` åč¯ Uvicorn å¯å¨ 4 ä¸ĒåˇĨäŊčŋį¨ã
-æ¨čŋå¯äģĨįå°åŽæžį¤ēä翝ä¸Ēčŋį¨į **PID**īŧįļčŋį¨īŧčŋæ¯ **čŋį¨įŽĄįå¨**īŧį PID ä¸ē`27365`īŧæ¯ä¸ĒåˇĨäŊčŋį¨į PID ä¸ēīŧ`27368`ã`27369`īŧ `27370`å`27367`ã
+æ¨čŋå¯äģĨįå°åŽæžį¤ēä翝ä¸Ēčŋį¨į **PID**īŧįļčŋį¨īŧčŋæ¯**čŋį¨įŽĄįå¨**īŧį PID ä¸ē`27365`īŧæ¯ä¸ĒåˇĨäŊčŋį¨į PID ä¸ēīŧ`27368`ã`27369`īŧ `27370`å`27367`ã
## é¨įŊ˛æĻåŋĩ
-å¨čŋéīŧæ¨äēč§ŖäēåĻäŊäŊŋ፠**Gunicorn**īŧæ UvicornīŧįŽĄį **Uvicorn åˇĨäŊčŋį¨**æĨ**åšļčĄ**åēį¨į¨åēįæ§čĄīŧåŠį¨ CPU ä¸į **夿 ¸**īŧåšļ čŊ夿ģĄčļŗ**æ´å¤č¯ˇæą**ã
+å¨čŋéīŧæ¨åĻäš äēåĻäŊäŊŋį¨å¤ä¸Ē**åˇĨäŊčŋį¨īŧworkersīŧ**æĨ莊åēį¨į¨åēįæ§čĄ**åšļčĄå**īŧå
ååŠį¨ CPU į**夿 ¸æ§čŊ**īŧåšļčŊå¤å¤į**æ´å¤į蝎æą**ã
äģä¸éĸįé¨įŊ˛æĻåŋĩå襨æĨįīŧäŊŋį¨workerä¸ģčĻæåŠäē**å¤åļ**é¨åīŧåšļ寚**éæ°å¯å¨**æä¸įšå¸ŽåŠīŧäŊæ¨äģįļéčĻį
§éĄžå
ļäģé¨åīŧ
@@ -170,15 +126,13 @@ $ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4
## 厚å¨å Docker
-å¨å
ŗäē [厚å¨ä¸į FastAPI - Docker](docker.md){.internal-link target=_blank} įä¸ä¸įĢ ä¸īŧæå°äģįģä¸äēå¯į¨äēå¤įå
ļäģ **é¨įŊ˛æĻåŋĩ** įįįĨã
-
-æčŋå°åæ¨åąį¤ē **åŽæš Docker éå**īŧå
ļä¸å
æŦ **Gunicorn å Uvicorn worker** äģĨåä¸äē寚įŽåæ
åĩæį¨įéģ莤é
įŊŽã
+å¨å
ŗäē [厚å¨ä¸į FastAPI - Docker](docker.md){.internal-link target=_blank} įä¸ä¸įĢ ä¸īŧæå°äģįģä¸äēå¯į¨äēå¤įå
ļäģ**é¨įŊ˛æĻåŋĩ**įįįĨã
-å¨éŖéīŧæčŋå°åæ¨åąį¤ēåĻäŊ **äģ头åŧå§æåģēčĒåˇąįéå** äģĨčŋčĄåä¸Ē Uvicorn čŋį¨īŧæ˛Ąæ Gunicornīŧã čŋæ¯ä¸ä¸ĒįŽåįčŋį¨īŧåšļä¸å¯čŊæ¯æ¨å¨äŊŋį¨å **Kubernetes** čŋæ ˇįåå¸åŧ厚å¨įŽĄįįŗģįģæļæŗčĻåįäēæ
ã
+æå°åæ¨åąį¤ēåĻäŊ**äģéļåŧå§æåģēčĒåˇąįéå**īŧäģĨčŋčĄä¸ä¸ĒåįŦį Uvicorn čŋį¨ãčŋä¸Ēčŋį¨į¸å¯šįŽåīŧåšļä¸å¨äŊŋ፠**Kubernetes** įåå¸åŧ厚å¨įŽĄįįŗģįģæļīŧčŋéå¸¸æ¯æ¨éčĻéåįæšæŗã
## å饞
-æ¨å¯äģĨäŊŋį¨**Gunicorn**īŧæUvicornīŧäŊä¸ēUvicornåˇĨäŊčŋį¨įčŋį¨įŽĄįå¨īŧäģĨåŠį¨**夿 ¸CPU**īŧ**åšļčĄčŋčĄå¤ä¸Ēčŋį¨**ã
+æ¨å¯äģĨå¨äŊŋ፠`fastapi` æ `uvicorn` åŊä줿ļīŧéčŋ `--workers` CLI é饚å¯į¨å¤ä¸ĒåˇĨäŊčŋį¨īŧworkersīŧīŧäģĨå
ååŠį¨**夿 ¸ CPU**īŧäģĨ**åšļčĄčŋčĄå¤ä¸Ēčŋį¨**ã
åĻææ¨čĻ莞įŊŽ**čĒåˇąįé¨įŊ˛įŗģįģ**īŧåæļčĒåˇąå¤įå
ļäģé¨įŊ˛æĻåŋĩīŧåå¯äģĨäŊŋį¨čŋäēåˇĨå
ˇåæŗæŗã
diff --git a/docs/zh/docs/index.md b/docs/zh/docs/index.md
index d3e9e3112..94cf8745c 100644
--- a/docs/zh/docs/index.md
+++ b/docs/zh/docs/index.md
@@ -11,11 +11,11 @@
FastAPI æĄæļīŧéĢæ§čŊīŧæäēåĻäš īŧéĢæįŧį īŧįäē§å¯į¨
-
-
+
+
-
-
+
+
diff --git a/docs/zh/docs/python-types.md b/docs/zh/docs/python-types.md
index 5126cb847..ba767da87 100644
--- a/docs/zh/docs/python-types.md
+++ b/docs/zh/docs/python-types.md
@@ -228,7 +228,7 @@ John Doe
## Pydantic æ¨Ąå
- Pydantic æ¯ä¸ä¸Ē፿Ĩ፿Ĩæ§čĄæ°æŽæ ĄéĒį Python åēã
+Pydantic æ¯ä¸ä¸Ē፿Ĩæ§čĄæ°æŽæ ĄéĒį Python åēã
äŊ å¯äģĨå°æ°æŽį"įģæ"åŖ°æä¸ēå
ˇæåąæ§įįąģã
diff --git a/docs/zh/docs/tutorial/bigger-applications.md b/docs/zh/docs/tutorial/bigger-applications.md
index 318e10fd7..554bc654f 100644
--- a/docs/zh/docs/tutorial/bigger-applications.md
+++ b/docs/zh/docs/tutorial/bigger-applications.md
@@ -52,7 +52,7 @@ from app.routers import items
* čŋæä¸ä¸ĒåįŽåŊ `app/internal/` å
åĢåĻä¸ä¸Ē `__init__.py` æäģļīŧå æ¤åŽæ¯åä¸ä¸ĒãPython åå
ãīŧ`app.internal`ã
* `app/internal/admin.py` æ¯åĻä¸ä¸Ē忍Ąåīŧ`app.internal.admin`ã
-
+
å¸Ļææŗ¨éįå䏿äģļįģæīŧ
@@ -244,7 +244,7 @@ from .dependencies import get_token_header
č¯ˇčŽ°äŊæäģŦįį¨åē/æäģļįģææ¯ææ ˇįīŧ
-
+
---
diff --git a/docs/zh/docs/tutorial/first-steps.md b/docs/zh/docs/tutorial/first-steps.md
index c4ff460e0..80a34116a 100644
--- a/docs/zh/docs/tutorial/first-steps.md
+++ b/docs/zh/docs/tutorial/first-steps.md
@@ -11,26 +11,42 @@
```console
-$ uvicorn main:app --reload
+$ fastapi dev main.py
-INFO : Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
-INFO : Started reloader process [28720]
-INFO : Started server process [28722]
-INFO : Waiting for application startup.
-INFO : Application startup complete.
-```
+ FastAPI Starting development server đ
-
+ Searching for package file structure from directories
+ with __init__.py files
+ Importing from /home/user/code/ awesomeapp
-/// note
+ module đ main.py
-`uvicorn main:app` åŊäģ¤åĢäšåĻä¸:
+ code Importing the FastAPI app object from the module with
+ the following code:
-* `main`īŧ`main.py` æäģļīŧä¸ä¸Ē Pythonãæ¨Ąåãīŧã
-* `app`īŧå¨ `main.py` æäģļä¸éčŋ `app = FastAPI()` ååģēįå¯ščąĄã
-* `--reload`īŧ莊æåĄå¨å¨æ´æ°äģŖį åéæ°å¯å¨ãäģ
å¨åŧåæļäŊŋį¨č¯Ĩé饚ã
+ from main import app
-///
+ app Using import string: main:app
+
+ server Server started at http://127.0.0.1:8000
+ server Documentation at http://127.0.0.1:8000/docs
+
+ tip Running in development mode, for production use:
+ fastapi run
+
+ Logs:
+
+ INFO Will watch for changes in these directories:
+ [ '/home/user/code/awesomeapp' ]
+ INFO Uvicorn running on http://127.0.0.1:8000 ( Press CTRL+C
+ to quit)
+ INFO Started reloader process [ 383138 ] using WatchFiles
+ INFO Started server process [ 383153 ]
+ INFO Waiting for application startup.
+ INFO Application startup complete.
+```
+
+
å¨čžåēä¸īŧäŧæä¸čĄäŋĄæ¯åä¸éĸčŋæ ˇīŧ
@@ -38,7 +54,6 @@ $ uvicorn main:app --reload
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
-
č¯ĨčĄæžį¤ēäēäŊ įåēį¨å¨æŦæēææäžæåĄį URL å°åã
### æĨį
@@ -63,7 +78,7 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
ååž http://127.0.0.1:8000/redoc ã
-äŊ å°äŧįå°å¯éįčĒå¨įæææĄŖ īŧįą ReDoc æäž)īŧ
+äŊ å°äŧįå°å¯éįčĒå¨įæææĄŖ īŧįą ReDoc æäžīŧīŧ

@@ -77,9 +92,9 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
#### APIãæ¨Ąåŧã
-å¨čŋį§å翝ä¸īŧOpenAPI æ¯ä¸į§č§åŽåĻäŊåŽäš API æ¨Ąåŧįč§čã
+å¨čŋį§å翝ä¸īŧOpenAPI æ¯ä¸į§č§åŽåĻäŊåŽäš API æ¨Ąåŧįč§čã
-åŽäšį OpenAPI æ¨Ąåŧå°å
æŦäŊ į API 莝åžīŧäģĨååŽäģŦå¯čŊäŊŋį¨įåæ°įįã
+ãæ¨ĄåŧãįåŽäšå
æŦäŊ į API 莝åžīŧäģĨååŽäģŦå¯čŊäŊŋį¨įåæ°įįã
#### æ°æŽãæ¨Ąåŧã
@@ -93,7 +108,7 @@ OpenAPI ä¸ēäŊ į API åŽäš API æ¨Ąåŧãč¯Ĩæ¨Ąåŧä¸å
åĢäēäŊ į API åé
#### æĨį `openapi.json`
-åĻæäŊ 寚åå§į OpenAPI æ¨Ąåŧéŋäģäšæ ˇåæå°åĨŊåĨīŧå
ļåŽåŽåĒæ¯ä¸ä¸ĒčĒå¨įæįå
åĢäēææ API æčŋ°į JSONã
+åĻæäŊ 寚åå§į OpenAPI æ¨Ąåŧéŋäģäšæ ˇåæå°åĨŊåĨīŧFastAPI čĒå¨įæäēå
åĢææ API æčŋ°į JSONīŧæ¨Ąåŧīŧã
äŊ å¯äģĨį´æĨå¨īŧhttp://127.0.0.1:8000/openapi.json įå°åŽã
@@ -101,7 +116,7 @@ OpenAPI ä¸ēäŊ į API åŽäš API æ¨Ąåŧãč¯Ĩæ¨Ąåŧä¸å
åĢäēäŊ į API åé
```JSON
{
- "openapi": "3.0.2",
+ "openapi": "3.1.0",
"info": {
"title": "FastAPI",
"version": "0.1.0"
@@ -140,7 +155,7 @@ OpenAPI ä¸ēäŊ į API åŽäš API æ¨Ąåŧãč¯Ĩæ¨Ąåŧä¸å
åĢäēäŊ į API åé
`FastAPI` æ¯į´æĨäģ `Starlette` įģ§æŋįįąģã
-äŊ å¯äģĨéčŋ `FastAPI` äŊŋ፿æį Starlette įåčŊã
+äŊ å¯äģĨéčŋ `FastAPI` äŊŋ፿æį Starlette įåčŊã
///
@@ -152,34 +167,6 @@ OpenAPI ä¸ēäŊ į API åŽäš API æ¨Ąåŧãč¯Ĩæ¨Ąåŧä¸å
åĢäēäŊ į API åé
čŋä¸ĒåŽäžå°æ¯ååģēäŊ ææ API įä¸ģčĻäē¤äēå¯ščąĄã
-čŋä¸Ē `app` åæ ˇå¨åĻä¸åŊäģ¤ä¸čĸĢ `uvicorn` æåŧį¨īŧ
-
-
-
-```console
-$ uvicorn main:app --reload
-
-INFO : Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
-```
-
-
-
-åĻæäŊ åä¸éĸčŋæ ˇååģēåēį¨īŧ
-
-{* ../../docs_src/first_steps/tutorial002.py hl[3] *}
-
-å°äģŖį æžå
Ĩ `main.py` æäģļä¸īŧįļåäŊ å¯äģĨåä¸éĸčŋæ ˇčŋčĄ `uvicorn`īŧ
-
-
-
-```console
-$ uvicorn main:my_awesome_api --reload
-
-INFO : Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
-```
-
-
-
### æĨéǤ 3īŧååģēä¸ä¸Ē*čˇ¯åžæäŊ*
#### 莝åž
@@ -279,13 +266,13 @@ https://example.com/items/foo
/// tip
-æ¨å¯äģĨéæäŊŋį¨äģģäŊä¸ä¸ĒæäŊīŧHTTPæšæŗīŧã
+äŊ å¯äģĨéæäŊŋį¨äģģäŊä¸ä¸ĒæäŊīŧHTTPæšæŗīŧã
**FastAPI** æ˛ĄæåŧēåļčĻæąæäŊæäģģäŊįšåŽįåĢäšã
æ¤å¤æäžįäŋĄæ¯äģ
äŊä¸ēæå¯ŧīŧč䏿¯čĻæąã
-æ¯åĻīŧåŊäŊŋ፠GraphQL æļé常äŊ ææįå¨äŊéŊéčŋ `post` ä¸į§æšæŗæ§čĄã
+æ¯åĻīŧåŊäŊŋ፠GraphQL æļé常äŊ ææįå¨äŊéŊéčŋ `POST` ä¸į§æšæŗæ§čĄã
///
@@ -331,6 +318,6 @@ https://example.com/items/foo
* å¯ŧå
Ĩ `FastAPI`ã
* ååģēä¸ä¸Ē `app` åŽäžã
-* įŧåä¸ä¸Ē**čˇ¯åžæäŊčŖ
éĨ°å¨**īŧåĻ `@app.get("/")`īŧã
-* įŧåä¸ä¸Ē**čˇ¯åžæäŊåŊæ°**īŧåĻä¸éĸį `def root(): ...`īŧã
-* čŋčĄåŧåæåĄå¨īŧåĻ `uvicorn main:app --reload`īŧã
+* įŧåä¸ä¸Ē**čˇ¯åžæäŊčŖ
éĨ°å¨**īŧåĻ `@app.get("/")`ã
+* åŽäšä¸ä¸Ē**čˇ¯åžæäŊåŊæ°**īŧåĻ `def root(): ...`ã
+* äŊŋį¨åŊäģ¤ `fastapi dev` čŋčĄåŧåæåĄå¨ã
diff --git a/docs/zh/docs/tutorial/index.md b/docs/zh/docs/tutorial/index.md
index ab19f02c5..3ca927337 100644
--- a/docs/zh/docs/tutorial/index.md
+++ b/docs/zh/docs/tutorial/index.md
@@ -1,34 +1,58 @@
# æį¨ - ፿ˇæå
-æŦæį¨å°ä¸æĨæĨåäŊ åąį¤ēåĻäŊäŊŋ፠**FastAPI** įįģ大é¨åįšæ§ã
+æŦæį¨å°ä¸æĨæĨ忍åąį¤ēåĻäŊäŊŋ፠**FastAPI** įįģ大é¨åįšæ§ã
-åä¸ĒįĢ čįå
厚åžĒå翏čŋīŧäŊæ¯åå´įģįåįŦįä¸ģéĸīŧæäģĨäŊ å¯äģĨį´æĨ莺čŊŦå°æä¸ĒįĢ čäģĨč§ŖåŗäŊ įįšåŽéæąã
+åä¸ĒįĢ čįå
厚åžĒå翏čŋīŧäŊæ¯åå´įģįåįŦįä¸ģéĸīŧæäģĨæ¨å¯äģĨį´æĨ莺čŊŦå°æä¸ĒįĢ čäģĨč§Ŗåŗæ¨įįšåŽéæąã
-æŦæį¨åæ ˇå¯äģĨäŊä¸ēå°æĨįåčæåã
-
-äŊ å¯äģĨéæļåå°æŦæį¨åšļæĨé
äŊ éčĻįå
厚ã
+æŦæį¨åæ ˇå¯äģĨäŊä¸ēå°æĨįåčæåīŧæäģĨæ¨å¯äģĨéæļåå°æŦæį¨åšļæĨé
æ¨éčĻįå
厚ã
## čŋčĄäģŖį
ææäģŖį įæŽĩéŊå¯äģĨå¤åļåį´æĨäŊŋį¨īŧåŽäģŦåŽé
䏿¯įģčŋæĩč¯į Python æäģļīŧã
-čĻčŋčĄäģģäŊį¤ēäžīŧ蝎å°äģŖį å¤åļå° `main.py` æäģļä¸īŧįļåäŊŋį¨äģĨä¸åŊäģ¤å¯å¨ `uvicorn`īŧ
+čĻčŋčĄäģģäŊį¤ēäžīŧ蝎å°äģŖį å¤åļå° `main.py` æäģļä¸īŧįļåäŊŋį¨äģĨä¸åŊäģ¤å¯å¨ `fastapi dev`īŧ
```console
-$ uvicorn main:app --reload
+$ fastapi dev main.py
+
+ FastAPI Starting development server đ
+
+ Searching for package file structure from directories
+ with __init__.py files
+ Importing from /home/user/code/ awesomeapp
+
+ module đ main.py
+
+ code Importing the FastAPI app object from the module with
+ the following code:
+
+ from main import app
+
+ app Using import string: main:app
+
+ server Server started at http://127.0.0.1:8000
+ server Documentation at http://127.0.0.1:8000/docs
+
+ tip Running in development mode, for production use:
+ fastapi run
+
+ Logs:
-INFO : Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
-INFO : Started reloader process [28720]
-INFO : Started server process [28722]
-INFO : Waiting for application startup.
-INFO : Application startup complete.
+ INFO Will watch for changes in these directories:
+ [ '/home/user/code/awesomeapp' ]
+ INFO Uvicorn running on http://127.0.0.1:8000 ( Press CTRL+C
+ to quit)
+ INFO Started reloader process [ 383138 ] using WatchFiles
+ INFO Started server process [ 383153 ]
+ INFO Waiting for application startup.
+ INFO Application startup complete.
```
-åŧēįåģē莎äŊ 卿Ŧå°įŧåæå¤åļäģŖį īŧ寚å
ļčŋčĄįŧčžåšļčŋčĄã
+**åŧēįåģē莎**æ¨å¨æŦå°įŧåæå¤åļäģŖį īŧ寚å
ļčŋčĄįŧčžåšļčŋčĄã
å¨įŧčžå¨ä¸äŊŋ፠FastAPI äŧįæŖå°åąį°åēåŽįäŧåŋīŧåĒéčĻįŧååžå°įäģŖį īŧææįįąģåæŖæĨīŧäģŖį čĄĨå
¨įįã
@@ -36,48 +60,34 @@ $ uvicorn main:app --reload
## åŽčŖ
FastAPI
-įŦŦä¸ä¸ĒæĨéǤæ¯åŽčŖ
FastAPIã
+įŦŦä¸ä¸ĒæĨéǤæ¯åŽčŖ
FastAPI.
-ä¸ēäēäŊŋ፿Ŧæį¨īŧäŊ å¯čŊéčĻåŽčŖ
ææįå¯éäžčĩå寚åēåčŊīŧ
+č¯ˇįĄŽäŋæ¨ååģēåšļæŋæ´ģä¸ä¸Ē[čæį¯åĸ](../virtual-environments.md){.internal-link target=_blank}īŧįļå**åŽčŖ
FastAPI**īŧ
```console
-$ pip install "fastapi[all]"
+$ pip install "fastapi[standard]"
---> 100%
```
-......äģĨä¸åŽčŖ
čŋå
æŦäē `uvicorn`īŧäŊ å¯äģĨå°å
ļį¨äŊčŋčĄäģŖį įæåĄå¨ã
-
/// note
-äŊ äšå¯äģĨååŧæĨåŽčŖ
ã
-
-ååĻäŊ æŗå°åēį¨į¨åēé¨įŊ˛å°įäē§į¯åĸīŧäŊ å¯čŊčĻæ§čĄäģĨ䏿äŊīŧ
-
-```
-pip install fastapi
-```
-
-åšļä¸åŽčŖ
`uvicorn`æĨäŊä¸ēæåĄå¨īŧ
-
-```
-pip install "uvicorn[standard]"
-```
+åŊæ¨äŊŋ፠`pip install "fastapi[standard]"` čŋčĄåŽčŖ
æļīŧåŽäŧéå¸Ļä¸äēéģ莤įå¯éæ åäžčĩ饚ã
-įļå寚äŊ æŗäŊŋį¨įæ¯ä¸Ēå¯éäžčĩéĄšäšæ§čĄį¸åįæäŊã
+åĻææ¨ä¸æŗåŽčŖ
čŋäēå¯éäžčĩīŧå¯äģĨéæŠåŽčŖ
`pip install fastapi`ã
///
## čŋéļ፿ˇæå
-卿Ŧ**æį¨-፿ˇæå**äšåīŧäŊ å¯äģĨé
č¯ģ**čŋéļ፿ˇæå**ã
+卿Ŧ**æį¨-፿ˇæå**äšåīŧæ¨å¯äģĨé
č¯ģ**čŋéļ፿ˇæå**ã
**čŋéļ፿ˇæå**äģĨæŦæį¨ä¸ēåēįĄīŧäŊŋį¨į¸åįæĻåŋĩīŧåšļææä¸äēéĸå¤įįšæ§ã
-äŊæ¯äŊ åēč¯Ĩå
é
č¯ģ**æį¨-፿ˇæå**īŧåŗäŊ į°å¨æŖå¨é
č¯ģįå
厚īŧã
+äŊæ¯æ¨åēč¯Ĩå
é
č¯ģ**æį¨-፿ˇæå**īŧåŗæ¨į°å¨æŖå¨é
č¯ģįå
厚īŧã
-æį¨įģčŋį˛žåŋ莞莥īŧäŊŋäŊ å¯äģĨäģ
éčŋ**æį¨-፿ˇæå**æĨåŧåä¸ä¸ĒåŽæ´įåēį¨į¨åēīŧįļåæ šæŽäŊ įéčĻīŧäŊŋį¨**čŋéļ፿ˇæå**ä¸įä¸äēå
ļäģæĻåŋĩīŧäģĨä¸åįæšåŧæĨæŠåąåŽã
+æį¨įģčŋį˛žåŋ莞莥īŧäŊŋæ¨å¯äģĨäģ
éčŋ**æį¨-፿ˇæå**æĨåŧåä¸ä¸ĒåŽæ´įåēį¨į¨åēīŧįļåæ šæŽæ¨įéčĻīŧäŊŋį¨**čŋéļ፿ˇæå**ä¸įä¸äēå
ļäģæĻåŋĩīŧäģĨä¸åįæšåŧæĨæŠåąåŽã
diff --git a/docs/zh/docs/tutorial/query-params-str-validations.md b/docs/zh/docs/tutorial/query-params-str-validations.md
index 2fba671f7..c2f9a7e9f 100644
--- a/docs/zh/docs/tutorial/query-params-str-validations.md
+++ b/docs/zh/docs/tutorial/query-params-str-validations.md
@@ -108,21 +108,6 @@ q: Union[str, None] = Query(default=None, min_length=3)
{* ../../docs_src/query_params_str_validations/tutorial006.py hl[7] *}
-### äŊŋį¨įįĨåˇ(`...`)åŖ°æåŋ
éåæ°
-
-æåĻä¸į§æšæŗå¯äģĨæžåŧįåŖ°æä¸ä¸Ēåŧæ¯åŋ
éįīŧåŗå°éģčŽ¤åæ°įéģ莤åŧ莞ä¸ē `...` īŧ
-
-{* ../../docs_src/query_params_str_validations/tutorial006b.py hl[7] *}
-
-/// info
-
-åĻæäŊ äšåæ˛Ąč§čŋ `...` čŋį§į¨æŗīŧåŽæ¯ä¸ä¸ĒįšæŽįåįŦåŧīŧåŽæ¯ Python įä¸é¨ååšļä¸čĸĢį§°ä¸ēâEllipsisâīŧæä¸ēįįĨåˇ ââ č¯č
æŗ¨īŧ ã
-Pydantic å FastAPI äŊŋį¨åŽæĨæžåŧįåŖ°æéčĻä¸ä¸Ēåŧã
-
-///
-
-čŋå°äŊŋ **FastAPI** įĨ鿤æĨč¯ĸåæ°æ¯åŋ
éįã
-
### äŊŋį¨`None`åŖ°æåŋ
éåæ°
äŊ å¯äģĨåŖ°æä¸ä¸Ēåæ°å¯äģĨæĨæļ`None`åŧīŧäŊåŽäģį￝åŋ
éįãčŋå°åŧēåļåŽĸæˇį̝åéä¸ä¸ĒåŧīŧåŗäŊŋč¯Ĩåŧæ¯`None`ã
@@ -137,18 +122,6 @@ Pydantic æ¯ FastAPI ä¸æææ°æŽéĒč¯ååēååįæ ¸åŋīŧåŊäŊ 卿˛Ą
///
-### äŊŋį¨Pydanticä¸į`Required`äģŖæŋįįĨåˇ(`...`)
-
-åĻæäŊ č§åžäŊŋ፠`...` ä¸čæīŧäŊ äšå¯äģĨäģ Pydantic å¯ŧå
ĨåšļäŊŋ፠`Required`īŧ
-
-{* ../../docs_src/query_params_str_validations/tutorial006d.py hl[2,8] *}
-
-/// tip
-
-č¯ˇčŽ°äŊīŧå¨å¤§å¤æ°æ
åĩä¸īŧåŊäŊ éčĻæäēä¸čĨŋæļīŧå¯äģĨįŽåå°įįĨ `default` åæ°īŧå æ¤äŊ é常ä¸åŋ
äŊŋ፠`...` æ `Required`
-
-///
-
## æĨč¯ĸåæ°å襨 / å¤ä¸Ēåŧ
åŊäŊ äŊŋ፠`Query` æžåŧå°åŽäšæĨč¯ĸåæ°æļīŧäŊ čŋå¯äģĨåŖ°æåŽåģæĨæļä¸įģåŧīŧææĸåĨ蝿Ĩ蝴īŧæĨæļå¤ä¸Ēåŧã
diff --git a/docs_src/body/tutorial002.py b/docs_src/body/tutorial002.py
index 7f5183908..5cd86216b 100644
--- a/docs_src/body/tutorial002.py
+++ b/docs_src/body/tutorial002.py
@@ -17,7 +17,7 @@ app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
item_dict = item.dict()
- if item.tax:
+ if item.tax is not None:
price_with_tax = item.price + item.tax
item_dict.update({"price_with_tax": price_with_tax})
return item_dict
diff --git a/docs_src/body/tutorial002_py310.py b/docs_src/body/tutorial002_py310.py
index 8928b72b8..454c45c88 100644
--- a/docs_src/body/tutorial002_py310.py
+++ b/docs_src/body/tutorial002_py310.py
@@ -15,7 +15,7 @@ app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
item_dict = item.dict()
- if item.tax:
+ if item.tax is not None:
price_with_tax = item.price + item.tax
item_dict.update({"price_with_tax": price_with_tax})
return item_dict
diff --git a/docs_src/configure_swagger_ui/tutorial002.py b/docs_src/configure_swagger_ui/tutorial002.py
index cc569ce45..cc75c2196 100644
--- a/docs_src/configure_swagger_ui/tutorial002.py
+++ b/docs_src/configure_swagger_ui/tutorial002.py
@@ -1,6 +1,6 @@
from fastapi import FastAPI
-app = FastAPI(swagger_ui_parameters={"syntaxHighlight.theme": "obsidian"})
+app = FastAPI(swagger_ui_parameters={"syntaxHighlight": {"theme": "obsidian"}})
@app.get("/users/{username}")
diff --git a/docs_src/custom_docs_ui/tutorial001.py b/docs_src/custom_docs_ui/tutorial001.py
index f7ceb0c2f..1cfcce19a 100644
--- a/docs_src/custom_docs_ui/tutorial001.py
+++ b/docs_src/custom_docs_ui/tutorial001.py
@@ -29,7 +29,7 @@ async def redoc_html():
return get_redoc_html(
openapi_url=app.openapi_url,
title=app.title + " - ReDoc",
- redoc_js_url="https://unpkg.com/redoc@next/bundles/redoc.standalone.js",
+ redoc_js_url="https://unpkg.com/redoc@2/bundles/redoc.standalone.js",
)
diff --git a/docs_src/header_param_models/tutorial003.py b/docs_src/header_param_models/tutorial003.py
new file mode 100644
index 000000000..dc2eb74bd
--- /dev/null
+++ b/docs_src/header_param_models/tutorial003.py
@@ -0,0 +1,19 @@
+from typing import List, Union
+
+from fastapi import FastAPI, Header
+from pydantic import BaseModel
+
+app = FastAPI()
+
+
+class CommonHeaders(BaseModel):
+ host: str
+ save_data: bool
+ if_modified_since: Union[str, None] = None
+ traceparent: Union[str, None] = None
+ x_tag: List[str] = []
+
+
+@app.get("/items/")
+async def read_items(headers: CommonHeaders = Header(convert_underscores=False)):
+ return headers
diff --git a/docs_src/header_param_models/tutorial003_an.py b/docs_src/header_param_models/tutorial003_an.py
new file mode 100644
index 000000000..e3edb1189
--- /dev/null
+++ b/docs_src/header_param_models/tutorial003_an.py
@@ -0,0 +1,22 @@
+from typing import List, Union
+
+from fastapi import FastAPI, Header
+from pydantic import BaseModel
+from typing_extensions import Annotated
+
+app = FastAPI()
+
+
+class CommonHeaders(BaseModel):
+ host: str
+ save_data: bool
+ if_modified_since: Union[str, None] = None
+ traceparent: Union[str, None] = None
+ x_tag: List[str] = []
+
+
+@app.get("/items/")
+async def read_items(
+ headers: Annotated[CommonHeaders, Header(convert_underscores=False)],
+):
+ return headers
diff --git a/docs_src/header_param_models/tutorial003_an_py310.py b/docs_src/header_param_models/tutorial003_an_py310.py
new file mode 100644
index 000000000..07bfa83bf
--- /dev/null
+++ b/docs_src/header_param_models/tutorial003_an_py310.py
@@ -0,0 +1,21 @@
+from typing import Annotated
+
+from fastapi import FastAPI, Header
+from pydantic import BaseModel
+
+app = FastAPI()
+
+
+class CommonHeaders(BaseModel):
+ host: str
+ save_data: bool
+ if_modified_since: str | None = None
+ traceparent: str | None = None
+ x_tag: list[str] = []
+
+
+@app.get("/items/")
+async def read_items(
+ headers: Annotated[CommonHeaders, Header(convert_underscores=False)],
+):
+ return headers
diff --git a/docs_src/header_param_models/tutorial003_an_py39.py b/docs_src/header_param_models/tutorial003_an_py39.py
new file mode 100644
index 000000000..8be6b01d0
--- /dev/null
+++ b/docs_src/header_param_models/tutorial003_an_py39.py
@@ -0,0 +1,21 @@
+from typing import Annotated, Union
+
+from fastapi import FastAPI, Header
+from pydantic import BaseModel
+
+app = FastAPI()
+
+
+class CommonHeaders(BaseModel):
+ host: str
+ save_data: bool
+ if_modified_since: Union[str, None] = None
+ traceparent: Union[str, None] = None
+ x_tag: list[str] = []
+
+
+@app.get("/items/")
+async def read_items(
+ headers: Annotated[CommonHeaders, Header(convert_underscores=False)],
+):
+ return headers
diff --git a/docs_src/header_param_models/tutorial003_py310.py b/docs_src/header_param_models/tutorial003_py310.py
new file mode 100644
index 000000000..65e92a28c
--- /dev/null
+++ b/docs_src/header_param_models/tutorial003_py310.py
@@ -0,0 +1,17 @@
+from fastapi import FastAPI, Header
+from pydantic import BaseModel
+
+app = FastAPI()
+
+
+class CommonHeaders(BaseModel):
+ host: str
+ save_data: bool
+ if_modified_since: str | None = None
+ traceparent: str | None = None
+ x_tag: list[str] = []
+
+
+@app.get("/items/")
+async def read_items(headers: CommonHeaders = Header(convert_underscores=False)):
+ return headers
diff --git a/docs_src/header_param_models/tutorial003_py39.py b/docs_src/header_param_models/tutorial003_py39.py
new file mode 100644
index 000000000..848c34111
--- /dev/null
+++ b/docs_src/header_param_models/tutorial003_py39.py
@@ -0,0 +1,19 @@
+from typing import Union
+
+from fastapi import FastAPI, Header
+from pydantic import BaseModel
+
+app = FastAPI()
+
+
+class CommonHeaders(BaseModel):
+ host: str
+ save_data: bool
+ if_modified_since: Union[str, None] = None
+ traceparent: Union[str, None] = None
+ x_tag: list[str] = []
+
+
+@app.get("/items/")
+async def read_items(headers: CommonHeaders = Header(convert_underscores=False)):
+ return headers
diff --git a/docs_src/query_params_str_validations/tutorial006b.py b/docs_src/query_params_str_validations/tutorial006b.py
deleted file mode 100644
index a8d69c889..000000000
--- a/docs_src/query_params_str_validations/tutorial006b.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from fastapi import FastAPI, Query
-
-app = FastAPI()
-
-
-@app.get("/items/")
-async def read_items(q: str = Query(default=..., min_length=3)):
- results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
- if q:
- results.update({"q": q})
- return results
diff --git a/docs_src/query_params_str_validations/tutorial006b_an.py b/docs_src/query_params_str_validations/tutorial006b_an.py
deleted file mode 100644
index ea3b02583..000000000
--- a/docs_src/query_params_str_validations/tutorial006b_an.py
+++ /dev/null
@@ -1,12 +0,0 @@
-from fastapi import FastAPI, Query
-from typing_extensions import Annotated
-
-app = FastAPI()
-
-
-@app.get("/items/")
-async def read_items(q: Annotated[str, Query(min_length=3)] = ...):
- results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
- if q:
- results.update({"q": q})
- return results
diff --git a/docs_src/query_params_str_validations/tutorial006b_an_py39.py b/docs_src/query_params_str_validations/tutorial006b_an_py39.py
deleted file mode 100644
index 687a9f544..000000000
--- a/docs_src/query_params_str_validations/tutorial006b_an_py39.py
+++ /dev/null
@@ -1,13 +0,0 @@
-from typing import Annotated
-
-from fastapi import FastAPI, Query
-
-app = FastAPI()
-
-
-@app.get("/items/")
-async def read_items(q: Annotated[str, Query(min_length=3)] = ...):
- results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
- if q:
- results.update({"q": q})
- return results
diff --git a/docs_src/query_params_str_validations/tutorial006c.py b/docs_src/query_params_str_validations/tutorial006c.py
index 2ac148c94..0a0e820da 100644
--- a/docs_src/query_params_str_validations/tutorial006c.py
+++ b/docs_src/query_params_str_validations/tutorial006c.py
@@ -6,7 +6,7 @@ app = FastAPI()
@app.get("/items/")
-async def read_items(q: Union[str, None] = Query(default=..., min_length=3)):
+async def read_items(q: Union[str, None] = Query(min_length=3)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
diff --git a/docs_src/query_params_str_validations/tutorial006c_an.py b/docs_src/query_params_str_validations/tutorial006c_an.py
index 10bf26a57..55c4f4adc 100644
--- a/docs_src/query_params_str_validations/tutorial006c_an.py
+++ b/docs_src/query_params_str_validations/tutorial006c_an.py
@@ -7,7 +7,7 @@ app = FastAPI()
@app.get("/items/")
-async def read_items(q: Annotated[Union[str, None], Query(min_length=3)] = ...):
+async def read_items(q: Annotated[Union[str, None], Query(min_length=3)]):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
diff --git a/docs_src/query_params_str_validations/tutorial006c_an_py310.py b/docs_src/query_params_str_validations/tutorial006c_an_py310.py
index 1ab0a7d53..2995d9c97 100644
--- a/docs_src/query_params_str_validations/tutorial006c_an_py310.py
+++ b/docs_src/query_params_str_validations/tutorial006c_an_py310.py
@@ -6,7 +6,7 @@ app = FastAPI()
@app.get("/items/")
-async def read_items(q: Annotated[str | None, Query(min_length=3)] = ...):
+async def read_items(q: Annotated[str | None, Query(min_length=3)]):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
diff --git a/docs_src/query_params_str_validations/tutorial006c_an_py39.py b/docs_src/query_params_str_validations/tutorial006c_an_py39.py
index ac1273331..76a1cd49a 100644
--- a/docs_src/query_params_str_validations/tutorial006c_an_py39.py
+++ b/docs_src/query_params_str_validations/tutorial006c_an_py39.py
@@ -6,7 +6,7 @@ app = FastAPI()
@app.get("/items/")
-async def read_items(q: Annotated[Union[str, None], Query(min_length=3)] = ...):
+async def read_items(q: Annotated[Union[str, None], Query(min_length=3)]):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
diff --git a/docs_src/query_params_str_validations/tutorial006c_py310.py b/docs_src/query_params_str_validations/tutorial006c_py310.py
index 82dd9e5d7..88b499c7a 100644
--- a/docs_src/query_params_str_validations/tutorial006c_py310.py
+++ b/docs_src/query_params_str_validations/tutorial006c_py310.py
@@ -4,7 +4,7 @@ app = FastAPI()
@app.get("/items/")
-async def read_items(q: str | None = Query(default=..., min_length=3)):
+async def read_items(q: str | None = Query(min_length=3)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
diff --git a/docs_src/query_params_str_validations/tutorial006d.py b/docs_src/query_params_str_validations/tutorial006d.py
deleted file mode 100644
index a8d69c889..000000000
--- a/docs_src/query_params_str_validations/tutorial006d.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from fastapi import FastAPI, Query
-
-app = FastAPI()
-
-
-@app.get("/items/")
-async def read_items(q: str = Query(default=..., min_length=3)):
- results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
- if q:
- results.update({"q": q})
- return results
diff --git a/docs_src/query_params_str_validations/tutorial006d_an.py b/docs_src/query_params_str_validations/tutorial006d_an.py
deleted file mode 100644
index ea3b02583..000000000
--- a/docs_src/query_params_str_validations/tutorial006d_an.py
+++ /dev/null
@@ -1,12 +0,0 @@
-from fastapi import FastAPI, Query
-from typing_extensions import Annotated
-
-app = FastAPI()
-
-
-@app.get("/items/")
-async def read_items(q: Annotated[str, Query(min_length=3)] = ...):
- results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
- if q:
- results.update({"q": q})
- return results
diff --git a/docs_src/query_params_str_validations/tutorial006d_an_py39.py b/docs_src/query_params_str_validations/tutorial006d_an_py39.py
deleted file mode 100644
index 687a9f544..000000000
--- a/docs_src/query_params_str_validations/tutorial006d_an_py39.py
+++ /dev/null
@@ -1,13 +0,0 @@
-from typing import Annotated
-
-from fastapi import FastAPI, Query
-
-app = FastAPI()
-
-
-@app.get("/items/")
-async def read_items(q: Annotated[str, Query(min_length=3)] = ...):
- results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
- if q:
- results.update({"q": q})
- return results
diff --git a/docs_src/query_params_str_validations/tutorial015_an.py b/docs_src/query_params_str_validations/tutorial015_an.py
new file mode 100644
index 000000000..f2ec6db12
--- /dev/null
+++ b/docs_src/query_params_str_validations/tutorial015_an.py
@@ -0,0 +1,31 @@
+import random
+from typing import Union
+
+from fastapi import FastAPI
+from pydantic import AfterValidator
+from typing_extensions import Annotated
+
+app = FastAPI()
+
+data = {
+ "isbn-9781529046137": "The Hitchhiker's Guide to the Galaxy",
+ "imdb-tt0371724": "The Hitchhiker's Guide to the Galaxy",
+ "isbn-9781439512982": "Isaac Asimov: The Complete Stories, Vol. 2",
+}
+
+
+def check_valid_id(id: str):
+ if not id.startswith(("isbn-", "imdb-")):
+ raise ValueError('Invalid ID format, it must start with "isbn-" or "imdb-"')
+ return id
+
+
+@app.get("/items/")
+async def read_items(
+ id: Annotated[Union[str, None], AfterValidator(check_valid_id)] = None,
+):
+ if id:
+ item = data.get(id)
+ else:
+ id, item = random.choice(list(data.items()))
+ return {"id": id, "name": item}
diff --git a/docs_src/query_params_str_validations/tutorial015_an_py310.py b/docs_src/query_params_str_validations/tutorial015_an_py310.py
new file mode 100644
index 000000000..35f368094
--- /dev/null
+++ b/docs_src/query_params_str_validations/tutorial015_an_py310.py
@@ -0,0 +1,30 @@
+import random
+from typing import Annotated
+
+from fastapi import FastAPI
+from pydantic import AfterValidator
+
+app = FastAPI()
+
+data = {
+ "isbn-9781529046137": "The Hitchhiker's Guide to the Galaxy",
+ "imdb-tt0371724": "The Hitchhiker's Guide to the Galaxy",
+ "isbn-9781439512982": "Isaac Asimov: The Complete Stories, Vol. 2",
+}
+
+
+def check_valid_id(id: str):
+ if not id.startswith(("isbn-", "imdb-")):
+ raise ValueError('Invalid ID format, it must start with "isbn-" or "imdb-"')
+ return id
+
+
+@app.get("/items/")
+async def read_items(
+ id: Annotated[str | None, AfterValidator(check_valid_id)] = None,
+):
+ if id:
+ item = data.get(id)
+ else:
+ id, item = random.choice(list(data.items()))
+ return {"id": id, "name": item}
diff --git a/docs_src/query_params_str_validations/tutorial015_an_py39.py b/docs_src/query_params_str_validations/tutorial015_an_py39.py
new file mode 100644
index 000000000..989b6d2c2
--- /dev/null
+++ b/docs_src/query_params_str_validations/tutorial015_an_py39.py
@@ -0,0 +1,30 @@
+import random
+from typing import Annotated, Union
+
+from fastapi import FastAPI
+from pydantic import AfterValidator
+
+app = FastAPI()
+
+data = {
+ "isbn-9781529046137": "The Hitchhiker's Guide to the Galaxy",
+ "imdb-tt0371724": "The Hitchhiker's Guide to the Galaxy",
+ "isbn-9781439512982": "Isaac Asimov: The Complete Stories, Vol. 2",
+}
+
+
+def check_valid_id(id: str):
+ if not id.startswith(("isbn-", "imdb-")):
+ raise ValueError('Invalid ID format, it must start with "isbn-" or "imdb-"')
+ return id
+
+
+@app.get("/items/")
+async def read_items(
+ id: Annotated[Union[str, None], AfterValidator(check_valid_id)] = None,
+):
+ if id:
+ item = data.get(id)
+ else:
+ id, item = random.choice(list(data.items()))
+ return {"id": id, "name": item}
diff --git a/docs_src/security/tutorial004.py b/docs_src/security/tutorial004.py
index 91d161b8a..222589618 100644
--- a/docs_src/security/tutorial004.py
+++ b/docs_src/security/tutorial004.py
@@ -95,7 +95,7 @@ async def get_current_user(token: str = Depends(oauth2_scheme)):
)
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
- username: str = payload.get("sub")
+ username = payload.get("sub")
if username is None:
raise credentials_exception
token_data = TokenData(username=username)
diff --git a/docs_src/security/tutorial004_an.py b/docs_src/security/tutorial004_an.py
index df50754af..e2221cd39 100644
--- a/docs_src/security/tutorial004_an.py
+++ b/docs_src/security/tutorial004_an.py
@@ -96,7 +96,7 @@ async def get_current_user(token: Annotated[str, Depends(oauth2_scheme)]):
)
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
- username: str = payload.get("sub")
+ username = payload.get("sub")
if username is None:
raise credentials_exception
token_data = TokenData(username=username)
diff --git a/docs_src/security/tutorial004_an_py310.py b/docs_src/security/tutorial004_an_py310.py
index eff54ef01..a3f74fc0e 100644
--- a/docs_src/security/tutorial004_an_py310.py
+++ b/docs_src/security/tutorial004_an_py310.py
@@ -95,7 +95,7 @@ async def get_current_user(token: Annotated[str, Depends(oauth2_scheme)]):
)
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
- username: str = payload.get("sub")
+ username = payload.get("sub")
if username is None:
raise credentials_exception
token_data = TokenData(username=username)
diff --git a/docs_src/security/tutorial004_an_py39.py b/docs_src/security/tutorial004_an_py39.py
index 0455b500c..b33d677ed 100644
--- a/docs_src/security/tutorial004_an_py39.py
+++ b/docs_src/security/tutorial004_an_py39.py
@@ -95,7 +95,7 @@ async def get_current_user(token: Annotated[str, Depends(oauth2_scheme)]):
)
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
- username: str = payload.get("sub")
+ username = payload.get("sub")
if username is None:
raise credentials_exception
token_data = TokenData(username=username)
diff --git a/docs_src/security/tutorial004_py310.py b/docs_src/security/tutorial004_py310.py
index 78bee22a3..d46ce26bf 100644
--- a/docs_src/security/tutorial004_py310.py
+++ b/docs_src/security/tutorial004_py310.py
@@ -94,7 +94,7 @@ async def get_current_user(token: str = Depends(oauth2_scheme)):
)
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
- username: str = payload.get("sub")
+ username = payload.get("sub")
if username is None:
raise credentials_exception
token_data = TokenData(username=username)
diff --git a/docs_src/security/tutorial005_an.py b/docs_src/security/tutorial005_an.py
index 5b67cb145..2e8bb3bdb 100644
--- a/docs_src/security/tutorial005_an.py
+++ b/docs_src/security/tutorial005_an.py
@@ -117,7 +117,7 @@ async def get_current_user(
)
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
- username: str = payload.get("sub")
+ username = payload.get("sub")
if username is None:
raise credentials_exception
token_scopes = payload.get("scopes", [])
diff --git a/docs_src/security/tutorial005_an_py310.py b/docs_src/security/tutorial005_an_py310.py
index 297193e35..90781587f 100644
--- a/docs_src/security/tutorial005_an_py310.py
+++ b/docs_src/security/tutorial005_an_py310.py
@@ -116,7 +116,7 @@ async def get_current_user(
)
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
- username: str = payload.get("sub")
+ username = payload.get("sub")
if username is None:
raise credentials_exception
token_scopes = payload.get("scopes", [])
diff --git a/docs_src/security/tutorial005_an_py39.py b/docs_src/security/tutorial005_an_py39.py
index 1acf47bdc..a5192d8d6 100644
--- a/docs_src/security/tutorial005_an_py39.py
+++ b/docs_src/security/tutorial005_an_py39.py
@@ -1,5 +1,5 @@
from datetime import datetime, timedelta, timezone
-from typing import Annotated, List, Union
+from typing import Annotated, Union
import jwt
from fastapi import Depends, FastAPI, HTTPException, Security, status
@@ -44,7 +44,7 @@ class Token(BaseModel):
class TokenData(BaseModel):
username: Union[str, None] = None
- scopes: List[str] = []
+ scopes: list[str] = []
class User(BaseModel):
@@ -116,7 +116,7 @@ async def get_current_user(
)
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
- username: str = payload.get("sub")
+ username = payload.get("sub")
if username is None:
raise credentials_exception
token_scopes = payload.get("scopes", [])
diff --git a/fastapi/__init__.py b/fastapi/__init__.py
index c92279cfd..b02bf8b4f 100644
--- a/fastapi/__init__.py
+++ b/fastapi/__init__.py
@@ -1,6 +1,6 @@
"""FastAPI framework, high performance, easy to learn, fast to code, ready for production"""
-__version__ = "0.115.7"
+__version__ = "0.116.1"
from starlette import status as status
diff --git a/fastapi/_compat.py b/fastapi/_compat.py
index c07e4a3b0..227ad837d 100644
--- a/fastapi/_compat.py
+++ b/fastapi/_compat.py
@@ -16,6 +16,7 @@ from typing import (
Tuple,
Type,
Union,
+ cast,
)
from fastapi.exceptions import RequestErrorModel
@@ -231,6 +232,10 @@ if PYDANTIC_V2:
field_mapping, definitions = schema_generator.generate_definitions(
inputs=inputs
)
+ for item_def in cast(Dict[str, Dict[str, Any]], definitions).values():
+ if "description" in item_def:
+ item_description = cast(str, item_def["description"]).split("\f")[0]
+ item_def["description"] = item_description
return field_mapping, definitions # type: ignore[return-value]
def is_scalar_field(field: ModelField) -> bool:
diff --git a/fastapi/applications.py b/fastapi/applications.py
index 6d427cdc2..05c7bd2be 100644
--- a/fastapi/applications.py
+++ b/fastapi/applications.py
@@ -748,7 +748,7 @@ class FastAPI(Starlette):
This affects the generated OpenAPI (e.g. visible at `/docs`).
Read more about it in the
- [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi).
+ [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
"""
),
] = True,
@@ -1720,7 +1720,7 @@ class FastAPI(Starlette):
This affects the generated OpenAPI (e.g. visible at `/docs`).
Read more about it in the
- [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi).
+ [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
"""
),
] = True,
@@ -2093,7 +2093,7 @@ class FastAPI(Starlette):
This affects the generated OpenAPI (e.g. visible at `/docs`).
Read more about it in the
- [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi).
+ [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
"""
),
] = True,
@@ -2471,7 +2471,7 @@ class FastAPI(Starlette):
This affects the generated OpenAPI (e.g. visible at `/docs`).
Read more about it in the
- [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi).
+ [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
"""
),
] = True,
@@ -2849,7 +2849,7 @@ class FastAPI(Starlette):
This affects the generated OpenAPI (e.g. visible at `/docs`).
Read more about it in the
- [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi).
+ [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
"""
),
] = True,
@@ -3222,7 +3222,7 @@ class FastAPI(Starlette):
This affects the generated OpenAPI (e.g. visible at `/docs`).
Read more about it in the
- [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi).
+ [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
"""
),
] = True,
@@ -3595,7 +3595,7 @@ class FastAPI(Starlette):
This affects the generated OpenAPI (e.g. visible at `/docs`).
Read more about it in the
- [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi).
+ [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
"""
),
] = True,
@@ -3968,7 +3968,7 @@ class FastAPI(Starlette):
This affects the generated OpenAPI (e.g. visible at `/docs`).
Read more about it in the
- [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi).
+ [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
"""
),
] = True,
@@ -4346,7 +4346,7 @@ class FastAPI(Starlette):
This affects the generated OpenAPI (e.g. visible at `/docs`).
Read more about it in the
- [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi).
+ [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
"""
),
] = True,
@@ -4425,7 +4425,7 @@ class FastAPI(Starlette):
app = FastAPI()
- @app.put("/items/{item_id}")
+ @app.trace("/items/{item_id}")
def trace_item(item_id: str):
return None
```
@@ -4515,14 +4515,17 @@ class FastAPI(Starlette):
```python
import time
+ from typing import Awaitable, Callable
- from fastapi import FastAPI, Request
+ from fastapi import FastAPI, Request, Response
app = FastAPI()
@app.middleware("http")
- async def add_process_time_header(request: Request, call_next):
+ async def add_process_time_header(
+ request: Request, call_next: Callable[[Request], Awaitable[Response]]
+ ) -> Response:
start_time = time.time()
response = await call_next(request)
process_time = time.time() - start_time
diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py
index 38bc3eb4e..baf226b7a 100644
--- a/fastapi/dependencies/utils.py
+++ b/fastapi/dependencies/utils.py
@@ -133,9 +133,9 @@ def get_param_sub_dependant(
def get_parameterless_sub_dependant(*, depends: params.Depends, path: str) -> Dependant:
- assert callable(
- depends.dependency
- ), "A parameter-less dependency must have a callable dependency"
+ assert callable(depends.dependency), (
+ "A parameter-less dependency must have a callable dependency"
+ )
return get_sub_dependant(depends=depends, dependency=depends.dependency, path=path)
@@ -305,9 +305,9 @@ def get_dependant(
type_annotation=param_details.type_annotation,
dependant=dependant,
):
- assert (
- param_details.field is None
- ), f"Cannot specify multiple FastAPI annotations for {param_name!r}"
+ assert param_details.field is None, (
+ f"Cannot specify multiple FastAPI annotations for {param_name!r}"
+ )
continue
assert param_details.field is not None
if isinstance(param_details.field.field_info, params.Body):
@@ -442,9 +442,9 @@ def analyze_param(
),
):
assert depends is None, f"Cannot specify `Depends` for type {type_annotation!r}"
- assert (
- field_info is None
- ), f"Cannot specify FastAPI annotation for type {type_annotation!r}"
+ assert field_info is None, (
+ f"Cannot specify FastAPI annotation for type {type_annotation!r}"
+ )
# Handle default assignations, neither field_info nor depends was not found in Annotated nor default value
elif field_info is None and depends is None:
default_value = value if value is not inspect.Signature.empty else RequiredParam
@@ -497,9 +497,9 @@ def analyze_param(
field_info=field_info,
)
if is_path_param:
- assert is_scalar_field(
- field=field
- ), "Path params must be of one of the supported types"
+ assert is_scalar_field(field=field), (
+ "Path params must be of one of the supported types"
+ )
elif isinstance(field_info, params.Query):
assert (
is_scalar_field(field)
@@ -524,9 +524,9 @@ def add_param_to_fields(*, field: ModelField, dependant: Dependant) -> None:
elif field_info_in == params.ParamTypes.header:
dependant.header_params.append(field)
else:
- assert (
- field_info_in == params.ParamTypes.cookie
- ), f"non-body parameters must be in path, query, header or cookie: {field.name}"
+ assert field_info_in == params.ParamTypes.cookie, (
+ f"non-body parameters must be in path, query, header or cookie: {field.name}"
+ )
dependant.cookie_params.append(field)
@@ -751,6 +751,8 @@ def request_params_to_args(
return values, errors
fields_to_extract = fields
+ default_convert_underscores = True
+
params_to_process: Dict[str, Any] = {}
model_fields = [
@@ -770,7 +772,9 @@ def request_params_to_args(
if isinstance(received_params, Headers):
# Handle fields extracted from a Pydantic Model for a header, each field
# doesn't have a FieldInfo of type Header with the default convert_underscores=True
- convert_underscores = getattr(field.field_info, "convert_underscores", True)
+ convert_underscores = getattr(
+ field.field_info, "convert_underscores", default_convert_underscores
+ )
if convert_underscores:
alias = (
field.alias
@@ -789,9 +793,9 @@ def request_params_to_args(
for field in fields:
field_info = field.field_info
- assert isinstance(
- field_info, params.Param
- ), "Params must be subclasses of Param"
+ assert isinstance(field_info, params.Param), (
+ "Params must be subclasses of Param"
+ )
if lenient_issubclass(field.type_, BaseModel):
loc: Tuple[str, ...] = (field_info.in_.value,)
@@ -812,6 +816,25 @@ def request_params_to_args(
return values, errors
+def is_union_of_base_models(field_type: Any) -> bool:
+ """Check if field type is a Union where all members are BaseModel subclasses."""
+ from fastapi.types import UnionType
+
+ origin = get_origin(field_type)
+
+ # Check if it's a Union type (covers both typing.Union and types.UnionType in Python 3.10+)
+ if origin is not Union and origin is not UnionType:
+ return False
+
+ union_args = get_args(field_type)
+
+ for arg in union_args:
+ if not lenient_issubclass(arg, BaseModel):
+ return False
+
+ return True
+
+
def _should_embed_body_fields(fields: List[ModelField]) -> bool:
if not fields:
return False
@@ -825,10 +848,12 @@ def _should_embed_body_fields(fields: List[ModelField]) -> bool:
# If it explicitly specifies it is embedded, it has to be embedded
if getattr(first_field.field_info, "embed", None):
return True
- # If it's a Form (or File) field, it has to be a BaseModel to be top level
+ # If it's a Form (or File) field, it has to be a BaseModel (or a union of BaseModels) to be top level
# otherwise it has to be embedded, so that the key value pair can be extracted
- if isinstance(first_field.field_info, params.Form) and not lenient_issubclass(
- first_field.type_, BaseModel
+ if (
+ isinstance(first_field.field_info, params.Form)
+ and not lenient_issubclass(first_field.type_, BaseModel)
+ and not is_union_of_base_models(first_field.type_)
):
return True
return False
diff --git a/fastapi/openapi/docs.py b/fastapi/openapi/docs.py
index c2ec358d2..f181b43c1 100644
--- a/fastapi/openapi/docs.py
+++ b/fastapi/openapi/docs.py
@@ -188,7 +188,7 @@ def get_redoc_html(
It is normally set to a CDN URL.
"""
),
- ] = "https://cdn.jsdelivr.net/npm/redoc@next/bundles/redoc.standalone.js",
+ ] = "https://cdn.jsdelivr.net/npm/redoc@2/bundles/redoc.standalone.js",
redoc_favicon_url: Annotated[
str,
Doc(
diff --git a/fastapi/openapi/utils.py b/fastapi/openapi/utils.py
index 947eca948..808646cc2 100644
--- a/fastapi/openapi/utils.py
+++ b/fastapi/openapi/utils.py
@@ -32,6 +32,7 @@ from fastapi.utils import (
generate_operation_id_for_path,
is_body_allowed_for_status_code,
)
+from pydantic import BaseModel
from starlette.responses import JSONResponse
from starlette.routing import BaseRoute
from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY
@@ -113,6 +114,13 @@ def _get_openapi_operation_parameters(
(ParamTypes.header, header_params),
(ParamTypes.cookie, cookie_params),
]
+ default_convert_underscores = True
+ if len(flat_dependant.header_params) == 1:
+ first_field = flat_dependant.header_params[0]
+ if lenient_issubclass(first_field.type_, BaseModel):
+ default_convert_underscores = getattr(
+ first_field.field_info, "convert_underscores", True
+ )
for param_type, param_group in parameter_groups:
for param in param_group:
field_info = param.field_info
@@ -126,8 +134,21 @@ def _get_openapi_operation_parameters(
field_mapping=field_mapping,
separate_input_output_schemas=separate_input_output_schemas,
)
+ name = param.alias
+ convert_underscores = getattr(
+ param.field_info,
+ "convert_underscores",
+ default_convert_underscores,
+ )
+ if (
+ param_type == ParamTypes.header
+ and param.alias == param.name
+ and convert_underscores
+ ):
+ name = param.name.replace("_", "-")
+
parameter = {
- "name": param.alias,
+ "name": name,
"in": param_type.value,
"required": param.required,
"schema": param_schema,
@@ -364,9 +385,9 @@ def get_openapi_path(
openapi_response = operation_responses.setdefault(
status_code_key, {}
)
- assert isinstance(
- process_response, dict
- ), "An additional response must be a dict"
+ assert isinstance(process_response, dict), (
+ "An additional response must be a dict"
+ )
field = route.response_fields.get(additional_status_code)
additional_field_schema: Optional[Dict[str, Any]] = None
if field:
@@ -434,9 +455,9 @@ def get_fields_from_routes(
route, routing.APIRoute
):
if route.body_field:
- assert isinstance(
- route.body_field, ModelField
- ), "A request body must be a Pydantic Field"
+ assert isinstance(route.body_field, ModelField), (
+ "A request body must be a Pydantic Field"
+ )
body_fields_from_routes.append(route.body_field)
if route.response_field:
responses_from_routes.append(route.response_field)
diff --git a/fastapi/routing.py b/fastapi/routing.py
index 8ea4bb219..54c75a027 100644
--- a/fastapi/routing.py
+++ b/fastapi/routing.py
@@ -9,6 +9,7 @@ from typing import (
Any,
AsyncIterator,
Callable,
+ Collection,
Coroutine,
Dict,
List,
@@ -504,9 +505,9 @@ class APIRoute(routing.Route):
status_code = int(status_code)
self.status_code = status_code
if self.response_model:
- assert is_body_allowed_for_status_code(
- status_code
- ), f"Status code {status_code} must not have a response body"
+ assert is_body_allowed_for_status_code(status_code), (
+ f"Status code {status_code} must not have a response body"
+ )
response_name = "Response_" + self.unique_id
self.response_field = create_model_field(
name=response_name,
@@ -537,9 +538,9 @@ class APIRoute(routing.Route):
assert isinstance(response, dict), "An additional response must be a dict"
model = response.get("model")
if model:
- assert is_body_allowed_for_status_code(
- additional_status_code
- ), f"Status code {additional_status_code} must not have a response body"
+ assert is_body_allowed_for_status_code(additional_status_code), (
+ f"Status code {additional_status_code} must not have a response body"
+ )
response_name = f"Response_{additional_status_code}_{self.unique_id}"
response_field = create_model_field(
name=response_name, type_=model, mode="serialization"
@@ -814,7 +815,7 @@ class APIRouter(routing.Router):
This affects the generated OpenAPI (e.g. visible at `/docs`).
Read more about it in the
- [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi).
+ [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
"""
),
] = True,
@@ -844,9 +845,9 @@ class APIRouter(routing.Router):
)
if prefix:
assert prefix.startswith("/"), "A path prefix must start with '/'"
- assert not prefix.endswith(
- "/"
- ), "A path prefix must not end with '/', as the routes will start with '/'"
+ assert not prefix.endswith("/"), (
+ "A path prefix must not end with '/', as the routes will start with '/'"
+ )
self.prefix = prefix
self.tags: List[Union[str, Enum]] = tags or []
self.dependencies = list(dependencies or [])
@@ -862,7 +863,7 @@ class APIRouter(routing.Router):
def route(
self,
path: str,
- methods: Optional[List[str]] = None,
+ methods: Optional[Collection[str]] = None,
name: Optional[str] = None,
include_in_schema: bool = True,
) -> Callable[[DecoratedCallable], DecoratedCallable]:
@@ -1256,9 +1257,9 @@ class APIRouter(routing.Router):
"""
if prefix:
assert prefix.startswith("/"), "A path prefix must start with '/'"
- assert not prefix.endswith(
- "/"
- ), "A path prefix must not end with '/', as the routes will start with '/'"
+ assert not prefix.endswith("/"), (
+ "A path prefix must not end with '/', as the routes will start with '/'"
+ )
else:
for r in router.routes:
path = getattr(r, "path") # noqa: B009
@@ -1626,7 +1627,7 @@ class APIRouter(routing.Router):
This affects the generated OpenAPI (e.g. visible at `/docs`).
Read more about it in the
- [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi).
+ [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
"""
),
] = True,
@@ -2003,7 +2004,7 @@ class APIRouter(routing.Router):
This affects the generated OpenAPI (e.g. visible at `/docs`).
Read more about it in the
- [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi).
+ [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
"""
),
] = True,
@@ -2385,7 +2386,7 @@ class APIRouter(routing.Router):
This affects the generated OpenAPI (e.g. visible at `/docs`).
Read more about it in the
- [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi).
+ [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
"""
),
] = True,
@@ -2767,7 +2768,7 @@ class APIRouter(routing.Router):
This affects the generated OpenAPI (e.g. visible at `/docs`).
Read more about it in the
- [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi).
+ [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
"""
),
] = True,
@@ -3144,7 +3145,7 @@ class APIRouter(routing.Router):
This affects the generated OpenAPI (e.g. visible at `/docs`).
Read more about it in the
- [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi).
+ [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
"""
),
] = True,
@@ -3521,7 +3522,7 @@ class APIRouter(routing.Router):
This affects the generated OpenAPI (e.g. visible at `/docs`).
Read more about it in the
- [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi).
+ [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
"""
),
] = True,
@@ -3903,7 +3904,7 @@ class APIRouter(routing.Router):
This affects the generated OpenAPI (e.g. visible at `/docs`).
Read more about it in the
- [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi).
+ [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
"""
),
] = True,
@@ -4285,7 +4286,7 @@ class APIRouter(routing.Router):
This affects the generated OpenAPI (e.g. visible at `/docs`).
Read more about it in the
- [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi).
+ [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
"""
),
] = True,
diff --git a/fastapi/security/api_key.py b/fastapi/security/api_key.py
index d68bdb037..70c2dca8a 100644
--- a/fastapi/security/api_key.py
+++ b/fastapi/security/api_key.py
@@ -9,7 +9,15 @@ from typing_extensions import Annotated, Doc
class APIKeyBase(SecurityBase):
- pass
+ @staticmethod
+ def check_api_key(api_key: Optional[str], auto_error: bool) -> Optional[str]:
+ if not api_key:
+ if auto_error:
+ raise HTTPException(
+ status_code=HTTP_403_FORBIDDEN, detail="Not authenticated"
+ )
+ return None
+ return api_key
class APIKeyQuery(APIKeyBase):
@@ -101,14 +109,7 @@ class APIKeyQuery(APIKeyBase):
async def __call__(self, request: Request) -> Optional[str]:
api_key = request.query_params.get(self.model.name)
- if not api_key:
- if self.auto_error:
- raise HTTPException(
- status_code=HTTP_403_FORBIDDEN, detail="Not authenticated"
- )
- else:
- return None
- return api_key
+ return self.check_api_key(api_key, self.auto_error)
class APIKeyHeader(APIKeyBase):
@@ -196,14 +197,7 @@ class APIKeyHeader(APIKeyBase):
async def __call__(self, request: Request) -> Optional[str]:
api_key = request.headers.get(self.model.name)
- if not api_key:
- if self.auto_error:
- raise HTTPException(
- status_code=HTTP_403_FORBIDDEN, detail="Not authenticated"
- )
- else:
- return None
- return api_key
+ return self.check_api_key(api_key, self.auto_error)
class APIKeyCookie(APIKeyBase):
@@ -291,11 +285,4 @@ class APIKeyCookie(APIKeyBase):
async def __call__(self, request: Request) -> Optional[str]:
api_key = request.cookies.get(self.model.name)
- if not api_key:
- if self.auto_error:
- raise HTTPException(
- status_code=HTTP_403_FORBIDDEN, detail="Not authenticated"
- )
- else:
- return None
- return api_key
+ return self.check_api_key(api_key, self.auto_error)
diff --git a/fastapi/security/http.py b/fastapi/security/http.py
index e06f3d66d..9ab2df3c9 100644
--- a/fastapi/security/http.py
+++ b/fastapi/security/http.py
@@ -413,8 +413,11 @@ class HTTPDigest(HTTPBase):
else:
return None
if scheme.lower() != "digest":
- raise HTTPException(
- status_code=HTTP_403_FORBIDDEN,
- detail="Invalid authentication credentials",
- )
+ if self.auto_error:
+ raise HTTPException(
+ status_code=HTTP_403_FORBIDDEN,
+ detail="Invalid authentication credentials",
+ )
+ else:
+ return None
return HTTPAuthorizationCredentials(scheme=scheme, credentials=credentials)
diff --git a/fastapi/security/oauth2.py b/fastapi/security/oauth2.py
index 6adc55bfe..88e394db1 100644
--- a/fastapi/security/oauth2.py
+++ b/fastapi/security/oauth2.py
@@ -63,7 +63,7 @@ class OAuth2PasswordRequestForm:
*,
grant_type: Annotated[
Union[str, None],
- Form(pattern="password"),
+ Form(pattern="^password$"),
Doc(
"""
The OAuth2 spec says it is required and MUST be the fixed string
@@ -85,7 +85,7 @@ class OAuth2PasswordRequestForm:
],
password: Annotated[
str,
- Form(),
+ Form(json_schema_extra={"format": "password"}),
Doc(
"""
`password` string. The OAuth2 spec requires the exact field name
@@ -130,7 +130,7 @@ class OAuth2PasswordRequestForm:
] = None,
client_secret: Annotated[
Union[str, None],
- Form(),
+ Form(json_schema_extra={"format": "password"}),
Doc(
"""
If there's a `client_password` (and a `client_id`), they can be sent
@@ -217,7 +217,7 @@ class OAuth2PasswordRequestFormStrict(OAuth2PasswordRequestForm):
self,
grant_type: Annotated[
str,
- Form(pattern="password"),
+ Form(pattern="^password$"),
Doc(
"""
The OAuth2 spec says it is required and MUST be the fixed string
@@ -457,11 +457,26 @@ class OAuth2PasswordBearer(OAuth2):
"""
),
] = True,
+ refreshUrl: Annotated[
+ Optional[str],
+ Doc(
+ """
+ The URL to refresh the token and obtain a new one.
+ """
+ ),
+ ] = None,
):
if not scopes:
scopes = {}
flows = OAuthFlowsModel(
- password=cast(Any, {"tokenUrl": tokenUrl, "scopes": scopes})
+ password=cast(
+ Any,
+ {
+ "tokenUrl": tokenUrl,
+ "refreshUrl": refreshUrl,
+ "scopes": scopes,
+ },
+ )
)
super().__init__(
flows=flows,
diff --git a/pyproject.toml b/pyproject.toml
index 381eb50bf..7709451ff 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -38,11 +38,12 @@ classifiers = [
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
+ "Programming Language :: Python :: 3.13",
"Topic :: Internet :: WWW/HTTP :: HTTP Servers",
"Topic :: Internet :: WWW/HTTP",
]
dependencies = [
- "starlette>=0.40.0,<0.46.0",
+ "starlette>=0.40.0,<0.48.0",
"pydantic>=1.7.4,!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0",
"typing-extensions>=4.8.0",
]
@@ -57,7 +58,26 @@ Changelog = "https://fastapi.tiangolo.com/release-notes/"
[project.optional-dependencies]
standard = [
- "fastapi-cli[standard] >=0.0.5",
+ "fastapi-cli[standard] >=0.0.8",
+ # For the test client
+ "httpx >=0.23.0",
+ # For templates
+ "jinja2 >=3.1.5",
+ # For forms and file uploads
+ "python-multipart >=0.0.18",
+ # To validate email fields
+ "email-validator >=2.0.0",
+ # Uvicorn with uvloop
+ "uvicorn[standard] >=0.12.0",
+ # TODO: this should be part of some pydantic optional extra dependencies
+ # # Settings management
+ # "pydantic-settings >=2.0.0",
+ # # Extra Pydantic data types
+ # "pydantic-extra-types >=2.0.0",
+]
+
+standard-no-fastapi-cloud-cli = [
+ "fastapi-cli[standard-no-fastapi-cloud-cli] >=0.0.8",
# For the test client
"httpx >=0.23.0",
# For templates
@@ -76,7 +96,7 @@ standard = [
]
all = [
- "fastapi-cli[standard] >=0.0.5",
+ "fastapi-cli[standard] >=0.0.8",
# # For the test client
"httpx >=0.23.0",
# For templates
@@ -162,6 +182,8 @@ filterwarnings = [
# Ref: https://github.com/python-trio/trio/pull/3054
# Remove once there's a new version of Trio
'ignore:The `hash` argument is deprecated*:DeprecationWarning:trio',
+ # Ignore flaky coverage / pytest warning about SQLite connection, only applies to Python 3.13 and Pydantic v1
+ 'ignore:Exception ignored in. =0.23.0,<0.28.0
+httpx >=0.23.0,<0.29.0
# For linting and generating docs versions
-ruff ==0.6.4
+ruff ==0.12.7
diff --git a/requirements-docs.txt b/requirements-docs.txt
index 6f391675a..eeb41b5ce 100644
--- a/requirements-docs.txt
+++ b/requirements-docs.txt
@@ -1,19 +1,19 @@
-e .
-r requirements-docs-tests.txt
-mkdocs-material==9.5.18
+mkdocs-material==9.6.16
mdx-include >=1.4.1,<2.0.0
mkdocs-redirects>=1.2.1,<1.3.0
-typer == 0.12.5
+typer == 0.16.0
pyyaml >=5.3.1,<7.0.0
# For Material for MkDocs, Chinese search
jieba==0.42.1
# For image processing by Material for MkDocs
-pillow==11.0.0
+pillow==11.3.0
# For image processing by Material for MkDocs
-cairosvg==2.7.1
+cairosvg==2.8.2
mkdocstrings[python]==0.26.1
-griffe-typingdoc==0.2.7
+griffe-typingdoc==0.2.8
# For griffe, it formats with black
-black==24.10.0
+black==25.1.0
mkdocs-macros-plugin==1.3.7
markdown-include-variants==0.0.4
diff --git a/requirements-github-actions.txt b/requirements-github-actions.txt
index 920aefea6..f807d06a8 100644
--- a/requirements-github-actions.txt
+++ b/requirements-github-actions.txt
@@ -1,6 +1,6 @@
PyGithub>=2.3.0,<3.0.0
pydantic>=2.5.3,<3.0.0
pydantic-settings>=2.1.0,<3.0.0
-httpx>=0.27.0,<0.28.0
+httpx>=0.27.0,<0.29.0
pyyaml >=5.3.1,<7.0.0
smokeshow
diff --git a/requirements-tests.txt b/requirements-tests.txt
index 91e7fb7aa..b9f2b2b66 100644
--- a/requirements-tests.txt
+++ b/requirements-tests.txt
@@ -3,14 +3,14 @@
pytest >=7.1.3,<9.0.0
coverage[toml] >= 6.5.0,< 8.0
mypy ==1.8.0
-dirty-equals ==0.8.0
-sqlmodel==0.0.22
+dirty-equals ==0.9.0
+sqlmodel==0.0.24
flask >=1.1.2,<4.0.0
anyio[trio] >=3.2.1,<5.0.0
PyJWT==2.8.0
pyyaml >=5.3.1,<7.0.0
passlib[bcrypt] >=1.7.2,<2.0.0
-inline-snapshot==0.18.1
+inline-snapshot>=0.21.1
# types
types-ujson ==5.10.0.20240515
types-orjson ==3.6.2
diff --git a/requirements-translations.txt b/requirements-translations.txt
index a8f8a02d7..a62ba3ac1 100644
--- a/requirements-translations.txt
+++ b/requirements-translations.txt
@@ -1 +1,2 @@
-pydantic-ai==0.0.15
+pydantic-ai==0.4.10
+GitPython==3.1.45
diff --git a/scripts/label_approved.py b/scripts/label_approved.py
index 271444504..81de92efb 100644
--- a/scripts/label_approved.py
+++ b/scripts/label_approved.py
@@ -27,7 +27,7 @@ if settings.debug:
logging.basicConfig(level=logging.DEBUG)
else:
logging.basicConfig(level=logging.INFO)
-logging.debug(f"Using config: {settings.json()}")
+logging.debug(f"Using config: {settings.model_dump_json()}")
g = Github(settings.token.get_secret_value())
repo = g.get_repo(settings.github_repository)
for pr in repo.get_pulls(state="open"):
@@ -48,7 +48,7 @@ for pr in repo.get_pulls(state="open"):
]
config = settings.config or default_config
for approved_label, conf in config.items():
- logging.debug(f"Processing config: {conf.json()}")
+ logging.debug(f"Processing config: {conf.model_dump_json()}")
if conf.await_label is None or (conf.await_label in pr_label_by_name):
logging.debug(f"Processable PR: {pr.number}")
if len(approved_reviews) >= conf.number:
diff --git a/scripts/people.py b/scripts/people.py
index f61fd31c9..7418b4595 100644
--- a/scripts/people.py
+++ b/scripts/people.py
@@ -119,6 +119,7 @@ class Settings(BaseSettings):
github_token: SecretStr
github_repository: str
httpx_timeout: int = 30
+ sleep_interval: int = 5
def get_graphql_response(
@@ -184,7 +185,7 @@ def get_discussion_nodes(settings: Settings) -> list[DiscussionsNode]:
discussion_nodes.append(discussion_edge.node)
last_edge = discussion_edges[-1]
# Handle GitHub secondary rate limits, requests per minute
- time.sleep(5)
+ time.sleep(settings.sleep_interval)
discussion_edges = get_graphql_question_discussion_edges(
settings=settings, after=last_edge.cursor
)
diff --git a/scripts/translate.py b/scripts/translate.py
index ce11b3877..2fdc18ca0 100644
--- a/scripts/translate.py
+++ b/scripts/translate.py
@@ -1,10 +1,15 @@
+import secrets
+import subprocess
from functools import lru_cache
from pathlib import Path
-from typing import Iterable
+from typing import Annotated, Iterable
+import git
import typer
import yaml
+from github import Github
from pydantic_ai import Agent
+from rich import print
non_translated_sections = (
"reference/",
@@ -21,6 +26,8 @@ non_translated_sections = (
general_prompt = """
For technical terms in English that don't have a common translation term use the original term in English.
+If you have instructions to translate specific terms or phrases in a specific way, please follow those instructions instead of keeping the old and outdated content.
+
For code snippets or fragments, surrounded by backticks (`), don't translate the content, keep the original in English. For example, `list`, `dict`, keep them as is.
The content is written in markdown, write the translation in markdown as well. Don't add triple backticks (`) around the generated translation content.
@@ -28,8 +35,38 @@ The content is written in markdown, write the translation in markdown as well. D
When there's an example of code, the console or a terminal, normally surrounded by triple backticks and a keyword like "console" or "bash" (e.g. ```console), do not translate the content, keep the original in English.
The original content will be surrounded by triple percentage signs (%) and you should translate it to the target language. Do not include the triple percentage signs in the translation.
+
+There are special blocks of notes, tips and others that look like:
+
+/// note
+
+To translate it, keep the same line and add the translation after a vertical bar.
+
+For example, if you were translating to Spanish, you would write:
+
+/// note | Nota
+
+Some examples in Spanish:
+
+Source:
+
+/// tip
+
+Result:
+
+/// tip | Consejo
+
+Source:
+
+/// details | Preview
+
+Result:
+
+/// details | Vista previa
"""
+app = typer.Typer()
+
@lru_cache
def get_langs() -> dict[str, str]:
@@ -38,64 +75,89 @@ def get_langs() -> dict[str, str]:
def generate_lang_path(*, lang: str, path: Path) -> Path:
en_docs_path = Path("docs/en/docs")
- assert str(path).startswith(
- str(en_docs_path)
- ), f"Path must be inside {en_docs_path}"
+ assert str(path).startswith(str(en_docs_path)), (
+ f"Path must be inside {en_docs_path}"
+ )
lang_docs_path = Path(f"docs/{lang}/docs")
out_path = Path(str(path).replace(str(en_docs_path), str(lang_docs_path)))
return out_path
-def translate_page(*, lang: str, path: Path) -> None:
+def generate_en_path(*, lang: str, path: Path) -> Path:
+ en_docs_path = Path("docs/en/docs")
+ assert not str(path).startswith(str(en_docs_path)), (
+ f"Path must not be inside {en_docs_path}"
+ )
+ lang_docs_path = Path(f"docs/{lang}/docs")
+ out_path = Path(str(path).replace(str(lang_docs_path), str(en_docs_path)))
+ return out_path
+
+
+@app.command()
+def translate_page(
+ *,
+ language: Annotated[str, typer.Option(envvar="LANGUAGE")],
+ en_path: Annotated[Path, typer.Option(envvar="EN_PATH")],
+) -> None:
langs = get_langs()
- language = langs[lang]
- lang_path = Path(f"docs/{lang}")
+ language_name = langs[language]
+ lang_path = Path(f"docs/{language}")
lang_path.mkdir(exist_ok=True)
lang_prompt_path = lang_path / "llm-prompt.md"
assert lang_prompt_path.exists(), f"Prompt file not found: {lang_prompt_path}"
lang_prompt_content = lang_prompt_path.read_text()
en_docs_path = Path("docs/en/docs")
- assert str(path).startswith(
- str(en_docs_path)
- ), f"Path must be inside {en_docs_path}"
- out_path = generate_lang_path(lang=lang, path=path)
+ assert str(en_path).startswith(str(en_docs_path)), (
+ f"Path must be inside {en_docs_path}"
+ )
+ out_path = generate_lang_path(lang=language, path=en_path)
out_path.parent.mkdir(parents=True, exist_ok=True)
- original_content = path.read_text()
+ original_content = en_path.read_text()
old_translation: str | None = None
if out_path.exists():
+ print(f"Found existing translation: {out_path}")
old_translation = out_path.read_text()
+ print(f"Translating {en_path} to {language} ({language_name})")
agent = Agent("openai:gpt-4o")
prompt_segments = [
- lang_prompt_content,
general_prompt,
+ lang_prompt_content,
]
if old_translation:
prompt_segments.extend(
[
"There's an existing previous translation for this content that is probably outdated with old content or old instructions.",
- "Update the translation given your current instructions and the original content.",
- "If you have instructions to translate specific terms or phrases in a specific way, please follow those instructions instead of keeping the old and outdated content.",
+ "Update the translation only where necessary:",
+ "- If the original English content has changed, reflect that in the translation.",
+ "- If the previous translation violates current instructions, update it.",
+ "- Otherwise, preserve the original translation **line-by-line** as-is.",
+ "Do not:",
+ "- Rephrase or rewrite correct lines just to improve the style.",
+ "- Add or remove line breaks unless the English source changed.",
+ "- Change formatting or whitespace unless absolutely required.",
+ "Only change what must be changed. The goal is to minimize diffs for easier review.",
"Previous translation:",
f"%%%\n{old_translation}%%%",
]
)
prompt_segments.extend(
[
- f"Translate to {language} ({lang}).",
+ f"Translate to {language} ({language_name}).",
"Original content:",
f"%%%\n{original_content}%%%",
]
)
prompt = "\n\n".join(prompt_segments)
-
+ print(f"Running agent for {out_path}")
result = agent.run_sync(prompt)
out_content = f"{result.data.strip()}\n"
+ print(f"Saving translation to {out_path}")
out_path.write_text(out_content)
-def iter_paths_to_translate() -> Iterable[Path]:
+def iter_all_en_paths() -> Iterable[Path]:
"""
Iterate on the markdown files to translate in order of priority.
"""
@@ -119,12 +181,16 @@ def iter_paths_to_translate() -> Iterable[Path]:
yield path
-def translate_all(lang: str) -> None:
- paths_to_process: list[Path] = []
- for path in iter_paths_to_translate():
+def iter_en_paths_to_translate() -> Iterable[Path]:
+ for path in iter_all_en_paths():
if str(path).replace("docs/en/docs/", "").startswith(non_translated_sections):
continue
- paths_to_process.append(path)
+ yield path
+
+
+@app.command()
+def translate_lang(language: Annotated[str, typer.Option(envvar="LANGUAGE")]) -> None:
+ paths_to_process = list(iter_en_paths_to_translate())
print("Original paths:")
for p in paths_to_process:
print(f" - {p}")
@@ -132,7 +198,7 @@ def translate_all(lang: str) -> None:
missing_paths: list[Path] = []
skipped_paths: list[Path] = []
for p in paths_to_process:
- lang_path = generate_lang_path(lang=lang, path=p)
+ lang_path = generate_lang_path(lang=language, path=p)
if lang_path.exists():
skipped_paths.append(p)
continue
@@ -147,16 +213,158 @@ def translate_all(lang: str) -> None:
print(f"Total paths to process: {len(missing_paths)}")
for p in missing_paths:
print(f"Translating: {p}")
- translate_page(lang="es", path=p)
+ translate_page(language="es", en_path=p)
print(f"Done translating: {p}")
-def main(*, lang: str, path: Path = None) -> None:
- if path:
- translate_page(lang=lang, path=path)
- else:
- translate_all(lang=lang)
+@app.command()
+def list_removable(language: str) -> list[Path]:
+ removable_paths: list[Path] = []
+ lang_paths = Path(f"docs/{language}").rglob("*.md")
+ for path in lang_paths:
+ en_path = generate_en_path(lang=language, path=path)
+ if not en_path.exists():
+ removable_paths.append(path)
+ print(removable_paths)
+ return removable_paths
+
+
+@app.command()
+def list_all_removable() -> list[Path]:
+ all_removable_paths: list[Path] = []
+ langs = get_langs()
+ for lang in langs:
+ if lang == "en":
+ continue
+ removable_paths = list_removable(lang)
+ all_removable_paths.extend(removable_paths)
+ print(all_removable_paths)
+ return all_removable_paths
+
+
+@app.command()
+def remove_removable(language: str) -> None:
+ removable_paths = list_removable(language)
+ for path in removable_paths:
+ path.unlink()
+ print(f"Removed: {path}")
+ print("Done removing all removable paths")
+
+
+@app.command()
+def remove_all_removable() -> None:
+ all_removable = list_all_removable()
+ for removable_path in all_removable:
+ removable_path.unlink()
+ print(f"Removed: {removable_path}")
+ print("Done removing all removable paths")
+
+
+@app.command()
+def list_missing(language: str) -> list[Path]:
+ missing_paths: list[Path] = []
+ en_lang_paths = list(iter_en_paths_to_translate())
+ for path in en_lang_paths:
+ lang_path = generate_lang_path(lang=language, path=path)
+ if not lang_path.exists():
+ missing_paths.append(path)
+ print(missing_paths)
+ return missing_paths
+
+
+@app.command()
+def list_outdated(language: str) -> list[Path]:
+ dir_path = Path(__file__).absolute().parent.parent
+ repo = git.Repo(dir_path)
+
+ outdated_paths: list[Path] = []
+ en_lang_paths = list(iter_en_paths_to_translate())
+ for path in en_lang_paths:
+ lang_path = generate_lang_path(lang=language, path=path)
+ if not lang_path.exists():
+ continue
+ en_commit_datetime = list(repo.iter_commits(paths=path, max_count=1))[
+ 0
+ ].committed_datetime
+ lang_commit_datetime = list(repo.iter_commits(paths=lang_path, max_count=1))[
+ 0
+ ].committed_datetime
+ if lang_commit_datetime < en_commit_datetime:
+ outdated_paths.append(path)
+ print(outdated_paths)
+ return outdated_paths
+
+
+@app.command()
+def update_outdated(language: Annotated[str, typer.Option(envvar="LANGUAGE")]) -> None:
+ outdated_paths = list_outdated(language)
+ for path in outdated_paths:
+ print(f"Updating lang: {language} path: {path}")
+ translate_page(language=language, en_path=path)
+ print(f"Done updating: {path}")
+ print("Done updating all outdated paths")
+
+
+@app.command()
+def add_missing(language: Annotated[str, typer.Option(envvar="LANGUAGE")]) -> None:
+ missing_paths = list_missing(language)
+ for path in missing_paths:
+ print(f"Adding lang: {language} path: {path}")
+ translate_page(language=language, en_path=path)
+ print(f"Done adding: {path}")
+ print("Done adding all missing paths")
+
+
+@app.command()
+def update_and_add(language: Annotated[str, typer.Option(envvar="LANGUAGE")]) -> None:
+ print(f"Updating outdated translations for {language}")
+ update_outdated(language=language)
+ print(f"Adding missing translations for {language}")
+ add_missing(language=language)
+ print(f"Done updating and adding for {language}")
+
+
+@app.command()
+def make_pr(
+ *,
+ language: Annotated[str | None, typer.Option(envvar="LANGUAGE")] = None,
+ github_token: Annotated[str, typer.Option(envvar="GITHUB_TOKEN")],
+ github_repository: Annotated[str, typer.Option(envvar="GITHUB_REPOSITORY")],
+) -> None:
+ print("Setting up GitHub Actions git user")
+ repo = git.Repo(Path(__file__).absolute().parent.parent)
+ if not repo.is_dirty(untracked_files=True):
+ print("Repository is clean, no changes to commit")
+ return
+ subprocess.run(["git", "config", "user.name", "github-actions"], check=True)
+ subprocess.run(
+ ["git", "config", "user.email", "github-actions@github.com"], check=True
+ )
+ branch_name = "translate"
+ if language:
+ branch_name += f"-{language}"
+ branch_name += f"-{secrets.token_hex(4)}"
+ print(f"Creating a new branch {branch_name}")
+ subprocess.run(["git", "checkout", "-b", branch_name], check=True)
+ print("Adding updated files")
+ git_path = Path("docs")
+ subprocess.run(["git", "add", str(git_path)], check=True)
+ print("Committing updated file")
+ message = "đ Update translations"
+ if language:
+ message += f" for {language}"
+ subprocess.run(["git", "commit", "-m", message], check=True)
+ print("Pushing branch")
+ subprocess.run(["git", "push", "origin", branch_name], check=True)
+ print("Creating PR")
+ g = Github(github_token)
+ gh_repo = g.get_repo(github_repository)
+ pr = gh_repo.create_pull(
+ title=message, body=message, base="master", head=branch_name
+ )
+ print(f"Created PR: {pr.number}")
+ print("Finished")
if __name__ == "__main__":
- typer.run(main)
+ app()
diff --git a/tests/test_application.py b/tests/test_application.py
index 5c62f5f6e..a7d50ea72 100644
--- a/tests/test_application.py
+++ b/tests/test_application.py
@@ -43,7 +43,7 @@ def test_redoc():
response = client.get("/redoc")
assert response.status_code == 200, response.text
assert response.headers["content-type"] == "text/html; charset=utf-8"
- assert "redoc@next" in response.text
+ assert "redoc@2" in response.text
def test_enum_status_code_response():
diff --git a/tests/test_enforce_once_required_parameter.py b/tests/test_enforce_once_required_parameter.py
index b64f8341b..30329282f 100644
--- a/tests/test_enforce_once_required_parameter.py
+++ b/tests/test_enforce_once_required_parameter.py
@@ -48,7 +48,7 @@ expected_schema = {
"type": "array",
},
"msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error " "Type", "type": "string"},
+ "type": {"title": "Error Type", "type": "string"},
},
"required": ["loc", "msg", "type"],
"title": "ValidationError",
@@ -73,7 +73,7 @@ expected_schema = {
"responses": {
"200": {
"content": {"application/json": {"schema": {}}},
- "description": "Successful " "Response",
+ "description": "Successful Response",
},
"422": {
"content": {
@@ -83,7 +83,7 @@ expected_schema = {
}
}
},
- "description": "Validation " "Error",
+ "description": "Validation Error",
},
},
"summary": "Foo Handler",
diff --git a/tests/test_generic_parameterless_depends.py b/tests/test_generic_parameterless_depends.py
index fe13ff89b..5aa35320c 100644
--- a/tests/test_generic_parameterless_depends.py
+++ b/tests/test_generic_parameterless_depends.py
@@ -55,7 +55,7 @@ def test_openapi_schema():
"responses": {
"200": {
"content": {"application/json": {"schema": {}}},
- "description": "Successful " "Response",
+ "description": "Successful Response",
}
},
"summary": "A",
@@ -67,7 +67,7 @@ def test_openapi_schema():
"responses": {
"200": {
"content": {"application/json": {"schema": {}}},
- "description": "Successful " "Response",
+ "description": "Successful Response",
}
},
"summary": "B",
diff --git a/tests/test_modules_same_name_body/test_main.py b/tests/test_modules_same_name_body/test_main.py
index cc165bdca..263d87df2 100644
--- a/tests/test_modules_same_name_body/test_main.py
+++ b/tests/test_modules_same_name_body/test_main.py
@@ -1,3 +1,4 @@
+import pytest
from fastapi.testclient import TestClient
from .app.main import app
@@ -5,29 +6,22 @@ from .app.main import app
client = TestClient(app)
-def test_post_a():
+@pytest.mark.parametrize(
+ "path", ["/a/compute", "/a/compute/", "/b/compute", "/b/compute/"]
+)
+def test_post(path):
data = {"a": 2, "b": "foo"}
- response = client.post("/a/compute", json=data)
+ response = client.post(path, json=data)
assert response.status_code == 200, response.text
- data = response.json()
+ assert data == response.json()
-def test_post_a_invalid():
+@pytest.mark.parametrize(
+ "path", ["/a/compute", "/a/compute/", "/b/compute", "/b/compute/"]
+)
+def test_post_invalid(path):
data = {"a": "bar", "b": "foo"}
- response = client.post("/a/compute", json=data)
- assert response.status_code == 422, response.text
-
-
-def test_post_b():
- data = {"a": 2, "b": "foo"}
- response = client.post("/b/compute/", json=data)
- assert response.status_code == 200, response.text
- data = response.json()
-
-
-def test_post_b_invalid():
- data = {"a": "bar", "b": "foo"}
- response = client.post("/b/compute/", json=data)
+ response = client.post(path, json=data)
assert response.status_code == 422, response.text
diff --git a/tests/test_openapi_model_description_trim_on_formfeed.py b/tests/test_openapi_model_description_trim_on_formfeed.py
new file mode 100644
index 000000000..e18d4f6b2
--- /dev/null
+++ b/tests/test_openapi_model_description_trim_on_formfeed.py
@@ -0,0 +1,31 @@
+from fastapi import FastAPI
+from fastapi.testclient import TestClient
+from pydantic import BaseModel
+
+app = FastAPI()
+
+
+class MyModel(BaseModel):
+ """
+ A model with a form feed character in the title.
+ \f
+ Text after form feed character.
+ """
+
+
+@app.get("/foo")
+def foo(v: MyModel): # pragma: no cover
+ pass
+
+
+client = TestClient(app)
+
+
+def test_openapi():
+ response = client.get("/openapi.json")
+ assert response.status_code == 200, response.text
+ openapi_schema = response.json()
+
+ assert openapi_schema["components"]["schemas"]["MyModel"]["description"] == (
+ "A model with a form feed character in the title.\n"
+ )
diff --git a/tests/test_repeated_dependency_schema.py b/tests/test_repeated_dependency_schema.py
index d7d0dfa05..c21829bd9 100644
--- a/tests/test_repeated_dependency_schema.py
+++ b/tests/test_repeated_dependency_schema.py
@@ -41,7 +41,7 @@ schema = {
"type": "array",
},
"msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error " "Type", "type": "string"},
+ "type": {"title": "Error Type", "type": "string"},
},
"required": ["loc", "msg", "type"],
"title": "ValidationError",
@@ -66,7 +66,7 @@ schema = {
"responses": {
"200": {
"content": {"application/json": {"schema": {}}},
- "description": "Successful " "Response",
+ "description": "Successful Response",
},
"422": {
"content": {
@@ -76,7 +76,7 @@ schema = {
}
}
},
- "description": "Validation " "Error",
+ "description": "Validation Error",
},
},
"summary": "Get Deps",
diff --git a/tests/test_security_http_digest_optional.py b/tests/test_security_http_digest_optional.py
index 1e6eb8bd7..0d66f9c72 100644
--- a/tests/test_security_http_digest_optional.py
+++ b/tests/test_security_http_digest_optional.py
@@ -37,8 +37,8 @@ def test_security_http_digest_incorrect_scheme_credentials():
response = client.get(
"/users/me", headers={"Authorization": "Other invalidauthorization"}
)
- assert response.status_code == 403, response.text
- assert response.json() == {"detail": "Invalid authentication credentials"}
+ assert response.status_code == 200, response.text
+ assert response.json() == {"msg": "Create an account first"}
def test_openapi_schema():
diff --git a/tests/test_security_oauth2.py b/tests/test_security_oauth2.py
index 7d914d034..2b7e3457a 100644
--- a/tests/test_security_oauth2.py
+++ b/tests/test_security_oauth2.py
@@ -1,3 +1,4 @@
+import pytest
from dirty_equals import IsDict
from fastapi import Depends, FastAPI, Security
from fastapi.security import OAuth2, OAuth2PasswordRequestFormStrict
@@ -137,10 +138,18 @@ def test_strict_login_no_grant_type():
)
-def test_strict_login_incorrect_grant_type():
+@pytest.mark.parametrize(
+ argnames=["grant_type"],
+ argvalues=[
+ pytest.param("incorrect", id="incorrect value"),
+ pytest.param("passwordblah", id="password with suffix"),
+ pytest.param("blahpassword", id="password with prefix"),
+ ],
+)
+def test_strict_login_incorrect_grant_type(grant_type: str):
response = client.post(
"/login",
- data={"username": "johndoe", "password": "secret", "grant_type": "incorrect"},
+ data={"username": "johndoe", "password": "secret", "grant_type": grant_type},
)
assert response.status_code == 422
assert response.json() == IsDict(
@@ -149,9 +158,9 @@ def test_strict_login_incorrect_grant_type():
{
"type": "string_pattern_mismatch",
"loc": ["body", "grant_type"],
- "msg": "String should match pattern 'password'",
- "input": "incorrect",
- "ctx": {"pattern": "password"},
+ "msg": "String should match pattern '^password$'",
+ "input": grant_type,
+ "ctx": {"pattern": "^password$"},
}
]
}
@@ -161,9 +170,9 @@ def test_strict_login_incorrect_grant_type():
"detail": [
{
"loc": ["body", "grant_type"],
- "msg": 'string does not match regex "password"',
+ "msg": 'string does not match regex "^password$"',
"type": "value_error.str.regex",
- "ctx": {"pattern": "password"},
+ "ctx": {"pattern": "^password$"},
}
]
}
@@ -248,7 +257,7 @@ def test_openapi_schema():
"properties": {
"grant_type": {
"title": "Grant Type",
- "pattern": "password",
+ "pattern": "^password$",
"type": "string",
},
"username": {"title": "Username", "type": "string"},
diff --git a/tests/test_security_oauth2_optional.py b/tests/test_security_oauth2_optional.py
index 0da3b911e..046ac5763 100644
--- a/tests/test_security_oauth2_optional.py
+++ b/tests/test_security_oauth2_optional.py
@@ -1,5 +1,6 @@
from typing import Optional
+import pytest
from dirty_equals import IsDict
from fastapi import Depends, FastAPI, Security
from fastapi.security import OAuth2, OAuth2PasswordRequestFormStrict
@@ -141,10 +142,18 @@ def test_strict_login_no_grant_type():
)
-def test_strict_login_incorrect_grant_type():
+@pytest.mark.parametrize(
+ argnames=["grant_type"],
+ argvalues=[
+ pytest.param("incorrect", id="incorrect value"),
+ pytest.param("passwordblah", id="password with suffix"),
+ pytest.param("blahpassword", id="password with prefix"),
+ ],
+)
+def test_strict_login_incorrect_grant_type(grant_type: str):
response = client.post(
"/login",
- data={"username": "johndoe", "password": "secret", "grant_type": "incorrect"},
+ data={"username": "johndoe", "password": "secret", "grant_type": grant_type},
)
assert response.status_code == 422
assert response.json() == IsDict(
@@ -153,9 +162,9 @@ def test_strict_login_incorrect_grant_type():
{
"type": "string_pattern_mismatch",
"loc": ["body", "grant_type"],
- "msg": "String should match pattern 'password'",
- "input": "incorrect",
- "ctx": {"pattern": "password"},
+ "msg": "String should match pattern '^password$'",
+ "input": grant_type,
+ "ctx": {"pattern": "^password$"},
}
]
}
@@ -165,9 +174,9 @@ def test_strict_login_incorrect_grant_type():
"detail": [
{
"loc": ["body", "grant_type"],
- "msg": 'string does not match regex "password"',
+ "msg": 'string does not match regex "^password$"',
"type": "value_error.str.regex",
- "ctx": {"pattern": "password"},
+ "ctx": {"pattern": "^password$"},
}
]
}
@@ -252,7 +261,7 @@ def test_openapi_schema():
"properties": {
"grant_type": {
"title": "Grant Type",
- "pattern": "password",
+ "pattern": "^password$",
"type": "string",
},
"username": {"title": "Username", "type": "string"},
diff --git a/tests/test_security_oauth2_optional_description.py b/tests/test_security_oauth2_optional_description.py
index 85a9f9b39..629cddca2 100644
--- a/tests/test_security_oauth2_optional_description.py
+++ b/tests/test_security_oauth2_optional_description.py
@@ -1,5 +1,6 @@
from typing import Optional
+import pytest
from dirty_equals import IsDict
from fastapi import Depends, FastAPI, Security
from fastapi.security import OAuth2, OAuth2PasswordRequestFormStrict
@@ -142,10 +143,18 @@ def test_strict_login_no_grant_type():
)
-def test_strict_login_incorrect_grant_type():
+@pytest.mark.parametrize(
+ argnames=["grant_type"],
+ argvalues=[
+ pytest.param("incorrect", id="incorrect value"),
+ pytest.param("passwordblah", id="password with suffix"),
+ pytest.param("blahpassword", id="password with prefix"),
+ ],
+)
+def test_strict_login_incorrect_grant_type(grant_type: str):
response = client.post(
"/login",
- data={"username": "johndoe", "password": "secret", "grant_type": "incorrect"},
+ data={"username": "johndoe", "password": "secret", "grant_type": grant_type},
)
assert response.status_code == 422
assert response.json() == IsDict(
@@ -154,9 +163,9 @@ def test_strict_login_incorrect_grant_type():
{
"type": "string_pattern_mismatch",
"loc": ["body", "grant_type"],
- "msg": "String should match pattern 'password'",
- "input": "incorrect",
- "ctx": {"pattern": "password"},
+ "msg": "String should match pattern '^password$'",
+ "input": grant_type,
+ "ctx": {"pattern": "^password$"},
}
]
}
@@ -166,9 +175,9 @@ def test_strict_login_incorrect_grant_type():
"detail": [
{
"loc": ["body", "grant_type"],
- "msg": 'string does not match regex "password"',
+ "msg": 'string does not match regex "^password$"',
"type": "value_error.str.regex",
- "ctx": {"pattern": "password"},
+ "ctx": {"pattern": "^password$"},
}
]
}
@@ -253,7 +262,7 @@ def test_openapi_schema():
"properties": {
"grant_type": {
"title": "Grant Type",
- "pattern": "password",
+ "pattern": "^password$",
"type": "string",
},
"username": {"title": "Username", "type": "string"},
diff --git a/tests/test_tutorial/test_body_multiple_params/test_tutorial003.py b/tests/test_tutorial/test_body_multiple_params/test_tutorial003.py
index c26f8b89b..d18ceae48 100644
--- a/tests/test_tutorial/test_body_multiple_params/test_tutorial003.py
+++ b/tests/test_tutorial/test_body_multiple_params/test_tutorial003.py
@@ -1,13 +1,26 @@
+import importlib
+
import pytest
from dirty_equals import IsDict
from fastapi.testclient import TestClient
+from ...utils import needs_py39, needs_py310
+
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.body_multiple_params.tutorial003 import app
+@pytest.fixture(
+ name="client",
+ params=[
+ "tutorial003",
+ pytest.param("tutorial003_py310", marks=needs_py310),
+ "tutorial003_an",
+ pytest.param("tutorial003_an_py39", marks=needs_py39),
+ pytest.param("tutorial003_an_py310", marks=needs_py310),
+ ],
+)
+def get_client(request: pytest.FixtureRequest):
+ mod = importlib.import_module(f"docs_src.body_multiple_params.{request.param}")
- client = TestClient(app)
+ client = TestClient(mod.app)
return client
diff --git a/tests/test_tutorial/test_body_multiple_params/test_tutorial003_an.py b/tests/test_tutorial/test_body_multiple_params/test_tutorial003_an.py
deleted file mode 100644
index 62c7e2fad..000000000
--- a/tests/test_tutorial/test_body_multiple_params/test_tutorial003_an.py
+++ /dev/null
@@ -1,273 +0,0 @@
-import pytest
-from dirty_equals import IsDict
-from fastapi.testclient import TestClient
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.body_multiple_params.tutorial003_an import app
-
- client = TestClient(app)
- return client
-
-
-def test_post_body_valid(client: TestClient):
- response = client.put(
- "/items/5",
- json={
- "importance": 2,
- "item": {"name": "Foo", "price": 50.5},
- "user": {"username": "Dave"},
- },
- )
- assert response.status_code == 200
- assert response.json() == {
- "item_id": 5,
- "importance": 2,
- "item": {
- "name": "Foo",
- "price": 50.5,
- "description": None,
- "tax": None,
- },
- "user": {"username": "Dave", "full_name": None},
- }
-
-
-def test_post_body_no_data(client: TestClient):
- response = client.put("/items/5", json=None)
- assert response.status_code == 422
- assert response.json() == IsDict(
- {
- "detail": [
- {
- "type": "missing",
- "loc": ["body", "item"],
- "msg": "Field required",
- "input": None,
- },
- {
- "type": "missing",
- "loc": ["body", "user"],
- "msg": "Field required",
- "input": None,
- },
- {
- "type": "missing",
- "loc": ["body", "importance"],
- "msg": "Field required",
- "input": None,
- },
- ]
- }
- ) | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "detail": [
- {
- "loc": ["body", "item"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- {
- "loc": ["body", "user"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- {
- "loc": ["body", "importance"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- ]
- }
- )
-
-
-def test_post_body_empty_list(client: TestClient):
- response = client.put("/items/5", json=[])
- assert response.status_code == 422
- assert response.json() == IsDict(
- {
- "detail": [
- {
- "type": "missing",
- "loc": ["body", "item"],
- "msg": "Field required",
- "input": None,
- },
- {
- "type": "missing",
- "loc": ["body", "user"],
- "msg": "Field required",
- "input": None,
- },
- {
- "type": "missing",
- "loc": ["body", "importance"],
- "msg": "Field required",
- "input": None,
- },
- ]
- }
- ) | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "detail": [
- {
- "loc": ["body", "item"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- {
- "loc": ["body", "user"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- {
- "loc": ["body", "importance"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- ]
- }
- )
-
-
-def test_openapi_schema(client: TestClient):
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/items/{item_id}": {
- "put": {
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- "summary": "Update Item",
- "operationId": "update_item_items__item_id__put",
- "parameters": [
- {
- "required": True,
- "schema": {"title": "Item Id", "type": "integer"},
- "name": "item_id",
- "in": "path",
- }
- ],
- "requestBody": {
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/Body_update_item_items__item_id__put"
- }
- }
- },
- "required": True,
- },
- }
- }
- },
- "components": {
- "schemas": {
- "Item": {
- "title": "Item",
- "required": ["name", "price"],
- "type": "object",
- "properties": {
- "name": {"title": "Name", "type": "string"},
- "description": IsDict(
- {
- "title": "Description",
- "anyOf": [{"type": "string"}, {"type": "null"}],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {"title": "Description", "type": "string"}
- ),
- "price": {"title": "Price", "type": "number"},
- "tax": IsDict(
- {
- "title": "Tax",
- "anyOf": [{"type": "number"}, {"type": "null"}],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {"title": "Tax", "type": "number"}
- ),
- },
- },
- "User": {
- "title": "User",
- "required": ["username"],
- "type": "object",
- "properties": {
- "username": {"title": "Username", "type": "string"},
- "full_name": IsDict(
- {
- "title": "Full Name",
- "anyOf": [{"type": "string"}, {"type": "null"}],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {"title": "Full Name", "type": "string"}
- ),
- },
- },
- "Body_update_item_items__item_id__put": {
- "title": "Body_update_item_items__item_id__put",
- "required": ["item", "user", "importance"],
- "type": "object",
- "properties": {
- "item": {"$ref": "#/components/schemas/Item"},
- "user": {"$ref": "#/components/schemas/User"},
- "importance": {"title": "Importance", "type": "integer"},
- },
- },
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_body_multiple_params/test_tutorial003_an_py310.py b/tests/test_tutorial/test_body_multiple_params/test_tutorial003_an_py310.py
deleted file mode 100644
index f46430fb5..000000000
--- a/tests/test_tutorial/test_body_multiple_params/test_tutorial003_an_py310.py
+++ /dev/null
@@ -1,279 +0,0 @@
-import pytest
-from dirty_equals import IsDict
-from fastapi.testclient import TestClient
-
-from ...utils import needs_py310
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.body_multiple_params.tutorial003_an_py310 import app
-
- client = TestClient(app)
- return client
-
-
-@needs_py310
-def test_post_body_valid(client: TestClient):
- response = client.put(
- "/items/5",
- json={
- "importance": 2,
- "item": {"name": "Foo", "price": 50.5},
- "user": {"username": "Dave"},
- },
- )
- assert response.status_code == 200
- assert response.json() == {
- "item_id": 5,
- "importance": 2,
- "item": {
- "name": "Foo",
- "price": 50.5,
- "description": None,
- "tax": None,
- },
- "user": {"username": "Dave", "full_name": None},
- }
-
-
-@needs_py310
-def test_post_body_no_data(client: TestClient):
- response = client.put("/items/5", json=None)
- assert response.status_code == 422
- assert response.json() == IsDict(
- {
- "detail": [
- {
- "type": "missing",
- "loc": ["body", "item"],
- "msg": "Field required",
- "input": None,
- },
- {
- "type": "missing",
- "loc": ["body", "user"],
- "msg": "Field required",
- "input": None,
- },
- {
- "type": "missing",
- "loc": ["body", "importance"],
- "msg": "Field required",
- "input": None,
- },
- ]
- }
- ) | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "detail": [
- {
- "loc": ["body", "item"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- {
- "loc": ["body", "user"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- {
- "loc": ["body", "importance"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- ]
- }
- )
-
-
-@needs_py310
-def test_post_body_empty_list(client: TestClient):
- response = client.put("/items/5", json=[])
- assert response.status_code == 422
- assert response.json() == IsDict(
- {
- "detail": [
- {
- "type": "missing",
- "loc": ["body", "item"],
- "msg": "Field required",
- "input": None,
- },
- {
- "type": "missing",
- "loc": ["body", "user"],
- "msg": "Field required",
- "input": None,
- },
- {
- "type": "missing",
- "loc": ["body", "importance"],
- "msg": "Field required",
- "input": None,
- },
- ]
- }
- ) | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "detail": [
- {
- "loc": ["body", "item"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- {
- "loc": ["body", "user"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- {
- "loc": ["body", "importance"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- ]
- }
- )
-
-
-@needs_py310
-def test_openapi_schema(client: TestClient):
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/items/{item_id}": {
- "put": {
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- "summary": "Update Item",
- "operationId": "update_item_items__item_id__put",
- "parameters": [
- {
- "required": True,
- "schema": {"title": "Item Id", "type": "integer"},
- "name": "item_id",
- "in": "path",
- }
- ],
- "requestBody": {
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/Body_update_item_items__item_id__put"
- }
- }
- },
- "required": True,
- },
- }
- }
- },
- "components": {
- "schemas": {
- "Item": {
- "title": "Item",
- "required": ["name", "price"],
- "type": "object",
- "properties": {
- "name": {"title": "Name", "type": "string"},
- "description": IsDict(
- {
- "title": "Description",
- "anyOf": [{"type": "string"}, {"type": "null"}],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {"title": "Description", "type": "string"}
- ),
- "price": {"title": "Price", "type": "number"},
- "tax": IsDict(
- {
- "title": "Tax",
- "anyOf": [{"type": "number"}, {"type": "null"}],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {"title": "Tax", "type": "number"}
- ),
- },
- },
- "User": {
- "title": "User",
- "required": ["username"],
- "type": "object",
- "properties": {
- "username": {"title": "Username", "type": "string"},
- "full_name": IsDict(
- {
- "title": "Full Name",
- "anyOf": [{"type": "string"}, {"type": "null"}],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {"title": "Full Name", "type": "string"}
- ),
- },
- },
- "Body_update_item_items__item_id__put": {
- "title": "Body_update_item_items__item_id__put",
- "required": ["item", "user", "importance"],
- "type": "object",
- "properties": {
- "item": {"$ref": "#/components/schemas/Item"},
- "user": {"$ref": "#/components/schemas/User"},
- "importance": {"title": "Importance", "type": "integer"},
- },
- },
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_body_multiple_params/test_tutorial003_an_py39.py b/tests/test_tutorial/test_body_multiple_params/test_tutorial003_an_py39.py
deleted file mode 100644
index 29071cddc..000000000
--- a/tests/test_tutorial/test_body_multiple_params/test_tutorial003_an_py39.py
+++ /dev/null
@@ -1,279 +0,0 @@
-import pytest
-from dirty_equals import IsDict
-from fastapi.testclient import TestClient
-
-from ...utils import needs_py39
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.body_multiple_params.tutorial003_an_py39 import app
-
- client = TestClient(app)
- return client
-
-
-@needs_py39
-def test_post_body_valid(client: TestClient):
- response = client.put(
- "/items/5",
- json={
- "importance": 2,
- "item": {"name": "Foo", "price": 50.5},
- "user": {"username": "Dave"},
- },
- )
- assert response.status_code == 200
- assert response.json() == {
- "item_id": 5,
- "importance": 2,
- "item": {
- "name": "Foo",
- "price": 50.5,
- "description": None,
- "tax": None,
- },
- "user": {"username": "Dave", "full_name": None},
- }
-
-
-@needs_py39
-def test_post_body_no_data(client: TestClient):
- response = client.put("/items/5", json=None)
- assert response.status_code == 422
- assert response.json() == IsDict(
- {
- "detail": [
- {
- "type": "missing",
- "loc": ["body", "item"],
- "msg": "Field required",
- "input": None,
- },
- {
- "type": "missing",
- "loc": ["body", "user"],
- "msg": "Field required",
- "input": None,
- },
- {
- "type": "missing",
- "loc": ["body", "importance"],
- "msg": "Field required",
- "input": None,
- },
- ]
- }
- ) | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "detail": [
- {
- "loc": ["body", "item"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- {
- "loc": ["body", "user"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- {
- "loc": ["body", "importance"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- ]
- }
- )
-
-
-@needs_py39
-def test_post_body_empty_list(client: TestClient):
- response = client.put("/items/5", json=[])
- assert response.status_code == 422
- assert response.json() == IsDict(
- {
- "detail": [
- {
- "type": "missing",
- "loc": ["body", "item"],
- "msg": "Field required",
- "input": None,
- },
- {
- "type": "missing",
- "loc": ["body", "user"],
- "msg": "Field required",
- "input": None,
- },
- {
- "type": "missing",
- "loc": ["body", "importance"],
- "msg": "Field required",
- "input": None,
- },
- ]
- }
- ) | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "detail": [
- {
- "loc": ["body", "item"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- {
- "loc": ["body", "user"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- {
- "loc": ["body", "importance"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- ]
- }
- )
-
-
-@needs_py39
-def test_openapi_schema(client: TestClient):
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/items/{item_id}": {
- "put": {
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- "summary": "Update Item",
- "operationId": "update_item_items__item_id__put",
- "parameters": [
- {
- "required": True,
- "schema": {"title": "Item Id", "type": "integer"},
- "name": "item_id",
- "in": "path",
- }
- ],
- "requestBody": {
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/Body_update_item_items__item_id__put"
- }
- }
- },
- "required": True,
- },
- }
- }
- },
- "components": {
- "schemas": {
- "Item": {
- "title": "Item",
- "required": ["name", "price"],
- "type": "object",
- "properties": {
- "name": {"title": "Name", "type": "string"},
- "description": IsDict(
- {
- "title": "Description",
- "anyOf": [{"type": "string"}, {"type": "null"}],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {"title": "Description", "type": "string"}
- ),
- "price": {"title": "Price", "type": "number"},
- "tax": IsDict(
- {
- "title": "Tax",
- "anyOf": [{"type": "number"}, {"type": "null"}],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {"title": "Tax", "type": "number"}
- ),
- },
- },
- "User": {
- "title": "User",
- "required": ["username"],
- "type": "object",
- "properties": {
- "username": {"title": "Username", "type": "string"},
- "full_name": IsDict(
- {
- "title": "Full Name",
- "anyOf": [{"type": "string"}, {"type": "null"}],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {"title": "Full Name", "type": "string"}
- ),
- },
- },
- "Body_update_item_items__item_id__put": {
- "title": "Body_update_item_items__item_id__put",
- "required": ["item", "user", "importance"],
- "type": "object",
- "properties": {
- "item": {"$ref": "#/components/schemas/Item"},
- "user": {"$ref": "#/components/schemas/User"},
- "importance": {"title": "Importance", "type": "integer"},
- },
- },
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_body_multiple_params/test_tutorial003_py310.py b/tests/test_tutorial/test_body_multiple_params/test_tutorial003_py310.py
deleted file mode 100644
index 133afe9b5..000000000
--- a/tests/test_tutorial/test_body_multiple_params/test_tutorial003_py310.py
+++ /dev/null
@@ -1,279 +0,0 @@
-import pytest
-from dirty_equals import IsDict
-from fastapi.testclient import TestClient
-
-from ...utils import needs_py310
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.body_multiple_params.tutorial003_py310 import app
-
- client = TestClient(app)
- return client
-
-
-@needs_py310
-def test_post_body_valid(client: TestClient):
- response = client.put(
- "/items/5",
- json={
- "importance": 2,
- "item": {"name": "Foo", "price": 50.5},
- "user": {"username": "Dave"},
- },
- )
- assert response.status_code == 200
- assert response.json() == {
- "item_id": 5,
- "importance": 2,
- "item": {
- "name": "Foo",
- "price": 50.5,
- "description": None,
- "tax": None,
- },
- "user": {"username": "Dave", "full_name": None},
- }
-
-
-@needs_py310
-def test_post_body_no_data(client: TestClient):
- response = client.put("/items/5", json=None)
- assert response.status_code == 422
- assert response.json() == IsDict(
- {
- "detail": [
- {
- "type": "missing",
- "loc": ["body", "item"],
- "msg": "Field required",
- "input": None,
- },
- {
- "type": "missing",
- "loc": ["body", "user"],
- "msg": "Field required",
- "input": None,
- },
- {
- "type": "missing",
- "loc": ["body", "importance"],
- "msg": "Field required",
- "input": None,
- },
- ]
- }
- ) | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "detail": [
- {
- "loc": ["body", "item"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- {
- "loc": ["body", "user"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- {
- "loc": ["body", "importance"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- ]
- }
- )
-
-
-@needs_py310
-def test_post_body_empty_list(client: TestClient):
- response = client.put("/items/5", json=[])
- assert response.status_code == 422
- assert response.json() == IsDict(
- {
- "detail": [
- {
- "type": "missing",
- "loc": ["body", "item"],
- "msg": "Field required",
- "input": None,
- },
- {
- "type": "missing",
- "loc": ["body", "user"],
- "msg": "Field required",
- "input": None,
- },
- {
- "type": "missing",
- "loc": ["body", "importance"],
- "msg": "Field required",
- "input": None,
- },
- ]
- }
- ) | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "detail": [
- {
- "loc": ["body", "item"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- {
- "loc": ["body", "user"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- {
- "loc": ["body", "importance"],
- "msg": "field required",
- "type": "value_error.missing",
- },
- ]
- }
- )
-
-
-@needs_py310
-def test_openapi_schema(client: TestClient):
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/items/{item_id}": {
- "put": {
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- "summary": "Update Item",
- "operationId": "update_item_items__item_id__put",
- "parameters": [
- {
- "required": True,
- "schema": {"title": "Item Id", "type": "integer"},
- "name": "item_id",
- "in": "path",
- }
- ],
- "requestBody": {
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/Body_update_item_items__item_id__put"
- }
- }
- },
- "required": True,
- },
- }
- }
- },
- "components": {
- "schemas": {
- "Item": {
- "title": "Item",
- "required": ["name", "price"],
- "type": "object",
- "properties": {
- "name": {"title": "Name", "type": "string"},
- "description": IsDict(
- {
- "title": "Description",
- "anyOf": [{"type": "string"}, {"type": "null"}],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {"title": "Description", "type": "string"}
- ),
- "price": {"title": "Price", "type": "number"},
- "tax": IsDict(
- {
- "title": "Tax",
- "anyOf": [{"type": "number"}, {"type": "null"}],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {"title": "Tax", "type": "number"}
- ),
- },
- },
- "User": {
- "title": "User",
- "required": ["username"],
- "type": "object",
- "properties": {
- "username": {"title": "Username", "type": "string"},
- "full_name": IsDict(
- {
- "title": "Full Name",
- "anyOf": [{"type": "string"}, {"type": "null"}],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {"title": "Full Name", "type": "string"}
- ),
- },
- },
- "Body_update_item_items__item_id__put": {
- "title": "Body_update_item_items__item_id__put",
- "required": ["item", "user", "importance"],
- "type": "object",
- "properties": {
- "item": {"$ref": "#/components/schemas/Item"},
- "user": {"$ref": "#/components/schemas/User"},
- "importance": {"title": "Importance", "type": "integer"},
- },
- },
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_configure_swagger_ui/test_tutorial001.py b/tests/test_tutorial/test_configure_swagger_ui/test_tutorial001.py
index 72db54bd2..a04dba219 100644
--- a/tests/test_tutorial/test_configure_swagger_ui/test_tutorial001.py
+++ b/tests/test_tutorial/test_configure_swagger_ui/test_tutorial001.py
@@ -8,31 +8,31 @@ client = TestClient(app)
def test_swagger_ui():
response = client.get("/docs")
assert response.status_code == 200, response.text
- assert (
- '"syntaxHighlight": false' in response.text
- ), "syntaxHighlight should be included and converted to JSON"
- assert (
- '"dom_id": "#swagger-ui"' in response.text
- ), "default configs should be preserved"
+ assert '"syntaxHighlight": false' in response.text, (
+ "syntaxHighlight should be included and converted to JSON"
+ )
+ assert '"dom_id": "#swagger-ui"' in response.text, (
+ "default configs should be preserved"
+ )
assert "presets: [" in response.text, "default configs should be preserved"
- assert (
- "SwaggerUIBundle.presets.apis," in response.text
- ), "default configs should be preserved"
- assert (
- "SwaggerUIBundle.SwaggerUIStandalonePreset" in response.text
- ), "default configs should be preserved"
- assert (
- '"layout": "BaseLayout",' in response.text
- ), "default configs should be preserved"
- assert (
- '"deepLinking": true,' in response.text
- ), "default configs should be preserved"
- assert (
- '"showExtensions": true,' in response.text
- ), "default configs should be preserved"
- assert (
- '"showCommonExtensions": true,' in response.text
- ), "default configs should be preserved"
+ assert "SwaggerUIBundle.presets.apis," in response.text, (
+ "default configs should be preserved"
+ )
+ assert "SwaggerUIBundle.SwaggerUIStandalonePreset" in response.text, (
+ "default configs should be preserved"
+ )
+ assert '"layout": "BaseLayout",' in response.text, (
+ "default configs should be preserved"
+ )
+ assert '"deepLinking": true,' in response.text, (
+ "default configs should be preserved"
+ )
+ assert '"showExtensions": true,' in response.text, (
+ "default configs should be preserved"
+ )
+ assert '"showCommonExtensions": true,' in response.text, (
+ "default configs should be preserved"
+ )
def test_get_users():
diff --git a/tests/test_tutorial/test_configure_swagger_ui/test_tutorial002.py b/tests/test_tutorial/test_configure_swagger_ui/test_tutorial002.py
index 166901188..ea56b6f21 100644
--- a/tests/test_tutorial/test_configure_swagger_ui/test_tutorial002.py
+++ b/tests/test_tutorial/test_configure_swagger_ui/test_tutorial002.py
@@ -8,34 +8,34 @@ client = TestClient(app)
def test_swagger_ui():
response = client.get("/docs")
assert response.status_code == 200, response.text
- assert (
- '"syntaxHighlight": false' not in response.text
- ), "not used parameters should not be included"
- assert (
- '"syntaxHighlight.theme": "obsidian"' in response.text
- ), "parameters with middle dots should be included in a JSON compatible way"
- assert (
- '"dom_id": "#swagger-ui"' in response.text
- ), "default configs should be preserved"
+ assert '"syntaxHighlight": false' not in response.text, (
+ "not used parameters should not be included"
+ )
+ assert '"syntaxHighlight": {"theme": "obsidian"}' in response.text, (
+ "parameters with middle dots should be included in a JSON compatible way"
+ )
+ assert '"dom_id": "#swagger-ui"' in response.text, (
+ "default configs should be preserved"
+ )
assert "presets: [" in response.text, "default configs should be preserved"
- assert (
- "SwaggerUIBundle.presets.apis," in response.text
- ), "default configs should be preserved"
- assert (
- "SwaggerUIBundle.SwaggerUIStandalonePreset" in response.text
- ), "default configs should be preserved"
- assert (
- '"layout": "BaseLayout",' in response.text
- ), "default configs should be preserved"
- assert (
- '"deepLinking": true,' in response.text
- ), "default configs should be preserved"
- assert (
- '"showExtensions": true,' in response.text
- ), "default configs should be preserved"
- assert (
- '"showCommonExtensions": true,' in response.text
- ), "default configs should be preserved"
+ assert "SwaggerUIBundle.presets.apis," in response.text, (
+ "default configs should be preserved"
+ )
+ assert "SwaggerUIBundle.SwaggerUIStandalonePreset" in response.text, (
+ "default configs should be preserved"
+ )
+ assert '"layout": "BaseLayout",' in response.text, (
+ "default configs should be preserved"
+ )
+ assert '"deepLinking": true,' in response.text, (
+ "default configs should be preserved"
+ )
+ assert '"showExtensions": true,' in response.text, (
+ "default configs should be preserved"
+ )
+ assert '"showCommonExtensions": true,' in response.text, (
+ "default configs should be preserved"
+ )
def test_get_users():
diff --git a/tests/test_tutorial/test_configure_swagger_ui/test_tutorial003.py b/tests/test_tutorial/test_configure_swagger_ui/test_tutorial003.py
index 187e89ace..926bbb14f 100644
--- a/tests/test_tutorial/test_configure_swagger_ui/test_tutorial003.py
+++ b/tests/test_tutorial/test_configure_swagger_ui/test_tutorial003.py
@@ -8,34 +8,34 @@ client = TestClient(app)
def test_swagger_ui():
response = client.get("/docs")
assert response.status_code == 200, response.text
- assert (
- '"deepLinking": false,' in response.text
- ), "overridden configs should be preserved"
- assert (
- '"deepLinking": true' not in response.text
- ), "overridden configs should not include the old value"
- assert (
- '"syntaxHighlight": false' not in response.text
- ), "not used parameters should not be included"
- assert (
- '"dom_id": "#swagger-ui"' in response.text
- ), "default configs should be preserved"
+ assert '"deepLinking": false,' in response.text, (
+ "overridden configs should be preserved"
+ )
+ assert '"deepLinking": true' not in response.text, (
+ "overridden configs should not include the old value"
+ )
+ assert '"syntaxHighlight": false' not in response.text, (
+ "not used parameters should not be included"
+ )
+ assert '"dom_id": "#swagger-ui"' in response.text, (
+ "default configs should be preserved"
+ )
assert "presets: [" in response.text, "default configs should be preserved"
- assert (
- "SwaggerUIBundle.presets.apis," in response.text
- ), "default configs should be preserved"
- assert (
- "SwaggerUIBundle.SwaggerUIStandalonePreset" in response.text
- ), "default configs should be preserved"
- assert (
- '"layout": "BaseLayout",' in response.text
- ), "default configs should be preserved"
- assert (
- '"showExtensions": true,' in response.text
- ), "default configs should be preserved"
- assert (
- '"showCommonExtensions": true,' in response.text
- ), "default configs should be preserved"
+ assert "SwaggerUIBundle.presets.apis," in response.text, (
+ "default configs should be preserved"
+ )
+ assert "SwaggerUIBundle.SwaggerUIStandalonePreset" in response.text, (
+ "default configs should be preserved"
+ )
+ assert '"layout": "BaseLayout",' in response.text, (
+ "default configs should be preserved"
+ )
+ assert '"showExtensions": true,' in response.text, (
+ "default configs should be preserved"
+ )
+ assert '"showCommonExtensions": true,' in response.text, (
+ "default configs should be preserved"
+ )
def test_get_users():
diff --git a/tests/test_tutorial/test_cookie_param_models/test_tutorial002.py b/tests/test_tutorial/test_cookie_param_models/test_tutorial002.py
index 30adadc8a..cef6f6630 100644
--- a/tests/test_tutorial/test_cookie_param_models/test_tutorial002.py
+++ b/tests/test_tutorial/test_cookie_param_models/test_tutorial002.py
@@ -5,7 +5,13 @@ from dirty_equals import IsDict
from fastapi.testclient import TestClient
from inline_snapshot import snapshot
-from tests.utils import needs_py39, needs_py310, needs_pydanticv1, needs_pydanticv2
+from tests.utils import (
+ needs_py39,
+ needs_py310,
+ needs_pydanticv1,
+ needs_pydanticv2,
+ pydantic_snapshot,
+)
@pytest.fixture(
@@ -59,8 +65,8 @@ def test_cookie_param_model_defaults(client: TestClient):
def test_cookie_param_model_invalid(client: TestClient):
response = client.get("/items/")
assert response.status_code == 422
- assert response.json() == snapshot(
- IsDict(
+ assert response.json() == pydantic_snapshot(
+ v2=snapshot(
{
"detail": [
{
@@ -71,9 +77,8 @@ def test_cookie_param_model_invalid(client: TestClient):
}
]
}
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
+ ),
+ v1=snapshot(
{
"detail": [
{
@@ -83,7 +88,7 @@ def test_cookie_param_model_invalid(client: TestClient):
}
]
}
- )
+ ),
)
@@ -144,18 +149,23 @@ def test_openapi_schema(client: TestClient):
"name": "fatebook_tracker",
"in": "cookie",
"required": False,
- "schema": IsDict(
- {
- "anyOf": [{"type": "string"}, {"type": "null"}],
- "title": "Fatebook Tracker",
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "type": "string",
- "title": "Fatebook Tracker",
- }
+ "schema": pydantic_snapshot(
+ v2=snapshot(
+ {
+ "anyOf": [
+ {"type": "string"},
+ {"type": "null"},
+ ],
+ "title": "Fatebook Tracker",
+ }
+ ),
+ v1=snapshot(
+ # TODO: remove when deprecating Pydantic v1
+ {
+ "type": "string",
+ "title": "Fatebook Tracker",
+ }
+ ),
),
},
{
diff --git a/tests/test_tutorial/test_custom_docs_ui/test_tutorial001.py b/tests/test_tutorial/test_custom_docs_ui/test_tutorial001.py
index aff070d74..cb8e8c224 100644
--- a/tests/test_tutorial/test_custom_docs_ui/test_tutorial001.py
+++ b/tests/test_tutorial/test_custom_docs_ui/test_tutorial001.py
@@ -33,7 +33,7 @@ def test_swagger_ui_oauth2_redirect_html(client: TestClient):
def test_redoc_html(client: TestClient):
response = client.get("/redoc")
assert response.status_code == 200, response.text
- assert "https://unpkg.com/redoc@next/bundles/redoc.standalone.js" in response.text
+ assert "https://unpkg.com/redoc@2/bundles/redoc.standalone.js" in response.text
def test_api(client: TestClient):
diff --git a/tests/test_tutorial/test_custom_request_and_route/test_tutorial002.py b/tests/test_tutorial/test_custom_request_and_route/test_tutorial002.py
index 6f7355aaa..647f1c5dd 100644
--- a/tests/test_tutorial/test_custom_request_and_route/test_tutorial002.py
+++ b/tests/test_tutorial/test_custom_request_and_route/test_tutorial002.py
@@ -1,4 +1,4 @@
-from dirty_equals import IsDict
+from dirty_equals import IsDict, IsOneOf
from fastapi.testclient import TestClient
from docs_src.custom_request_and_route.tutorial002 import app
@@ -24,14 +24,16 @@ def test_exception_handler_body_access():
"input": {"numbers": [1, 2, 3]},
}
],
- "body": '{"numbers": [1, 2, 3]}',
+ # httpx 0.28.0 switches to compact JSON https://github.com/encode/httpx/issues/3363
+ "body": IsOneOf('{"numbers": [1, 2, 3]}', '{"numbers":[1,2,3]}'),
}
}
) | IsDict(
# TODO: remove when deprecating Pydantic v1
{
"detail": {
- "body": '{"numbers": [1, 2, 3]}',
+ # httpx 0.28.0 switches to compact JSON https://github.com/encode/httpx/issues/3363
+ "body": IsOneOf('{"numbers": [1, 2, 3]}', '{"numbers":[1,2,3]}'),
"errors": [
{
"loc": ["body"],
diff --git a/tests/test_tutorial/test_header_param_models/test_tutorial001.py b/tests/test_tutorial/test_header_param_models/test_tutorial001.py
index 06b2404cf..bc876897b 100644
--- a/tests/test_tutorial/test_header_param_models/test_tutorial001.py
+++ b/tests/test_tutorial/test_header_param_models/test_tutorial001.py
@@ -129,13 +129,13 @@ def test_openapi_schema(client: TestClient):
"schema": {"type": "string", "title": "Host"},
},
{
- "name": "save_data",
+ "name": "save-data",
"in": "header",
"required": True,
"schema": {"type": "boolean", "title": "Save Data"},
},
{
- "name": "if_modified_since",
+ "name": "if-modified-since",
"in": "header",
"required": False,
"schema": IsDict(
@@ -171,7 +171,7 @@ def test_openapi_schema(client: TestClient):
),
},
{
- "name": "x_tag",
+ "name": "x-tag",
"in": "header",
"required": False,
"schema": {
diff --git a/tests/test_tutorial/test_header_param_models/test_tutorial002.py b/tests/test_tutorial/test_header_param_models/test_tutorial002.py
index e07655a0c..0615521c4 100644
--- a/tests/test_tutorial/test_header_param_models/test_tutorial002.py
+++ b/tests/test_tutorial/test_header_param_models/test_tutorial002.py
@@ -140,13 +140,13 @@ def test_openapi_schema(client: TestClient):
"schema": {"type": "string", "title": "Host"},
},
{
- "name": "save_data",
+ "name": "save-data",
"in": "header",
"required": True,
"schema": {"type": "boolean", "title": "Save Data"},
},
{
- "name": "if_modified_since",
+ "name": "if-modified-since",
"in": "header",
"required": False,
"schema": IsDict(
@@ -182,7 +182,7 @@ def test_openapi_schema(client: TestClient):
),
},
{
- "name": "x_tag",
+ "name": "x-tag",
"in": "header",
"required": False,
"schema": {
diff --git a/tests/test_tutorial/test_header_param_models/test_tutorial003.py b/tests/test_tutorial/test_header_param_models/test_tutorial003.py
new file mode 100644
index 000000000..60940e1da
--- /dev/null
+++ b/tests/test_tutorial/test_header_param_models/test_tutorial003.py
@@ -0,0 +1,285 @@
+import importlib
+
+import pytest
+from dirty_equals import IsDict
+from fastapi.testclient import TestClient
+from inline_snapshot import snapshot
+
+from tests.utils import needs_py39, needs_py310
+
+
+@pytest.fixture(
+ name="client",
+ params=[
+ "tutorial003",
+ pytest.param("tutorial003_py39", marks=needs_py39),
+ pytest.param("tutorial003_py310", marks=needs_py310),
+ "tutorial003_an",
+ pytest.param("tutorial003_an_py39", marks=needs_py39),
+ pytest.param("tutorial003_an_py310", marks=needs_py310),
+ ],
+)
+def get_client(request: pytest.FixtureRequest):
+ mod = importlib.import_module(f"docs_src.header_param_models.{request.param}")
+
+ client = TestClient(mod.app)
+ return client
+
+
+def test_header_param_model(client: TestClient):
+ response = client.get(
+ "/items/",
+ headers=[
+ ("save_data", "true"),
+ ("if_modified_since", "yesterday"),
+ ("traceparent", "123"),
+ ("x_tag", "one"),
+ ("x_tag", "two"),
+ ],
+ )
+ assert response.status_code == 200
+ assert response.json() == {
+ "host": "testserver",
+ "save_data": True,
+ "if_modified_since": "yesterday",
+ "traceparent": "123",
+ "x_tag": ["one", "two"],
+ }
+
+
+def test_header_param_model_no_underscore(client: TestClient):
+ response = client.get(
+ "/items/",
+ headers=[
+ ("save-data", "true"),
+ ("if-modified-since", "yesterday"),
+ ("traceparent", "123"),
+ ("x-tag", "one"),
+ ("x-tag", "two"),
+ ],
+ )
+ assert response.status_code == 422
+ assert response.json() == snapshot(
+ {
+ "detail": [
+ IsDict(
+ {
+ "type": "missing",
+ "loc": ["header", "save_data"],
+ "msg": "Field required",
+ "input": {
+ "host": "testserver",
+ "traceparent": "123",
+ "x_tag": [],
+ "accept": "*/*",
+ "accept-encoding": "gzip, deflate",
+ "connection": "keep-alive",
+ "user-agent": "testclient",
+ "save-data": "true",
+ "if-modified-since": "yesterday",
+ "x-tag": "two",
+ },
+ }
+ )
+ | IsDict(
+ # TODO: remove when deprecating Pydantic v1
+ {
+ "type": "value_error.missing",
+ "loc": ["header", "save_data"],
+ "msg": "field required",
+ }
+ )
+ ]
+ }
+ )
+
+
+def test_header_param_model_defaults(client: TestClient):
+ response = client.get("/items/", headers=[("save_data", "true")])
+ assert response.status_code == 200
+ assert response.json() == {
+ "host": "testserver",
+ "save_data": True,
+ "if_modified_since": None,
+ "traceparent": None,
+ "x_tag": [],
+ }
+
+
+def test_header_param_model_invalid(client: TestClient):
+ response = client.get("/items/")
+ assert response.status_code == 422
+ assert response.json() == snapshot(
+ {
+ "detail": [
+ IsDict(
+ {
+ "type": "missing",
+ "loc": ["header", "save_data"],
+ "msg": "Field required",
+ "input": {
+ "x_tag": [],
+ "host": "testserver",
+ "accept": "*/*",
+ "accept-encoding": "gzip, deflate",
+ "connection": "keep-alive",
+ "user-agent": "testclient",
+ },
+ }
+ )
+ | IsDict(
+ # TODO: remove when deprecating Pydantic v1
+ {
+ "type": "value_error.missing",
+ "loc": ["header", "save_data"],
+ "msg": "field required",
+ }
+ )
+ ]
+ }
+ )
+
+
+def test_header_param_model_extra(client: TestClient):
+ response = client.get(
+ "/items/", headers=[("save_data", "true"), ("tool", "plumbus")]
+ )
+ assert response.status_code == 200, response.text
+ assert response.json() == snapshot(
+ {
+ "host": "testserver",
+ "save_data": True,
+ "if_modified_since": None,
+ "traceparent": None,
+ "x_tag": [],
+ }
+ )
+
+
+def test_openapi_schema(client: TestClient):
+ response = client.get("/openapi.json")
+ assert response.status_code == 200, response.text
+ assert response.json() == snapshot(
+ {
+ "openapi": "3.1.0",
+ "info": {"title": "FastAPI", "version": "0.1.0"},
+ "paths": {
+ "/items/": {
+ "get": {
+ "summary": "Read Items",
+ "operationId": "read_items_items__get",
+ "parameters": [
+ {
+ "name": "host",
+ "in": "header",
+ "required": True,
+ "schema": {"type": "string", "title": "Host"},
+ },
+ {
+ "name": "save_data",
+ "in": "header",
+ "required": True,
+ "schema": {"type": "boolean", "title": "Save Data"},
+ },
+ {
+ "name": "if_modified_since",
+ "in": "header",
+ "required": False,
+ "schema": IsDict(
+ {
+ "anyOf": [{"type": "string"}, {"type": "null"}],
+ "title": "If Modified Since",
+ }
+ )
+ | IsDict(
+ # TODO: remove when deprecating Pydantic v1
+ {
+ "type": "string",
+ "title": "If Modified Since",
+ }
+ ),
+ },
+ {
+ "name": "traceparent",
+ "in": "header",
+ "required": False,
+ "schema": IsDict(
+ {
+ "anyOf": [{"type": "string"}, {"type": "null"}],
+ "title": "Traceparent",
+ }
+ )
+ | IsDict(
+ # TODO: remove when deprecating Pydantic v1
+ {
+ "type": "string",
+ "title": "Traceparent",
+ }
+ ),
+ },
+ {
+ "name": "x_tag",
+ "in": "header",
+ "required": False,
+ "schema": {
+ "type": "array",
+ "items": {"type": "string"},
+ "default": [],
+ "title": "X Tag",
+ },
+ },
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {"application/json": {"schema": {}}},
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ },
+ },
+ },
+ }
+ }
+ },
+ "components": {
+ "schemas": {
+ "HTTPValidationError": {
+ "properties": {
+ "detail": {
+ "items": {
+ "$ref": "#/components/schemas/ValidationError"
+ },
+ "type": "array",
+ "title": "Detail",
+ }
+ },
+ "type": "object",
+ "title": "HTTPValidationError",
+ },
+ "ValidationError": {
+ "properties": {
+ "loc": {
+ "items": {
+ "anyOf": [{"type": "string"}, {"type": "integer"}]
+ },
+ "type": "array",
+ "title": "Location",
+ },
+ "msg": {"type": "string", "title": "Message"},
+ "type": {"type": "string", "title": "Error Type"},
+ },
+ "type": "object",
+ "required": ["loc", "msg", "type"],
+ "title": "ValidationError",
+ },
+ }
+ },
+ }
+ )
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial010.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial010.py
index 4f52d6ff7..e08e16963 100644
--- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial010.py
+++ b/tests/test_tutorial/test_query_params_str_validations/test_tutorial010.py
@@ -1,14 +1,29 @@
+import importlib
+
import pytest
from dirty_equals import IsDict
from fastapi._compat import PYDANTIC_VERSION_MINOR_TUPLE
from fastapi.testclient import TestClient
+from ...utils import needs_py39, needs_py310
+
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.query_params_str_validations.tutorial010 import app
+@pytest.fixture(
+ name="client",
+ params=[
+ "tutorial010",
+ pytest.param("tutorial010_py310", marks=needs_py310),
+ "tutorial010_an",
+ pytest.param("tutorial010_an_py39", marks=needs_py39),
+ pytest.param("tutorial010_an_py310", marks=needs_py310),
+ ],
+)
+def get_client(request: pytest.FixtureRequest):
+ mod = importlib.import_module(
+ f"docs_src.query_params_str_validations.{request.param}"
+ )
- client = TestClient(app)
+ client = TestClient(mod.app)
return client
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial010_an.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial010_an.py
deleted file mode 100644
index 5daca1e70..000000000
--- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial010_an.py
+++ /dev/null
@@ -1,168 +0,0 @@
-import pytest
-from dirty_equals import IsDict
-from fastapi._compat import PYDANTIC_VERSION_MINOR_TUPLE
-from fastapi.testclient import TestClient
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.query_params_str_validations.tutorial010_an import app
-
- client = TestClient(app)
- return client
-
-
-def test_query_params_str_validations_no_query(client: TestClient):
- response = client.get("/items/")
- assert response.status_code == 200
- assert response.json() == {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
-
-
-def test_query_params_str_validations_item_query_fixedquery(client: TestClient):
- response = client.get("/items/", params={"item-query": "fixedquery"})
- assert response.status_code == 200
- assert response.json() == {
- "items": [{"item_id": "Foo"}, {"item_id": "Bar"}],
- "q": "fixedquery",
- }
-
-
-def test_query_params_str_validations_q_fixedquery(client: TestClient):
- response = client.get("/items/", params={"q": "fixedquery"})
- assert response.status_code == 200
- assert response.json() == {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
-
-
-def test_query_params_str_validations_item_query_nonregexquery(client: TestClient):
- response = client.get("/items/", params={"item-query": "nonregexquery"})
- assert response.status_code == 422
- assert response.json() == IsDict(
- {
- "detail": [
- {
- "type": "string_pattern_mismatch",
- "loc": ["query", "item-query"],
- "msg": "String should match pattern '^fixedquery$'",
- "input": "nonregexquery",
- "ctx": {"pattern": "^fixedquery$"},
- }
- ]
- }
- ) | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "detail": [
- {
- "ctx": {"pattern": "^fixedquery$"},
- "loc": ["query", "item-query"],
- "msg": 'string does not match regex "^fixedquery$"',
- "type": "value_error.str.regex",
- }
- ]
- }
- )
-
-
-def test_openapi_schema(client: TestClient):
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/items/": {
- "get": {
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- "summary": "Read Items",
- "operationId": "read_items_items__get",
- "parameters": [
- {
- "description": "Query string for the items to search in the database that have a good match",
- "required": False,
- "deprecated": True,
- "schema": IsDict(
- {
- "anyOf": [
- {
- "type": "string",
- "minLength": 3,
- "maxLength": 50,
- "pattern": "^fixedquery$",
- },
- {"type": "null"},
- ],
- "title": "Query string",
- "description": "Query string for the items to search in the database that have a good match",
- # See https://github.com/pydantic/pydantic/blob/80353c29a824c55dea4667b328ba8f329879ac9f/tests/test_fastapi.sh#L25-L34.
- **(
- {"deprecated": True}
- if PYDANTIC_VERSION_MINOR_TUPLE >= (2, 10)
- else {}
- ),
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "title": "Query string",
- "maxLength": 50,
- "minLength": 3,
- "pattern": "^fixedquery$",
- "type": "string",
- "description": "Query string for the items to search in the database that have a good match",
- }
- ),
- "name": "item-query",
- "in": "query",
- }
- ],
- }
- }
- },
- "components": {
- "schemas": {
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial010_an_py310.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial010_an_py310.py
deleted file mode 100644
index 89da4d82e..000000000
--- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial010_an_py310.py
+++ /dev/null
@@ -1,175 +0,0 @@
-import pytest
-from dirty_equals import IsDict
-from fastapi._compat import PYDANTIC_VERSION_MINOR_TUPLE
-from fastapi.testclient import TestClient
-
-from ...utils import needs_py310
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.query_params_str_validations.tutorial010_an_py310 import app
-
- client = TestClient(app)
- return client
-
-
-@needs_py310
-def test_query_params_str_validations_no_query(client: TestClient):
- response = client.get("/items/")
- assert response.status_code == 200
- assert response.json() == {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
-
-
-@needs_py310
-def test_query_params_str_validations_item_query_fixedquery(client: TestClient):
- response = client.get("/items/", params={"item-query": "fixedquery"})
- assert response.status_code == 200
- assert response.json() == {
- "items": [{"item_id": "Foo"}, {"item_id": "Bar"}],
- "q": "fixedquery",
- }
-
-
-@needs_py310
-def test_query_params_str_validations_q_fixedquery(client: TestClient):
- response = client.get("/items/", params={"q": "fixedquery"})
- assert response.status_code == 200
- assert response.json() == {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
-
-
-@needs_py310
-def test_query_params_str_validations_item_query_nonregexquery(client: TestClient):
- response = client.get("/items/", params={"item-query": "nonregexquery"})
- assert response.status_code == 422
- assert response.json() == IsDict(
- {
- "detail": [
- {
- "type": "string_pattern_mismatch",
- "loc": ["query", "item-query"],
- "msg": "String should match pattern '^fixedquery$'",
- "input": "nonregexquery",
- "ctx": {"pattern": "^fixedquery$"},
- }
- ]
- }
- ) | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "detail": [
- {
- "ctx": {"pattern": "^fixedquery$"},
- "loc": ["query", "item-query"],
- "msg": 'string does not match regex "^fixedquery$"',
- "type": "value_error.str.regex",
- }
- ]
- }
- )
-
-
-@needs_py310
-def test_openapi_schema(client: TestClient):
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/items/": {
- "get": {
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- "summary": "Read Items",
- "operationId": "read_items_items__get",
- "parameters": [
- {
- "description": "Query string for the items to search in the database that have a good match",
- "required": False,
- "deprecated": True,
- "schema": IsDict(
- {
- "anyOf": [
- {
- "type": "string",
- "minLength": 3,
- "maxLength": 50,
- "pattern": "^fixedquery$",
- },
- {"type": "null"},
- ],
- "title": "Query string",
- "description": "Query string for the items to search in the database that have a good match",
- # See https://github.com/pydantic/pydantic/blob/80353c29a824c55dea4667b328ba8f329879ac9f/tests/test_fastapi.sh#L25-L34.
- **(
- {"deprecated": True}
- if PYDANTIC_VERSION_MINOR_TUPLE >= (2, 10)
- else {}
- ),
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "title": "Query string",
- "maxLength": 50,
- "minLength": 3,
- "pattern": "^fixedquery$",
- "type": "string",
- "description": "Query string for the items to search in the database that have a good match",
- }
- ),
- "name": "item-query",
- "in": "query",
- }
- ],
- }
- }
- },
- "components": {
- "schemas": {
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial010_an_py39.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial010_an_py39.py
deleted file mode 100644
index f5f692b06..000000000
--- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial010_an_py39.py
+++ /dev/null
@@ -1,175 +0,0 @@
-import pytest
-from dirty_equals import IsDict
-from fastapi._compat import PYDANTIC_VERSION_MINOR_TUPLE
-from fastapi.testclient import TestClient
-
-from ...utils import needs_py39
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.query_params_str_validations.tutorial010_an_py39 import app
-
- client = TestClient(app)
- return client
-
-
-@needs_py39
-def test_query_params_str_validations_no_query(client: TestClient):
- response = client.get("/items/")
- assert response.status_code == 200
- assert response.json() == {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
-
-
-@needs_py39
-def test_query_params_str_validations_item_query_fixedquery(client: TestClient):
- response = client.get("/items/", params={"item-query": "fixedquery"})
- assert response.status_code == 200
- assert response.json() == {
- "items": [{"item_id": "Foo"}, {"item_id": "Bar"}],
- "q": "fixedquery",
- }
-
-
-@needs_py39
-def test_query_params_str_validations_q_fixedquery(client: TestClient):
- response = client.get("/items/", params={"q": "fixedquery"})
- assert response.status_code == 200
- assert response.json() == {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
-
-
-@needs_py39
-def test_query_params_str_validations_item_query_nonregexquery(client: TestClient):
- response = client.get("/items/", params={"item-query": "nonregexquery"})
- assert response.status_code == 422
- assert response.json() == IsDict(
- {
- "detail": [
- {
- "type": "string_pattern_mismatch",
- "loc": ["query", "item-query"],
- "msg": "String should match pattern '^fixedquery$'",
- "input": "nonregexquery",
- "ctx": {"pattern": "^fixedquery$"},
- }
- ]
- }
- ) | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "detail": [
- {
- "ctx": {"pattern": "^fixedquery$"},
- "loc": ["query", "item-query"],
- "msg": 'string does not match regex "^fixedquery$"',
- "type": "value_error.str.regex",
- }
- ]
- }
- )
-
-
-@needs_py39
-def test_openapi_schema(client: TestClient):
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/items/": {
- "get": {
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- "summary": "Read Items",
- "operationId": "read_items_items__get",
- "parameters": [
- {
- "description": "Query string for the items to search in the database that have a good match",
- "required": False,
- "deprecated": True,
- "schema": IsDict(
- {
- "anyOf": [
- {
- "type": "string",
- "minLength": 3,
- "maxLength": 50,
- "pattern": "^fixedquery$",
- },
- {"type": "null"},
- ],
- "title": "Query string",
- "description": "Query string for the items to search in the database that have a good match",
- # See https://github.com/pydantic/pydantic/blob/80353c29a824c55dea4667b328ba8f329879ac9f/tests/test_fastapi.sh#L25-L34.
- **(
- {"deprecated": True}
- if PYDANTIC_VERSION_MINOR_TUPLE >= (2, 10)
- else {}
- ),
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "title": "Query string",
- "maxLength": 50,
- "minLength": 3,
- "pattern": "^fixedquery$",
- "type": "string",
- "description": "Query string for the items to search in the database that have a good match",
- }
- ),
- "name": "item-query",
- "in": "query",
- }
- ],
- }
- }
- },
- "components": {
- "schemas": {
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial010_py310.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial010_py310.py
deleted file mode 100644
index 5b62c969f..000000000
--- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial010_py310.py
+++ /dev/null
@@ -1,175 +0,0 @@
-import pytest
-from dirty_equals import IsDict
-from fastapi._compat import PYDANTIC_VERSION_MINOR_TUPLE
-from fastapi.testclient import TestClient
-
-from ...utils import needs_py310
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.query_params_str_validations.tutorial010_py310 import app
-
- client = TestClient(app)
- return client
-
-
-@needs_py310
-def test_query_params_str_validations_no_query(client: TestClient):
- response = client.get("/items/")
- assert response.status_code == 200
- assert response.json() == {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
-
-
-@needs_py310
-def test_query_params_str_validations_item_query_fixedquery(client: TestClient):
- response = client.get("/items/", params={"item-query": "fixedquery"})
- assert response.status_code == 200
- assert response.json() == {
- "items": [{"item_id": "Foo"}, {"item_id": "Bar"}],
- "q": "fixedquery",
- }
-
-
-@needs_py310
-def test_query_params_str_validations_q_fixedquery(client: TestClient):
- response = client.get("/items/", params={"q": "fixedquery"})
- assert response.status_code == 200
- assert response.json() == {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
-
-
-@needs_py310
-def test_query_params_str_validations_item_query_nonregexquery(client: TestClient):
- response = client.get("/items/", params={"item-query": "nonregexquery"})
- assert response.status_code == 422
- assert response.json() == IsDict(
- {
- "detail": [
- {
- "type": "string_pattern_mismatch",
- "loc": ["query", "item-query"],
- "msg": "String should match pattern '^fixedquery$'",
- "input": "nonregexquery",
- "ctx": {"pattern": "^fixedquery$"},
- }
- ]
- }
- ) | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "detail": [
- {
- "ctx": {"pattern": "^fixedquery$"},
- "loc": ["query", "item-query"],
- "msg": 'string does not match regex "^fixedquery$"',
- "type": "value_error.str.regex",
- }
- ]
- }
- )
-
-
-@needs_py310
-def test_openapi_schema(client: TestClient):
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/items/": {
- "get": {
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- "summary": "Read Items",
- "operationId": "read_items_items__get",
- "parameters": [
- {
- "description": "Query string for the items to search in the database that have a good match",
- "required": False,
- "deprecated": True,
- "schema": IsDict(
- {
- "anyOf": [
- {
- "type": "string",
- "minLength": 3,
- "maxLength": 50,
- "pattern": "^fixedquery$",
- },
- {"type": "null"},
- ],
- "title": "Query string",
- "description": "Query string for the items to search in the database that have a good match",
- # See https://github.com/pydantic/pydantic/blob/80353c29a824c55dea4667b328ba8f329879ac9f/tests/test_fastapi.sh#L25-L34.
- **(
- {"deprecated": True}
- if PYDANTIC_VERSION_MINOR_TUPLE >= (2, 10)
- else {}
- ),
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "title": "Query string",
- "maxLength": 50,
- "minLength": 3,
- "pattern": "^fixedquery$",
- "type": "string",
- "description": "Query string for the items to search in the database that have a good match",
- }
- ),
- "name": "item-query",
- "in": "query",
- }
- ],
- }
- }
- },
- "components": {
- "schemas": {
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial011.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial011.py
index 5ba39b05d..f4da25752 100644
--- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial011.py
+++ b/tests/test_tutorial/test_query_params_str_validations/test_tutorial011.py
@@ -1,26 +1,47 @@
+import importlib
+
+import pytest
from dirty_equals import IsDict
from fastapi.testclient import TestClient
-from docs_src.query_params_str_validations.tutorial011 import app
+from ...utils import needs_py39, needs_py310
+
+
+@pytest.fixture(
+ name="client",
+ params=[
+ "tutorial011",
+ pytest.param("tutorial011_py39", marks=needs_py310),
+ pytest.param("tutorial011_py310", marks=needs_py310),
+ "tutorial011_an",
+ pytest.param("tutorial011_an_py39", marks=needs_py39),
+ pytest.param("tutorial011_an_py310", marks=needs_py310),
+ ],
+)
+def get_client(request: pytest.FixtureRequest):
+ mod = importlib.import_module(
+ f"docs_src.query_params_str_validations.{request.param}"
+ )
-client = TestClient(app)
+ client = TestClient(mod.app)
+ return client
-def test_multi_query_values():
+def test_multi_query_values(client: TestClient):
url = "/items/?q=foo&q=bar"
response = client.get(url)
assert response.status_code == 200, response.text
assert response.json() == {"q": ["foo", "bar"]}
-def test_query_no_values():
+def test_query_no_values(client: TestClient):
url = "/items/"
response = client.get(url)
assert response.status_code == 200, response.text
assert response.json() == {"q": None}
-def test_openapi_schema():
+def test_openapi_schema(client: TestClient):
response = client.get("/openapi.json")
assert response.status_code == 200, response.text
assert response.json() == {
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial011_an.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial011_an.py
deleted file mode 100644
index 3942ea77a..000000000
--- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial011_an.py
+++ /dev/null
@@ -1,108 +0,0 @@
-from dirty_equals import IsDict
-from fastapi.testclient import TestClient
-
-from docs_src.query_params_str_validations.tutorial011_an import app
-
-client = TestClient(app)
-
-
-def test_multi_query_values():
- url = "/items/?q=foo&q=bar"
- response = client.get(url)
- assert response.status_code == 200, response.text
- assert response.json() == {"q": ["foo", "bar"]}
-
-
-def test_query_no_values():
- url = "/items/"
- response = client.get(url)
- assert response.status_code == 200, response.text
- assert response.json() == {"q": None}
-
-
-def test_openapi_schema():
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/items/": {
- "get": {
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- "summary": "Read Items",
- "operationId": "read_items_items__get",
- "parameters": [
- {
- "required": False,
- "schema": IsDict(
- {
- "anyOf": [
- {"type": "array", "items": {"type": "string"}},
- {"type": "null"},
- ],
- "title": "Q",
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "title": "Q",
- "type": "array",
- "items": {"type": "string"},
- }
- ),
- "name": "q",
- "in": "query",
- }
- ],
- }
- }
- },
- "components": {
- "schemas": {
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial011_an_py310.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial011_an_py310.py
deleted file mode 100644
index f2ec38c95..000000000
--- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial011_an_py310.py
+++ /dev/null
@@ -1,118 +0,0 @@
-import pytest
-from dirty_equals import IsDict
-from fastapi.testclient import TestClient
-
-from ...utils import needs_py310
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.query_params_str_validations.tutorial011_an_py310 import app
-
- client = TestClient(app)
- return client
-
-
-@needs_py310
-def test_multi_query_values(client: TestClient):
- url = "/items/?q=foo&q=bar"
- response = client.get(url)
- assert response.status_code == 200, response.text
- assert response.json() == {"q": ["foo", "bar"]}
-
-
-@needs_py310
-def test_query_no_values(client: TestClient):
- url = "/items/"
- response = client.get(url)
- assert response.status_code == 200, response.text
- assert response.json() == {"q": None}
-
-
-@needs_py310
-def test_openapi_schema(client: TestClient):
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/items/": {
- "get": {
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- "summary": "Read Items",
- "operationId": "read_items_items__get",
- "parameters": [
- {
- "required": False,
- "schema": IsDict(
- {
- "anyOf": [
- {"type": "array", "items": {"type": "string"}},
- {"type": "null"},
- ],
- "title": "Q",
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "title": "Q",
- "type": "array",
- "items": {"type": "string"},
- }
- ),
- "name": "q",
- "in": "query",
- }
- ],
- }
- }
- },
- "components": {
- "schemas": {
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial011_an_py39.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial011_an_py39.py
deleted file mode 100644
index cd7b15679..000000000
--- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial011_an_py39.py
+++ /dev/null
@@ -1,118 +0,0 @@
-import pytest
-from dirty_equals import IsDict
-from fastapi.testclient import TestClient
-
-from ...utils import needs_py39
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.query_params_str_validations.tutorial011_an_py39 import app
-
- client = TestClient(app)
- return client
-
-
-@needs_py39
-def test_multi_query_values(client: TestClient):
- url = "/items/?q=foo&q=bar"
- response = client.get(url)
- assert response.status_code == 200, response.text
- assert response.json() == {"q": ["foo", "bar"]}
-
-
-@needs_py39
-def test_query_no_values(client: TestClient):
- url = "/items/"
- response = client.get(url)
- assert response.status_code == 200, response.text
- assert response.json() == {"q": None}
-
-
-@needs_py39
-def test_openapi_schema(client: TestClient):
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/items/": {
- "get": {
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- "summary": "Read Items",
- "operationId": "read_items_items__get",
- "parameters": [
- {
- "required": False,
- "schema": IsDict(
- {
- "anyOf": [
- {"type": "array", "items": {"type": "string"}},
- {"type": "null"},
- ],
- "title": "Q",
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "title": "Q",
- "type": "array",
- "items": {"type": "string"},
- }
- ),
- "name": "q",
- "in": "query",
- }
- ],
- }
- }
- },
- "components": {
- "schemas": {
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial011_py310.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial011_py310.py
deleted file mode 100644
index bdc729516..000000000
--- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial011_py310.py
+++ /dev/null
@@ -1,118 +0,0 @@
-import pytest
-from dirty_equals import IsDict
-from fastapi.testclient import TestClient
-
-from ...utils import needs_py310
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.query_params_str_validations.tutorial011_py310 import app
-
- client = TestClient(app)
- return client
-
-
-@needs_py310
-def test_multi_query_values(client: TestClient):
- url = "/items/?q=foo&q=bar"
- response = client.get(url)
- assert response.status_code == 200, response.text
- assert response.json() == {"q": ["foo", "bar"]}
-
-
-@needs_py310
-def test_query_no_values(client: TestClient):
- url = "/items/"
- response = client.get(url)
- assert response.status_code == 200, response.text
- assert response.json() == {"q": None}
-
-
-@needs_py310
-def test_openapi_schema(client: TestClient):
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/items/": {
- "get": {
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- "summary": "Read Items",
- "operationId": "read_items_items__get",
- "parameters": [
- {
- "required": False,
- "schema": IsDict(
- {
- "anyOf": [
- {"type": "array", "items": {"type": "string"}},
- {"type": "null"},
- ],
- "title": "Q",
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "title": "Q",
- "type": "array",
- "items": {"type": "string"},
- }
- ),
- "name": "q",
- "in": "query",
- }
- ],
- }
- }
- },
- "components": {
- "schemas": {
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial011_py39.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial011_py39.py
deleted file mode 100644
index 26ac56b2f..000000000
--- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial011_py39.py
+++ /dev/null
@@ -1,118 +0,0 @@
-import pytest
-from dirty_equals import IsDict
-from fastapi.testclient import TestClient
-
-from ...utils import needs_py39
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.query_params_str_validations.tutorial011_py39 import app
-
- client = TestClient(app)
- return client
-
-
-@needs_py39
-def test_multi_query_values(client: TestClient):
- url = "/items/?q=foo&q=bar"
- response = client.get(url)
- assert response.status_code == 200, response.text
- assert response.json() == {"q": ["foo", "bar"]}
-
-
-@needs_py39
-def test_query_no_values(client: TestClient):
- url = "/items/"
- response = client.get(url)
- assert response.status_code == 200, response.text
- assert response.json() == {"q": None}
-
-
-@needs_py39
-def test_openapi_schema(client: TestClient):
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/items/": {
- "get": {
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- "summary": "Read Items",
- "operationId": "read_items_items__get",
- "parameters": [
- {
- "required": False,
- "schema": IsDict(
- {
- "anyOf": [
- {"type": "array", "items": {"type": "string"}},
- {"type": "null"},
- ],
- "title": "Q",
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "title": "Q",
- "type": "array",
- "items": {"type": "string"},
- }
- ),
- "name": "q",
- "in": "query",
- }
- ],
- }
- }
- },
- "components": {
- "schemas": {
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial012.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial012.py
index 1436db384..549a90519 100644
--- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial012.py
+++ b/tests/test_tutorial/test_query_params_str_validations/test_tutorial012.py
@@ -1,25 +1,44 @@
+import importlib
+
+import pytest
from fastapi.testclient import TestClient
-from docs_src.query_params_str_validations.tutorial012 import app
+from ...utils import needs_py39
+
+
+@pytest.fixture(
+ name="client",
+ params=[
+ "tutorial012",
+ pytest.param("tutorial012_py39", marks=needs_py39),
+ "tutorial012_an",
+ pytest.param("tutorial012_an_py39", marks=needs_py39),
+ ],
+)
+def get_client(request: pytest.FixtureRequest):
+ mod = importlib.import_module(
+ f"docs_src.query_params_str_validations.{request.param}"
+ )
-client = TestClient(app)
+ client = TestClient(mod.app)
+ return client
-def test_default_query_values():
+def test_default_query_values(client: TestClient):
url = "/items/"
response = client.get(url)
assert response.status_code == 200, response.text
assert response.json() == {"q": ["foo", "bar"]}
-def test_multi_query_values():
+def test_multi_query_values(client: TestClient):
url = "/items/?q=baz&q=foobar"
response = client.get(url)
assert response.status_code == 200, response.text
assert response.json() == {"q": ["baz", "foobar"]}
-def test_openapi_schema():
+def test_openapi_schema(client: TestClient):
response = client.get("/openapi.json")
assert response.status_code == 200, response.text
assert response.json() == {
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial012_an.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial012_an.py
deleted file mode 100644
index 270763f1d..000000000
--- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial012_an.py
+++ /dev/null
@@ -1,96 +0,0 @@
-from fastapi.testclient import TestClient
-
-from docs_src.query_params_str_validations.tutorial012_an import app
-
-client = TestClient(app)
-
-
-def test_default_query_values():
- url = "/items/"
- response = client.get(url)
- assert response.status_code == 200, response.text
- assert response.json() == {"q": ["foo", "bar"]}
-
-
-def test_multi_query_values():
- url = "/items/?q=baz&q=foobar"
- response = client.get(url)
- assert response.status_code == 200, response.text
- assert response.json() == {"q": ["baz", "foobar"]}
-
-
-def test_openapi_schema():
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/items/": {
- "get": {
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- "summary": "Read Items",
- "operationId": "read_items_items__get",
- "parameters": [
- {
- "required": False,
- "schema": {
- "title": "Q",
- "type": "array",
- "items": {"type": "string"},
- "default": ["foo", "bar"],
- },
- "name": "q",
- "in": "query",
- }
- ],
- }
- }
- },
- "components": {
- "schemas": {
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial012_an_py39.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial012_an_py39.py
deleted file mode 100644
index 548391683..000000000
--- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial012_an_py39.py
+++ /dev/null
@@ -1,106 +0,0 @@
-import pytest
-from fastapi.testclient import TestClient
-
-from ...utils import needs_py39
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.query_params_str_validations.tutorial012_an_py39 import app
-
- client = TestClient(app)
- return client
-
-
-@needs_py39
-def test_default_query_values(client: TestClient):
- url = "/items/"
- response = client.get(url)
- assert response.status_code == 200, response.text
- assert response.json() == {"q": ["foo", "bar"]}
-
-
-@needs_py39
-def test_multi_query_values(client: TestClient):
- url = "/items/?q=baz&q=foobar"
- response = client.get(url)
- assert response.status_code == 200, response.text
- assert response.json() == {"q": ["baz", "foobar"]}
-
-
-@needs_py39
-def test_openapi_schema(client: TestClient):
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/items/": {
- "get": {
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- "summary": "Read Items",
- "operationId": "read_items_items__get",
- "parameters": [
- {
- "required": False,
- "schema": {
- "title": "Q",
- "type": "array",
- "items": {"type": "string"},
- "default": ["foo", "bar"],
- },
- "name": "q",
- "in": "query",
- }
- ],
- }
- }
- },
- "components": {
- "schemas": {
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial012_py39.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial012_py39.py
deleted file mode 100644
index e7d745154..000000000
--- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial012_py39.py
+++ /dev/null
@@ -1,106 +0,0 @@
-import pytest
-from fastapi.testclient import TestClient
-
-from ...utils import needs_py39
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.query_params_str_validations.tutorial012_py39 import app
-
- client = TestClient(app)
- return client
-
-
-@needs_py39
-def test_default_query_values(client: TestClient):
- url = "/items/"
- response = client.get(url)
- assert response.status_code == 200, response.text
- assert response.json() == {"q": ["foo", "bar"]}
-
-
-@needs_py39
-def test_multi_query_values(client: TestClient):
- url = "/items/?q=baz&q=foobar"
- response = client.get(url)
- assert response.status_code == 200, response.text
- assert response.json() == {"q": ["baz", "foobar"]}
-
-
-@needs_py39
-def test_openapi_schema(client: TestClient):
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/items/": {
- "get": {
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- "summary": "Read Items",
- "operationId": "read_items_items__get",
- "parameters": [
- {
- "required": False,
- "schema": {
- "title": "Q",
- "type": "array",
- "items": {"type": "string"},
- "default": ["foo", "bar"],
- },
- "name": "q",
- "in": "query",
- }
- ],
- }
- }
- },
- "components": {
- "schemas": {
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial013.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial013.py
index 1ba1fdf61..f2f5f7a85 100644
--- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial013.py
+++ b/tests/test_tutorial/test_query_params_str_validations/test_tutorial013.py
@@ -1,25 +1,43 @@
+import importlib
+
+import pytest
from fastapi.testclient import TestClient
-from docs_src.query_params_str_validations.tutorial013 import app
+from ...utils import needs_py39
+
+
+@pytest.fixture(
+ name="client",
+ params=[
+ "tutorial013",
+ "tutorial013_an",
+ pytest.param("tutorial013_an_py39", marks=needs_py39),
+ ],
+)
+def get_client(request: pytest.FixtureRequest):
+ mod = importlib.import_module(
+ f"docs_src.query_params_str_validations.{request.param}"
+ )
-client = TestClient(app)
+ client = TestClient(mod.app)
+ return client
-def test_multi_query_values():
+def test_multi_query_values(client: TestClient):
url = "/items/?q=foo&q=bar"
response = client.get(url)
assert response.status_code == 200, response.text
assert response.json() == {"q": ["foo", "bar"]}
-def test_query_no_values():
+def test_query_no_values(client: TestClient):
url = "/items/"
response = client.get(url)
assert response.status_code == 200, response.text
assert response.json() == {"q": []}
-def test_openapi_schema():
+def test_openapi_schema(client: TestClient):
response = client.get("/openapi.json")
assert response.status_code == 200, response.text
assert response.json() == {
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial013_an.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial013_an.py
deleted file mode 100644
index 343261748..000000000
--- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial013_an.py
+++ /dev/null
@@ -1,96 +0,0 @@
-from fastapi.testclient import TestClient
-
-from docs_src.query_params_str_validations.tutorial013_an import app
-
-client = TestClient(app)
-
-
-def test_multi_query_values():
- url = "/items/?q=foo&q=bar"
- response = client.get(url)
- assert response.status_code == 200, response.text
- assert response.json() == {"q": ["foo", "bar"]}
-
-
-def test_query_no_values():
- url = "/items/"
- response = client.get(url)
- assert response.status_code == 200, response.text
- assert response.json() == {"q": []}
-
-
-def test_openapi_schema():
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/items/": {
- "get": {
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- "summary": "Read Items",
- "operationId": "read_items_items__get",
- "parameters": [
- {
- "required": False,
- "schema": {
- "title": "Q",
- "type": "array",
- "items": {},
- "default": [],
- },
- "name": "q",
- "in": "query",
- }
- ],
- }
- }
- },
- "components": {
- "schemas": {
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial013_an_py39.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial013_an_py39.py
deleted file mode 100644
index 537d6325b..000000000
--- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial013_an_py39.py
+++ /dev/null
@@ -1,106 +0,0 @@
-import pytest
-from fastapi.testclient import TestClient
-
-from ...utils import needs_py39
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.query_params_str_validations.tutorial013_an_py39 import app
-
- client = TestClient(app)
- return client
-
-
-@needs_py39
-def test_multi_query_values(client: TestClient):
- url = "/items/?q=foo&q=bar"
- response = client.get(url)
- assert response.status_code == 200, response.text
- assert response.json() == {"q": ["foo", "bar"]}
-
-
-@needs_py39
-def test_query_no_values(client: TestClient):
- url = "/items/"
- response = client.get(url)
- assert response.status_code == 200, response.text
- assert response.json() == {"q": []}
-
-
-@needs_py39
-def test_openapi_schema(client: TestClient):
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/items/": {
- "get": {
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- "summary": "Read Items",
- "operationId": "read_items_items__get",
- "parameters": [
- {
- "required": False,
- "schema": {
- "title": "Q",
- "type": "array",
- "items": {},
- "default": [],
- },
- "name": "q",
- "in": "query",
- }
- ],
- }
- }
- },
- "components": {
- "schemas": {
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial014.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial014.py
index 7bce7590c..edd40bb1a 100644
--- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial014.py
+++ b/tests/test_tutorial/test_query_params_str_validations/test_tutorial014.py
@@ -1,23 +1,43 @@
+import importlib
+
+import pytest
from fastapi.testclient import TestClient
-from docs_src.query_params_str_validations.tutorial014 import app
+from ...utils import needs_py39, needs_py310
+
+
+@pytest.fixture(
+ name="client",
+ params=[
+ "tutorial014",
+ pytest.param("tutorial014_py310", marks=needs_py310),
+ "tutorial014_an",
+ pytest.param("tutorial014_an_py39", marks=needs_py39),
+ pytest.param("tutorial014_an_py310", marks=needs_py310),
+ ],
+)
+def get_client(request: pytest.FixtureRequest):
+ mod = importlib.import_module(
+ f"docs_src.query_params_str_validations.{request.param}"
+ )
-client = TestClient(app)
+ client = TestClient(mod.app)
+ return client
-def test_hidden_query():
+def test_hidden_query(client: TestClient):
response = client.get("/items?hidden_query=somevalue")
assert response.status_code == 200, response.text
assert response.json() == {"hidden_query": "somevalue"}
-def test_no_hidden_query():
+def test_no_hidden_query(client: TestClient):
response = client.get("/items")
assert response.status_code == 200, response.text
assert response.json() == {"hidden_query": "Not found"}
-def test_openapi_schema():
+def test_openapi_schema(client: TestClient):
response = client.get("/openapi.json")
assert response.status_code == 200, response.text
assert response.json() == {
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial014_an.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial014_an.py
deleted file mode 100644
index 2182e87b7..000000000
--- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial014_an.py
+++ /dev/null
@@ -1,81 +0,0 @@
-from fastapi.testclient import TestClient
-
-from docs_src.query_params_str_validations.tutorial014_an import app
-
-client = TestClient(app)
-
-
-def test_hidden_query():
- response = client.get("/items?hidden_query=somevalue")
- assert response.status_code == 200, response.text
- assert response.json() == {"hidden_query": "somevalue"}
-
-
-def test_no_hidden_query():
- response = client.get("/items")
- assert response.status_code == 200, response.text
- assert response.json() == {"hidden_query": "Not found"}
-
-
-def test_openapi_schema():
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/items/": {
- "get": {
- "summary": "Read Items",
- "operationId": "read_items_items__get",
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- }
- }
- },
- "components": {
- "schemas": {
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial014_an_py310.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial014_an_py310.py
deleted file mode 100644
index 344004d01..000000000
--- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial014_an_py310.py
+++ /dev/null
@@ -1,91 +0,0 @@
-import pytest
-from fastapi.testclient import TestClient
-
-from ...utils import needs_py310
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.query_params_str_validations.tutorial014_an_py310 import app
-
- client = TestClient(app)
- return client
-
-
-@needs_py310
-def test_hidden_query(client: TestClient):
- response = client.get("/items?hidden_query=somevalue")
- assert response.status_code == 200, response.text
- assert response.json() == {"hidden_query": "somevalue"}
-
-
-@needs_py310
-def test_no_hidden_query(client: TestClient):
- response = client.get("/items")
- assert response.status_code == 200, response.text
- assert response.json() == {"hidden_query": "Not found"}
-
-
-@needs_py310
-def test_openapi_schema(client: TestClient):
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/items/": {
- "get": {
- "summary": "Read Items",
- "operationId": "read_items_items__get",
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- }
- }
- },
- "components": {
- "schemas": {
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial014_an_py39.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial014_an_py39.py
deleted file mode 100644
index 5d4f6df3d..000000000
--- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial014_an_py39.py
+++ /dev/null
@@ -1,91 +0,0 @@
-import pytest
-from fastapi.testclient import TestClient
-
-from ...utils import needs_py310
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.query_params_str_validations.tutorial014_an_py39 import app
-
- client = TestClient(app)
- return client
-
-
-@needs_py310
-def test_hidden_query(client: TestClient):
- response = client.get("/items?hidden_query=somevalue")
- assert response.status_code == 200, response.text
- assert response.json() == {"hidden_query": "somevalue"}
-
-
-@needs_py310
-def test_no_hidden_query(client: TestClient):
- response = client.get("/items")
- assert response.status_code == 200, response.text
- assert response.json() == {"hidden_query": "Not found"}
-
-
-@needs_py310
-def test_openapi_schema(client: TestClient):
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/items/": {
- "get": {
- "summary": "Read Items",
- "operationId": "read_items_items__get",
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- }
- }
- },
- "components": {
- "schemas": {
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial014_py310.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial014_py310.py
deleted file mode 100644
index dad49fb12..000000000
--- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial014_py310.py
+++ /dev/null
@@ -1,91 +0,0 @@
-import pytest
-from fastapi.testclient import TestClient
-
-from ...utils import needs_py310
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.query_params_str_validations.tutorial014_py310 import app
-
- client = TestClient(app)
- return client
-
-
-@needs_py310
-def test_hidden_query(client: TestClient):
- response = client.get("/items?hidden_query=somevalue")
- assert response.status_code == 200, response.text
- assert response.json() == {"hidden_query": "somevalue"}
-
-
-@needs_py310
-def test_no_hidden_query(client: TestClient):
- response = client.get("/items")
- assert response.status_code == 200, response.text
- assert response.json() == {"hidden_query": "Not found"}
-
-
-@needs_py310
-def test_openapi_schema(client: TestClient):
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/items/": {
- "get": {
- "summary": "Read Items",
- "operationId": "read_items_items__get",
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- }
- }
- },
- "components": {
- "schemas": {
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial015.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial015.py
new file mode 100644
index 000000000..ae1c40286
--- /dev/null
+++ b/tests/test_tutorial/test_query_params_str_validations/test_tutorial015.py
@@ -0,0 +1,143 @@
+import importlib
+
+import pytest
+from dirty_equals import IsStr
+from fastapi.testclient import TestClient
+from inline_snapshot import snapshot
+
+from ...utils import needs_py39, needs_py310, needs_pydanticv2
+
+
+@pytest.fixture(
+ name="client",
+ params=[
+ pytest.param("tutorial015_an", marks=needs_pydanticv2),
+ pytest.param("tutorial015_an_py310", marks=(needs_py310, needs_pydanticv2)),
+ pytest.param("tutorial015_an_py39", marks=(needs_py39, needs_pydanticv2)),
+ ],
+)
+def get_client(request: pytest.FixtureRequest):
+ mod = importlib.import_module(
+ f"docs_src.query_params_str_validations.{request.param}"
+ )
+
+ client = TestClient(mod.app)
+ return client
+
+
+def test_get_random_item(client: TestClient):
+ response = client.get("/items")
+ assert response.status_code == 200, response.text
+ assert response.json() == {"id": IsStr(), "name": IsStr()}
+
+
+def test_get_item(client: TestClient):
+ response = client.get("/items?id=isbn-9781529046137")
+ assert response.status_code == 200, response.text
+ assert response.json() == {
+ "id": "isbn-9781529046137",
+ "name": "The Hitchhiker's Guide to the Galaxy",
+ }
+
+
+def test_get_item_does_not_exist(client: TestClient):
+ response = client.get("/items?id=isbn-nope")
+ assert response.status_code == 200, response.text
+ assert response.json() == {"id": "isbn-nope", "name": None}
+
+
+def test_get_invalid_item(client: TestClient):
+ response = client.get("/items?id=wtf-yes")
+ assert response.status_code == 422, response.text
+ assert response.json() == snapshot(
+ {
+ "detail": [
+ {
+ "type": "value_error",
+ "loc": ["query", "id"],
+ "msg": 'Value error, Invalid ID format, it must start with "isbn-" or "imdb-"',
+ "input": "wtf-yes",
+ "ctx": {"error": {}},
+ }
+ ]
+ }
+ )
+
+
+def test_openapi_schema(client: TestClient):
+ response = client.get("/openapi.json")
+ assert response.status_code == 200, response.text
+ assert response.json() == snapshot(
+ {
+ "openapi": "3.1.0",
+ "info": {"title": "FastAPI", "version": "0.1.0"},
+ "paths": {
+ "/items/": {
+ "get": {
+ "summary": "Read Items",
+ "operationId": "read_items_items__get",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "query",
+ "required": False,
+ "schema": {
+ "anyOf": [{"type": "string"}, {"type": "null"}],
+ "title": "Id",
+ },
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {"application/json": {"schema": {}}},
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ },
+ },
+ },
+ }
+ }
+ },
+ "components": {
+ "schemas": {
+ "HTTPValidationError": {
+ "properties": {
+ "detail": {
+ "items": {
+ "$ref": "#/components/schemas/ValidationError"
+ },
+ "type": "array",
+ "title": "Detail",
+ }
+ },
+ "type": "object",
+ "title": "HTTPValidationError",
+ },
+ "ValidationError": {
+ "properties": {
+ "loc": {
+ "items": {
+ "anyOf": [{"type": "string"}, {"type": "integer"}]
+ },
+ "type": "array",
+ "title": "Location",
+ },
+ "msg": {"type": "string", "title": "Message"},
+ "type": {"type": "string", "title": "Error Type"},
+ },
+ "type": "object",
+ "required": ["loc", "msg", "type"],
+ "title": "ValidationError",
+ },
+ }
+ },
+ }
+ )
diff --git a/tests/test_tutorial/test_request_files/test_tutorial001.py b/tests/test_tutorial/test_request_files/test_tutorial001.py
index f5817593b..b06919961 100644
--- a/tests/test_tutorial/test_request_files/test_tutorial001.py
+++ b/tests/test_tutorial/test_request_files/test_tutorial001.py
@@ -1,23 +1,28 @@
+import importlib
+
+import pytest
from dirty_equals import IsDict
from fastapi.testclient import TestClient
-from docs_src.request_files.tutorial001 import app
+from ...utils import needs_py39
-client = TestClient(app)
+@pytest.fixture(
+ name="client",
+ params=[
+ "tutorial001",
+ "tutorial001_an",
+ pytest.param("tutorial001_an_py39", marks=needs_py39),
+ ],
+)
+def get_client(request: pytest.FixtureRequest):
+ mod = importlib.import_module(f"docs_src.request_files.{request.param}")
-file_required = {
- "detail": [
- {
- "loc": ["body", "file"],
- "msg": "field required",
- "type": "value_error.missing",
- }
- ]
-}
+ client = TestClient(mod.app)
+ return client
-def test_post_form_no_body():
+def test_post_form_no_body(client: TestClient):
response = client.post("/files/")
assert response.status_code == 422, response.text
assert response.json() == IsDict(
@@ -45,7 +50,7 @@ def test_post_form_no_body():
)
-def test_post_body_json():
+def test_post_body_json(client: TestClient):
response = client.post("/files/", json={"file": "Foo"})
assert response.status_code == 422, response.text
assert response.json() == IsDict(
@@ -73,41 +78,38 @@ def test_post_body_json():
)
-def test_post_file(tmp_path):
+def test_post_file(tmp_path, client: TestClient):
path = tmp_path / "test.txt"
path.write_bytes(b"")
- client = TestClient(app)
with path.open("rb") as file:
response = client.post("/files/", files={"file": file})
assert response.status_code == 200, response.text
assert response.json() == {"file_size": 14}
-def test_post_large_file(tmp_path):
+def test_post_large_file(tmp_path, client: TestClient):
default_pydantic_max_size = 2**16
path = tmp_path / "test.txt"
path.write_bytes(b"x" * (default_pydantic_max_size + 1))
- client = TestClient(app)
with path.open("rb") as file:
response = client.post("/files/", files={"file": file})
assert response.status_code == 200, response.text
assert response.json() == {"file_size": default_pydantic_max_size + 1}
-def test_post_upload_file(tmp_path):
+def test_post_upload_file(tmp_path, client: TestClient):
path = tmp_path / "test.txt"
path.write_bytes(b"")
- client = TestClient(app)
with path.open("rb") as file:
response = client.post("/uploadfile/", files={"file": file})
assert response.status_code == 200, response.text
assert response.json() == {"filename": "test.txt"}
-def test_openapi_schema():
+def test_openapi_schema(client: TestClient):
response = client.get("/openapi.json")
assert response.status_code == 200, response.text
assert response.json() == {
diff --git a/tests/test_tutorial/test_request_files/test_tutorial001_02.py b/tests/test_tutorial/test_request_files/test_tutorial001_02.py
index 42f75442a..9075a1756 100644
--- a/tests/test_tutorial/test_request_files/test_tutorial001_02.py
+++ b/tests/test_tutorial/test_request_files/test_tutorial001_02.py
@@ -1,46 +1,63 @@
+import importlib
+from pathlib import Path
+
+import pytest
from dirty_equals import IsDict
from fastapi.testclient import TestClient
-from docs_src.request_files.tutorial001_02 import app
+from ...utils import needs_py39, needs_py310
+
+
+@pytest.fixture(
+ name="client",
+ params=[
+ "tutorial001_02",
+ pytest.param("tutorial001_02_py310", marks=needs_py310),
+ "tutorial001_02_an",
+ pytest.param("tutorial001_02_an_py39", marks=needs_py39),
+ pytest.param("tutorial001_02_an_py310", marks=needs_py310),
+ ],
+)
+def get_client(request: pytest.FixtureRequest):
+ mod = importlib.import_module(f"docs_src.request_files.{request.param}")
-client = TestClient(app)
+ client = TestClient(mod.app)
+ return client
-def test_post_form_no_body():
+def test_post_form_no_body(client: TestClient):
response = client.post("/files/")
assert response.status_code == 200, response.text
assert response.json() == {"message": "No file sent"}
-def test_post_uploadfile_no_body():
+def test_post_uploadfile_no_body(client: TestClient):
response = client.post("/uploadfile/")
assert response.status_code == 200, response.text
assert response.json() == {"message": "No upload file sent"}
-def test_post_file(tmp_path):
+def test_post_file(tmp_path: Path, client: TestClient):
path = tmp_path / "test.txt"
path.write_bytes(b"")
- client = TestClient(app)
with path.open("rb") as file:
response = client.post("/files/", files={"file": file})
assert response.status_code == 200, response.text
assert response.json() == {"file_size": 14}
-def test_post_upload_file(tmp_path):
+def test_post_upload_file(tmp_path: Path, client: TestClient):
path = tmp_path / "test.txt"
path.write_bytes(b"")
- client = TestClient(app)
with path.open("rb") as file:
response = client.post("/uploadfile/", files={"file": file})
assert response.status_code == 200, response.text
assert response.json() == {"filename": "test.txt"}
-def test_openapi_schema():
+def test_openapi_schema(client: TestClient):
response = client.get("/openapi.json")
assert response.status_code == 200, response.text
assert response.json() == {
diff --git a/tests/test_tutorial/test_request_files/test_tutorial001_02_an.py b/tests/test_tutorial/test_request_files/test_tutorial001_02_an.py
deleted file mode 100644
index f63eb339c..000000000
--- a/tests/test_tutorial/test_request_files/test_tutorial001_02_an.py
+++ /dev/null
@@ -1,208 +0,0 @@
-from dirty_equals import IsDict
-from fastapi.testclient import TestClient
-
-from docs_src.request_files.tutorial001_02_an import app
-
-client = TestClient(app)
-
-
-def test_post_form_no_body():
- response = client.post("/files/")
- assert response.status_code == 200, response.text
- assert response.json() == {"message": "No file sent"}
-
-
-def test_post_uploadfile_no_body():
- response = client.post("/uploadfile/")
- assert response.status_code == 200, response.text
- assert response.json() == {"message": "No upload file sent"}
-
-
-def test_post_file(tmp_path):
- path = tmp_path / "test.txt"
- path.write_bytes(b"")
-
- client = TestClient(app)
- with path.open("rb") as file:
- response = client.post("/files/", files={"file": file})
- assert response.status_code == 200, response.text
- assert response.json() == {"file_size": 14}
-
-
-def test_post_upload_file(tmp_path):
- path = tmp_path / "test.txt"
- path.write_bytes(b"")
-
- client = TestClient(app)
- with path.open("rb") as file:
- response = client.post("/uploadfile/", files={"file": file})
- assert response.status_code == 200, response.text
- assert response.json() == {"filename": "test.txt"}
-
-
-def test_openapi_schema():
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/files/": {
- "post": {
- "summary": "Create File",
- "operationId": "create_file_files__post",
- "requestBody": {
- "content": {
- "multipart/form-data": {
- "schema": IsDict(
- {
- "allOf": [
- {
- "$ref": "#/components/schemas/Body_create_file_files__post"
- }
- ],
- "title": "Body",
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "$ref": "#/components/schemas/Body_create_file_files__post"
- }
- )
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- }
- },
- "/uploadfile/": {
- "post": {
- "summary": "Create Upload File",
- "operationId": "create_upload_file_uploadfile__post",
- "requestBody": {
- "content": {
- "multipart/form-data": {
- "schema": IsDict(
- {
- "allOf": [
- {
- "$ref": "#/components/schemas/Body_create_upload_file_uploadfile__post"
- }
- ],
- "title": "Body",
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "$ref": "#/components/schemas/Body_create_upload_file_uploadfile__post"
- }
- )
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- }
- },
- },
- "components": {
- "schemas": {
- "Body_create_file_files__post": {
- "title": "Body_create_file_files__post",
- "type": "object",
- "properties": {
- "file": IsDict(
- {
- "title": "File",
- "anyOf": [
- {"type": "string", "format": "binary"},
- {"type": "null"},
- ],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {"title": "File", "type": "string", "format": "binary"}
- )
- },
- },
- "Body_create_upload_file_uploadfile__post": {
- "title": "Body_create_upload_file_uploadfile__post",
- "type": "object",
- "properties": {
- "file": IsDict(
- {
- "title": "File",
- "anyOf": [
- {"type": "string", "format": "binary"},
- {"type": "null"},
- ],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {"title": "File", "type": "string", "format": "binary"}
- )
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_request_files/test_tutorial001_02_an_py310.py b/tests/test_tutorial/test_request_files/test_tutorial001_02_an_py310.py
deleted file mode 100644
index 94b6ac67e..000000000
--- a/tests/test_tutorial/test_request_files/test_tutorial001_02_an_py310.py
+++ /dev/null
@@ -1,220 +0,0 @@
-from pathlib import Path
-
-import pytest
-from dirty_equals import IsDict
-from fastapi.testclient import TestClient
-
-from ...utils import needs_py310
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.request_files.tutorial001_02_an_py310 import app
-
- client = TestClient(app)
- return client
-
-
-@needs_py310
-def test_post_form_no_body(client: TestClient):
- response = client.post("/files/")
- assert response.status_code == 200, response.text
- assert response.json() == {"message": "No file sent"}
-
-
-@needs_py310
-def test_post_uploadfile_no_body(client: TestClient):
- response = client.post("/uploadfile/")
- assert response.status_code == 200, response.text
- assert response.json() == {"message": "No upload file sent"}
-
-
-@needs_py310
-def test_post_file(tmp_path: Path, client: TestClient):
- path = tmp_path / "test.txt"
- path.write_bytes(b"")
-
- with path.open("rb") as file:
- response = client.post("/files/", files={"file": file})
- assert response.status_code == 200, response.text
- assert response.json() == {"file_size": 14}
-
-
-@needs_py310
-def test_post_upload_file(tmp_path: Path, client: TestClient):
- path = tmp_path / "test.txt"
- path.write_bytes(b"")
-
- with path.open("rb") as file:
- response = client.post("/uploadfile/", files={"file": file})
- assert response.status_code == 200, response.text
- assert response.json() == {"filename": "test.txt"}
-
-
-@needs_py310
-def test_openapi_schema(client: TestClient):
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/files/": {
- "post": {
- "summary": "Create File",
- "operationId": "create_file_files__post",
- "requestBody": {
- "content": {
- "multipart/form-data": {
- "schema": IsDict(
- {
- "allOf": [
- {
- "$ref": "#/components/schemas/Body_create_file_files__post"
- }
- ],
- "title": "Body",
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "$ref": "#/components/schemas/Body_create_file_files__post"
- }
- )
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- }
- },
- "/uploadfile/": {
- "post": {
- "summary": "Create Upload File",
- "operationId": "create_upload_file_uploadfile__post",
- "requestBody": {
- "content": {
- "multipart/form-data": {
- "schema": IsDict(
- {
- "allOf": [
- {
- "$ref": "#/components/schemas/Body_create_upload_file_uploadfile__post"
- }
- ],
- "title": "Body",
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "$ref": "#/components/schemas/Body_create_upload_file_uploadfile__post"
- }
- )
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- }
- },
- },
- "components": {
- "schemas": {
- "Body_create_file_files__post": {
- "title": "Body_create_file_files__post",
- "type": "object",
- "properties": {
- "file": IsDict(
- {
- "title": "File",
- "anyOf": [
- {"type": "string", "format": "binary"},
- {"type": "null"},
- ],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {"title": "File", "type": "string", "format": "binary"}
- )
- },
- },
- "Body_create_upload_file_uploadfile__post": {
- "title": "Body_create_upload_file_uploadfile__post",
- "type": "object",
- "properties": {
- "file": IsDict(
- {
- "title": "File",
- "anyOf": [
- {"type": "string", "format": "binary"},
- {"type": "null"},
- ],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {"title": "File", "type": "string", "format": "binary"}
- )
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_request_files/test_tutorial001_02_an_py39.py b/tests/test_tutorial/test_request_files/test_tutorial001_02_an_py39.py
deleted file mode 100644
index fcb39f8f1..000000000
--- a/tests/test_tutorial/test_request_files/test_tutorial001_02_an_py39.py
+++ /dev/null
@@ -1,220 +0,0 @@
-from pathlib import Path
-
-import pytest
-from dirty_equals import IsDict
-from fastapi.testclient import TestClient
-
-from ...utils import needs_py39
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.request_files.tutorial001_02_an_py39 import app
-
- client = TestClient(app)
- return client
-
-
-@needs_py39
-def test_post_form_no_body(client: TestClient):
- response = client.post("/files/")
- assert response.status_code == 200, response.text
- assert response.json() == {"message": "No file sent"}
-
-
-@needs_py39
-def test_post_uploadfile_no_body(client: TestClient):
- response = client.post("/uploadfile/")
- assert response.status_code == 200, response.text
- assert response.json() == {"message": "No upload file sent"}
-
-
-@needs_py39
-def test_post_file(tmp_path: Path, client: TestClient):
- path = tmp_path / "test.txt"
- path.write_bytes(b"")
-
- with path.open("rb") as file:
- response = client.post("/files/", files={"file": file})
- assert response.status_code == 200, response.text
- assert response.json() == {"file_size": 14}
-
-
-@needs_py39
-def test_post_upload_file(tmp_path: Path, client: TestClient):
- path = tmp_path / "test.txt"
- path.write_bytes(b"")
-
- with path.open("rb") as file:
- response = client.post("/uploadfile/", files={"file": file})
- assert response.status_code == 200, response.text
- assert response.json() == {"filename": "test.txt"}
-
-
-@needs_py39
-def test_openapi_schema(client: TestClient):
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/files/": {
- "post": {
- "summary": "Create File",
- "operationId": "create_file_files__post",
- "requestBody": {
- "content": {
- "multipart/form-data": {
- "schema": IsDict(
- {
- "allOf": [
- {
- "$ref": "#/components/schemas/Body_create_file_files__post"
- }
- ],
- "title": "Body",
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "$ref": "#/components/schemas/Body_create_file_files__post"
- }
- )
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- }
- },
- "/uploadfile/": {
- "post": {
- "summary": "Create Upload File",
- "operationId": "create_upload_file_uploadfile__post",
- "requestBody": {
- "content": {
- "multipart/form-data": {
- "schema": IsDict(
- {
- "allOf": [
- {
- "$ref": "#/components/schemas/Body_create_upload_file_uploadfile__post"
- }
- ],
- "title": "Body",
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "$ref": "#/components/schemas/Body_create_upload_file_uploadfile__post"
- }
- )
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- }
- },
- },
- "components": {
- "schemas": {
- "Body_create_file_files__post": {
- "title": "Body_create_file_files__post",
- "type": "object",
- "properties": {
- "file": IsDict(
- {
- "title": "File",
- "anyOf": [
- {"type": "string", "format": "binary"},
- {"type": "null"},
- ],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {"title": "File", "type": "string", "format": "binary"}
- )
- },
- },
- "Body_create_upload_file_uploadfile__post": {
- "title": "Body_create_upload_file_uploadfile__post",
- "type": "object",
- "properties": {
- "file": IsDict(
- {
- "title": "File",
- "anyOf": [
- {"type": "string", "format": "binary"},
- {"type": "null"},
- ],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {"title": "File", "type": "string", "format": "binary"}
- )
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_request_files/test_tutorial001_02_py310.py b/tests/test_tutorial/test_request_files/test_tutorial001_02_py310.py
deleted file mode 100644
index a700752a3..000000000
--- a/tests/test_tutorial/test_request_files/test_tutorial001_02_py310.py
+++ /dev/null
@@ -1,220 +0,0 @@
-from pathlib import Path
-
-import pytest
-from dirty_equals import IsDict
-from fastapi.testclient import TestClient
-
-from ...utils import needs_py310
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.request_files.tutorial001_02_py310 import app
-
- client = TestClient(app)
- return client
-
-
-@needs_py310
-def test_post_form_no_body(client: TestClient):
- response = client.post("/files/")
- assert response.status_code == 200, response.text
- assert response.json() == {"message": "No file sent"}
-
-
-@needs_py310
-def test_post_uploadfile_no_body(client: TestClient):
- response = client.post("/uploadfile/")
- assert response.status_code == 200, response.text
- assert response.json() == {"message": "No upload file sent"}
-
-
-@needs_py310
-def test_post_file(tmp_path: Path, client: TestClient):
- path = tmp_path / "test.txt"
- path.write_bytes(b"")
-
- with path.open("rb") as file:
- response = client.post("/files/", files={"file": file})
- assert response.status_code == 200, response.text
- assert response.json() == {"file_size": 14}
-
-
-@needs_py310
-def test_post_upload_file(tmp_path: Path, client: TestClient):
- path = tmp_path / "test.txt"
- path.write_bytes(b"")
-
- with path.open("rb") as file:
- response = client.post("/uploadfile/", files={"file": file})
- assert response.status_code == 200, response.text
- assert response.json() == {"filename": "test.txt"}
-
-
-@needs_py310
-def test_openapi_schema(client: TestClient):
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/files/": {
- "post": {
- "summary": "Create File",
- "operationId": "create_file_files__post",
- "requestBody": {
- "content": {
- "multipart/form-data": {
- "schema": IsDict(
- {
- "allOf": [
- {
- "$ref": "#/components/schemas/Body_create_file_files__post"
- }
- ],
- "title": "Body",
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "$ref": "#/components/schemas/Body_create_file_files__post"
- }
- )
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- }
- },
- "/uploadfile/": {
- "post": {
- "summary": "Create Upload File",
- "operationId": "create_upload_file_uploadfile__post",
- "requestBody": {
- "content": {
- "multipart/form-data": {
- "schema": IsDict(
- {
- "allOf": [
- {
- "$ref": "#/components/schemas/Body_create_upload_file_uploadfile__post"
- }
- ],
- "title": "Body",
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "$ref": "#/components/schemas/Body_create_upload_file_uploadfile__post"
- }
- )
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- }
- },
- },
- "components": {
- "schemas": {
- "Body_create_file_files__post": {
- "title": "Body_create_file_files__post",
- "type": "object",
- "properties": {
- "file": IsDict(
- {
- "title": "File",
- "anyOf": [
- {"type": "string", "format": "binary"},
- {"type": "null"},
- ],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {"title": "File", "type": "string", "format": "binary"}
- )
- },
- },
- "Body_create_upload_file_uploadfile__post": {
- "title": "Body_create_upload_file_uploadfile__post",
- "type": "object",
- "properties": {
- "file": IsDict(
- {
- "title": "File",
- "anyOf": [
- {"type": "string", "format": "binary"},
- {"type": "null"},
- ],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {"title": "File", "type": "string", "format": "binary"}
- )
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_request_files/test_tutorial001_03.py b/tests/test_tutorial/test_request_files/test_tutorial001_03.py
index f02170814..9fbe2166c 100644
--- a/tests/test_tutorial/test_request_files/test_tutorial001_03.py
+++ b/tests/test_tutorial/test_request_files/test_tutorial001_03.py
@@ -1,33 +1,47 @@
+import importlib
+
+import pytest
from fastapi.testclient import TestClient
-from docs_src.request_files.tutorial001_03 import app
+from ...utils import needs_py39
+
+
+@pytest.fixture(
+ name="client",
+ params=[
+ "tutorial001_03",
+ "tutorial001_03_an",
+ pytest.param("tutorial001_03_an_py39", marks=needs_py39),
+ ],
+)
+def get_client(request: pytest.FixtureRequest):
+ mod = importlib.import_module(f"docs_src.request_files.{request.param}")
-client = TestClient(app)
+ client = TestClient(mod.app)
+ return client
-def test_post_file(tmp_path):
+def test_post_file(tmp_path, client: TestClient):
path = tmp_path / "test.txt"
path.write_bytes(b"")
- client = TestClient(app)
with path.open("rb") as file:
response = client.post("/files/", files={"file": file})
assert response.status_code == 200, response.text
assert response.json() == {"file_size": 14}
-def test_post_upload_file(tmp_path):
+def test_post_upload_file(tmp_path, client: TestClient):
path = tmp_path / "test.txt"
path.write_bytes(b"")
- client = TestClient(app)
with path.open("rb") as file:
response = client.post("/uploadfile/", files={"file": file})
assert response.status_code == 200, response.text
assert response.json() == {"filename": "test.txt"}
-def test_openapi_schema():
+def test_openapi_schema(client: TestClient):
response = client.get("/openapi.json")
assert response.status_code == 200, response.text
assert response.json() == {
diff --git a/tests/test_tutorial/test_request_files/test_tutorial001_03_an.py b/tests/test_tutorial/test_request_files/test_tutorial001_03_an.py
deleted file mode 100644
index acfb749ce..000000000
--- a/tests/test_tutorial/test_request_files/test_tutorial001_03_an.py
+++ /dev/null
@@ -1,159 +0,0 @@
-from fastapi.testclient import TestClient
-
-from docs_src.request_files.tutorial001_03_an import app
-
-client = TestClient(app)
-
-
-def test_post_file(tmp_path):
- path = tmp_path / "test.txt"
- path.write_bytes(b"")
-
- client = TestClient(app)
- with path.open("rb") as file:
- response = client.post("/files/", files={"file": file})
- assert response.status_code == 200, response.text
- assert response.json() == {"file_size": 14}
-
-
-def test_post_upload_file(tmp_path):
- path = tmp_path / "test.txt"
- path.write_bytes(b"")
-
- client = TestClient(app)
- with path.open("rb") as file:
- response = client.post("/uploadfile/", files={"file": file})
- assert response.status_code == 200, response.text
- assert response.json() == {"filename": "test.txt"}
-
-
-def test_openapi_schema():
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/files/": {
- "post": {
- "summary": "Create File",
- "operationId": "create_file_files__post",
- "requestBody": {
- "content": {
- "multipart/form-data": {
- "schema": {
- "$ref": "#/components/schemas/Body_create_file_files__post"
- }
- }
- },
- "required": True,
- },
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- }
- },
- "/uploadfile/": {
- "post": {
- "summary": "Create Upload File",
- "operationId": "create_upload_file_uploadfile__post",
- "requestBody": {
- "content": {
- "multipart/form-data": {
- "schema": {
- "$ref": "#/components/schemas/Body_create_upload_file_uploadfile__post"
- }
- }
- },
- "required": True,
- },
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- }
- },
- },
- "components": {
- "schemas": {
- "Body_create_file_files__post": {
- "title": "Body_create_file_files__post",
- "required": ["file"],
- "type": "object",
- "properties": {
- "file": {
- "title": "File",
- "type": "string",
- "description": "A file read as bytes",
- "format": "binary",
- }
- },
- },
- "Body_create_upload_file_uploadfile__post": {
- "title": "Body_create_upload_file_uploadfile__post",
- "required": ["file"],
- "type": "object",
- "properties": {
- "file": {
- "title": "File",
- "type": "string",
- "description": "A file read as UploadFile",
- "format": "binary",
- }
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_request_files/test_tutorial001_03_an_py39.py b/tests/test_tutorial/test_request_files/test_tutorial001_03_an_py39.py
deleted file mode 100644
index 36e5faac1..000000000
--- a/tests/test_tutorial/test_request_files/test_tutorial001_03_an_py39.py
+++ /dev/null
@@ -1,167 +0,0 @@
-import pytest
-from fastapi.testclient import TestClient
-
-from ...utils import needs_py39
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.request_files.tutorial001_03_an_py39 import app
-
- client = TestClient(app)
- return client
-
-
-@needs_py39
-def test_post_file(tmp_path, client: TestClient):
- path = tmp_path / "test.txt"
- path.write_bytes(b"")
-
- with path.open("rb") as file:
- response = client.post("/files/", files={"file": file})
- assert response.status_code == 200, response.text
- assert response.json() == {"file_size": 14}
-
-
-@needs_py39
-def test_post_upload_file(tmp_path, client: TestClient):
- path = tmp_path / "test.txt"
- path.write_bytes(b"")
-
- with path.open("rb") as file:
- response = client.post("/uploadfile/", files={"file": file})
- assert response.status_code == 200, response.text
- assert response.json() == {"filename": "test.txt"}
-
-
-@needs_py39
-def test_openapi_schema(client: TestClient):
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/files/": {
- "post": {
- "summary": "Create File",
- "operationId": "create_file_files__post",
- "requestBody": {
- "content": {
- "multipart/form-data": {
- "schema": {
- "$ref": "#/components/schemas/Body_create_file_files__post"
- }
- }
- },
- "required": True,
- },
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- }
- },
- "/uploadfile/": {
- "post": {
- "summary": "Create Upload File",
- "operationId": "create_upload_file_uploadfile__post",
- "requestBody": {
- "content": {
- "multipart/form-data": {
- "schema": {
- "$ref": "#/components/schemas/Body_create_upload_file_uploadfile__post"
- }
- }
- },
- "required": True,
- },
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- }
- },
- },
- "components": {
- "schemas": {
- "Body_create_file_files__post": {
- "title": "Body_create_file_files__post",
- "required": ["file"],
- "type": "object",
- "properties": {
- "file": {
- "title": "File",
- "type": "string",
- "description": "A file read as bytes",
- "format": "binary",
- }
- },
- },
- "Body_create_upload_file_uploadfile__post": {
- "title": "Body_create_upload_file_uploadfile__post",
- "required": ["file"],
- "type": "object",
- "properties": {
- "file": {
- "title": "File",
- "type": "string",
- "description": "A file read as UploadFile",
- "format": "binary",
- }
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_request_files/test_tutorial001_an.py b/tests/test_tutorial/test_request_files/test_tutorial001_an.py
deleted file mode 100644
index 1c78e3679..000000000
--- a/tests/test_tutorial/test_request_files/test_tutorial001_an.py
+++ /dev/null
@@ -1,218 +0,0 @@
-from dirty_equals import IsDict
-from fastapi.testclient import TestClient
-
-from docs_src.request_files.tutorial001_an import app
-
-client = TestClient(app)
-
-
-def test_post_form_no_body():
- response = client.post("/files/")
- assert response.status_code == 422, response.text
- assert response.json() == IsDict(
- {
- "detail": [
- {
- "type": "missing",
- "loc": ["body", "file"],
- "msg": "Field required",
- "input": None,
- }
- ]
- }
- ) | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "detail": [
- {
- "loc": ["body", "file"],
- "msg": "field required",
- "type": "value_error.missing",
- }
- ]
- }
- )
-
-
-def test_post_body_json():
- response = client.post("/files/", json={"file": "Foo"})
- assert response.status_code == 422, response.text
- assert response.json() == IsDict(
- {
- "detail": [
- {
- "type": "missing",
- "loc": ["body", "file"],
- "msg": "Field required",
- "input": None,
- }
- ]
- }
- ) | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "detail": [
- {
- "loc": ["body", "file"],
- "msg": "field required",
- "type": "value_error.missing",
- }
- ]
- }
- )
-
-
-def test_post_file(tmp_path):
- path = tmp_path / "test.txt"
- path.write_bytes(b"")
-
- client = TestClient(app)
- with path.open("rb") as file:
- response = client.post("/files/", files={"file": file})
- assert response.status_code == 200, response.text
- assert response.json() == {"file_size": 14}
-
-
-def test_post_large_file(tmp_path):
- default_pydantic_max_size = 2**16
- path = tmp_path / "test.txt"
- path.write_bytes(b"x" * (default_pydantic_max_size + 1))
-
- client = TestClient(app)
- with path.open("rb") as file:
- response = client.post("/files/", files={"file": file})
- assert response.status_code == 200, response.text
- assert response.json() == {"file_size": default_pydantic_max_size + 1}
-
-
-def test_post_upload_file(tmp_path):
- path = tmp_path / "test.txt"
- path.write_bytes(b"")
-
- client = TestClient(app)
- with path.open("rb") as file:
- response = client.post("/uploadfile/", files={"file": file})
- assert response.status_code == 200, response.text
- assert response.json() == {"filename": "test.txt"}
-
-
-def test_openapi_schema():
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/files/": {
- "post": {
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- "summary": "Create File",
- "operationId": "create_file_files__post",
- "requestBody": {
- "content": {
- "multipart/form-data": {
- "schema": {
- "$ref": "#/components/schemas/Body_create_file_files__post"
- }
- }
- },
- "required": True,
- },
- }
- },
- "/uploadfile/": {
- "post": {
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- "summary": "Create Upload File",
- "operationId": "create_upload_file_uploadfile__post",
- "requestBody": {
- "content": {
- "multipart/form-data": {
- "schema": {
- "$ref": "#/components/schemas/Body_create_upload_file_uploadfile__post"
- }
- }
- },
- "required": True,
- },
- }
- },
- },
- "components": {
- "schemas": {
- "Body_create_upload_file_uploadfile__post": {
- "title": "Body_create_upload_file_uploadfile__post",
- "required": ["file"],
- "type": "object",
- "properties": {
- "file": {"title": "File", "type": "string", "format": "binary"}
- },
- },
- "Body_create_file_files__post": {
- "title": "Body_create_file_files__post",
- "required": ["file"],
- "type": "object",
- "properties": {
- "file": {"title": "File", "type": "string", "format": "binary"}
- },
- },
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_request_files/test_tutorial001_an_py39.py b/tests/test_tutorial/test_request_files/test_tutorial001_an_py39.py
deleted file mode 100644
index 843fcec28..000000000
--- a/tests/test_tutorial/test_request_files/test_tutorial001_an_py39.py
+++ /dev/null
@@ -1,228 +0,0 @@
-import pytest
-from dirty_equals import IsDict
-from fastapi.testclient import TestClient
-
-from ...utils import needs_py39
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.request_files.tutorial001_an_py39 import app
-
- client = TestClient(app)
- return client
-
-
-@needs_py39
-def test_post_form_no_body(client: TestClient):
- response = client.post("/files/")
- assert response.status_code == 422, response.text
- assert response.json() == IsDict(
- {
- "detail": [
- {
- "type": "missing",
- "loc": ["body", "file"],
- "msg": "Field required",
- "input": None,
- }
- ]
- }
- ) | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "detail": [
- {
- "loc": ["body", "file"],
- "msg": "field required",
- "type": "value_error.missing",
- }
- ]
- }
- )
-
-
-@needs_py39
-def test_post_body_json(client: TestClient):
- response = client.post("/files/", json={"file": "Foo"})
- assert response.status_code == 422, response.text
- assert response.json() == IsDict(
- {
- "detail": [
- {
- "type": "missing",
- "loc": ["body", "file"],
- "msg": "Field required",
- "input": None,
- }
- ]
- }
- ) | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "detail": [
- {
- "loc": ["body", "file"],
- "msg": "field required",
- "type": "value_error.missing",
- }
- ]
- }
- )
-
-
-@needs_py39
-def test_post_file(tmp_path, client: TestClient):
- path = tmp_path / "test.txt"
- path.write_bytes(b"")
-
- with path.open("rb") as file:
- response = client.post("/files/", files={"file": file})
- assert response.status_code == 200, response.text
- assert response.json() == {"file_size": 14}
-
-
-@needs_py39
-def test_post_large_file(tmp_path, client: TestClient):
- default_pydantic_max_size = 2**16
- path = tmp_path / "test.txt"
- path.write_bytes(b"x" * (default_pydantic_max_size + 1))
-
- with path.open("rb") as file:
- response = client.post("/files/", files={"file": file})
- assert response.status_code == 200, response.text
- assert response.json() == {"file_size": default_pydantic_max_size + 1}
-
-
-@needs_py39
-def test_post_upload_file(tmp_path, client: TestClient):
- path = tmp_path / "test.txt"
- path.write_bytes(b"")
-
- with path.open("rb") as file:
- response = client.post("/uploadfile/", files={"file": file})
- assert response.status_code == 200, response.text
- assert response.json() == {"filename": "test.txt"}
-
-
-@needs_py39
-def test_openapi_schema(client: TestClient):
- response = client.get("/openapi.json")
- assert response.status_code == 200, response.text
- assert response.json() == {
- "openapi": "3.1.0",
- "info": {"title": "FastAPI", "version": "0.1.0"},
- "paths": {
- "/files/": {
- "post": {
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- "summary": "Create File",
- "operationId": "create_file_files__post",
- "requestBody": {
- "content": {
- "multipart/form-data": {
- "schema": {
- "$ref": "#/components/schemas/Body_create_file_files__post"
- }
- }
- },
- "required": True,
- },
- }
- },
- "/uploadfile/": {
- "post": {
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {"application/json": {"schema": {}}},
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- "summary": "Create Upload File",
- "operationId": "create_upload_file_uploadfile__post",
- "requestBody": {
- "content": {
- "multipart/form-data": {
- "schema": {
- "$ref": "#/components/schemas/Body_create_upload_file_uploadfile__post"
- }
- }
- },
- "required": True,
- },
- }
- },
- },
- "components": {
- "schemas": {
- "Body_create_upload_file_uploadfile__post": {
- "title": "Body_create_upload_file_uploadfile__post",
- "required": ["file"],
- "type": "object",
- "properties": {
- "file": {"title": "File", "type": "string", "format": "binary"}
- },
- },
- "Body_create_file_files__post": {
- "title": "Body_create_file_files__post",
- "required": ["file"],
- "type": "object",
- "properties": {
- "file": {"title": "File", "type": "string", "format": "binary"}
- },
- },
- "ValidationError": {
- "title": "ValidationError",
- "required": ["loc", "msg", "type"],
- "type": "object",
- "properties": {
- "loc": {
- "title": "Location",
- "type": "array",
- "items": {
- "anyOf": [{"type": "string"}, {"type": "integer"}]
- },
- },
- "msg": {"title": "Message", "type": "string"},
- "type": {"title": "Error Type", "type": "string"},
- },
- },
- "HTTPValidationError": {
- "title": "HTTPValidationError",
- "type": "object",
- "properties": {
- "detail": {
- "title": "Detail",
- "type": "array",
- "items": {"$ref": "#/components/schemas/ValidationError"},
- }
- },
- },
- }
- },
- }
diff --git a/tests/test_tutorial/test_request_files/test_tutorial002.py b/tests/test_tutorial/test_request_files/test_tutorial002.py
index db1552e5c..446a87657 100644
--- a/tests/test_tutorial/test_request_files/test_tutorial002.py
+++ b/tests/test_tutorial/test_request_files/test_tutorial002.py
@@ -1,12 +1,35 @@
+import importlib
+
+import pytest
from dirty_equals import IsDict
+from fastapi import FastAPI
from fastapi.testclient import TestClient
-from docs_src.request_files.tutorial002 import app
+from ...utils import needs_py39
+
+
+@pytest.fixture(
+ name="app",
+ params=[
+ "tutorial002",
+ "tutorial002_an",
+ pytest.param("tutorial002_py39", marks=needs_py39),
+ pytest.param("tutorial002_an_py39", marks=needs_py39),
+ ],
+)
+def get_app(request: pytest.FixtureRequest):
+ mod = importlib.import_module(f"docs_src.request_files.{request.param}")
-client = TestClient(app)
+ return mod.app
+
+
+@pytest.fixture(name="client")
+def get_client(app: FastAPI):
+ client = TestClient(app)
+ return client
-def test_post_form_no_body():
+def test_post_form_no_body(client: TestClient):
response = client.post("/files/")
assert response.status_code == 422, response.text
assert response.json() == IsDict(
@@ -34,7 +57,7 @@ def test_post_form_no_body():
)
-def test_post_body_json():
+def test_post_body_json(client: TestClient):
response = client.post("/files/", json={"file": "Foo"})
assert response.status_code == 422, response.text
assert response.json() == IsDict(
@@ -62,7 +85,7 @@ def test_post_body_json():
)
-def test_post_files(tmp_path):
+def test_post_files(tmp_path, app: FastAPI):
path = tmp_path / "test.txt"
path.write_bytes(b"")
path2 = tmp_path / "test2.txt"
@@ -81,7 +104,7 @@ def test_post_files(tmp_path):
assert response.json() == {"file_sizes": [14, 15]}
-def test_post_upload_file(tmp_path):
+def test_post_upload_file(tmp_path, app: FastAPI):
path = tmp_path / "test.txt"
path.write_bytes(b"")
path2 = tmp_path / "test2.txt"
@@ -100,14 +123,14 @@ def test_post_upload_file(tmp_path):
assert response.json() == {"filenames": ["test.txt", "test2.txt"]}
-def test_get_root():
+def test_get_root(app: FastAPI):
client = TestClient(app)
response = client.get("/")
assert response.status_code == 200, response.text
assert b"