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 e84e4e4ab..a5761361d 100644
--- a/.github/workflows/build-docs.yml
+++ b/.github/workflows/build-docs.yml
@@ -21,7 +21,7 @@ jobs:
outputs:
docs: ${{ steps.filter.outputs.docs }}
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
# For pull requests it's not necessary to checkout the code but for the main branch it is
- uses: dorny/paths-filter@v3
id: filter
@@ -40,6 +40,7 @@ jobs:
- mkdocs.no-insiders.yml
- .github/workflows/build-docs.yml
- .github/workflows/deploy-docs.yml
+ - scripts/mkdocs_hooks.py
langs:
needs:
- changes
@@ -47,9 +48,9 @@ jobs:
outputs:
langs: ${{ steps.show-langs.outputs.langs }}
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Set up Python
- uses: actions/setup-python@v5
+ uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Setup uv
@@ -89,9 +90,9 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Set up Python
- uses: actions/setup-python@v5
+ uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Setup uv
diff --git a/.github/workflows/contributors.yml b/.github/workflows/contributors.yml
index 34b54b452..ee8bfafb4 100644
--- a/.github/workflows/contributors.yml
+++ b/.github/workflows/contributors.yml
@@ -24,9 +24,9 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Set up Python
- uses: actions/setup-python@v5
+ uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Setup uv
diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml
index 9ca69b208..2c432da8c 100644
--- a/.github/workflows/deploy-docs.yml
+++ b/.github/workflows/deploy-docs.yml
@@ -23,9 +23,9 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Set up Python
- uses: actions/setup-python@v5
+ uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Setup uv
@@ -44,11 +44,12 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
COMMIT_SHA: ${{ github.event.workflow_run.head_sha }}
RUN_ID: ${{ github.run_id }}
+ STATE: "pending"
- name: Clean site
run: |
rm -rf ./site
mkdir ./site
- - uses: actions/download-artifact@v4
+ - uses: actions/download-artifact@v5
with:
path: ./site/
pattern: docs-site-*
@@ -67,6 +68,14 @@ jobs:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
command: pages deploy ./site --project-name=${{ env.PROJECT_NAME }} --branch=${{ env.BRANCH }}
+ - name: Deploy Docs Status Error
+ if: failure()
+ run: python ./scripts/deploy_docs_status.py
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ COMMIT_SHA: ${{ github.event.workflow_run.head_sha }}
+ RUN_ID: ${{ github.run_id }}
+ STATE: "error"
- name: Comment Deploy
run: python ./scripts/deploy_docs_status.py
env:
@@ -74,4 +83,4 @@ jobs:
DEPLOY_URL: ${{ steps.deploy.outputs.deployment-url }}
COMMIT_SHA: ${{ github.event.workflow_run.head_sha }}
RUN_ID: ${{ github.run_id }}
- IS_DONE: "true"
+ STATE: "success"
diff --git a/.github/workflows/detect-conflicts.yml b/.github/workflows/detect-conflicts.yml
new file mode 100644
index 000000000..aba329db8
--- /dev/null
+++ b/.github/workflows/detect-conflicts.yml
@@ -0,0 +1,19 @@
+name: "Conflict detector"
+on:
+ push:
+ pull_request_target:
+ types: [synchronize]
+
+jobs:
+ main:
+ permissions:
+ contents: read
+ pull-requests: write
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check if PRs have merge conflicts
+ uses: eps1lon/actions-label-merge-conflict@v3
+ with:
+ dirtyLabel: "conflicts"
+ repoToken: "${{ secrets.GITHUB_TOKEN }}"
+ commentOnDirty: "This pull request has a merge conflict that needs to be resolved."
diff --git a/.github/workflows/label-approved.yml b/.github/workflows/label-approved.yml
index 908a9453d..76ac77298 100644
--- a/.github/workflows/label-approved.yml
+++ b/.github/workflows/label-approved.yml
@@ -20,9 +20,9 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Set up Python
- uses: actions/setup-python@v5
+ uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Setup uv
diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml
index e8e58015a..7aeb448e6 100644
--- a/.github/workflows/labeler.yml
+++ b/.github/workflows/labeler.yml
@@ -16,7 +16,7 @@ jobs:
pull-requests: write
runs-on: ubuntu-latest
steps:
- - uses: actions/labeler@v5
+ - uses: actions/labeler@v6
if: ${{ github.event.action != 'labeled' && github.event.action != 'unlabeled' }}
- run: echo "Done adding labels"
# Run this after labeler applied labels
diff --git a/.github/workflows/latest-changes.yml b/.github/workflows/latest-changes.yml
index b8b5c42ee..2fa832fab 100644
--- a/.github/workflows/latest-changes.yml
+++ b/.github/workflows/latest-changes.yml
@@ -24,7 +24,7 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
with:
# To allow latest-changes to commit to the main branch
token: ${{ secrets.FASTAPI_LATEST_CHANGES }}
@@ -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 621d1253a..ef3990d31 100644
--- a/.github/workflows/notify-translations.yml
+++ b/.github/workflows/notify-translations.yml
@@ -28,9 +28,9 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Set up Python
- uses: actions/setup-python@v5
+ uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Setup uv
diff --git a/.github/workflows/people.yml b/.github/workflows/people.yml
index c1df3455e..e6e56bf04 100644
--- a/.github/workflows/people.yml
+++ b/.github/workflows/people.yml
@@ -24,9 +24,9 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Set up Python
- uses: actions/setup-python@v5
+ uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Setup uv
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index bf88d59b1..441eb4560 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -20,9 +20,9 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Set up Python
- uses: actions/setup-python@v5
+ uses: actions/setup-python@v6
with:
python-version: "3.10"
# Issue ref: https://github.com/actions/setup-python/issues/436
@@ -35,7 +35,7 @@ jobs:
TIANGOLO_BUILD_PACKAGE: ${{ matrix.package }}
run: python -m build
- name: Publish
- uses: pypa/gh-action-pypi-publish@v1.12.4
+ uses: pypa/gh-action-pypi-publish@v1.13.0
- name: Dump GitHub context
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
diff --git a/.github/workflows/smokeshow.yml b/.github/workflows/smokeshow.yml
index d8a5dfb30..cde0ca308 100644
--- a/.github/workflows/smokeshow.yml
+++ b/.github/workflows/smokeshow.yml
@@ -21,8 +21,8 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- - uses: actions/checkout@v4
- - uses: actions/setup-python@v5
+ - uses: actions/checkout@v5
+ - uses: actions/setup-python@v6
with:
python-version: '3.9'
- name: Setup uv
@@ -34,7 +34,7 @@ jobs:
requirements**.txt
pyproject.toml
- run: uv pip install -r requirements-github-actions.txt
- - uses: actions/download-artifact@v4
+ - uses: actions/download-artifact@v5
with:
name: coverage-html
path: htmlcov
diff --git a/.github/workflows/sponsors.yml b/.github/workflows/sponsors.yml
index 6da4d90e1..1e245346d 100644
--- a/.github/workflows/sponsors.yml
+++ b/.github/workflows/sponsors.yml
@@ -24,9 +24,9 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Set up Python
- uses: actions/setup-python@v5
+ uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Setup uv
diff --git a/.github/workflows/test-redistribute.yml b/.github/workflows/test-redistribute.yml
index 693f0c603..a44f0b681 100644
--- a/.github/workflows/test-redistribute.yml
+++ b/.github/workflows/test-redistribute.yml
@@ -22,9 +22,9 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Set up Python
- uses: actions/setup-python@v5
+ uses: actions/setup-python@v6
with:
python-version: "3.10"
- name: Install build dependencies
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index c3940be01..b76afe01e 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -23,9 +23,9 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Set up Python
- uses: actions/setup-python@v5
+ uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Setup uv
@@ -61,9 +61,9 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Set up Python
- uses: actions/setup-python@v5
+ uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
- name: Setup uv
@@ -107,8 +107,8 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- - uses: actions/checkout@v4
- - uses: actions/setup-python@v5
+ - uses: actions/checkout@v5
+ - uses: actions/setup-python@v6
with:
python-version: '3.8'
- name: Setup uv
@@ -122,7 +122,7 @@ jobs:
- name: Install Dependencies
run: uv pip install -r requirements-tests.txt
- name: Get coverage files
- uses: actions/download-artifact@v4
+ uses: actions/download-artifact@v5
with:
pattern: coverage-*
path: coverage
diff --git a/.github/workflows/topic-repos.yml b/.github/workflows/topic-repos.yml
index 433aeb00b..cb98698d3 100644
--- a/.github/workflows/topic-repos.yml
+++ b/.github/workflows/topic-repos.yml
@@ -19,9 +19,9 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Set up Python
- uses: actions/setup-python@v5
+ uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Setup uv
diff --git a/.github/workflows/translate.yml b/.github/workflows/translate.yml
new file mode 100644
index 000000000..fa4e8f463
--- /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@v5
+ - name: Set up Python
+ uses: actions/setup-python@v6
+ 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 680cafce9..8b24c8c0c 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -4,7 +4,7 @@ default_language_version:
python: python3.10
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v5.0.0
+ rev: v6.0.0
hooks:
- id: check-added-large-files
- id: check-toml
@@ -14,7 +14,7 @@ repos:
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/astral-sh/ruff-pre-commit
- rev: v0.12.2
+ rev: v0.13.1
hooks:
- id: ruff
args:
diff --git a/README.md b/README.md
index 25a1d9179..a8a0e37b5 100644
--- a/README.md
+++ b/README.md
@@ -47,7 +47,6 @@ The key features are:
-
@@ -55,7 +54,8 @@ The key features are:
-
+
+
@@ -89,7 +89,7 @@ The key features are:
"_Iâm over the moon excited about **FastAPI**. Itâs so fun!_"
-
- FastAPI framework, yÃŧksÉk mÉshuldarlÄą, ÃļyrÉnmÉsi asan, çevik kodlama, istifadÉyÉ hazÄąrdÄąr -
- - ---- - -**SÉnÉdlÉr**: https://fastapi.tiangolo.com - -**Qaynaq Kodu**: https://github.com/fastapi/fastapi - ---- - -FastAPI Python ilÉ API yaratmaq ÃŧçÃŧn standart Python tip mÉslÉhÉtlÉrinÉ Ésaslanan, mÃŧasir, sÃŧrÉtli (yÃŧksÉk performanslÄą) framework-dÃŧr. - -Æsas xÃŧsusiyyÉtlÉri bunlardÄąr: - -* **SÃŧrÉtli**: Ãox yÃŧksÉk performans, **NodeJS** vÉ **Go** sÉviyyÉsindÉ (Starlette vÉ Pydantic-É tÉÅÉkkÃŧrlÉr). [Æn sÃŧrÉtli Python frameworklÉrindÉn biridir](#performans). -* **Ãevik kodlama**: FunksiyanallÄąqlarÄą inkiÅaf etdirmÉk sÃŧrÉtini tÉxminÉn 200%-dÉn 300%-É qÉdÉr artÄąrÄąn. * -* **Daha az xÉta**: İnsan (developer) tÉrÉfindÉn tÃļrÉdilÉn sÉhvlÉrin tÉxminÉn 40% -ni azaldÄąn. * -* **İntuitiv**: Æla redaktor dÉstÉyi. HÉr yerdÉ otomatik tamamlama. XÉtalarÄą mÃŧÉyyÉnlÉÅdirmÉyÉ daha az vaxt sÉrf edÉcÉksiniz. -* **Asan**: İstifadÉsi vÉ ÃļyrÉnilmÉsi asan olmasÄą ÃŧçÃŧn nÉzÉrdÉ tutulmuÅdur. SÉnÉdlÉri oxumaq ÃŧçÃŧn daha az vaxt ayÄąracaqsÄąnÄąz. -* **QÄąsa**: Kod tÉkrarlanmasÄąnÄą minimuma endirin. HÉr bir parametr tÉrifindÉ birdÉn çox xÃŧsusiyyÉt ilÉ vÉ daha az sÉhvlÉ qarÅÄąlaÅacaqsÄąnÄąz. -* **GÃŧclÃŧ**: Avtomatik vÉ interaktiv sÉnÉdlÉrlÉ birlikdÉ istifadÉyÉ hazÄąr kod ÉldÉ edÉ bilÉrsiniz. -* **Standartlara Ésaslanan**: API-lar ÃŧçÃŧn aÃ§Äąq standartlara ÉsaslanÄąr (vÉ tam uyÄun gÉlir): OpenAPI (ÉvvÉlki adÄą ilÉ Swagger) vÉ JSON Schema. - -* Bu fikirlÉr daxili development komandasÄąnÄąn hazÄąrladÄąqlarÄą mÉhsullarÄąn sÄąnaqlarÄąna ÉsaslanÄąr. - -## Sponsorlar - - - -{% if sponsors %} -{% for sponsor in sponsors.gold -%} -async def...uvicorn main:app --reload Émri haqqÄąnda...email-validator - e-poçtun yoxlanÄąlmasÄą ÃŧçÃŧn.
-* pydantic-settings - parametrlÉrin idarÉ edilmÉsi ÃŧçÃŧn.
-* pydantic-extra-types - Pydantic ilÉ istifadÉ edilÉ bilÉn ÉlavÉ tiplÉr ÃŧçÃŧn.
-
-Starlette tÉrÉfindÉn istifadÉ olunanlar:
-
-* httpx - ÆgÉr `TestClient` strukturundan istifadÉ edÉcÉksinizsÉ, tÉlÉb olunur.
-* jinja2 - Standart Åablon konfiqurasiyasÄąndan istifadÉ etmÉk istÉyirsinizsÉ, tÉlÉb olunur.
-* python-multipart - `request.form()` ilÉ forma "çevirmÉ" dÉstÉyindÉn istifadÉ etmÉk istÉyirsinizsÉ, tÉlÉb olunur.
-* itsdangerous - `SessionMiddleware` dÉstÉyi ÃŧçÃŧn tÉlÉb olunur.
-* pyyaml - `SchemaGenerator` dÉstÉyi ÃŧçÃŧn tÉlÉb olunur (Ãox gÃŧman ki, FastAPI istifadÉ edÉrkÉn buna ehtiyacÄąnÄąz olmayacaq).
-* ujson - `UJSONResponse` istifadÉ etmÉk istÉyirsinizsÉ, tÉlÉb olunur.
-
-HÉm FastAPI, hÉm dÉ Starlette tÉrÉfindÉn istifadÉ olunur:
-
-* uvicorn - YaratdÄąÄÄąmÄąz proqramÄą servis edÉcÉk veb server kimi fÉaliyyÉt gÃļstÉrir.
-* orjson - `ORJSONResponse` istifadÉ edÉcÉksinizsÉ tÉlÉb olunur.
-
-BÃŧtÃŧn bunlarÄą `pip install fastapi[all]` ilÉ quraÅdÄąra bilÉrsiniz.
-
-## Lisenziya
-
-Bu layihÉ MIT lisenziyasÄąnÄąn ÅÉrtlÉrinÉ ÉsasÉn lisenziyalaÅdÄąrÄąlÄąb.
diff --git a/docs/az/docs/learn/index.md b/docs/az/docs/learn/index.md
deleted file mode 100644
index cc32108bf..000000000
--- a/docs/az/docs/learn/index.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# ÃyrÉn
-
-Burada **FastAPI** ÃļyrÉnmÉk ÃŧçÃŧn giriÅ bÃļlmÉlÉri vÉ dÉrsliklÉr yer alÄąr.
-
-Siz bunu kitab, kurs, FastAPI ÃļyrÉnmÉk ÃŧçÃŧn rÉsmi vÉ tÃļvsiyÉ olunan Ãŧsul hesab edÉ bilÉrsiniz. đ
diff --git a/docs/az/mkdocs.yml b/docs/az/mkdocs.yml
deleted file mode 100644
index de18856f4..000000000
--- a/docs/az/mkdocs.yml
+++ /dev/null
@@ -1 +0,0 @@
-INHERIT: ../en/mkdocs.yml
diff --git a/docs/bn/docs/about/index.md b/docs/bn/docs/about/index.md
deleted file mode 100644
index b6d611ae9..000000000
--- a/docs/bn/docs/about/index.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# āϏāĻŽā§āĻĒāϰā§āĻā§
-
-**FastAPI** āϏāĻŽā§āĻĒāϰā§āĻā§ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ â āĻāϰ āĻĄāĻŋāĻāĻžāĻāύ, āĻ
āύā§āĻĒā§āϰā§āϰāĻŖāĻž āĻ āĻāϰāĻ āĻ
āύā§āĻ āĻāĻŋāĻā§āĨ¤ đ¤
diff --git a/docs/bn/docs/environment-variables.md b/docs/bn/docs/environment-variables.md
deleted file mode 100644
index 9122ca5bf..000000000
--- a/docs/bn/docs/environment-variables.md
+++ /dev/null
@@ -1,298 +0,0 @@
-# āĻāύāĻāĻžāϝāĻŧāϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞāϏ
-
-/// tip
-
-āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ "āĻāύāĻāĻžāϝāĻŧāϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞāϏ" āĻā§ āĻāĻŦāĻ āϏā§āĻā§āϞ⧠āĻā§āĻāĻžāĻŦā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻšāϝāĻŧ āϏā§āĻāĻž āĻāĻžāύā§āύ, āϤāĻžāĻšāϞ⧠āĻāĻ āĻ
āĻāĻļāĻāĻŋ āϏā§āĻāĻŋāĻĒ āĻāϰ⧠āϝā§āϤ⧠āĻĒāĻžāϰā§āύāĨ¤
-
-///
-
-āĻāύāĻāĻžāϝāĻŧāϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ (āϏāĻāĻā§āώā§āĻĒā§ "**env var**" āύāĻžāĻŽā§āĻ āĻĒāϰāĻŋāĻāĻŋāϤ) āĻšāϞ⧠āĻāĻŽāύ āĻāĻāĻāĻŋ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ āϝāĻž āĻĒāĻžāĻāĻĨāύ āĻā§āĻĄā§āϰ **āĻŦāĻžāĻāϰā§**, **āĻ
āĻĒāĻžāϰā§āĻāĻŋāĻ āϏāĻŋāϏā§āĻā§āĻŽā§** āĻĨāĻžāĻā§ āĻāĻŦāĻ āĻāĻĒāύāĻžāϰ āĻĒāĻžāĻāĻĨāύ āĻā§āĻĄ (āĻŦāĻž āĻ
āύā§āϝāĻžāύā§āϝ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ) āĻĻā§āĻŦāĻžāϰāĻž āϝāĻžāĻā§ āϰāĻŋāĻĄ āĻāϰāĻž āϝāĻžāϝāĻŧāĨ¤
-
-āĻāύāĻāĻžāϝāĻŧāϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞāϏ āĻ
ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύā§āϰ **āϏā§āĻāĻŋāĻāϏ** āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰāϤā§, āĻĒāĻžāĻāĻĨāύā§āϰ **āĻāύāϏā§āĻāϞā§āĻļāύ** āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāϰ āĻ
āĻāĻļ āĻšāĻŋāϏā§āĻŦā§, āĻāϤā§āϝāĻžāĻĻāĻŋ āĻāĻžāĻā§ āĻāĻĒāϝā§āĻā§ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤
-
-## Env Vars āϤā§āϰ⧠āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ
-
-āĻāĻĒāύāĻŋ **āĻļā§āϞ (āĻāĻžāϰā§āĻŽāĻŋāύāĻžāϞ)**-āĻ, āĻĒāĻžāĻāĻĨāύā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻāĻžāĻĄāĻŧāĻžāĻ, āĻāύāĻāĻžāϝāĻŧāϰāύāĻŽā§āύā§āĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞāϏ **āϤā§āϰāĻŋ** āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύāĻ
-
-//// tab | āϞāĻŋāύāĻžāĻā§āϏ, āĻŽā§āϝāĻžāĻāĻāĻāϏ, āĻāĻāύā§āĻĄā§āĻ Bash
-
-- FastAPI āĻāĻā§āĻāĻā§āώāĻŽāϤāĻž āϏāĻŽā§āĻĒāύā§āύ, āϏāĻšāĻā§ āĻļā§āĻāĻžāϰ āĻāĻŦāĻ āĻĻā§āϰā§āϤ āĻā§āĻĄ āĻāϰ⧠āĻĒā§āϰā§āĻĄāĻžāĻāĻļāύā§āϰ āĻāύā§āϝ āĻĢā§āϰāĻžāĻŽāĻā§āĻžāϰā§āĻāĨ¤ -
- - ---- - -**āύāĻŋāϰā§āĻĻā§āĻļāĻŋāĻāĻž āύāĻĨāĻŋ**: https://fastapi.tiangolo.com - -**āϏā§āϰā§āϏ āĻā§āĻĄ**: https://github.com/fastapi/fastapi - ---- - -FastAPI āĻāĻāĻāĻŋ āĻāϧā§āύāĻŋāĻ, āĻĻā§āϰā§āϤ ( āĻŦā§āĻļāĻŋ āĻā§āώāĻŽāϤāĻž ) āϏāĻŽā§āĻĒāύā§āύ, Python 3.6+ āĻĻāĻŋā§ā§ API āϤā§āϰāĻŋāϰ āĻāύā§āϝ āϏā§āĻā§āϝāĻžāύā§āĻĄāĻžāϰā§āĻĄ āĻĒāĻžāĻāĻĨāύ āĻāĻžāĻāĻĒ āĻāĻā§āĻāĻŋāϤ āĻāĻŋāϤā§āϤāĻŋāĻ āĻāϝāĻŧā§āĻŦ āĻĢā§āϰā§āĻŽāĻāϝāĻŧāĻžāϰā§āĻāĨ¤ - -āĻāϰ āĻŽā§āϞ āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āĻā§āϞ⧠āĻšāϞāĻ - -- **āĻāϤāĻŋ**: āĻāĻāĻŋ **NodeJS** āĻāĻŦāĻ **Go** āĻāϰ āĻŽāϤ āĻāĻžāϰā§āϝāĻā§āώāĻŽāϤāĻž āϏāĻŽā§āĻĒāύā§āύ (Starlette āĻāĻŦāĻ Pydantic āĻāϰ āϏāĻžāĻšāĻžāϝā§āϝā§)āĨ¤ [āĻĒāĻžāĻāĻĨāύ āĻāϰ āĻĻā§āϰā§āϤāϤāĻŽ āĻĢā§āϰā§āĻŽāĻāϝāĻŧāĻžāϰā§āĻ āĻā§āϞā§āϰ āĻŽāϧā§āϝ⧠āĻāĻāĻŋ āĻāĻāĻāĻŋ](#_11)āĨ¤ -- **āĻĻā§āϰā§āϤ āĻā§āĻĄ āĻāϰāĻž**:āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āϤā§āϰāĻŋāϰ āĻāϤāĻŋ ⧍ā§Ļā§Ļ% āĻĨā§āĻā§ ā§Šā§Ļā§Ļ% āĻŦā§āĻĻā§āϧāĻŋ āĻāϰā§ā§ˇ \* -- **āϏā§āĻŦāϞā§āĻĒ bugs**: āĻŽāĻžāύā§āĻŦ (āĻĄā§āĻā§āϞāĻĒāĻžāϰ) āϏā§āώā§āĻ āϤā§āϰā§āĻāĻŋāϰ āĻĒā§āϰāĻžāϝāĻŧ ā§Ēā§Ļ% āĻšā§āϰāĻžāϏ āĻāϰā§āĨ¤ \* -- **āϏā§āĻŦāĻā§āĻāĻžāϤ**: āĻĻā§āϰā§āĻĻāĻžāύā§āϤ āĻāĻĄāĻŋāĻāϰ āϏāĻžāĻšāĻžāϝā§āϝ Completion āύāĻžāĻŽā§āĻ āĻĒāϰāĻŋāĻāĻŋāϤāĨ¤ āĻĻā§āϰā§āϤ āĻĄāĻŋāĻŦāĻžāĻ āĻāϰāĻž āϝāĻžā§āĨ¤ - -- **āϏāĻšāĻ**: āĻāĻāĻŋ āĻāĻŽāύ āĻāĻžāĻŦā§ āϏāĻāĻžāύ⧠āĻšā§ā§āĻā§ āϝā§āύ āύāĻŋāϰā§āĻĻā§āĻļāĻŋāĻāĻž āύāĻĨāĻŋ āĻĒā§ā§ āϏāĻšāĻā§ āĻļā§āĻāĻž āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝāĻžā§āĨ¤ -- **āϏāĻāĻā§āώāĻŋāĻĒā§āϤ**: āĻā§āĻĄ āĻĒā§āύāϰāĻžāĻŦā§āϤā§āϤāĻŋ āĻāĻŽāĻžāύā§āϰ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ, bug āĻāĻŽāĻžā§ āĻāĻŦāĻ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻā§āώāĻŖāĻž āĻĨā§āĻā§ āĻāĻāĻžāϧāĻŋāĻ āĻĢāĻŋāĻāĻžāϰ āĻĒāĻžāĻā§āĻž āϝāĻžā§ āĨ¤ -- **āĻā§āϰāĻžāϞā§**: āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧ āĻāĻžāĻŦā§ āϤā§āϰāĻŋ āĻā§āϰāĻŋā§āĻžāĻļā§āϞ āύāĻŋāϰā§āĻĻā§āĻļāύāĻž āύāĻĨāĻŋ (documentation) āϏāĻš āĻā§āĻĒāĻžāĻĻāύ āĻāĻĒāϝā§āĻāĻŋ (Production-ready) āĻā§āĻĄ āĻĒāĻžāĻā§āĻž āϝāĻžā§āĨ¤ -- **āĻŽāĻžāύ-āĻāĻŋāϤā§āϤāĻŋāĻ**: āĻāϰ āĻāĻŋāϤā§āϤāĻŋ OpenAPI (āϝāĻž āĻĒā§āϰā§āĻŦā§ Swagger āύāĻžāĻŽā§ āĻĒāϰāĻŋāĻāĻŋāϤ āĻāĻŋāϞ) āĻāĻŦāĻ JSON Schema āĻāϰ āĻāĻĻāϰā§āĻļā§āϰ āĻŽāĻžāύā§āϰ āĻāĻĒāϰ - -\* āĻā§āĻĒāĻžāĻĻāύāĻŽā§āĻāĻŋ āĻāĻĒā§āϞāĻŋāĻā§āĻļāύ āĻŦāĻžāύāĻžāύā§āϰ āĻāĻ āĻĻāϞ āĻĄā§āĻā§āϞāĻĒāĻžāϰ āĻāϰ āĻŽāϤāĻžāĻŽāϤ āĻāĻŋāϤā§āϤāĻŋāĻ āĻĢāϞāĻžāĻĢāϞāĨ¤ - -## āϏā§āĻĒāύāϏāϰ āĻāĻŖ - - - -{% if sponsors %} -{% for sponsor in sponsors.gold -%} -async def...uvicorn main:app --reload...email-validator - āĻāĻŽā§āϞ āϝāĻžāĻāĻžāĻāĻāϰāĻŖā§āϰ āĻāύā§āϝāĨ¤
-
-āϏā§āĻāĻžāϰāϞā§āĻ āĻĻā§āĻŦāĻžāϰāĻž āĻŦā§āϝāĻŦāĻšā§āϤ:
-
-- httpx - āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ `TestClient` āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻāĻžāύ āϤāĻžāĻšāϞ⧠āĻāĻŦāĻļā§āϝāĻāĨ¤
-- jinja2 - āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻĒā§āϰāĻĻāϤā§āϤ āĻā§āĻŽāĻĒā§āϞā§āĻ āϰā§āĻĒāϰā§āĻāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻāĻžāύ āϤāĻžāĻšāϞ⧠āĻĒā§āϰāϝāĻŧā§āĻāύāĨ¤
-- python-multipart - āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻĢāϰā§āĻŽ āϏāĻšāĻžāϝāĻŧāϤāĻž āĻāϰāϤ⧠āĻāĻžāύ āϤāĻžāĻšāϞ⧠āĻĒā§āϰāϝāĻŧā§āĻāύ "parsing", `request.form()` āϏāĻšāĨ¤
-- itsdangerous - `SessionMiddleware` āϏāĻšāĻžāϝāĻŧāϤāĻžāϰ āĻāύā§āϝ āĻĒā§āϰāϝāĻŧā§āĻāύāĨ¤
-- pyyaml - āϏā§āĻāĻžāϰāϞā§āĻā§āϰ SchemaGenerator āϏāĻžāĻĒā§āϰā§āĻ āĻāϰ āĻāύā§āϝ āĻĒā§āϰā§ā§āĻāύ (āĻāĻĒāύāĻžāϰ āϏāĻŽā§āĻāĻžāĻŦāϤ FastAPI āĻĒā§āϰāϝāĻŧā§āĻāύ āύā§āĻ)āĨ¤
-- graphene - `GraphQLApp` āϏāĻšāĻžāϝāĻŧāϤāĻžāϰ āĻāύā§āϝ āĻĒā§āϰā§ā§āĻāύāĨ¤
-
-FastAPI / Starlette āĻĻā§āĻŦāĻžāϰāĻž āĻŦā§āϝāĻŦāĻšā§āϤ:
-
-- uvicorn - āϏāĻžāϰā§āĻāĻžāϰā§āϰ āĻāύā§āϝ āϝāĻž āĻāĻĒāύāĻžāϰ āĻ
ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āϞā§āĻĄ āĻāϰ⧠āĻāĻŦāĻ āĻĒāϰāĻŋāĻŦā§āĻļāύ āĻāϰā§āĨ¤
-- orjson - āĻāĻĒāύāĻŋ `ORJSONResponse` āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻāĻžāĻāϞ⧠āĻĒā§āϰāϝāĻŧā§āĻāύāĨ¤
-- ujson - āĻāĻĒāύāĻŋ `UJSONResponse` āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻāĻžāĻāϞ⧠āĻĒā§āϰāϝāĻŧā§āĻāύāĨ¤
-
-āĻāĻĒāύāĻŋ āĻāĻ āϏāĻŦ āĻāύāϏā§āĻāϞ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ `pip install fastapi[all]` āĻĻāĻŋā§ā§.
-
-## āϞāĻžāĻāϏā§āύā§āϏ
-
-āĻāĻ āĻĒā§āϰāĻā§āĻā§āĻ MIT āϞāĻžāĻāϏā§āύā§āϏ āύā§āϤāĻŋāĻŽāĻžāϞāĻžāϰ āĻ
āϧā§āύ⧠āĻļāϰā§āϤāĻžā§āĻŋāϤāĨ¤
diff --git a/docs/bn/docs/learn/index.md b/docs/bn/docs/learn/index.md
deleted file mode 100644
index 4e4c62038..000000000
--- a/docs/bn/docs/learn/index.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# āĻļāĻŋāĻā§āύ
-
-āĻāĻāĻžāύ⧠**FastAPI** āĻļāĻŋāĻāĻžāϰ āĻāύā§āϝ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ āĻŦāĻŋāĻāĻžāĻāĻā§āϞāĻŋ āĻāĻŦāĻ āĻāĻŋāĻāĻā§āϰāĻŋāϝāĻŧāĻžāϞāĻā§āϞāĻŋ āϰāϝāĻŧā§āĻā§āĨ¤
-
-āĻāĻĒāύāĻŋ āĻāĻāĻŋāĻā§ āĻāĻāĻāĻŋ **āĻŦāĻ**, āĻāĻāĻāĻŋ **āĻā§āϰā§āϏ**, āĻāĻŦāĻ FastAPI āĻļāĻŋāĻāĻžāϰ **āĻ
āĻĢāĻŋāϏāĻŋāϝāĻŧāĻžāϞ** āĻāĻŦāĻ āĻĒā§āϰāϏā§āϤāĻžāĻŦāĻŋāϤ āĻāĻĒāĻžāϝāĻŧ āĻŦāĻŋāĻŦā§āĻāύāĻž āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤ đ
diff --git a/docs/bn/docs/python-types.md b/docs/bn/docs/python-types.md
deleted file mode 100644
index d98c2ec87..000000000
--- a/docs/bn/docs/python-types.md
+++ /dev/null
@@ -1,586 +0,0 @@
-# āĻĒāĻžāĻāĻĨāύ āĻāϰ āĻāĻžāĻāĻĒā§āϏ āĻĒāϰāĻŋāĻāĻŋāϤāĻŋ
-
-Python-āĻ āĻāĻā§āĻāĻŋāĻ "āĻāĻžāĻāĻĒ āĻšāĻŋāύā§āĻ" (āϝāĻž "āĻāĻžāĻāĻĒ āĻ
ā§āϝāĻžāύā§āĻā§āĻļāύ" āύāĻžāĻŽā§āĻ āĻĒāϰāĻŋāĻāĻŋāϤ) āĻāϰ āĻāύā§āϝ āϏāĻžāĻĒā§āϰā§āĻ āϰāϝāĻŧā§āĻā§āĨ¤
-
-āĻāĻ **"āĻāĻžāĻāĻĒ āĻšāĻŋāύā§āĻ"** āĻŦāĻž āĻ
ā§āϝāĻžāύā§āĻā§āĻļāύāĻā§āϞāĻŋ āĻāĻ āϧāϰāĻŖā§āϰ āĻŦāĻŋāĻļā§āώ āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏ āϝāĻž āĻāĻāĻāĻŋ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞā§āϰ āĻāĻžāĻāĻĒ āĻā§āώāĻŖāĻž āĻāϰāϤ⧠āĻĻā§āϝāĻŧāĨ¤
-
-āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞāĻā§āϞāĻŋāϰ āĻāύā§āϝ āĻāĻžāĻāĻĒ āĻā§āώāĻŖāĻž āĻāϰāϞā§, āĻāĻĄāĻŋāĻāϰ āĻāĻŦāĻ āĻā§āϞāĻā§āϞāĻŋ āĻāĻĒāύāĻžāĻā§ āĻāϰāĻ āĻāĻžāϞ⧠āϏāĻžāĻĒā§āϰā§āĻ āĻĻāĻŋāϤ⧠āĻĒāĻžāϰā§āĨ¤
-
-āĻāĻāĻŋ āĻĒāĻžāĻāĻĨāύ āĻāĻžāĻāĻĒ āĻšāĻŋāύā§āĻ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāĻāĻāĻŋ āĻĻā§āϰā§āϤ **āĻāĻŋāĻāĻā§āϰāĻŋāϝāĻŧāĻžāϞ / āϰāĻŋāĻĢā§āϰā§āĻļāĻžāϰ** āĻŽāĻžāϤā§āϰāĨ¤ āĻāĻāĻŋ **FastAPI** āĻāϰ āϏāĻžāĻĨā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āĻāύā§āϝ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āύā§āϝā§āύāϤāĻŽ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧāϤāĻž āĻāĻāĻžāϰ āĻāϰā§... āϝāĻž āĻāϏāϞ⧠āĻā§āĻŦ āĻāĻāĻāĻž āĻŦā§āĻļāĻŋ āύāĻžāĨ¤
-
-**FastAPI** āĻāĻ āĻāĻžāĻāĻĒ āĻšāĻŋāύā§āĻāĻā§āϞāĻŋāϰ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰ⧠āύāĻŋāϰā§āĻŽāĻŋāϤ, āϝāĻž āĻāĻāĻŋāĻā§ āĻ
āύā§āĻ āϏā§āĻŦāĻŋāϧāĻž āĻāĻŦāĻ āϞāĻžāĻ āĻĒā§āϰāĻĻāĻžāύ āĻāϰā§āĨ¤
-
-āϤāĻŦā§, āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻāύ⧠**FastAPI** āĻŦā§āϝāĻŦāĻšāĻžāϰ āύāĻžāĻ āĻāϰā§āύ, āϤāĻŦā§āĻ āĻāĻā§āϞāĻŋ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāĻāĻā§ āĻļā§āĻāĻž āĻāĻĒāύāĻžāϰ āĻāĻĒāĻāĻžāϰ⧠āĻāϏāĻŦā§āĨ¤
-
-/// note
-
-āϝāĻĻāĻŋ āĻāĻĒāύāĻŋ āĻāĻāĻāύ Python āĻŦāĻŋāĻļā§āώāĻā§āĻ āĻšāύ, āĻāĻŦāĻ āĻāĻžāĻāĻĒ āĻšāĻŋāύā§āĻ āϏāĻŽā§āĻĒāϰā§āĻā§ āϏāĻŦāĻāĻŋāĻā§ āĻāĻžāύā§āύ, āϤāĻžāĻšāϞ⧠āĻĒāϰāĻŦāϰā§āϤ⧠āĻ
āϧā§āϝāĻžāϝāĻŧā§ āĻāϞ⧠āϝāĻžāύāĨ¤
-
-///
-
-## āĻĒā§āϰā§āϰāĻŖāĻž
-
-āĻāϞā§āύ āĻāĻāĻāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āĻāĻĻāĻžāĻšāϰāĻŖ āĻĻāĻŋāϝāĻŧā§ āĻļā§āϰ⧠āĻāϰāĻŋ:
-
-{* ../../docs_src/python_types/tutorial001.py *}
-
-
-āĻāĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻāϞ āĻāϰāϞ⧠āĻāĻāĻāĻĒā§āĻ āĻšāϝāĻŧ:
-
-```
-John Doe
-```
-
-āĻĢāĻžāĻāĻļāύāĻāĻŋ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻāĻžāĻ āĻāϰā§:
-
-* `first_name` āĻāĻŦāĻ `last_name` āύā§āϝāĻŧāĨ¤
-* āĻĒā§āϰāϤāĻŋāĻāĻŋāϰ āĻĒā§āϰāĻĨāĻŽ āĻ
āĻā§āώāϰāĻā§ `title()` āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻŦāĻĄāĻŧ āĻšāĻžāϤā§āϰ āĻ
āĻā§āώāϰ⧠āϰā§āĻĒāĻžāύā§āϤāϰ āĻāϰā§āĨ¤
-* āϤāĻžāĻĻā§āϰāĻā§ āĻŽāĻžāĻāĻāĻžāύ⧠āĻāĻāĻāĻŋ āϏā§āĻĒā§āϏ āĻĻāĻŋāϝāĻŧā§ concatenate āĻāϰā§āĨ¤
-
-{* ../../docs_src/python_types/tutorial001.py hl[2] *}
-
-
-### āĻāĻāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻāϰā§āύ
-
-āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻā§āĻŦ āϏāĻžāϧāĻžāϰāĻŖ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĨ¤
-
-āĻāĻŋāύā§āϤ⧠āĻāĻāύ āĻāϞā§āĻĒāύāĻž āĻāϰā§āύ āϝ⧠āĻāĻĒāύāĻŋ āĻāĻāĻŋ āĻļā§āϰ⧠āĻĨā§āĻā§ āϞāĻŋāĻāĻāĻŋāϞā§āύāĨ¤
-
-āĻāĻ āĻĒāϰā§āϝāĻžāϝāĻŧā§ āĻāĻĒāύāĻŋ āĻĢāĻžāĻāĻļāύā§āϰ āϏāĻāĻā§āĻāĻž āĻļā§āϰ⧠āĻāϰā§āĻāĻŋāϞā§āύ, āĻāĻĒāύāĻžāϰ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰāĻā§āϞāĻŋ āĻĒā§āϰāϏā§āϤā§āϤ āĻāĻŋāϞ...
-
-āĻāĻŋāύā§āϤ⧠āϤāĻžāϰāĻĒāϰ āĻāĻĒāύāĻžāĻā§ "āϏā§āĻ method āĻāϞ āĻāϰāϤ⧠āĻšāĻŦā§ āϝāĻž āĻĒā§āϰāĻĨāĻŽ āĻ
āĻā§āώāϰāĻā§ āĻŦāĻĄāĻŧ āĻšāĻžāϤā§āϰ āĻ
āĻā§āώāϰ⧠āϰā§āĻĒāĻžāύā§āϤāϰ āĻāϰā§"āĨ¤
-
-āĻāĻāĻž āĻāĻŋ `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`āĨ¤ āĻāĻŦāĻ āĻ
āĻā§āϝāύā§āϤāϰā§āĻŖ āĻŽāĻžāύāĻā§āϞā§āϰāĻ āύāĻŋāĻā§āĻĻā§āϰ āĻāĻžāĻāĻĒ āĻĨāĻžāĻāϤ⧠āĻĒāĻžāϰā§āĨ¤
-
-āĻāĻ āϧāϰāύā§āϰ āĻāĻžāĻāĻĒāĻā§āϞāĻŋāĻā§ āĻŦāϞāĻž āĻšāϝāĻŧ "**āĻā§āύā§āϰāĻŋāĻ**" āĻāĻžāĻāĻĒ āĻāĻŦāĻ āĻāĻā§āϞāĻŋāĻā§ āϤāĻžāĻĻā§āϰ āĻ
āĻā§āϝāύā§āϤāϰā§āĻŖ āĻāĻžāĻāĻĒāĻā§āϞāĻŋ āϏāĻš āĻā§āώāĻŖāĻž āĻāϰāĻž āϏāĻŽā§āĻāĻŦāĨ¤
-
-āĻāĻ āĻāĻžāĻāĻĒāĻā§āϞāĻŋ āĻāĻŦāĻ āĻ
āĻā§āϝāύā§āϤāϰā§āĻŖ āĻāĻžāĻāĻĒāĻā§āϞāĻŋ āĻā§āώāĻŖāĻž āĻāϰāϤā§, āĻāĻĒāύāĻŋ Python āĻŽāĻĄāĻŋāĻāϞ `typing` āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āĻāĻāĻŋ āĻŦāĻŋāĻļā§āώāĻāĻžāĻŦā§ āĻāĻ āĻāĻžāĻāĻĒ āĻšāĻŋāύā§āĻāĻā§āϞāĻŋ āϏāĻŽāϰā§āĻĨāύ āĻāϰāĻžāϰ āĻāύā§āϝ āϰāϝāĻŧā§āĻā§āĨ¤
-
-#### Python āĻāϰ āύāϤā§āύ āϏāĻāϏā§āĻāϰāĻŖ
-
-`typing` āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏāĻāĻŋ Python 3.6 āĻĨā§āĻā§ āϏāϰā§āĻŦāĻļā§āώ āϏāĻāϏā§āĻāϰāĻŖāĻā§āϞāĻŋ āĻĒāϰā§āϝāύā§āϤ, āĻ
āϰā§āĻĨāĻžā§ Python 3.9, Python 3.10 āĻāϤā§āϝāĻžāĻĻāĻŋ āϏāĻš āϏāĻāϞ āϏāĻāϏā§āĻāϰāĻŖā§āϰ āϏāĻžāĻĨā§ **āϏāĻžāĻŽāĻā§āĻāϏā§āϝāĻĒā§āϰā§āĻŖ**āĨ¤
-
-Python āϝāϤ āĻāĻāĻŋāϝāĻŧā§ āϝāĻžāĻā§āĻā§, **āύāϤā§āύ āϏāĻāϏā§āĻāϰāĻŖāĻā§āϞāĻŋ** āĻāĻ āĻāĻžāĻāĻĒ āĻ
ā§āϝāĻžāύā§āĻā§āĻļāύāĻā§āϞāĻŋāϰ āĻāύā§āϝ āϤāϤ āĻāύā§āύāϤ āϏāĻžāĻĒā§āϰā§āĻ āύāĻŋāϝāĻŧā§ āĻāϏāĻā§ āĻāĻŦāĻ āĻ
āύā§āĻ āĻā§āώā§āϤā§āϰ⧠āĻāĻĒāύāĻžāĻā§ āĻāĻžāĻāĻĒ āĻ
ā§āϝāĻžāύā§āĻā§āĻļāύ āĻā§āώāĻŖāĻž āĻāϰāϤ⧠`typing` āĻŽāĻĄāĻŋāĻāϞ āĻāĻŽā§āĻĒā§āϰā§āĻ āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻšāĻŦā§ āύāĻžāĨ¤
-
-āϝāĻĻāĻŋ āĻāĻĒāύāĻŋ āĻāĻĒāύāĻžāϰ āĻĒā§āϰāĻā§āĻā§āĻā§āϰ āĻāύā§āϝ Python-āĻāϰ āĻāϰāĻ āϏāĻžāĻŽā§āĻĒā§āϰāϤāĻŋāĻ āϏāĻāϏā§āĻāϰāĻŖ āύāĻŋāϰā§āĻŦāĻžāĻāύ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ, āϤāĻžāĻšāϞ⧠āĻāĻĒāύāĻŋ āϏā§āĻ āĻ
āϤāĻŋāϰāĻŋāĻā§āϤ āϏāϰāϞāϤāĻž āĻĨā§āĻā§ āϏā§āĻŦāĻŋāϧāĻž āύāĻŋāϤ⧠āĻĒāĻžāϰāĻŦā§āύāĨ¤
-
-āĻĄāĻā§āϏ⧠āϰāϝāĻŧā§āĻā§ Python-āĻāϰ āĻĒā§āϰāϤāĻŋāĻāĻŋ āϏāĻāϏā§āĻāϰāĻŖā§āϰ āϏāĻžāĻĨā§ āϏāĻžāĻŽāĻā§āĻāϏā§āϝāĻĒā§āϰā§āĻŖ āĻāĻĻāĻžāĻšāϰāĻŖāĻā§āϞāĻŋ (āϝāĻāύ āĻĒāĻžāϰā§āĻĨāĻā§āϝ āĻāĻā§)āĨ¤
-
-āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, "**Python 3.6+**" āĻŽāĻžāύ⧠āĻāĻāĻŋ Python 3.6 āĻŦāĻž āϤāĻžāϰ āĻāĻĒāϰ⧠āϏāĻžāĻŽāĻā§āĻāϏā§āϝāĻĒā§āϰā§āĻŖ (āϝāĻžāϰ āĻŽāϧā§āϝ⧠3.7, 3.8, 3.9, 3.10, āĻāϤā§āϝāĻžāĻĻāĻŋ āĻ
āύā§āϤāϰā§āĻā§āĻā§āϤ)āĨ¤ āĻāĻŦāĻ "**Python 3.9+**" āĻŽāĻžāύ⧠āĻāĻāĻŋ Python 3.9 āĻŦāĻž āϤāĻžāϰ āĻāĻĒāϰ⧠āϏāĻžāĻŽāĻā§āĻāϏā§āϝāĻĒā§āϰā§āĻŖ (āϝāĻžāϰ āĻŽāϧā§āϝ⧠3.10, āĻāϤā§āϝāĻžāĻĻāĻŋ āĻ
āύā§āϤāϰā§āĻā§āĻā§āϤ)āĨ¤
-
-āϝāĻĻāĻŋ āĻāĻĒāύāĻŋ Python-āĻāϰ **āϏāϰā§āĻŦāĻļā§āώ āϏāĻāϏā§āĻāϰāĻŖāĻā§āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ**, āϤāĻžāĻšāϞ⧠āϏāϰā§āĻŦāĻļā§āώ āϏāĻāϏā§āĻāϰāĻŖā§āϰ āĻāύā§āϝ āĻāĻĻāĻžāĻšāϰāĻŖāĻā§āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ, āϏā§āĻā§āϞāĻŋ āĻāĻĒāύāĻžāĻā§ **āϏāϰā§āĻŦā§āϤā§āϤāĻŽ āĻāĻŦāĻ āϏāĻšāĻāϤāĻŽ āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏ** āĻĒā§āϰāĻĻāĻžāύ āĻāϰāĻŦā§, āϝā§āĻŽāύ, "**Python 3.10+**"āĨ¤
-
-#### āϞāĻŋāϏā§āĻ
-
-āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāĻāĻāĻŋ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞāĻā§ `str`-āĻāϰ āĻāĻāĻāĻŋ `list` āĻšāĻŋāϏā§āĻŦā§ āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰāĻž āϝāĻžāĻāĨ¤
-
-//// 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!}
-```
-
-āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞāĻāĻŋ āĻā§āώāĻŖāĻž āĻāϰā§āύ, āĻāĻāĻ āĻā§āϞāύ (`:`) āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āĨ¤
-
-āĻāĻžāĻāĻĒ āĻšāĻŋāϏā§āĻŦā§, `typing` āĻĨā§āĻā§ āĻāĻĒāύāĻžāϰ āĻāĻŽā§āĻĒā§āϰā§āĻ āĻāϰāĻž `List` āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤
-
-āϝā§āĻšā§āϤ⧠āϞāĻŋāϏā§āĻ āĻāĻŽāύ āĻāĻāĻāĻŋ āĻāĻžāĻāĻĒ āϝāĻž āĻ
āĻā§āϝāύā§āϤāϰā§āĻŖ āĻāĻžāĻāĻĒāĻā§āϞāĻŋ āϧāĻžāϰāĻŖ āĻāϰā§, āĻāĻĒāύāĻŋ āϤāĻžāĻĻā§āϰ āϏā§āĻā§āϝāĻŧāĻžāϰ āĻŦā§āϰāĻžāĻā§āĻā§āϰ āĻāĻŋāϤāϰ⧠āĻāϰā§āύ:
-
-```Python hl_lines="4"
-{!> ../../docs_src/python_types/tutorial006.py!}
-```
-
-////
-
-/// info
-
-āϏā§āĻā§āϝāĻŧāĻžāϰ āĻŦā§āϰāĻžāĻā§āĻ āĻāϰ āĻāĻŋāϤāϰ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻāĻāϏāĻŦ āĻ
āĻāύā§āϤāϰā§āύ āĻāĻžāĻāĻĒāĻā§āϞā§āĻā§ "āĻāύā§āĻāĻžāϰāύāĻžāϞ āĻāĻžāĻāĻĒ" āĻŦāϞā§āĨ¤
-
-āĻāĻ āĻāĻĻāĻžāĻšāϰāĻŖā§, āĻāĻāĻŋ āĻšāĻā§āĻā§ `List`(āĻ
āĻĨāĻŦāĻž āĻĒāĻžāĻāĻĨāύ ā§Š.⧝ āĻŦāĻž āϤāĻžāϰ āĻāĻĒāϰā§āϰ āϏāĻāϏā§āĻāϰāĻŖā§āϰ āĻā§āώā§āϤā§āϰ⧠`list`) āĻ āĻĒāĻžāϏ āĻāϰāĻž āĻāĻžāĻāĻĒ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰāĨ¤
-
-///
-
-āĻāϰ āĻ
āϰā§āĻĨ āĻšāĻā§āĻā§: "āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ `items` āĻāĻāĻāĻŋ `list`, āĻāĻŦāĻ āĻāĻ āϞāĻŋāϏā§āĻā§āϰ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāĻāĻā§āĻŽ āĻāĻāĻāĻŋ `str`āĨ¤"
-
-/// tip
-
-āϝāĻĻāĻŋ āĻāĻĒāύāĻŋ Python 3.9 āĻŦāĻž āϤāĻžāϰ āĻāĻĒāϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ, āĻāĻĒāύāĻžāϰ `typing` āĻĨā§āĻā§ `List` āĻāĻŽāĻĻāĻžāύāĻŋ āĻāϰāϤ⧠āĻšāĻŦā§ āύāĻž, āĻāĻĒāύāĻŋ āϏāĻžāϧāĻžāϰāĻŖ `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` āϝāĻž ā§ŠāĻāĻŋ āĻāĻāĻā§āĻŽ āϧāĻžāϰāĻŖ āĻāϰā§, āĻāĻāĻāĻŋ `int`, āĻ
āύā§āϝ āĻāĻāĻāĻŋ `int`, āĻāĻŦāĻ āĻāĻāĻāĻŋ `str`āĨ¤
-* āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ `items_s` āĻšāϞ āĻāĻāĻāĻŋ `set`, āĻāĻŦāĻ āĻāϰ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāĻāĻā§āĻŽ āĻšāϞ `bytes` āĻāĻžāĻāĻĒā§āϰāĨ¤
-
-#### āĻĄāĻŋāĻā§āĻ
-
-āĻāĻāĻāĻŋ `dict` āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰāϤā§, āĻāĻĒāύāĻŋ ⧍āĻāĻŋ āĻāĻžāĻāĻĒ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻāĻŽāĻž āĻĻā§āĻŦāĻžāϰāĻž āĻĒā§āĻĨāĻ āĻāϰ⧠āĻĻā§āĻŦā§āύāĨ¤
-
-āĻĒā§āϰāĻĨāĻŽ āĻāĻžāĻāĻĒ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰāĻāĻŋ āĻšāϞ `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`āĨ¤
-
-Python 3.6 āĻāĻŦāĻ āϤāĻžāϰ āĻāĻĒāϰā§āϰ āϏāĻāϏā§āĻāϰāĻŖāĻā§āϞāĻŋāϤ⧠(Python 3.10 āĻ
āύā§āϤāϰā§āĻā§āĻā§āϤ) āĻāĻĒāύāĻŋ `typing` āĻĨā§āĻā§ `Union` āĻāĻžāĻāĻĒ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ āĻāĻŦāĻ āϏā§āĻā§āϝāĻŧāĻžāϰ āĻŦā§āϰā§āϝāĻžāĻā§āĻā§āϰ āĻŽāϧā§āϝ⧠āĻā§āϰāĻšāĻŖāϝā§āĻā§āϝ āĻāĻžāĻāĻĒāĻā§āϞāĻŋ āϰāĻžāĻāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
-
-Python 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`-āĻ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤
-
-Python 3.6 āĻāĻŦāĻ āϤāĻžāϰ āĻāĻĒāϰā§āϰ āϏāĻāϏā§āĻāϰāĻŖāĻā§āϞāĻŋāϤ⧠(Python 3.10 āĻ
āύāϤāϰā§āĻā§āĻā§āϤ) āĻāĻĒāύāĻŋ `typing` āĻŽāĻĄāĻŋāĻāϞ āĻĨā§āĻā§ `Optional` āĻāĻŽāĻĒā§āϰā§āĻ āĻāϰ⧠āĻāĻāĻŋ āĻā§āώāĻŖāĻž āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
-
-```Python hl_lines="1 4"
-{!../../docs_src/python_types/tutorial009.py!}
-```
-
-`Optional[str]` āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻŽāĻžāύ⧠āĻšāϞ āĻļā§āϧ⧠`str` āύāϝāĻŧ, āĻāĻāĻŋ āĻšāϤ⧠āĻĒāĻžāϰ⧠`None`-āĻ, āϝāĻž āĻāĻĒāύāĻžāϰ āĻāĻĄāĻŋāĻāϰāĻā§ āϏā§āĻ āϤā§āϰā§āĻāĻŋāĻā§āϞāĻŋ āĻļāύāĻžāĻā§āϤ āĻāϰāϤ⧠āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰāĻŦā§ āϝā§āĻāĻžāύ⧠āĻāĻĒāύāĻŋ āϧāϰ⧠āύāĻŋāĻā§āĻā§āύ āϝ⧠āĻāĻāĻāĻŋ āĻŽāĻžāύ āϏāĻŦāϏāĻŽāϝāĻŧ `str` āĻšāĻŦā§, āĻ
āĻĨāĻ āĻāĻāĻŋ `None`-āĻ āĻšāϤ⧠āĻĒāĻžāϰā§āĻāĨ¤
-
-`Optional[Something]` āĻŽā§āϞāϤ `Union[Something, None]`-āĻāϰ āĻāĻāĻāĻŋ āĻļāϰā§āĻāĻāĻžāĻ, āĻāĻŦāĻ āϤāĻžāϰāĻž āϏāĻŽāϤā§āϞā§āϝāĨ¤
-
-āĻāϰ āĻŽāĻžāύ⧠āĻšāϞ, Python 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` āĻŦā§āϝāĻŦāĻšāĻžāϰ
-
-āϝāĻĻāĻŋ āĻāĻĒāύāĻŋ Python 3.10-āĻāϰ āύā§āĻā§āϰ āϏāĻāϏā§āĻāϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ, āϤāĻŦā§ āĻāĻāĻžāύ⧠āĻāĻŽāĻžāϰ āĻā§āĻŦāĻ **āĻŦā§āϝāĻā§āϤāĻŋāĻāϤ** āĻĻā§āώā§āĻāĻŋāĻāĻā§āĻāĻŋ āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻāĻŋāĻĒāϏ:
-
-* đ¨ `Optional[SomeType]` āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāĻĄāĻŧāĻŋāϝāĻŧā§ āĻāϞā§āύāĨ¤
-* āĻāϰ āĻĒāϰāĻŋāĻŦāϰā§āĻ¤ā§ â¨ **`Union[SomeType, None]` āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ** â¨āĨ¤
-
-āĻāĻāϝāĻŧāĻ āϏāĻŽāϤā§āϞā§āϝ āĻāĻŦāĻ āĻŽā§āϞ⧠āĻāĻāĻ, āĻāĻŋāύā§āϤ⧠āĻāĻŽāĻŋ `Union`-āĻāϰ āĻĒāĻā§āώ⧠āϏā§āĻĒāĻžāϰāĻŋāĻļ āĻāϰāĻŦ āĻāĻžāϰāĻŖ "**āĻ
āĻĒāĻļāύāĻžāϞ**" āĻļāĻŦā§āĻĻāĻāĻŋ āĻŽāύ⧠āĻšāϤ⧠āĻĒāĻžāϰ⧠āϝ⧠āĻŽāĻžāύāĻāĻŋ āĻāĻā§āĻāĻŋāĻ,āĻ
āĻĨāĻ āĻāĻāĻŋ āĻāϏāϞ⧠āĻŽāĻžāύ⧠"āĻāĻāĻŋ āĻšāϤ⧠āĻĒāĻžāϰ⧠`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 āĻŦā§āϧ đ
-```
-
-āϏā§āĻāĻŦāϰ āĻšāϞ, āĻāĻāĻŦāĻžāϰ āĻāĻĒāύāĻŋ Python 3.10 āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻļā§āϰ⧠āĻāϰāϞā§, āĻāĻĒāύāĻžāĻā§ āĻāĻā§āϞā§āϰ āĻŦā§āϝāĻžāĻĒāĻžāϰ⧠āĻāϰ āĻāĻŋāύā§āϤāĻž āĻāϰāϤ⧠āĻšāĻŦā§ āύāĻž, āϝā§āĻšā§āϤ⧠āĻāĻĒāύāĻŋ | āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āĻ āĻāĻāύāĻŋāϝāĻŧāύ āĻā§āώāĻŖāĻž āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύ:
-
-{* ../../docs_src/python_types/tutorial009c_py310.py hl[1,4] *}
-
-
-āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ āĻāĻĒāύāĻžāĻā§ āύāĻžāĻŽāĻā§āϞāĻŋ āϝā§āĻŽāύ `Optional` āĻāĻŦāĻ `Union` āύāĻŋāϝāĻŧā§ āĻāϰ āĻāĻŋāύā§āϤāĻž āĻāϰāϤ⧠āĻšāĻŦā§ āύāĻžāĨ¤ đ
-
-#### āĻā§āύā§āϰāĻŋāĻ āĻāĻžāĻāĻĒāϏ
-
-āϏā§āĻā§āϝāĻŧāĻžāϰ āĻŦā§āϰā§āϝāĻžāĻā§āĻā§ āĻāĻžāĻāĻĒ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āύā§āĻāϝāĻŧāĻž āĻāĻ āĻāĻžāĻāĻĒāĻā§āϞāĻŋāĻā§ **āĻā§āύā§āϰāĻŋāĻ āĻāĻžāĻāĻĒ** āĻŦāĻž **āĻā§āύā§āϰāĻŋāĻāϏ** āĻŦāϞāĻž āĻšāϝāĻŧ, āϝā§āĻŽāύ:
-
-//// tab | Python 3.10+
-
-āĻāĻĒāύāĻŋ āϏā§āĻ āĻāĻāĻ āĻŦāĻŋāϞā§āĻāĻāύ āĻāĻžāĻāĻĒ āĻā§āύā§āϰāĻŋāĻā§āϏ āĻšāĻŋāϏā§āĻŦā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύ(āĻāĻŋāϤāϰ⧠āĻāĻžāĻāĻĒ āϏāĻš āϏā§āĻāϝāĻŧāĻžāϰ⧠āĻŦā§āϰāĻžāĻā§āĻ āĻĻāĻŋāϝāĻŧā§):
-
-* `list`
-* `tuple`
-* `set`
-* `dict`
-
-āĻāĻŦāĻ Python 3.8 āĻāϰ āĻŽāϤā§āĻ, `typing` āĻŽāĻĄāĻŋāĻāϞ āĻĨā§āĻā§:
-
-* `Union`
-* `Optional` (Python 3.8 āĻāϰ āĻŽāϤā§āĻ)
-* ...āĻāĻŦāĻ āĻ
āύā§āϝāĻžāύā§āϝāĨ¤
-
-Python 3.10-āĻ, `Union` āĻāĻŦāĻ `Optional` āĻā§āύā§āϰāĻŋāĻāϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āĻŦāĻŋāĻāϞā§āĻĒ āĻšāĻŋāϏā§āĻŦā§, āĻāĻĒāύāĻŋ āĻāĻžāĻāĻĒāĻā§āϞāĻŋāϰ āĻāĻāύāĻŋāϝāĻŧāύ āĻā§āώāĻŖāĻž āĻāϰāϤ⧠āĻāĻžāϰā§āĻāĻŋāĻāĻžāϞ āĻŦāĻžāϰ (`|`) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ, āϝāĻž āĻāĻĻā§āϰ āĻĨā§āĻā§ āĻ
āύā§āĻ āĻāĻžāϞ⧠āĻāĻŦāĻ āϏāĻšāĻāĨ¤
-
-////
-
-//// tab | Python 3.9+
-
-āĻāĻĒāύāĻŋ āϏā§āĻ āĻāĻāĻ āĻŦāĻŋāϞā§āĻāĻāύ āĻāĻžāĻāĻĒ āĻā§āύā§āϰāĻŋāĻā§āϏ āĻšāĻŋāϏā§āĻŦā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύ(āĻāĻŋāϤāϰ⧠āĻāĻžāĻāĻĒ āϏāĻš āϏā§āĻāϝāĻŧāĻžāϰ⧠āĻŦā§āϰāĻžāĻā§āĻ āĻĻāĻŋāϝāĻŧā§):
-
-* `list`
-* `tuple`
-* `set`
-* `dict`
-
-āĻāĻŦāĻ Python 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](https://docs.pydantic.dev/) āĻšāϞ āĻāĻāĻāĻŋ Python āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āϝāĻž āĻĄāĻžāĻāĻž āĻā§āϝāĻžāϞāĻŋāĻĄā§āĻļāύ āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻāϰā§āĨ¤
-
-āĻāĻĒāύāĻŋ āĻĄāĻžāĻāĻžāϰ "āĻāĻāĻžāϰ" āĻāĻā§āϰāĻŋāĻŦāĻŋāĻāĻ āϏāĻš āĻā§āϞāĻžāϏ āĻšāĻŋāϏā§āĻŦā§ āĻā§āώāĻŖāĻž āĻāϰā§āύāĨ¤
-
-āĻāĻŦāĻ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāĻā§āϰāĻŋāĻŦāĻŋāĻāĻ āĻāϰ āĻāĻāĻāĻŋ āĻāĻžāĻāĻĒ āĻĨāĻžāĻā§āĨ¤
-
-āϤāĻžāϰāĻĒāϰ āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻŋāĻā§ āĻŽāĻžāύ āĻĻāĻŋāϝāĻŧā§ āϏā§āĻ āĻā§āϞāĻžāϏā§āϰ āĻāĻāĻāĻŋ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ āϤā§āϰāĻŋ āĻāϰā§āύ-- āĻāĻāĻŋ āĻŽāĻžāύāĻā§āϞāĻŋāĻā§ āĻā§āϝāĻžāϞāĻŋāĻĄā§āĻ āĻāϰāĻŦā§, āĻĒā§āϰāϝāĻŧā§āĻāύ āĻ
āύā§āϝāĻžāϝāĻŧā§ āϤāĻžāĻĻā§āϰāĻā§ āĻāĻĒāϝā§āĻā§āϤ āĻāĻžāĻāĻĒā§ āϰā§āĻĒāĻžāύā§āϤāϰ āĻāϰāĻŦā§ āĻāĻŦāĻ āĻāĻĒāύāĻžāĻā§ āϏāĻŽāϏā§āϤ āĻĄāĻžāĻāĻž āϏāĻš āĻāĻāĻāĻŋ āĻ
āĻŦāĻā§āĻā§āĻ āĻĒā§āϰāĻĻāĻžāύ āĻāϰāĻŦā§āĨ¤
-
-āĻāĻŦāĻ āĻāĻĒāύāĻŋ āϏā§āĻ āĻĢāϞāĻžāĻĢāϞ āĻ
āĻŦāĻā§āĻā§āĻā§āϰ āϏāĻžāĻĨā§ āĻāĻĄāĻŋāĻāϰ āϏāĻžāĻĒā§āϰā§āĻ āĻĒāĻžāĻŦā§āύāĨ¤
-
-āĻ
āĻĢāĻŋāϏāĻŋāϝāĻŧāĻžāϞ 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 āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāϰāĻ āĻāĻžāύāϤā§, āĻāϰ āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύ āĻĻā§āĻā§āύ](https://docs.pydantic.dev/)āĨ¤
-
-///
-
-**FastAPI** āĻŽā§āϞāϤ Pydantic-āĻāϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻŽāĻŋāϤāĨ¤
-
-āĻāĻĒāύāĻŋ āĻāĻ āϏāĻŽāϏā§āϤ āĻāĻŋāĻā§āϰ āĻ
āύā§āĻ āĻŦāĻžāϏā§āϤāĻŦāϏāĻŽā§āĻŽāϤ āĻāĻĻāĻžāĻšāϰāĻŖ āĻĒāĻžāĻŦā§āύ [āĻāĻŋāĻāĻā§āϰāĻŋāϝāĻŧāĻžāϞ - āĻāĻāĻāĻžāϰ āĻāĻžāĻāĻĄā§](https://fastapi.tiangolo.com/tutorial/)āĨ¤
-
-/// tip
-
-āϝāĻāύ āĻāĻĒāύāĻŋ `Optional` āĻŦāĻž `Union[Something, None]` āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ āĻāĻŦāĻ āĻā§āύ⧠āĻĄāĻŋāĻĢāϞā§āĻ āĻŽāĻžāύ āύāĻž āĻĨāĻžāĻā§, Pydantic-āĻāϰ āĻāĻāĻāĻŋ āĻŦāĻŋāĻļā§āώ āĻāĻāϰāĻŖ āϰāϝāĻŧā§āĻā§, āĻāĻĒāύāĻŋ Pydantic āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύ⧠[Required Optional fields](https://docs.pydantic.dev/latest/concepts/models/#required-optional-fields) āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāϰāĻ āĻĒāĻĄāĻŧāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
-
-///
-
-## āĻŽā§āĻāĻžāĻĄāĻžāĻāĻž āĻ
ā§āϝāĻžāύā§āĻā§āĻļāύ āϏāĻš āĻāĻžāĻāĻĒ āĻšāĻŋāύā§āĻāϏ
-
-Python-āĻ āĻāĻŽāύ āĻāĻāĻāĻŋ āĻĢāĻŋāĻāĻžāϰ āĻāĻā§ āϝāĻž `Annotated` āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻ āĻāĻžāĻāĻĒ āĻšāĻŋāύā§āĻāĻā§āϞāĻŋāϤ⧠**āĻ
āϤāĻŋāϰāĻŋāĻā§āϤ āĻŽā§āĻāĻžāĻĄāĻžāĻāĻž** āϰāĻžāĻāϤ⧠āĻĻā§āϝāĻŧāĨ¤
-
-//// tab | Python 3.9+
-
-Python 3.9-āĻ, `Annotated` āϏā§āĻā§āϝāĻžāύā§āĻĄāĻžāϰā§āĻĄ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋāϤ⧠āĻ
āύā§āϤāϰā§āĻā§āĻā§āϤ, āϤāĻžāĻ āĻāĻĒāύāĻŋ āĻāĻāĻŋ `typing` āĻĨā§āĻā§ āĻāĻŽāĻĒā§āϰā§āĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
-
-```Python hl_lines="1 4"
-{!> ../../docs_src/python_types/tutorial013_py39.py!}
-```
-
-////
-
-//// tab | Python 3.8+
-
-Python 3.9-āĻāϰ āύā§āĻā§āϰ āϏāĻāϏā§āĻāϰāĻŖāĻā§āϞāĻŋāϤā§, āĻāĻĒāύāĻŋ `Annotated`-āĻā§ `typing_extensions` āĻĨā§āĻā§ āĻāĻŽāĻĒā§āϰā§āĻ āĻāϰā§āύāĨ¤
-
-āĻāĻāĻŋ **FastAPI** āĻāϰ āϏāĻžāĻĨā§ āĻāϤāĻŋāĻŽāĻĻā§āϧ⧠āĻāύāϏā§āĻāϞ āĻšāϝāĻŧā§ āĻĨāĻžāĻāĻŦā§āĨ¤
-
-```Python hl_lines="1 4"
-{!> ../../docs_src/python_types/tutorial013.py!}
-```
-
-////
-
-Python āύāĻŋāĻā§ āĻāĻ `Annotated` āĻĻāĻŋāϝāĻŧā§ āĻāĻŋāĻā§āĻ āĻāϰ⧠āύāĻžāĨ¤ āĻāĻŦāĻ āĻāĻĄāĻŋāĻāϰ āĻāĻŦāĻ āĻ
āύā§āϝāĻžāύā§āϝ āĻā§āϞāĻā§āϞāĻŋāϰ āĻāύā§āϝ, āĻāĻžāĻāĻĒāĻāĻŋ āĻāĻāύāĻ `str`āĨ¤
-
-āĻāĻŋāύā§āϤ⧠āĻāĻĒāύāĻŋ āĻāĻ `Annotated` āĻāϰ āĻŽāϧā§āϝāĻāĻžāϰ āĻāĻžāϝāĻŧāĻāĻžāĻāĻŋāϰ āĻŽāϧā§āϝ⧠**FastAPI**-āĻ āĻā§āĻāĻžāĻŦā§ āĻāĻĒāύāĻžāϰ āĻ
ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āĻāĻāϰāĻŖ āĻāϰā§āĻ āϤāĻž āϏāĻŽā§āĻĒāϰā§āĻā§ āĻ
āϤāĻŋāϰāĻŋāĻā§āϤ āĻŽā§āĻāĻžāĻĄāĻžāĻāĻž āĻĒā§āϰāĻĻāĻžāύ āĻāϰāĻžāϰ āĻāύā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
-
-āĻŽāύ⧠āϰāĻžāĻāĻžāϰ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āĻŦāĻŋāώāϝāĻŧ āĻšāϞ āϝ⧠**āĻĒā§āϰāĻĨāĻŽ *āĻāĻžāĻāĻĒ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ*** āĻāĻĒāύāĻŋ `Annotated`-āĻ āĻĒāĻžāϏ āĻāϰā§āύ āϏā§āĻāĻŋ āĻšāϞ **āĻāϏāϞ āĻāĻžāĻāĻĒ**āĨ¤ āĻŦāĻžāĻāĻŋ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻ
āύā§āϝāĻžāύā§āϝ āĻā§āϞāĻā§āϞāĻŋāϰ āĻāύā§āϝ āĻŽā§āĻāĻžāĻĄāĻžāĻāĻžāĨ¤
-
-āĻāĻāύ āĻāĻĒāύāĻžāϰ āĻā§āĻŦāϞ āĻāĻžāύāĻž āĻĒā§āϰāϝāĻŧā§āĻāύ āϝ⧠`Annotated` āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ, āĻāĻŦāĻ āĻāĻāĻŋ āϏā§āĻā§āϝāĻžāύā§āĻĄāĻžāϰā§āĻĄ PythonāĨ¤ đ
-
-āĻĒāϰāĻŦāϰā§āϤā§āϤ⧠āĻāĻĒāύāĻŋ āĻĻā§āĻāĻŦā§āύ āĻāĻāĻŋ āĻāϤāĻāĻž **āĻļāĻā§āϤāĻŋāĻļāĻžāϞā§** āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤
-
-/// tip
-
-āĻāĻāĻŋ **āϏā§āĻā§āϝāĻžāύā§āĻĄāĻžāϰā§āĻĄ Python** āĻšāĻāϝāĻŧāĻžāϰ āĻŽāĻžāύ⧠āĻšāϞ āĻāĻĒāύāĻŋ āĻāĻĒāύāĻžāϰ āĻāĻĄāĻŋāĻāϰā§, āĻāĻĒāύāĻŋ āϝ⧠āĻā§āϞāĻā§āϞāĻŋ āĻā§āĻĄ āĻŦāĻŋāĻļā§āϞā§āώāĻŖ āĻāĻŦāĻ āϰāĻŋāĻĢā§āϝāĻžāĻā§āĻāϰ āĻāϰāĻžāϰ āĻāύā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ āϤāĻžāϤ⧠**āϏā§āϰāĻž āϏāĻŽā§āĻāĻžāĻŦā§āϝ āĻĄā§āĻā§āϞāĻĒāĻžāϰ āĻāĻā§āϏāĻĒā§āϰāĻŋāϝāĻŧā§āύā§āϏ** āĻĒāĻžāĻŦā§āύāĨ¤ â¨
-
-āĻāĻŦāĻ āĻāĻāĻžāĻĄāĻŧāĻžāĻ āĻāĻĒāύāĻžāϰ āĻā§āĻĄ āĻ
āύā§āϝāĻžāύā§āϝ āĻ
āύā§āĻ Python āĻā§āϞ āĻāĻŦāĻ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āĻā§āĻŦ āϏāĻžāĻŽāĻā§āĻāϏā§āϝāĻĒā§āϰā§āĻŖ āĻšāĻŦā§āĨ¤ đ
-
-///
-
-## **FastAPI**-āĻ āĻāĻžāĻāĻĒ āĻšāĻŋāύā§āĻāϏ
-
-**FastAPI** āĻāĻ āĻāĻžāĻāĻĒ āĻšāĻŋāύā§āĻāĻā§āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻŦā§āĻļ āĻāĻŋāĻā§ āĻāĻŋāύāĻŋāϏ āĻāϰā§āĨ¤
-
-**FastAPI**-āĻ āĻāĻĒāύāĻŋ āĻāĻžāĻāĻĒ āĻšāĻŋāύā§āĻāĻā§āϞāĻŋ āϏāĻš āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻā§āώāĻŖāĻž āĻāϰā§āύ āĻāĻŦāĻ āĻāĻĒāύāĻŋ āĻĒāĻžāύ:
-
-* **āĻāĻĄāĻŋāĻāϰ āϏāĻžāĻĒā§āϰā§āĻ**āĨ¤
-* **āĻāĻžāĻāĻĒāĻā§āĻ**āĨ¤
-
-...āĻāĻŦāĻ **FastAPI** āĻāĻāĻ āĻā§āώāĻŖāĻžāĻā§āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§:
-
-* **āϰāĻŋāĻā§āĻāϰā§āĻŽā§āύā§āĻāϏ āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰā§**: āϰāĻŋāĻā§āϝāĻŧā§āϏā§āĻ āĻĒāĻžāĻĨ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ, āĻā§āϝāĻŧā§āϰāĻŋ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ, āĻšā§āĻĄāĻžāϰ, āĻŦāĻĄāĻŋ, āĻĄāĻŋāĻĒā§āύā§āĻĄā§āύā§āϏāĻŋāϏ, āĻāϤā§āϝāĻžāĻĻāĻŋ āĻĨā§āĻā§āĨ¤
-* **āĻĄā§āĻāĻž āϰā§āĻĒāĻžāύā§āϤāϰ āĻāϰā§**: āϰāĻŋāĻā§āϝāĻŧā§āϏā§āĻ āĻĨā§āĻā§ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ āĻāĻžāĻāĻĒā§ āĻĄā§āĻāĻžāĨ¤
-* **āĻĄā§āĻāĻž āϝāĻžāĻāĻžāĻ āĻāϰā§**: āĻĒā§āϰāϤāĻŋāĻāĻŋ āϰāĻŋāĻā§āϝāĻŧā§āϏā§āĻ āĻĨā§āĻā§ āĻāϏāĻž āĻĄā§āĻāĻž:
- * āϝāĻāύ āĻĄā§āĻāĻž āĻ
āĻŦā§āϧ āĻšāϝāĻŧ āϤāĻāύ **āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧ āϤā§āϰā§āĻāĻŋ** āĻā§āϰāĻžāĻšāĻā§āϰ āĻāĻžāĻā§ āĻĢā§āϰāϤ āĻĒāĻžāĻ āĻžāύā§āĨ¤
-* **API āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύ āϤā§āϰāĻŋ āĻāϰā§**: OpenAPI āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§:
- * āϝāĻž āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧ āĻāύā§āĻāĻžāϰâā§āϝāĻžāĻā§āĻāĻŋāĻ āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύ āĻāĻāĻāĻžāϰ āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻĻā§āĻŦāĻžāϰāĻž āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāϝāĻŧāĨ¤
-
-āĻāĻ āϏāĻŦ āĻāĻŋāĻā§ āĻāĻĒāύāĻžāϰ āĻāĻžāĻā§ āĻ
āϏā§āĻĒāώā§āĻ āĻŽāύ⧠āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻŋāύā§āϤāĻž āĻāϰāĻŦā§āύ āύāĻžāĨ¤ āĻāĻĒāύāĻŋ [āĻāĻŋāĻāĻā§āϰāĻŋāϝāĻŧāĻžāϞ - āĻāĻāĻāĻžāϰ āĻāĻžāĻāĻĄ](https://fastapi.tiangolo.com/tutorial/) āĻ āĻāĻ āϏāĻŦ āĻāĻŋāĻā§ āĻĒā§āϰā§āϝāĻžāĻāĻāĻŋāϏ⧠āĻĻā§āĻāϤ⧠āĻĒāĻžāĻŦā§āύāĨ¤
-
-āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āĻŦāĻŋāώāϝāĻŧ āĻšāϞ, āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āϏā§āĻā§āϝāĻžāύā§āĻĄāĻžāϰā§āĻĄ Python āĻāĻžāĻāĻĒāĻā§āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ, āϤāĻŦā§ āĻāϰāĻ āĻŦā§āĻļāĻŋ āĻā§āϞāĻžāϏ, āĻĄā§āĻā§āϰā§āĻāϰ āĻāϤā§āϝāĻžāĻĻāĻŋ āϝā§āĻ āύāĻž āĻāϰā§āĻ āĻāĻāĻ āϏā§āĻĨāĻžāύ⧠**FastAPI** āĻāĻĒāύāĻžāϰ āĻ
āύā§āĻ āĻāĻžāĻ āĻāϰ⧠āĻĻāĻŋāĻŦā§āĨ¤
-
-/// info
-
-āϝāĻĻāĻŋ āĻāĻĒāύāĻŋ āĻāĻŋāĻāĻā§āϰāĻŋāϝāĻŧāĻžāϞā§āϰ āϏāĻŽāϏā§āϤ āĻŦāĻŋāώāϝāĻŧ āĻĒāĻĄāĻŧā§ āĻĢā§āϞ⧠āĻĨāĻžāĻā§āύ āĻāĻŦāĻ āĻāĻžāĻāĻĒ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāϰāĻ āĻāĻžāύāϤ⧠āĻāĻžāύ, āϤāĻŦā§ āĻāĻāĻāĻŋ āĻāĻžāϞ⧠āϰāĻŋāϏā§āϰā§āϏ āĻšāϞ [mypy āĻāϰ "cheat sheet"](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html)āĨ¤ āĻāĻ "cheat sheet" āĻ āĻāĻĒāύāĻŋ Python āĻāĻžāĻāĻĒ āĻšāĻŋāύā§āĻ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻŦā§āϏāĻŋāĻ āĻĨā§āĻā§ āĻāύā§āύāϤ āϞā§āĻā§āϞā§āϰ āϧāĻžāϰāĻŖāĻž āĻĒā§āϤ⧠āĻĒāĻžāϰā§āύ, āϝāĻž āĻāĻĒāύāĻžāϰ āĻā§āĻĄā§ āĻāĻžāĻāĻĒ āϏā§āĻĢāĻāĻŋ āĻāĻŦāĻ āϏā§āĻĒāώā§āĻāϤāĻž āĻŦāĻžāĻĄāĻŧāĻžāϤ⧠āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰāĻŦā§āĨ¤
-
-///
diff --git a/docs/bn/mkdocs.yml b/docs/bn/mkdocs.yml
deleted file mode 100644
index de18856f4..000000000
--- a/docs/bn/mkdocs.yml
+++ /dev/null
@@ -1 +0,0 @@
-INHERIT: ../en/mkdocs.yml
diff --git a/docs/de/docs/_llm-test.md b/docs/de/docs/_llm-test.md
new file mode 100644
index 000000000..4a5e5392c
--- /dev/null
+++ b/docs/de/docs/_llm-test.md
@@ -0,0 +1,503 @@
+# LLM-Testdatei { #llm-test-file }
+
+Dieses Dokument testet, ob das LLM, das die Dokumentation Ãŧbersetzt, den `general_prompt` in `scripts/translate.py` und den sprachspezifischen Prompt in `docs/{language code}/llm-prompt.md` versteht. Der sprachspezifische Prompt wird an `general_prompt` angehängt.
+
+Hier hinzugefÃŧgte Tests werden von allen Erstellern sprachspezifischer Prompts gesehen.
+
+So verwenden:
+
+* Einen sprachspezifischen Prompt haben â `docs/{language code}/llm-prompt.md`.
+* Eine frische Ãbersetzung dieses Dokuments in die gewÃŧnschte Zielsprache durchfÃŧhren (siehe z. B. das Kommando `translate-page` der `translate.py`). Dadurch wird die Ãbersetzung unter `docs/{language code}/docs/_llm-test.md` erstellt.
+* PrÃŧfen Sie, ob in der Ãbersetzung alles in Ordnung ist.
+* Verbessern Sie bei Bedarf Ihren sprachsspezifischen Prompt, den allgemeinen Prompt oder das englische Dokument.
+* Beheben Sie anschlieÃend manuell die verbleibenden Probleme in der Ãbersetzung, sodass es eine gute Ãbersetzung ist.
+* Ãbersetzen Sie erneut, nachdem die gute Ãbersetzung vorliegt. Das ideale Ergebnis wäre, dass das LLM an der Ãbersetzung keine Ãnderungen mehr vornimmt. Das bedeutet, dass der allgemeine Prompt und Ihr sprachsspezifischer Prompt so gut sind, wie sie sein kÃļnnen (Es wird manchmal ein paar scheinbar zufällige Ãnderungen machen, der Grund ist, dass LLMs keine deterministischen Algorithmen sind).
+
+Die Tests:
+
+## Codeschnipsel { #code-snippets}
+
+//// tab | Test
+
+Dies ist ein Codeschnipsel: `foo`. Und dies ist ein weiteres Codeschnipsel: `bar`. Und noch eins: `baz quux`.
+
+////
+
+//// tab | Info
+
+Der Inhalt von Codeschnipseln sollte unverändert bleiben.
+
+Siehe Abschnitt `### Content of code snippets` im allgemeinen Prompt in `scripts/translate.py`.
+
+////
+
+## AnfÃŧhrungszeichen { #quotes }
+
+//// tab | Test
+
+Gestern schrieb mein Freund: âWenn man unkorrekt korrekt schreibt, hat man es unkorrekt geschriebenâ. Worauf ich antwortete: âKorrekt, aber âunkorrektâ ist unkorrekterweise nicht ââunkorrektâââ.
+
+/// note | Hinweis
+
+Das LLM wird dies wahrscheinlich falsch Ãŧbersetzen. Interessant ist nur, ob es die korrigierte Ãbersetzung bei einer erneuten Ãbersetzung beibehält.
+
+///
+
+////
+
+//// tab | Info
+
+Der Prompt-Designer kann entscheiden, ob neutrale AnfÃŧhrungszeichen in typografische AnfÃŧhrungszeichen umgewandelt werden sollen. Es ist in Ordnung, sie unverändert zu lassen.
+
+Siehe zum Beispiel den Abschnitt `### Quotes` in `docs/de/llm-prompt.md`.
+
+////
+
+## AnfÃŧhrungszeichen in Codeschnipseln { #quotes-in-code-snippets}
+
+//// tab | Test
+
+`pip install "foo[bar]"`
+
+Beispiele fÃŧr Stringliterale in Codeschnipseln: `"this"`, `'that'`.
+
+Ein schwieriges Beispiel fÃŧr Stringliterale in Codeschnipseln: `f"I like {'oranges' if orange else "apples"}"`
+
+Hardcore: `Yesterday, my friend wrote: "If you spell incorrectly correctly, you have spelled it incorrectly". To which I answered: "Correct, but 'incorrectly' is incorrectly not '"incorrectly"'"`
+
+////
+
+//// tab | Info
+
+... Allerdings mÃŧssen AnfÃŧhrungszeichen in Codeschnipseln unverändert bleiben.
+
+////
+
+## CodeblÃļcke { #code-blocks }
+
+//// tab | Test
+
+Ein Bash-Codebeispiel ...
+
+```bash
+# Eine BegrÃŧÃung an das Universum ausgeben
+echo "Hello universe"
+```
+
+... und ein Konsolen-Codebeispiel ...
+
+```console
+$ fastapi run main.py
+ FastAPI Starting server
+ Searching for package file structure
+```
+
+... und noch ein Konsolen-Codebeispiel ...
+
+```console
+// Ein Verzeichnis âCodeâ erstellen
+$ mkdir code
+// In dieses Verzeichnis wechseln
+$ cd code
+```
+
+... und ein Python-Codebeispiel ...
+
+```Python
+wont_work() # Das wird nicht funktionieren đą
+works(foo="bar") # Das funktioniert đ
+```
+
+... und das war's.
+
+////
+
+//// tab | Info
+
+Code in CodeblÃļcken sollte nicht verändert werden, mit Ausnahme von Kommentaren.
+
+Siehe Abschnitt `### Content of code blocks` im allgemeinen Prompt in `scripts/translate.py`.
+
+////
+
+## Tabs und farbige Boxen { #tabs-and-colored-boxes }
+
+//// tab | Test
+
+/// info | Info
+Etwas Text
+///
+
+/// note | Hinweis
+Etwas Text
+///
+
+/// note | Technische Details
+Etwas Text
+///
+
+/// check | Testen
+Etwas Text
+///
+
+/// tip | Tipp
+Etwas Text
+///
+
+/// warning | Achtung
+Etwas Text
+///
+
+/// danger | Gefahr
+Etwas Text
+///
+
+////
+
+//// tab | Info
+
+Tabs und `Info`/`Note`/`Warning`/usw. BlÃļcke sollten die Ãbersetzung ihres Titels nach einem vertikalen Strich (`|`) erhalten.
+
+Siehe die Abschnitte `### Special blocks` und `### Tab blocks` im allgemeinen Prompt in `scripts/translate.py`.
+
+////
+
+## Web- und interne Links { #web-and-internal-links }
+
+//// tab | Test
+
+Der Linktext sollte Ãŧbersetzt werden, die Linkadresse sollte unverändert bleiben:
+
+* [Link zur Ãberschrift oben](#code-snippets)
+* [Interner Link](index.md#installation){.internal-link target=_blank}
+* Externer Link
+* Link zu einem Stil
+* Link zu einem Skript
+* Link zu einem Bild
+
+Der Linktext sollte Ãŧbersetzt werden, die Linkadresse sollte auf die Ãbersetzung zeigen:
+
+* FastAPI-Link
+
+////
+
+//// tab | Info
+
+Links sollten Ãŧbersetzt werden, aber ihre Adresse soll unverändert bleiben. Eine Ausnahme sind absolute Links zu Seiten der FastAPI-Dokumentation. In diesem Fall sollte auf die Ãbersetzung verlinkt werden.
+
+Siehe Abschnitt `### Links` im allgemeinen Prompt in `scripts/translate.py`.
+
+////
+
+## HTML âabbrâ-Elemente { #html-abbr-elements }
+
+//// tab | Test
+
+Hier einige Dinge, die in HTML-âabbrâ-Elemente gepackt sind (einige sind erfunden):
+
+### Das abbr gibt eine vollständige Phrase { #the-abbr-gives-a-full-phrase }
+
+* GTD
+* lt
+* XWT
+* PSGI
+
+### Das abbr gibt eine Erklärung { #the-abbr-gives-an-explanation }
+
+* Cluster
+* Deep Learning
+
+### Das abbr gibt eine vollständige Phrase und eine Erklärung { #the-abbr-gives-a-full-phrase-and-an-explanation }
+
+* MDN
+* I/O.
+
+////
+
+//// tab | Info
+
+âtitleâ-Attribute von âabbrâ-Elementen werden nach bestimmten Anweisungen Ãŧbersetzt.
+
+Ãbersetzungen kÃļnnen eigene âabbrâ-Elemente hinzufÃŧgen, die das LLM nicht entfernen soll. Z. B. um englische WÃļrter zu erklären.
+
+Siehe Abschnitt `### HTML abbr elements` im allgemeinen Prompt in `scripts/translate.py`.
+
+////
+
+## Ãberschriften { #headings }
+
+//// tab | Test
+
+### Eine Webapp entwickeln â ein Tutorial { #develop-a-webapp-a-tutorial }
+
+Hallo.
+
+### Typhinweise und -annotationen { #type-hints-and-annotations }
+
+Hallo wieder.
+
+### Super- und Subklassen { #super-and-subclasses }
+
+Hallo wieder.
+
+////
+
+//// tab | Info
+
+Die einzige strenge Regel fÃŧr Ãberschriften ist, dass das LLM den Hash-Teil in geschweiften Klammern unverändert lässt, damit Links nicht kaputtgehen.
+
+Siehe Abschnitt `### Headings` im allgemeinen Prompt in `scripts/translate.py`.
+
+FÃŧr einige sprachspezifische Anweisungen, siehe z. B. den Abschnitt `### Headings` in `docs/de/llm-prompt.md`.
+
+////
+
+## In der Dokumentation verwendete Begriffe { #terms-used-in-the-docs }
+
+//// tab | Test
+
+* Sie
+* Ihr
+
+* z. B.
+* usw.
+
+* `foo` vom Typ `int`
+* `bar` vom Typ `str`
+* `baz` vom Typ `list`
+
+* das Tutorial â Benutzerhandbuch
+* das Handbuch fÃŧr fortgeschrittene Benutzer
+* die SQLModel-Dokumentation
+* die API-Dokumentation
+* die automatische Dokumentation
+
+* Data Science
+* Deep Learning
+* Machine Learning
+* Dependency Injection
+* HTTP Basic-Authentifizierung
+* HTTP Digest
+* ISO-Format
+* der JSON-Schema-Standard
+* das JSON-Schema
+* die Schema-Definition
+* Password Flow
+* Mobile
+
+* deprecatet
+* designt
+* ungÃŧltig
+* on the fly
+* Standard
+* Default
+* GroÃ-/KleinÂschreiÂbung ist relevant
+* GroÃ-/KleinÂschreiÂbung ist nicht relevant
+
+* die Anwendung bereitstellen
+* die Seite ausliefern
+
+* die App
+* die Anwendung
+
+* der Request
+* die Response
+* die Error-Response
+
+* die Pfadoperation
+* der Pfadoperation-Dekorator
+* die Pfadoperation-Funktion
+
+* der Body
+* der Requestbody
+* der Responsebody
+* der JSON-Body
+* der Formularbody
+* der Dateibody
+* der FunktionskÃļrper
+
+* der Parameter
+* der Body-Parameter
+* der Pfad-Parameter
+* der Query-Parameter
+* der Cookie-Parameter
+* der Header-Parameter
+* der Formular-Parameter
+* der Funktionsparameter
+
+* das Event
+* das Startup-Event
+* das Hochfahren des Servers
+* das Shutdown-Event
+* das Lifespan-Event
+
+* der Handler
+* der Eventhandler
+* der Exceptionhandler
+* handhaben
+
+* das Modell
+* das Pydantic-Modell
+* das Datenmodell
+* das Datenbankmodell
+* das Formularmodell
+* das Modellobjekt
+
+* die Klasse
+* die Basisklasse
+* die Elternklasse
+* die Subklasse
+* die Kindklasse
+* die Geschwisterklasse
+* die Klassenmethode
+
+* der Header
+* die Header
+* der Autorisierungsheader
+* der `Authorization`-Header
+* der Forwarded-Header
+
+* das Dependency-Injection-System
+* die Dependency
+* das Dependable
+* der Dependant
+
+* I/O-lastig
+* CPU-lastig
+* Nebenläufigkeit
+* Parallelität
+* Multiprocessing
+
+* die Umgebungsvariable
+* die Umgebungsvariable
+* der `PATH`
+* die `PATH`-Umgebungsvariable
+
+* die Authentifizierung
+* der Authentifizierungsanbieter
+* die Autorisierung
+* das Anmeldeformular
+* der Autorisierungsanbieter
+* der Benutzer authentisiert sich
+* das System authentifiziert den Benutzer
+
+* Das CLI
+* Das Kommandozeileninterface
+
+* der Server
+* der Client
+
+* der Cloudanbieter
+* der Clouddienst
+
+* die Entwicklung
+* die Entwicklungsphasen
+
+* das Dict
+* das Dictionary
+* die Enumeration
+* das Enum
+* das Enum-Member
+
+* der Encoder
+* der Decoder
+* kodieren
+* dekodieren
+
+* die Exception
+* werfen
+
+* der Ausdruck
+* die Anweisung
+
+* das Frontend
+* das Backend
+
+* die GitHub-Diskussion
+* das GitHub-Issue
+
+* die Leistung
+* die Leistungsoptimierung
+
+* der RÃŧckgabetyp
+* der RÃŧckgabewert
+
+* die Sicherheit
+* das Sicherheitsschema
+
+* der Task
+* der Hintergrundtask
+* die Taskfunktion
+
+* das Template
+* die Template-Engine
+
+* die Typannotation
+* der Typhinweis
+
+* der Serverworker
+* der Uvicorn-Worker
+* der Gunicorn-Worker
+* der Workerprozess
+* die Workerklasse
+* die Workload
+
+* das Deployment
+* bereitstellen
+
+* das SDK
+* das Software Development Kit
+
+* der `APIRouter`
+* die `requirements.txt`
+* das Bearer-Token
+* der Breaking Change
+* der Bug
+* der Button
+* das Callable
+* der Code
+* der Commit
+* der Contextmanager
+* die Coroutine
+* die Datenbank-Session
+* die Festplatte
+* die Domain
+* die Engine
+* das Fake-X
+* die HTTP-GET-Methode
+* das Item
+* die Bibliothek
+* der Lifespan
+* der Lock
+* die Middleware
+* die Mobile-Anwendung
+* das Modul
+* das Mounten
+* das Netzwerk
+* das Origin
+* Die Ãberschreibung
+* die Payload
+* der Prozessor
+* die Property
+* der Proxy
+* der Pull Request
+* die Query
+* der RAM
+* der entfernte Rechner
+* der Statuscode
+* der String
+* der Tag
+* das Webframework
+* die Wildcard
+* zurÃŧckgeben
+* validieren
+
+////
+
+//// tab | Info
+
+Dies ist eine nicht vollständige und nicht normative Liste von (meist) technischen Begriffen, die in der Dokumentation vorkommen. Sie kann dem Prompt-Designer helfen herauszufinden, bei welchen Begriffen das LLM UnterstÃŧtzung braucht. Zum Beispiel, wenn es eine gute Ãbersetzung immer wieder auf eine suboptimale Ãbersetzung zurÃŧcksetzt. Oder wenn es Probleme hat, einen Begriff in Ihrer Sprache zu konjugieren/deklinieren.
+
+Siehe z. B. den Abschnitt `### List of English terms and their preferred German translations` in `docs/de/llm-prompt.md`.
+
+////
diff --git a/docs/de/docs/about/index.md b/docs/de/docs/about/index.md
index 4c309e02a..5e9c6b6a0 100644
--- a/docs/de/docs/about/index.md
+++ b/docs/de/docs/about/index.md
@@ -1,3 +1,3 @@
-# Ãber
+# Ãber { #about }
Ãber FastAPI, sein Design, seine Inspiration und mehr. đ¤
diff --git a/docs/de/docs/advanced/additional-responses.md b/docs/de/docs/advanced/additional-responses.md
index bf38d9795..218dd6c4f 100644
--- a/docs/de/docs/advanced/additional-responses.md
+++ b/docs/de/docs/advanced/additional-responses.md
@@ -1,4 +1,4 @@
-# Zusätzliche Responses in OpenAPI
+# Zusätzliche Responses in OpenAPI { #additional-responses-in-openapi }
/// warning | Achtung
@@ -8,17 +8,17 @@ Wenn Sie mit **FastAPI** beginnen, benÃļtigen Sie dies mÃļglicherweise nicht.
///
-Sie kÃļnnen zusätzliche Responses mit zusätzlichen Statuscodes, Medientypen, Beschreibungen, usw. deklarieren.
+Sie kÃļnnen zusätzliche Responses mit zusätzlichen Statuscodes, Medientypen, Beschreibungen, usw. deklarieren.
Diese zusätzlichen Responses werden in das OpenAPI-Schema aufgenommen, sodass sie auch in der API-Dokumentation erscheinen.
FÃŧr diese zusätzlichen Responses mÃŧssen Sie jedoch sicherstellen, dass Sie eine `Response`, wie etwa `JSONResponse`, direkt zurÃŧckgeben, mit Ihrem Statuscode und Inhalt.
-## Zusätzliche Response mit `model`
+## Zusätzliche Response mit `model` { #additional-response-with-model }
Sie kÃļnnen Ihren *Pfadoperation-Dekoratoren* einen Parameter `responses` Ãŧbergeben.
-Der nimmt ein `dict` entgegen, die SchlÃŧssel sind Statuscodes fÃŧr jede Response, wie etwa `200`, und die Werte sind andere `dict`s mit den Informationen fÃŧr jede Response.
+Der nimmt ein `dict` entgegen, die SchlÃŧssel sind Statuscodes fÃŧr jede Response, wie etwa `200`, und die Werte sind andere `dict`s mit den Informationen fÃŧr jede Response.
Jedes dieser Response-`dict`s kann einen SchlÃŧssel `model` haben, welcher ein Pydantic-Modell enthält, genau wie `response_model`.
@@ -34,7 +34,7 @@ Beachten Sie, dass Sie die `JSONResponse` direkt zurÃŧckgeben mÃŧssen.
///
-/// info
+/// info | Info
Der `model`-SchlÃŧssel ist nicht Teil von OpenAPI.
@@ -169,7 +169,7 @@ Die Schemas werden von einer anderen Stelle innerhalb des OpenAPI-Schemas refere
}
```
-## Zusätzliche Medientypen fÃŧr die Haupt-Response
+## Zusätzliche Medientypen fÃŧr die Haupt-Response { #additional-media-types-for-the-main-response }
Sie kÃļnnen denselben `responses`-Parameter verwenden, um verschiedene Medientypen fÃŧr dieselbe Haupt-Response hinzuzufÃŧgen.
@@ -183,7 +183,7 @@ Beachten Sie, dass Sie das Bild direkt mit einer `FileResponse` zurÃŧckgeben mÃŧ
///
-/// info
+/// info | Info
Sofern Sie in Ihrem Parameter `responses` nicht explizit einen anderen Medientyp angeben, geht FastAPI davon aus, dass die Response denselben Medientyp wie die Haupt-Response-Klasse hat (StandardmäÃig `application/json`).
@@ -191,7 +191,7 @@ Wenn Sie jedoch eine benutzerdefinierte Response-Klasse mit `None` als Medientyp
///
-## Informationen kombinieren
+## Informationen kombinieren { #combining-information }
Sie kÃļnnen auch Response-Informationen von mehreren Stellen kombinieren, einschlieÃlich der Parameter `response_model`, `status_code` und `responses`.
@@ -209,7 +209,7 @@ Es wird alles kombiniert und in Ihre OpenAPI eingebunden und in der API-Dokument
-## Vordefinierte und benutzerdefinierte Responses kombinieren
+## Vordefinierte und benutzerdefinierte Responses kombinieren { #combine-predefined-responses-and-custom-ones }
MÃļglicherweise mÃļchten Sie einige vordefinierte Responses haben, die fÃŧr viele *Pfadoperationen* gelten, Sie mÃļchten diese jedoch mit benutzerdefinierten Responses kombinieren, die fÃŧr jede *Pfadoperation* erforderlich sind.
@@ -239,9 +239,9 @@ Zum Beispiel:
{* ../../docs_src/additional_responses/tutorial004.py hl[13:17,26] *}
-## Weitere Informationen zu OpenAPI-Responses
+## Weitere Informationen zu OpenAPI-Responses { #more-information-about-openapi-responses }
Um zu sehen, was genau Sie in die Responses aufnehmen kÃļnnen, kÃļnnen Sie die folgenden Abschnitte in der OpenAPI-Spezifikation ÃŧberprÃŧfen:
-* OpenAPI Responses Object, enthält das `Response Object`.
-* OpenAPI Response Object, Sie kÃļnnen alles davon direkt in jede Response innerhalb Ihres `responses`-Parameter einfÃŧgen. EinschlieÃlich `description`, `headers`, `content` (darin deklarieren Sie verschiedene Medientypen und JSON-Schemas) und `links`.
+* OpenAPI Responses Object, enthält das `Response Object`.
+* OpenAPI Response Object, Sie kÃļnnen alles davon direkt in jede Response innerhalb Ihres `responses`-Parameter einfÃŧgen. EinschlieÃlich `description`, `headers`, `content` (darin deklarieren Sie verschiedene Medientypen und JSON-Schemas) und `links`.
diff --git a/docs/de/docs/advanced/additional-status-codes.md b/docs/de/docs/advanced/additional-status-codes.md
index b07bb90ab..f948e1862 100644
--- a/docs/de/docs/advanced/additional-status-codes.md
+++ b/docs/de/docs/advanced/additional-status-codes.md
@@ -1,16 +1,16 @@
-# Zusätzliche Statuscodes
+# Zusätzliche Statuscodes { #additional-status-codes }
-StandardmäÃig liefert **FastAPI** die RÃŧckgabewerte (Responses) als `JSONResponse` zurÃŧck und fÃŧgt den Inhalt der jeweiligen *Pfadoperation* in das `JSONResponse` Objekt ein.
+StandardmäÃig liefert **FastAPI** die Responses als `JSONResponse` zurÃŧck und fÃŧgt den Inhalt, den Sie aus Ihrer *Pfadoperation* zurÃŧckgeben, in diese `JSONResponse` ein.
Es wird der Default-Statuscode oder derjenige verwendet, den Sie in Ihrer *Pfadoperation* festgelegt haben.
-## Zusätzliche Statuscodes
+## Zusätzliche Statuscodes { #additional-status-codes_1 }
Wenn Sie neben dem Hauptstatuscode weitere Statuscodes zurÃŧckgeben mÃļchten, kÃļnnen Sie dies tun, indem Sie direkt eine `Response` zurÃŧckgeben, wie etwa eine `JSONResponse`, und den zusätzlichen Statuscode direkt festlegen.
Angenommen, Sie mÃļchten eine *Pfadoperation* haben, die das Aktualisieren von Artikeln ermÃļglicht und bei Erfolg den HTTP-Statuscode 200 âOKâ zurÃŧckgibt.
-Sie mÃļchten aber auch, dass sie neue Artikel akzeptiert. Und wenn die Elemente vorher nicht vorhanden waren, werden diese Elemente erstellt und der HTTP-Statuscode 201 âCreatedâ zurÃŧckgegeben.
+Sie mÃļchten aber auch, dass sie neue Artikel akzeptiert. Und wenn die Artikel vorher nicht vorhanden waren, werden diese Artikel erstellt und der HTTP-Statuscode 201 âCreatedâ zurÃŧckgegeben.
Um dies zu erreichen, importieren Sie `JSONResponse`, und geben Sie Ihren Inhalt direkt zurÃŧck, indem Sie den gewÃŧnschten `status_code` setzen:
@@ -30,11 +30,11 @@ Stellen Sie sicher, dass sie die gewÃŧnschten Daten enthält und dass die Werte
Sie kÃļnnen auch `from starlette.responses import JSONResponse` verwenden.
-**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit fÃŧr Sie, den Entwickler. Die meisten verfÃŧgbaren Responses kommen aber direkt von Starlette. Das Gleiche gilt fÃŧr `status`.
+**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit fÃŧr Sie, den Entwickler. Die meisten verfÃŧgbaren Responses kommen aber direkt von Starlette. Dasselbe gilt fÃŧr `status`.
///
-## OpenAPI- und API-Dokumentation
+## OpenAPI- und API-Dokumentation { #openapi-and-api-docs }
Wenn Sie zusätzliche Statuscodes und Responses direkt zurÃŧckgeben, werden diese nicht in das OpenAPI-Schema (die API-Dokumentation) aufgenommen, da FastAPI keine MÃļglichkeit hat, im Voraus zu wissen, was Sie zurÃŧckgeben werden.
diff --git a/docs/de/docs/advanced/advanced-dependencies.md b/docs/de/docs/advanced/advanced-dependencies.md
index 56eb7d454..a153665cc 100644
--- a/docs/de/docs/advanced/advanced-dependencies.md
+++ b/docs/de/docs/advanced/advanced-dependencies.md
@@ -1,6 +1,6 @@
-# Fortgeschrittene Abhängigkeiten
+# Fortgeschrittene Abhängigkeiten { #advanced-dependencies }
-## Parametrisierte Abhängigkeiten
+## Parametrisierte Abhängigkeiten { #parameterized-dependencies }
Alle Abhängigkeiten, die wir bisher gesehen haben, waren festgelegte Funktionen oder Klassen.
@@ -10,9 +10,9 @@ Stellen wir uns vor, wir mÃļchten eine Abhängigkeit haben, die prÃŧft, ob ein Q
Aber wir wollen diesen vordefinierten Inhalt per Parameter festlegen kÃļnnen.
-## Eine âaufrufbareâ Instanz
+## Eine âaufrufbareâ Instanz { #a-callable-instance }
-In Python gibt es eine MÃļglichkeit, eine Instanz einer Klasse âaufrufbarâ (âcallableâ) zu machen.
+In Python gibt es eine MÃļglichkeit, eine Instanz einer Klasse âaufrufbarâ zu machen.
Nicht die Klasse selbst (die bereits aufrufbar ist), sondern eine Instanz dieser Klasse.
@@ -22,15 +22,15 @@ Dazu deklarieren wir eine Methode `__call__`:
In diesem Fall ist dieses `__call__` das, was **FastAPI** verwendet, um nach zusätzlichen Parametern und Unterabhängigkeiten zu suchen, und das ist es auch, was später aufgerufen wird, um einen Wert an den Parameter in Ihrer *Pfadoperation-Funktion* zu Ãŧbergeben.
-## Die Instanz parametrisieren
+## Die Instanz parametrisieren { #parameterize-the-instance }
-Und jetzt kÃļnnen wir `__init__` verwenden, um die Parameter der Instanz zu deklarieren, die wir zum `Parametrisieren` der Abhängigkeit verwenden kÃļnnen:
+Und jetzt kÃļnnen wir `__init__` verwenden, um die Parameter der Instanz zu deklarieren, die wir zum âParametrisierenâ der Abhängigkeit verwenden kÃļnnen:
{* ../../docs_src/dependencies/tutorial011_an_py39.py hl[9] *}
In diesem Fall wird **FastAPI** `__init__` nie berÃŧhren oder sich darum kÃŧmmern, wir werden es direkt in unserem Code verwenden.
-## Eine Instanz erstellen
+## Eine Instanz erstellen { #create-an-instance }
Wir kÃļnnten eine Instanz dieser Klasse erstellen mit:
@@ -38,7 +38,7 @@ Wir kÃļnnten eine Instanz dieser Klasse erstellen mit:
Und auf diese Weise kÃļnnen wir unsere Abhängigkeit âparametrisierenâ, die jetzt `"bar"` enthält, als das Attribut `checker.fixed_content`.
-## Die Instanz als Abhängigkeit verwenden
+## Die Instanz als Abhängigkeit verwenden { #use-the-instance-as-a-dependency }
Dann kÃļnnten wir diesen `checker` in einem `Depends(checker)` anstelle von `Depends(FixedContentQueryChecker)` verwenden, da die Abhängigkeit die Instanz `checker` und nicht die Klasse selbst ist.
diff --git a/docs/de/docs/advanced/async-tests.md b/docs/de/docs/advanced/async-tests.md
index b82aadf00..ad8245205 100644
--- a/docs/de/docs/advanced/async-tests.md
+++ b/docs/de/docs/advanced/async-tests.md
@@ -1,24 +1,24 @@
-# Asynchrone Tests
+# Asynchrone Tests { #async-tests }
-Sie haben bereits gesehen, wie Sie Ihre **FastAPI**-Anwendungen mit dem bereitgestellten `TestClient` testen. Bisher haben Sie nur gesehen, wie man synchrone Tests schreibt, ohne `async`hrone Funktionen zu verwenden.
+Sie haben bereits gesehen, wie Sie Ihre **FastAPI**-Anwendungen mit dem bereitgestellten `TestClient` testen. Bisher haben Sie nur gesehen, wie man synchrone Tests schreibt, ohne `async`-Funktionen zu verwenden.
-Die MÃļglichkeit, in Ihren Tests asynchrone Funktionen zu verwenden, kÃļnnte beispielsweise nÃŧtzlich sein, wenn Sie Ihre Datenbank asynchron abfragen. Stellen Sie sich vor, Sie mÃļchten das Senden von Requests an Ihre FastAPI-Anwendung testen und dann ÃŧberprÃŧfen, ob Ihr Backend die richtigen Daten erfolgreich in die Datenbank geschrieben hat, während Sie eine asynchrone Datenbankbibliothek verwenden.
+Die MÃļglichkeit, in Ihren Tests asynchrone Funktionen zu verwenden, kÃļnnte beispielsweise nÃŧtzlich sein, wenn Sie Ihre Datenbank asynchron abfragen. Stellen Sie sich vor, Sie mÃļchten das Senden von Requests an Ihre FastAPI-Anwendung testen und dann ÃŧberprÃŧfen, ob Ihr Backend die richtigen Daten erfolgreich in die Datenbank geschrieben hat, während Sie eine asynchrone Datenbankbibliothek verwenden.
Schauen wir uns an, wie wir das machen kÃļnnen.
-## pytest.mark.anyio
+## pytest.mark.anyio { #pytest-mark-anyio }
Wenn wir in unseren Tests asynchrone Funktionen aufrufen mÃļchten, mÃŧssen unsere Testfunktionen asynchron sein. AnyIO stellt hierfÃŧr ein nettes Plugin zur VerfÃŧgung, mit dem wir festlegen kÃļnnen, dass einige Testfunktionen asynchron aufgerufen werden sollen.
-## HTTPX
+## HTTPX { #httpx }
-Auch wenn Ihre **FastAPI**-Anwendung normale `def`-Funktionen anstelle von `async def` verwendet, handelt es sich darunter immer noch um eine `async`hrone Anwendung.
+Auch wenn Ihre **FastAPI**-Anwendung normale `def`-Funktionen anstelle von `async def` verwendet, handelt es sich darunter immer noch um eine `async`-Anwendung.
-Der `TestClient` macht unter der Haube magisches, um die asynchrone FastAPI-Anwendung in Ihren normalen `def`-Testfunktionen, mithilfe von Standard-Pytest aufzurufen. Aber diese Magie funktioniert nicht mehr, wenn wir sie in asynchronen Funktionen verwenden. Durch die asynchrone AusfÃŧhrung unserer Tests kÃļnnen wir den `TestClient` nicht mehr in unseren Testfunktionen verwenden.
+Der `TestClient` betreibt unter der Haube etwas Magie, um die asynchrone FastAPI-Anwendung in Ihren normalen `def`-Testfunktionen, mithilfe von Standard-Pytest aufzurufen. Aber diese Magie funktioniert nicht mehr, wenn wir sie in asynchronen Funktionen verwenden. Durch die asynchrone AusfÃŧhrung unserer Tests kÃļnnen wir den `TestClient` nicht mehr in unseren Testfunktionen verwenden.
-Der `TestClient` basiert auf HTTPX und glÃŧcklicherweise kÃļnnen wir ihn direkt verwenden, um die API zu testen.
+Der `TestClient` basiert auf HTTPX und glÃŧcklicherweise kÃļnnen wir es direkt verwenden, um die API zu testen.
-## Beispiel
+## Beispiel { #example }
Betrachten wir als einfaches Beispiel eine Dateistruktur ähnlich der in [GrÃļÃere Anwendungen](../tutorial/bigger-applications.md){.internal-link target=_blank} und [Testen](../tutorial/testing.md){.internal-link target=_blank}:
@@ -38,7 +38,7 @@ Die Datei `test_main.py` hätte die Tests fÃŧr `main.py`, das kÃļnnte jetzt so a
{* ../../docs_src/async_tests/test_main.py *}
-## Es ausfÃŧhren
+## Es ausfÃŧhren { #run-it }
Sie kÃļnnen Ihre Tests wie gewohnt ausfÃŧhren mit:
@@ -52,7 +52,7 @@ $ pytest
-## Details
+## Im Detail { #in-detail }
Der Marker `@pytest.mark.anyio` teilt pytest mit, dass diese Testfunktion asynchron aufgerufen werden soll:
@@ -88,9 +88,9 @@ Falls Ihre Anwendung auf Lifespan-Events angewiesen ist, der `AsyncClient` lÃļst
///
-## Andere asynchrone Funktionsaufrufe
+## Andere asynchrone Funktionsaufrufe { #other-asynchronous-function-calls }
-Da die Testfunktion jetzt asynchron ist, kÃļnnen Sie in Ihren Tests neben dem Senden von Requests an Ihre FastAPI-Anwendung jetzt auch andere `async`hrone Funktionen aufrufen (und `await`en), genau so, wie Sie diese an anderer Stelle in Ihrem Code aufrufen wÃŧrden.
+Da die Testfunktion jetzt asynchron ist, kÃļnnen Sie in Ihren Tests neben dem Senden von Requests an Ihre FastAPI-Anwendung jetzt auch andere `async`-Funktionen aufrufen (und `await`en), genau so, wie Sie diese an anderer Stelle in Ihrem Code aufrufen wÃŧrden.
/// tip | Tipp
diff --git a/docs/de/docs/advanced/behind-a-proxy.md b/docs/de/docs/advanced/behind-a-proxy.md
index 9e2282280..036916cbe 100644
--- a/docs/de/docs/advanced/behind-a-proxy.md
+++ b/docs/de/docs/advanced/behind-a-proxy.md
@@ -1,17 +1,114 @@
-# Hinter einem Proxy
+# Hinter einem Proxy { #behind-a-proxy }
-In manchen Situationen mÃŧssen Sie mÃļglicherweise einen **Proxy**-Server wie Traefik oder Nginx verwenden, mit einer Konfiguration, die ein zusätzliches Pfadpräfix hinzufÃŧgt, das von Ihrer Anwendung nicht gesehen wird.
+In vielen Situationen wÃŧrden Sie einen **Proxy** wie Traefik oder Nginx vor Ihrer FastAPI-App verwenden.
-In diesen Fällen kÃļnnen Sie `root_path` verwenden, um Ihre Anwendung zu konfigurieren.
+Diese Proxys kÃļnnten HTTPS-Zertifikate und andere Dinge handhaben.
-Der `root_path` (âWurzelpfadâ) ist ein Mechanismus, der von der ASGI-Spezifikation bereitgestellt wird (auf der FastAPI via Starlette aufbaut).
+## Proxy-Forwarded-Header { #proxy-forwarded-headers }
+
+Ein **Proxy** vor Ihrer Anwendung wÃŧrde normalerweise einige Header on-the-fly setzen, bevor er die Requests an den **Server** sendet, um den Server wissen zu lassen, dass der Request vom Proxy **weitergeleitet** wurde, einschlieÃlich der ursprÃŧnglichen (Ãļffentlichen) URL, inklusive der Domain, dass HTTPS verwendet wird, usw.
+
+Das **Server**-Programm (z. B. **Uvicorn** via **FastAPI CLI**) ist in der Lage, diese Header zu interpretieren und diese Information dann an Ihre Anwendung weiterzugeben.
+
+Aber aus SicherheitsgrÃŧnden, da der Server nicht weiÃ, dass er hinter einem vertrauenswÃŧrdigen Proxy läuft, wird er diese Header nicht interpretieren.
+
+/// note | Technische Details
+
+Die Proxy-Header sind:
+
+* X-Forwarded-For
+* X-Forwarded-Proto
+* X-Forwarded-Host
+
+///
+
+### Proxy-Forwarded-Header aktivieren { #enable-proxy-forwarded-headers }
+
+Sie kÃļnnen FastAPI CLI mit der *CLI-Option* `--forwarded-allow-ips` starten und die IP-Adressen Ãŧbergeben, denen vertraut werden soll, um diese Forwarded-Header zu lesen.
+
+Wenn Sie es auf `--forwarded-allow-ips="*"` setzen, wÃŧrde es allen eingehenden IPs vertrauen.
+
+Wenn Ihr **Server** hinter einem vertrauenswÃŧrdigen **Proxy** sitzt und nur der Proxy mit ihm spricht, wÃŧrde dies dazu fÃŧhren, dass er die IP dieses **Proxys** akzeptiert, was auch immer sie ist.
+
+
-## VerfÃŧgbare Responses
+## VerfÃŧgbare Responses { #available-responses }
Hier sind einige der verfÃŧgbaren Responses.
@@ -121,7 +121,7 @@ Sie kÃļnnen auch `from starlette.responses import HTMLResponse` verwenden.
///
-### `Response`
+### `Response` { #response }
Die Hauptklasse `Response`, alle anderen Responses erben von ihr.
@@ -138,30 +138,42 @@ FastAPI (eigentlich Starlette) fÃŧgt automatisch einen Content-Length-Header ein
{* ../../docs_src/response_directly/tutorial002.py hl[1,18] *}
-### `HTMLResponse`
+### `HTMLResponse` { #htmlresponse }
Nimmt Text oder Bytes entgegen und gibt eine HTML-Response zurÃŧck, wie Sie oben gelesen haben.
-### `PlainTextResponse`
+### `PlainTextResponse` { #plaintextresponse }
Nimmt Text oder Bytes entgegen und gibt eine Plain-Text-Response zurÃŧck.
{* ../../docs_src/custom_response/tutorial005.py hl[2,7,9] *}
-### `JSONResponse`
+### `JSONResponse` { #jsonresponse }
Nimmt einige Daten entgegen und gibt eine `application/json`-codierte Response zurÃŧck.
Dies ist die Standard-Response, die in **FastAPI** verwendet wird, wie Sie oben gelesen haben.
-### `ORJSONResponse`
+### `ORJSONResponse` { #orjsonresponse }
Eine schnelle alternative JSON-Response mit `orjson`, wie Sie oben gelesen haben.
-### `UJSONResponse`
+/// info | Info
+
+Dazu muss `orjson` installiert werden, z. B. mit `pip install orjson`.
+
+///
+
+### `UJSONResponse` { #ujsonresponse }
Eine alternative JSON-Response mit `ujson`.
+/// info | Info
+
+Dazu muss `ujson` installiert werden, z. B. mit `pip install ujson`.
+
+///
+
/// warning | Achtung
`ujson` ist bei der Behandlung einiger Sonderfälle weniger sorgfältig als Pythons eingebaute Implementierung.
@@ -176,7 +188,7 @@ MÃļglicherweise ist `ORJSONResponse` eine schnellere Alternative.
///
-### `RedirectResponse`
+### `RedirectResponse` { #redirectresponse }
Gibt eine HTTP-Weiterleitung (HTTP-Redirect) zurÃŧck. Verwendet standardmäÃig den Statuscode 307 â Temporäre Weiterleitung (Temporary Redirect).
@@ -188,7 +200,6 @@ Sie kÃļnnen eine `RedirectResponse` direkt zurÃŧckgeben:
Oder Sie kÃļnnen sie im Parameter `response_class` verwenden:
-
{* ../../docs_src/custom_response/tutorial006b.py hl[2,7,9] *}
Wenn Sie das tun, kÃļnnen Sie die URL direkt von Ihrer *Pfadoperation*-Funktion zurÃŧckgeben.
@@ -201,26 +212,24 @@ Sie kÃļnnen den Parameter `status_code` auch in Kombination mit dem Parameter `r
{* ../../docs_src/custom_response/tutorial006c.py hl[2,7,9] *}
-### `StreamingResponse`
+### `StreamingResponse` { #streamingresponse }
Nimmt einen asynchronen Generator oder einen normalen Generator/Iterator und streamt den Responsebody.
{* ../../docs_src/custom_response/tutorial007.py hl[2,14] *}
-#### Verwendung von `StreamingResponse` mit dateiähnlichen Objekten
+#### Verwendung von `StreamingResponse` mit dateiartigen Objekten { #using-streamingresponse-with-file-like-objects }
-Wenn Sie ein dateiähnliches (file-like) Objekt haben (z. B. das von `open()` zurÃŧckgegebene Objekt), kÃļnnen Sie eine Generatorfunktion erstellen, um Ãŧber dieses dateiähnliche Objekt zu iterieren.
+Wenn Sie ein dateiartiges (file-like) Objekt haben (z. B. das von `open()` zurÃŧckgegebene Objekt), kÃļnnen Sie eine Generatorfunktion erstellen, um Ãŧber dieses dateiartige Objekt zu iterieren.
Auf diese Weise mÃŧssen Sie nicht alles zuerst in den Arbeitsspeicher lesen und kÃļnnen diese Generatorfunktion an `StreamingResponse` Ãŧbergeben und zurÃŧckgeben.
Das umfasst viele Bibliotheken zur Interaktion mit Cloud-Speicher, Videoverarbeitung und anderen.
-```{ .python .annotate hl_lines="2 10-12 14" }
-{!../../docs_src/custom_response/tutorial008.py!}
-```
+{* ../../docs_src/custom_response/tutorial008.py hl[2,10:12,14] *}
1. Das ist die Generatorfunktion. Es handelt sich um eine âGeneratorfunktionâ, da sie `yield`-Anweisungen enthält.
-2. Durch die Verwendung eines `with`-Blocks stellen wir sicher, dass das dateiähnliche Objekt geschlossen wird, nachdem die Generatorfunktion fertig ist. Also, nachdem sie mit dem Senden der Response fertig ist.
+2. Durch die Verwendung eines `with`-Blocks stellen wir sicher, dass das dateiartige Objekt geschlossen wird, nachdem die Generatorfunktion fertig ist. Also, nachdem sie mit dem Senden der Response fertig ist.
3. Dieses `yield from` weist die Funktion an, Ãŧber das Ding namens `file_like` zu iterieren. Und dann fÃŧr jeden iterierten Teil, diesen Teil so zurÃŧckzugeben, als wenn er aus dieser Generatorfunktion (`iterfile`) stammen wÃŧrde.
Es handelt sich also hier um eine Generatorfunktion, die die âgenerierendeâ Arbeit intern auf etwas anderes Ãŧberträgt.
@@ -233,7 +242,7 @@ Beachten Sie, dass wir, da wir Standard-`open()` verwenden, welches `async` und
///
-### `FileResponse`
+### `FileResponse` { #fileresponse }
Streamt eine Datei asynchron als Response.
@@ -254,7 +263,7 @@ Sie kÃļnnen auch den Parameter `response_class` verwenden:
In diesem Fall kÃļnnen Sie den Dateipfad direkt von Ihrer *Pfadoperation*-Funktion zurÃŧckgeben.
-## Benutzerdefinierte Response-Klasse
+## Benutzerdefinierte Response-Klasse { #custom-response-class }
Sie kÃļnnen Ihre eigene benutzerdefinierte Response-Klasse erstellen, die von `Response` erbt und diese verwendet.
@@ -282,7 +291,7 @@ Statt:
NatÃŧrlich werden Sie wahrscheinlich viel bessere MÃļglichkeiten finden, Vorteil daraus zu ziehen, als JSON zu formatieren. đ
-## Standard-Response-Klasse
+## Standard-Response-Klasse { #default-response-class }
Beim Erstellen einer **FastAPI**-Klasseninstanz oder eines `APIRouter`s kÃļnnen Sie angeben, welche Response-Klasse standardmäÃig verwendet werden soll.
@@ -298,6 +307,6 @@ Sie kÃļnnen dennoch weiterhin `response_class` in *Pfadoperationen* Ãŧberschreib
///
-## Zusätzliche Dokumentation
+## Zusätzliche Dokumentation { #additional-documentation }
Sie kÃļnnen auch den Medientyp und viele andere Details in OpenAPI mit `responses` deklarieren: [Zusätzliche Responses in OpenAPI](additional-responses.md){.internal-link target=_blank}.
diff --git a/docs/de/docs/advanced/dataclasses.md b/docs/de/docs/advanced/dataclasses.md
index 8e537c639..12ea8e9ec 100644
--- a/docs/de/docs/advanced/dataclasses.md
+++ b/docs/de/docs/advanced/dataclasses.md
@@ -1,24 +1,24 @@
-# Verwendung von Datenklassen
+# Verwendung von Datenklassen { #using-dataclasses }
-FastAPI basiert auf **Pydantic** und ich habe Ihnen gezeigt, wie Sie Pydantic-Modelle verwenden kÃļnnen, um Requests und Responses zu deklarieren.
+FastAPI basiert auf **Pydantic**, und ich habe Ihnen gezeigt, wie Sie Pydantic-Modelle verwenden kÃļnnen, um Requests und Responses zu deklarieren.
Aber FastAPI unterstÃŧtzt auf die gleiche Weise auch die Verwendung von `dataclasses`:
{* ../../docs_src/dataclasses/tutorial001.py hl[1,7:12,19:20] *}
-Das ist dank **Pydantic** ebenfalls mÃļglich, da es `dataclasses` intern unterstÃŧtzt.
+Das ist dank **Pydantic** ebenfalls mÃļglich, da es `dataclasses` intern unterstÃŧtzt.
-Auch wenn im obige Code Pydantic nicht explizit vorkommt, verwendet FastAPI Pydantic, um diese Standard-Datenklassen in Pydantics eigene Variante von Datenklassen zu konvertieren.
+Auch wenn im obigen Code Pydantic nicht explizit vorkommt, verwendet FastAPI Pydantic, um diese Standard-Datenklassen in Pydantics eigene Variante von Datenklassen zu konvertieren.
Und natÃŧrlich wird das gleiche unterstÃŧtzt:
-* Validierung der Daten
-* Serialisierung der Daten
-* Dokumentation der Daten, usw.
+* Datenvalidierung
+* Datenserialisierung
+* Datendokumentation, usw.
Das funktioniert genauso wie mit Pydantic-Modellen. Und tatsächlich wird es unter der Haube mittels Pydantic auf die gleiche Weise bewerkstelligt.
-/// info
+/// info | Info
Bedenken Sie, dass Datenklassen nicht alles kÃļnnen, was Pydantic-Modelle kÃļnnen.
@@ -28,7 +28,7 @@ Wenn Sie jedoch eine Menge Datenklassen herumliegen haben, ist dies ein guter Tr
///
-## Datenklassen als `response_model`
+## Datenklassen in `response_model` { #dataclasses-in-response-model }
Sie kÃļnnen `dataclasses` auch im Parameter `response_model` verwenden:
@@ -40,7 +40,7 @@ Auf diese Weise wird deren Schema in der Benutzeroberfläche der API-Dokumentati
-## Datenklassen in verschachtelten Datenstrukturen
+## Datenklassen in verschachtelten Datenstrukturen { #dataclasses-in-nested-data-structures }
Sie kÃļnnen `dataclasses` auch mit anderen Typannotationen kombinieren, um verschachtelte Datenstrukturen zu erstellen.
@@ -62,7 +62,7 @@ In diesem Fall kÃļnnen Sie einfach die Standard-`dataclasses` durch `pydantic.da
In diesem Fall handelt es sich um eine Liste von `Item`-Datenklassen.
-6. Hier geben wir ein Dictionary zurÃŧck, das `items` enthält, welches eine Liste von Datenklassen ist.
+6. Hier geben wir ein Dictionary zurÃŧck, das `items` enthält, welches eine Liste von Datenklassen ist.
FastAPI ist weiterhin in der Lage, die Daten nach JSON zu serialisieren.
@@ -74,7 +74,7 @@ In diesem Fall kÃļnnen Sie einfach die Standard-`dataclasses` durch `pydantic.da
Wie immer kÃļnnen Sie in FastAPI `def` und `async def` beliebig kombinieren.
- Wenn Sie eine Auffrischung darÃŧber benÃļtigen, wann welche Anwendung sinnvoll ist, lesen Sie den Abschnitt âIn Eile?â in der Dokumentation zu [`async` und `await`](../async.md#in-eile){.internal-link target=_blank}.
+ Wenn Sie eine Auffrischung darÃŧber benÃļtigen, wann welche Anwendung sinnvoll ist, lesen Sie den Abschnitt âIn Eile?â in der Dokumentation zu [`async` und `await`](../async.md#in-a-hurry){.internal-link target=_blank}.
9. Diese *Pfadoperation-Funktion* gibt keine Datenklassen zurÃŧck (obwohl dies mÃļglich wäre), sondern eine Liste von Dictionarys mit internen Daten.
@@ -84,12 +84,12 @@ Sie kÃļnnen `dataclasses` mit anderen Typannotationen auf vielfältige Weise kom
Weitere Einzelheiten finden Sie in den Bemerkungen im Quellcode oben.
-## Mehr erfahren
+## Mehr erfahren { #learn-more }
Sie kÃļnnen `dataclasses` auch mit anderen Pydantic-Modellen kombinieren, von ihnen erben, sie in Ihre eigenen Modelle einbinden, usw.
-Weitere Informationen finden Sie in der Pydantic-Dokumentation zu Datenklassen.
+Weitere Informationen finden Sie in der Pydantic-Dokumentation zu Datenklassen.
-## Version
+## Version { #version }
Dies ist verfÃŧgbar seit FastAPI-Version `0.67.0`. đ
diff --git a/docs/de/docs/advanced/events.md b/docs/de/docs/advanced/events.md
index 65fc9e484..2ceef1190 100644
--- a/docs/de/docs/advanced/events.md
+++ b/docs/de/docs/advanced/events.md
@@ -1,14 +1,14 @@
-# Lifespan-Events
+# Lifespan-Events { #lifespan-events }
-Sie kÃļnnen Logik (Code) definieren, die ausgefÃŧhrt werden soll, bevor die Anwendung **hochfährt**. Dies bedeutet, dass dieser Code **einmal** ausgefÃŧhrt wird, **bevor** die Anwendung **beginnt, Requests entgegenzunehmen**.
+Sie kÃļnnen Logik (Code) definieren, die ausgefÃŧhrt werden soll, bevor die Anwendung **hochfährt**. Dies bedeutet, dass dieser Code **einmal** ausgefÃŧhrt wird, **bevor** die Anwendung **beginnt, Requests entgegenzunehmen**.
Auf die gleiche Weise kÃļnnen Sie Logik (Code) definieren, die ausgefÃŧhrt werden soll, wenn die Anwendung **heruntergefahren** wird. In diesem Fall wird dieser Code **einmal** ausgefÃŧhrt, **nachdem** mÃļglicherweise **viele Requests** bearbeitet wurden.
-Da dieser Code ausgefÃŧhrt wird, bevor die Anwendung **beginnt**, Requests entgegenzunehmen, und unmittelbar, nachdem sie die Bearbeitung von Requests **abgeschlossen hat**, deckt er die gesamte **Lebensdauer â âLifespanâ** â der Anwendung ab (das Wort âLifespanâ wird gleich wichtig sein đ).
+Da dieser Code ausgefÃŧhrt wird, bevor die Anwendung **beginnt**, Requests entgegenzunehmen, und unmittelbar, nachdem sie die Bearbeitung von Requests **abgeschlossen hat**, deckt er den gesamten Anwendungs-**Lifespan** ab (das Wort âLifespanâ wird gleich wichtig sein đ).
-Dies kann sehr nÃŧtzlich sein, um **Ressourcen** einzurichten, die Sie in der gesamten Anwendung verwenden wollen und die von Requests **gemeinsam genutzt** werden und/oder die Sie anschlieÃend **aufräumen** mÃŧssen. Zum Beispiel ein Pool von Datenbankverbindungen oder das Laden eines gemeinsam genutzten Modells fÃŧr maschinelles Lernen.
+Dies kann sehr nÃŧtzlich sein, um **Ressourcen** einzurichten, die Sie in der gesamten App verwenden wollen und die von Requests **gemeinsam genutzt** werden und/oder die Sie anschlieÃend **aufräumen** mÃŧssen. Zum Beispiel ein Pool von Datenbankverbindungen oder das Laden eines gemeinsam genutzten Modells fÃŧr maschinelles Lernen.
-## Anwendungsfall
+## Anwendungsfall { #use-case }
Beginnen wir mit einem Beispiel-**Anwendungsfall** und schauen uns dann an, wie wir ihn mit dieser Methode implementieren kÃļnnen.
@@ -22,9 +22,9 @@ Sie kÃļnnten das auf der obersten Ebene des Moduls/der Datei machen, aber das w
Das wollen wir besser machen: Laden wir das Modell, bevor die Requests bearbeitet werden, aber unmittelbar bevor die Anwendung beginnt, Requests zu empfangen, und nicht, während der Code geladen wird.
-## Lifespan
+## Lifespan { #lifespan }
-Sie kÃļnnen diese Logik beim *Hochfahren* und *Herunterfahren* mithilfe des `lifespan`-Parameters der `FastAPI`-App und eines âKontextmanagersâ definieren (ich zeige Ihnen gleich, was das ist).
+Sie kÃļnnen diese Logik beim *Startup* und *Shutdown* mithilfe des `lifespan`-Parameters der `FastAPI`-App und eines âKontextmanagersâ definieren (ich zeige Ihnen gleich, was das ist).
Beginnen wir mit einem Beispiel und sehen es uns dann im Detail an.
@@ -32,19 +32,19 @@ Wir erstellen eine asynchrone Funktion `lifespan()` mit `yield` wie folgt:
{* ../../docs_src/events/tutorial003.py hl[16,19] *}
-Hier simulieren wir das langsame *Hochfahren*, das Laden des Modells, indem wir die (Fake-)Modellfunktion vor dem `yield` in das Dictionary mit Modellen fÃŧr maschinelles Lernen einfÃŧgen. Dieser Code wird ausgefÃŧhrt, **bevor** die Anwendung **beginnt, Requests entgegenzunehmen**, während des *Hochfahrens*.
+Hier simulieren wir den langsamen *Startup*, das Laden des Modells, indem wir die (Fake-)Modellfunktion vor dem `yield` in das Dictionary mit Modellen fÃŧr maschinelles Lernen einfÃŧgen. Dieser Code wird ausgefÃŧhrt, **bevor** die Anwendung **beginnt, Requests entgegenzunehmen**, während des *Startups*.
-Und dann, direkt nach dem `yield`, entladen wir das Modell. Dieser Code wird unmittelbar vor dem *Herunterfahren* ausgefÃŧhrt, **nachdem** die Anwendung **die Bearbeitung von Requests abgeschlossen hat**. Dadurch kÃļnnten beispielsweise Ressourcen wie Arbeitsspeicher oder eine GPU freigegeben werden.
+Und dann, direkt nach dem `yield`, entladen wir das Modell. Dieser Code wird ausgefÃŧhrt, **nachdem** die Anwendung **die Bearbeitung von Requests abgeschlossen hat**, direkt vor dem *Shutdown*. Dadurch kÃļnnten beispielsweise Ressourcen wie Arbeitsspeicher oder eine GPU freigegeben werden.
/// tip | Tipp
-Das *Herunterfahren* wÃŧrde erfolgen, wenn Sie die Anwendung **stoppen**.
+Das `shutdown` wÃŧrde erfolgen, wenn Sie die Anwendung **stoppen**.
MÃļglicherweise mÃŧssen Sie eine neue Version starten, oder Sie haben es einfach satt, sie auszufÃŧhren. đ¤ˇ
///
-### Lifespan-Funktion
+### Lifespan-Funktion { #lifespan-function }
Das Erste, was auffällt, ist, dass wir eine asynchrone Funktion mit `yield` definieren. Das ist sehr ähnlich zu Abhängigkeiten mit `yield`.
@@ -54,7 +54,7 @@ Der erste Teil der Funktion, vor dem `yield`, wird ausgefÃŧhrt **bevor** die Anw
Und der Teil nach `yield` wird ausgefÃŧhrt, **nachdem** die Anwendung beendet ist.
-### Asynchroner Kontextmanager
+### Asynchroner Kontextmanager { #async-context-manager }
Wie Sie sehen, ist die Funktion mit einem `@asynccontextmanager` versehen.
@@ -84,23 +84,23 @@ Der Parameter `lifespan` der `FastAPI`-App benÃļtigt einen **asynchronen Kontext
{* ../../docs_src/events/tutorial003.py hl[22] *}
-## Alternative Events (deprecated)
+## Alternative Events (deprecatet) { #alternative-events-deprecated }
/// warning | Achtung
-Der empfohlene Weg, das *Hochfahren* und *Herunterfahren* zu handhaben, ist die Verwendung des `lifespan`-Parameters der `FastAPI`-App, wie oben beschrieben. Wenn Sie einen `lifespan`-Parameter Ãŧbergeben, werden die `startup`- und `shutdown`-Eventhandler nicht mehr aufgerufen. Es ist entweder alles `lifespan` oder alles Events, nicht beides.
+Der empfohlene Weg, den *Startup* und *Shutdown* zu handhaben, ist die Verwendung des `lifespan`-Parameters der `FastAPI`-App, wie oben beschrieben. Wenn Sie einen `lifespan`-Parameter Ãŧbergeben, werden die `startup`- und `shutdown`-Eventhandler nicht mehr aufgerufen. Es ist entweder alles `lifespan` oder alles Events, nicht beides.
Sie kÃļnnen diesen Teil wahrscheinlich Ãŧberspringen.
///
-Es gibt eine alternative MÃļglichkeit, diese Logik zu definieren, sodass sie beim *Hochfahren* und beim *Herunterfahren* ausgefÃŧhrt wird.
+Es gibt eine alternative MÃļglichkeit, diese Logik zu definieren, sodass sie beim *Startup* und beim *Shutdown* ausgefÃŧhrt wird.
-Sie kÃļnnen Eventhandler (Funktionen) definieren, die ausgefÃŧhrt werden sollen, bevor die Anwendung hochgefahren wird oder wenn die Anwendung heruntergefahren wird.
+Sie kÃļnnen Eventhandler (Funktionen) definieren, die ausgefÃŧhrt werden sollen, bevor die Anwendung hochgefahren wird oder wenn die Anwendung heruntergefahren wird.
Diese Funktionen kÃļnnen mit `async def` oder normalem `def` deklariert werden.
-### `startup`-Event
+### `startup`-Event { #startup-event }
Um eine Funktion hinzuzufÃŧgen, die vor dem Start der Anwendung ausgefÃŧhrt werden soll, deklarieren Sie diese mit dem Event `startup`:
@@ -110,17 +110,17 @@ In diesem Fall initialisiert die Eventhandler-Funktion `startup` die âDatenban
Sie kÃļnnen mehr als eine Eventhandler-Funktion hinzufÃŧgen.
-Und Ihre Anwendung empfängt erst dann Anfragen, wenn alle `startup`-Eventhandler abgeschlossen sind.
+Und Ihre Anwendung empfängt erst dann Requests, wenn alle `startup`-Eventhandler abgeschlossen sind.
-### `shutdown`-Event
+### `shutdown`-Event { #shutdown-event }
-Um eine Funktion hinzuzufÃŧgen, die beim Herunterfahren der Anwendung ausgefÃŧhrt werden soll, deklarieren Sie sie mit dem Event `shutdown`:
+Um eine Funktion hinzuzufÃŧgen, die beim Shutdown der Anwendung ausgefÃŧhrt werden soll, deklarieren Sie sie mit dem Event `shutdown`:
{* ../../docs_src/events/tutorial002.py hl[6] *}
Hier schreibt die `shutdown`-Eventhandler-Funktion eine Textzeile `"Application shutdown"` in eine Datei `log.txt`.
-/// info
+/// info | Info
In der Funktion `open()` bedeutet `mode="a"` âappendâ (âanhängenâ), sodass die Zeile nach dem, was sich in dieser Datei befindet, hinzugefÃŧgt wird, ohne den vorherigen Inhalt zu Ãŧberschreiben.
@@ -138,21 +138,21 @@ Daher deklarieren wir die Eventhandler-Funktion mit Standard-`def` statt mit `as
///
-### `startup` und `shutdown` zusammen
+### `startup` und `shutdown` zusammen { #startup-and-shutdown-together }
-Es besteht eine hohe Wahrscheinlichkeit, dass die Logik fÃŧr Ihr *Hochfahren* und *Herunterfahren* miteinander verknÃŧpft ist. Vielleicht mÃļchten Sie etwas beginnen und es dann beenden, eine Ressource laden und sie dann freigeben usw.
+Es besteht eine hohe Wahrscheinlichkeit, dass die Logik fÃŧr Ihr *Startup* und *Shutdown* miteinander verknÃŧpft ist. Vielleicht mÃļchten Sie etwas beginnen und es dann beenden, eine Ressource laden und sie dann freigeben usw.
Bei getrennten Funktionen, die keine gemeinsame Logik oder Variablen haben, ist dies schwieriger, da Sie Werte in globalen Variablen speichern oder ähnliche Tricks verwenden mÃŧssen.
Aus diesem Grund wird jetzt empfohlen, stattdessen `lifespan` wie oben erläutert zu verwenden.
-## Technische Details
+## Technische Details { #technical-details }
Nur ein technisches Detail fÃŧr die neugierigen Nerds. đ¤
In der technischen ASGI-Spezifikation ist dies Teil des Lifespan Protokolls und definiert Events namens `startup` und `shutdown`.
-/// info
+/// info | Info
Weitere Informationen zu Starlettes `lifespan`-Handlern finden Sie in Starlettes Lifespan-Dokumentation.
@@ -160,6 +160,6 @@ EinschlieÃlich, wie man Lifespan-Zustand handhabt, der in anderen Bereichen Ihr
///
-## Unteranwendungen
+## Unteranwendungen { #sub-applications }
-đ¨ Beachten Sie, dass diese Lifespan-Events (Hochfahren und Herunterfahren) nur fÃŧr die Hauptanwendung ausgefÃŧhrt werden, nicht fÃŧr [Unteranwendungen â Mounts](sub-applications.md){.internal-link target=_blank}.
+đ¨ Beachten Sie, dass diese Lifespan-Events (Startup und Shutdown) nur fÃŧr die Hauptanwendung ausgefÃŧhrt werden, nicht fÃŧr [Unteranwendungen â Mounts](sub-applications.md){.internal-link target=_blank}.
diff --git a/docs/de/docs/advanced/generate-clients.md b/docs/de/docs/advanced/generate-clients.md
index f491d29af..d8836295b 100644
--- a/docs/de/docs/advanced/generate-clients.md
+++ b/docs/de/docs/advanced/generate-clients.md
@@ -1,121 +1,86 @@
-# Clients generieren
+# SDKs generieren { #generating-sdks }
-Da **FastAPI** auf der OpenAPI-Spezifikation basiert, erhalten Sie automatische Kompatibilität mit vielen Tools, einschlieÃlich der automatischen API-Dokumentation (bereitgestellt von Swagger UI).
+Da **FastAPI** auf der **OpenAPI**-Spezifikation basiert, kÃļnnen dessen APIs in einem standardisierten Format beschrieben werden, das viele Tools verstehen.
-Ein besonderer Vorteil, der nicht unbedingt offensichtlich ist, besteht darin, dass Sie fÃŧr Ihre API **Clients generieren** kÃļnnen (manchmal auch **SDKs** genannt), fÃŧr viele verschiedene **Programmiersprachen**.
+Dies vereinfacht es, aktuelle **Dokumentation** und Client-Bibliotheken (**SDKs**) in verschiedenen Sprachen zu generieren sowie **Test-** oder **Automatisierungs-Workflows**, die mit Ihrem Code synchron bleiben.
-## OpenAPI-Client-Generatoren
+In diesem Leitfaden erfahren Sie, wie Sie ein **TypeScript-SDK** fÃŧr Ihr FastAPI-Backend generieren.
-Es gibt viele Tools zum Generieren von Clients aus **OpenAPI**.
+## Open Source SDK-Generatoren { #open-source-sdk-generators }
-Ein gängiges Tool ist OpenAPI Generator.
+Eine vielseitige MÃļglichkeit ist der OpenAPI Generator, der **viele Programmiersprachen** unterstÃŧtzt und SDKs aus Ihrer OpenAPI-Spezifikation generieren kann.
-Wenn Sie ein **Frontend** erstellen, ist openapi-ts eine sehr interessante Alternative.
+FÃŧr **TypeScript-Clients** ist Hey API eine speziell entwickelte LÃļsung, die ein optimiertes Erlebnis fÃŧr das TypeScript-Ãkosystem bietet.
-## Client- und SDK-Generatoren â Sponsor
+Weitere SDK-Generatoren finden Sie auf OpenAPI.Tools.
-Es gibt auch einige **vom Unternehmen entwickelte** Client- und SDK-Generatoren, die auf OpenAPI (FastAPI) basieren. In einigen Fällen kÃļnnen diese Ihnen **weitere Funktionalität** zusätzlich zu qualitativ hochwertigen generierten SDKs/Clients bieten.
+/// tip | Tipp
-Einige von diesen ⨠[**sponsern FastAPI**](../help-fastapi.md#den-autor-sponsern){.internal-link target=_blank} â¨, das gewährleistet die kontinuierliche und gesunde **Entwicklung** von FastAPI und seinem **Ãkosystem**.
+FastAPI generiert automatisch **OpenAPI 3.1**-Spezifikationen, daher muss jedes von Ihnen verwendete Tool diese Version unterstÃŧtzen.
-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.
+## SDK-Generatoren von FastAPI-Sponsoren { #sdk-generators-from-fastapi-sponsors }
-Es gibt auch mehrere andere Unternehmen, welche ähnliche Dienste anbieten und die Sie online suchen und finden kÃļnnen. đ¤
+Dieser Abschnitt hebt **venture-unterstÃŧtzte** und **firmengestÃŧtzte** LÃļsungen hervor, die von Unternehmen entwickelt werden, welche FastAPI sponsern. Diese Produkte bieten **zusätzliche Funktionen** und **Integrationen** zusätzlich zu hochwertig generierten SDKs.
-## Einen TypeScript-Frontend-Client generieren
+Durch das ⨠[**Sponsoring von FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ⨠helfen diese Unternehmen sicherzustellen, dass das Framework und sein **Ãkosystem** gesund und **nachhaltig** bleiben.
+
+Ihr Sponsoring zeigt auch ein starkes Engagement fÃŧr die FastAPI-**Community** (Sie), was bedeutet, dass sie nicht nur einen **groÃartigen Service** bieten mÃļchten, sondern auch ein **robustes und florierendes Framework**, FastAPI, unterstÃŧtzen mÃļchten. đ
+
+Zum Beispiel kÃļnnten Sie ausprobieren:
+
+* Speakeasy
+* Stainless
+* liblab
+
+Einige dieser LÃļsungen sind mÃļglicherweise auch Open Source oder bieten kostenlose Tarife an, sodass Sie diese ohne finanzielle Verpflichtung ausprobieren kÃļnnen. Andere kommerzielle SDK-Generatoren sind online verfÃŧgbar und kÃļnnen dort gefunden werden. đ¤
+
+## Ein TypeScript-SDK erstellen { #create-a-typescript-sdk }
Beginnen wir mit einer einfachen FastAPI-Anwendung:
{* ../../docs_src/generate_clients/tutorial001_py39.py hl[7:9,12:13,16:17,21] *}
-Beachten Sie, dass die *Pfadoperationen* die Modelle definieren, welche diese fÃŧr die Request- und Response-Payload verwenden, indem sie die Modelle `Item` und `ResponseMessage` verwenden.
+Beachten Sie, dass die *Pfadoperationen* die Modelle definieren, die sie fÃŧr die Request- und Response-Payload verwenden, indem sie die Modelle `Item` und `ResponseMessage` verwenden.
-### API-Dokumentation
+### API-Dokumentation { #api-docs }
-Wenn Sie zur API-Dokumentation gehen, werden Sie sehen, dass diese die **Schemas** fÃŧr die Daten enthält, welche in Requests gesendet und in Responses empfangen werden:
+Wenn Sie zu `/docs` gehen, sehen Sie, dass es die **Schemas** fÃŧr die Daten enthält, die in Requests gesendet und in Responses empfangen werden:
-Sie kÃļnnen diese Schemas sehen, da sie mit den Modellen in der Anwendung deklariert wurden.
+Sie kÃļnnen diese Schemas sehen, da sie mit den Modellen in der App deklariert wurden.
-Diese Informationen sind im **OpenAPI-Schema** der Anwendung verfÃŧgbar und werden dann in der API-Dokumentation angezeigt (von Swagger UI).
+Diese Informationen sind im **OpenAPI-Schema** der Anwendung verfÃŧgbar und werden in der API-Dokumentation angezeigt.
-Und dieselben Informationen aus den Modellen, die in OpenAPI enthalten sind, kÃļnnen zum **Generieren des Client-Codes** verwendet werden.
+Diese Informationen aus den Modellen, die in OpenAPI enthalten sind, kÃļnnen verwendet werden, um **den Client-Code zu generieren**.
-### Einen TypeScript-Client generieren
+### Hey API { #hey-api }
-Nachdem wir nun die Anwendung mit den Modellen haben, kÃļnnen wir den Client-Code fÃŧr das Frontend generieren.
+Sobald wir eine FastAPI-App mit den Modellen haben, kÃļnnen wir Hey API verwenden, um einen TypeScript-Client zu generieren. Der schnellste Weg das zu tun, ist Ãŧber npx.
-#### `openapi-ts` installieren
-
-Sie kÃļnnen `openapi-ts` in Ihrem Frontend-Code installieren mit:
-
-
-Sie erhalten auÃerdem automatische Vervollständigung fÃŧr die zu sendende Payload:
+Sie werden auch eine automatische Vervollständigung fÃŧr die zu sendende Payload erhalten:
/// tip | Tipp
-Beachten Sie die automatische Vervollständigung fÃŧr `name` und `price`, welche in der FastAPI-Anwendung im `Item`-Modell definiert wurden.
+Beachten Sie die automatische Vervollständigung fÃŧr `name` und `price`, die in der FastAPI-Anwendung im `Item`-Modell definiert wurden.
///
@@ -127,17 +92,17 @@ Das Response-Objekt hat auch automatische Vervollständigung:
-## FastAPI-Anwendung mit Tags
+## FastAPI-Anwendung mit Tags { #fastapi-app-with-tags }
-In vielen Fällen wird Ihre FastAPI-Anwendung grÃļÃer sein und Sie werden wahrscheinlich Tags verwenden, um verschiedene Gruppen von *Pfadoperationen* zu separieren.
+In vielen Fällen wird Ihre FastAPI-App grÃļÃer sein und Sie werden wahrscheinlich Tags verwenden, um verschiedene Gruppen von *Pfadoperationen* zu separieren.
-Beispielsweise kÃļnnten Sie einen Abschnitt fÃŧr **Items (Artikel)** und einen weiteren Abschnitt fÃŧr **Users (Benutzer)** haben, und diese kÃļnnten durch Tags getrennt sein:
+Zum Beispiel kÃļnnten Sie einen Abschnitt fÃŧr **Items (Artikel)** und einen weiteren Abschnitt fÃŧr **Users (Benutzer)** haben, und diese kÃļnnten durch Tags getrennt sein:
{* ../../docs_src/generate_clients/tutorial002_py39.py hl[21,26,34] *}
-### Einen TypeScript-Client mit Tags generieren
+### Einen TypeScript-Client mit Tags generieren { #generate-a-typescript-client-with-tags }
-Wenn Sie unter Verwendung von Tags einen Client fÃŧr eine FastAPI-Anwendung generieren, wird normalerweise auch der Client-Code anhand der Tags getrennt.
+Wenn Sie einen Client fÃŧr eine FastAPI-App generieren, die Tags verwendet, wird normalerweise der Client-Code auch anhand der Tags getrennt.
Auf diese Weise kÃļnnen Sie die Dinge fÃŧr den Client-Code richtig ordnen und gruppieren:
@@ -148,7 +113,7 @@ In diesem Fall haben Sie:
* `ItemsService`
* `UsersService`
-### Client-Methodennamen
+### Client-Methodennamen { #client-method-names }
Im Moment sehen die generierten Methodennamen wie `createItemItemsPost` nicht sehr sauber aus:
@@ -158,31 +123,31 @@ ItemsService.createItemItemsPost({name: "Plumbus", price: 5})
... das liegt daran, dass der Client-Generator fÃŧr jede *Pfadoperation* die OpenAPI-interne **Operation-ID** verwendet.
-OpenAPI erfordert, dass jede Operation-ID innerhalb aller *Pfadoperationen* eindeutig ist. Daher verwendet FastAPI den **Funktionsnamen**, den **Pfad** und die **HTTP-Methode/-Operation**, um diese Operation-ID zu generieren. Denn so kann sichergestellt werden, dass die Operation-IDs eindeutig sind.
+OpenAPI erfordert, dass jede Operation-ID innerhalb aller *Pfadoperationen* einzigartig ist. Daher verwendet FastAPI den **Funktionsnamen**, den **Pfad** und die **HTTP-Methode/-Operation**, um diese Operation-ID zu generieren. Denn so kann sichergestellt werden, dass die Operation-IDs einzigartig sind.
-Aber ich zeige Ihnen als nächstes, wie Sie das verbessern kÃļnnen. đ¤
+Aber ich zeige Ihnen als Nächstes, wie Sie das verbessern kÃļnnen. đ¤
-## Benutzerdefinierte Operation-IDs und bessere Methodennamen
+## Benutzerdefinierte Operation-IDs und bessere Methodennamen { #custom-operation-ids-and-better-method-names }
Sie kÃļnnen die Art und Weise, wie diese Operation-IDs **generiert** werden, **ändern**, um sie einfacher zu machen und **einfachere Methodennamen** in den Clients zu haben.
-In diesem Fall mÃŧssen Sie auf andere Weise sicherstellen, dass jede Operation-ID **eindeutig** ist.
+In diesem Fall mÃŧssen Sie auf andere Weise sicherstellen, dass jede Operation-ID **einzigartig** ist.
-Sie kÃļnnten beispielsweise sicherstellen, dass jede *Pfadoperation* einen Tag hat, und dann die Operation-ID basierend auf dem **Tag** und dem **Namen** der *Pfadoperation* (dem Funktionsnamen) generieren.
+Zum Beispiel kÃļnnten Sie sicherstellen, dass jede *Pfadoperation* einen Tag hat, und dann die Operation-ID basierend auf dem **Tag** und dem *Pfadoperation*-**Namen** (dem Funktionsnamen) generieren.
-### Funktion zum Generieren einer eindeutigen ID erstellen
+### Eine benutzerdefinierte Funktion zur Erzeugung einer eindeutigen ID erstellen { #custom-generate-unique-id-function }
-FastAPI verwendet eine **eindeutige ID** fÃŧr jede *Pfadoperation*, diese wird fÃŧr die **Operation-ID** und auch fÃŧr die Namen aller benÃļtigten benutzerdefinierten Modelle fÃŧr Requests oder Responses verwendet.
+FastAPI verwendet eine **eindeutige ID** fÃŧr jede *Pfadoperation*, die fÃŧr die **Operation-ID** und auch fÃŧr die Namen aller benÃļtigten benutzerdefinierten Modelle fÃŧr Requests oder Responses verwendet wird.
-Sie kÃļnnen diese Funktion anpassen. Sie nimmt eine `APIRoute` und gibt einen String zurÃŧck.
+Sie kÃļnnen diese Funktion anpassen. Sie nimmt ein `APIRoute` und gibt einen String zurÃŧck.
-Hier verwendet sie beispielsweise den ersten Tag (Sie werden wahrscheinlich nur einen Tag haben) und den Namen der *Pfadoperation* (den Funktionsnamen).
+Hier verwendet sie beispielsweise den ersten Tag (Sie werden wahrscheinlich nur einen Tag haben) und den *Pfadoperation*-Namen (den Funktionsnamen).
-AnschlieÃend kÃļnnen Sie diese benutzerdefinierte Funktion als Parameter `generate_unique_id_function` an **FastAPI** Ãŧbergeben:
+AnschlieÃend kÃļnnen Sie diese benutzerdefinierte Funktion als `generate_unique_id_function`-Parameter an **FastAPI** Ãŧbergeben:
{* ../../docs_src/generate_clients/tutorial003_py39.py hl[6:7,10] *}
-### Einen TypeScript-Client mit benutzerdefinierten Operation-IDs generieren
+### Einen TypeScript-Client mit benutzerdefinierten Operation-IDs generieren { #generate-a-typescript-client-with-custom-operation-ids }
Wenn Sie nun den Client erneut generieren, werden Sie feststellen, dass er Ãŧber die verbesserten Methodennamen verfÃŧgt:
@@ -190,17 +155,17 @@ Wenn Sie nun den Client erneut generieren, werden Sie feststellen, dass er Ãŧber
Wie Sie sehen, haben die Methodennamen jetzt den Tag und dann den Funktionsnamen, aber keine Informationen aus dem URL-Pfad und der HTTP-Operation.
-### Vorab-Modifikation der OpenAPI-Spezifikation fÃŧr den Client-Generator
+### Die OpenAPI-Spezifikation fÃŧr den Client-Generator vorab modifizieren { #preprocess-the-openapi-specification-for-the-client-generator }
-Der generierte Code enthält immer noch etwas **verdoppelte Information**.
+Der generierte Code enthält immer noch einige **verdoppelte Informationen**.
-Wir wissen bereits, dass diese Methode mit den **Items** zusammenhängt, da sich dieses Wort in `ItemsService` befindet (vom Tag Ãŧbernommen), aber wir haben auch immer noch den Tagnamen im Methodennamen vorangestellt. đ
+Wir wissen bereits, dass diese Methode mit den **Items** zusammenhängt, weil dieses Wort in `ItemsService` enthalten ist (vom Tag Ãŧbernommen), aber wir haben den Tag-Namen dennoch im Methodennamen vorangestellt. đ
-Wir werden das wahrscheinlich weiterhin fÃŧr OpenAPI im Allgemeinen beibehalten wollen, da dadurch sichergestellt wird, dass die Operation-IDs **eindeutig** sind.
+Wir werden das wahrscheinlich weiterhin fÃŧr OpenAPI allgemein beibehalten wollen, da dadurch sichergestellt wird, dass die Operation-IDs **einzigartig** sind.
Aber fÃŧr den generierten Client kÃļnnten wir die OpenAPI-Operation-IDs direkt vor der Generierung der Clients **modifizieren**, um diese Methodennamen schÃļner und **sauberer** zu machen.
-Wir kÃļnnten das OpenAPI-JSON in eine Datei `openapi.json` herunterladen und dann mit einem Skript wie dem folgenden **den vorangestellten Tag entfernen**:
+Wir kÃļnnten das OpenAPI-JSON in eine Datei `openapi.json` herunterladen und dann mit einem Skript wie dem folgenden **den präfixierten Tag entfernen**:
{* ../../docs_src/generate_clients/tutorial004.py *}
@@ -214,44 +179,30 @@ Wir kÃļnnten das OpenAPI-JSON in eine Datei `openapi.json` herunterladen und dan
Damit wÃŧrden die Operation-IDs von Dingen wie `items-get_items` in `get_items` umbenannt, sodass der Client-Generator einfachere Methodennamen generieren kann.
-### Einen TypeScript-Client mit der modifizierten OpenAPI generieren
+### Einen TypeScript-Client mit der modifizierten OpenAPI generieren { #generate-a-typescript-client-with-the-preprocessed-openapi }
-Da das Endergebnis nun in einer Datei `openapi.json` vorliegt, wÃŧrden Sie die `package.json` ändern, um diese lokale Datei zu verwenden, zum Beispiel:
+Da das Endergebnis nun in einer `openapi.json`-Datei vorliegt, mÃŧssen Sie Ihren Eingabeort aktualisieren:
-```JSON hl_lines="7"
-{
- "name": "frontend-app",
- "version": "1.0.0",
- "description": "",
- "main": "index.js",
- "scripts": {
- "generate-client": "openapi-ts --input ./openapi.json --output ./src/client --client axios"
- },
- "author": "",
- "license": "",
- "devDependencies": {
- "@hey-api/openapi-ts": "^0.27.38",
- "typescript": "^4.6.2"
- }
-}
+```sh
+npx @hey-api/openapi-ts -i ./openapi.json -o src/client
```
-Nach der Generierung des neuen Clients hätten Sie nun **saubere Methodennamen** mit allen **Autovervollständigungen**, **Inline-Fehlerberichten**, usw.:
+Nach der Generierung des neuen Clients haben Sie jetzt **saubere Methodennamen**, mit allen **Autovervollständigungen**, **Inline-Fehlerberichten**, usw.:
-## Vorteile
+## Vorteile { #benefits }
-Wenn Sie die automatisch generierten Clients verwenden, erhalten Sie **automatische Codevervollständigung** fÃŧr:
+Wenn Sie die automatisch generierten Clients verwenden, erhalten Sie **Autovervollständigung** fÃŧr:
* Methoden.
* Request-Payloads im Body, Query-Parameter, usw.
* Response-Payloads.
-AuÃerdem erhalten Sie fÃŧr alles **Inline-Fehlerberichte**.
+Sie erhalten auch **Inline-Fehlerberichte** fÃŧr alles.
-Und wann immer Sie den Backend-Code aktualisieren und das Frontend **neu generieren**, stehen alle neuen *Pfadoperationen* als Methoden zur VerfÃŧgung, die alten werden entfernt und alle anderen Ãnderungen werden im generierten Code reflektiert. đ¤
+Und wann immer Sie den Backend-Code aktualisieren und **das Frontend neu generieren**, stehen alle neuen *Pfadoperationen* als Methoden zur VerfÃŧgung, die alten werden entfernt und alle anderen Ãnderungen werden im generierten Code reflektiert. đ¤
-Das bedeutet auch, dass, wenn sich etwas ändert, dies automatisch im Client-Code **reflektiert** wird. Und wenn Sie den Client **erstellen**, kommt es zu einer Fehlermeldung, wenn die verwendeten Daten **nicht Ãŧbereinstimmen**.
+Das bedeutet auch, dass, wenn sich etwas ändert, dies automatisch im Client-Code **reflektiert** wird. Und wenn Sie den Client **erstellen**, wird eine Fehlermeldung ausgegeben, wenn die verwendeten Daten **nicht Ãŧbereinstimmen**.
-Sie wÃŧrden also sehr frÃŧh im Entwicklungszyklus **viele Fehler erkennen**, anstatt darauf warten zu mÃŧssen, dass die Fehler Ihren Endbenutzern in der Produktion angezeigt werden, und dann zu versuchen, zu debuggen, wo das Problem liegt. â¨
+Sie wÃŧrden also **viele Fehler sehr frÃŧh** im Entwicklungszyklus erkennen, anstatt darauf warten zu mÃŧssen, dass die Fehler Ihren Endbenutzern in der Produktion angezeigt werden, und dann zu versuchen, zu debuggen, wo das Problem liegt. â¨
diff --git a/docs/de/docs/advanced/index.md b/docs/de/docs/advanced/index.md
index d93cd5fe8..98fc7bc2f 100644
--- a/docs/de/docs/advanced/index.md
+++ b/docs/de/docs/advanced/index.md
@@ -1,6 +1,6 @@
-# Handbuch fÃŧr fortgeschrittene Benutzer
+# Handbuch fÃŧr fortgeschrittene Benutzer { #advanced-user-guide }
-## Zusatzfunktionen
+## Zusatzfunktionen { #additional-features }
Das Haupt-[Tutorial â Benutzerhandbuch](../tutorial/index.md){.internal-link target=_blank} sollte ausreichen, um Ihnen einen Ãberblick Ãŧber alle Hauptfunktionen von **FastAPI** zu geben.
@@ -14,23 +14,8 @@ Und es ist mÃļglich, dass fÃŧr Ihren Anwendungsfall die LÃļsung in einem davon l
///
-## Lesen Sie zuerst das Tutorial
+## Das Tutorial zuerst lesen { #read-the-tutorial-first }
Sie kÃļnnen immer noch die meisten Funktionen in **FastAPI** mit den Kenntnissen aus dem Haupt-[Tutorial â Benutzerhandbuch](../tutorial/index.md){.internal-link target=_blank} nutzen.
-Und in den nächsten Abschnitten wird davon ausgegangen, dass Sie es bereits gelesen haben und dass Sie diese Haupt-Ideen kennen.
-
-## Externe Kurse
-
-Obwohl das [Tutorial â Benutzerhandbuch](../tutorial/index.md){.internal-link target=_blank} und dieses **Handbuch fÃŧr fortgeschrittene Benutzer** als gefÃŧhrtes Tutorial (wie ein Buch) geschrieben sind und fÃŧr Sie ausreichen sollten, um **FastAPI zu lernen**, mÃļchten Sie sie vielleicht durch zusätzliche Kurse ergänzen.
-
-Oder Sie belegen einfach lieber andere Kurse, weil diese besser zu Ihrem Lernstil passen.
-
-Einige Kursanbieter ⨠[**sponsern FastAPI**](../help-fastapi.md#den-autor-sponsern){.internal-link target=_blank} â¨, dies gewährleistet die kontinuierliche und gesunde **Entwicklung** von FastAPI und seinem **Ãkosystem**.
-
-Und es zeigt deren wahres Engagement fÃŧr FastAPI und seine **Gemeinschaft** (Sie), da diese Ihnen nicht nur eine **gute Lernerfahrung** bieten mÃļchten, sondern auch sicherstellen mÃļchten, dass Sie Ãŧber ein **gutes und gesundes Framework verfÃŧgen **, FastAPI. đ
-
-Vielleicht mÃļchten Sie ihre Kurse ausprobieren:
-
-* Talk Python Training
-* Test-Driven Development
+Und die nächsten Abschnitte setzen voraus, dass Sie es bereits gelesen haben und dass Sie diese Hauptideen kennen.
diff --git a/docs/de/docs/advanced/middleware.md b/docs/de/docs/advanced/middleware.md
index 17b339788..0a2a39699 100644
--- a/docs/de/docs/advanced/middleware.md
+++ b/docs/de/docs/advanced/middleware.md
@@ -1,4 +1,4 @@
-# Fortgeschrittene Middleware
+# Fortgeschrittene Middleware { #advanced-middleware }
Im Haupttutorial haben Sie gelesen, wie Sie Ihrer Anwendung [benutzerdefinierte Middleware](../tutorial/middleware.md){.internal-link target=_blank} hinzufÃŧgen kÃļnnen.
@@ -6,15 +6,15 @@ Und dann auch, wie man [CORS mittels der `CORSMiddleware`](../tutorial/cors.md){
In diesem Abschnitt werden wir sehen, wie man andere Middlewares verwendet.
-## ASGI-Middleware hinzufÃŧgen
+## ASGI-Middleware hinzufÃŧgen { #adding-asgi-middlewares }
-Da **FastAPI** auf Starlette basiert und die ASGI-Spezifikation implementiert, kÃļnnen Sie jede ASGI-Middleware verwenden.
+Da **FastAPI** auf Starlette basiert und die ASGI-Spezifikation implementiert, kÃļnnen Sie jede ASGI-Middleware verwenden.
Eine Middleware muss nicht speziell fÃŧr FastAPI oder Starlette gemacht sein, um zu funktionieren, solange sie der ASGI-Spezifikation genÃŧgt.
Im Allgemeinen handelt es sich bei ASGI-Middleware um Klassen, die als erstes Argument eine ASGI-Anwendung erwarten.
-In der Dokumentation fÃŧr ASGI-Middlewares von Drittanbietern wird Ihnen wahrscheinlich gesagt, etwa Folgendes zu tun:
+In der Dokumentation fÃŧr ASGI-Middlewares von Drittanbietern wird Ihnen wahrscheinlich gesagt, dass Sie etwa Folgendes tun sollen:
```Python
from unicorn import UnicornMiddleware
@@ -39,7 +39,7 @@ app.add_middleware(UnicornMiddleware, some_config="rainbow")
`app.add_middleware()` empfängt eine Middleware-Klasse als erstes Argument und dann alle weiteren Argumente, die an die Middleware Ãŧbergeben werden sollen.
-## Integrierte Middleware
+## Integrierte Middleware { #integrated-middlewares }
**FastAPI** enthält mehrere Middlewares fÃŧr gängige Anwendungsfälle. Wir werden als Nächstes sehen, wie man sie verwendet.
@@ -51,15 +51,15 @@ FÃŧr die nächsten Beispiele kÃļnnten Sie auch `from starlette.middleware.someth
///
-## `HTTPSRedirectMiddleware`
+## `HTTPSRedirectMiddleware` { #httpsredirectmiddleware }
-Erzwingt, dass alle eingehenden Requests entweder `https` oder `wss` sein mÃŧssen.
+Erzwingt, dass alle eingehenden Requests entweder `https` oder `wss` sein mÃŧssen.
Alle eingehenden Requests an `http` oder `ws` werden stattdessen an das sichere Schema umgeleitet.
{* ../../docs_src/advanced_middleware/tutorial001.py hl[2,6] *}
-## `TrustedHostMiddleware`
+## `TrustedHostMiddleware` { #trustedhostmiddleware }
Erzwingt, dass alle eingehenden Requests einen korrekt gesetzten `Host`-Header haben, um sich vor HTTP-Host-Header-Angriffen zu schÃŧtzen.
@@ -68,10 +68,11 @@ Erzwingt, dass alle eingehenden Requests einen korrekt gesetzten `Host`-Header h
Die folgenden Argumente werden unterstÃŧtzt:
* `allowed_hosts` â Eine Liste von Domain-Namen, die als Hostnamen zulässig sein sollten. Wildcard-Domains wie `*.example.com` werden unterstÃŧtzt, um Subdomains zu matchen. Um jeden Hostnamen zu erlauben, verwenden Sie entweder `allowed_hosts=["*"]` oder lassen Sie diese Middleware weg.
+* `www_redirect` â Wenn auf True gesetzt, werden Requests an Nicht-www-Versionen der erlaubten Hosts zu deren www-GegenstÃŧcken umgeleitet. Der Defaultwert ist `True`.
-Wenn ein eingehender Request nicht korrekt validiert wird, wird eine â400â-Response gesendet.
+Wenn ein eingehender Request nicht korrekt validiert wird, wird eine `400`-Response gesendet.
-## `GZipMiddleware`
+## `GZipMiddleware` { #gzipmiddleware }
Verarbeitet GZip-Responses fÃŧr alle Requests, die `"gzip"` im `Accept-Encoding`-Header enthalten.
@@ -81,9 +82,10 @@ Diese Middleware verarbeitet sowohl Standard- als auch Streaming-Responses.
Die folgenden Argumente werden unterstÃŧtzt:
-* `minimum_size` â Antworten, die kleiner als diese MindestgrÃļÃe in Bytes sind, nicht per GZip komprimieren. Der Defaultwert ist `500`.
+* `minimum_size` â Responses, die kleiner als diese MindestgrÃļÃe in Bytes sind, nicht per GZip komprimieren. Der Defaultwert ist `500`.
+* `compresslevel` â Wird während der GZip-Kompression verwendet. Es ist ein Ganzzahlwert zwischen 1 und 9. Der Defaultwert ist `9`. Ein niedrigerer Wert resultiert in schnellerer Kompression, aber grÃļÃeren DateigrÃļÃen, während ein hÃļherer Wert langsamere Kompression, aber kleinere DateigrÃļÃen zur Folge hat.
-## Andere Middlewares
+## Andere Middlewares { #other-middlewares }
Es gibt viele andere ASGI-Middlewares.
diff --git a/docs/de/docs/advanced/openapi-callbacks.md b/docs/de/docs/advanced/openapi-callbacks.md
index 53f06e24e..afc48bbb8 100644
--- a/docs/de/docs/advanced/openapi-callbacks.md
+++ b/docs/de/docs/advanced/openapi-callbacks.md
@@ -1,12 +1,12 @@
-# OpenAPI-Callbacks
+# OpenAPI-Callbacks { #openapi-callbacks }
-Sie kÃļnnten eine API mit einer *Pfadoperation* erstellen, die einen Request an eine *externe API* auslÃļsen kÃļnnte, welche von jemand anderem erstellt wurde (wahrscheinlich derselbe Entwickler, der Ihre API *verwenden* wÃŧrde).
+Sie kÃļnnten eine API mit einer *Pfadoperation* erstellen, die einen Request an eine *externe API* auslÃļsen kÃļnnte, welche von jemand anderem erstellt wurde (wahrscheinlich derselbe Entwickler, der Ihre API *verwenden* wÃŧrde).
-Der Vorgang, der stattfindet, wenn Ihre API-Anwendung die *externe API* aufruft, wird als âCallbackâ (âRÃŧckrufâ) bezeichnet. Denn die Software, die der externe Entwickler geschrieben hat, sendet einen Request an Ihre API und dann *ruft Ihre API zurÃŧck* (*calls back*) und sendet einen Request an eine *externe API* (die wahrscheinlich vom selben Entwickler erstellt wurde).
+Der Vorgang, der stattfindet, wenn Ihre API-Anwendung die *externe API* aufruft, wird als âCallbackâ bezeichnet. Denn die Software, die der externe Entwickler geschrieben hat, sendet einen Request an Ihre API und dann *ruft Ihre API zurÃŧck* (*calls back*) und sendet einen Request an eine *externe API* (die wahrscheinlich vom selben Entwickler erstellt wurde).
-In diesem Fall mÃļchten Sie mÃļglicherweise dokumentieren, wie diese externe API aussehen *sollte*. Welche *Pfadoperation* sie haben sollte, welchen Body sie erwarten sollte, welche Response sie zurÃŧckgeben sollte, usw.
+In diesem Fall mÃļchten Sie mÃļglicherweise dokumentieren, wie diese externe API aussehen *sollte*. Welche *Pfadoperation* sie haben sollte, welchen Body sie erwarten sollte, welche Response sie zurÃŧckgeben sollte, usw.
-## Eine Anwendung mit Callbacks
+## Eine Anwendung mit Callbacks { #an-app-with-callbacks }
Sehen wir uns das alles anhand eines Beispiels an.
@@ -16,14 +16,14 @@ Diese Rechnungen haben eine `id`, einen optionalen `title`, einen `customer` (Ku
Der Benutzer Ihrer API (ein externer Entwickler) erstellt mit einem POST-Request eine Rechnung in Ihrer API.
-Dann wird Ihre API (beispielsweise):
+Dann wird Ihre API (stellen wir uns vor):
* die Rechnung an einen Kunden des externen Entwicklers senden.
* das Geld einsammeln.
* eine Benachrichtigung an den API-Benutzer (den externen Entwickler) zurÃŧcksenden.
* Dies erfolgt durch Senden eines POST-Requests (von *Ihrer API*) an eine *externe API*, die von diesem externen Entwickler bereitgestellt wird (das ist der âCallbackâ).
-## Die normale **FastAPI**-Anwendung
+## Die normale **FastAPI**-Anwendung { #the-normal-fastapi-app }
Sehen wir uns zunächst an, wie die normale API-Anwendung aussehen wÃŧrde, bevor wir den Callback hinzufÃŧgen.
@@ -41,7 +41,7 @@ Der Query-Parameter `callback_url` verwendet einen Pydantic-OpenAPI-3-Ausdruck enthalten (mehr dazu weiter unten), wo er Variablen mit Parametern und Teilen des ursprÃŧnglichen Requests verwenden kann, der an *Ihre API* gesendet wurde.
-### Der Callback-Pfadausdruck
+### Der Callback-Pfadausdruck { #the-callback-path-expression }
Der Callback-*Pfad* kann einen OpenAPI-3-Ausdruck enthalten, welcher Teile des ursprÃŧnglichen Requests enthalten kann, der an *Ihre API* gesendet wurde.
@@ -163,7 +163,7 @@ Beachten Sie, dass die verwendete Callback-URL die URL enthält, die als Query-P
///
-### Den Callback-Router hinzufÃŧgen
+### Den Callback-Router hinzufÃŧgen { #add-the-callback-router }
An diesem Punkt haben Sie die benÃļtigte(n) *Callback-Pfadoperation(en)* (diejenige(n), die der *externe Entwickler* in der *externen API* implementieren sollte) im Callback-Router, den Sie oben erstellt haben.
@@ -177,9 +177,9 @@ Beachten Sie, dass Sie nicht den Router selbst (`invoices_callback_router`) an `
///
-### Es in der Dokumentation ansehen
+### Es in der Dokumentation testen { #check-the-docs }
-Jetzt kÃļnnen Sie Ihre Anwendung mit Uvicorn starten und auf http://127.0.0.1:8000/docs gehen.
+Jetzt kÃļnnen Sie Ihre Anwendung starten und auf http://127.0.0.1:8000/docs gehen.
Sie sehen Ihre Dokumentation, einschlieÃlich eines Abschnitts âCallbacksâ fÃŧr Ihre *Pfadoperation*, der zeigt, wie die *externe API* aussehen sollte:
diff --git a/docs/de/docs/advanced/openapi-webhooks.md b/docs/de/docs/advanced/openapi-webhooks.md
index 50b95eaf8..a09a675ed 100644
--- a/docs/de/docs/advanced/openapi-webhooks.md
+++ b/docs/de/docs/advanced/openapi-webhooks.md
@@ -1,54 +1,54 @@
-# OpenAPI-Webhooks
+# OpenAPI Webhooks { #openapi-webhooks }
-Es gibt Fälle, in denen Sie Ihren API-Benutzern mitteilen mÃļchten, dass Ihre Anwendung mit einigen Daten *deren* Anwendung aufrufen (ein Request senden) kÃļnnte, normalerweise um Ãŧber ein bestimmtes **Event** zu **benachrichtigen**.
+Es gibt Fälle, in denen Sie Ihren API-**Benutzern** mitteilen mÃļchten, dass Ihre App *deren* App mit einigen Daten aufrufen (einen Request senden) kÃļnnte, normalerweise um Ãŧber ein bestimmtes **Event** zu **benachrichtigen**.
-Das bedeutet, dass anstelle des normalen Prozesses, bei dem Benutzer Requests an Ihre API senden, **Ihre API** (oder Ihre Anwendung) **Requests an deren System** (an deren API, deren Anwendung) senden kÃļnnte.
+Das bedeutet, dass anstelle des normalen Prozesses, bei dem Ihre Benutzer Requests an Ihre API senden, **Ihre API** (oder Ihre App) **Requests an deren System** (an deren API, deren App) senden kÃļnnte.
-Das wird normalerweise als **Webhook** bezeichnet.
+Das wird normalerweise als **Webhook** bezeichnet.
-## Webhooks-Schritte
+## Webhooks-Schritte { #webhooks-steps }
Der Prozess besteht normalerweise darin, dass **Sie in Ihrem Code definieren**, welche Nachricht Sie senden mÃļchten, den **Body des Requests**.
-Sie definieren auch auf irgendeine Weise, zu welchen **Momenten** Ihre Anwendung diese Requests oder Events sendet.
+Sie definieren auch auf irgendeine Weise, in welchen **Momenten** Ihre App diese Requests oder Events senden wird.
-Und **Ihre Benutzer** definieren auf irgendeine Weise (zum Beispiel irgendwo in einem Web-Dashboard) die **URL**, an die Ihre Anwendung diese Requests senden soll.
+Und **Ihre Benutzer** definieren auf irgendeine Weise (zum Beispiel irgendwo in einem Web-Dashboard) die **URL**, an die Ihre App diese Requests senden soll.
Die gesamte **Logik** zur Registrierung der URLs fÃŧr Webhooks und der Code zum tatsächlichen Senden dieser Requests liegt bei Ihnen. Sie schreiben es so, wie Sie mÃļchten, in **Ihrem eigenen Code**.
-## Webhooks mit **FastAPI** und OpenAPI dokumentieren
+## Webhooks mit **FastAPI** und OpenAPI dokumentieren { #documenting-webhooks-with-fastapi-and-openapi }
-Mit **FastAPI** kÃļnnen Sie mithilfe von OpenAPI die Namen dieser Webhooks, die Arten von HTTP-Operationen, die Ihre Anwendung senden kann (z. B. `POST`, `PUT`, usw.) und die Request**bodys** definieren, die Ihre Anwendung senden wÃŧrde.
+Mit **FastAPI**, mithilfe von OpenAPI, kÃļnnen Sie die Namen dieser Webhooks, die Arten von HTTP-Operationen, die Ihre App senden kann (z. B. `POST`, `PUT`, usw.) und die Request**bodys** definieren, die Ihre App senden wÃŧrde.
-Dies kann es Ihren Benutzern viel einfacher machen, **deren APIs zu implementieren**, um Ihre **Webhook**-Requests zu empfangen. MÃļglicherweise kÃļnnen diese sogar einen Teil des eigenem API-Codes automatisch generieren.
+Dies kann es Ihren Benutzern viel einfacher machen, **deren APIs zu implementieren**, um Ihre **Webhook**-Requests zu empfangen. MÃļglicherweise kÃļnnen diese sogar einen Teil ihres eigenen API-Codes automatisch generieren.
-/// info
+/// info | Info
Webhooks sind in OpenAPI 3.1.0 und hÃļher verfÃŧgbar und werden von FastAPI `0.99.0` und hÃļher unterstÃŧtzt.
///
-## Eine Anwendung mit Webhooks
+## Eine App mit Webhooks { #an-app-with-webhooks }
-Wenn Sie eine **FastAPI**-Anwendung erstellen, gibt es ein `webhooks`-Attribut, mit dem Sie *Webhooks* definieren kÃļnnen, genauso wie Sie *Pfadoperationen* definieren wÃŧrden, zum Beispiel mit `@app.webhooks.post()`.
+Wenn Sie eine **FastAPI**-Anwendung erstellen, gibt es ein `webhooks`-Attribut, das Sie verwenden kÃļnnen, um *Webhooks* zu definieren, genauso wie Sie *Pfadoperationen* definieren wÃŧrden, zum Beispiel mit `@app.webhooks.post()`.
{* ../../docs_src/openapi_webhooks/tutorial001.py hl[9:13,36:53] *}
Die von Ihnen definierten Webhooks landen im **OpenAPI**-Schema und der automatischen **Dokumentations-Oberfläche**.
-/// info
+/// info | Info
-Das `app.webhooks`-Objekt ist eigentlich nur ein `APIRouter`, derselbe Typ, den Sie verwenden wÃŧrden, wenn Sie Ihre Anwendung mit mehreren Dateien strukturieren.
+Das `app.webhooks`-Objekt ist eigentlich nur ein `APIRouter`, derselbe Typ, den Sie verwenden wÃŧrden, wenn Sie Ihre App mit mehreren Dateien strukturieren.
///
-Beachten Sie, dass Sie bei Webhooks tatsächlich keinen *Pfad* (wie `/items/`) deklarieren, sondern dass der Text, den Sie dort Ãŧbergeben, lediglich eine **Kennzeichnung** des Webhooks (der Name des Events) ist. Zum Beispiel ist in `@app.webhooks.post("new-subscription")` der Webhook-Name `new-subscription`.
+Beachten Sie, dass Sie bei Webhooks tatsächlich keinen *Pfad* (wie `/items/`) deklarieren, der Text, den Sie dort Ãŧbergeben, ist lediglich eine **Kennzeichnung** des Webhooks (der Name des Events). Zum Beispiel ist in `@app.webhooks.post("new-subscription")` der Webhook-Name `new-subscription`.
-Das liegt daran, dass erwartet wird, dass **Ihre Benutzer** den tatsächlichen **URL-Pfad**, an dem diese den Webhook-Request empfangen mÃļchten, auf andere Weise definieren (z. B. Ãŧber ein Web-Dashboard).
+Das liegt daran, dass erwartet wird, dass **Ihre Benutzer** den tatsächlichen **URL-Pfad**, an dem sie den Webhook-Request empfangen mÃļchten, auf andere Weise definieren (z. B. Ãŧber ein Web-Dashboard).
-### Es in der Dokumentation ansehen
+### Die Dokumentation testen { #check-the-docs }
-Jetzt kÃļnnen Sie Ihre Anwendung mit Uvicorn starten und auf http://127.0.0.1:8000/docs gehen.
+Jetzt kÃļnnen Sie Ihre App starten und auf http://127.0.0.1:8000/docs gehen.
Sie werden sehen, dass Ihre Dokumentation die normalen *Pfadoperationen* und jetzt auch einige **Webhooks** enthält:
diff --git a/docs/de/docs/advanced/path-operation-advanced-configuration.md b/docs/de/docs/advanced/path-operation-advanced-configuration.md
index b6e88d2c9..f5ec7c49e 100644
--- a/docs/de/docs/advanced/path-operation-advanced-configuration.md
+++ b/docs/de/docs/advanced/path-operation-advanced-configuration.md
@@ -1,6 +1,6 @@
-# Fortgeschrittene Konfiguration der Pfadoperation
+# Fortgeschrittene Konfiguration der Pfadoperation { #path-operation-advanced-configuration }
-## OpenAPI operationId
+## OpenAPI operationId { #openapi-operationid }
/// warning | Achtung
@@ -14,13 +14,13 @@ Sie mÃŧssten sicherstellen, dass sie fÃŧr jede Operation eindeutig ist.
{* ../../docs_src/path_operation_advanced_configuration/tutorial001.py hl[6] *}
-### Verwendung des Namens der *Pfadoperation-Funktion* als operationId
+### Verwendung des Namens der *Pfadoperation-Funktion* als operationId { #using-the-path-operation-function-name-as-the-operationid }
Wenn Sie die Funktionsnamen Ihrer API als `operationId`s verwenden mÃļchten, kÃļnnen Sie Ãŧber alle iterieren und die `operation_id` jeder *Pfadoperation* mit deren `APIRoute.name` Ãŧberschreiben.
Sie sollten dies tun, nachdem Sie alle Ihre *Pfadoperationen* hinzugefÃŧgt haben.
-{* ../../docs_src/path_operation_advanced_configuration/tutorial002.py hl[2,12:21,24] *}
+{* ../../docs_src/path_operation_advanced_configuration/tutorial002.py hl[2, 12:21, 24] *}
/// tip | Tipp
@@ -36,13 +36,13 @@ Auch wenn diese sich in unterschiedlichen Modulen (Python-Dateien) befinden.
///
-## Von OpenAPI ausschlieÃen
+## Von OpenAPI ausschlieÃen { #exclude-from-openapi }
Um eine *Pfadoperation* aus dem generierten OpenAPI-Schema (und damit aus den automatischen Dokumentationssystemen) auszuschlieÃen, verwenden Sie den Parameter `include_in_schema` und setzen Sie ihn auf `False`:
{* ../../docs_src/path_operation_advanced_configuration/tutorial003.py hl[6] *}
-## Fortgeschrittene Beschreibung mittels Docstring
+## Fortgeschrittene Beschreibung mittels Docstring { #advanced-description-from-docstring }
Sie kÃļnnen die verwendeten Zeilen aus dem Docstring einer *Pfadoperation-Funktion* einschränken, die fÃŧr OpenAPI verwendet werden.
@@ -52,17 +52,17 @@ Sie wird nicht in der Dokumentation angezeigt, aber andere Tools (z. B. Sphinx)
{* ../../docs_src/path_operation_advanced_configuration/tutorial004.py hl[19:29] *}
-## Zusätzliche Responses
+## Zusätzliche Responses { #additional-responses }
Sie haben wahrscheinlich gesehen, wie man das `response_model` und den `status_code` fÃŧr eine *Pfadoperation* deklariert.
-Das definiert die Metadaten der Haupt-Response einer *Pfadoperation*.
+Das definiert die Metadaten der Haupt-Response einer *Pfadoperation*.
Sie kÃļnnen auch zusätzliche Responses mit deren Modellen, Statuscodes usw. deklarieren.
Es gibt hier in der Dokumentation ein ganzes Kapitel darÃŧber, Sie kÃļnnen es unter [Zusätzliche Responses in OpenAPI](additional-responses.md){.internal-link target=_blank} lesen.
-## OpenAPI-Extra
+## OpenAPI-Extra { #openapi-extra }
Wenn Sie in Ihrer Anwendung eine *Pfadoperation* deklarieren, generiert **FastAPI** automatisch die relevanten Metadaten dieser *Pfadoperation*, die in das OpenAPI-Schema aufgenommen werden sollen.
@@ -80,7 +80,7 @@ Dieses *Pfadoperation*-spezifische OpenAPI-Schema wird normalerweise automatisch
/// tip | Tipp
-Dies ist ein Low-Level Erweiterungspunkt.
+Dies ist ein Low-Level-Erweiterungspunkt.
Wenn Sie nur zusätzliche Responses deklarieren mÃŧssen, kÃļnnen Sie dies bequemer mit [Zusätzliche Responses in OpenAPI](additional-responses.md){.internal-link target=_blank} tun.
@@ -88,9 +88,9 @@ Wenn Sie nur zusätzliche Responses deklarieren mÃŧssen, kÃļnnen Sie dies bequem
Sie kÃļnnen das OpenAPI-Schema fÃŧr eine *Pfadoperation* erweitern, indem Sie den Parameter `openapi_extra` verwenden.
-### OpenAPI-Erweiterungen
+### OpenAPI-Erweiterungen { #openapi-extensions }
-Dieses `openapi_extra` kann beispielsweise hilfreich sein, um OpenAPI-Erweiterungen zu deklarieren:
+Dieses `openapi_extra` kann beispielsweise hilfreich sein, um [OpenAPI-Erweiterungen](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#specificationExtensions) zu deklarieren:
{* ../../docs_src/path_operation_advanced_configuration/tutorial005.py hl[6] *}
@@ -129,43 +129,43 @@ Und wenn Sie die resultierende OpenAPI sehen (unter `/openapi.json` in Ihrer API
}
```
-### Benutzerdefiniertes OpenAPI-*Pfadoperation*-Schema
+### Benutzerdefiniertes OpenAPI-*Pfadoperation*-Schema { #custom-openapi-path-operation-schema }
-Das Dictionary in `openapi_extra` wird mit dem automatisch generierten OpenAPI-Schema fÃŧr die *Pfadoperation* zusammengefÃŧhrt (mittels Deep Merge).
+Das Dictionary in `openapi_extra` wird mit dem automatisch generierten OpenAPI-Schema fÃŧr die *Pfadoperation* zusammengefÃŧhrt (mittels Deep Merge).
Sie kÃļnnen dem automatisch generierten Schema also zusätzliche Daten hinzufÃŧgen.
-Sie kÃļnnten sich beispielsweise dafÃŧr entscheiden, den Request mit Ihrem eigenen Code zu lesen und zu validieren, ohne die automatischen Funktionen von FastAPI mit Pydantic zu verwenden, aber Sie kÃļnnten den Request trotzdem im OpenAPI-Schema definieren wollen.
+Sie kÃļnnten sich beispielsweise dafÃŧr entscheiden, den Request mit Ihrem eigenen Code zu lesen und zu validieren, ohne die automatischen Funktionen von FastAPI mit Pydantic zu verwenden, aber Sie kÃļnnten den Request trotzdem im OpenAPI-Schema definieren wollen.
Das kÃļnnte man mit `openapi_extra` machen:
-{* ../../docs_src/path_operation_advanced_configuration/tutorial006.py hl[20:37,39:40] *}
+{* ../../docs_src/path_operation_advanced_configuration/tutorial006.py hl[19:36, 39:40] *}
-In diesem Beispiel haben wir kein Pydantic-Modell deklariert. Tatsächlich wird der Requestbody nicht einmal als JSON geparst, sondern direkt als `bytes` gelesen und die Funktion `magic_data_reader ()` wäre dafÃŧr verantwortlich, ihn in irgendeiner Weise zu parsen.
+In diesem Beispiel haben wir kein Pydantic-Modell deklariert. Tatsächlich wird der Requestbody nicht einmal als JSON geparst, sondern direkt als `bytes` gelesen und die Funktion `magic_data_reader()` wäre dafÃŧr verantwortlich, ihn in irgendeiner Weise zu parsen.
Dennoch kÃļnnen wir das zu erwartende Schema fÃŧr den Requestbody deklarieren.
-### Benutzerdefinierter OpenAPI-Content-Type
+### Benutzerdefinierter OpenAPI-Content-Type { #custom-openapi-content-type }
Mit demselben Trick kÃļnnten Sie ein Pydantic-Modell verwenden, um das JSON-Schema zu definieren, das dann im benutzerdefinierten Abschnitt des OpenAPI-Schemas fÃŧr die *Pfadoperation* enthalten ist.
-Und Sie kÃļnnten dies auch tun, wenn der Datentyp in der Anfrage nicht JSON ist.
+Und Sie kÃļnnten dies auch tun, wenn der Datentyp im Request nicht JSON ist.
In der folgenden Anwendung verwenden wir beispielsweise weder die integrierte Funktionalität von FastAPI zum Extrahieren des JSON-Schemas aus Pydantic-Modellen noch die automatische Validierung fÃŧr JSON. Tatsächlich deklarieren wir den Request-Content-Type als YAML und nicht als JSON:
//// tab | Pydantic v2
-{* ../../docs_src/path_operation_advanced_configuration/tutorial007.py hl[17:22,24] *}
+{* ../../docs_src/path_operation_advanced_configuration/tutorial007.py hl[17:22, 24] *}
////
//// tab | Pydantic v1
-{* ../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py hl[17:22,24] *}
+{* ../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py hl[17:22, 24] *}
////
-/// info
+/// info | Info
In Pydantic Version 1 hieà die Methode zum Abrufen des JSON-Schemas fÃŧr ein Modell `Item.schema()`, in Pydantic Version 2 heiÃt die Methode `Item.model_json_schema()`.
@@ -189,7 +189,7 @@ Und dann parsen wir in unserem Code diesen YAML-Inhalt direkt und verwenden dann
////
-/// info
+/// info | Info
In Pydantic Version 1 war die Methode zum Parsen und Validieren eines Objekts `Item.parse_obj()`, in Pydantic Version 2 heiÃt die Methode `Item.model_validate()`.
diff --git a/docs/de/docs/advanced/response-change-status-code.md b/docs/de/docs/advanced/response-change-status-code.md
index 0aac32f4e..b079e241d 100644
--- a/docs/de/docs/advanced/response-change-status-code.md
+++ b/docs/de/docs/advanced/response-change-status-code.md
@@ -1,31 +1,31 @@
-# Response â Statuscode ändern
+# Response â Statuscode ändern { #response-change-status-code }
-Sie haben wahrscheinlich schon vorher gelesen, dass Sie einen Standard-[Response-Statuscode](../tutorial/response-status-code.md){.internal-link target=_blank} festlegen kÃļnnen.
+Sie haben wahrscheinlich schon vorher gelesen, dass Sie einen Default-[Response-Statuscode](../tutorial/response-status-code.md){.internal-link target=_blank} festlegen kÃļnnen.
-In manchen Fällen mÃŧssen Sie jedoch einen anderen als den Standard-Statuscode zurÃŧckgeben.
+In manchen Fällen mÃŧssen Sie jedoch einen anderen als den Default-Statuscode zurÃŧckgeben.
-## Anwendungsfall
+## Anwendungsfall { #use-case }
Stellen Sie sich zum Beispiel vor, Sie mÃļchten standardmäÃig den HTTP-Statuscode âOKâ `200` zurÃŧckgeben.
-Wenn die Daten jedoch nicht vorhanden waren, mÃļchten Sie diese erstellen und den HTTP-Statuscode âCREATEDâ `201` zurÃŧckgeben.
+Wenn die Daten jedoch nicht vorhanden sind, mÃļchten Sie diese erstellen und den HTTP-Statuscode âCREATEDâ `201` zurÃŧckgeben.
Sie mÃļchten aber dennoch in der Lage sein, die von Ihnen zurÃŧckgegebenen Daten mit einem `response_model` zu filtern und zu konvertieren.
In diesen Fällen kÃļnnen Sie einen `Response`-Parameter verwenden.
-## Einen `Response`-Parameter verwenden
+## Einen `Response`-Parameter verwenden { #use-a-response-parameter }
Sie kÃļnnen einen Parameter vom Typ `Response` in Ihrer *Pfadoperation-Funktion* deklarieren (wie Sie es auch fÃŧr Cookies und Header tun kÃļnnen).
-AnschlieÃend kÃļnnen Sie den `status_code` in diesem *vorÃŧbergehenden* Response-Objekt festlegen.
+AnschlieÃend kÃļnnen Sie den `status_code` in diesem *vorÃŧbergehenden* Response-Objekt festlegen.
{* ../../docs_src/response_change_status_code/tutorial001.py hl[1,9,12] *}
-Und dann kÃļnnen Sie wie gewohnt jedes benÃļtigte Objekt zurÃŧckgeben (ein `dict`, ein Datenbankmodell usw.).
+Und dann kÃļnnen Sie jedes benÃļtigte Objekt zurÃŧckgeben, wie Sie es normalerweise tun wÃŧrden (ein `dict`, ein Datenbankmodell usw.).
Und wenn Sie ein `response_model` deklariert haben, wird es weiterhin zum Filtern und Konvertieren des von Ihnen zurÃŧckgegebenen Objekts verwendet.
**FastAPI** verwendet diese *vorÃŧbergehende* Response, um den Statuscode (auch Cookies und Header) zu extrahieren und fÃŧgt diese in die endgÃŧltige Response ein, die den von Ihnen zurÃŧckgegebenen Wert enthält, gefiltert nach einem beliebigen `response_model`.
-Sie kÃļnnen den Parameter `Response` auch in Abhängigkeiten deklarieren und den Statuscode darin festlegen. Bedenken Sie jedoch, dass der gewinnt, welcher zuletzt gesetzt wird.
+Sie kÃļnnen den Parameter `Response` auch in Abhängigkeiten deklarieren und den Statuscode darin festlegen. Bedenken Sie jedoch, dass der zuletzt gesetzte gewinnt.
diff --git a/docs/de/docs/advanced/response-cookies.md b/docs/de/docs/advanced/response-cookies.md
index 5fe2cf7e3..0dd4175dd 100644
--- a/docs/de/docs/advanced/response-cookies.md
+++ b/docs/de/docs/advanced/response-cookies.md
@@ -1,12 +1,12 @@
-# Response-Cookies
+# Response-Cookies { #response-cookies }
-## Einen `Response`-Parameter verwenden
+## Einen `Response`-Parameter verwenden { #use-a-response-parameter }
Sie kÃļnnen einen Parameter vom Typ `Response` in Ihrer *Pfadoperation-Funktion* deklarieren.
-Und dann kÃļnnen Sie Cookies in diesem *vorÃŧbergehenden* Response-Objekt setzen.
+Und dann kÃļnnen Sie Cookies in diesem *vorÃŧbergehenden* Response-Objekt setzen.
-{* ../../docs_src/response_cookies/tutorial002.py hl[1,8:9] *}
+{* ../../docs_src/response_cookies/tutorial002.py hl[1, 8:9] *}
AnschlieÃend kÃļnnen Sie wie gewohnt jedes gewÃŧnschte Objekt zurÃŧckgeben (ein `dict`, ein Datenbankmodell, usw.).
@@ -16,7 +16,7 @@ Und wenn Sie ein `response_model` deklariert haben, wird es weiterhin zum Filter
Sie kÃļnnen den `Response`-Parameter auch in Abhängigkeiten deklarieren und darin Cookies (und Header) setzen.
-## Eine `Response` direkt zurÃŧckgeben
+## Eine `Response` direkt zurÃŧckgeben { #return-a-response-directly }
Sie kÃļnnen Cookies auch erstellen, wenn Sie eine `Response` direkt in Ihrem Code zurÃŧckgeben.
@@ -36,7 +36,7 @@ Und auch, dass Sie keine Daten senden, die durch ein `response_model` hätten ge
///
-### Mehr Informationen
+### Mehr Informationen { #more-info }
/// note | Technische Details
diff --git a/docs/de/docs/advanced/response-directly.md b/docs/de/docs/advanced/response-directly.md
index b84aa8ab9..d99517373 100644
--- a/docs/de/docs/advanced/response-directly.md
+++ b/docs/de/docs/advanced/response-directly.md
@@ -1,16 +1,16 @@
-# Eine Response direkt zurÃŧckgeben
+# Eine Response direkt zurÃŧckgeben { #return-a-response-directly }
-Wenn Sie eine **FastAPI** *Pfadoperation* erstellen, kÃļnnen Sie normalerweise beliebige Daten davon zurÃŧckgeben: ein `dict`, eine `list`e, ein Pydantic-Modell, ein Datenbankmodell, usw.
+Wenn Sie eine **FastAPI** *Pfadoperation* erstellen, kÃļnnen Sie normalerweise beliebige Daten davon zurÃŧckgeben: ein `dict`, eine `list`, ein Pydantic-Modell, ein Datenbankmodell, usw.
StandardmäÃig konvertiert **FastAPI** diesen RÃŧckgabewert automatisch nach JSON, mithilfe des `jsonable_encoder`, der in [JSON-kompatibler Encoder](../tutorial/encoder.md){.internal-link target=_blank} erläutert wird.
-Dann wÃŧrde es hinter den Kulissen diese JSON-kompatiblen Daten (z. B. ein `dict`) in eine `JSONResponse` einfÃŧgen, die zum Senden der Response an den Client verwendet wÃŧrde.
+Dann wÃŧrde es hinter den Kulissen diese JSON-kompatiblen Daten (z. B. ein `dict`) in eine `JSONResponse` einfÃŧgen, die zum Senden der Response an den Client verwendet wird.
Sie kÃļnnen jedoch direkt eine `JSONResponse` von Ihren *Pfadoperationen* zurÃŧckgeben.
Das kann beispielsweise nÃŧtzlich sein, um benutzerdefinierte Header oder Cookies zurÃŧckzugeben.
-## Eine `Response` zurÃŧckgeben
+## Eine `Response` zurÃŧckgeben { #return-a-response }
Tatsächlich kÃļnnen Sie jede `Response` oder jede Unterklasse davon zurÃŧckgeben.
@@ -26,7 +26,7 @@ Es wird keine Datenkonvertierung mit Pydantic-Modellen durchfÃŧhren, es wird den
Dadurch haben Sie viel Flexibilität. Sie kÃļnnen jeden Datentyp zurÃŧckgeben, jede Datendeklaration oder -validierung Ãŧberschreiben, usw.
-## Verwendung des `jsonable_encoder` in einer `Response`
+## Verwendung des `jsonable_encoder` in einer `Response` { #using-the-jsonable-encoder-in-a-response }
Da **FastAPI** keine Ãnderungen an einer von Ihnen zurÃŧckgegebenen `Response` vornimmt, mÃŧssen Sie sicherstellen, dass deren Inhalt dafÃŧr bereit ist.
@@ -38,13 +38,13 @@ In diesen Fällen kÃļnnen Sie den `jsonable_encoder` verwenden, um Ihre Daten zu
/// note | Technische Details
-Sie kÃļnnen auch `from starlette.responses import JSONResponse` verwenden.
+Sie kÃļnnten auch `from starlette.responses import JSONResponse` verwenden.
**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit fÃŧr Sie, den Entwickler. Die meisten verfÃŧgbaren Responses kommen aber direkt von Starlette.
///
-## Eine benutzerdefinierte `Response` zurÃŧckgeben
+## Eine benutzerdefinierte `Response` zurÃŧckgeben { #returning-a-custom-response }
Das obige Beispiel zeigt alle Teile, die Sie benÃļtigen, ist aber noch nicht sehr nÃŧtzlich, da Sie das `item` einfach direkt hätten zurÃŧckgeben kÃļnnen, und **FastAPI** wÃŧrde es fÃŧr Sie in eine `JSONResponse` einfÃŧgen, es in ein `dict` konvertieren, usw. All das standardmäÃig.
@@ -56,7 +56,7 @@ Sie kÃļnnten Ihren XML-Inhalt als String in eine `Response` einfÃŧgen und sie zu
{* ../../docs_src/response_directly/tutorial002.py hl[1,18] *}
-## Anmerkungen
+## Anmerkungen { #notes }
Wenn Sie eine `Response` direkt zurÃŧcksenden, werden deren Daten weder validiert, konvertiert (serialisiert), noch automatisch dokumentiert.
diff --git a/docs/de/docs/advanced/response-headers.md b/docs/de/docs/advanced/response-headers.md
index bf0bd7296..a5e310d55 100644
--- a/docs/de/docs/advanced/response-headers.md
+++ b/docs/de/docs/advanced/response-headers.md
@@ -1,12 +1,12 @@
-# Response-Header
+# Response-Header { #response-headers }
-## Verwenden Sie einen `Response`-Parameter
+## Einen `Response`-Parameter verwenden { #use-a-response-parameter }
Sie kÃļnnen einen Parameter vom Typ `Response` in Ihrer *Pfadoperation-Funktion* deklarieren (wie Sie es auch fÃŧr Cookies tun kÃļnnen).
-Und dann kÃļnnen Sie Header in diesem *vorÃŧbergehenden* Response-Objekt festlegen.
+Und dann kÃļnnen Sie Header in diesem *vorÃŧbergehenden* Response-Objekt festlegen.
-{* ../../docs_src/response_headers/tutorial002.py hl[1,7:8] *}
+{* ../../docs_src/response_headers/tutorial002.py hl[1, 7:8] *}
AnschlieÃend kÃļnnen Sie wie gewohnt jedes gewÃŧnschte Objekt zurÃŧckgeben (ein `dict`, ein Datenbankmodell, usw.).
@@ -16,7 +16,7 @@ Und wenn Sie ein `response_model` deklariert haben, wird es weiterhin zum Filter
Sie kÃļnnen den Parameter `Response` auch in Abhängigkeiten deklarieren und darin Header (und Cookies) festlegen.
-## Eine `Response` direkt zurÃŧckgeben
+## Eine `Response` direkt zurÃŧckgeben { #return-a-response-directly }
Sie kÃļnnen auch Header hinzufÃŧgen, wenn Sie eine `Response` direkt zurÃŧckgeben.
@@ -34,8 +34,8 @@ Und da die `Response` häufig zum Setzen von Headern und Cookies verwendet wird,
///
-## Benutzerdefinierte Header
+## Benutzerdefinierte Header { #custom-headers }
-Beachten Sie, dass benutzerdefinierte proprietäre Header mittels des Präfix 'X-' hinzugefÃŧgt werden kÃļnnen.
+Beachten Sie, dass benutzerdefinierte proprietäre Header mittels des Präfix `X-` hinzugefÃŧgt werden kÃļnnen.
-Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen kÃļnnen soll, mÃŧssen Sie diese zu Ihren CORS-Konfigurationen hinzufÃŧgen (weitere Informationen finden Sie unter [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md){.internal-link target=_blank}), unter Verwendung des Parameters `expose_headers`, dokumentiert in Starlettes CORS-Dokumentation.
+Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen kÃļnnen soll, mÃŧssen Sie diese zu Ihrer CORS-Konfiguration hinzufÃŧgen (weitere Informationen finden Sie unter [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md){.internal-link target=_blank}), unter Verwendung des Parameters `expose_headers`, dokumentiert in Starlettes CORS-Dokumentation.
diff --git a/docs/de/docs/advanced/security/http-basic-auth.md b/docs/de/docs/advanced/security/http-basic-auth.md
index 36498c01d..f906ecd92 100644
--- a/docs/de/docs/advanced/security/http-basic-auth.md
+++ b/docs/de/docs/advanced/security/http-basic-auth.md
@@ -1,4 +1,4 @@
-# HTTP Basic Auth
+# HTTP Basic Auth { #http-basic-auth }
FÃŧr die einfachsten Fälle kÃļnnen Sie HTTP Basic Auth verwenden.
@@ -6,13 +6,13 @@ Bei HTTP Basic Auth erwartet die Anwendung einen Header, der einen Benutzernamen
Wenn sie diesen nicht empfängt, gibt sie den HTTP-Error 401 âUnauthorizedâ zurÃŧck.
-Und gibt einen Header `WWW-Authenticate` mit dem Wert `Basic` und einem optionalen `realm`-Parameter (âBereichâ) zurÃŧck.
+Und gibt einen Header `WWW-Authenticate` mit dem Wert `Basic` und einem optionalen `realm`-Parameter zurÃŧck.
Dadurch wird der Browser angewiesen, die integrierte Eingabeaufforderung fÃŧr einen Benutzernamen und ein Passwort anzuzeigen.
Wenn Sie dann den Benutzernamen und das Passwort eingeben, sendet der Browser diese automatisch im Header.
-## Einfaches HTTP Basic Auth
+## Einfaches HTTP Basic Auth { #simple-http-basic-auth }
* Importieren Sie `HTTPBasic` und `HTTPBasicCredentials`.
* Erstellen Sie mit `HTTPBasic` ein â`security`-Schemaâ.
@@ -21,11 +21,12 @@ Wenn Sie dann den Benutzernamen und das Passwort eingeben, sendet der Browser di
* Es enthält den gesendeten `username` und das gesendete `password`.
{* ../../docs_src/security/tutorial006_an_py39.py hl[4,8,12] *}
+
Wenn Sie versuchen, die URL zum ersten Mal zu Ãļffnen (oder in der Dokumentation auf den Button âExecuteâ zu klicken), wird der Browser Sie nach Ihrem Benutzernamen und Passwort fragen:
-## Den Benutzernamen ÃŧberprÃŧfen
+## Den Benutzernamen ÃŧberprÃŧfen { #check-the-username }
Hier ist ein vollständigeres Beispiel.
@@ -51,13 +52,13 @@ if not (credentials.username == "stanleyjobson") or not (credentials.password ==
Aber durch die Verwendung von `secrets.compare_digest()` ist dieser Code sicher vor einer Art von Angriffen, die âTiming-Angriffeâ genannt werden.
-### Timing-Angriffe
+### Timing-Angriffe { #timing-attacks }
Aber was ist ein âTiming-Angriffâ?
Stellen wir uns vor, dass einige Angreifer versuchen, den Benutzernamen und das Passwort zu erraten.
-Und sie senden eine Anfrage mit dem Benutzernamen `johndoe` und dem Passwort `love123`.
+Und sie senden einen Request mit dem Benutzernamen `johndoe` und dem Passwort `love123`.
Dann wÃŧrde der Python-Code in Ihrer Anwendung etwa so aussehen:
@@ -77,21 +78,21 @@ if "stanleyjobsox" == "stanleyjobson" and "love123" == "swordfish":
...
```
-Python muss das gesamte `stanleyjobso` in `stanleyjobsox` und `stanleyjobson` vergleichen, bevor es erkennt, dass beide Zeichenfolgen nicht gleich sind. Daher wird es einige zusätzliche Mikrosekunden dauern, bis die Antwort âIncorrect username or passwordâ erfolgt.
+Python muss das gesamte `stanleyjobso` in `stanleyjobsox` und `stanleyjobson` vergleichen, bevor es erkennt, dass beide Zeichenfolgen nicht gleich sind. Daher wird es einige zusätzliche Mikrosekunden dauern, bis die Response âIncorrect username or passwordâ erfolgt.
-#### Die Zeit zum Antworten hilft den Angreifern
+#### Die Zeit zum Antworten hilft den Angreifern { #the-time-to-answer-helps-the-attackers }
-Wenn die Angreifer zu diesem Zeitpunkt feststellen, dass der Server einige Mikrosekunden länger braucht, um die Antwort âIncorrect username or passwordâ zu senden, wissen sie, dass sie _etwas_ richtig gemacht haben, einige der Anfangsbuchstaben waren richtig.
+Wenn die Angreifer zu diesem Zeitpunkt feststellen, dass der Server einige Mikrosekunden länger braucht, um die Response âIncorrect username or passwordâ zu senden, wissen sie, dass sie _etwas_ richtig gemacht haben, einige der Anfangsbuchstaben waren richtig.
Und dann kÃļnnen sie es noch einmal versuchen, wohl wissend, dass es wahrscheinlich eher etwas mit `stanleyjobsox` als mit `johndoe` zu tun hat.
-#### Ein âprofessionellerâ Angriff
+#### Ein âprofessionellerâ Angriff { #a-professional-attack }
NatÃŧrlich wÃŧrden die Angreifer das alles nicht von Hand versuchen, sondern ein Programm dafÃŧr schreiben, mÃļglicherweise mit Tausenden oder Millionen Tests pro Sekunde. Und wÃŧrden jeweils nur einen zusätzlichen richtigen Buchstaben erhalten.
Aber so hätten die Angreifer in wenigen Minuten oder Stunden mit der âHilfeâ unserer Anwendung den richtigen Benutzernamen und das richtige Passwort erraten, indem sie die Zeitspanne zur Hilfe nehmen, die diese zur Beantwortung benÃļtigt.
-#### Das Problem beheben mittels `secrets.compare_digest()`
+#### Das Problem beheben mittels `secrets.compare_digest()` { #fix-it-with-secrets-compare-digest }
Aber in unserem Code verwenden wir tatsächlich `secrets.compare_digest()`.
@@ -99,7 +100,7 @@ Damit wird, kurz gesagt, der Vergleich von `stanleyjobsox` mit `stanleyjobson` g
So ist Ihr Anwendungscode, dank der Verwendung von `secrets.compare_digest()`, vor dieser ganzen Klasse von Sicherheitsangriffen geschÃŧtzt.
-### Den Error zurÃŧckgeben
+### Den Error zurÃŧckgeben { #return-the-error }
Nachdem Sie festgestellt haben, dass die Anmeldeinformationen falsch sind, geben Sie eine `HTTPException` mit dem Statuscode 401 zurÃŧck (derselbe, der auch zurÃŧckgegeben wird, wenn keine Anmeldeinformationen angegeben werden) und fÃŧgen den Header `WWW-Authenticate` hinzu, damit der Browser die Anmeldeaufforderung erneut anzeigt:
diff --git a/docs/de/docs/advanced/security/index.md b/docs/de/docs/advanced/security/index.md
index 25eeb25b5..d7e633231 100644
--- a/docs/de/docs/advanced/security/index.md
+++ b/docs/de/docs/advanced/security/index.md
@@ -1,6 +1,6 @@
-# Fortgeschrittene Sicherheit
+# Fortgeschrittene Sicherheit { #advanced-security }
-## Zusatzfunktionen
+## Zusatzfunktionen { #additional-features }
Neben den in [Tutorial â Benutzerhandbuch: Sicherheit](../../tutorial/security/index.md){.internal-link target=_blank} behandelten Funktionen gibt es noch einige zusätzliche Funktionen zur Handhabung der Sicherheit.
@@ -12,8 +12,8 @@ Und es ist mÃļglich, dass fÃŧr Ihren Anwendungsfall die LÃļsung in einem davon l
///
-## Lesen Sie zuerst das Tutorial
+## Das Tutorial zuerst lesen { #read-the-tutorial-first }
-In den nächsten Abschnitten wird davon ausgegangen, dass Sie das Haupt-[Tutorial â Benutzerhandbuch: Sicherheit](../../tutorial/security/index.md){.internal-link target=_blank} bereits gelesen haben.
+Die nächsten Abschnitte setzen voraus, dass Sie das Haupt-[Tutorial â Benutzerhandbuch: Sicherheit](../../tutorial/security/index.md){.internal-link target=_blank} bereits gelesen haben.
Sie basieren alle auf den gleichen Konzepten, ermÃļglichen jedoch einige zusätzliche Funktionalitäten.
diff --git a/docs/de/docs/advanced/security/oauth2-scopes.md b/docs/de/docs/advanced/security/oauth2-scopes.md
index ed8f69d18..b96715d5a 100644
--- a/docs/de/docs/advanced/security/oauth2-scopes.md
+++ b/docs/de/docs/advanced/security/oauth2-scopes.md
@@ -1,12 +1,12 @@
-# OAuth2-Scopes
+# OAuth2-Scopes { #oauth2-scopes }
Sie kÃļnnen OAuth2-Scopes direkt in **FastAPI** verwenden, sie sind nahtlos integriert.
Das ermÃļglicht es Ihnen, ein feingranuliertes Berechtigungssystem nach dem OAuth2-Standard in Ihre OpenAPI-Anwendung (und deren API-Dokumentation) zu integrieren.
-OAuth2 mit Scopes ist der Mechanismus, der von vielen groÃen Authentifizierungsanbietern wie Facebook, Google, GitHub, Microsoft, Twitter usw. verwendet wird. Sie verwenden ihn, um Benutzern und Anwendungen spezifische Berechtigungen zu erteilen.
+OAuth2 mit Scopes ist der Mechanismus, der von vielen groÃen Authentifizierungsanbietern wie Facebook, Google, GitHub, Microsoft, X (Twitter) usw. verwendet wird. Sie verwenden ihn, um Benutzern und Anwendungen spezifische Berechtigungen zu erteilen.
-Jedes Mal, wenn Sie sich mit Facebook, Google, GitHub, Microsoft oder Twitter anmelden (âlog in withâ), verwendet die entsprechende Anwendung OAuth2 mit Scopes.
+Jedes Mal, wenn Sie sich mit Facebook, Google, GitHub, Microsoft oder X (Twitter) anmelden (âlog in withâ), verwendet die entsprechende Anwendung OAuth2 mit Scopes.
In diesem Abschnitt erfahren Sie, wie Sie Authentifizierung und Autorisierung mit demselben OAuth2, mit Scopes in Ihrer **FastAPI**-Anwendung verwalten.
@@ -26,7 +26,7 @@ Aber wenn Sie wissen, dass Sie es brauchen oder neugierig sind, lesen Sie weiter
///
-## OAuth2-Scopes und OpenAPI
+## OAuth2-Scopes und OpenAPI { #oauth2-scopes-and-openapi }
Die OAuth2-Spezifikation definiert âScopesâ als eine Liste von durch Leerzeichen getrennten Strings.
@@ -46,7 +46,7 @@ Er wird normalerweise verwendet, um bestimmte Sicherheitsberechtigungen zu dekla
* `instagram_basic` wird von Facebook / Instagram verwendet.
* `https://www.googleapis.com/auth/drive` wird von Google verwendet.
-/// info
+/// info | Info
In OAuth2 ist ein âScopeâ nur ein String, der eine bestimmte erforderliche Berechtigung deklariert.
@@ -58,21 +58,21 @@ FÃŧr OAuth2 sind es einfach nur Strings.
///
-## GesamtÃŧbersicht
+## GesamtÃŧbersicht { #global-view }
Sehen wir uns zunächst kurz die Teile an, die sich gegenÃŧber den Beispielen im Haupt-**Tutorial â Benutzerhandbuch** fÃŧr [OAuth2 mit Password (und Hashing), Bearer mit JWT-Tokens](../../tutorial/security/oauth2-jwt.md){.internal-link target=_blank} ändern. Diesmal verwenden wir OAuth2-Scopes:
-{* ../../docs_src/security/tutorial005_an_py310.py hl[4,8,12,46,64,105,107:115,121:124,128:134,139,155] *}
+{* ../../docs_src/security/tutorial005_an_py310.py hl[5,9,13,47,65,106,108:116,122:126,130:136,141,157] *}
Sehen wir uns diese Ãnderungen nun Schritt fÃŧr Schritt an.
-## OAuth2-Sicherheitsschema
+## OAuth2-Sicherheitsschema { #oauth2-security-scheme }
Die erste Ãnderung ist, dass wir jetzt das OAuth2-Sicherheitsschema mit zwei verfÃŧgbaren Scopes deklarieren: `me` und `items`.
-Der `scopes`-Parameter erhält ein `dict` mit jedem Scope als SchlÃŧssel und dessen Beschreibung als Wert:
+Der `scopes`-Parameter erhält ein `dict` mit jedem Scope als SchlÃŧssel und dessen Beschreibung als Wert:
-{* ../../docs_src/security/tutorial005_an_py310.py hl[62:65] *}
+{* ../../docs_src/security/tutorial005_an_py310.py hl[63:66] *}
Da wir diese Scopes jetzt deklarieren, werden sie in der API-Dokumentation angezeigt, wenn Sie sich einloggen/autorisieren.
@@ -82,11 +82,11 @@ Das ist derselbe Mechanismus, der verwendet wird, wenn Sie beim Anmelden mit Fac
-## JWT-Token mit Scopes
+## JWT-Token mit Scopes { #jwt-token-with-scopes }
Ãndern Sie nun die Token-*Pfadoperation*, um die angeforderten Scopes zurÃŧckzugeben.
-Wir verwenden immer noch dasselbe `OAuth2PasswordRequestForm`. Es enthält eine Eigenschaft `scopes` mit einer `list`e von `str`s fÃŧr jeden Scope, den es im Request erhalten hat.
+Wir verwenden immer noch dasselbe `OAuth2PasswordRequestForm`. Es enthält eine Eigenschaft `scopes` mit einer `list`e von `str`s fÃŧr jeden Scope, den es im Request erhalten hat.
Und wir geben die Scopes als Teil des JWT-Tokens zurÃŧck.
@@ -98,9 +98,9 @@ Aus SicherheitsgrÃŧnden sollten Sie jedoch sicherstellen, dass Sie in Ihrer Anwe
///
-{* ../../docs_src/security/tutorial005_an_py310.py hl[155] *}
+{* ../../docs_src/security/tutorial005_an_py310.py hl[157] *}
-## Scopes in *Pfadoperationen* und Abhängigkeiten deklarieren
+## Scopes in *Pfadoperationen* und Abhängigkeiten deklarieren { #declare-scopes-in-path-operations-and-dependencies }
Jetzt deklarieren wir, dass die *Pfadoperation* fÃŧr `/users/me/items/` den Scope `items` erfordert.
@@ -124,7 +124,7 @@ Wir tun dies hier, um zu demonstrieren, wie **FastAPI** auf verschiedenen Ebenen
///
-{* ../../docs_src/security/tutorial005_an_py310.py hl[4,139,170] *}
+{* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *}
/// info | Technische Details
@@ -136,7 +136,7 @@ Wenn Sie jedoch `Query`, `Path`, `Depends`, `Security` und andere von `fastapi`
///
-## `SecurityScopes` verwenden
+## `SecurityScopes` verwenden { #use-securityscopes }
Aktualisieren Sie nun die Abhängigkeit `get_current_user`.
@@ -150,9 +150,9 @@ Wir deklarieren auch einen speziellen Parameter vom Typ `SecurityScopes`, der au
Diese `SecurityScopes`-Klasse ähnelt `Request` (`Request` wurde verwendet, um das Request-Objekt direkt zu erhalten).
-{* ../../docs_src/security/tutorial005_an_py310.py hl[8,105] *}
+{* ../../docs_src/security/tutorial005_an_py310.py hl[9,106] *}
-## Die `scopes` verwenden
+## Die `scopes` verwenden { #use-the-scopes }
Der Parameter `security_scopes` wird vom Typ `SecurityScopes` sein.
@@ -164,9 +164,9 @@ Wir erstellen eine `HTTPException`, die wir später an mehreren Stellen wiederve
In diese Exception fÃŧgen wir (falls vorhanden) die erforderlichen Scopes als durch Leerzeichen getrennten String ein (unter Verwendung von `scope_str`). Wir fÃŧgen diesen String mit den Scopes in den Header `WWW-Authenticate` ein (das ist Teil der Spezifikation).
-{* ../../docs_src/security/tutorial005_an_py310.py hl[105,107:115] *}
+{* ../../docs_src/security/tutorial005_an_py310.py hl[106,108:116] *}
-## Den `username` und das Format der Daten ÃŧberprÃŧfen
+## Den `username` und das Format der Daten ÃŧberprÃŧfen { #verify-the-username-and-data-shape }
Wir verifizieren, dass wir einen `username` erhalten, und extrahieren die Scopes.
@@ -180,17 +180,17 @@ Anstelle beispielsweise eines `dict`s oder etwas anderem, was später in der Anw
Wir verifizieren auch, dass wir einen Benutzer mit diesem Benutzernamen haben, und wenn nicht, lÃļsen wir dieselbe Exception aus, die wir zuvor erstellt haben.
-{* ../../docs_src/security/tutorial005_an_py310.py hl[46,116:127] *}
+{* ../../docs_src/security/tutorial005_an_py310.py hl[47,117:129] *}
-## Die `scopes` verifizieren
+## Die `scopes` verifizieren { #verify-the-scopes }
-Wir ÃŧberprÃŧfen nun, ob das empfangenen Token alle Scopes enthält, die von dieser Abhängigkeit und deren Verwendern (einschlieÃlich *Pfadoperationen*) gefordert werden. Andernfalls lÃļsen wir eine `HTTPException` aus.
+Wir ÃŧberprÃŧfen nun, ob das empfangene Token alle Scopes enthält, die von dieser Abhängigkeit und deren Verwendern (einschlieÃlich *Pfadoperationen*) gefordert werden. Andernfalls lÃļsen wir eine `HTTPException` aus.
Hierzu verwenden wir `security_scopes.scopes`, das eine `list`e mit allen diesen Scopes als `str` enthält.
-{* ../../docs_src/security/tutorial005_an_py310.py hl[128:134] *}
+{* ../../docs_src/security/tutorial005_an_py310.py hl[130:136] *}
-## Abhängigkeitsbaum und Scopes
+## Abhängigkeitsbaum und Scopes { #dependency-tree-and-scopes }
Sehen wir uns diesen Abhängigkeitsbaum und die Scopes noch einmal an.
@@ -223,7 +223,7 @@ Alles hängt von den âScopesâ ab, die in jeder *Pfadoperation* und jeder Abh
///
-## Weitere Details zu `SecurityScopes`.
+## Weitere Details zu `SecurityScopes` { #more-details-about-securityscopes }
Sie kÃļnnen `SecurityScopes` an jeder Stelle und an mehreren Stellen verwenden, es muss sich nicht in der âWurzelâ-Abhängigkeit befinden.
@@ -233,7 +233,7 @@ Da die `SecurityScopes` alle von den Verwendern der Abhängigkeiten deklarierten
Diese werden fÃŧr jede *Pfadoperation* unabhängig ÃŧberprÃŧft.
-## Testen Sie es
+## Es testen { #check-it }
Wenn Sie die API-Dokumentation Ãļffnen, kÃļnnen Sie sich authentisieren und angeben, welche Scopes Sie autorisieren mÃļchten.
@@ -245,7 +245,7 @@ Und wenn Sie den Scope `me`, aber nicht den Scope `items` auswählen, kÃļnnen Si
Das wÃŧrde einer Drittanbieteranwendung passieren, die versucht, auf eine dieser *Pfadoperationen* mit einem Token zuzugreifen, das von einem Benutzer bereitgestellt wurde, abhängig davon, wie viele Berechtigungen der Benutzer dieser Anwendung erteilt hat.
-## Ãber Integrationen von Drittanbietern
+## Ãber Integrationen von Drittanbietern { #about-third-party-integrations }
In diesem Beispiel verwenden wir den OAuth2-Flow âPasswordâ.
@@ -269,6 +269,6 @@ Aber am Ende implementieren sie denselben OAuth2-Standard.
**FastAPI** enthält Werkzeuge fÃŧr alle diese OAuth2-Authentifizierungs-Flows in `fastapi.security.oauth2`.
-## `Security` in Dekorator-`dependencies`
+## `Security` in Dekorator-`dependencies` { #security-in-decorator-dependencies }
Auf die gleiche Weise kÃļnnen Sie eine `list`e von `Depends` im Parameter `dependencies` des Dekorators definieren (wie in [Abhängigkeiten in Pfadoperation-Dekoratoren](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank} erläutert), Sie kÃļnnten auch dort `Security` mit `scopes` verwenden.
diff --git a/docs/de/docs/advanced/settings.md b/docs/de/docs/advanced/settings.md
index 00cc2ac37..ccd7f373d 100644
--- a/docs/de/docs/advanced/settings.md
+++ b/docs/de/docs/advanced/settings.md
@@ -1,4 +1,4 @@
-# Einstellungen und Umgebungsvariablen
+# Einstellungen und Umgebungsvariablen { #settings-and-environment-variables }
In vielen Fällen benÃļtigt Ihre Anwendung mÃļglicherweise einige externe Einstellungen oder Konfigurationen, zum Beispiel geheime SchlÃŧssel, Datenbank-Anmeldeinformationen, Anmeldeinformationen fÃŧr E-Mail-Dienste, usw.
@@ -6,143 +6,25 @@ Die meisten dieser Einstellungen sind variabel (kÃļnnen sich ändern), wie z. B.
Aus diesem Grund werden diese Ãŧblicherweise in Umgebungsvariablen bereitgestellt, die von der Anwendung gelesen werden.
-## Umgebungsvariablen
-
/// tip | Tipp
-Wenn Sie bereits wissen, was âUmgebungsvariablenâ sind und wie man sie verwendet, kÃļnnen Sie gerne mit dem nächsten Abschnitt weiter unten fortfahren.
+Um Umgebungsvariablen zu verstehen, kÃļnnen Sie [Umgebungsvariablen](../environment-variables.md){.internal-link target=_blank} lesen.
///
-Eine Umgebungsvariable (auch bekannt als âenv varâ) ist eine Variable, die sich auÃerhalb des Python-Codes im Betriebssystem befindet und von Ihrem Python-Code (oder auch von anderen Programmen) gelesen werden kann.
-
-Sie kÃļnnen Umgebungsvariablen in der Shell erstellen und verwenden, ohne Python zu benÃļtigen:
-
-//// tab | Linux, macOS, Windows Bash
-
-
-## VerbindungsabbrÃŧche und mehreren Clients handhaben
+## VerbindungsabbrÃŧche und mehrere Clients handhaben { #handling-disconnections-and-multiple-clients }
Wenn eine WebSocket-Verbindung geschlossen wird, lÃļst `await websocket.receive_text()` eine `WebSocketDisconnect`-Exception aus, die Sie dann wie in folgendem Beispiel abfangen und behandeln kÃļnnen.
@@ -178,7 +178,7 @@ Wenn Sie etwas benÃļtigen, das sich leicht in FastAPI integrieren lässt, aber r
///
-## Mehr Informationen
+## Mehr Informationen { #more-info }
Weitere Informationen zu Optionen finden Sie in der Dokumentation von Starlette:
diff --git a/docs/de/docs/advanced/wsgi.md b/docs/de/docs/advanced/wsgi.md
index c0998a621..1de9739dd 100644
--- a/docs/de/docs/advanced/wsgi.md
+++ b/docs/de/docs/advanced/wsgi.md
@@ -1,10 +1,10 @@
-# WSGI inkludieren â Flask, Django und andere
+# WSGI inkludieren â Flask, Django und andere { #including-wsgi-flask-django-others }
Sie kÃļnnen WSGI-Anwendungen mounten, wie Sie es in [Unteranwendungen â Mounts](sub-applications.md){.internal-link target=_blank}, [Hinter einem Proxy](behind-a-proxy.md){.internal-link target=_blank} gesehen haben.
Dazu kÃļnnen Sie die `WSGIMiddleware` verwenden und damit Ihre WSGI-Anwendung wrappen, zum Beispiel Flask, Django usw.
-## `WSGIMiddleware` verwenden
+## `WSGIMiddleware` verwenden { #using-wsgimiddleware }
Sie mÃŧssen `WSGIMiddleware` importieren.
@@ -12,15 +12,15 @@ Wrappen Sie dann die WSGI-Anwendung (z. B. Flask) mit der Middleware.
Und dann mounten Sie das auf einem Pfad.
-{* ../../docs_src/wsgi/tutorial001.py hl[2:3,23] *}
+{* ../../docs_src/wsgi/tutorial001.py hl[2:3,3] *}
-## Es ansehen
+## Es testen { #check-it }
-Jetzt wird jede Anfrage unter dem Pfad `/v1/` von der Flask-Anwendung verarbeitet.
+Jetzt wird jeder Request unter dem Pfad `/v1/` von der Flask-Anwendung verarbeitet.
Und der Rest wird von **FastAPI** gehandhabt.
-Wenn Sie das mit Uvicorn ausfÃŧhren und auf http://localhost:8000/v1/ gehen, sehen Sie die Response von Flask:
+Wenn Sie das ausfÃŧhren und auf http://localhost:8000/v1/ gehen, sehen Sie die Response von Flask:
```txt
Hello, World from Flask!
diff --git a/docs/de/docs/alternatives.md b/docs/de/docs/alternatives.md
index 611315501..15c0719fb 100644
--- a/docs/de/docs/alternatives.md
+++ b/docs/de/docs/alternatives.md
@@ -1,8 +1,8 @@
-# Alternativen, Inspiration und Vergleiche
+# Alternativen, Inspiration und Vergleiche { #alternatives-inspiration-and-comparisons }
-Was hat **FastAPI** inspiriert, ein Vergleich zu Alternativen, und was FastAPI von diesen gelernt hat.
+Was hat **FastAPI** inspiriert, wie es sich im Vergleich zu Alternativen verhält und was es von ihnen gelernt hat.
-## EinfÃŧhrung
+## EinfÃŧhrung { #intro }
**FastAPI** wÃŧrde ohne die frÃŧhere Arbeit anderer nicht existieren.
@@ -12,17 +12,17 @@ Ich habe die Schaffung eines neuen Frameworks viele Jahre lang vermieden. Zuerst
Aber irgendwann gab es keine andere MÃļglichkeit, als etwas zu schaffen, das all diese Funktionen bereitstellte, die besten Ideen frÃŧherer Tools aufnahm und diese auf die bestmÃļgliche Weise kombinierte, wobei Sprachfunktionen verwendet wurden, die vorher noch nicht einmal verfÃŧgbar waren (Python 3.6+ Typhinweise).
-## Vorherige Tools
+## Vorherige Tools { #previous-tools }
-### Django
+### Django { #django }
Es ist das beliebteste Python-Framework und genieÃt groÃes Vertrauen. Es wird zum Aufbau von Systemen wie Instagram verwendet.
-Ist relativ eng mit relationalen Datenbanken (wie MySQL oder PostgreSQL) gekoppelt, daher ist es nicht sehr einfach, eine NoSQL-Datenbank (wie Couchbase, MongoDB, Cassandra, usw.) als Hauptspeicherengine zu verwenden.
+Es ist relativ eng mit relationalen Datenbanken (wie MySQL oder PostgreSQL) gekoppelt, daher ist es nicht sehr einfach, eine NoSQL-Datenbank (wie Couchbase, MongoDB, Cassandra, usw.) als Hauptspeicherengine zu verwenden.
-Es wurde erstellt, um den HTML-Code im Backend zu generieren, nicht um APIs zu erstellen, die von einem modernen Frontend (wie React, Vue.js und Angular) oder von anderen Systemen (wie IoT-Geräten) verwendet werden, um mit ihm zu kommunizieren.
+Es wurde erstellt, um den HTML-Code im Backend zu generieren, nicht um APIs zu erstellen, die von einem modernen Frontend (wie React, Vue.js und Angular) oder von anderen Systemen (wie IoT-Geräten) verwendet werden, um mit ihm zu kommunizieren.
-### Django REST Framework
+### Django REST Framework { #django-rest-framework }
Das Django REST Framework wurde als flexibles Toolkit zum Erstellen von Web-APIs unter Verwendung von Django entwickelt, um dessen API-MÃļglichkeiten zu verbessern.
@@ -42,7 +42,7 @@ Eine automatische API-Dokumentationsoberfläche zu haben.
///
-### Flask
+### Flask { #flask }
Flask ist ein âMikroframeworkâ, es enthält weder Datenbankintegration noch viele der Dinge, die standardmäÃig in Django enthalten sind.
@@ -64,7 +64,7 @@ Ein Mikroframework zu sein. Es einfach zu machen, die benÃļtigten Tools und Teil
///
-### Requests
+### Requests { #requests }
**FastAPI** ist eigentlich keine Alternative zu **Requests**. Der Umfang der beiden ist sehr unterschiedlich.
@@ -82,7 +82,7 @@ Aus diesem Grund heiÃt es auf der offiziellen Website:
> Requests ist eines der am häufigsten heruntergeladenen Python-Packages aller Zeiten
-Die Art und Weise, wie Sie es verwenden, ist sehr einfach. Um beispielsweise einen `GET`-Request zu machen, wÃŧrden Sie schreiben:
+Die Art und Weise, wie Sie es verwenden, ist sehr einfach. Um beispielsweise einen `GET`-Request zu machen, wÃŧrden Sie schreiben:
```Python
response = requests.get("http://example.com/some/url")
@@ -106,7 +106,7 @@ Sehen Sie sich die Ãhnlichkeiten in `requests.get(...)` und `@app.get(...)` an.
///
-### Swagger / OpenAPI
+### Swagger / OpenAPI { #swagger-openapi }
Die Hauptfunktion, die ich vom Django REST Framework haben wollte, war die automatische API-Dokumentation.
@@ -131,13 +131,13 @@ Diese beiden wurden ausgewählt, weil sie ziemlich beliebt und stabil sind, aber
///
-### Flask REST Frameworks
+### Flask REST Frameworks { #flask-rest-frameworks }
Es gibt mehrere Flask REST Frameworks, aber nachdem ich die Zeit und Arbeit investiert habe, sie zu untersuchen, habe ich festgestellt, dass viele nicht mehr unterstÃŧtzt werden oder abgebrochen wurden und dass mehrere fortbestehende Probleme sie unpassend machten.
-### Marshmallow
+### Marshmallow { #marshmallow }
-Eine der von API-Systemen benÃļtigen Hauptfunktionen ist die Daten-âSerialisierungâ, welche Daten aus dem Code (Python) entnimmt und in etwas umwandelt, was durch das Netzwerk gesendet werden kann. Beispielsweise das Konvertieren eines Objekts, welches Daten aus einer Datenbank enthält, in ein JSON-Objekt. Konvertieren von `datetime`-Objekten in Strings, usw.
+Eine der von API-Systemen benÃļtigten Hauptfunktionen ist die Daten-âSerialisierungâ, welche Daten aus dem Code (Python) entnimmt und in etwas umwandelt, was durch das Netzwerk gesendet werden kann. Beispielsweise das Konvertieren eines Objekts, welches Daten aus einer Datenbank enthält, in ein JSON-Objekt. Konvertieren von `datetime`-Objekten in Strings, usw.
Eine weitere wichtige Funktion, benÃļtigt von APIs, ist die Datenvalidierung, welche sicherstellt, dass die Daten unter gegebenen Umständen gÃŧltig sind. Zum Beispiel, dass ein Feld ein `int` ist und kein zufälliger String. Das ist besonders nÃŧtzlich fÃŧr hereinkommende Daten.
@@ -145,7 +145,7 @@ Ohne ein Datenvalidierungssystem mÃŧssten Sie alle PrÃŧfungen manuell im Code du
FÃŧr diese Funktionen wurde Marshmallow entwickelt. Es ist eine groÃartige Bibliothek und ich habe sie schon oft genutzt.
-Aber sie wurde erstellt, bevor Typhinweise in Python existierten. Um also ein Schema zu definieren, mÃŧssen Sie bestimmte Werkzeuge und Klassen verwenden, die von Marshmallow bereitgestellt werden.
+Aber sie wurde erstellt, bevor Typhinweise in Python existierten. Um also ein Schema zu definieren, mÃŧssen Sie bestimmte Werkzeuge und Klassen verwenden, die von Marshmallow bereitgestellt werden.
/// check | Inspirierte **FastAPI**
@@ -153,7 +153,7 @@ Code zu verwenden, um âSchemasâ zu definieren, welche Datentypen und Validie
///
-### Webargs
+### Webargs { #webargs }
Eine weitere wichtige Funktion, die von APIs benÃļtigt wird, ist das Parsen von Daten aus eingehenden Requests.
@@ -163,7 +163,7 @@ Es verwendet unter der Haube Marshmallow, um die Datenvalidierung durchzufÃŧhren
Es ist ein groÃartiges Tool und ich habe es auch oft verwendet, bevor ich **FastAPI** hatte.
-/// info
+/// info | Info
Webargs wurde von denselben Marshmallow-Entwicklern erstellt.
@@ -175,7 +175,7 @@ Eingehende Requestdaten automatisch zu validieren.
///
-### APISpec
+### APISpec { #apispec }
Marshmallow und Webargs bieten Validierung, Parsen und Serialisierung als Plugins.
@@ -193,7 +193,7 @@ Aber dann haben wir wieder das Problem einer Mikrosyntax innerhalb eines Python-
Der Texteditor kann dabei nicht viel helfen. Und wenn wir Parameter oder Marshmallow-Schemas ändern und vergessen, auch den YAML-Docstring zu ändern, wäre das generierte Schema veraltet.
-/// info
+/// info | Info
APISpec wurde von denselben Marshmallow-Entwicklern erstellt.
@@ -205,7 +205,7 @@ Den offenen Standard fÃŧr APIs, OpenAPI, zu unterstÃŧtzen.
///
-### Flask-apispec
+### Flask-apispec { #flask-apispec }
Hierbei handelt es sich um ein Flask-Plugin, welches Webargs, Marshmallow und APISpec miteinander verbindet.
@@ -225,7 +225,7 @@ Die Verwendung fÃŧhrte zur Entwicklung mehrerer Flask-Full-Stack-Generatoren. Di
Und dieselben Full-Stack-Generatoren bildeten die Basis der [**FastAPI**-Projektgeneratoren](project-generation.md){.internal-link target=_blank}.
-/// info
+/// info | Info
Flask-apispec wurde von denselben Marshmallow-Entwicklern erstellt.
@@ -237,7 +237,7 @@ Das OpenAPI-Schema automatisch zu generieren, aus demselben Code, welcher die Se
///
-### NestJS (und Angular)
+### NestJS (und Angular) { #nestjs-and-angular }
Dies ist nicht einmal Python, NestJS ist ein von Angular inspiriertes JavaScript (TypeScript) NodeJS Framework.
@@ -249,7 +249,7 @@ Da die Parameter mit TypeScript-Typen beschrieben werden (ähnlich den Python-Ty
Da TypeScript-Daten jedoch nach der Kompilierung nach JavaScript nicht erhalten bleiben, kÃļnnen die Typen nicht gleichzeitig die Validierung, Serialisierung und Dokumentation definieren. Aus diesem Grund und aufgrund einiger Designentscheidungen ist es fÃŧr die Validierung, Serialisierung und automatische Schemagenerierung erforderlich, an vielen Stellen Dekoratoren hinzuzufÃŧgen. Es wird also ziemlich ausfÃŧhrlich.
-Es kann nicht sehr gut mit verschachtelten Modellen umgehen. Wenn es sich beim JSON-Body in der Anfrage also um ein JSON-Objekt mit inneren Feldern handelt, die wiederum verschachtelte JSON-Objekte sind, kann er nicht richtig dokumentiert und validiert werden.
+Es kann nicht sehr gut mit verschachtelten Modellen umgehen. Wenn es sich beim JSON-Body im Request also um ein JSON-Objekt mit inneren Feldern handelt, die wiederum verschachtelte JSON-Objekte sind, kann er nicht richtig dokumentiert und validiert werden.
/// check | Inspirierte **FastAPI**
@@ -259,7 +259,7 @@ Python-Typen zu verwenden, um eine hervorragende EditorunterstÃŧtzung zu erhalte
///
-### Sanic
+### Sanic { #sanic }
Es war eines der ersten extrem schnellen Python-Frameworks, welches auf `asyncio` basierte. Es wurde so gestaltet, dass es Flask sehr ähnlich ist.
@@ -279,11 +279,11 @@ Aus diesem Grund basiert **FastAPI** auf Starlette, da dieses das schnellste ver
///
-### Falcon
+### Falcon { #falcon }
Falcon ist ein weiteres leistungsstarkes Python-Framework. Es ist minimalistisch konzipiert und dient als Grundlage fÃŧr andere Frameworks wie Hug.
-Es ist so konzipiert, dass es Ãŧber Funktionen verfÃŧgt, welche zwei Parameter empfangen, einen âRequestâ und eine âResponseâ. Dann âlesenâ Sie Teile des Requests und âschreibenâ Teile der Response. Aufgrund dieses Designs ist es nicht mÃļglich, Request-Parameter und -Bodys mit Standard-Python-Typhinweisen als Funktionsparameter zu deklarieren.
+Es ist so konzipiert, dass es Ãŧber Funktionen verfÃŧgt, welche zwei Parameter empfangen, einen âRequestâ und eine âResponseâ. Dann âlesenâ Sie Teile des Requests und âschreibenâ Teile der Response. Aufgrund dieses Designs ist es nicht mÃļglich, Request-Parameter und -Bodys mit Standard-Python-Typhinweisen als Funktionsparameter zu deklarieren.
Daher mÃŧssen Datenvalidierung, Serialisierung und Dokumentation im Code und nicht automatisch erfolgen. Oder sie mÃŧssen als Framework oberhalb von Falcon implementiert werden, so wie Hug. Dieselbe Unterscheidung findet auch in anderen Frameworks statt, die vom Design von Falcon inspiriert sind und ein Requestobjekt und ein Responseobjekt als Parameter haben.
@@ -297,7 +297,7 @@ Obwohl er in FastAPI optional ist und hauptsächlich zum Festlegen von Headern,
///
-### Molten
+### Molten { #molten }
Ich habe Molten in den ersten Phasen der Entwicklung von **FastAPI** entdeckt. Und es hat ganz ähnliche Ideen:
@@ -321,7 +321,7 @@ Das hat tatsächlich dazu gefÃŧhrt, dass Teile von Pydantic aktualisiert wurden,
///
-### Hug
+### Hug { #hug }
Hug war eines der ersten Frameworks, welches die Deklaration von API-Parametertypen mithilfe von Python-Typhinweisen implementierte. Das war eine groÃartige Idee, die andere Tools dazu inspirierte, dasselbe zu tun.
@@ -335,9 +335,9 @@ Es verfÃŧgt Ãŧber eine interessante, ungewÃļhnliche Funktion: Mit demselben Fram
Da es auf dem bisherigen Standard fÃŧr synchrone Python-Webframeworks (WSGI) basiert, kann es nicht mit Websockets und anderen Dingen umgehen, verfÃŧgt aber dennoch Ãŧber eine hohe Performanz.
-/// info
+/// info | Info
-Hug wurde von Timothy Crosley erstellt, dem gleichen SchÃļpfer von `isort`, einem groÃartigen Tool zum automatischen Sortieren von Importen in Python-Dateien.
+Hug wurde von Timothy Crosley erstellt, demselben SchÃļpfer von `isort`, einem groÃartigen Tool zum automatischen Sortieren von Importen in Python-Dateien.
///
@@ -351,7 +351,7 @@ Hug inspirierte **FastAPI** dazu, einen `response`-Parameter in Funktionen zu de
///
-### APIStar (âĻ 0.5)
+### APIStar (âĻ 0.5) { #apistar-0-5 }
Kurz bevor ich mich entschied, **FastAPI** zu erstellen, fand ich den **APIStar**-Server. Er hatte fast alles, was ich suchte, und ein tolles Design.
@@ -375,7 +375,7 @@ Es handelte sich nicht länger um ein API-Webframework, da sich der Entwickler a
Jetzt handelt es sich bei APIStar um eine Reihe von Tools zur Validierung von OpenAPI-Spezifikationen, nicht um ein Webframework.
-/// info
+/// info | Info
APIStar wurde von Tom Christie erstellt. Derselbe, welcher Folgendes erstellt hat:
@@ -399,9 +399,9 @@ Ich betrachte **FastAPI** als einen âspirituellen Nachfolgerâ von APIStar, w
///
-## Verwendet von **FastAPI**
+## Verwendet von **FastAPI** { #used-by-fastapi }
-### Pydantic
+### Pydantic { #pydantic }
Pydantic ist eine Bibliothek zum Definieren von Datenvalidierung, Serialisierung und Dokumentation (unter Verwendung von JSON Schema) basierend auf Python-Typhinweisen.
@@ -417,7 +417,7 @@ Die gesamte Datenvalidierung, Datenserialisierung und automatische Modelldokumen
///
-### Starlette
+### Starlette { #starlette }
Starlette ist ein leichtgewichtiges ASGI-Framework/Toolkit, welches sich ideal fÃŧr die Erstellung hochperformanter asynchroner Dienste eignet.
@@ -428,9 +428,9 @@ Es bietet:
* Eine sehr beeindruckende Leistung.
* WebSocket-UnterstÃŧtzung.
* Hintergrundtasks im selben Prozess.
-* Events fÃŧr das Hoch- und Herunterfahren.
+* Startup- und Shutdown-Events.
* Testclient basierend auf HTTPX.
-* CORS, GZip, statische Dateien, Streamende Responses.
+* CORS, GZip, statische Dateien, Responses streamen.
* Session- und Cookie-UnterstÃŧtzung.
* 100 % Testabdeckung.
* 100 % Typannotierte Codebasis.
@@ -462,7 +462,7 @@ Alles, was Sie also mit Starlette machen kÃļnnen, kÃļnnen Sie direkt mit **FastA
///
-### Uvicorn
+### Uvicorn { #uvicorn }
Uvicorn ist ein blitzschneller ASGI-Server, der auf uvloop und httptools basiert.
@@ -474,12 +474,12 @@ Es ist der empfohlene Server fÃŧr Starlette und **FastAPI**.
Hauptwebserver zum AusfÃŧhren von **FastAPI**-Anwendungen.
-Sie kÃļnnen ihn mit Gunicorn kombinieren, um einen asynchronen Multiprozess-Server zu erhalten.
+Sie kÃļnnen auch die Kommandozeilenoption `--workers` verwenden, um einen asynchronen Multiprozess-Server zu erhalten.
Weitere Details finden Sie im Abschnitt [Deployment](deployment/index.md){.internal-link target=_blank}.
///
-## Benchmarks und Geschwindigkeit
+## Benchmarks und Geschwindigkeit { #benchmarks-and-speed }
Um den Unterschied zwischen Uvicorn, Starlette und FastAPI zu verstehen, zu vergleichen und zu sehen, lesen Sie den Abschnitt Ãŧber [Benchmarks](benchmarks.md){.internal-link target=_blank}.
diff --git a/docs/de/docs/async.md b/docs/de/docs/async.md
index b5b3a4c52..3dbd442e5 100644
--- a/docs/de/docs/async.md
+++ b/docs/de/docs/async.md
@@ -1,8 +1,8 @@
-# Nebenläufigkeit und async / await
+# Nebenläufigkeit und async / await { #concurrency-and-async-await }
Details zur `async def`-Syntax fÃŧr *Pfadoperation-Funktionen* und Hintergrundinformationen zu asynchronem Code, Nebenläufigkeit und Parallelität.
-## In Eile?
+## In Eile? { #in-a-hurry }
TL;DR:
@@ -12,7 +12,7 @@ Wenn Sie Bibliotheken von Dritten verwenden, die mit `await` aufgerufen werden m
results = await some_library()
```
-Dann deklarieren Sie Ihre *Pfadoperation-Funktionen* mit `async def` wie in:
+Dann deklarieren Sie Ihre *Pfadoperation-Funktionen* mit `async def`, wie in:
```Python hl_lines="2"
@app.get('/')
@@ -21,7 +21,7 @@ async def read_results():
return results
```
-/// note
+/// note | Hinweis
Sie kÃļnnen `await` nur innerhalb von Funktionen verwenden, die mit `async def` erstellt wurden.
@@ -29,7 +29,7 @@ Sie kÃļnnen `await` nur innerhalb von Funktionen verwenden, die mit `async def`
---
-Wenn Sie eine Bibliothek eines Dritten verwenden, die mit etwas kommuniziert (einer Datenbank, einer API, dem Dateisystem, usw.) und welche die Verwendung von `await` nicht unterstÃŧtzt (dies ist derzeit bei den meisten Datenbankbibliotheken der Fall), dann deklarieren Sie Ihre *Pfadoperation-Funktionen* ganz normal nur mit `def`, etwa:
+Wenn Sie eine Bibliothek eines Dritten verwenden, die mit etwas kommuniziert (einer Datenbank, einer API, dem Dateisystem, usw.) und welche die Verwendung von `await` nicht unterstÃŧtzt (dies ist derzeit bei den meisten Datenbankbibliotheken der Fall), dann deklarieren Sie Ihre *Pfadoperation-Funktionen* ganz normal nur mit `def`, wie in:
```Python hl_lines="2"
@app.get('/')
@@ -40,7 +40,7 @@ def results():
---
-Wenn Ihre Anwendung (irgendwie) mit nichts anderem kommunizieren und auf dessen Antwort warten muss, verwenden Sie `async def`.
+Wenn Ihre Anwendung (irgendwie) nicht mit etwas anderem kommunizieren und auf dessen Antwort warten muss, verwenden Sie `async def`, auch wenn Sie `await` im Inneren nicht verwenden mÃŧssen.
---
@@ -52,11 +52,11 @@ Wenn Sie sich unsicher sind, verwenden Sie einfach `def`.
Wie dem auch sei, in jedem der oben genannten Fälle wird FastAPI immer noch asynchron arbeiten und extrem schnell sein.
-Wenn Sie jedoch den oben genannten Schritten folgen, kÃļnnen einige Performance-Optimierungen vorgenommen werden.
+Wenn Sie jedoch den oben genannten Schritten folgen, kÃļnnen einige Performanz-Optimierungen vorgenommen werden.
-## Technische Details
+## Technische Details { #technical-details }
-Moderne Versionen von Python unterstÃŧtzen **âasynchronen Codeâ** unter Verwendung sogenannter **âCoroutinenâ** mithilfe der Syntax **`async`** und **`await`**.
+Moderne Versionen von Python unterstÃŧtzen **âasynchronen Codeâ** unter Verwendung sogenannter **âCoroutinenâ** mithilfe der Syntax **`async` und `await`**.
Nehmen wir obigen Satz in den folgenden Abschnitten Schritt fÃŧr Schritt unter die Lupe:
@@ -64,13 +64,13 @@ Nehmen wir obigen Satz in den folgenden Abschnitten Schritt fÃŧr Schritt unter d
* **`async` und `await`**
* **Coroutinen**
-## Asynchroner Code
+## Asynchroner Code { #asynchronous-code }
-Asynchroner Code bedeutet lediglich, dass die Sprache đŦ eine MÃļglichkeit hat, dem Computersystem / Programm đ¤ mitzuteilen, dass es đ¤ an einem bestimmten Punkt im Code darauf warten muss, dass *etwas anderes* irgendwo anders fertig wird. Nehmen wir an, *etwas anderes* ist hier âLangsam-Dateiâ đ.
+Asynchroner Code bedeutet lediglich, dass die Sprache đŦ eine MÃļglichkeit hat, dem Computer / Programm đ¤ mitzuteilen, dass es đ¤ an einem bestimmten Punkt im Code darauf warten muss, dass *etwas anderes* irgendwo anders fertig wird. Nehmen wir an, *etwas anderes* ist hier âLangsam-Dateiâ đ.
Während der Zeit, die âLangsam-Dateiâ đ benÃļtigt, kann das System also andere Aufgaben erledigen.
-Dann kommt das System / Programm đ¤ bei jeder Gelegenheit zurÃŧck, wenn es entweder wieder wartet, oder wann immer es đ¤ die ganze Arbeit erledigt hat, die zu diesem Zeitpunkt zu tun war. Und es đ¤ wird nachschauen, ob eine der Aufgaben, auf die es gewartet hat, fertig damit ist, zu tun, was sie tun sollte.
+Dann kommt der Computer / das Programm đ¤ bei jeder Gelegenheit zurÃŧck, weil es entweder wieder wartet oder wann immer es đ¤ die ganze Arbeit erledigt hat, die zu diesem Zeitpunkt zu tun war. Und es đ¤ wird nachschauen, ob eine der Aufgaben, auf die es gewartet hat, fertig ist.
Dann nimmt es đ¤ die erste erledigte Aufgabe (sagen wir, unsere âLangsam-Dateiâ đ) und bearbeitet sie weiter.
@@ -87,13 +87,13 @@ Das âWarten auf etwas anderesâ bezieht sich normalerweise auf I/O-Operationen verbraucht wird, nennt man dies auch âI/O-lastigeâ (âI/O boundâ) Operationen.
-âAsynchronâ, sagt man, weil das Computersystem / Programm nicht mit einer langsamen Aufgabe âsynchronisiertâ werden muss und nicht auf den genauen Moment warten muss, in dem die Aufgabe beendet ist, ohne dabei etwas zu tun, um schlieÃlich das Ergebnis der Aufgabe zu Ãŧbernehmen und die Arbeit fortsetzen zu kÃļnnen.
+âAsynchronâ, sagt man, weil der Computer / das Programm nicht mit einer langsamen Aufgabe âsynchronisiertâ werden muss und nicht auf den genauen Moment warten muss, in dem die Aufgabe beendet ist, ohne dabei etwas zu tun, um schlieÃlich das Ergebnis der Aufgabe zu Ãŧbernehmen und die Arbeit fortsetzen zu kÃļnnen.
-Da es sich stattdessen um ein âasynchronesâ System handelt, kann die Aufgabe nach Abschluss ein wenig (einige Mikrosekunden) in der Schlange warten, bis das System / Programm seine anderen Dinge erledigt hat und zurÃŧckkommt, um die Ergebnisse entgegenzunehmen und mit ihnen weiterzuarbeiten.
+Da es sich stattdessen um ein âasynchronesâ System handelt, kann die Aufgabe nach Abschluss ein wenig (einige Mikrosekunden) in der Schlange warten, bis der Computer / das Programm seine anderen Dinge erledigt hat und zurÃŧckkommt, um die Ergebnisse entgegenzunehmen und mit ihnen weiterzuarbeiten.
-FÃŧr âsynchronâ (im Gegensatz zu âasynchronâ) wird auch oft der Begriff âsequentiellâ verwendet, da das System / Programm alle Schritte in einer Sequenz (âder Reihe nachâ) ausfÃŧhrt, bevor es zu einer anderen Aufgabe wechselt, auch wenn diese Schritte mit Warten verbunden sind.
+FÃŧr âsynchronâ (im Gegensatz zu âasynchronâ) wird auch oft der Begriff âsequentiellâ verwendet, da der Computer / das Programm alle Schritte in einer Sequenz (âder Reihe nachâ) ausfÃŧhrt, bevor es zu einer anderen Aufgabe wechselt, auch wenn diese Schritte mit Warten verbunden sind.
-### Nebenläufigkeit und Hamburger
+### Nebenläufigkeit und Hamburger { #concurrency-and-burgers }
Diese oben beschriebene Idee von **asynchronem** Code wird manchmal auch **âNebenläufigkeitâ** genannt. Sie unterscheidet sich von **âParallelitätâ**.
@@ -103,7 +103,7 @@ Aber die Details zwischen *Nebenläufigkeit* und *Parallelität* sind ziemlich u
Um den Unterschied zu erkennen, stellen Sie sich die folgende Geschichte Ãŧber Hamburger vor:
-### Nebenläufige Hamburger
+### Nebenläufige Hamburger { #concurrent-burgers }
Sie gehen mit Ihrem Schwarm Fastfood holen, stehen in der Schlange, während der Kassierer die Bestellungen der Leute vor Ihnen entgegennimmt. đ
@@ -139,7 +139,7 @@ Sie und Ihr Schwarm essen die Burger und haben eine schÃļne Zeit. â¨
-/// info
+/// info | Info
Die wunderschÃļnen Illustrationen stammen von Ketrina Thompson. đ¨
@@ -147,7 +147,7 @@ Die wunderschÃļnen Illustrationen stammen von Ketrina Thompson. đ¨
@@ -233,15 +233,15 @@ Und man muss lange in der Schlange warten đ sonst kommt man nicht an die Reih
Sie wÃŧrden Ihren Schwarm đ wahrscheinlich nicht mitnehmen wollen, um Besorgungen bei der Bank zu erledigen đĻ.
-### Hamburger Schlussfolgerung
+### Hamburger Schlussfolgerung { #burger-conclusion }
-In diesem Szenario âFast Food Burger mit Ihrem Schwarmâ ist es viel sinnvoller, ein nebenläufiges System zu haben â¸đâ¯, da viel gewartet wird đ.
+In diesem Szenario âFastfood-Burger mit Ihrem Schwarmâ ist es viel sinnvoller, ein nebenläufiges System zu haben â¸đâ¯, da viel gewartet wird đ.
Das ist auch bei den meisten Webanwendungen der Fall.
-Viele, viele Benutzer, aber Ihr Server wartet đ darauf, dass deren nicht so gute Internetverbindungen die Requests Ãŧbermitteln.
+Viele, viele Benutzer, aber Ihr Server wartet đ darauf, dass deren nicht so gute Internetverbindungen die Requests Ãŧbermitteln.
-Und dann warten đ, bis die Responses zurÃŧckkommen.
+Und dann wieder warten đ, bis die Responses zurÃŧckkommen.
Dieses âWartenâ đ wird in Mikrosekunden gemessen, aber zusammenfassend lässt sich sagen, dass am Ende eine Menge gewartet wird.
@@ -253,7 +253,7 @@ Und das ist das gleiche Leistungsniveau, das Sie mit **FastAPI** erhalten.
Und da Sie Parallelität und Asynchronität gleichzeitig haben kÃļnnen, erzielen Sie eine hÃļhere Performanz als die meisten getesteten NodeJS-Frameworks und sind mit Go auf AugenhÃļhe, einer kompilierten Sprache, die näher an C liegt (alles dank Starlette).
-### Ist Nebenläufigkeit besser als Parallelität?
+### Ist Nebenläufigkeit besser als Parallelität? { #is-concurrency-better-than-parallelism }
Nein! Das ist nicht die Moral der Geschichte.
@@ -290,17 +290,17 @@ Zum Beispiel:
* **Maschinelles Lernen**: Normalerweise sind viele âMatrixâ- und âVektorâ-Multiplikationen erforderlich. Stellen Sie sich eine riesige Tabelle mit Zahlen vor, in der Sie alle Zahlen gleichzeitig multiplizieren.
* **Deep Learning**: Dies ist ein Teilgebiet des maschinellen Lernens, daher gilt das Gleiche. Es ist nur so, dass es nicht eine einzige Tabelle mit Zahlen zum Multiplizieren gibt, sondern eine riesige Menge davon, und in vielen Fällen verwendet man einen speziellen Prozessor, um diese Modelle zu erstellen und / oder zu verwenden.
-### Nebenläufigkeit + Parallelität: Web + maschinelles Lernen
+### Nebenläufigkeit + Parallelität: Web + maschinelles Lernen { #concurrency-parallelism-web-machine-learning }
Mit **FastAPI** kÃļnnen Sie die Vorteile der Nebenläufigkeit nutzen, die in der Webentwicklung weit verbreitet ist (derselbe Hauptvorteil von NodeJS).
-Sie kÃļnnen aber auch die Vorteile von Parallelität und Multiprocessing (Mehrere Prozesse werden parallel ausgefÃŧhrt) fÃŧr **CPU-lastige** Workloads wie in Systemen fÃŧr maschinelles Lernen nutzen.
+Sie kÃļnnen aber auch die Vorteile von Parallelität und Multiprocessing (mehrere Prozesse werden parallel ausgefÃŧhrt) fÃŧr **CPU-lastige** Workloads wie in Systemen fÃŧr maschinelles Lernen nutzen.
Dies und die einfache Tatsache, dass Python die Hauptsprache fÃŧr **Data Science**, maschinelles Lernen und insbesondere Deep Learning ist, machen FastAPI zu einem sehr passenden Werkzeug fÃŧr Web-APIs und Anwendungen fÃŧr Data Science / maschinelles Lernen (neben vielen anderen).
Wie Sie diese Parallelität in der Produktion erreichen, erfahren Sie im Abschnitt Ãŧber [Deployment](deployment/index.md){.internal-link target=_blank}.
-## `async` und `await`.
+## `async` und `await` { #async-and-await }
Moderne Versionen von Python verfÃŧgen Ãŧber eine sehr intuitive MÃļglichkeit, asynchronen Code zu schreiben. Dadurch sieht es wie normaler âsequentiellerâ Code aus und Ãŧbernimmt im richtigen Moment das âWartenâ fÃŧr Sie.
@@ -316,16 +316,16 @@ Damit `await` funktioniert, muss es sich in einer Funktion befinden, die diese A
```Python hl_lines="1"
async def get_burgers(number: int):
- # Mach Sie hier etwas Asynchrones, um die Burger zu erstellen
+ # Mache hier etwas Asynchrones, um die Burger zu erstellen
return burgers
```
... statt mit `def`:
```Python hl_lines="2"
-# Die ist nicht asynchron
+# Dies ist nicht asynchron
def get_sequential_burgers(number: int):
- # Mach Sie hier etwas Sequentielles, um die Burger zu erstellen
+ # Mache hier etwas Sequentielles, um die Burger zu erstellen
return burgers
```
@@ -349,7 +349,7 @@ async def read_burgers():
return burgers
```
-### Weitere technische Details
+### Weitere technische Details { #more-technical-details }
Ihnen ist wahrscheinlich aufgefallen, dass `await` nur innerhalb von Funktionen verwendet werden kann, die mit `async def` definiert sind.
@@ -361,15 +361,17 @@ Wenn Sie mit **FastAPI** arbeiten, mÃŧssen Sie sich darÃŧber keine Sorgen machen
Wenn Sie jedoch `async` / `await` ohne FastAPI verwenden mÃļchten, kÃļnnen Sie dies auch tun.
-### Schreiben Sie Ihren eigenen asynchronen Code
+### Schreiben Sie Ihren eigenen asynchronen Code { #write-your-own-async-code }
-Starlette (und **FastAPI**) basiert auf AnyIO, was bedeutet, es ist sowohl kompatibel mit der Python-Standardbibliothek asyncio, als auch mit Trio.
+Starlette (und **FastAPI**) basieren auf AnyIO, was bedeutet, dass es sowohl kompatibel mit der Python-Standardbibliothek asyncio als auch mit Trio ist.
-Insbesondere kÃļnnen Sie AnyIO direkt verwenden fÃŧr Ihre fortgeschritten nebenläufigen und parallelen Anwendungsfälle, die fortgeschrittenere Muster in Ihrem eigenen Code erfordern.
+Insbesondere kÃļnnen Sie AnyIO direkt verwenden fÃŧr Ihre fortgeschrittenen nebenläufigen Anwendungsfälle, die fortgeschrittenere Muster in Ihrem eigenen Code erfordern.
-Und selbst wenn Sie FastAPI nicht verwenden wÃŧrden, kÃļnnten Sie auch Ihre eigenen asynchronen Anwendungen mit AnyIO so schreiben, dass sie hoch kompatibel sind und Sie dessen Vorteile nutzen kÃļnnen (z. B. *strukturierte Nebenläufigkeit*).
+Und auch wenn Sie FastAPI nicht verwenden wÃŧrden, kÃļnnten Sie Ihre eigenen asynchronen Anwendungen mit AnyIO schreiben, um hochkompatibel zu sein und dessen Vorteile zu nutzen (z. B. *strukturierte Nebenläufigkeit*).
-### Andere Formen von asynchronem Code
+Ich habe eine weitere Bibliothek auf Basis von AnyIO erstellt, als dÃŧnne Schicht obendrauf, um die Typannotationen etwas zu verbessern und bessere **Autovervollständigung**, **Inline-Fehler** usw. zu erhalten. Sie hat auch eine freundliche EinfÃŧhrung und ein Tutorial, um Ihnen zu helfen, **Ihren eigenen asynchronen Code zu verstehen** und zu schreiben: Asyncer. Sie ist insbesondere nÃŧtzlich, wenn Sie **asynchronen Code mit regulärem** (blockierendem/synchronem) Code kombinieren mÃŧssen.
+
+### Andere Formen von asynchronem Code { #other-forms-of-asynchronous-code }
Diese Art der Verwendung von `async` und `await` ist in der Sprache relativ neu.
@@ -381,25 +383,25 @@ Davor war der Umgang mit asynchronem Code jedoch deutlich komplexer und schwieri
In frÃŧheren Versionen von Python hätten Sie Threads oder Gevent verwenden kÃļnnen. Der Code ist jedoch viel komplexer zu verstehen, zu debuggen und nachzuvollziehen.
-In frÃŧheren Versionen von NodeJS / Browser JavaScript hätten Sie âCallbacksâ verwendet. Was zur Callback-HÃļlle fÃŧhrt.
+In frÃŧheren Versionen von NodeJS / Browser JavaScript hätten Sie âCallbacksâ verwendet. Was zur âCallback-HÃļlleâ fÃŧhrt.
-## Coroutinen
+## Coroutinen { #coroutines }
**Coroutine** ist nur ein schicker Begriff fÃŧr dasjenige, was von einer `async def`-Funktion zurÃŧckgegeben wird. Python weiÃ, dass es so etwas wie eine Funktion ist, die es starten kann und die irgendwann endet, aber auch dass sie pausiert ⸠werden kann, wann immer darin ein `await` steht.
Aber all diese Funktionalität der Verwendung von asynchronem Code mit `async` und `await` wird oft als Verwendung von âCoroutinenâ zusammengefasst. Es ist vergleichbar mit dem Hauptmerkmal von Go, den âGoroutinenâ.
-## Fazit
+## Fazit { #conclusion }
Sehen wir uns den gleichen Satz von oben noch mal an:
-> Moderne Versionen von Python unterstÃŧtzen **âasynchronen Codeâ** unter Verwendung sogenannter **âCoroutinenâ** mithilfe der Syntax **`async`** und **`await`**.
+> Moderne Versionen von Python unterstÃŧtzen **âasynchronen Codeâ** unter Verwendung sogenannter **âCoroutinenâ** mithilfe der Syntax **`async` und `await`**.
Das sollte jetzt mehr Sinn ergeben. â¨
All das ist es, was FastAPI (via Starlette) befeuert und es eine so beeindruckende Performanz haben lässt.
-## Sehr technische Details
+## Sehr technische Details { #very-technical-details }
/// warning | Achtung
@@ -411,23 +413,23 @@ Wenn Sie Ãŧber gute technische Kenntnisse verfÃŧgen (Coroutinen, Threads, Blocki
///
-### Pfadoperation-Funktionen
+### Pfadoperation-Funktionen { #path-operation-functions }
Wenn Sie eine *Pfadoperation-Funktion* mit normalem `def` anstelle von `async def` deklarieren, wird sie in einem externen Threadpool ausgefÃŧhrt, der dann `await`et wird, anstatt direkt aufgerufen zu werden (da dies den Server blockieren wÃŧrde).
Wenn Sie von einem anderen asynchronen Framework kommen, das nicht auf die oben beschriebene Weise funktioniert, und Sie es gewohnt sind, triviale, nur-berechnende *Pfadoperation-Funktionen* mit einfachem `def` zu definieren, um einen geringfÃŧgigen Geschwindigkeitsgewinn (etwa 100 Nanosekunden) zu erzielen, beachten Sie bitte, dass der Effekt in **FastAPI** genau gegenteilig wäre. In solchen Fällen ist es besser, `async def` zu verwenden, es sei denn, Ihre *Pfadoperation-Funktionen* verwenden Code, der blockierende I/O-Operationen durchfÃŧhrt.
-Dennoch besteht in beiden Fällen eine gute Chance, dass **FastAPI** [immer noch schneller](index.md#performanz){.internal-link target=_blank} als Ihr bisheriges Framework (oder zumindest damit vergleichbar) ist.
+Dennoch besteht in beiden Fällen eine gute Chance, dass **FastAPI** [immer noch schneller](index.md#performance){.internal-link target=_blank} als Ihr bisheriges Framework (oder zumindest damit vergleichbar) ist.
-### Abhängigkeiten
+### Abhängigkeiten { #dependencies }
-Das Gleiche gilt fÃŧr [Abhängigkeiten](tutorial/dependencies/index.md){.internal-link target=_blank}. Wenn eine Abhängigkeit eine normale `def`-Funktion ist, anstelle einer `async def`-Funktion, dann wird sie im externen Threadpool ausgefÃŧhrt.
+Das Gleiche gilt fÃŧr [Abhängigkeiten](tutorial/dependencies/index.md){.internal-link target=_blank}. Wenn eine Abhängigkeit eine normale `def`-Funktion anstelle einer `async def` ist, wird sie im externen Threadpool ausgefÃŧhrt.
-### Unterabhängigkeiten
+### Unterabhängigkeiten { #sub-dependencies }
-Sie kÃļnnen mehrere Abhängigkeiten und [Unterabhängigkeiten](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank} haben, die einander bedingen (als Parameter der Funktionsdefinitionen), einige davon kÃļnnten erstellt werden mit `async def` und einige mit normalem `def`. Es wÃŧrde immer noch funktionieren und diejenigen, die mit normalem `def` erstellt wurden, wÃŧrden in einem externen Thread (vom Threadpool stammend) aufgerufen werden, anstatt `await`et zu werden.
+Sie kÃļnnen mehrere Abhängigkeiten und [Unterabhängigkeiten](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank} haben, die einander bedingen (als Parameter der Funktionsdefinitionen), einige davon kÃļnnten erstellt werden mit `async def` und einige mit normalem `def`. Es wÃŧrde immer noch funktionieren, und diejenigen, die mit normalem `def` erstellt wurden, wÃŧrden in einem externen Thread (vom Threadpool stammend) aufgerufen werden, anstatt `await`et zu werden.
-### Andere Hilfsfunktionen
+### Andere Hilfsfunktionen { #other-utility-functions }
Jede andere Hilfsfunktion, die Sie direkt aufrufen, kann mit normalem `def` oder `async def` erstellt werden, und FastAPI beeinflusst nicht die Art und Weise, wie Sie sie aufrufen.
@@ -439,4 +441,4 @@ Wenn Ihre Hilfsfunktion eine normale Funktion mit `def` ist, wird sie direkt auf
Nochmal, es handelt sich hier um sehr technische Details, die Ihnen helfen, falls Sie danach gesucht haben.
-Andernfalls liegen Sie richtig, wenn Sie sich an die Richtlinien aus dem obigen Abschnitt halten: In Eile?.
+Andernfalls liegen Sie richtig, wenn Sie sich an die Richtlinien aus dem obigen Abschnitt halten: In Eile?.
diff --git a/docs/de/docs/benchmarks.md b/docs/de/docs/benchmarks.md
index 6efd56e83..09126c5d9 100644
--- a/docs/de/docs/benchmarks.md
+++ b/docs/de/docs/benchmarks.md
@@ -1,16 +1,16 @@
-# Benchmarks
+# Benchmarks { #benchmarks }
-Unabhängige TechEmpower-Benchmarks zeigen, **FastAPI**-Anwendungen, die unter Uvicorn ausgefÃŧhrt werden, gehÃļren zu den schnellsten existierenden Python-Frameworks, nur Starlette und Uvicorn selbst (intern von FastAPI verwendet) sind schneller.
+Unabhängige TechEmpower-Benchmarks zeigen **FastAPI**-Anwendungen, die unter Uvicorn ausgefÃŧhrt werden, als eines der schnellsten verfÃŧgbaren Python-Frameworks, nur unterhalb von Starlette und Uvicorn selbst (die intern von FastAPI verwendet werden).
-Beim Ansehen von Benchmarks und Vergleichen sollten Sie jedoch Folgende Punkte beachten.
+Aber bei der Betrachtung von Benchmarks und Vergleichen sollten Sie Folgendes beachten.
-## Benchmarks und Geschwindigkeit
+## Benchmarks und Geschwindigkeit { #benchmarks-and-speed }
-Wenn Sie sich die Benchmarks ansehen, werden häufig mehrere Tools mit unterschiedlichen Eigenschaften als gleichwertig verglichen.
+Wenn Sie die Benchmarks ansehen, ist es Ãŧblich, dass mehrere Tools unterschiedlichen Typs als gleichwertig verglichen werden.
-Konkret geht es darum, Uvicorn, Starlette und FastAPI miteinander zu vergleichen (neben vielen anderen Tools).
+Insbesondere dass Uvicorn, Starlette und FastAPI zusammen verglichen werden (neben vielen anderen Tools).
-Je einfacher das Problem, welches durch das Tool gelÃļst wird, desto besser ist die Performanz. Und die meisten Benchmarks testen nicht die zusätzlichen Funktionen, welche das Tool bietet.
+Je einfacher das Problem, das durch das Tool gelÃļst wird, desto besser wird die Performanz sein. Und die meisten Benchmarks testen nicht die zusätzlichen Funktionen, die das Tool bietet.
Die Hierarchie ist wie folgt:
@@ -19,16 +19,16 @@ Die Hierarchie ist wie folgt:
* **FastAPI**: (verwendet Starlette) ein API-Mikroframework mit mehreren zusätzlichen Funktionen zum Erstellen von APIs, mit Datenvalidierung, usw.
* **Uvicorn**:
- * Bietet die beste Leistung, da auÃer dem Server selbst nicht viel zusätzlicher Code vorhanden ist.
- * Sie wÃŧrden eine Anwendung nicht direkt in Uvicorn schreiben. Das wÃŧrde bedeuten, dass Ihr Code zumindest mehr oder weniger den gesamten von Starlette (oder **FastAPI**) bereitgestellten Code enthalten mÃŧsste. Und wenn Sie das täten, hätte Ihre endgÃŧltige Anwendung den gleichen Overhead wie die Verwendung eines Frameworks nebst Minimierung Ihres Anwendungscodes und der Fehler.
+ * Wird die beste Performanz haben, da auÃer dem Server selbst nicht viel zusätzlicher Code vorhanden ist.
+ * Sie wÃŧrden eine Anwendung nicht direkt in Uvicorn schreiben. Das wÃŧrde bedeuten, dass Ihr Code zumindest mehr oder weniger den gesamten von Starlette (oder **FastAPI**) bereitgestellten Code enthalten mÃŧsste. Und wenn Sie das täten, hätte Ihre endgÃŧltige Anwendung den gleichen Overhead wie bei der Verwendung eines Frameworks und der Minimierung Ihres Anwendungscodes und der Fehler.
* Wenn Sie Uvicorn vergleichen, vergleichen Sie es mit Anwendungsservern wie Daphne, Hypercorn, uWSGI, usw.
* **Starlette**:
- * Wird nach Uvicorn die nächstbeste Performanz erbringen. Tatsächlich nutzt Starlette intern Uvicorn. Daher kann es wahrscheinlich nur âlangsamerâ als Uvicorn sein, weil mehr Code ausgefÃŧhrt wird.
- * Aber es bietet Ihnen die Tools zum Erstellen einfacher Webanwendungen, mit Routing basierend auf Pfaden, usw.
+ * Wird nach Uvicorn die nächstbeste Performanz erbringen. Tatsächlich verwendet Starlette intern Uvicorn, um zu laufen. Daher kann es wahrscheinlich nur âlangsamerâ als Uvicorn werden, weil mehr Code ausgefÃŧhrt werden muss.
+ * Aber es bietet Ihnen die Werkzeuge, um einfache Webanwendungen zu erstellen, mit Routing basierend auf Pfaden, usw.
* Wenn Sie Starlette vergleichen, vergleichen Sie es mit Webframeworks (oder Mikroframeworks) wie Sanic, Flask, Django, usw.
* **FastAPI**:
* So wie Starlette Uvicorn verwendet und nicht schneller als dieses sein kann, verwendet **FastAPI** Starlette, sodass es nicht schneller als dieses sein kann.
- * FastAPI bietet zusätzlich zu Starlette weitere Funktionen. Funktionen, die Sie beim Erstellen von APIs fast immer benÃļtigen, wie Datenvalidierung und Serialisierung. Und wenn Sie es verwenden, erhalten Sie kostenlos automatische Dokumentation (die automatische Dokumentation verursacht nicht einmal zusätzlichen Aufwand fÃŧr laufende Anwendungen, sie wird beim Start generiert).
- * Wenn Sie FastAPI nicht, und direkt Starlette (oder ein anderes Tool wie Sanic, Flask, Responder, usw.) verwenden wÃŧrden, mÃŧssten Sie die gesamte Datenvalidierung und Serialisierung selbst implementieren. Ihre finale Anwendung hätte also immer noch den gleichen Overhead, als ob sie mit FastAPI erstellt worden wäre. Und in vielen Fällen ist diese Datenvalidierung und Serialisierung der grÃļÃte Teil des in Anwendungen geschriebenen Codes.
- * Durch die Verwendung von FastAPI sparen Sie also Entwicklungszeit, Fehler und Codezeilen und wÃŧrden wahrscheinlich die gleiche Leistung (oder eine bessere) erzielen, die Sie hätten, wenn Sie es nicht verwenden wÃŧrden (da Sie alles in Ihrem Code implementieren mÃŧssten).
- * Wenn Sie FastAPI vergleichen, vergleichen Sie es mit einem Webanwendung-Framework (oder einer Reihe von Tools), welche Datenvalidierung, Serialisierung und Dokumentation bereitstellen, wie Flask-apispec, NestJS, Molten, usw. â Frameworks mit integrierter automatischer Datenvalidierung, Serialisierung und Dokumentation.
+ * FastAPI bietet zusätzliche Funktionen auf Basis von Starlette. Funktionen, die Sie beim Erstellen von APIs fast immer benÃļtigen, wie Datenvalidierung und Serialisierung. Und wenn Sie es verwenden, erhalten Sie kostenlose automatische Dokumentation (die automatische Dokumentation verursacht nicht einmal zusätzlichen Overhead fÃŧr laufende Anwendungen, sie wird beim Starten generiert).
+ * Wenn Sie FastAPI nicht verwenden und stattdessen Starlette direkt (oder ein anderes Tool wie Sanic, Flask, Responder, usw.) verwenden wÃŧrden, mÃŧssten Sie die gesamte Datenvalidierung und Serialisierung selbst implementieren. Ihre finale Anwendung hätte also immer noch den gleichen Overhead, als ob sie mit FastAPI erstellt worden wäre. Und in vielen Fällen ist diese Datenvalidierung und Serialisierung der grÃļÃte Teil des in Anwendungen geschriebenen Codes.
+ * Durch die Verwendung von FastAPI sparen Sie also Entwicklungszeit, Fehler und Codezeilen und wÃŧrden wahrscheinlich die gleiche Performanz (oder eine bessere) erzielen, die Sie hätten, wenn Sie es nicht verwenden wÃŧrden (da Sie alles in Ihrem Code implementieren mÃŧssten).
+ * Wenn Sie FastAPI vergleichen, vergleichen Sie es mit einem Webanwendungs-Framework (oder einer Reihe von Tools), das Datenvalidierung, Serialisierung und Dokumentation bereitstellt, wie Flask-apispec, NestJS, Molten, usw. â Frameworks mit integrierter automatischer Datenvalidierung, Serialisierung und Dokumentation.
diff --git a/docs/de/docs/deployment/cloud.md b/docs/de/docs/deployment/cloud.md
index 2d70fe4e5..ca1ba3b3b 100644
--- a/docs/de/docs/deployment/cloud.md
+++ b/docs/de/docs/deployment/cloud.md
@@ -1,17 +1,16 @@
-# FastAPI-Deployment bei Cloud-Anbietern
+# FastAPI bei Cloudanbietern bereitstellen { #deploy-fastapi-on-cloud-providers }
-Sie kÃļnnen praktisch **jeden Cloud-Anbieter** fÃŧr das Deployment Ihrer FastAPI-Anwendung verwenden.
+Sie kÃļnnen praktisch **jeden Cloudanbieter** verwenden, um Ihre FastAPI-Anwendung bereitzustellen.
-In den meisten Fällen verfÃŧgen die Haupt-Cloud-Anbieter Ãŧber Anleitungen zum Deployment von FastAPI.
+In den meisten Fällen bieten die groÃen Cloudanbieter Anleitungen zum Bereitstellen von FastAPI an.
-## Cloud-Anbieter â Sponsoren
+## Cloudanbieter â Sponsoren { #cloud-providers-sponsors }
-Einige Cloud-Anbieter ⨠[**sponsern FastAPI**](../help-fastapi.md#den-autor-sponsern){.internal-link target=_blank} â¨, dies gewährleistet die kontinuierliche und gesunde **Entwicklung** von FastAPI und seinem **Ãkosystem**.
+Einige Cloudanbieter ⨠[**sponsern FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} â¨, dies stellt die kontinuierliche und gesunde **Entwicklung** von FastAPI und seinem **Ãkosystem** sicher.
-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. đ
+Und es zeigt ihr wahres Engagement fÃŧr FastAPI und seine **Community** (Sie), da sie Ihnen nicht nur einen **guten Service** bieten mÃļchten, sondern auch sicherstellen mÃļchten, dass Sie ein **gutes und gesundes Framework**, FastAPI, haben. đ
Vielleicht mÃļchten Sie deren Dienste ausprobieren und deren Anleitungen folgen:
-* Platform.sh
-* Porter
-* Coherence
+* Render
+* Railway
diff --git a/docs/de/docs/deployment/concepts.md b/docs/de/docs/deployment/concepts.md
index 907598e54..ef0f458a7 100644
--- a/docs/de/docs/deployment/concepts.md
+++ b/docs/de/docs/deployment/concepts.md
@@ -1,4 +1,4 @@
-# Deployment-Konzepte
+# Deployment-Konzepte { #deployments-concepts }
Bei dem Deployment â der Bereitstellung â einer **FastAPI**-Anwendung, oder eigentlich jeder Art von Web-API, gibt es mehrere Konzepte, die Sie wahrscheinlich interessieren, und mithilfe der Sie die **am besten geeignete** Methode zur **Bereitstellung Ihrer Anwendung** finden kÃļnnen.
@@ -13,7 +13,7 @@ Einige wichtige Konzepte sind:
Wir werden sehen, wie diese sich auf das **Deployment** auswirken.
-Letztendlich besteht das ultimative Ziel darin, **Ihre API-Clients** auf **sichere** Weise zu bedienen, um **Unterbrechungen** zu vermeiden und die **Rechenressourcen** (z. B. entfernte Server/virtuelle Maschinen) so effizient wie mÃļglich zu nutzen. đ
+Letztendlich besteht das ultimative Ziel darin, **Ihre API-Clients** auf **sichere** Weise zu versorgen, um **Unterbrechungen** zu vermeiden und die **Rechenressourcen** (z. B. entfernte Server/virtuelle Maschinen) so effizient wie mÃļglich zu nutzen. đ
Ich erzähle Ihnen hier etwas mehr Ãŧber diese **Konzepte**, was Ihnen hoffentlich die **Intuition** gibt, die Sie benÃļtigen, um zu entscheiden, wie Sie Ihre API in sehr unterschiedlichen Umgebungen bereitstellen, mÃļglicherweise sogar in **zukÃŧnftigen**, die jetzt noch nicht existieren.
@@ -23,7 +23,7 @@ In den nächsten Kapiteln werde ich Ihnen mehr **konkrete Rezepte** fÃŧr die Ber
Aber schauen wir uns zunächst einmal diese grundlegenden **konzeptionellen Ideen** an. Diese Konzepte gelten auch fÃŧr jede andere Art von Web-API. đĄ
-## Sicherheit â HTTPS
+## Sicherheit â HTTPS { #security-https }
Im [vorherigen Kapitel Ãŧber HTTPS](https.md){.internal-link target=_blank} haben wir erfahren, wie HTTPS VerschlÃŧsselung fÃŧr Ihre API bereitstellt.
@@ -31,7 +31,7 @@ Wir haben auch gesehen, dass HTTPS normalerweise von einer Komponente **auÃerha
Und es muss etwas geben, das fÃŧr die **Erneuerung der HTTPS-Zertifikate** zuständig ist, es kÃļnnte sich um dieselbe Komponente handeln oder um etwas anderes.
-### Beispieltools fÃŧr HTTPS
+### Beispieltools fÃŧr HTTPS { #example-tools-for-https }
Einige der Tools, die Sie als TLS-Terminierungsproxy verwenden kÃļnnen, sind:
@@ -55,11 +55,11 @@ In den nächsten Kapiteln zeige ich Ihnen einige konkrete Beispiele.
Die nächsten zu berÃŧcksichtigenden Konzepte drehen sich dann um das Programm, das Ihre eigentliche API ausfÃŧhrt (z. B. Uvicorn).
-## Programm und Prozess
+## Programm und Prozess { #program-and-process }
Wir werden viel Ãŧber den laufenden â**Prozess**â sprechen, daher ist es nÃŧtzlich, Klarheit darÃŧber zu haben, was das bedeutet und was der Unterschied zum Wort â**Programm**â ist.
-### Was ist ein Programm?
+### Was ist ein Programm { #what-is-a-program }
Das Wort **Programm** wird häufig zur Beschreibung vieler Dinge verwendet:
@@ -67,7 +67,7 @@ Das Wort **Programm** wird häufig zur Beschreibung vieler Dinge verwendet:
* Die **Datei**, die vom Betriebssystem **ausgefÃŧhrt** werden kann, zum Beispiel: `python`, `python.exe` oder `uvicorn`.
* Ein bestimmtes Programm, während es auf dem Betriebssystem **läuft**, die CPU nutzt und Dinge im Arbeitsspeicher ablegt. Dies wird auch als **Prozess** bezeichnet.
-### Was ist ein Prozess?
+### Was ist ein Prozess { #what-is-a-process }
Das Wort **Prozess** wird normalerweise spezifischer verwendet und bezieht sich nur auf das, was im Betriebssystem ausgefÃŧhrt wird (wie im letzten Punkt oben):
@@ -88,13 +88,13 @@ Und Sie werden beispielsweise wahrscheinlich feststellen, dass mehrere Prozesse
Nachdem wir nun den Unterschied zwischen den Begriffen **Prozess** und **Programm** kennen, sprechen wir weiter Ãŧber das Deployment.
-## Beim Hochfahren ausfÃŧhren
+## Beim Hochfahren ausfÃŧhren { #running-on-startup }
Wenn Sie eine Web-API erstellen, mÃļchten Sie in den meisten Fällen, dass diese **immer läuft**, ununterbrochen, damit Ihre Clients immer darauf zugreifen kÃļnnen. Es sei denn natÃŧrlich, Sie haben einen bestimmten Grund, warum Sie mÃļchten, dass diese nur in bestimmten Situationen ausgefÃŧhrt wird. Meistens mÃļchten Sie jedoch, dass sie ständig ausgefÃŧhrt wird und **verfÃŧgbar** ist.
-### Auf einem entfernten Server
+### Auf einem entfernten Server { #in-a-remote-server }
-Wenn Sie einen entfernten Server (einen Cloud-Server, eine virtuelle Maschine, usw.) einrichten, kÃļnnen Sie am einfachsten Uvicorn (oder ähnliches) manuell ausfÃŧhren, genau wie bei der lokalen Entwicklung.
+Wenn Sie einen entfernten Server (einen Cloud-Server, eine virtuelle Maschine, usw.) einrichten, kÃļnnen Sie am einfachsten `fastapi run` (welches Uvicorn verwendet) oder etwas Ãhnliches manuell ausfÃŧhren, genau wie bei der lokalen Entwicklung.
Und es wird funktionieren und **während der Entwicklung** nÃŧtzlich sein.
@@ -102,15 +102,15 @@ Wenn Ihre Verbindung zum Server jedoch unterbrochen wird, wird der **laufende Pr
Und wenn der Server neu gestartet wird (z. B. nach Updates oder Migrationen vom Cloud-Anbieter), werden Sie das wahrscheinlich **nicht bemerken**. Und deshalb wissen Sie nicht einmal, dass Sie den Prozess manuell neu starten mÃŧssen. Ihre API bleibt also einfach tot. đą
-### Beim Hochfahren automatisch ausfÃŧhren
+### Beim Hochfahren automatisch ausfÃŧhren { #run-automatically-on-startup }
Im Allgemeinen mÃļchten Sie wahrscheinlich, dass das Serverprogramm (z. B. Uvicorn) beim Hochfahren des Servers automatisch gestartet wird und kein **menschliches Eingreifen** erforderlich ist, sodass immer ein Prozess mit Ihrer API ausgefÃŧhrt wird (z. B. Uvicorn, welches Ihre FastAPI-Anwendung ausfÃŧhrt).
-### Separates Programm
+### Separates Programm { #separate-program }
Um dies zu erreichen, haben Sie normalerweise ein **separates Programm**, welches sicherstellt, dass Ihre Anwendung beim Hochfahren ausgefÃŧhrt wird. Und in vielen Fällen wÃŧrde es auch sicherstellen, dass auch andere Komponenten oder Anwendungen ausgefÃŧhrt werden, beispielsweise eine Datenbank.
-### Beispieltools zur AusfÃŧhrung beim Hochfahren
+### Beispieltools zur AusfÃŧhrung beim Hochfahren { #example-tools-to-run-at-startup }
Einige Beispiele fÃŧr Tools, die diese Aufgabe Ãŧbernehmen kÃļnnen, sind:
@@ -125,29 +125,29 @@ Einige Beispiele fÃŧr Tools, die diese Aufgabe Ãŧbernehmen kÃļnnen, sind:
In den nächsten Kapiteln werde ich Ihnen konkretere Beispiele geben.
-## Neustart
+## Neustart { #restarts }
Ãhnlich wie Sie sicherstellen mÃļchten, dass Ihre Anwendung beim Hochfahren ausgefÃŧhrt wird, mÃļchten Sie wahrscheinlich auch sicherstellen, dass diese nach Fehlern **neu gestartet** wird.
-### Wir machen Fehler
+### Wir machen Fehler { #we-make-mistakes }
Wir, als Menschen, machen ständig **Fehler**. Software hat fast *immer* **Bugs**, die an verschiedenen Stellen versteckt sind. đ
Und wir als Entwickler verbessern den Code ständig, wenn wir diese Bugs finden und neue Funktionen implementieren (und mÃļglicherweise auch neue Bugs hinzufÃŧgen đ
).
-### Kleine Fehler automatisch handhaben
+### Kleine Fehler automatisch handhaben { #small-errors-automatically-handled }
-Wenn beim Erstellen von Web-APIs mit FastAPI ein Fehler in unserem Code auftritt, wird FastAPI ihn normalerweise dem einzelnen Request zurÃŧckgeben, der den Fehler ausgelÃļst hat. đĄ
+Wenn beim Erstellen von Web-APIs mit FastAPI ein Fehler in unserem Code auftritt, wird FastAPI ihn normalerweise dem einzelnen Request zurÃŧckgeben, der den Fehler ausgelÃļst hat. đĄ
Der Client erhält fÃŧr diesen Request einen **500 Internal Server Error**, aber die Anwendung arbeitet bei den nächsten Requests weiter, anstatt einfach komplett abzustÃŧrzen.
-### GrÃļÃere Fehler â AbstÃŧrze
+### GrÃļÃere Fehler â AbstÃŧrze { #bigger-errors-crashes }
Dennoch kann es vorkommen, dass wir Code schreiben, der **die gesamte Anwendung zum Absturz bringt** und so zum Absturz von Uvicorn und Python fÃŧhrt. đĨ
Und dennoch mÃļchten Sie wahrscheinlich nicht, dass die Anwendung tot bleibt, weil an einer Stelle ein Fehler aufgetreten ist. Sie mÃļchten wahrscheinlich, dass sie zumindest fÃŧr die *Pfadoperationen*, die nicht fehlerhaft sind, **weiterläuft**.
-### Neustart nach Absturz
+### Neustart nach Absturz { #restart-after-crash }
Aber in den Fällen mit wirklich schwerwiegenden Fehlern, die den laufenden **Prozess** zum Absturz bringen, benÃļtigen Sie eine externe Komponente, die den Prozess **neu startet**, zumindest ein paar Mal ...
@@ -161,7 +161,7 @@ Konzentrieren wir uns also auf die Hauptfälle, in denen die Anwendung in bestim
Sie mÃļchten wahrscheinlich, dass eine **externe Komponente** fÃŧr den Neustart Ihrer Anwendung verantwortlich ist, da zu diesem Zeitpunkt dieselbe Anwendung mit Uvicorn und Python bereits abgestÃŧrzt ist und es daher nichts im selben Code derselben Anwendung gibt, was etwas dagegen tun kann.
-### Beispieltools zum automatischen Neustart
+### Beispieltools zum automatischen Neustart { #example-tools-to-restart-automatically }
In den meisten Fällen wird dasselbe Tool, das zum **AusfÃŧhren des Programms beim Hochfahren** verwendet wird, auch fÃŧr automatische **Neustarts** verwendet.
@@ -176,19 +176,19 @@ Dies kÃļnnte zum Beispiel erledigt werden durch:
* Intern von einem Cloud-Anbieter im Rahmen seiner Dienste
* Andere ...
-## Replikation â Prozesse und Arbeitsspeicher
+## Replikation â Prozesse und Arbeitsspeicher { #replication-processes-and-memory }
-Wenn Sie eine FastAPI-Anwendung verwenden und ein Serverprogramm wie Uvicorn verwenden, kann **ein einzelner Prozess** mehrere Clients gleichzeitig bedienen.
+Wenn Sie eine FastAPI-Anwendung verwenden und ein Serverprogramm wie den `fastapi`-Befehl, der Uvicorn ausfÃŧhrt, kann **ein einzelner Prozess** an mehrere Clients gleichzeitig ausliefern.
-In vielen Fällen mÃļchten Sie jedoch mehrere Prozesse gleichzeitig ausfÃŧhren.
+In vielen Fällen mÃļchten Sie jedoch mehrere Workerprozesse gleichzeitig ausfÃŧhren.
-### Mehrere Prozesse â Worker
+### Mehrere Prozesse â Worker { #multiple-processes-workers }
Wenn Sie mehr Clients haben, als ein einzelner Prozess verarbeiten kann (z. B. wenn die virtuelle Maschine nicht sehr groà ist) und die CPU des Servers **mehrere Kerne** hat, dann kÃļnnten **mehrere Prozesse** gleichzeitig mit derselben Anwendung laufen und alle Requests unter sich verteilen.
-Wenn Sie mit **mehreren Prozessen** dasselbe API-Programm ausfÃŧhren, werden diese Ãŧblicherweise als **Worker** bezeichnet.
+Wenn Sie mit **mehreren Prozessen** dasselbe API-Programm ausfÃŧhren, werden diese Ãŧblicherweise als **Worker** bezeichnet.
-### Workerprozesse und Ports
+### Workerprozesse und Ports { #worker-processes-and-ports }
Erinnern Sie sich aus der Dokumentation [Ãber HTTPS](https.md){.internal-link target=_blank}, dass nur ein Prozess auf einer Kombination aus Port und IP-Adresse auf einem Server lauschen kann?
@@ -196,35 +196,35 @@ Das ist immer noch wahr.
Um also **mehrere Prozesse** gleichzeitig zu haben, muss es einen **einzelnen Prozess geben, der einen Port Ãŧberwacht**, welcher dann die Kommunikation auf irgendeine Weise an jeden Workerprozess Ãŧberträgt.
-### Arbeitsspeicher pro Prozess
+### Arbeitsspeicher pro Prozess { #memory-per-process }
Wenn das Programm nun Dinge in den Arbeitsspeicher lädt, zum Beispiel ein Modell fÃŧr maschinelles Lernen in einer Variablen oder den Inhalt einer groÃen Datei in einer Variablen, verbraucht das alles **einen Teil des Arbeitsspeichers (RAM â Random Access Memory)** des Servers.
Und mehrere Prozesse teilen sich normalerweise keinen Speicher. Das bedeutet, dass jeder laufende Prozess seine eigenen Dinge, eigenen Variablen und eigenen Speicher hat. Und wenn Sie in Ihrem Code viel Speicher verbrauchen, verbraucht **jeder Prozess** die gleiche Menge Speicher.
-### Serverspeicher
+### Serverspeicher { #server-memory }
Wenn Ihr Code beispielsweise ein Machine-Learning-Modell mit **1 GB GrÃļÃe** lädt und Sie einen Prozess mit Ihrer API ausfÃŧhren, verbraucht dieser mindestens 1 GB RAM. Und wenn Sie **4 Prozesse** (4 Worker) starten, verbraucht jeder 1 GB RAM. Insgesamt verbraucht Ihre API also **4 GB RAM**.
Und wenn Ihr entfernter Server oder Ihre virtuelle Maschine nur Ãŧber 3 GB RAM verfÃŧgt, fÃŧhrt der Versuch, mehr als 4 GB RAM zu laden, zu Problemen. đ¨
-### Mehrere Prozesse â Ein Beispiel
+### Mehrere Prozesse â Ein Beispiel { #multiple-processes-an-example }
Im folgenden Beispiel gibt es einen **Manager-Prozess**, welcher zwei **Workerprozesse** startet und steuert.
Dieser Manager-Prozess wäre wahrscheinlich derjenige, welcher der IP am **Port** lauscht. Und er wÃŧrde die gesamte Kommunikation an die Workerprozesse weiterleiten.
-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.
+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.
-## Das Theme ändern
+## Das Theme ändern { #change-the-theme }
-Auf die gleiche Weise kÃļnnten Sie das Theme der Syntaxhervorhebung mit dem SchlÃŧssel `syntaxHighlight.theme` festlegen (beachten Sie, dass er einen Punkt in der Mitte hat):
+Auf die gleiche Weise kÃļnnten Sie das Theme der Syntaxhervorhebung mit dem SchlÃŧssel `"syntaxHighlight.theme"` festlegen (beachten Sie, dass er einen Punkt in der Mitte hat):
{* ../../docs_src/configure_swagger_ui/tutorial002.py hl[3] *}
@@ -34,13 +34,13 @@ Obige Konfiguration wÃŧrde das Theme fÃŧr die Farbe der Syntaxhervorhebung ände
-## Defaultparameter der Swagger-Oberfläche ändern
+## Defaultparameter der Swagger-Oberfläche ändern { #change-default-swagger-ui-parameters }
FastAPI enthält einige Defaultkonfigurationsparameter, die fÃŧr die meisten Anwendungsfälle geeignet sind.
Es umfasst die folgenden Defaultkonfigurationen:
-{* ../../fastapi/openapi/docs.py ln[7:23] *}
+{* ../../fastapi/openapi/docs.py ln[8:23] hl[17:23] *}
Sie kÃļnnen jede davon Ãŧberschreiben, indem Sie im Argument `swagger_ui_parameters` einen anderen Wert festlegen.
@@ -48,13 +48,13 @@ Um beispielsweise `deepLinking` zu deaktivieren, kÃļnnten Sie folgende Einstellu
{* ../../docs_src/configure_swagger_ui/tutorial003.py hl[3] *}
-## Andere Parameter der Swagger-Oberfläche
+## Andere Parameter der Swagger-Oberfläche { #other-swagger-ui-parameters }
Um alle anderen mÃļglichen Konfigurationen zu sehen, die Sie verwenden kÃļnnen, lesen Sie die offizielle Dokumentation fÃŧr die Parameter der Swagger-Oberfläche.
-## JavaScript-basierte Einstellungen
+## Nur-JavaScript-Einstellungen { #javascript-only-settings }
-Die Swagger-Oberfläche erlaubt, dass andere Konfigurationen auch **JavaScript**-Objekte sein kÃļnnen (z. B. JavaScript-Funktionen).
+Die Swagger-Oberfläche erlaubt, dass andere Konfigurationen auch **Nur-JavaScript**-Objekte sein kÃļnnen (z. B. JavaScript-Funktionen).
FastAPI umfasst auch diese Nur-JavaScript-`presets`-Einstellungen:
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 f68902b99..6b8b1a176 100644
--- a/docs/de/docs/how-to/custom-docs-ui-assets.md
+++ b/docs/de/docs/how-to/custom-docs-ui-assets.md
@@ -1,18 +1,18 @@
-# Statische Assets der Dokumentationsoberfläche (selbst hosten)
+# Statische Assets der Dokumentationsoberfläche (Selbst-Hosting) { #custom-docs-ui-static-assets-self-hosting }
Die API-Dokumentation verwendet **Swagger UI** und **ReDoc**, und jede dieser Dokumentationen benÃļtigt einige JavaScript- und CSS-Dateien.
-StandardmäÃig werden diese Dateien von einem CDN bereitgestellt.
+StandardmäÃig werden diese Dateien von einem CDN bereitgestellt.
Es ist jedoch mÃļglich, das anzupassen, ein bestimmtes CDN festzulegen oder die Dateien selbst bereitzustellen.
-## Benutzerdefiniertes CDN fÃŧr JavaScript und CSS
+## Benutzerdefiniertes CDN fÃŧr JavaScript und CSS { #custom-cdn-for-javascript-and-css }
-Nehmen wir an, Sie mÃļchten ein anderes CDN verwenden, zum Beispiel mÃļchten Sie `https://unpkg.com/` verwenden.
+Nehmen wir an, Sie mÃļchten ein anderes CDN verwenden, zum Beispiel mÃļchten Sie `https://unpkg.com/` verwenden.
Das kann nÃŧtzlich sein, wenn Sie beispielsweise in einem Land leben, in dem bestimmte URLs eingeschränkt sind.
-### Die automatischen Dokumentationen deaktivieren
+### Die automatischen Dokumentationen deaktivieren { #disable-the-automatic-docs }
Der erste Schritt besteht darin, die automatischen Dokumentationen zu deaktivieren, da diese standardmäÃig das Standard-CDN verwenden.
@@ -20,7 +20,7 @@ Um diese zu deaktivieren, setzen Sie deren URLs beim Erstellen Ihrer `FastAPI`-A
{* ../../docs_src/custom_docs_ui/tutorial001.py hl[8] *}
-### Die benutzerdefinierten Dokumentationen hinzufÃŧgen
+### Die benutzerdefinierten Dokumentationen hinzufÃŧgen { #include-the-custom-docs }
Jetzt kÃļnnen Sie die *Pfadoperationen* fÃŧr die benutzerdefinierten Dokumentationen erstellen.
@@ -32,7 +32,7 @@ Sie kÃļnnen die internen Funktionen von FastAPI wiederverwenden, um die HTML-Sei
* `swagger_js_url`: die URL, unter welcher der HTML-Code fÃŧr Ihre Swagger-UI-Dokumentation die **JavaScript**-Datei abrufen kann. Dies ist die benutzerdefinierte CDN-URL.
* `swagger_css_url`: die URL, unter welcher der HTML-Code fÃŧr Ihre Swagger-UI-Dokumentation die **CSS**-Datei abrufen kann. Dies ist die benutzerdefinierte CDN-URL.
-Und genau so fÃŧr ReDoc ...
+Und ähnlich fÃŧr ReDoc ...
{* ../../docs_src/custom_docs_ui/tutorial001.py hl[2:6,11:19,22:24,27:33] *}
@@ -46,23 +46,23 @@ Swagger UI erledigt das hinter den Kulissen fÃŧr Sie, benÃļtigt aber diesen âU
///
-### Eine *Pfadoperation* erstellen, um es zu testen
+### Eine *Pfadoperation* erstellen, um es zu testen { #create-a-path-operation-to-test-it }
Um nun testen zu kÃļnnen, ob alles funktioniert, erstellen Sie eine *Pfadoperation*:
{* ../../docs_src/custom_docs_ui/tutorial001.py hl[36:38] *}
-### Es ausprobieren
+### Es testen { #test-it }
-Jetzt sollten Sie in der Lage sein, zu Ihrer Dokumentation auf http://127.0.0.1:8000/docs zu gehen und die Seite neu zuladen, die Assets werden nun vom neuen CDN geladen.
+Jetzt sollten Sie in der Lage sein, zu Ihrer Dokumentation auf http://127.0.0.1:8000/docs zu gehen und die Seite neu zu laden, die Assets werden nun vom neuen CDN geladen.
-## JavaScript und CSS fÃŧr die Dokumentation selbst hosten
+## JavaScript und CSS fÃŧr die Dokumentation selbst hosten { #self-hosting-javascript-and-css-for-docs }
-Das Selbst Hosten von JavaScript und CSS kann nÃŧtzlich sein, wenn Sie beispielsweise mÃļchten, dass Ihre Anwendung auch offline, ohne bestehenden Internetzugang oder in einem lokalen Netzwerk weiter funktioniert.
+Das Selbst-Hosting von JavaScript und CSS kann nÃŧtzlich sein, wenn Sie beispielsweise mÃļchten, dass Ihre Anwendung auch offline, ohne bestehenden Internetzugang oder in einem lokalen Netzwerk weiter funktioniert.
Hier erfahren Sie, wie Sie diese Dateien selbst in derselben FastAPI-App bereitstellen und die Dokumentation fÃŧr deren Verwendung konfigurieren.
-### Projektdateistruktur
+### Projektdateistruktur { #project-file-structure }
Nehmen wir an, die Dateistruktur Ihres Projekts sieht folgendermaÃen aus:
@@ -85,11 +85,11 @@ Ihre neue Dateistruktur kÃļnnte so aussehen:
âââ static/
```
-### Die Dateien herunterladen
+### Die Dateien herunterladen { #download-the-files }
Laden Sie die fÃŧr die Dokumentation benÃļtigten statischen Dateien herunter und legen Sie diese im Verzeichnis `static/` ab.
-Sie kÃļnnen wahrscheinlich mit der rechten Maustaste auf jeden Link klicken und eine Option wie etwa `Link speichern unter...` auswählen.
+Sie kÃļnnen wahrscheinlich mit der rechten Maustaste auf jeden Link klicken und eine Option wie etwa âLink speichern unter ...â auswählen.
**Swagger UI** verwendet folgende Dateien:
@@ -113,14 +113,14 @@ Danach kÃļnnte Ihre Dateistruktur wie folgt aussehen:
âââ swagger-ui.css
```
-### Die statischen Dateien bereitstellen
+### Die statischen Dateien bereitstellen { #serve-the-static-files }
* Importieren Sie `StaticFiles`.
* âMountenâ Sie eine `StaticFiles()`-Instanz in einem bestimmten Pfad.
{* ../../docs_src/custom_docs_ui/tutorial002.py hl[7,11] *}
-### Die statischen Dateien testen
+### Die statischen Dateien testen { #test-the-static-files }
Starten Sie Ihre Anwendung und gehen Sie auf http://127.0.0.1:8000/static/redoc.standalone.js.
@@ -138,19 +138,19 @@ Das zeigt, dass Sie statische Dateien aus Ihrer Anwendung bereitstellen kÃļnnen
Jetzt kÃļnnen wir die Anwendung so konfigurieren, dass sie diese statischen Dateien fÃŧr die Dokumentation verwendet.
-### Die automatischen Dokumentationen deaktivieren, fÃŧr statische Dateien
+### Die automatischen Dokumentationen fÃŧr statische Dateien deaktivieren { #disable-the-automatic-docs-for-static-files }
Wie bei der Verwendung eines benutzerdefinierten CDN besteht der erste Schritt darin, die automatischen Dokumentationen zu deaktivieren, da diese standardmäÃig das CDN verwenden.
-Um diese zu deaktivieren, setzen Sie deren URLs beim Erstellen Ihrer `FastAPI`-App auf `None`:
+Um sie zu deaktivieren, setzen Sie deren URLs beim Erstellen Ihrer `FastAPI`-App auf `None`:
{* ../../docs_src/custom_docs_ui/tutorial002.py hl[9] *}
-### Die benutzerdefinierten Dokumentationen, mit statischen Dateien, hinzufÃŧgen
+### Die benutzerdefinierten Dokumentationen fÃŧr statische Dateien hinzufÃŧgen { #include-the-custom-docs-for-static-files }
Und genau wie bei einem benutzerdefinierten CDN kÃļnnen Sie jetzt die *Pfadoperationen* fÃŧr die benutzerdefinierten Dokumentationen erstellen.
-Auch hier kÃļnnen Sie die internen Funktionen von FastAPI wiederverwenden, um die HTML-Seiten fÃŧr die Dokumentationen zu erstellen, und diesen die erforderlichen Argumente Ãŧbergeben:
+Auch hier kÃļnnen Sie die internen Funktionen von FastAPI wiederverwenden, um die HTML-Seiten fÃŧr die Dokumentationen zu erstellen und ihnen die erforderlichen Argumente zu Ãŧbergeben:
* `openapi_url`: die URL, unter der die HTML-Seite fÃŧr die Dokumentation das OpenAPI-Schema fÃŧr Ihre API abrufen kann. Sie kÃļnnen hier das Attribut `app.openapi_url` verwenden.
* `title`: der Titel Ihrer API.
@@ -158,7 +158,7 @@ Auch hier kÃļnnen Sie die internen Funktionen von FastAPI wiederverwenden, um di
* `swagger_js_url`: die URL, unter welcher der HTML-Code fÃŧr Ihre Swagger-UI-Dokumentation die **JavaScript**-Datei abrufen kann. **Das ist die, welche jetzt von Ihrer eigenen Anwendung bereitgestellt wird**.
* `swagger_css_url`: die URL, unter welcher der HTML-Code fÃŧr Ihre Swagger-UI-Dokumentation die **CSS**-Datei abrufen kann. **Das ist die, welche jetzt von Ihrer eigenen Anwendung bereitgestellt wird**.
-Und genau so fÃŧr ReDoc ...
+Und ähnlich fÃŧr ReDoc ...
{* ../../docs_src/custom_docs_ui/tutorial002.py hl[2:6,14:22,25:27,30:36] *}
@@ -172,14 +172,14 @@ Swagger UI erledigt das hinter den Kulissen fÃŧr Sie, benÃļtigt aber diesen âU
///
-### Eine *Pfadoperation* erstellen, um statische Dateien zu testen
+### Eine *Pfadoperation* erstellen, um statische Dateien zu testen { #create-a-path-operation-to-test-static-files }
Um nun testen zu kÃļnnen, ob alles funktioniert, erstellen Sie eine *Pfadoperation*:
{* ../../docs_src/custom_docs_ui/tutorial002.py hl[39:41] *}
-### Benutzeroberfläche, mit statischen Dateien, testen
+### Benutzeroberfläche mit statischen Dateien testen { #test-static-files-ui }
Jetzt sollten Sie in der Lage sein, Ihr WLAN zu trennen, gehen Sie zu Ihrer Dokumentation unter http://127.0.0.1:8000/docs und laden Sie die Seite neu.
-Und selbst ohne Internet kÃļnnten Sie die Dokumentation fÃŧr Ihre API sehen und damit interagieren.
+Und selbst ohne Internet kÃļnnen Sie die Dokumentation fÃŧr Ihre API sehen und mit ihr interagieren.
diff --git a/docs/de/docs/how-to/custom-request-and-route.md b/docs/de/docs/how-to/custom-request-and-route.md
index 3e6f709b6..41a85f832 100644
--- a/docs/de/docs/how-to/custom-request-and-route.md
+++ b/docs/de/docs/how-to/custom-request-and-route.md
@@ -1,10 +1,10 @@
-# Benutzerdefinierte Request- und APIRoute-Klasse
+# Benutzerdefinierte Request- und APIRoute-Klasse { #custom-request-and-apiroute-class }
In einigen Fällen mÃļchten Sie mÃļglicherweise die von den Klassen `Request` und `APIRoute` verwendete Logik Ãŧberschreiben.
Das kann insbesondere eine gute Alternative zur Logik in einer Middleware sein.
-Wenn Sie beispielsweise den Requestbody lesen oder manipulieren mÃļchten, bevor er von Ihrer Anwendung verarbeitet wird.
+Wenn Sie beispielsweise den Requestbody lesen oder manipulieren mÃļchten, bevor er von Ihrer Anwendung verarbeitet wird.
/// danger | Gefahr
@@ -14,7 +14,7 @@ Wenn Sie gerade erst mit **FastAPI** beginnen, mÃļchten Sie diesen Abschnitt vie
///
-## Anwendungsfälle
+## Anwendungsfälle { #use-cases }
Einige Anwendungsfälle sind:
@@ -22,13 +22,13 @@ Einige Anwendungsfälle sind:
* Dekomprimierung gzip-komprimierter Requestbodys.
* Automatisches Loggen aller Requestbodys.
-## Handhaben von benutzerdefinierten Requestbody-Kodierungen
+## Handhaben von benutzerdefinierten Requestbody-Kodierungen { #handling-custom-request-body-encodings }
Sehen wir uns an, wie Sie eine benutzerdefinierte `Request`-Unterklasse verwenden, um gzip-Requests zu dekomprimieren.
Und eine `APIRoute`-Unterklasse zur Verwendung dieser benutzerdefinierten Requestklasse.
-### Eine benutzerdefinierte `GzipRequest`-Klasse erstellen
+### Eine benutzerdefinierte `GzipRequest`-Klasse erstellen { #create-a-custom-gziprequest-class }
/// tip | Tipp
@@ -44,13 +44,13 @@ Auf diese Weise kann dieselbe Routenklasse gzip-komprimierte oder unkomprimierte
{* ../../docs_src/custom_request_and_route/tutorial001.py hl[8:15] *}
-### Eine benutzerdefinierte `GzipRoute`-Klasse erstellen
+### Eine benutzerdefinierte `GzipRoute`-Klasse erstellen { #create-a-custom-gziproute-class }
Als Nächstes erstellen wir eine benutzerdefinierte Unterklasse von `fastapi.routing.APIRoute`, welche `GzipRequest` nutzt.
Dieses Mal wird die Methode `APIRoute.get_route_handler()` Ãŧberschrieben.
-Diese Methode gibt eine Funktion zurÃŧck. Und diese Funktion empfängt einen Request und gibt eine Response zurÃŧck.
+Diese Methode gibt eine Funktion zurÃŧck. Und diese Funktion empfängt einen Request und gibt eine Response zurÃŧck.
Hier verwenden wir sie, um aus dem ursprÃŧnglichen Request einen `GzipRequest` zu erstellen.
@@ -58,9 +58,9 @@ Hier verwenden wir sie, um aus dem ursprÃŧnglichen Request einen `GzipRequest` z
/// note | Technische Details
-Ein `Request` hat ein `request.scope`-Attribut, welches einfach ein Python-`dict` ist, welches die mit dem Request verbundenen Metadaten enthält.
+Ein `Request` hat ein `request.scope`-Attribut, welches einfach ein Python-`dict` ist, welches die mit dem Request verbundenen Metadaten enthält.
-Ein `Request` hat auch ein `request.receive`, welches eine Funktion ist, die den Hauptteil des Requests empfängt.
+Ein `Request` hat auch ein `request.receive`, welches eine Funktion ist, die den Body des Requests empfängt.
Das `scope`-`dict` und die `receive`-Funktion sind beide Teil der ASGI-Spezifikation.
@@ -78,11 +78,11 @@ Danach ist die gesamte Verarbeitungslogik dieselbe.
Aufgrund unserer Ãnderungen in `GzipRequest.body` wird der Requestbody jedoch bei Bedarf automatisch dekomprimiert, wenn er von **FastAPI** geladen wird.
-## Zugriff auf den Requestbody in einem Exceptionhandler
+## Zugriff auf den Requestbody in einem Exceptionhandler { #accessing-the-request-body-in-an-exception-handler }
/// tip | Tipp
-Um dasselbe Problem zu lÃļsen, ist es wahrscheinlich viel einfacher, den `body` in einem benutzerdefinierten Handler fÃŧr `RequestValidationError` zu verwenden ([Fehlerbehandlung](../tutorial/handling-errors.md#den-requestvalidationerror-body-verwenden){.internal-link target=_blank}).
+Um dasselbe Problem zu lÃļsen, ist es wahrscheinlich viel einfacher, den `body` in einem benutzerdefinierten Handler fÃŧr `RequestValidationError` zu verwenden ([Fehlerbehandlung](../tutorial/handling-errors.md#use-the-requestvalidationerror-body){.internal-link target=_blank}).
Dieses Beispiel ist jedoch immer noch gÃŧltig und zeigt, wie mit den internen Komponenten interagiert wird.
@@ -98,7 +98,7 @@ Wenn eine Exception auftritt, befindet sich die `Request`-Instanz weiterhin im G
{* ../../docs_src/custom_request_and_route/tutorial002.py hl[16:18] *}
-## Benutzerdefinierte `APIRoute`-Klasse in einem Router
+## Benutzerdefinierte `APIRoute`-Klasse in einem Router { #custom-apiroute-class-in-a-router }
Sie kÃļnnen auch den Parameter `route_class` eines `APIRouter` festlegen:
diff --git a/docs/de/docs/how-to/extending-openapi.md b/docs/de/docs/how-to/extending-openapi.md
index 3b1459364..146ee098b 100644
--- a/docs/de/docs/how-to/extending-openapi.md
+++ b/docs/de/docs/how-to/extending-openapi.md
@@ -1,24 +1,24 @@
-# OpenAPI erweitern
+# OpenAPI erweitern { #extending-openapi }
-In einigen Fällen mÃŧssen Sie mÃļglicherweise das generierte OpenAPI-Schema ändern.
+Es gibt einige Fälle, in denen Sie das generierte OpenAPI-Schema ändern mÃŧssen.
In diesem Abschnitt erfahren Sie, wie.
-## Der normale Vorgang
+## Der normale Vorgang { #the-normal-process }
Der normale (Standard-)Prozess ist wie folgt.
-Eine `FastAPI`-Anwendung (-Instanz) verfÃŧgt Ãŧber eine `.openapi()`-Methode, von der erwartet wird, dass sie das OpenAPI-Schema zurÃŧckgibt.
+Eine `FastAPI`-Anwendung (Instanz) verfÃŧgt Ãŧber eine `.openapi()`-Methode, von der erwartet wird, dass sie das OpenAPI-Schema zurÃŧckgibt.
Als Teil der Erstellung des Anwendungsobjekts wird eine *Pfadoperation* fÃŧr `/openapi.json` (oder welcher Wert fÃŧr den Parameter `openapi_url` gesetzt wurde) registriert.
-Diese gibt lediglich eine JSON-Response zurÃŧck, mit dem Ergebnis der Methode `.openapi()` der Anwendung.
+Diese gibt lediglich eine JSON-Response zurÃŧck, mit dem Ergebnis der Methode `.openapi()` der Anwendung.
StandardmäÃig ÃŧberprÃŧft die Methode `.openapi()` die Eigenschaft `.openapi_schema`, um zu sehen, ob diese Inhalt hat, und gibt diesen zurÃŧck.
Ist das nicht der Fall, wird der Inhalt mithilfe der Hilfsfunktion unter `fastapi.openapi.utils.get_openapi` generiert.
-Und diese Funktion `get_openapi()` erhält als Parameter:
+Diese Funktion `get_openapi()` erhält als Parameter:
* `title`: Der OpenAPI-Titel, der in der Dokumentation angezeigt wird.
* `version`: Die Version Ihrer API, z. B. `2.5.0`.
@@ -27,53 +27,53 @@ Und diese Funktion `get_openapi()` erhält als Parameter:
* `description`: Die Beschreibung Ihrer API. Dies kann Markdown enthalten und wird in der Dokumentation angezeigt.
* `routes`: Eine Liste von Routen, dies sind alle registrierten *Pfadoperationen*. Sie stammen von `app.routes`.
-/// info
+/// info | Info
Der Parameter `summary` ist in OpenAPI 3.1.0 und hÃļher verfÃŧgbar und wird von FastAPI 0.99.0 und hÃļher unterstÃŧtzt.
///
-## Ãberschreiben der Standardeinstellungen
+## Ãberschreiben der Standardeinstellungen { #overriding-the-defaults }
Mithilfe der oben genannten Informationen kÃļnnen Sie dieselbe Hilfsfunktion verwenden, um das OpenAPI-Schema zu generieren und jeden benÃļtigten Teil zu Ãŧberschreiben.
-FÃŧgen wir beispielsweise ReDocs OpenAPI-Erweiterung zum Einbinden eines benutzerdefinierten Logos hinzu.
+FÃŧgen wir beispielsweise ReDocs OpenAPI-Erweiterung zum Einbinden eines benutzerdefinierten Logos hinzu.
-### Normales **FastAPI**
+### Normales **FastAPI** { #normal-fastapi }
Schreiben Sie zunächst wie gewohnt Ihre ganze **FastAPI**-Anwendung:
{* ../../docs_src/extending_openapi/tutorial001.py hl[1,4,7:9] *}
-### Das OpenAPI-Schema generieren
+### Das OpenAPI-Schema generieren { #generate-the-openapi-schema }
Verwenden Sie dann dieselbe Hilfsfunktion, um das OpenAPI-Schema innerhalb einer `custom_openapi()`-Funktion zu generieren:
{* ../../docs_src/extending_openapi/tutorial001.py hl[2,15:21] *}
-### Das OpenAPI-Schema ändern
+### Das OpenAPI-Schema ändern { #modify-the-openapi-schema }
Jetzt kÃļnnen Sie die ReDoc-Erweiterung hinzufÃŧgen und dem `info`-âObjektâ im OpenAPI-Schema ein benutzerdefiniertes `x-logo` hinzufÃŧgen:
{* ../../docs_src/extending_openapi/tutorial001.py hl[22:24] *}
-### Zwischenspeichern des OpenAPI-Schemas
+### Zwischenspeichern des OpenAPI-Schemas { #cache-the-openapi-schema }
Sie kÃļnnen die Eigenschaft `.openapi_schema` als âCacheâ verwenden, um Ihr generiertes Schema zu speichern.
Auf diese Weise muss Ihre Anwendung das Schema nicht jedes Mal generieren, wenn ein Benutzer Ihre API-Dokumentation Ãļffnet.
-Es wird nur einmal generiert und dann wird dasselbe zwischengespeicherte Schema fÃŧr die nächsten Requests verwendet.
+Es wird nur einmal generiert und dann wird dasselbe zwischengespeicherte Schema fÃŧr die nächsten Requests verwendet.
{* ../../docs_src/extending_openapi/tutorial001.py hl[13:14,25:26] *}
-### Die Methode Ãŧberschreiben
+### Die Methode Ãŧberschreiben { #override-the-method }
Jetzt kÃļnnen Sie die Methode `.openapi()` durch Ihre neue Funktion ersetzen.
{* ../../docs_src/extending_openapi/tutorial001.py hl[29] *}
-### Testen
+### Es testen { #check-it }
Sobald Sie auf http://127.0.0.1:8000/redoc gehen, werden Sie sehen, dass Ihr benutzerdefiniertes Logo verwendet wird (in diesem Beispiel das Logo von **FastAPI**):
diff --git a/docs/de/docs/how-to/general.md b/docs/de/docs/how-to/general.md
index b38b5fabf..0045eab74 100644
--- a/docs/de/docs/how-to/general.md
+++ b/docs/de/docs/how-to/general.md
@@ -1,39 +1,39 @@
-# Allgemeines â How-To â Rezepte
+# Allgemeines â How-To â Rezepte { #general-how-to-recipes }
Hier finden Sie mehrere Verweise auf andere Stellen in der Dokumentation, fÃŧr allgemeine oder häufige Fragen.
-## Daten filtern â Sicherheit
+## Daten filtern â Sicherheit { #filter-data-security }
Um sicherzustellen, dass Sie nicht mehr Daten zurÃŧckgeben, als Sie sollten, lesen Sie die Dokumentation unter [Tutorial â Responsemodell â RÃŧckgabetyp](../tutorial/response-model.md){.internal-link target=_blank}.
-## Dokumentations-Tags â OpenAPI
+## Dokumentations-Tags â OpenAPI { #documentation-tags-openapi }
Um Tags zu Ihren *Pfadoperationen* hinzuzufÃŧgen und diese in der Oberfläche der Dokumentation zu gruppieren, lesen Sie die Dokumentation unter [Tutorial â Pfadoperation-Konfiguration â Tags](../tutorial/path-operation-configuration.md#tags){.internal-link target=_blank}.
-## Zusammenfassung und Beschreibung in der Dokumentation â OpenAPI
+## Zusammenfassung und Beschreibung in der Dokumentation â OpenAPI { #documentation-summary-and-description-openapi }
-Um Ihren *Pfadoperationen* eine Zusammenfassung und Beschreibung hinzuzufÃŧgen und diese in der Oberfläche der Dokumentation anzuzeigen, lesen Sie die Dokumentation unter [Tutorial â Pfadoperation-Konfiguration â Zusammenfassung und Beschreibung](../tutorial/path-operation-configuration.md#zusammenfassung-und-beschreibung){.internal-link target=_blank}.
+Um Ihren *Pfadoperationen* eine Zusammenfassung und Beschreibung hinzuzufÃŧgen und diese in der Oberfläche der Dokumentation anzuzeigen, lesen Sie die Dokumentation unter [Tutorial â Pfadoperation-Konfiguration â Zusammenfassung und Beschreibung](../tutorial/path-operation-configuration.md#summary-and-description){.internal-link target=_blank}.
-## Beschreibung der Response in der Dokumentation â OpenAPI
+## Beschreibung der Response in der Dokumentation â OpenAPI { #documentation-response-description-openapi }
-Um die Beschreibung der Response zu definieren, welche in der Oberfläche der Dokumentation angezeigt wird, lesen Sie die Dokumentation unter [Tutorial â Pfadoperation-Konfiguration â Beschreibung der Response](../tutorial/path-operation-configuration.md#beschreibung-der-response){.internal-link target=_blank}.
+Um die Beschreibung der Response zu definieren, welche in der Oberfläche der Dokumentation angezeigt wird, lesen Sie die Dokumentation unter [Tutorial â Pfadoperation-Konfiguration â Beschreibung der Response](../tutorial/path-operation-configuration.md#response-description){.internal-link target=_blank}.
-## *Pfadoperation* in der Dokumentation deprecaten â OpenAPI
+## *Pfadoperation* in der Dokumentation deprecaten â OpenAPI { #documentation-deprecate-a-path-operation-openapi }
-Um eine *Pfadoperation* zu deprecaten â sie als veraltet zu markieren â und das in der Oberfläche der Dokumentation anzuzeigen, lesen Sie die Dokumentation unter [Tutorial â Pfadoperation-Konfiguration â Deprecaten](../tutorial/path-operation-configuration.md#eine-pfadoperation-deprecaten){.internal-link target=_blank}.
+Um eine *Pfadoperation* zu deprecaten und das in der Oberfläche der Dokumentation anzuzeigen, lesen Sie die Dokumentation unter [Tutorial â Pfadoperation-Konfiguration â Deprecaten](../tutorial/path-operation-configuration.md#deprecate-a-path-operation){.internal-link target=_blank}.
-## Daten in etwas JSON-kompatibles konvertieren
+## Daten in etwas JSON-kompatibles konvertieren { #convert-any-data-to-json-compatible }
Um Daten in etwas JSON-kompatibles zu konvertieren, lesen Sie die Dokumentation unter [Tutorial â JSON-kompatibler Encoder](../tutorial/encoder.md){.internal-link target=_blank}.
-## OpenAPI-Metadaten â Dokumentation
+## OpenAPI-Metadaten â Dokumentation { #openapi-metadata-docs }
-Um Metadaten zu Ihrem OpenAPI-Schema hinzuzufÃŧgen, einschlieÃlich einer Lizenz, Version, Kontakt, usw., lesen Sie die Dokumentation unter [Tutorial â Metadaten und URLs der Dokumentationen](../tutorial/metadata.md){.internal-link target=_blank}.
+Um Metadaten zu Ihrem OpenAPI-Schema hinzuzufÃŧgen, einschlieÃlich einer Lizenz, Version, Kontakt, usw., lesen Sie die Dokumentation unter [Tutorial â Metadaten und URLs der Dokumentation](../tutorial/metadata.md){.internal-link target=_blank}.
-## Benutzerdefinierte OpenAPI-URL
+## Benutzerdefinierte OpenAPI-URL { #openapi-custom-url }
-Um die OpenAPI-URL anzupassen (oder zu entfernen), lesen Sie die Dokumentation unter [Tutorial â Metadaten und URLs der Dokumentationen](../tutorial/metadata.md#openapi-url){.internal-link target=_blank}.
+Um die OpenAPI-URL anzupassen (oder zu entfernen), lesen Sie die Dokumentation unter [Tutorial â Metadaten und URLs der Dokumentation](../tutorial/metadata.md#openapi-url){.internal-link target=_blank}.
-## URLs der OpenAPI-Dokumentationen
+## URLs der OpenAPI-Dokumentationen { #openapi-docs-urls }
-Um die URLs zu aktualisieren, die fÃŧr die automatisch generierten Dokumentations-Oberflächen verwendet werden, lesen Sie die Dokumentation unter [Tutorial â Metadaten und URLs der Dokumentationen](../tutorial/metadata.md#urls-der-dokumentationen){.internal-link target=_blank}.
+Um die URLs zu aktualisieren, die fÃŧr die automatisch generierten Dokumentations-Oberflächen verwendet werden, lesen Sie die Dokumentation unter [Tutorial â Metadaten und URLs der Dokumentation](../tutorial/metadata.md#docs-urls){.internal-link target=_blank}.
diff --git a/docs/de/docs/how-to/graphql.md b/docs/de/docs/how-to/graphql.md
index 4083e66ae..d2958dcd9 100644
--- a/docs/de/docs/how-to/graphql.md
+++ b/docs/de/docs/how-to/graphql.md
@@ -1,4 +1,4 @@
-# GraphQL
+# GraphQL { #graphql }
Da **FastAPI** auf dem **ASGI**-Standard basiert, ist es sehr einfach, jede **GraphQL**-Bibliothek zu integrieren, die auch mit ASGI kompatibel ist.
@@ -10,42 +10,42 @@ Sie kÃļnnen normale FastAPI-*Pfadoperationen* mit GraphQL in derselben Anwendung
Es hat **Vorteile** und **Nachteile** im Vergleich zu gängigen **Web-APIs**.
-Wiegen Sie ab, ob die **Vorteile** fÃŧr Ihren Anwendungsfall die **Nachteile** ausgleichen. đ¤
+Stellen Sie sicher, dass Sie prÃŧfen, ob die **Vorteile** fÃŧr Ihren Anwendungsfall die **Nachteile** ausgleichen. đ¤
///
-## GraphQL-Bibliotheken
+## GraphQL-Bibliotheken { #graphql-libraries }
-Hier sind einige der **GraphQL**-Bibliotheken, welche **ASGI** unterstÃŧtzen. Diese kÃļnnten Sie mit **FastAPI** verwenden:
+Hier sind einige der **GraphQL**-Bibliotheken, die **ASGI**-UnterstÃŧtzung haben. Sie kÃļnnten sie mit **FastAPI** verwenden:
* Strawberry đ
* Mit Dokumentation fÃŧr FastAPI
* Ariadne
* Mit Dokumentation fÃŧr FastAPI
* Tartiflette
- * Mit Tartiflette ASGI, fÃŧr ASGI-Integration
+ * Mit Tartiflette ASGI fÃŧr ASGI-Integration
* Graphene
* Mit starlette-graphene3
-## GraphQL mit Strawberry
+## GraphQL mit Strawberry { #graphql-with-strawberry }
-Wenn Sie mit **GraphQL** arbeiten mÃļchten oder mÃŧssen, ist **Strawberry** die **empfohlene** Bibliothek, da deren Design dem Design von **FastAPI** am nächsten kommt und alles auf **Typannotationen** basiert.
+Wenn Sie mit **GraphQL** arbeiten mÃļchten oder mÃŧssen, ist **Strawberry** die **empfohlene** Bibliothek, da deren Design **FastAPIs** Design am nächsten kommt und alles auf **Typannotationen** basiert.
-Abhängig von Ihrem Anwendungsfall bevorzugen Sie vielleicht eine andere Bibliothek, aber wenn Sie mich fragen wÃŧrden, wÃŧrde ich Ihnen wahrscheinlich empfehlen, **Strawberry** auszuprobieren.
+Abhängig von Ihrem Anwendungsfall kÃļnnten Sie eine andere Bibliothek vorziehen, aber wenn Sie mich fragen wÃŧrden, wÃŧrde ich Ihnen wahrscheinlich empfehlen, **Strawberry** auszuprobieren.
Hier ist eine kleine Vorschau, wie Sie Strawberry mit FastAPI integrieren kÃļnnen:
-{* ../../docs_src/graphql/tutorial001.py hl[3,22,25:26] *}
+{* ../../docs_src/graphql/tutorial001.py hl[3,22,25] *}
Weitere Informationen zu Strawberry finden Sie in der Strawberry-Dokumentation.
-Und auch die Dokumentation zu Strawberry mit FastAPI.
+Und auch in der Dokumentation zu Strawberry mit FastAPI.
-## Ãltere `GraphQLApp` von Starlette
+## Ãltere `GraphQLApp` von Starlette { #older-graphqlapp-from-starlette }
FrÃŧhere Versionen von Starlette enthielten eine `GraphQLApp`-Klasse zur Integration mit Graphene.
-Das wurde von Starlette deprecated, aber wenn Sie Code haben, der das verwendet, kÃļnnen Sie einfach zu starlette-graphene3 **migrieren**, welches denselben Anwendungsfall abdeckt und Ãŧber eine **fast identische Schnittstelle** verfÃŧgt.
+Das wurde von Starlette deprecatet, aber wenn Sie Code haben, der das verwendet, kÃļnnen Sie einfach zu starlette-graphene3 **migrieren**, das denselben Anwendungsfall abdeckt und eine **fast identische Schnittstelle** hat.
/// tip | Tipp
@@ -53,7 +53,7 @@ Wenn Sie GraphQL benÃļtigen, wÃŧrde ich Ihnen trotzdem empfehlen, sich offiziellen GraphQL-Dokumentation.
diff --git a/docs/de/docs/how-to/index.md b/docs/de/docs/how-to/index.md
index 84a178fc8..36229dcd7 100644
--- a/docs/de/docs/how-to/index.md
+++ b/docs/de/docs/how-to/index.md
@@ -1,4 +1,4 @@
-# How-To â Rezepte
+# How-To â Rezepte { #how-to-recipes }
Hier finden Sie verschiedene Rezepte und âHow-Toâ-Anleitungen zu **verschiedenen Themen**.
diff --git a/docs/de/docs/how-to/separate-openapi-schemas.md b/docs/de/docs/how-to/separate-openapi-schemas.md
index 4f6911e79..31653590b 100644
--- a/docs/de/docs/how-to/separate-openapi-schemas.md
+++ b/docs/de/docs/how-to/separate-openapi-schemas.md
@@ -1,18 +1,18 @@
-# Separate OpenAPI-Schemas fÃŧr Eingabe und Ausgabe oder nicht
+# Separate OpenAPI-Schemas fÃŧr Eingabe und Ausgabe oder nicht { #separate-openapi-schemas-for-input-and-output-or-not }
Bei Verwendung von **Pydantic v2** ist die generierte OpenAPI etwas genauer und **korrekter** als zuvor. đ
-Tatsächlich gibt es in einigen Fällen sogar **zwei JSON-Schemas** in OpenAPI fÃŧr dasselbe Pydantic-Modell fÃŧr Eingabe und Ausgabe, je nachdem, ob sie **Defaultwerte** haben.
+Tatsächlich gibt es in einigen Fällen sogar **zwei JSON-Schemas** in OpenAPI fÃŧr dasselbe Pydantic-Modell, fÃŧr Eingabe und Ausgabe, je nachdem, ob sie **Defaultwerte** haben.
Sehen wir uns an, wie das funktioniert und wie Sie es bei Bedarf ändern kÃļnnen.
-## Pydantic-Modelle fÃŧr Eingabe und Ausgabe
+## Pydantic-Modelle fÃŧr Eingabe und Ausgabe { #pydantic-models-for-input-and-output }
Nehmen wir an, Sie haben ein Pydantic-Modell mit Defaultwerten wie dieses:
{* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py ln[1:7] hl[7] *}
-### Modell fÃŧr Eingabe
+### Modell fÃŧr Eingabe { #model-for-input }
Wenn Sie dieses Modell wie hier als Eingabe verwenden:
@@ -20,7 +20,7 @@ Wenn Sie dieses Modell wie hier als Eingabe verwenden:
... dann ist das Feld `description` **nicht erforderlich**. Weil es den Defaultwert `None` hat.
-### Eingabemodell in der Dokumentation
+### Eingabemodell in der Dokumentation { #input-model-in-docs }
Sie kÃļnnen ÃŧberprÃŧfen, dass das Feld `description` in der Dokumentation kein **rotes Sternchen** enthält, es ist nicht als erforderlich markiert:
@@ -28,17 +28,17 @@ Sie kÃļnnen ÃŧberprÃŧfen, dass das Feld `description` in der Dokumentation kein
@@ -55,7 +55,7 @@ Aus diesem Grund kann das JSON-Schema fÃŧr ein Modell unterschiedlich sein, je n
* fÃŧr die **Eingabe** ist `description` **nicht erforderlich**
* fÃŧr die **Ausgabe** ist es **erforderlich** (und mÃļglicherweise `None` oder, in JSON-Begriffen, `null`)
-### Ausgabemodell in der Dokumentation
+### Ausgabemodell in der Dokumentation { #model-for-output-in-docs }
Sie kÃļnnen das Ausgabemodell auch in der Dokumentation ÃŧberprÃŧfen. **Sowohl** `name` **als auch** `description` sind mit einem **roten Sternchen** als **erforderlich** markiert:
@@ -63,7 +63,7 @@ Sie kÃļnnen das Ausgabemodell auch in der Dokumentation ÃŧberprÃŧfen. **Sowohl**
- FastAPI Framework, hochperformant, leicht zu erlernen, schnell zu programmieren, einsatzbereit + FastAPI-Framework, hohe Performanz, leicht zu lernen, schnell zu entwickeln, produktionsreif
-
+
@@ -27,7 +27,7 @@
---
-**Dokumentation**: https://fastapi.tiangolo.com
+**Dokumentation**: https://fastapi.tiangolo.com/de
**Quellcode**: https://github.com/fastapi/fastapi
@@ -37,19 +37,18 @@ FastAPI ist ein modernes, schnelles (hoch performantes) Webframework zur Erstell
Seine SchlÃŧssel-Merkmale sind:
-* **Schnell**: Sehr hohe Leistung, auf AugenhÃļhe mit **NodeJS** und **Go** (Dank Starlette und Pydantic). [Eines der schnellsten verfÃŧgbaren Python-Frameworks](#performanz).
-
-* **Schnell zu programmieren**: ErhÃļhen Sie die Geschwindigkeit bei der Entwicklung von Funktionen um etwa 200 % bis 300 %. *
+* **Schnell**: Sehr hohe Performanz, auf AugenhÃļhe mit **NodeJS** und **Go** (dank Starlette und Pydantic). [Eines der schnellsten verfÃŧgbaren Python-Frameworks](#performance).
+* **Schnell zu entwickeln**: ErhÃļhen Sie die Geschwindigkeit bei der Entwicklung von Features um etwa 200 % bis 300 %. *
* **Weniger Bugs**: Verringern Sie die von Menschen (Entwicklern) verursachten Fehler um etwa 40 %. *
-* **Intuitiv**: Exzellente Editor-UnterstÃŧtzung. Code-Vervollständigung Ãŧberall. Weniger Debuggen.
-* **Einfach**: So konzipiert, dass es einfach zu benutzen und zu erlernen ist. Weniger Zeit fÃŧr das Lesen der Dokumentation.
-* **Kurz**: Minimieren Sie die Verdoppelung von Code. Mehrere Funktionen aus jeder Parameterdeklaration. Weniger Bugs.
+* **Intuitiv**: Hervorragende Editor-UnterstÃŧtzung. Code-Vervollständigung Ãŧberall. Weniger Zeit mit Debuggen verbringen.
+* **Einfach**: So konzipiert, dass es einfach zu benutzen und zu erlernen ist. Weniger Zeit mit dem Lesen von Dokumentation verbringen.
+* **Kurz**: Minimieren Sie die Verdoppelung von Code. Mehrere Features aus jeder Parameterdeklaration. Weniger Bugs.
* **Robust**: Erhalten Sie produktionsreifen Code. Mit automatischer, interaktiver Dokumentation.
* **Standards-basiert**: Basierend auf (und vollständig kompatibel mit) den offenen Standards fÃŧr APIs: OpenAPI (frÃŧher bekannt als Swagger) und JSON Schema.
-* Schätzung auf Basis von Tests in einem internen Entwicklungsteam, das Produktionsanwendungen erstellt.
+* Schätzung basierend auf Tests in einem internen Entwicklungsteam, das Produktionsanwendungen erstellt.
-## Sponsoren
+## Sponsoren { #sponsors }
@@ -64,55 +63,55 @@ Seine SchlÃŧssel-Merkmale sind:
-Andere Sponsoren
+Andere Sponsoren
-## Meinungen
+## Meinungen { #opinions }
-â_[...] Ich verwende **FastAPI** heutzutage sehr oft. [...] Ich habe tatsächlich vor, es fÃŧr alle **ML-Dienste meines Teams bei Microsoft** zu verwenden. Einige davon werden in das Kernprodukt **Windows** und einige **Office**-Produkte integriert._â
+â_[...] Ich verwende **FastAPI** heutzutage sehr oft. [...] Ich habe tatsächlich vor, es fÃŧr alle **ML-Services meines Teams bei Microsoft** zu verwenden. Einige davon werden in das Kernprodukt **Windows** und einige **Office**-Produkte integriert._â
-
uvicorn main:app --reload ...fastapi dev main.py macht ...email-validator - fÃŧr E-Mail-Validierung.
-* pydantic-settings - fÃŧr die Verwaltung von Einstellungen.
-* pydantic-extra-types - fÃŧr zusätzliche Typen, mit Pydantic zu verwenden.
+### `standard`-Abhängigkeiten { #standard-dependencies }
-Wird von Starlette verwendet:
+Wenn Sie FastAPI mit `pip install "fastapi[standard]"` installieren, kommt es mit der `standard`-Gruppe optionaler Abhängigkeiten:
-* httpx - erforderlich, wenn Sie den `TestClient` verwenden mÃļchten.
-* jinja2 - erforderlich, wenn Sie die Standardkonfiguration fÃŧr Templates verwenden mÃļchten.
-* python-multipart - erforderlich, wenn Sie Formulare mittels `request.form()` âparsenâ mÃļchten.
-* itsdangerous - erforderlich fÃŧr `SessionMiddleware` UnterstÃŧtzung.
-* pyyaml - erforderlich fÃŧr Starlette's `SchemaGenerator` UnterstÃŧtzung (Sie brauchen das wahrscheinlich nicht mit FastAPI).
-* ujson - erforderlich, wenn Sie `UJSONResponse` verwenden mÃļchten.
+Verwendet von Pydantic:
-Wird von FastAPI / Starlette verwendet:
+* email-validator â fÃŧr E-Mail-Validierung.
-* uvicorn - fÃŧr den Server, der Ihre Anwendung lädt und serviert.
-* orjson - erforderlich, wenn Sie `ORJSONResponse` verwenden mÃļchten.
+Verwendet von Starlette:
-Sie kÃļnnen diese alle mit `pip install "fastapi[all]"` installieren.
+* httpx â erforderlich, wenn Sie den `TestClient` verwenden mÃļchten.
+* jinja2 â erforderlich, wenn Sie die Default-Template-Konfiguration verwenden mÃļchten.
+* python-multipart â erforderlich, wenn Sie Formulare mittels `request.form()` âparsenâ mÃļchten.
-## Lizenz
+Verwendet von FastAPI:
+
+* uvicorn â fÃŧr den Server, der Ihre Anwendung lädt und bereitstellt. Dies umfasst `uvicorn[standard]`, das einige Abhängigkeiten (z. B. `uvloop`) beinhaltet, die fÃŧr eine Bereitstellung mit hoher Performanz benÃļtigt werden.
+* `fastapi-cli[standard]` â um den `fastapi`-Befehl bereitzustellen.
+ * Dies beinhaltet `fastapi-cloud-cli`, das es Ihnen ermÃļglicht, Ihre FastAPI-Anwendung auf FastAPI Cloud bereitzustellen.
+
+### Ohne `standard`-Abhängigkeiten { #without-standard-dependencies }
+
+Wenn Sie die `standard` optionalen Abhängigkeiten nicht einschlieÃen mÃļchten, kÃļnnen Sie mit `pip install fastapi` statt `pip install "fastapi[standard]"` installieren.
+
+### Ohne `fastapi-cloud-cli` { #without-fastapi-cloud-cli }
+
+Wenn Sie FastAPI mit den Standardabhängigkeiten, aber ohne das `fastapi-cloud-cli` installieren mÃļchten, kÃļnnen Sie mit `pip install "fastapi[standard-no-fastapi-cloud-cli]"` installieren.
+
+### Zusätzliche optionale Abhängigkeiten { #additional-optional-dependencies }
+
+Es gibt einige zusätzliche Abhängigkeiten, die Sie installieren mÃļchten.
+
+Zusätzliche optionale Pydantic-Abhängigkeiten:
+
+* pydantic-settings â fÃŧr die Verwaltung von Einstellungen.
+* pydantic-extra-types â fÃŧr zusätzliche Typen zur Verwendung mit Pydantic.
+
+Zusätzliche optionale FastAPI-Abhängigkeiten:
+
+* orjson â erforderlich, wenn Sie `ORJSONResponse` verwenden mÃļchten.
+* ujson â erforderlich, wenn Sie `UJSONResponse` verwenden mÃļchten.
+
+## Lizenz { #license }
Dieses Projekt ist unter den Bedingungen der MIT-Lizenz lizenziert.
diff --git a/docs/de/docs/learn/index.md b/docs/de/docs/learn/index.md
index b5582f55b..e1f583fb3 100644
--- a/docs/de/docs/learn/index.md
+++ b/docs/de/docs/learn/index.md
@@ -1,5 +1,5 @@
-# Lernen
+# Lernen { #learn }
-Hier finden Sie die einfÃŧhrenden Kapitel und Tutorials zum Erlernen von **FastAPI**.
+Hier sind die einfÃŧhrenden Abschnitte und Tutorials, um **FastAPI** zu lernen.
Sie kÃļnnten dies als **Buch**, als **Kurs**, als **offizielle** und empfohlene Methode zum Erlernen von FastAPI betrachten. đ
diff --git a/docs/de/docs/project-generation.md b/docs/de/docs/project-generation.md
index c47bcb6d3..e6da4949c 100644
--- a/docs/de/docs/project-generation.md
+++ b/docs/de/docs/project-generation.md
@@ -1,84 +1,28 @@
-# Projektgenerierung â Vorlage
+# Full Stack FastAPI Template { #full-stack-fastapi-template }
-Sie kÃļnnen einen Projektgenerator fÃŧr den Einstieg verwenden, welcher einen GroÃteil der Ersteinrichtung, Sicherheit, Datenbank und einige API-Endpunkte bereits fÃŧr Sie erstellt.
+Vorlagen, die normalerweise mit einem bestimmten Setup geliefert werden, sind so konzipiert, dass sie flexibel und anpassbar sind. Dies ermÃļglicht es Ihnen, sie zu ändern und an die Anforderungen Ihres Projekts anzupassen und sie somit zu einem hervorragenden Ausgangspunkt zu machen. đ
-Ein Projektgenerator verfÃŧgt immer Ãŧber ein sehr spezifisches Setup, das Sie aktualisieren und an Ihre eigenen BedÃŧrfnisse anpassen sollten, aber es kÃļnnte ein guter Ausgangspunkt fÃŧr Ihr Projekt sein.
+Sie kÃļnnen diese Vorlage verwenden, um loszulegen, da sie bereits vieles der anfänglichen Einrichtung, Sicherheit, Datenbank und einige API-Endpunkte fÃŧr Sie eingerichtet hat.
-## Full Stack FastAPI PostgreSQL
+GitHub-Repository: Full Stack FastAPI Template
-GitHub: https://github.com/tiangolo/full-stack-fastapi-postgresql
+## Full Stack FastAPI Template â Technologiestack und Funktionen { #full-stack-fastapi-template-technology-stack-and-features }
-### Full Stack FastAPI PostgreSQL â Funktionen
-
-* Vollständige **Docker**-Integration (Docker-basiert).
-* Docker-Schwarmmodus-Deployment.
-* **Docker Compose**-Integration und Optimierung fÃŧr die lokale Entwicklung.
-* **Produktionsbereit** Python-Webserver, verwendet Uvicorn und Gunicorn.
-* Python **FastAPI**-Backend:
- * **Schnell**: Sehr hohe Leistung, auf AugenhÃļhe mit **NodeJS** und **Go** (dank Starlette und Pydantic).
- * **Intuitiv**: Hervorragende Editor-UnterstÃŧtzung. Codevervollständigung Ãŧberall. Weniger Zeitaufwand fÃŧr das Debuggen.
- * **Einfach**: Einfach zu bedienen und zu erlernen. Weniger Zeit fÃŧr das Lesen von Dokumentationen.
- * **Kurz**: Codeverdoppelung minimieren. Mehrere Funktionalitäten aus jeder Parameterdeklaration.
- * **Robust**: Erhalten Sie produktionsbereiten Code. Mit automatischer, interaktiver Dokumentation.
- * **Standards-basiert**: Basierend auf (und vollständig kompatibel mit) den offenen Standards fÃŧr APIs: OpenAPI und JSON Schema.
- * **Viele weitere Funktionen**, einschlieÃlich automatischer Validierung, Serialisierung, interaktiver Dokumentation, Authentifizierung mit OAuth2-JWT-Tokens, usw.
-* **Sicheres Passwort**-Hashing standardmäÃig.
-* **JWT-Token**-Authentifizierung.
-* **SQLAlchemy**-Modelle (unabhängig von Flask-Erweiterungen, sodass sie direkt mit Celery-Workern verwendet werden kÃļnnen).
-* Grundlegende Startmodelle fÃŧr Benutzer (ändern und entfernen Sie nach Bedarf).
-* **Alembic**-Migrationen.
-* **CORS** (Cross Origin Resource Sharing).
-* **Celery**-Worker, welche Modelle und Code aus dem Rest des Backends selektiv importieren und verwenden kÃļnnen.
-* REST-Backend-Tests basierend auf **Pytest**, integriert in Docker, sodass Sie die vollständige API-Interaktion unabhängig von der Datenbank testen kÃļnnen. Da es in Docker ausgefÃŧhrt wird, kann jedes Mal ein neuer Datenspeicher von Grund auf erstellt werden (Sie kÃļnnen also ElasticSearch, MongoDB, CouchDB oder was auch immer Sie mÃļchten verwenden und einfach testen, ob die API funktioniert).
-* Einfache Python-Integration mit **Jupyter-Kerneln** fÃŧr Remote- oder In-Docker-Entwicklung mit Erweiterungen wie Atom Hydrogen oder Visual Studio Code Jupyter.
-* **Vue**-Frontend:
- * Mit Vue CLI generiert.
- * Handhabung der **JWT-Authentifizierung**.
- * Login-View.
- * Nach der Anmeldung Hauptansicht des Dashboards.
- * Haupt-Dashboard mit Benutzererstellung und -bearbeitung.
- * Bearbeitung des eigenen Benutzers.
- * **Vuex**.
- * **Vue-Router**.
- * **Vuetify** fÃŧr schÃļne Material-Designkomponenten.
- * **TypeScript**.
- * Docker-Server basierend auf **Nginx** (konfiguriert, um gut mit Vue-Router zu funktionieren).
- * Mehrstufigen Docker-Erstellung, sodass Sie kompilierten Code nicht speichern oder committen mÃŧssen.
- * Frontend-Tests, welche zur Erstellungszeit ausgefÃŧhrt werden (kÃļnnen auch deaktiviert werden).
- * So modular wie mÃļglich gestaltet, sodass es sofort einsatzbereit ist. Sie kÃļnnen es aber mit Vue CLI neu generieren oder es so wie Sie mÃļchten erstellen und wiederverwenden, was Sie mÃļchten.
-* **PGAdmin** fÃŧr die PostgreSQL-Datenbank, kÃļnnen Sie problemlos ändern, sodass PHPMyAdmin und MySQL verwendet wird.
-* **Flower** fÃŧr die Ãberwachung von Celery-Jobs.
-* Load Balancing zwischen Frontend und Backend mit **Traefik**, sodass Sie beide unter derselben Domain haben kÃļnnen, getrennt durch den Pfad, aber von unterschiedlichen Containern ausgeliefert.
-* Traefik-Integration, einschlieÃlich automatischer Generierung von Let's Encrypt-**HTTPS**-Zertifikaten.
-* GitLab **CI** (kontinuierliche Integration), einschlieÃlich Frontend- und Backend-Testen.
-
-## Full Stack FastAPI Couchbase
-
-GitHub: https://github.com/tiangolo/full-stack-fastapi-couchbase
-
-â ī¸ **WARNUNG** â ī¸
-
-Wenn Sie ein neues Projekt von Grund auf starten, prÃŧfen Sie die Alternativen hier.
-
-Zum Beispiel kÃļnnte der Projektgenerator Full Stack FastAPI PostgreSQL eine bessere Alternative sein, da er aktiv gepflegt und genutzt wird. Und er enthält alle neuen Funktionen und Verbesserungen.
-
-Es steht Ihnen weiterhin frei, den Couchbase-basierten Generator zu verwenden, wenn Sie mÃļchten. Er sollte wahrscheinlich immer noch gut funktionieren, und wenn Sie bereits ein Projekt damit erstellt haben, ist das auch in Ordnung (und Sie haben es wahrscheinlich bereits an Ihre BedÃŧrfnisse angepasst).
-
-Weitere Informationen hierzu finden Sie in der Dokumentation des Repos.
-
-## Full Stack FastAPI MongoDB
-
-... kÃļnnte später kommen, abhängig von meiner verfÃŧgbaren Zeit und anderen Faktoren. đ
đ
-
-## Modelle fÃŧr maschinelles Lernen mit spaCy und FastAPI
-
-GitHub: https://github.com/microsoft/cookiecutter-spacy-fastapi
-
-### Modelle fÃŧr maschinelles Lernen mit spaCy und FastAPI â Funktionen
-
-* **spaCy** NER-Modellintegration.
-* **Azure Cognitive Search**-Anforderungsformat integriert.
-* **Produktionsbereit** Python-Webserver, verwendet Uvicorn und Gunicorn.
-* **Azure DevOps** Kubernetes (AKS) CI/CD-Deployment integriert.
-* **Mehrsprachig** Wählen Sie bei der Projekteinrichtung ganz einfach eine der integrierten Sprachen von spaCy aus.
-* **Einfach erweiterbar** auf andere Modellframeworks (Pytorch, Tensorflow), nicht nur auf SpaCy.
+- ⥠[**FastAPI**](https://fastapi.tiangolo.com/de) fÃŧr die Python-Backend-API.
+ - đ§° [SQLModel](https://sqlmodel.tiangolo.com) fÃŧr die Interaktion mit der Python-SQL-Datenbank (ORM).
+ - đ [Pydantic](https://docs.pydantic.dev), verwendet von FastAPI, fÃŧr die Datenvalidierung und das Einstellungsmanagement.
+ - đž [PostgreSQL](https://www.postgresql.org) als SQL-Datenbank.
+- đ [React](https://react.dev) fÃŧr das Frontend.
+ - đ Verwendung von TypeScript, Hooks, [Vite](https://vitejs.dev) und anderen Teilen eines modernen Frontend-Stacks.
+ - đ¨ [Chakra UI](https://chakra-ui.com) fÃŧr die Frontend-Komponenten.
+ - đ¤ Ein automatisch generierter Frontend-Client.
+ - đ§Ē [Playwright](https://playwright.dev) fÃŧr End-to-End-Tests.
+ - đĻ UnterstÃŧtzung des Dunkelmodus.
+- đ [Docker Compose](https://www.docker.com) fÃŧr Entwicklung und Produktion.
+- đ Sicheres Passwort-Hashing standardmäÃig.
+- đ JWT-Token-Authentifizierung.
+- đĢ E-Mail-basierte Passwortwiederherstellung.
+- â
Tests mit [Pytest](https://pytest.org).
+- đ [Traefik](https://traefik.io) als Reverse-Proxy / Load Balancer.
+- đĸ Deployment-Anleitungen unter Verwendung von Docker Compose, einschlieÃlich der Einrichtung eines Frontend-Traefik-Proxys zur Handhabung automatischer HTTPS-Zertifikate.
+- đ CI (kontinuierliche Integration) und CD (kontinuierliche Bereitstellung) basierend auf GitHub Actions.
diff --git a/docs/de/docs/python-types.md b/docs/de/docs/python-types.md
index 81d43bc5b..317ee4e62 100644
--- a/docs/de/docs/python-types.md
+++ b/docs/de/docs/python-types.md
@@ -1,8 +1,8 @@
-# EinfÃŧhrung in Python-Typen
+# EinfÃŧhrung in Python-Typen { #python-types-intro }
-Python hat UnterstÃŧtzung fÃŧr optionale âTyphinweiseâ (Englisch: âType Hintsâ). Auch âTyp Annotationenâ genannt.
+Python hat UnterstÃŧtzung fÃŧr optionale âTyphinweiseâ (auch âTypannotationenâ genannt).
-Diese **âTyphinweiseâ** oder -Annotationen sind eine spezielle Syntax, die es erlaubt, den Typ einer Variablen zu deklarieren.
+Diese **âTyphinweiseâ** oder -Annotationen sind eine spezielle Syntax, die es erlaubt, den Typ einer Variablen zu deklarieren.
Durch das Deklarieren von Typen fÃŧr Ihre Variablen kÃļnnen Editoren und Tools bessere UnterstÃŧtzung bieten.
@@ -18,7 +18,7 @@ Wenn Sie ein Python-Experte sind und bereits alles Ãŧber Typhinweise wissen, Ãŧb
///
-## Motivation
+## Motivation { #motivation }
Fangen wir mit einem einfachen Beispiel an:
@@ -38,7 +38,7 @@ Die Funktion macht Folgendes:
{* ../../docs_src/python_types/tutorial001.py hl[2] *}
-### Bearbeiten Sie es
+### Es bearbeiten { #edit-it }
Es ist ein sehr einfaches Programm.
@@ -58,7 +58,7 @@ Aber leider erhalten Sie nichts NÃŧtzliches:
-### Typen hinzufÃŧgen
+### Typen hinzufÃŧgen { #add-types }
Lassen Sie uns eine einzelne Zeile aus der vorherigen Version ändern.
@@ -102,7 +102,7 @@ Hier kÃļnnen Sie durch die Optionen blättern, bis Sie diejenige finden, bei der
-## Mehr Motivation
+## Mehr Motivation { #more-motivation }
Sehen Sie sich diese Funktion an, sie hat bereits Typhinweise:
@@ -116,13 +116,13 @@ Jetzt, da Sie wissen, dass Sie das reparieren mÃŧssen, konvertieren Sie `age` mi
{* ../../docs_src/python_types/tutorial004.py hl[2] *}
-## Deklarieren von Typen
+## Deklarieren von Typen { #declaring-types }
Sie haben gerade den Haupt-Einsatzort fÃŧr die Deklaration von Typhinweisen gesehen. Als Funktionsparameter.
Das ist auch meistens, wie sie in **FastAPI** verwendet werden.
-### Einfache Typen
+### Einfache Typen { #simple-types }
Sie kÃļnnen alle Standard-Python-Typen deklarieren, nicht nur `str`.
@@ -135,7 +135,7 @@ Zum Beispiel diese:
{* ../../docs_src/python_types/tutorial005.py hl[1] *}
-### Generische Typen mit Typ-Parametern
+### Generische Typen mit Typ-Parametern { #generic-types-with-type-parameters }
Es gibt Datenstrukturen, die andere Werte enthalten kÃļnnen, wie etwa `dict`, `list`, `set` und `tuple`. Die inneren Werte kÃļnnen auch ihren eigenen Typ haben.
@@ -143,7 +143,7 @@ Diese Typen mit inneren Typen werden â**generische**â Typen genannt. Es ist
Um diese Typen und die inneren Typen zu deklarieren, kÃļnnen Sie Pythons Standardmodul `typing` verwenden. Es existiert speziell fÃŧr die UnterstÃŧtzung dieser Typhinweise.
-#### Neuere Python-Versionen
+#### Neuere Python-Versionen { #newer-versions-of-python }
Die Syntax, welche `typing` verwendet, ist **kompatibel** mit allen Versionen, von Python 3.6 aufwärts zu den neuesten, inklusive Python 3.9, Python 3.10, usw.
@@ -157,7 +157,7 @@ Zum Beispiel bedeutet â**Python 3.6+**â, dass das Beispiel kompatibel mit Py
Wenn Sie Ãŧber die **neueste Version von Python** verfÃŧgen, verwenden Sie die Beispiele fÃŧr die neueste Version, diese werden die **beste und einfachste Syntax** haben, zum Beispiel, â**Python 3.10+**â.
-#### Liste
+#### Liste { #list }
Definieren wir zum Beispiel eine Variable, die eine `list` von `str` â eine Liste von Strings â sein soll.
@@ -195,7 +195,7 @@ Da die Liste ein Typ ist, welcher innere Typen enthält, werden diese von eckige
////
-/// tip | Tipp
+/// info | Info
Die inneren Typen in den eckigen Klammern werden als âTyp-Parameterâ bezeichnet.
@@ -221,7 +221,7 @@ Beachten Sie, dass die Variable `item` eines der Elemente in der Liste `items` i
Und trotzdem weià der Editor, dass es sich um ein `str` handelt, und bietet entsprechende UnterstÃŧtzung.
-#### Tupel und Menge
+#### Tupel und Menge { #tuple-and-set }
Das Gleiche gilt fÃŧr die Deklaration eines Tupels â `tuple` â und einer Menge â `set`:
@@ -246,7 +246,7 @@ Das bedeutet:
* Die Variable `items_t` ist ein `tuple` mit 3 Elementen, einem `int`, einem weiteren `int` und einem `str`.
* Die Variable `items_s` ist ein `set`, und jedes seiner Elemente ist vom Typ `bytes`.
-#### Dict
+#### Dict { #dict }
Um ein `dict` zu definieren, Ãŧbergeben Sie zwei Typ-Parameter, getrennt durch Kommas.
@@ -276,7 +276,7 @@ Das bedeutet:
* Die SchlÃŧssel dieses `dict` sind vom Typ `str` (z. B. die Namen der einzelnen Artikel).
* Die Werte dieses `dict` sind vom Typ `float` (z. B. der Preis jedes Artikels).
-#### Union
+#### Union { #union }
Sie kÃļnnen deklarieren, dass eine Variable einer von **verschiedenen Typen** sein kann, zum Beispiel ein `int` oder ein `str`.
@@ -302,13 +302,15 @@ In Python 3.10 gibt es zusätzlich eine **neue Syntax**, die es erlaubt, die mÃļ
In beiden Fällen bedeutet das, dass `item` ein `int` oder ein `str` sein kann.
-#### Vielleicht `None`
+#### Vielleicht `None` { #possibly-none }
Sie kÃļnnen deklarieren, dass ein Wert ein `str`, aber vielleicht auch `None` sein kann.
In Python 3.6 und darÃŧber (inklusive Python 3.10) kÃļnnen Sie das deklarieren, indem Sie `Optional` vom `typing` Modul importieren und verwenden.
-{* ../../docs_src/python_types/tutorial009.py hl[1,4] *}
+```Python hl_lines="1 4"
+{!../../docs_src/python_types/tutorial009.py!}
+```
Wenn Sie `Optional[str]` anstelle von nur `str` verwenden, wird Ihr Editor Ihnen dabei helfen, Fehler zu erkennen, bei denen Sie annehmen kÃļnnten, dass ein Wert immer eine String (`str`) ist, obwohl er auch `None` sein kÃļnnte.
@@ -340,7 +342,7 @@ Das bedeutet auch, dass Sie in Python 3.10 `Something | None` verwenden kÃļnnen:
////
-#### `Union` oder `Optional` verwenden?
+#### `Union` oder `Optional` verwenden? { #using-union-or-optional }
Wenn Sie eine Python-Version unterhalb 3.10 verwenden, hier ist mein sehr **subjektiver** Standpunkt dazu:
@@ -366,7 +368,7 @@ say_hi() # Oh, nein, das lÃļst einen Fehler aus! đą
Der `name` Parameter wird **immer noch benÃļtigt** (nicht *optional*), weil er keinen Default-Wert hat. `name` akzeptiert aber dennoch `None` als Wert:
```Python
-say_hi(name=None) # Das funktioniert, None is gÃŧltig đ
+say_hi(name=None) # Das funktioniert, None ist gÃŧltig đ
```
Die gute Nachricht ist, dass Sie sich darÃŧber keine Sorgen mehr machen mÃŧssen, wenn Sie Python 3.10 verwenden, da Sie einfach `|` verwenden kÃļnnen, um Vereinigungen von Typen zu definieren:
@@ -375,7 +377,7 @@ Die gute Nachricht ist, dass Sie sich darÃŧber keine Sorgen mehr machen mÃŧssen,
Und dann mÃŧssen Sie sich nicht mehr um Namen wie `Optional` und `Union` kÃŧmmern. đ
-#### Generische Typen
+#### Generische Typen { #generic-types }
Diese Typen, die Typ-Parameter in eckigen Klammern akzeptieren, werden **generische Typen** oder **Generics** genannt.
@@ -427,7 +429,7 @@ Verwenden Sie fÃŧr den Rest, wie unter Python 3.8, das `typing`-Modul:
////
-### Klassen als Typen
+### Klassen als Typen { #classes-as-types }
Sie kÃļnnen auch eine Klasse als Typ einer Variablen deklarieren.
@@ -447,9 +449,9 @@ Beachten Sie, das bedeutet: â`one_person` ist eine **Instanz** der Klasse `Per
Es bedeutet nicht: â`one_person` ist die **Klasse** genannt `Person`â.
-## Pydantic Modelle
+## Pydantic-Modelle { #pydantic-models }
-Pydantic ist eine Python-Bibliothek fÃŧr die Validierung von Daten.
+Pydantic ist eine Python-Bibliothek fÃŧr die Validierung von Daten.
Sie deklarieren die âFormâ der Daten als Klassen mit Attributen.
@@ -485,25 +487,25 @@ Ein Beispiel aus der offiziellen Pydantic Dokumentation:
////
-/// info
+/// info | Info
-Um mehr Ãŧber Pydantic zu erfahren, schauen Sie sich dessen Dokumentation an.
+Um mehr Ãŧber Pydantic zu erfahren, schauen Sie sich dessen Dokumentation an.
///
**FastAPI** basiert vollständig auf Pydantic.
-Viel mehr von all dem werden Sie in praktischer Anwendung im [Tutorial - Benutzerhandbuch](tutorial/index.md){.internal-link target=_blank} sehen.
+Viel mehr von all dem werden Sie in praktischer Anwendung im [Tutorial â Benutzerhandbuch](tutorial/index.md){.internal-link target=_blank} sehen.
/// tip | Tipp
-Pydantic verhält sich speziell, wenn Sie `Optional` oder `Union[Etwas, None]` ohne einen Default-Wert verwenden. Sie kÃļnnen darÃŧber in der Pydantic Dokumentation unter Required fields mehr erfahren.
+Pydantic verhält sich speziell, wenn Sie `Optional` oder `Union[Something, None]` ohne einen Defaultwert verwenden. Sie kÃļnnen darÃŧber in der Pydantic Dokumentation unter Erforderliche optionale Felder mehr erfahren.
///
-## Typhinweise mit Metadaten-Annotationen
+## Typhinweise mit Metadaten-Annotationen { #type-hints-with-metadata-annotations }
-Python bietet auch die MÃļglichkeit, **zusätzliche Metadaten** in Typhinweisen unterzubringen, mittels `Annotated`.
+Python bietet auch die MÃļglichkeit, **zusätzliche Metadaten** in Typhinweisen unterzubringen, mittels `Annotated`.
//// tab | Python 3.9+
@@ -529,7 +531,7 @@ Es wird bereits mit **FastAPI** installiert sein.
Python selbst macht nichts mit `Annotated`. FÃŧr Editoren und andere Tools ist der Typ immer noch `str`.
-Aber Sie kÃļnnen `Annotated` nutzen, um **FastAPI** mit Metadaten zu versorgen, die ihm sagen, wie sich ihre Anwendung verhalten soll.
+Aber Sie kÃļnnen `Annotated` nutzen, um **FastAPI** mit Metadaten zu versorgen, die ihm sagen, wie sich Ihre Anwendung verhalten soll.
Wichtig ist, dass **der erste *Typ-Parameter***, den Sie `Annotated` Ãŧbergeben, der **tatsächliche Typ** ist. Der Rest sind Metadaten fÃŧr andere Tools.
@@ -539,13 +541,13 @@ Später werden Sie sehen, wie **mächtig** es sein kann.
/// tip | Tipp
-Der Umstand, dass es **Standard-Python** ist, bedeutet, dass Sie immer noch die **bestmÃļgliche Entwickler-Erfahrung** in ihrem Editor haben, sowie mit den Tools, die Sie nutzen, um ihren Code zu analysieren, zu refaktorisieren, usw. â¨
+Der Umstand, dass es **Standard-Python** ist, bedeutet, dass Sie immer noch die **bestmÃļgliche Entwickler-Erfahrung** in Ihrem Editor haben, sowie mit den Tools, die Sie nutzen, um Ihren Code zu analysieren, zu refaktorisieren, usw. â¨
Und ebenfalls, dass Ihr Code sehr kompatibel mit vielen anderen Python-Tools und -Bibliotheken sein wird. đ
///
-## Typhinweise in **FastAPI**
+## Typhinweise in **FastAPI** { #type-hints-in-fastapi }
**FastAPI** macht sich diese Typhinweise zunutze, um mehrere Dinge zu tun.
@@ -556,18 +558,18 @@ Mit **FastAPI** deklarieren Sie Parameter mit Typhinweisen, und Sie erhalten:
... und **FastAPI** verwendet dieselben Deklarationen, um:
-* **Anforderungen** zu definieren: aus Anfrage-Pfadparametern, Abfrageparametern, Header-Feldern, Bodys, Abhängigkeiten, usw.
-* **Daten umzuwandeln**: aus der Anfrage in den erforderlichen Typ.
-* **Daten zu validieren**: aus jeder Anfrage:
+* **Anforderungen** zu definieren: aus Request-Pfadparametern, Query-Parametern, Header-Feldern, Bodys, Abhängigkeiten, usw.
+* **Daten umzuwandeln**: aus dem Request in den erforderlichen Typ.
+* **Daten zu validieren**: aus jedem Request:
* **Automatische Fehler** generieren, die an den Client zurÃŧckgegeben werden, wenn die Daten ungÃŧltig sind.
* Die API mit OpenAPI zu **dokumentieren**:
* Die dann von den Benutzeroberflächen der automatisch generierten interaktiven Dokumentation verwendet wird.
-Das mag alles abstrakt klingen. Machen Sie sich keine Sorgen. Sie werden all das in Aktion sehen im [Tutorial - Benutzerhandbuch](tutorial/index.md){.internal-link target=_blank}.
+Das mag alles abstrakt klingen. Machen Sie sich keine Sorgen. Sie werden all das in Aktion sehen im [Tutorial â Benutzerhandbuch](tutorial/index.md){.internal-link target=_blank}.
Das Wichtigste ist, dass **FastAPI** durch die Verwendung von Standard-Python-Typen an einer einzigen Stelle (anstatt weitere Klassen, Dekoratoren usw. hinzuzufÃŧgen) einen GroÃteil der Arbeit fÃŧr Sie erledigt.
-/// info
+/// info | Info
Wenn Sie bereits das ganze Tutorial durchgearbeitet haben und mehr Ãŧber Typen erfahren wollen, dann ist eine gute Ressource der âCheat Sheetâ von `mypy`.
diff --git a/docs/de/docs/resources/index.md b/docs/de/docs/resources/index.md
index abf270d9f..2c5046c73 100644
--- a/docs/de/docs/resources/index.md
+++ b/docs/de/docs/resources/index.md
@@ -1,3 +1,3 @@
-# Ressourcen
+# Ressourcen { #resources }
Zusätzliche Ressourcen, externe Links, Artikel und mehr. âī¸
diff --git a/docs/de/docs/tutorial/background-tasks.md b/docs/de/docs/tutorial/background-tasks.md
index 05779e12c..ea85207ce 100644
--- a/docs/de/docs/tutorial/background-tasks.md
+++ b/docs/de/docs/tutorial/background-tasks.md
@@ -1,8 +1,8 @@
-# Hintergrundtasks
+# Hintergrundtasks { #background-tasks }
-Sie kÃļnnen Hintergrundtasks (Hintergrund-Aufgaben) definieren, die *nach* der RÃŧckgabe einer Response ausgefÃŧhrt werden sollen.
+Sie kÃļnnen Hintergrundtasks definieren, die *nach* der RÃŧckgabe einer Response ausgefÃŧhrt werden sollen.
-Das ist nÃŧtzlich fÃŧr Vorgänge, die nach einem Request ausgefÃŧhrt werden mÃŧssen, bei denen der Client jedoch nicht unbedingt auf den Abschluss des Vorgangs warten muss, bevor er die Response erhält.
+Das ist nÃŧtzlich fÃŧr Vorgänge, die nach einem Request ausgefÃŧhrt werden mÃŧssen, bei denen der Client jedoch nicht unbedingt auf den Abschluss des Vorgangs warten muss, bevor er die Response erhält.
Hierzu zählen beispielsweise:
@@ -11,7 +11,7 @@ Hierzu zählen beispielsweise:
* Daten verarbeiten:
* Angenommen, Sie erhalten eine Datei, die einen langsamen Prozess durchlaufen muss. Sie kÃļnnen als Response âAcceptedâ (HTTP 202) zurÃŧckgeben und die Datei im Hintergrund verarbeiten.
-## `BackgroundTasks` verwenden
+## `BackgroundTasks` verwenden { #using-backgroundtasks }
Importieren Sie zunächst `BackgroundTasks` und definieren Sie einen Parameter in Ihrer *Pfadoperation-Funktion* mit der Typdeklaration `BackgroundTasks`:
@@ -19,7 +19,7 @@ Importieren Sie zunächst `BackgroundTasks` und definieren Sie einen Parameter i
**FastAPI** erstellt fÃŧr Sie das Objekt vom Typ `BackgroundTasks` und Ãŧbergibt es als diesen Parameter.
-## Eine Taskfunktion erstellen
+## Eine Taskfunktion erstellen { #create-a-task-function }
Erstellen Sie eine Funktion, die als Hintergrundtask ausgefÃŧhrt werden soll.
@@ -33,7 +33,7 @@ Und da der Schreibvorgang nicht `async` und `await` verwendet, definieren wir di
{* ../../docs_src/background_tasks/tutorial001.py hl[6:9] *}
-## Den Hintergrundtask hinzufÃŧgen
+## Den Hintergrundtask hinzufÃŧgen { #add-the-background-task }
Ãbergeben Sie innerhalb Ihrer *Pfadoperation-Funktion* Ihre Taskfunktion mit der Methode `.add_task()` an das *Hintergrundtasks*-Objekt:
@@ -45,21 +45,23 @@ Und da der Schreibvorgang nicht `async` und `await` verwendet, definieren wir di
* Eine beliebige Folge von Argumenten, die der Reihe nach an die Taskfunktion Ãŧbergeben werden sollen (`email`).
* Alle SchlÃŧsselwort-Argumente, die an die Taskfunktion Ãŧbergeben werden sollen (`message="some notification"`).
-## Dependency Injection
+## Dependency Injection { #dependency-injection }
Die Verwendung von `BackgroundTasks` funktioniert auch mit dem Dependency Injection System. Sie kÃļnnen einen Parameter vom Typ `BackgroundTasks` auf mehreren Ebenen deklarieren: in einer *Pfadoperation-Funktion*, in einer Abhängigkeit (Dependable), in einer Unterabhängigkeit usw.
**FastAPI** weiÃ, was jeweils zu tun ist und wie dasselbe Objekt wiederverwendet werden kann, sodass alle Hintergrundtasks zusammengefÃŧhrt und anschlieÃend im Hintergrund ausgefÃŧhrt werden:
+
{* ../../docs_src/background_tasks/tutorial002_an_py310.py hl[13,15,22,25] *}
+
In obigem Beispiel werden die Nachrichten, *nachdem* die Response gesendet wurde, in die Datei `log.txt` geschrieben.
Wenn im Request ein Query-Parameter enthalten war, wird dieser in einem Hintergrundtask in das Log geschrieben.
Und dann schreibt ein weiterer Hintergrundtask, der in der *Pfadoperation-Funktion* erstellt wird, eine Nachricht unter Verwendung des Pfad-Parameters `email`.
-## Technische Details
+## Technische Details { #technical-details }
Die Klasse `BackgroundTasks` stammt direkt von `starlette.background`.
@@ -69,16 +71,16 @@ Indem Sie nur `BackgroundTasks` (und nicht `BackgroundTask`) verwenden, ist es d
Es ist immer noch mÃļglich, `BackgroundTask` allein in FastAPI zu verwenden, aber Sie mÃŧssen das Objekt in Ihrem Code erstellen und eine Starlette-`Response` zurÃŧckgeben, die es enthält.
-Weitere Details finden Sie in der offiziellen Starlette-Dokumentation fÃŧr Hintergrundtasks.
+Weitere Details finden Sie in Starlettes offizieller Dokumentation fÃŧr Hintergrundtasks.
-## Vorbehalt
+## Vorbehalt { #caveat }
Wenn Sie umfangreiche Hintergrundberechnungen durchfÃŧhren mÃŧssen und diese nicht unbedingt vom selben Prozess ausgefÃŧhrt werden mÃŧssen (z. B. mÃŧssen Sie Speicher, Variablen, usw. nicht gemeinsam nutzen), kÃļnnte die Verwendung anderer grÃļÃerer Tools wie z. B. Celery von Vorteil sein.
Sie erfordern in der Regel komplexere Konfigurationen und einen Nachrichten-/Job-Queue-Manager wie RabbitMQ oder Redis, ermÃļglichen Ihnen jedoch die AusfÃŧhrung von Hintergrundtasks in mehreren Prozessen und insbesondere auf mehreren Servern.
-Wenn Sie jedoch Ãŧber dieselbe **FastAPI**-Anwendung auf Variablen und Objekte zugreifen oder kleine Hintergrundtasks ausfÃŧhren mÃŧssen (z. B. das Senden einer E-Mail-Benachrichtigung), kÃļnnen Sie einfach `BackgroundTasks` verwenden.
+Wenn Sie jedoch Ãŧber dieselbe **FastAPI**-App auf Variablen und Objekte zugreifen oder kleine Hintergrundtasks ausfÃŧhren mÃŧssen (z. B. das Senden einer E-Mail-Benachrichtigung), kÃļnnen Sie einfach `BackgroundTasks` verwenden.
-## Zusammenfassung
+## Zusammenfassung { #recap }
Importieren und verwenden Sie `BackgroundTasks` mit Parametern in *Pfadoperation-Funktionen* und Abhängigkeiten, um Hintergrundtasks hinzuzufÃŧgen.
diff --git a/docs/de/docs/tutorial/bigger-applications.md b/docs/de/docs/tutorial/bigger-applications.md
index 514e3fd3a..928d50adf 100644
--- a/docs/de/docs/tutorial/bigger-applications.md
+++ b/docs/de/docs/tutorial/bigger-applications.md
@@ -1,16 +1,16 @@
-# GrÃļÃere Anwendungen â mehrere Dateien
+# GrÃļÃere Anwendungen â mehrere Dateien { #bigger-applications-multiple-files }
Wenn Sie eine Anwendung oder eine Web-API erstellen, ist es selten der Fall, dass Sie alles in einer einzigen Datei unterbringen kÃļnnen.
**FastAPI** bietet ein praktisches Werkzeug zur Strukturierung Ihrer Anwendung bei gleichzeitiger Wahrung der Flexibilität.
-/// info
+/// info | Info
Wenn Sie von Flask kommen, wäre dies das Ãquivalent zu Flasks Blueprints.
///
-## Eine Beispiel-Dateistruktur
+## Eine Beispiel-Dateistruktur { #an-example-file-structure }
Nehmen wir an, Sie haben eine Dateistruktur wie diese:
@@ -71,7 +71,7 @@ Die gleiche Dateistruktur mit Kommentaren:
â  âââ admin.py # âadminâ-Submodul, z. B. import app.internal.admin
```
-## `APIRouter`
+## `APIRouter` { #apirouter }
Nehmen wir an, die Datei, die nur fÃŧr die Verwaltung von Benutzern zuständig ist, ist das Submodul unter `/app/routers/users.py`.
@@ -81,7 +81,7 @@ Aber es ist immer noch Teil derselben **FastAPI**-Anwendung/Web-API (es ist Teil
Sie kÃļnnen die *Pfadoperationen* fÃŧr dieses Modul mit `APIRouter` erstellen.
-### `APIRouter` importieren
+### `APIRouter` importieren { #import-apirouter }
Sie importieren ihn und erstellen eine âInstanzâ auf die gleiche Weise wie mit der Klasse `FastAPI`:
@@ -89,7 +89,7 @@ Sie importieren ihn und erstellen eine âInstanzâ auf die gleiche Weise wie m
{!../../docs_src/bigger_applications/app/routers/users.py!}
```
-### *Pfadoperationen* mit `APIRouter`
+### *Pfadoperationen* mit `APIRouter` { #path-operations-with-apirouter }
Und dann verwenden Sie ihn, um Ihre *Pfadoperationen* zu deklarieren.
@@ -113,7 +113,7 @@ In diesem Beispiel heiÃt die Variable `router`, aber Sie kÃļnnen ihr einen beli
Wir werden diesen `APIRouter` in die Hauptanwendung `FastAPI` einbinden, aber zuerst kÃŧmmern wir uns um die Abhängigkeiten und einen anderen `APIRouter`.
-## Abhängigkeiten
+## Abhängigkeiten { #dependencies }
Wir sehen, dass wir einige Abhängigkeiten benÃļtigen, die an mehreren Stellen der Anwendung verwendet werden.
@@ -159,7 +159,7 @@ Aber in der Praxis werden Sie mit den integrierten [Sicherheits-Werkzeugen](secu
///
-## Ein weiteres Modul mit `APIRouter`.
+## Ein weiteres Modul mit `APIRouter` { #another-module-with-apirouter }
Nehmen wir an, Sie haben im Modul unter `app/routers/items.py` auch die Endpunkte, die fÃŧr die Verarbeitung von Artikeln (âItemsâ) aus Ihrer Anwendung vorgesehen sind.
@@ -199,7 +199,7 @@ Das Präfix lautet in diesem Fall also `/items`.
Wir kÃļnnen auch eine Liste von `tags` und zusätzliche `responses` hinzufÃŧgen, die auf alle in diesem Router enthaltenen *Pfadoperationen* angewendet werden.
-Und wir kÃļnnen eine Liste von `dependencies` hinzufÃŧgen, die allen *Pfadoperationen* im Router hinzugefÃŧgt und fÃŧr jeden an sie gerichteten Request ausgefÃŧhrt/aufgelÃļst werden.
+Und wir kÃļnnen eine Liste von `dependencies` hinzufÃŧgen, die allen *Pfadoperationen* im Router hinzugefÃŧgt und fÃŧr jeden an sie gerichteten Request ausgefÃŧhrt/aufgelÃļst werden.
/// tip | Tipp
@@ -228,13 +228,13 @@ Das Endergebnis ist, dass die Pfade fÃŧr diese Artikel jetzt wie folgt lauten:
///
-/// check
+/// check | Testen
Die Parameter `prefix`, `tags`, `responses` und `dependencies` sind (wie in vielen anderen Fällen) nur ein Feature von **FastAPI**, um Ihnen dabei zu helfen, Codeverdoppelung zu vermeiden.
///
-### Die Abhängigkeiten importieren
+### Die Abhängigkeiten importieren { #import-the-dependencies }
Der folgende Code befindet sich im Modul `app.routers.items`, also in der Datei `app/routers/items.py`.
@@ -246,7 +246,7 @@ Daher verwenden wir einen relativen Import mit `..` fÃŧr die Abhängigkeiten:
{!../../docs_src/bigger_applications/app/routers/items.py!}
```
-#### Wie relative Importe funktionieren
+#### Wie relative Importe funktionieren { #how-relative-imports-work }
/// tip | Tipp
@@ -309,7 +309,7 @@ Das wÃŧrde sich auf ein Paket oberhalb von `app/` beziehen, mit seiner eigenen D
Aber jetzt wissen Sie, wie es funktioniert, sodass Sie relative Importe in Ihren eigenen Anwendungen verwenden kÃļnnen, egal wie komplex diese sind. đ¤
-### Einige benutzerdefinierte `tags`, `responses`, und `dependencies` hinzufÃŧgen
+### Einige benutzerdefinierte `tags`, `responses`, und `dependencies` hinzufÃŧgen { #add-some-custom-tags-responses-and-dependencies }
Wir fÃŧgen weder das Präfix `/items` noch `tags=["items"]` zu jeder *Pfadoperation* hinzu, da wir sie zum `APIRouter` hinzugefÃŧgt haben.
@@ -323,21 +323,21 @@ Aber wir kÃļnnen immer noch _mehr_ `tags` hinzufÃŧgen, die auf eine bestimmte *P
Diese letzte Pfadoperation wird eine Kombination von Tags haben: `["items", "custom"]`.
-Und sie wird auch beide Responses in der Dokumentation haben, eine fÃŧr `404` und eine fÃŧr `403`.
+Und sie wird auch beide Responses in der Dokumentation haben, eine fÃŧr `404` und eine fÃŧr `403`.
///
-## Das Haupt-`FastAPI`.
+## Das Haupt-`FastAPI` { #the-main-fastapi }
Sehen wir uns nun das Modul unter `app/main.py` an.
Hier importieren und verwenden Sie die Klasse `FastAPI`.
-Dies ist die Hauptdatei Ihrer Anwendung, die alles zusammen bindet.
+Dies ist die Hauptdatei Ihrer Anwendung, die alles zusammenfÃŧgt.
Und da sich der GroÃteil Ihrer Logik jetzt in seinem eigenen spezifischen Modul befindet, wird die Hauptdatei recht einfach sein.
-### `FastAPI` importieren
+### `FastAPI` importieren { #import-fastapi }
Sie importieren und erstellen wie gewohnt eine `FastAPI`-Klasse.
@@ -347,7 +347,7 @@ Und wir kÃļnnen sogar [globale Abhängigkeiten](dependencies/global-dependencies
{!../../docs_src/bigger_applications/app/main.py!}
```
-### Den `APIRouter` importieren
+### Den `APIRouter` importieren { #import-the-apirouter }
Jetzt importieren wir die anderen Submodule, die `APIRouter` haben:
@@ -357,7 +357,7 @@ Jetzt importieren wir die anderen Submodule, die `APIRouter` haben:
Da es sich bei den Dateien `app/routers/users.py` und `app/routers/items.py` um Submodule handelt, die Teil desselben Python-Packages `app` sind, kÃļnnen wir einen einzelnen Punkt `.` verwenden, um sie mit ârelativen Importsâ zu importieren.
-### Wie das Importieren funktioniert
+### Wie das Importieren funktioniert { #how-the-importing-works }
Die Sektion:
@@ -381,7 +381,7 @@ Wir kÃļnnten sie auch wie folgt importieren:
from app.routers import items, users
```
-/// info
+/// info | Info
Die erste Version ist ein ârelativer Importâ:
@@ -399,7 +399,7 @@ Um mehr Ãŧber Python-Packages und -Module zu erfahren, lesen Sie
```console
-$ uvicorn app.main:app --reload
+$ fastapi dev app/main.py
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
@@ -538,7 +537,7 @@ Sie sehen die automatische API-Dokumentation, einschlieÃlich der Pfade aller Su
-## Den gleichen Router mehrmals mit unterschiedlichem `prefix` inkludieren
+## Den gleichen Router mehrmals mit unterschiedlichem `prefix` inkludieren { #include-the-same-router-multiple-times-with-different-prefix }
Sie kÃļnnen `.include_router()` auch mehrmals mit *demselben* Router und unterschiedlichen Präfixen verwenden.
@@ -546,7 +545,7 @@ Dies kÃļnnte beispielsweise nÃŧtzlich sein, um dieselbe API unter verschiedenen
Dies ist eine fortgeschrittene Verwendung, die Sie mÃļglicherweise nicht wirklich benÃļtigen, aber fÃŧr den Fall, dass Sie sie benÃļtigen, ist sie vorhanden.
-## Einen `APIRouter` in einen anderen einfÃŧgen
+## Einen `APIRouter` in einen anderen einfÃŧgen { #include-an-apirouter-in-another }
Auf die gleiche Weise, wie Sie einen `APIRouter` in eine `FastAPI`-Anwendung einbinden kÃļnnen, kÃļnnen Sie einen `APIRouter` in einen anderen `APIRouter` einbinden, indem Sie Folgendes verwenden:
diff --git a/docs/de/docs/tutorial/body-fields.md b/docs/de/docs/tutorial/body-fields.md
index 9fddfb1f0..b73d57d2d 100644
--- a/docs/de/docs/tutorial/body-fields.md
+++ b/docs/de/docs/tutorial/body-fields.md
@@ -1,8 +1,8 @@
-# Body â Felder
+# Body â Felder { #body-fields }
-So wie Sie zusätzliche Validation und Metadaten in Parametern der **Pfadoperation-Funktion** mittels `Query`, `Path` und `Body` deklarieren, kÃļnnen Sie auch innerhalb von Pydantic-Modellen zusätzliche Validation und Metadaten deklarieren, mittels Pydantics `Field`.
+So wie Sie zusätzliche Validierung und Metadaten in Parametern der *Pfadoperation-Funktion* mittels `Query`, `Path` und `Body` deklarieren, kÃļnnen Sie auch innerhalb von Pydantic-Modellen zusätzliche Validierung und Metadaten deklarieren, mittels Pydantics `Field`.
-## `Field` importieren
+## `Field` importieren { #import-field }
Importieren Sie es zuerst:
@@ -14,7 +14,7 @@ Beachten Sie, dass `Field` direkt von `pydantic` importiert wird, nicht von `fas
///
-## Modellattribute deklarieren
+## Modellattribute deklarieren { #declare-model-attributes }
Dann kÃļnnen Sie `Field` mit Modellattributen deklarieren:
@@ -24,23 +24,23 @@ Dann kÃļnnen Sie `Field` mit Modellattributen deklarieren:
/// note | Technische Details
-Tatsächlich erstellen `Query`, `Path` und andere, die sie kennenlernen werden, Instanzen von Unterklassen einer allgemeinen Klasse `Param`, die ihrerseits eine Unterklasse von Pydantics `FieldInfo`-Klasse ist.
+Tatsächlich erstellen `Query`, `Path` und andere, die Sie als nächstes sehen werden, Instanzen von Unterklassen einer allgemeinen Klasse `Param`, welche selbst eine Unterklasse von Pydantics `FieldInfo`-Klasse ist.
Und Pydantics `Field` gibt ebenfalls eine Instanz von `FieldInfo` zurÃŧck.
-`Body` gibt auch Instanzen einer Unterklasse von `FieldInfo` zurÃŧck. Und später werden Sie andere sehen, die Unterklassen der `Body`-Klasse sind.
+`Body` gibt auch direkt Instanzen einer Unterklasse von `FieldInfo` zurÃŧck. Später werden Sie andere sehen, die Unterklassen der `Body`-Klasse sind.
-Denken Sie daran, dass `Query`, `Path` und andere von `fastapi` tatsächlich Funktionen sind, die spezielle Klassen zurÃŧckgeben.
+Denken Sie daran, dass `Query`, `Path` und andere, wenn Sie sie von `fastapi` importieren, tatsächlich Funktionen sind, die spezielle Klassen zurÃŧckgeben.
///
/// tip | Tipp
-Beachten Sie, dass jedes Modellattribut mit einem Typ, Defaultwert und `Field` die gleiche Struktur hat wie ein Parameter einer Pfadoperation-Funktion, nur mit `Field` statt `Path`, `Query`, `Body`.
+Beachten Sie, wie jedes Attribut eines Modells mit einem Typ, Defaultwert und `Field` die gleiche Struktur hat wie ein Parameter einer *Pfadoperation-Funktion*, nur mit `Field` statt `Path`, `Query`, `Body`.
///
-## Zusätzliche Information hinzufÃŧgen
+## Zusätzliche Information hinzufÃŧgen { #add-extra-information }
Sie kÃļnnen zusätzliche Information in `Field`, `Query`, `Body`, usw. deklarieren. Und es wird im generierten JSON-Schema untergebracht.
@@ -48,12 +48,12 @@ Sie werden später mehr darÃŧber lernen, wie man zusätzliche Information unterb
/// warning | Achtung
-Extra-SchlÃŧssel, die `Field` Ãŧberreicht werden, werden auch im resultierenden OpenAPI-Schema Ihrer Anwendung gelistet. Da diese SchlÃŧssel nicht notwendigerweise Teil der OpenAPI-Spezifikation sind, kÃļnnten einige OpenAPI-Tools, wie etwa [der OpenAPI-Validator](https://validator.swagger.io/), nicht mit Ihrem generierten Schema funktionieren.
+Extra-SchlÃŧssel, die `Field` Ãŧberreicht werden, werden auch im resultierenden OpenAPI-Schema Ihrer Anwendung gelistet. Da diese SchlÃŧssel mÃļglicherweise nicht Teil der OpenAPI-Spezifikation sind, kÃļnnten einige OpenAPI-Tools, wie etwa [der OpenAPI-Validator](https://validator.swagger.io/), nicht mit Ihrem generierten Schema funktionieren.
///
-## Zusammenfassung
+## Zusammenfassung { #recap }
Sie kÃļnnen Pydantics `Field` verwenden, um zusätzliche Validierungen und Metadaten fÃŧr Modellattribute zu deklarieren.
-Sie kÃļnnen auch Extra-SchlÃŧssel verwenden, um zusätzliche JSON-Schema-Metadaten zu Ãŧberreichen.
+Sie kÃļnnen auch die zusätzlichen SchlÃŧsselwortargumente verwenden, um zusätzliche JSON-Schema-Metadaten zu Ãŧbergeben.
diff --git a/docs/de/docs/tutorial/body-multiple-params.md b/docs/de/docs/tutorial/body-multiple-params.md
index 8a9978d34..3b5fa52dd 100644
--- a/docs/de/docs/tutorial/body-multiple-params.md
+++ b/docs/de/docs/tutorial/body-multiple-params.md
@@ -1,8 +1,8 @@
-# Body â Mehrere Parameter
+# Body â Mehrere Parameter { #body-multiple-parameters }
-Jetzt, da wir gesehen haben, wie `Path` und `Query` verwendet werden, schauen wir uns fortgeschrittenere VerwendungsmÃļglichkeiten von Requestbody-Deklarationen an.
+Nun, da wir gesehen haben, wie `Path` und `Query` verwendet werden, schauen wir uns fortgeschrittenere VerwendungsmÃļglichkeiten von Requestbody-Deklarationen an.
-## `Path`-, `Query`- und Body-Parameter vermischen
+## `Path`-, `Query`- und Body-Parameter vermischen { #mix-path-query-and-body-parameters }
Zuerst einmal, Sie kÃļnnen `Path`-, `Query`- und Requestbody-Parameter-Deklarationen frei mischen und **FastAPI** wird wissen, was zu tun ist.
@@ -16,9 +16,9 @@ Beachten Sie, dass in diesem Fall das `item`, welches vom Body genommen wird, op
///
-## Mehrere Body-Parameter
+## Mehrere Body-Parameter { #multiple-body-parameters }
-Im vorherigen Beispiel erwartete die *Pfadoperation* einen JSON-Body mit den Attributen eines `Item`s, etwa:
+Im vorherigen Beispiel erwarteten die *Pfadoperationen* einen JSON-Body mit den Attributen eines `Item`s, etwa:
```JSON
{
@@ -35,7 +35,7 @@ Aber Sie kÃļnnen auch mehrere Body-Parameter deklarieren, z. B. `item` und `user
In diesem Fall wird **FastAPI** bemerken, dass es mehr als einen Body-Parameter in der Funktion gibt (zwei Parameter, die Pydantic-Modelle sind).
-Es wird deshalb die Parameternamen als SchlÃŧssel (Feldnamen) im Body verwenden, und erwartet einen Body wie folgt:
+Es wird deshalb die Parameternamen als SchlÃŧssel (Feldnamen) im Body verwenden und erwartet einen Body wie folgt:
```JSON
{
@@ -58,17 +58,17 @@ Beachten Sie, dass, obwohl `item` wie zuvor deklariert wurde, es nun unter einem
///
-**FastAPI** wird die automatische Konvertierung des Requests Ãŧbernehmen, sodass der Parameter `item` seinen spezifischen Inhalt bekommt, genau so wie der Parameter `user`.
+**FastAPI** wird die automatische Konvertierung des Requests Ãŧbernehmen, sodass der Parameter `item` seinen spezifischen Inhalt bekommt, und das Gleiche gilt fÃŧr den Parameter `user`.
-Es wird die Validierung dieser zusammengesetzten Daten Ãŧbernehmen, und sie im OpenAPI-Schema und der automatischen Dokumentation dokumentieren.
+Es wird die Validierung dieser zusammengesetzten Daten Ãŧbernehmen, und diese im OpenAPI-Schema und der automatischen Dokumentation dokumentieren.
-## Einzelne Werte im Body
+## Einzelne Werte im Body { #singular-values-in-body }
-So wie `Query` und `Path` fÃŧr Query- und Pfad-Parameter, hat **FastAPI** auch das Ãquivalent `Body`, um Extra-Daten fÃŧr Body-Parameter zu definieren.
+So wie `Query` und `Path` fÃŧr Query- und Pfad-Parameter, stellt **FastAPI** das Ãquivalent `Body` zur VerfÃŧgung, um Extra-Daten fÃŧr Body-Parameter zu definieren.
-Zum Beispiel, das vorherige Modell erweiternd, kÃļnnten Sie entscheiden, dass Sie einen weiteren SchlÃŧssel `importance` haben mÃļchten, im selben Body, Seite an Seite mit `item` und `user`.
+Zum Beispiel, das vorherige Modell erweiternd, kÃļnnten Sie entscheiden, dass Sie einen weiteren SchlÃŧssel `importance` im selben Body haben mÃļchten, neben `item` und `user`.
-Wenn Sie diesen Parameter einfach so hinzufÃŧgen, wird **FastAPI** annehmen, dass es ein Query-Parameter ist.
+Wenn Sie diesen Parameter einfach so hinzufÃŧgen, wird **FastAPI** annehmen, dass es ein Query-Parameter ist, da er ein einzelner Wert ist.
Aber Sie kÃļnnen **FastAPI** instruieren, ihn als weiteren Body-SchlÃŧssel zu erkennen, indem Sie `Body` verwenden:
@@ -92,9 +92,9 @@ In diesem Fall erwartet **FastAPI** einen Body wie:
}
```
-Wiederum wird es die Daten konvertieren, validieren, dokumentieren, usw.
+Wiederum wird es die Datentypen konvertieren, validieren, dokumentieren, usw.
-## Mehrere Body-Parameter und Query-Parameter
+## Mehrere Body-Parameter und Query-Parameter { #multiple-body-params-and-query }
NatÃŧrlich kÃļnnen Sie auch, wann immer Sie das brauchen, weitere Query-Parameter hinzufÃŧgen, zusätzlich zu den Body-Parametern.
@@ -112,21 +112,21 @@ q: str | None = None
Zum Beispiel:
-{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[27] *}
+{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
-/// info
+/// info | Info
-`Body` hat die gleichen zusätzlichen Validierungs- und Metadaten-Parameter wie `Query` und `Path` und andere, die Sie später kennenlernen.
+`Body` hat die gleichen zusätzlichen Validierungs- und Metadaten-Parameter wie `Query`, `Path` und andere, die Sie später kennenlernen werden.
///
-## Einen einzelnen Body-Parameter einbetten
+## Einen einzelnen Body-Parameter einbetten { #embed-a-single-body-parameter }
-Nehmen wir an, Sie haben nur einen einzelnen `item`-Body-Parameter, ein Pydantic-Modell `Item`.
+Nehmen wir an, Sie haben nur einen einzelnen `item`-Body-Parameter von einem Pydantic-Modell `Item`.
-Normalerweise wird **FastAPI** dann seinen JSON-Body direkt erwarten.
+StandardmäÃig wird **FastAPI** dann seinen Body direkt erwarten.
-Aber wenn Sie mÃļchten, dass es einen JSON-Body erwartet, mit einem SchlÃŧssel `item` und darin den Inhalt des Modells, so wie es das tut, wenn Sie mehrere Body-Parameter deklarieren, dann kÃļnnen Sie den speziellen `Body`-Parameter `embed` setzen:
+Aber wenn Sie mÃļchten, dass es einen JSON-Body mit einem SchlÃŧssel `item` erwartet, und darin den Inhalt des Modells, so wie es das tut, wenn Sie mehrere Body-Parameter deklarieren, dann kÃļnnen Sie den speziellen `Body`-Parameter `embed` setzen:
```Python
item: Item = Body(embed=True)
@@ -160,11 +160,11 @@ statt:
}
```
-## Zusammenfassung
+## Zusammenfassung { #recap }
-Sie kÃļnnen mehrere Body-Parameter zu ihrer *Pfadoperation-Funktion* hinzufÃŧgen, obwohl ein Request nur einen einzigen Body enthalten kann.
+Sie kÃļnnen mehrere Body-Parameter zu Ihrer *Pfadoperation-Funktion* hinzufÃŧgen, obwohl ein Request nur einen einzigen Body enthalten kann.
-**FastAPI** wird sich darum kÃŧmmern, Ihnen korrekte Daten in Ihrer Funktion zu Ãŧberreichen, und das korrekte Schema in der *Pfadoperation* zu validieren und zu dokumentieren.
+Aber **FastAPI** wird sich darum kÃŧmmern, Ihnen korrekte Daten in Ihrer Funktion zu Ãŧberreichen, und das korrekte Schema in der *Pfadoperation* zu validieren und zu dokumentieren.
Sie kÃļnnen auch einzelne Werte deklarieren, die als Teil des Bodys empfangen werden.
diff --git a/docs/de/docs/tutorial/body-nested-models.md b/docs/de/docs/tutorial/body-nested-models.md
index 6287490c6..324d31928 100644
--- a/docs/de/docs/tutorial/body-nested-models.md
+++ b/docs/de/docs/tutorial/body-nested-models.md
@@ -1,20 +1,20 @@
-# Body â Verschachtelte Modelle
+# Body â Verschachtelte Modelle { #body-nested-models }
-Mit **FastAPI** kÃļnnen Sie (dank Pydantic) beliebig tief verschachtelte Modelle definieren, validieren und dokumentieren.
+Mit **FastAPI** kÃļnnen Sie (dank Pydantic) beliebig tief verschachtelte Modelle definieren, validieren, dokumentieren und verwenden.
-## Listen als Felder
+## Listen als Felder { #list-fields }
-Sie kÃļnnen ein Attribut als Kindtyp definieren, zum Beispiel eine Python-`list`e.
+Sie kÃļnnen ein Attribut als Kindtyp definieren, zum Beispiel eine Python-`list`.
{* ../../docs_src/body_nested_models/tutorial001_py310.py hl[12] *}
Das bewirkt, dass `tags` eine Liste ist, wenngleich es nichts Ãŧber den Typ der Elemente der Liste aussagt.
-## Listen mit Typ-Parametern als Felder
+## Listen mit Typ-Parametern als Felder { #list-fields-with-type-parameter }
Aber Python erlaubt es, Listen mit inneren Typen, auch âTyp-Parameterâ genannt, zu deklarieren.
-### `List` von `typing` importieren
+### `List` von `typing` importieren { #import-typings-list }
In Python 3.9 oder darÃŧber kÃļnnen Sie einfach `list` verwenden, um diese Typannotationen zu deklarieren, wie wir unten sehen werden. đĄ
@@ -22,7 +22,7 @@ In Python-Versionen vor 3.9 (3.6 und darÃŧber), mÃŧssen Sie zuerst `List` von Py
{* ../../docs_src/body_nested_models/tutorial002.py hl[1] *}
-### Eine `list`e mit einem Typ-Parameter deklarieren
+### Eine `list` mit einem Typ-Parameter deklarieren { #declare-a-list-with-a-type-parameter }
Um Typen wie `list`, `dict`, `tuple` mit inneren Typ-Parametern (inneren Typen) zu deklarieren:
@@ -51,7 +51,7 @@ In unserem Beispiel kÃļnnen wir also bewirken, dass `tags` spezifisch eine âLi
{* ../../docs_src/body_nested_models/tutorial002_py310.py hl[12] *}
-## Set-Typen
+## Set-Typen { #set-types }
Aber dann denken wir darÃŧber nach und stellen fest, dass sich die Tags nicht wiederholen sollen, es sollen eindeutige Strings sein.
@@ -61,13 +61,13 @@ Deklarieren wir also `tags` als Set von Strings.
{* ../../docs_src/body_nested_models/tutorial003_py310.py hl[12] *}
-Jetzt, selbst wenn Sie einen Request mit duplizierten Daten erhalten, werden diese zu einem Set eindeutiger Dinge konvertiert.
+Jetzt, selbst wenn Sie einen Request mit duplizierten Daten erhalten, werden diese zu einem Set eindeutiger Dinge konvertiert.
Und wann immer Sie diese Daten ausgeben, selbst wenn die Quelle Duplikate hatte, wird es als Set von eindeutigen Dingen ausgegeben.
Und es wird entsprechend annotiert/dokumentiert.
-## Verschachtelte Modelle
+## Verschachtelte Modelle { #nested-models }
Jedes Attribut eines Pydantic-Modells hat einen Typ.
@@ -77,19 +77,19 @@ Sie kÃļnnen also tief verschachtelte JSON-âObjekteâ deklarieren, mit spezifi
Alles das beliebig tief verschachtelt.
-### Ein Kindmodell definieren
+### Ein Kindmodell definieren { #define-a-submodel }
-Wir kÃļnnen zum Beispiel ein `Image`-Modell definieren.
+FÃŧr ein Beispiel kÃļnnen wir ein `Image`-Modell definieren.
{* ../../docs_src/body_nested_models/tutorial004_py310.py hl[7:9] *}
-### Das Kindmodell als Typ verwenden
+### Das Kindmodell als Typ verwenden { #use-the-submodel-as-a-type }
-Und dann kÃļnnen wir es als Typ eines Attributes verwenden.
+Und dann kÃļnnen wir es als Typ eines Attributes verwenden:
{* ../../docs_src/body_nested_models/tutorial004_py310.py hl[18] *}
-Das wÃŧrde bedeuten, dass **FastAPI** einen Body erwartet wie:
+Das wÃŧrde bedeuten, dass **FastAPI** einen Body wie folgt erwartet:
```JSON
{
@@ -112,25 +112,25 @@ Wiederum, nur mit dieser Deklaration erhalten Sie von **FastAPI**:
* Datenvalidierung
* Automatische Dokumentation
-## Spezielle Typen und Validierungen
+## Spezielle Typen und Validierungen { #special-types-and-validation }
-Abgesehen von normalen einfachen Typen, wie `str`, `int`, `float`, usw. kÃļnnen Sie komplexere einfache Typen verwenden, die von `str` erben.
+Abgesehen von normalen einfachen Typen wie `str`, `int`, `float`, usw. kÃļnnen Sie komplexere einfache Typen verwenden, die von `str` erben.
-Um alle Optionen kennenzulernen, die Sie haben, schauen Sie sich Pydantics TypÃŧbersicht an. Sie werden im nächsten Kapitel ein paar Beispiele kennenlernen.
+Um alle Optionen kennenzulernen, die Sie haben, schauen Sie sich Pydantics TypÃŧbersicht an. Sie werden einige Beispiele im nächsten Kapitel kennenlernen.
-Da wir zum Beispiel im `Image`-Modell ein Feld `url` haben, kÃļnnen wir deklarieren, dass das eine Instanz von Pydantics `HttpUrl` sein soll, anstelle eines `str`:
+Zum Beispiel, da wir im `Image`-Modell ein Feld `url` haben, kÃļnnen wir deklarieren, dass das eine Instanz von Pydantics `HttpUrl` sein soll, anstelle eines `str`:
{* ../../docs_src/body_nested_models/tutorial005_py310.py hl[2,8] *}
Es wird getestet, ob der String eine gÃŧltige URL ist, und als solche wird er in JSON Schema / OpenAPI dokumentiert.
-## Attribute mit Listen von Kindmodellen
+## Attribute mit Listen von Kindmodellen { #attributes-with-lists-of-submodels }
Sie kÃļnnen Pydantic-Modelle auch als Typen innerhalb von `list`, `set`, usw. verwenden:
{* ../../docs_src/body_nested_models/tutorial006_py310.py hl[18] *}
-Das wird einen JSON-Body erwarten (konvertieren, validieren, dokumentieren), wie:
+Das wird einen JSON-Body erwarten (konvertieren, validieren, dokumentieren, usw.) wie:
```JSON hl_lines="11"
{
@@ -156,27 +156,27 @@ Das wird einen JSON-Body erwarten (konvertieren, validieren, dokumentieren), wie
}
```
-/// info
+/// info | Info
Beachten Sie, dass der `images`-SchlÃŧssel jetzt eine Liste von Bild-Objekten hat.
///
-## Tief verschachtelte Modelle
+## Tief verschachtelte Modelle { #deeply-nested-models }
Sie kÃļnnen beliebig tief verschachtelte Modelle definieren:
{* ../../docs_src/body_nested_models/tutorial007_py310.py hl[7,12,18,21,25] *}
-/// info
+/// info | Info
-Beachten Sie, wie `Offer` eine Liste von `Item`s hat, von denen jedes seinerseits eine optionale Liste von `Image`s hat.
+Beachten Sie, wie `Offer` eine Liste von `Item`s hat, die ihrerseits eine optionale Liste von `Image`s haben.
///
-## Bodys aus reinen Listen
+## Bodys aus reinen Listen { #bodies-of-pure-lists }
-Wenn Sie mÃļchten, dass das äuÃerste Element des JSON-Bodys ein JSON-`array` (eine Python-`list`e) ist, kÃļnnen Sie den Typ im Funktionsparameter deklarieren, mit der gleichen Syntax wie in Pydantic-Modellen:
+Wenn das äuÃerste Element des JSON-Bodys, das Sie erwarten, ein JSON-`array` (eine Python-`list`) ist, kÃļnnen Sie den Typ im Funktionsparameter deklarieren, mit der gleichen Syntax wie in Pydantic-Modellen:
```Python
images: List[Image]
@@ -192,7 +192,7 @@ so wie in:
{* ../../docs_src/body_nested_models/tutorial008_py39.py hl[13] *}
-## Editor-UnterstÃŧtzung Ãŧberall
+## Editor-UnterstÃŧtzung Ãŧberall { #editor-support-everywhere }
Und Sie erhalten Editor-UnterstÃŧtzung Ãŧberall.
@@ -204,11 +204,11 @@ Sie wÃŧrden diese Editor-UnterstÃŧtzung nicht erhalten, wenn Sie direkt mit `dic
Aber Sie mÃŧssen sich auch nicht weiter um die Modelle kÃŧmmern, hereinkommende Dicts werden automatisch in sie konvertiert. Und was Sie zurÃŧckgeben, wird automatisch nach JSON konvertiert.
-## Bodys mit beliebigen `dict`s
+## Bodys mit beliebigen `dict`s { #bodies-of-arbitrary-dicts }
Sie kÃļnnen einen Body auch als `dict` deklarieren, mit SchlÃŧsseln eines Typs und Werten eines anderen Typs.
-So brauchen Sie vorher nicht zu wissen, wie die Feld-/Attribut-Namen lauten (wie es bei Pydantic-Modellen der Fall wäre).
+So brauchen Sie vorher nicht zu wissen, wie die Feld-/Attributnamen lauten (wie es bei Pydantic-Modellen der Fall wäre).
Das ist nÃŧtzlich, wenn Sie SchlÃŧssel empfangen, deren Namen Sie nicht bereits kennen.
@@ -218,7 +218,7 @@ Ein anderer nÃŧtzlicher Anwendungsfall ist, wenn Sie SchlÃŧssel eines anderen Ty
Das schauen wir uns mal an.
-Im folgenden Beispiel akzeptieren Sie irgendein `dict`, solange es `int`-SchlÃŧssel und `float`-Werte hat.
+Im folgenden Beispiel akzeptieren Sie irgendein `dict`, solange es `int`-SchlÃŧssel und `float`-Werte hat:
{* ../../docs_src/body_nested_models/tutorial009_py39.py hl[7] *}
@@ -230,11 +230,11 @@ Aber Pydantic hat automatische Datenkonvertierung.
Das bedeutet, dass Ihre API-Clients nur Strings senden kÃļnnen, aber solange diese Strings nur Zahlen enthalten, wird Pydantic sie konvertieren und validieren.
-Und das `dict` welches Sie als `weights` erhalten, wird `int`-SchlÃŧssel und `float`-Werte haben.
+Und das `dict`, welches Sie als `weights` erhalten, wird `int`-SchlÃŧssel und `float`-Werte haben.
///
-## Zusammenfassung
+## Zusammenfassung { #recap }
Mit **FastAPI** haben Sie die maximale Flexibilität von Pydantic-Modellen, während Ihr Code einfach, kurz und elegant bleibt.
diff --git a/docs/de/docs/tutorial/body-updates.md b/docs/de/docs/tutorial/body-updates.md
index 574016c58..aa62199fe 100644
--- a/docs/de/docs/tutorial/body-updates.md
+++ b/docs/de/docs/tutorial/body-updates.md
@@ -1,16 +1,16 @@
-# Body â Aktualisierungen
+# Body â Aktualisierungen { #body-updates }
-## Ersetzendes Aktualisieren mit `PUT`
+## Ersetzendes Aktualisieren mit `PUT` { #update-replacing-with-put }
Um einen Artikel zu aktualisieren, kÃļnnen Sie die HTTP `PUT` Operation verwenden.
-Sie kÃļnnen den `jsonable_encoder` verwenden, um die empfangenen Daten in etwas zu konvertieren, das als JSON gespeichert werden kann (in z. B. einer NoSQL-Datenbank). Zum Beispiel, um ein `datetime` in einen `str` zu konvertieren.
+Sie kÃļnnen den `jsonable_encoder` verwenden, um die empfangenen Daten in etwas zu konvertieren, das als JSON gespeichert werden kann (z. B. in einer NoSQL-Datenbank). Zum Beispiel, um ein `datetime` in einen `str` zu konvertieren.
{* ../../docs_src/body_updates/tutorial001_py310.py hl[28:33] *}
`PUT` wird verwendet, um Daten zu empfangen, die die existierenden Daten ersetzen sollen.
-### Warnung bezÃŧglich des Ersetzens
+### Warnung bezÃŧglich des Ersetzens { #warning-about-replacing }
Das bedeutet, dass, wenn Sie den Artikel `bar` aktualisieren wollen, mittels `PUT` und folgendem Body:
@@ -22,15 +22,15 @@ Das bedeutet, dass, wenn Sie den Artikel `bar` aktualisieren wollen, mittels `PU
}
```
-das Eingabemodell nun den Defaultwert `"tax": 10.5` hat, weil Sie das bereits gespeicherte Attribut `"tax": 20.2` nicht mit Ãŧbergeben haben.
+weil das bereits gespeicherte Attribut `"tax": 20.2` nicht enthalten ist, das Eingabemodell den Defaultwert `"tax": 10.5` erhalten wÃŧrde.
-Die Daten werden darum mit einem âneuenâ `tax`-Wert von `10.5` abgespeichert.
+Und die Daten wÃŧrden mit diesem âneuenâ `tax` von `10.5` gespeichert werden.
-## Teilweises Ersetzen mit `PATCH`
+## Teil-Aktualisierungen mit `PATCH` { #partial-updates-with-patch }
Sie kÃļnnen auch die HTTP `PATCH` Operation verwenden, um Daten *teilweise* zu ersetzen.
-Das bedeutet, sie senden nur die Daten, die Sie aktualisieren wollen, der Rest bleibt unverändert.
+Das bedeutet, Sie senden nur die Daten, die Sie aktualisieren wollen, der Rest bleibt unverändert.
/// note | Hinweis
@@ -44,33 +44,33 @@ Aber dieser Leitfaden zeigt Ihnen mehr oder weniger, wie die beiden normalerweis
///
-### Pydantics `exclude_unset`-Parameter verwenden
+### Pydantics `exclude_unset`-Parameter verwenden { #using-pydantics-exclude-unset-parameter }
Wenn Sie Teil-Aktualisierungen entgegennehmen, ist der `exclude_unset`-Parameter in der `.model_dump()`-Methode von Pydantic-Modellen sehr nÃŧtzlich.
Wie in `item.model_dump(exclude_unset=True)`.
-/// info
+/// info | Info
-In Pydantic v1 hieà diese Methode `.dict()`, in Pydantic v2 wurde sie deprecated (aber immer noch unterstÃŧtzt) und in `.model_dump()` umbenannt.
+In Pydantic v1 hieà diese Methode `.dict()`, in Pydantic v2 wurde sie deprecatet (aber immer noch unterstÃŧtzt) und in `.model_dump()` umbenannt.
Die Beispiele hier verwenden `.dict()` fÃŧr die Kompatibilität mit Pydantic v1, Sie sollten jedoch stattdessen `.model_dump()` verwenden, wenn Sie Pydantic v2 verwenden kÃļnnen.
///
-Das wird ein `dict` erstellen, mit nur den Daten, die gesetzt wurden als das `item`-Modell erstellt wurde, Defaultwerte ausgeschlossen.
+Das wird ein `dict` erstellen, mit nur den Daten, die gesetzt wurden, als das `item`-Modell erstellt wurde, Defaultwerte ausgeschlossen.
-Sie kÃļnnen das verwenden, um ein `dict` zu erstellen, das nur die (im Request) gesendeten Daten enthält, ohne Defaultwerte:
+Sie kÃļnnen das verwenden, um ein `dict` zu erstellen, das nur die (im Request) gesendeten Daten enthält, ohne Defaultwerte:
{* ../../docs_src/body_updates/tutorial002_py310.py hl[32] *}
-### Pydantics `update`-Parameter verwenden
+### Pydantics `update`-Parameter verwenden { #using-pydantics-update-parameter }
Jetzt kÃļnnen Sie eine Kopie des existierenden Modells mittels `.model_copy()` erstellen, wobei Sie dem `update`-Parameter ein `dict` mit den zu ändernden Daten Ãŧbergeben.
-/// info
+/// info | Info
-In Pydantic v1 hieà diese Methode `.copy()`, in Pydantic v2 wurde sie deprecated (aber immer noch unterstÃŧtzt) und in `.model_copy()` umbenannt.
+In Pydantic v1 hieà diese Methode `.copy()`, in Pydantic v2 wurde sie deprecatet (aber immer noch unterstÃŧtzt) und in `.model_copy()` umbenannt.
Die Beispiele hier verwenden `.copy()` fÃŧr die Kompatibilität mit Pydantic v1, Sie sollten jedoch stattdessen `.model_copy()` verwenden, wenn Sie Pydantic v2 verwenden kÃļnnen.
@@ -80,9 +80,9 @@ Wie in `stored_item_model.model_copy(update=update_data)`:
{* ../../docs_src/body_updates/tutorial002_py310.py hl[33] *}
-### Rekapitulation zum teilweisen Ersetzen
+### Rekapitulation zu Teil-Aktualisierungen { #partial-updates-recap }
-Zusammengefasst, um Teil-Ersetzungen vorzunehmen:
+Zusammengefasst, um Teil-Aktualisierungen vorzunehmen:
* (Optional) verwenden Sie `PATCH` statt `PUT`.
* Lesen Sie die bereits gespeicherten Daten aus.
@@ -90,7 +90,7 @@ Zusammengefasst, um Teil-Ersetzungen vorzunehmen:
* Erzeugen Sie aus dem empfangenen Modell ein `dict` ohne Defaultwerte (mittels `exclude_unset`).
* So ersetzen Sie nur die tatsächlich vom Benutzer gesetzten Werte, statt dass bereits gespeicherte Werte mit Defaultwerten des Modells Ãŧberschrieben werden.
* Erzeugen Sie eine Kopie ihres gespeicherten Modells, wobei Sie die Attribute mit den empfangenen Teil-Ersetzungen aktualisieren (mittels des `update`-Parameters).
-* Konvertieren Sie das kopierte Modell zu etwas, das in ihrer Datenbank gespeichert werden kann (indem Sie beispielsweise `jsonable_encoder` verwenden).
+* Konvertieren Sie das kopierte Modell zu etwas, das in Ihrer Datenbank gespeichert werden kann (indem Sie beispielsweise `jsonable_encoder` verwenden).
* Das ist vergleichbar dazu, die `.model_dump()`-Methode des Modells erneut aufzurufen, aber es wird sicherstellen, dass die Werte zu Daten konvertiert werden, die ihrerseits zu JSON konvertiert werden kÃļnnen, zum Beispiel `datetime` zu `str`.
* Speichern Sie die Daten in Ihrer Datenbank.
* Geben Sie das aktualisierte Modell zurÃŧck.
diff --git a/docs/de/docs/tutorial/body.md b/docs/de/docs/tutorial/body.md
index e25323786..1e6382b6f 100644
--- a/docs/de/docs/tutorial/body.md
+++ b/docs/de/docs/tutorial/body.md
@@ -1,40 +1,40 @@
-# Requestbody
+# Requestbody { #request-body }
-Wenn Sie Daten von einem Client (sagen wir, einem Browser) zu Ihrer API senden, dann senden Sie diese als einen **Requestbody** (Deutsch: AnfragekÃļrper).
+Wenn Sie Daten von einem Client (sagen wir, einem Browser) zu Ihrer API senden mÃŧssen, senden Sie sie als **Requestbody**.
-Ein **Request**body sind Daten, die vom Client zu Ihrer API gesendet werden. Ein **Response**body (Deutsch: AntwortkÃļrper) sind Daten, die Ihre API zum Client sendet.
+Ein **Request**body sind Daten, die vom Client zu Ihrer API gesendet werden. Ein **Response**body sind Daten, die Ihre API zum Client sendet.
-Ihre API sendet fast immer einen **Response**body. Aber Clients senden nicht unbedingt immer **Request**bodys (sondern nur Metadaten).
+Ihre API muss fast immer einen **Response**body senden. Aber Clients mÃŧssen nicht unbedingt immer **Requestbodys** senden, manchmal fordern sie nur einen Pfad an, vielleicht mit einigen Query-Parametern, aber senden keinen Body.
-Um einen **Request**body zu deklarieren, verwenden Sie Pydantic-Modelle mit allen deren Fähigkeiten und VorzÃŧgen.
+Um einen **Request**body zu deklarieren, verwenden Sie Pydantic-Modelle mit all deren Fähigkeiten und VorzÃŧgen.
-/// info
+/// info | Info
-Um Daten zu versenden, sollten Sie eines von: `POST` (meistverwendet), `PUT`, `DELETE` oder `PATCH` verwenden.
+Um Daten zu senden, sollten Sie eines von: `POST` (meistverwendet), `PUT`, `DELETE` oder `PATCH` verwenden.
-Senden Sie einen Body mit einem `GET`-Request, dann fÃŧhrt das laut Spezifikation zu undefiniertem Verhalten. Trotzdem wird es von FastAPI unterstÃŧtzt, fÃŧr sehr komplexe/extreme Anwendungsfälle.
+Das Senden eines Bodys mit einem `GET`-Request hat ein undefiniertes Verhalten in den Spezifikationen, wird aber dennoch von FastAPI unterstÃŧtzt, nur fÃŧr sehr komplexe/extreme Anwendungsfälle.
-Da aber davon abgeraten wird, zeigt die interaktive Dokumentation mit Swagger-Benutzeroberfläche die Dokumentation fÃŧr den Body auch nicht an, wenn `GET` verwendet wird. Dazwischengeschaltete Proxys unterstÃŧtzen es mÃļglicherweise auch nicht.
+Da davon abgeraten wird, zeigt die interaktive Dokumentation mit Swagger-Benutzeroberfläche die Dokumentation fÃŧr den Body nicht an, wenn `GET` verwendet wird, und zwischengeschaltete Proxys unterstÃŧtzen es mÃļglicherweise nicht.
///
-## Importieren Sie Pydantics `BaseModel`
+## Pydantics `BaseModel` importieren { #import-pydantics-basemodel }
Zuerst mÃŧssen Sie `BaseModel` von `pydantic` importieren:
{* ../../docs_src/body/tutorial001_py310.py hl[2] *}
-## Erstellen Sie Ihr Datenmodell
+## Ihr Datenmodell erstellen { #create-your-data-model }
Dann deklarieren Sie Ihr Datenmodell als eine Klasse, die von `BaseModel` erbt.
-Verwenden Sie Standard-Python-Typen fÃŧr die Klassenattribute:
+Verwenden Sie Standard-Python-Typen fÃŧr alle Attribute:
{* ../../docs_src/body/tutorial001_py310.py hl[5:9] *}
-Wie auch bei Query-Parametern gilt, wenn ein Modellattribut einen Defaultwert hat, ist das Attribut nicht erforderlich. Ansonsten ist es erforderlich. Verwenden Sie `None`, um es als optional zu kennzeichnen.
+Wie auch bei der Deklaration von Query-Parametern gilt: Wenn ein Modellattribut einen Defaultwert hat, ist das Attribut nicht erforderlich. Andernfalls ist es erforderlich. Verwenden Sie `None`, um es einfach optional zu machen.
-Zum Beispiel deklariert das obige Modell ein JSON "`object`" (oder Python-`dict`) wie dieses:
+Zum Beispiel deklariert das obige Modell ein JSON â`object`â (oder Python-`dict`) wie dieses:
```JSON
{
@@ -45,7 +45,7 @@ Zum Beispiel deklariert das obige Modell ein JSON "`object`" (oder Python-`dict`
}
```
-Da `description` und `tax` optional sind (mit `None` als Defaultwert), wäre folgendes JSON "`object`" auch gÃŧltig:
+Da `description` und `tax` optional sind (mit `None` als Defaultwert), wäre folgendes JSON â`object`â auch gÃŧltig:
```JSON
{
@@ -54,109 +54,120 @@ Da `description` und `tax` optional sind (mit `None` als Defaultwert), wäre fol
}
```
-## Deklarieren Sie es als Parameter
+## Als Parameter deklarieren { #declare-it-as-a-parameter }
Um es zu Ihrer *Pfadoperation* hinzuzufÃŧgen, deklarieren Sie es auf die gleiche Weise, wie Sie Pfad- und Query-Parameter deklariert haben:
{* ../../docs_src/body/tutorial001_py310.py hl[16] *}
-... und deklarieren Sie seinen Typ als das Modell, welches Sie erstellt haben, `Item`.
+... und deklarieren Sie dessen Typ als das Modell, welches Sie erstellt haben, `Item`.
-## Resultate
+## Resultate { #results }
-Mit nur dieser Python-Typdeklaration, wird **FastAPI**:
+Mit nur dieser Python-Typdeklaration wird **FastAPI**:
* Den Requestbody als JSON lesen.
* Die entsprechenden Typen konvertieren (falls nÃļtig).
* Diese Daten validieren.
- * Wenn die Daten ungÃŧltig sind, einen klar lesbaren Fehler zurÃŧckgeben, der anzeigt, wo und was die inkorrekten Daten waren.
+ * Wenn die Daten ungÃŧltig sind, wird ein klar lesbarer Fehler zurÃŧckgegeben, der genau anzeigt, wo und was die inkorrekten Daten sind.
* Ihnen die erhaltenen Daten im Parameter `item` Ãŧbergeben.
- * Da Sie diesen in der Funktion als vom Typ `Item` deklariert haben, erhalten Sie die ganze Editor-UnterstÃŧtzung (Autovervollständigung, usw.) fÃŧr alle Attribute und deren Typen.
-* Eine JSON Schema Definition fÃŧr Ihr Modell generieren, welche Sie Ãŧberall sonst verwenden kÃļnnen, wenn es fÃŧr Ihr Projekt Sinn macht.
-* Diese Schemas werden Teil des generierten OpenAPI-Schemas und werden von den UIs der automatischen Dokumentation verwendet.
+ * Da Sie ihn in der Funktion als vom Typ `Item` deklariert haben, erhalten Sie auch die volle UnterstÃŧtzung des Editors (Autovervollständigung, usw.) fÃŧr alle Attribute und deren Typen.
+* JSON Schema-Definitionen fÃŧr Ihr Modell generieren, die Sie auch Ãŧberall sonst verwenden kÃļnnen, wenn es fÃŧr Ihr Projekt Sinn macht.
+* Diese Schemas werden Teil des generierten OpenAPI-Schemas und werden von den UIs der automatischen Dokumentation genutzt.
-## Automatische Dokumentation
+## Automatische Dokumentation { #automatic-docs }
-Die JSON-Schemas Ihrer Modelle werden Teil ihrer OpenAPI-generierten Schemas und werden in der interaktiven API Dokumentation angezeigt:
+Die JSON-Schemas Ihrer Modelle werden Teil Ihres OpenAPI-generierten Schemas und in der interaktiven API-Dokumentation angezeigt:
-Und werden auch verwendet in der API-Dokumentation innerhalb jeder *Pfadoperation*, welche sie braucht:
+Und werden auch in der API-Dokumentation innerhalb jeder *Pfadoperation*, die sie benÃļtigt, verwendet:
-## Editor UnterstÃŧtzung
+## Editor-UnterstÃŧtzung { #editor-support }
-In Ihrem Editor, innerhalb Ihrer Funktion, erhalten Sie Typhinweise und Code-Vervollständigung Ãŧberall (was nicht der Fall wäre, wenn Sie ein `dict` anstelle eines Pydantic Modells erhalten hätten):
+In Ihrem Editor erhalten Sie innerhalb Ihrer Funktion Typhinweise und Code-Vervollständigung Ãŧberall (was nicht der Fall wäre, wenn Sie ein `dict` anstelle eines Pydantic-Modells erhalten hätten):
-Sie bekommen auch Fehler-Meldungen fÃŧr inkorrekte Typoperationen:
+Sie bekommen auch Fehlermeldungen fÃŧr inkorrekte Typoperationen:
Das ist nicht zufällig so, das ganze Framework wurde um dieses Design herum aufgebaut.
-Und es wurde in der Designphase grÃŧndlich getestet, vor der Implementierung, um sicherzustellen, dass es mit jedem Editor funktioniert.
+Und es wurde in der Designphase grÃŧndlich getestet, bevor irgendeine Implementierung stattfand, um sicherzustellen, dass es mit allen Editoren funktioniert.
-Es gab sogar ein paar Ãnderungen an Pydantic selbst, um das zu unterstÃŧtzen.
+Es gab sogar einige Ãnderungen an Pydantic selbst, um dies zu unterstÃŧtzen.
-Die vorherigen Screenshots zeigten Visual Studio Code.
+Die vorherigen Screenshots wurden mit Visual Studio Code aufgenommen.
-Aber Sie bekommen die gleiche Editor-UnterstÃŧtzung in PyCharm und in den meisten anderen Python-Editoren:
+Aber Sie wÃŧrden die gleiche Editor-UnterstÃŧtzung in PyCharm und den meisten anderen Python-Editoren erhalten:
/// tip | Tipp
-Wenn Sie PyCharm als Ihren Editor verwenden, probieren Sie das Pydantic PyCharm Plugin aus.
+Wenn Sie PyCharm als Ihren Editor verwenden, kÃļnnen Sie das Pydantic PyCharm Plugin ausprobieren.
Es verbessert die Editor-UnterstÃŧtzung fÃŧr Pydantic-Modelle, mit:
* Code-Vervollständigung
* TypÃŧberprÃŧfungen
* Refaktorisierung
-* Suchen
+* Suche
* Inspektionen
///
-## Das Modell verwenden
+## Das Modell verwenden { #use-the-model }
-Innerhalb der Funktion kÃļnnen Sie alle Attribute des Modells direkt verwenden:
+Innerhalb der Funktion kÃļnnen Sie alle Attribute des Modellobjekts direkt verwenden:
-{* ../../docs_src/body/tutorial002_py310.py hl[19] *}
+{* ../../docs_src/body/tutorial002_py310.py *}
-## Requestbody- + Pfad-Parameter
+/// info | Info
-Sie kÃļnnen Pfad- und Requestbody-Parameter gleichzeitig deklarieren.
+In Pydantic v1 hieà die Methode `.dict()`, sie wurde in Pydantic v2 deprecatet (aber weiterhin unterstÃŧtzt) und in `.model_dump()` umbenannt.
+
+Die Beispiele hier verwenden `.dict()` zur Kompatibilität mit Pydantic v1, aber Sie sollten stattdessen `.model_dump()` verwenden, wenn Sie Pydantic v2 nutzen kÃļnnen.
+
+///
+
+## Requestbody- + Pfad-Parameter { #request-body-path-parameters }
+
+Sie kÃļnnen Pfad-Parameter und den Requestbody gleichzeitig deklarieren.
**FastAPI** erkennt, dass Funktionsparameter, die mit Pfad-Parametern Ãŧbereinstimmen, **vom Pfad genommen** werden sollen, und dass Funktionsparameter, welche Pydantic-Modelle sind, **vom Requestbody genommen** werden sollen.
{* ../../docs_src/body/tutorial003_py310.py hl[15:16] *}
-## Requestbody- + Pfad- + Query-Parameter
+
+## Requestbody- + Pfad- + Query-Parameter { #request-body-path-query-parameters }
Sie kÃļnnen auch zur gleichen Zeit **Body-**, **Pfad-** und **Query-Parameter** deklarieren.
-**FastAPI** wird jeden Parameter korrekt erkennen und die Daten vom richtigen Ort holen.
+**FastAPI** wird jeden von ihnen korrekt erkennen und die Daten vom richtigen Ort holen.
{* ../../docs_src/body/tutorial004_py310.py hl[16] *}
Die Funktionsparameter werden wie folgt erkannt:
-* Wenn der Parameter auch im **Pfad** deklariert wurde, wird er als Pfad-Parameter interpretiert.
+* Wenn der Parameter auch im **Pfad** deklariert wurde, wird er als Pfad-Parameter verwendet.
* Wenn der Parameter ein **einfacher Typ** ist (wie `int`, `float`, `str`, `bool`, usw.), wird er als **Query**-Parameter interpretiert.
* Wenn der Parameter vom Typ eines **Pydantic-Modells** ist, wird er als Request**body** interpretiert.
/// note | Hinweis
-FastAPI weiÃ, dass der Wert von `q` nicht erforderlich ist, wegen des definierten Defaultwertes `= None`
+FastAPI weiÃ, dass der Wert von `q` nicht erforderlich ist, aufgrund des definierten Defaultwertes `= None`.
-Das `Union` in `Union[str, None]` wird von FastAPI nicht verwendet, aber es erlaubt Ihrem Editor, Sie besser zu unterstÃŧtzen und Fehler zu erkennen.
+Das `str | None` (Python 3.10+) oder `Union` in `Union[str, None]` (Python 3.8+) wird von FastAPI nicht verwendet, um zu bestimmen, dass der Wert nicht erforderlich ist. FastAPI weiÃ, dass er nicht erforderlich ist, weil er einen Defaultwert von `= None` hat.
+
+Das HinzufÃŧgen der Typannotationen ermÃļglicht jedoch Ihrem Editor, Ihnen eine bessere UnterstÃŧtzung zu bieten und Fehler zu erkennen.
///
-## Ohne Pydantic
+## Ohne Pydantic { #without-pydantic }
-Wenn Sie keine Pydantic-Modelle verwenden wollen, kÃļnnen Sie auch **Body**-Parameter nehmen. Siehe die Dokumentation unter [Body â Mehrere Parameter: Einfache Werte im Body](body-multiple-params.md#einzelne-werte-im-body){.internal-link target=\_blank}.
+Wenn Sie keine Pydantic-Modelle verwenden mÃļchten, kÃļnnen Sie auch **Body**-Parameter verwenden. Siehe die Dokumentation unter [Body â Mehrere Parameter: Einfache Werte im Body](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank}.
diff --git a/docs/de/docs/tutorial/cookie-param-models.md b/docs/de/docs/tutorial/cookie-param-models.md
new file mode 100644
index 000000000..2baf3d70d
--- /dev/null
+++ b/docs/de/docs/tutorial/cookie-param-models.md
@@ -0,0 +1,76 @@
+# Cookie-Parameter-Modelle { #cookie-parameter-models }
+
+Wenn Sie eine Gruppe von **Cookies** haben, die zusammengehÃļren, kÃļnnen Sie ein **Pydantic-Modell** erstellen, um diese zu deklarieren. đĒ
+
+Damit kÃļnnen Sie das Modell an **mehreren Stellen wiederverwenden** und auch Validierungen und Metadaten fÃŧr alle Parameter gleichzeitig deklarieren. đ
+
+/// note | Hinweis
+
+Dies wird seit FastAPI Version `0.115.0` unterstÃŧtzt. đ¤
+
+///
+
+/// tip | Tipp
+
+Diese gleiche Technik gilt fÃŧr `Query`, `Cookie` und `Header`. đ
+
+///
+
+## Cookies mit einem Pydantic-Modell { #cookies-with-a-pydantic-model }
+
+Deklarieren Sie die **Cookie**-Parameter, die Sie benÃļtigen, in einem **Pydantic-Modell**, und deklarieren Sie dann den Parameter als `Cookie`:
+
+{* ../../docs_src/cookie_param_models/tutorial001_an_py310.py hl[9:12,16] *}
+
+**FastAPI** wird die Daten fÃŧr **jedes Feld** aus den im Request empfangenen **Cookies** **extrahieren** und Ihnen das von Ihnen definierte Pydantic-Modell bereitstellen.
+
+## Die Dokumentation testen { #check-the-docs }
+
+Sie kÃļnnen die definierten Cookies in der Dokumentationsoberfläche unter `/docs` sehen:
+
+
+
+
+---
+
+Wenn Sie Pycharm verwenden, kÃļnnen Sie:
+
+* Das MenÃŧ âRunâ Ãļffnen.
+* Die Option âDebug ...â auswählen.
+* Ein KontextmenÃŧ wird angezeigt.
+* Die zu debuggende Datei auswählen (in diesem Fall `main.py`).
+
+Der Server wird dann mit Ihrem **FastAPI**-Code gestartet, an Ihren Haltepunkten angehalten, usw.
+
+So kÃļnnte es aussehen:
+
+
diff --git a/docs/de/docs/tutorial/dependencies/classes-as-dependencies.md b/docs/de/docs/tutorial/dependencies/classes-as-dependencies.md
index e9f25f786..3d4493f35 100644
--- a/docs/de/docs/tutorial/dependencies/classes-as-dependencies.md
+++ b/docs/de/docs/tutorial/dependencies/classes-as-dependencies.md
@@ -1,10 +1,10 @@
-# Klassen als Abhängigkeiten
+# Klassen als Abhängigkeiten { #classes-as-dependencies }
Bevor wir tiefer in das **Dependency Injection** System eintauchen, lassen Sie uns das vorherige Beispiel verbessern.
-## Ein `dict` aus dem vorherigen Beispiel
+## Ein `dict` aus dem vorherigen Beispiel { #a-dict-from-the-previous-example }
-Im vorherigen Beispiel haben wir ein `dict` von unserer Abhängigkeit (âDependableâ) zurÃŧckgegeben:
+Im vorherigen Beispiel haben wir ein `dict` von unserer Abhängigkeit (âDependableâ) zurÃŧckgegeben:
{* ../../docs_src/dependencies/tutorial001_an_py310.py hl[9] *}
@@ -14,7 +14,7 @@ Und wir wissen, dass Editoren nicht viel UnterstÃŧtzung (wie etwa Code-Vervollst
Das kÃļnnen wir besser machen ...
-## Was macht eine Abhängigkeit aus
+## Was macht eine Abhängigkeit aus { #what-makes-a-dependency }
Bisher haben Sie Abhängigkeiten gesehen, die als Funktionen deklariert wurden.
@@ -38,7 +38,7 @@ something(some_argument, some_keyword_argument="foo")
dann ist das ein âCallableâ (ein âAufrufbaresâ).
-## Klassen als Abhängigkeiten
+## Klassen als Abhängigkeiten { #classes-as-dependencies_1 }
MÃļglicherweise stellen Sie fest, dass Sie zum Erstellen einer Instanz einer Python-Klasse die gleiche Syntax verwenden.
@@ -89,7 +89,7 @@ In beiden Fällen wird sie haben:
In beiden Fällen werden die Daten konvertiert, validiert, im OpenAPI-Schema dokumentiert, usw.
-## Verwendung
+## Verwenden { #use-it }
Jetzt kÃļnnen Sie Ihre Abhängigkeit mithilfe dieser Klasse deklarieren.
@@ -97,7 +97,7 @@ Jetzt kÃļnnen Sie Ihre Abhängigkeit mithilfe dieser Klasse deklarieren.
**FastAPI** ruft die Klasse `CommonQueryParams` auf. Dadurch wird eine âInstanzâ dieser Klasse erstellt und die Instanz wird als Parameter `commons` an Ihre Funktion Ãŧberreicht.
-## Typannotation vs. `Depends`
+## Typannotation vs. `Depends` { #type-annotation-vs-depends }
Beachten Sie, wie wir `CommonQueryParams` im obigen Code zweimal schreiben:
@@ -193,7 +193,7 @@ Es wird jedoch empfohlen, den Typ zu deklarieren, da Ihr Editor so weiÃ, was al
-## AbkÃŧrzung
+## AbkÃŧrzung { #shortcut }
Aber Sie sehen, dass wir hier etwas Codeduplizierung haben, indem wir `CommonQueryParams` zweimal schreiben:
diff --git a/docs/de/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md b/docs/de/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
index bbba1a536..59c9fcf48 100644
--- a/docs/de/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
+++ b/docs/de/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
@@ -1,14 +1,14 @@
-# Abhängigkeiten in Pfadoperation-Dekoratoren
+# Abhängigkeiten in Pfadoperation-Dekoratoren { #dependencies-in-path-operation-decorators }
Manchmal benÃļtigen Sie den RÃŧckgabewert einer Abhängigkeit innerhalb Ihrer *Pfadoperation-Funktion* nicht wirklich.
Oder die Abhängigkeit gibt keinen Wert zurÃŧck.
-Aber Sie mÃŧssen Sie trotzdem ausfÃŧhren/auflÃļsen.
+Aber Sie mÃŧssen sie trotzdem ausfÃŧhren/auflÃļsen.
In diesen Fällen kÃļnnen Sie, anstatt einen Parameter der *Pfadoperation-Funktion* mit `Depends` zu deklarieren, eine `list`e von `dependencies` zum *Pfadoperation-Dekorator* hinzufÃŧgen.
-## `dependencies` zum *Pfadoperation-Dekorator* hinzufÃŧgen
+## `dependencies` zum *Pfadoperation-Dekorator* hinzufÃŧgen { #add-dependencies-to-the-path-operation-decorator }
Der *Pfadoperation-Dekorator* erhält ein optionales Argument `dependencies`.
@@ -28,7 +28,7 @@ Damit wird auch vermieden, neue Entwickler mÃļglicherweise zu verwirren, die ein
///
-/// info
+/// info | Info
In diesem Beispiel verwenden wir zwei erfundene benutzerdefinierte Header `X-Key` und `X-Token`.
@@ -36,23 +36,23 @@ Aber in realen Fällen wÃŧrden Sie bei der Implementierung von Sicherheit mehr V
///
-## Abhängigkeitsfehler und -RÃŧckgabewerte
+## Abhängigkeitsfehler und -RÃŧckgabewerte { #dependencies-errors-and-return-values }
Sie kÃļnnen dieselben Abhängigkeits-*Funktionen* verwenden, die Sie normalerweise verwenden.
-### Abhängigkeitsanforderungen
+### Abhängigkeitsanforderungen { #dependency-requirements }
-Sie kÃļnnen Anforderungen fÃŧr einen Request (wie Header) oder andere Unterabhängigkeiten deklarieren:
+Sie kÃļnnen Anforderungen fÃŧr einen Request (wie Header) oder andere Unterabhängigkeiten deklarieren:
{* ../../docs_src/dependencies/tutorial006_an_py39.py hl[8,13] *}
-### Exceptions auslÃļsen
+### Exceptions auslÃļsen { #raise-exceptions }
Die Abhängigkeiten kÃļnnen Exceptions `raise`n, genau wie normale Abhängigkeiten:
{* ../../docs_src/dependencies/tutorial006_an_py39.py hl[10,15] *}
-### RÃŧckgabewerte
+### RÃŧckgabewerte { #return-values }
Und sie kÃļnnen Werte zurÃŧckgeben oder nicht, die Werte werden nicht verwendet.
@@ -60,10 +60,10 @@ Sie kÃļnnen also eine normale Abhängigkeit (die einen Wert zurÃŧckgibt), die Si
{* ../../docs_src/dependencies/tutorial006_an_py39.py hl[11,16] *}
-## Abhängigkeiten fÃŧr eine Gruppe von *Pfadoperationen*
+## Abhängigkeiten fÃŧr eine Gruppe von *Pfadoperationen* { #dependencies-for-a-group-of-path-operations }
Wenn Sie später lesen, wie Sie grÃļÃere Anwendungen strukturieren ([GrÃļÃere Anwendungen â Mehrere Dateien](../../tutorial/bigger-applications.md){.internal-link target=_blank}), mÃļglicherweise mit mehreren Dateien, lernen Sie, wie Sie einen einzelnen `dependencies`-Parameter fÃŧr eine Gruppe von *Pfadoperationen* deklarieren.
-## Globale Abhängigkeiten
+## Globale Abhängigkeiten { #global-dependencies }
Als Nächstes werden wir sehen, wie man Abhängigkeiten zur gesamten `FastAPI`-Anwendung hinzufÃŧgt, sodass sie fÃŧr jede *Pfadoperation* gelten.
diff --git a/docs/de/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/de/docs/tutorial/dependencies/dependencies-with-yield.md
index 4b12f8447..178c2673e 100644
--- a/docs/de/docs/tutorial/dependencies/dependencies-with-yield.md
+++ b/docs/de/docs/tutorial/dependencies/dependencies-with-yield.md
@@ -1,4 +1,4 @@
-# Abhängigkeiten mit yield
+# Abhängigkeiten mit `yield` { #dependencies-with-yield }
FastAPI unterstÃŧtzt Abhängigkeiten, die nach Abschluss einige zusätzliche Schritte ausfÃŧhren.
@@ -23,11 +23,11 @@ Tatsächlich verwendet FastAPI diese beiden Dekoratoren intern.
///
-## Eine Datenbank-Abhängigkeit mit `yield`.
+## Eine Datenbank-Abhängigkeit mit `yield` { #a-database-dependency-with-yield }
Sie kÃļnnten damit beispielsweise eine Datenbanksession erstellen und diese nach Abschluss schlieÃen.
-Nur der Code vor und einschlieÃlich der `yield`-Anweisung wird ausgefÃŧhrt, bevor eine Response erzeugt wird:
+Nur der Code vor und einschlieÃlich der `yield`-Anweisung wird ausgefÃŧhrt, bevor eine Response erzeugt wird:
{* ../../docs_src/dependencies/tutorial007.py hl[2:4] *}
@@ -35,19 +35,19 @@ Der ge`yield`ete Wert ist das, was in *Pfadoperationen* und andere Abhängigkeit
{* ../../docs_src/dependencies/tutorial007.py hl[4] *}
-Der auf die `yield`-Anweisung folgende Code wird ausgefÃŧhrt, nachdem die Response gesendet wurde:
+Der auf die `yield`-Anweisung folgende Code wird ausgefÃŧhrt, nachdem die Response erstellt wurde, aber bevor sie gesendet wird:
{* ../../docs_src/dependencies/tutorial007.py hl[5:6] *}
/// tip | Tipp
-Sie kÃļnnen `async`hrone oder reguläre Funktionen verwenden.
+Sie kÃļnnen `async`- oder reguläre Funktionen verwenden.
**FastAPI** wird bei jeder das Richtige tun, so wie auch bei normalen Abhängigkeiten.
///
-## Eine Abhängigkeit mit `yield` und `try`.
+## Eine Abhängigkeit mit `yield` und `try` { #a-dependency-with-yield-and-try }
Wenn Sie einen `try`-Block in einer Abhängigkeit mit `yield` verwenden, empfangen Sie alle Exceptions, die bei Verwendung der Abhängigkeit geworfen wurden.
@@ -59,7 +59,7 @@ Auf die gleiche Weise kÃļnnen Sie `finally` verwenden, um sicherzustellen, dass
{* ../../docs_src/dependencies/tutorial007.py hl[3,5] *}
-## Unterabhängigkeiten mit `yield`.
+## Unterabhängigkeiten mit `yield` { #sub-dependencies-with-yield }
Sie kÃļnnen Unterabhängigkeiten und âBäumeâ von Unterabhängigkeiten beliebiger GrÃļÃe und Form haben, und einige oder alle davon kÃļnnen `yield` verwenden.
@@ -93,7 +93,7 @@ Dieses funktioniert dank Pythons Dependency Injection** System.
+**FastAPI** hat ein sehr mächtiges, aber intuitives **Dependency Injection** System.
Es ist so konzipiert, sehr einfach zu verwenden zu sein und es jedem Entwickler sehr leicht zu machen, andere Komponenten mit **FastAPI** zu integrieren.
-## Was ist âDependency Injectionâ
+## Was ist âDependency Injectionâ { #what-is-dependency-injection }
**âDependency Injectionâ** bedeutet in der Programmierung, dass es fÃŧr Ihren Code (in diesem Fall Ihre *Pfadoperation-Funktionen*) eine MÃļglichkeit gibt, Dinge zu deklarieren, die er verwenden mÃļchte und die er zum Funktionieren benÃļtigt: âAbhängigkeitenâ â âDependenciesâ.
@@ -19,15 +19,15 @@ Das ist sehr nÃŧtzlich, wenn Sie:
All dies, während Sie Codeverdoppelung minimieren.
-## Erste Schritte
+## Erste Schritte { #first-steps }
Sehen wir uns ein sehr einfaches Beispiel an. Es ist so einfach, dass es vorerst nicht sehr nÃŧtzlich ist.
Aber so kÃļnnen wir uns besser auf die Funktionsweise des **Dependency Injection** Systems konzentrieren.
-### Erstellen Sie eine Abhängigkeit (âDependableâ)
+### Eine Abhängigkeit erstellen, oder âDependableâ { #create-a-dependency-or-dependable }
-Konzentrieren wir uns zunächst auf die Abhängigkeit - die Dependency.
+Konzentrieren wir uns zunächst auf die Abhängigkeit â die Dependency.
Es handelt sich einfach um eine Funktion, die die gleichen Parameter entgegennimmt wie eine *Pfadoperation-Funktion*:
{* ../../docs_src/dependencies/tutorial001_an_py310.py hl[8:9] *}
@@ -48,23 +48,23 @@ In diesem Fall erwartet diese Abhängigkeit:
* Einen optionalen Query-Parameter `skip`, der ein `int` ist und standardmäÃig `0` ist.
* Einen optionalen Query-Parameter `limit`, der ein `int` ist und standardmäÃig `100` ist.
-Und dann wird einfach ein `dict` zurÃŧckgegeben, welches diese Werte enthält.
+Und dann wird einfach ein `dict` zurÃŧckgegeben, welches diese Werte enthält.
-/// info
+/// info | Info
FastAPI unterstÃŧtzt (und empfiehlt die Verwendung von) `Annotated` seit Version 0.95.0.
Wenn Sie eine ältere Version haben, werden Sie Fehler angezeigt bekommen, wenn Sie versuchen, `Annotated` zu verwenden.
-Bitte [aktualisieren Sie FastAPI](../../deployment/versions.md#upgrade-der-fastapi-versionen){.internal-link target=_blank} daher mindestens zu Version 0.95.1, bevor Sie `Annotated` verwenden.
+Bitte [aktualisieren Sie FastAPI](../../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} daher mindestens zu Version 0.95.1, bevor Sie `Annotated` verwenden.
///
-### `Depends` importieren
+### `Depends` importieren { #import-depends }
{* ../../docs_src/dependencies/tutorial001_an_py310.py hl[3] *}
-### Deklarieren der Abhängigkeit im âDependantâ
+### Die Abhängigkeit im âDependantâ deklarieren { #declare-the-dependency-in-the-dependant }
So wie auch `Body`, `Query`, usw., verwenden Sie `Depends` mit den Parametern Ihrer *Pfadoperation-Funktion*:
@@ -86,7 +86,7 @@ Im nächsten Kapitel erfahren Sie, welche anderen âDingeâ, auÃer Funktionen
///
-Immer wenn ein neuer Request eintrifft, kÃŧmmert sich **FastAPI** darum:
+Immer wenn ein neuer Request eintrifft, kÃŧmmert sich **FastAPI** darum:
* Ihre Abhängigkeitsfunktion (âDependableâ) mit den richtigen Parametern aufzurufen.
* Sich das Ergebnis von dieser Funktion zu holen.
@@ -105,7 +105,7 @@ common_parameters --> read_users
Auf diese Weise schreiben Sie gemeinsam genutzten Code nur einmal, und **FastAPI** kÃŧmmert sich darum, ihn fÃŧr Ihre *Pfadoperationen* aufzurufen.
-/// check
+/// check | Testen
Beachten Sie, dass Sie keine spezielle Klasse erstellen und diese irgendwo an **FastAPI** Ãŧbergeben mÃŧssen, um sie zu âregistrierenâ oder so ähnlich.
@@ -113,7 +113,7 @@ Sie Ãŧbergeben es einfach an `Depends` und **FastAPI** weiÃ, wie der Rest erled
///
-## `Annotated`-Abhängigkeiten wiederverwenden
+## `Annotated`-Abhängigkeiten wiederverwenden { #share-annotated-dependencies }
In den Beispielen oben sehen Sie, dass es ein kleines bisschen **Codeverdoppelung** gibt.
@@ -139,7 +139,7 @@ Die Abhängigkeiten funktionieren weiterhin wie erwartet, und das **Beste daran*
Das ist besonders nÃŧtzlich, wenn Sie es in einer **groÃen Codebasis** verwenden, in der Sie in **vielen *Pfadoperationen*** immer wieder **dieselben Abhängigkeiten** verwenden.
-## `async` oder nicht `async`
+## `async` oder nicht `async` { #to-async-or-not-to-async }
Da Abhängigkeiten auch von **FastAPI** aufgerufen werden (so wie Ihre *Pfadoperation-Funktionen*), gelten beim Definieren Ihrer Funktionen die gleichen Regeln.
@@ -151,11 +151,11 @@ Es spielt keine Rolle. **FastAPI** weiÃ, was zu tun ist.
/// note | Hinweis
-Wenn Ihnen das nichts sagt, lesen Sie den [Async: *âIn Eile?â*](../../async.md#in-eile){.internal-link target=_blank}-Abschnitt Ãŧber `async` und `await` in der Dokumentation.
+Wenn Ihnen das nichts sagt, lesen Sie den [Async: *âIn Eile?â*](../../async.md#in-a-hurry){.internal-link target=_blank}-Abschnitt Ãŧber `async` und `await` in der Dokumentation.
///
-## Integriert in OpenAPI
+## Integriert in OpenAPI { #integrated-with-openapi }
Alle Requestdeklarationen, -validierungen und -anforderungen Ihrer Abhängigkeiten (und Unterabhängigkeiten) werden in dasselbe OpenAPI-Schema integriert.
@@ -163,9 +163,9 @@ Die interaktive Dokumentation enthält also auch alle Informationen aus diesen A
-## Einfache Verwendung
+## Einfache Verwendung { #simple-usage }
-Näher betrachtet, werden *Pfadoperation-Funktionen* deklariert, um verwendet zu werden, wann immer ein *Pfad* und eine *Operation* Ãŧbereinstimmen, und dann kÃŧmmert sich **FastAPI** darum, die Funktion mit den richtigen Parametern aufzurufen, die Daten aus der Anfrage extrahierend.
+Näher betrachtet, werden *Pfadoperation-Funktionen* deklariert, um verwendet zu werden, wann immer ein *Pfad* und eine *Operation* Ãŧbereinstimmen, und dann kÃŧmmert sich **FastAPI** darum, die Funktion mit den richtigen Parametern aufzurufen, die Daten aus dem Request extrahierend.
Tatsächlich funktionieren alle (oder die meisten) Webframeworks auf die gleiche Weise.
@@ -181,7 +181,7 @@ Andere gebräuchliche Begriffe fÃŧr dieselbe Idee der âAbhängigkeitsinjektion
* Injectables
* Komponenten
-## **FastAPI**-Plugins
+## **FastAPI**-Plugins { #fastapi-plug-ins }
Integrationen und âPluginsâ kÃļnnen mit dem **Dependency Injection** System erstellt werden. Aber tatsächlich besteht **keine Notwendigkeit, âPluginsâ zu erstellen**, da es durch die Verwendung von Abhängigkeiten mÃļglich ist, eine unendliche Anzahl von Integrationen und Interaktionen zu deklarieren, die dann fÃŧr Ihre *Pfadoperation-Funktionen* verfÃŧgbar sind.
@@ -189,7 +189,7 @@ Und Abhängigkeiten kÃļnnen auf sehr einfache und intuitive Weise erstellt werde
Beispiele hierfÃŧr finden Sie in den nächsten Kapiteln zu relationalen und NoSQL-Datenbanken, Sicherheit usw.
-## **FastAPI**-Kompatibilität
+## **FastAPI**-Kompatibilität { #fastapi-compatibility }
Die Einfachheit des Dependency Injection Systems macht **FastAPI** kompatibel mit:
@@ -199,10 +199,10 @@ Die Einfachheit des Dependency Injection Systems macht **FastAPI** kompatibel mi
* externen APIs
* Authentifizierungs- und Autorisierungssystemen
* API-Nutzungs-Ãberwachungssystemen
-* Responsedaten-Injektionssystemen
+* Responsedaten-Injektionssystemen
* usw.
-## Einfach und leistungsstark
+## Einfach und leistungsstark { #simple-and-powerful }
Obwohl das hierarchische Dependency Injection System sehr einfach zu definieren und zu verwenden ist, ist es dennoch sehr mächtig.
@@ -242,7 +242,7 @@ admin_user --> activate_user
paying_user --> pro_items
```
-## Integriert mit **OpenAPI**
+## Integriert mit **OpenAPI** { #integrated-with-openapi_1 }
Alle diese Abhängigkeiten, während sie ihre Anforderungen deklarieren, fÃŧgen auch Parameter, Validierungen, usw. zu Ihren *Pfadoperationen* hinzu.
diff --git a/docs/de/docs/tutorial/dependencies/sub-dependencies.md b/docs/de/docs/tutorial/dependencies/sub-dependencies.md
index 66bdc7043..061952f92 100644
--- a/docs/de/docs/tutorial/dependencies/sub-dependencies.md
+++ b/docs/de/docs/tutorial/dependencies/sub-dependencies.md
@@ -1,4 +1,4 @@
-# Unterabhängigkeiten
+# Unterabhängigkeiten { #sub-dependencies }
Sie kÃļnnen Abhängigkeiten erstellen, die **Unterabhängigkeiten** haben.
@@ -6,17 +6,17 @@ Diese kÃļnnen so **tief** verschachtelt sein, wie nÃļtig.
**FastAPI** kÃŧmmert sich darum, sie aufzulÃļsen.
-## Erste Abhängigkeit, âDependableâ
+## Erste Abhängigkeit, âDependableâ { #first-dependency-dependable }
Sie kÃļnnten eine erste Abhängigkeit (âDependableâ) wie folgt erstellen:
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[8:9] *}
-Diese deklariert einen optionalen Abfrageparameter `q` vom Typ `str` und gibt ihn dann einfach zurÃŧck.
+Diese deklariert einen optionalen Query-Parameter `q` vom Typ `str` und gibt ihn dann einfach zurÃŧck.
Das ist recht einfach (nicht sehr nÃŧtzlich), hilft uns aber dabei, uns auf die Funktionsweise der Unterabhängigkeiten zu konzentrieren.
-## Zweite Abhängigkeit, âDependableâ und âDependantâ
+## Zweite Abhängigkeit, âDependableâ und âDependantâ { #second-dependency-dependable-and-dependant }
Dann kÃļnnen Sie eine weitere Abhängigkeitsfunktion (ein âDependableâ) erstellen, die gleichzeitig eine eigene Abhängigkeit deklariert (also auch ein âDependantâ ist):
@@ -29,17 +29,17 @@ Betrachten wir die deklarierten Parameter:
* Sie deklariert auÃerdem ein optionales `last_query`-Cookie, ein `str`.
* Wenn der Benutzer keine Query `q` Ãŧbermittelt hat, verwenden wir die zuletzt Ãŧbermittelte Query, die wir zuvor in einem Cookie gespeichert haben.
-## Die Abhängigkeit verwenden
+## Die Abhängigkeit verwenden { #use-the-dependency }
Diese Abhängigkeit verwenden wir nun wie folgt:
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[23] *}
-/// info
+/// info | Info
Beachten Sie, dass wir in der *Pfadoperation-Funktion* nur eine einzige Abhängigkeit deklarieren, den `query_or_cookie_extractor`.
-Aber **FastAPI** wird wissen, dass es zuerst `query_extractor` auflÃļsen muss, um dessen Resultat `query_or_cookie_extractor` zu Ãŧbergeben, wenn dieses aufgerufen wird.
+Aber **FastAPI** wird wissen, dass es zuerst `query_extractor` auflÃļsen muss, um dessen Resultat an `query_or_cookie_extractor` zu Ãŧbergeben, wenn dieses aufgerufen wird.
///
@@ -54,13 +54,13 @@ read_query["/items/"]
query_extractor --> query_or_cookie_extractor --> read_query
```
-## Dieselbe Abhängigkeit mehrmals verwenden
+## Dieselbe Abhängigkeit mehrmals verwenden { #using-the-same-dependency-multiple-times }
-Wenn eine Ihrer Abhängigkeiten mehrmals fÃŧr dieselbe *Pfadoperation* deklariert wird, beispielsweise wenn mehrere Abhängigkeiten eine gemeinsame Unterabhängigkeit haben, wird **FastAPI** diese Unterabhängigkeit nur einmal pro Request aufrufen.
+Wenn eine Ihrer Abhängigkeiten mehrmals fÃŧr dieselbe *Pfadoperation* deklariert wird, beispielsweise wenn mehrere Abhängigkeiten eine gemeinsame Unterabhängigkeit haben, wird **FastAPI** diese Unterabhängigkeit nur einmal pro Request aufrufen.
Und es speichert den zurÃŧckgegebenen Wert in einem âCacheâ und Ãŧbergibt diesen gecachten Wert an alle âDependantenâ, die ihn in diesem spezifischen Request benÃļtigen, anstatt die Abhängigkeit mehrmals fÃŧr denselben Request aufzurufen.
-In einem fortgeschrittenen Szenario, bei dem Sie wissen, dass die Abhängigkeit bei jedem Schritt (mÃļglicherweise mehrmals) in derselben Anfrage aufgerufen werden muss, anstatt den zwischengespeicherten Wert zu verwenden, kÃļnnen Sie den Parameter `use_cache=False` festlegen, wenn Sie `Depends` verwenden:
+In einem fortgeschrittenen Szenario, bei dem Sie wissen, dass die Abhängigkeit bei jedem Schritt (mÃļglicherweise mehrmals) in demselben Request aufgerufen werden muss, anstatt den zwischengespeicherten Wert zu verwenden, kÃļnnen Sie den Parameter `use_cache=False` festlegen, wenn Sie `Depends` verwenden:
//// tab | Python 3.8+
@@ -86,7 +86,7 @@ async def needy_dependency(fresh_value: str = Depends(get_value, use_cache=False
////
-## Zusammenfassung
+## Zusammenfassung { #recap }
Abgesehen von all den ausgefallenen WÃļrtern, die hier verwendet werden, ist das **Dependency Injection**-System recht simpel.
diff --git a/docs/de/docs/tutorial/encoder.md b/docs/de/docs/tutorial/encoder.md
index 5678d7b8f..25dc6fa18 100644
--- a/docs/de/docs/tutorial/encoder.md
+++ b/docs/de/docs/tutorial/encoder.md
@@ -1,12 +1,12 @@
-# JSON-kompatibler Encoder
+# JSON-kompatibler Encoder { #json-compatible-encoder }
-Es gibt Fälle, da mÃļchten Sie einen Datentyp (etwa ein Pydantic-Modell) in etwas konvertieren, das kompatibel mit JSON ist (etwa ein `dict`, eine `list`e, usw.).
+Es gibt Fälle, da mÃļchten Sie einen Datentyp (etwa ein Pydantic-Modell) in etwas konvertieren, das kompatibel mit JSON ist (etwa ein `dict`, eine `list`, usw.).
Zum Beispiel, wenn Sie es in einer Datenbank speichern mÃļchten.
DafÃŧr bietet **FastAPI** eine Funktion `jsonable_encoder()`.
-## `jsonable_encoder` verwenden
+## `jsonable_encoder` verwenden { #using-the-jsonable-encoder }
Stellen wir uns vor, Sie haben eine Datenbank `fake_db`, die nur JSON-kompatible Daten entgegennimmt.
diff --git a/docs/de/docs/tutorial/extra-data-types.md b/docs/de/docs/tutorial/extra-data-types.md
index 334f32f7b..5002f0534 100644
--- a/docs/de/docs/tutorial/extra-data-types.md
+++ b/docs/de/docs/tutorial/extra-data-types.md
@@ -1,4 +1,4 @@
-# Zusätzliche Datentypen
+# Zusätzliche Datentypen { #extra-data-types }
Bisher haben Sie gängige Datentypen verwendet, wie zum Beispiel:
@@ -12,12 +12,12 @@ Sie kÃļnnen aber auch komplexere Datentypen verwenden.
Und Sie haben immer noch dieselbe Funktionalität wie bisher gesehen:
* GroÃartige Editor-UnterstÃŧtzung.
-* Datenkonvertierung bei eingehenden Requests.
-* Datenkonvertierung fÃŧr Response-Daten.
+* Datenkonvertierung bei eingehenden Requests.
+* Datenkonvertierung fÃŧr Response-Daten.
* Datenvalidierung.
* Automatische Annotation und Dokumentation.
-## Andere Datentypen
+## Andere Datentypen { #other-data-types }
Hier sind einige der zusätzlichen Datentypen, die Sie verwenden kÃļnnen:
@@ -36,11 +36,11 @@ Hier sind einige der zusätzlichen Datentypen, die Sie verwenden kÃļnnen:
* `datetime.timedelta`:
* Ein Python-`datetime.timedelta`.
* Wird in Requests und Responses als `float` der Gesamtsekunden dargestellt.
- * Pydantic ermÃļglicht auch die Darstellung als âISO 8601 Zeitdifferenz-Kodierungâ, Weitere Informationen finden Sie in der Dokumentation.
+ * Pydantic ermÃļglicht auch die Darstellung als âISO 8601 Zeitdifferenz-Kodierungâ, siehe die Dokumentation fÃŧr weitere Informationen.
* `frozenset`:
* Wird in Requests und Responses wie ein `set` behandelt:
* Bei Requests wird eine Liste gelesen, Duplikate entfernt und in ein `set` umgewandelt.
- * Bei Responses wird das `set` in eine `list`e umgewandelt.
+ * Bei Responses wird das `set` in eine `list` umgewandelt.
* Das generierte Schema zeigt an, dass die `set`-Werte eindeutig sind (unter Verwendung von JSON Schemas `uniqueItems`).
* `bytes`:
* Standard-Python-`bytes`.
@@ -49,9 +49,9 @@ Hier sind einige der zusätzlichen Datentypen, die Sie verwenden kÃļnnen:
* `Decimal`:
* Standard-Python-`Decimal`.
* In Requests und Responses wird es wie ein `float` behandelt.
-* Sie kÃļnnen alle gÃŧltigen Pydantic-Datentypen hier ÃŧberprÃŧfen: Pydantic data types.
+* Sie kÃļnnen alle gÃŧltigen Pydantic-Datentypen hier ÃŧberprÃŧfen: Pydantic-Datentypen.
-## Beispiel
+## Beispiel { #example }
Hier ist ein Beispiel fÃŧr eine *Pfadoperation* mit Parametern, die einige der oben genannten Typen verwenden.
diff --git a/docs/de/docs/tutorial/extra-models.md b/docs/de/docs/tutorial/extra-models.md
index 6aad1c0f4..967e8535b 100644
--- a/docs/de/docs/tutorial/extra-models.md
+++ b/docs/de/docs/tutorial/extra-models.md
@@ -1,42 +1,42 @@
-# Extramodelle
+# Extramodelle { #extra-models }
-Fahren wir beim letzten Beispiel fort. Es gibt normalerweise mehrere zusammengehÃļrende Modelle.
+Im Anschluss an das vorherige Beispiel ist es Ãŧblich, mehr als ein zusammenhängendes Modell zu haben.
-Insbesondere Benutzermodelle, denn:
+Dies gilt insbesondere fÃŧr Benutzermodelle, denn:
-* Das **hereinkommende Modell** sollte ein Passwort haben kÃļnnen.
-* Das **herausgehende Modell** sollte kein Passwort haben.
-* Das **Datenbankmodell** sollte wahrscheinlich ein gehashtes Passwort haben.
+* Das **Eingabemodell** muss ein Passwort enthalten kÃļnnen.
+* Das **Ausgabemodell** sollte kein Passwort haben.
+* Das **Datenbankmodell** mÃŧsste wahrscheinlich ein gehashtes Passwort haben.
/// danger | Gefahr
-Speichern Sie niemals das Klartext-Passwort eines Benutzers. Speichern Sie immer den âsicheren Hashâ, den Sie verifizieren kÃļnnen.
+Speichern Sie niemals das Klartextpasswort eines Benutzers. Speichern Sie immer einen âsicheren Hashâ, den Sie dann verifizieren kÃļnnen.
-Falls Ihnen das nichts sagt, in den [Sicherheits-Kapiteln](security/simple-oauth2.md#passwort-hashing){.internal-link target=_blank} werden Sie lernen, was ein âPasswort-Hashâ ist.
+Wenn Sie nicht wissen, was das ist, werden Sie in den [Sicherheitskapiteln](security/simple-oauth2.md#password-hashing){.internal-link target=_blank} lernen, was ein âPassworthashâ ist.
///
-## Mehrere Modelle
+## Mehrere Modelle { #multiple-models }
-Hier der generelle Weg, wie die Modelle mit ihren Passwort-Feldern aussehen kÃļnnten, und an welchen Orten sie verwendet werden wÃŧrden.
+Hier ist eine allgemeine Idee, wie die Modelle mit ihren Passwortfeldern aussehen kÃļnnten und an welchen Stellen sie verwendet werden:
{* ../../docs_src/extra_models/tutorial001_py310.py hl[7,9,14,20,22,27:28,31:33,38:39] *}
-/// info
+/// info | Info
-In Pydantic v1 hieà diese Methode `.dict()`, in Pydantic v2 wurde sie deprecated (aber immer noch unterstÃŧtzt) und in `.model_dump()` umbenannt.
+In Pydantic v1 hieà die Methode `.dict()`, in Pydantic v2 wurde sie deprecatet (aber weiterhin unterstÃŧtzt) und in `.model_dump()` umbenannt.
-Die Beispiele hier verwenden `.dict()` fÃŧr die Kompatibilität mit Pydantic v1, Sie sollten jedoch stattdessen `.model_dump()` verwenden, wenn Sie Pydantic v2 verwenden kÃļnnen.
+Die Beispiele hier verwenden `.dict()` fÃŧr die Kompatibilität mit Pydantic v1, aber Sie sollten `.model_dump()` verwenden, wenn Sie Pydantic v2 verwenden kÃļnnen.
///
-### Ãber `**user_in.dict()`
+### Ãber `**user_in.dict()` { #about-user-in-dict }
-#### Pydantic's `.dict()`
+#### Die `.dict()`-Methode von Pydantic { #pydantics-dict }
`user_in` ist ein Pydantic-Modell der Klasse `UserIn`.
-Pydantic-Modelle haben eine `.dict()`-Methode, die ein `dict` mit den Daten des Modells zurÃŧckgibt.
+Pydantic-Modelle haben eine `.dict()`-Methode, die ein `dict` mit den Daten des Modells zurÃŧckgibt.
Wenn wir also ein Pydantic-Objekt `user_in` erstellen, etwa so:
@@ -44,21 +44,21 @@ Wenn wir also ein Pydantic-Objekt `user_in` erstellen, etwa so:
user_in = UserIn(username="john", password="secret", email="john.doe@example.com")
```
-und wir rufen seine `.dict()`-Methode auf:
+und dann aufrufen:
```Python
user_dict = user_in.dict()
```
-dann haben wir jetzt in der Variable `user_dict` ein `dict` mit den gleichen Daten (es ist ein `dict` statt eines Pydantic-Modellobjekts).
+haben wir jetzt ein `dict` mit den Daten in der Variablen `user_dict` (es ist ein `dict` statt eines Pydantic-Modellobjekts).
-Wenn wir es ausgeben:
+Und wenn wir aufrufen:
```Python
print(user_dict)
```
-bekommen wir ein Python-`dict`:
+wÃŧrden wir ein Python-`dict` erhalten mit:
```Python
{
@@ -69,17 +69,17 @@ bekommen wir ein Python-`dict`:
}
```
-#### Ein `dict` entpacken
+#### Ein `dict` entpacken { #unpacking-a-dict }
-Wenn wir ein `dict` wie `user_dict` nehmen, und es einer Funktion (oder Klassenmethode) mittels `**user_dict` Ãŧbergeben, wird Python es âentpackenâ. Es wird die SchlÃŧssel und Werte von `user_dict` direkt als SchlÃŧsselwort-Argumente Ãŧbergeben.
+Wenn wir ein `dict` wie `user_dict` nehmen und es einer Funktion (oder Klasse) mit `**user_dict` Ãŧbergeben, wird Python es âentpackenâ. Es wird die SchlÃŧssel und Werte von `user_dict` direkt als SchlÃŧsselwort-Argumente Ãŧbergeben.
-Wenn wir also das `user_dict` von oben nehmen und schreiben:
+Setzen wir also das `user_dict` von oben ein:
```Python
UserInDB(**user_dict)
```
-dann ist das ungefähr äquivalent zu:
+so ist das äquivalent zu:
```Python
UserInDB(
@@ -90,7 +90,7 @@ UserInDB(
)
```
-Oder, präziser, `user_dict` wird direkt verwendet, welche Werte es auch immer haben mag:
+Oder genauer gesagt, dazu, `user_dict` direkt zu verwenden, mit welchen Inhalten es auch immer in der Zukunft haben mag:
```Python
UserInDB(
@@ -101,34 +101,34 @@ UserInDB(
)
```
-#### Ein Pydantic-Modell aus den Inhalten eines anderen erstellen.
+#### Ein Pydantic-Modell aus dem Inhalt eines anderen { #a-pydantic-model-from-the-contents-of-another }
-Da wir in obigem Beispiel `user_dict` mittels `user_in.dict()` erzeugt haben, ist dieser Code:
+Da wir im obigen Beispiel `user_dict` von `user_in.dict()` bekommen haben, wäre dieser Code:
```Python
user_dict = user_in.dict()
UserInDB(**user_dict)
```
-äquivalent zu:
+gleichwertig zu:
```Python
UserInDB(**user_in.dict())
```
-... weil `user_in.dict()` ein `dict` ist, und dann lassen wir Python es âentpackenâ, indem wir es `UserInDB` Ãŧbergeben, mit vorangestelltem `**`.
+... weil `user_in.dict()` ein `dict` ist, und dann lassen wir Python es âentpackenâ, indem wir es an `UserInDB` mit vorangestelltem `**` Ãŧbergeben.
-Wir erhalten also ein Pydantic-Modell aus den Daten eines anderen Pydantic-Modells.
+Auf diese Weise erhalten wir ein Pydantic-Modell aus den Daten eines anderen Pydantic-Modells.
-#### Ein `dict` entpacken und zusätzliche SchlÃŧsselwort-Argumente
+#### Ein `dict` entpacken und zusätzliche SchlÃŧsselwort-Argumente { #unpacking-a-dict-and-extra-keywords }
-Und dann fÃŧgen wir ein noch weiteres SchlÃŧsselwort-Argument hinzu, `hashed_password=hashed_password`:
+Und dann fÃŧgen wir das zusätzliche SchlÃŧsselwort-Argument `hashed_password=hashed_password` hinzu, wie in:
```Python
UserInDB(**user_in.dict(), hashed_password=hashed_password)
```
-... was am Ende ergibt:
+... was so ist wie:
```Python
UserInDB(
@@ -142,78 +142,81 @@ UserInDB(
/// warning | Achtung
-Die Hilfsfunktionen `fake_password_hasher` und `fake_save_user` demonstrieren nur den mÃļglichen Fluss der Daten und bieten natÃŧrlich keine echte Sicherheit.
+Die unterstÃŧtzenden zusätzlichen Funktionen `fake_password_hasher` und `fake_save_user` dienen nur zur Demo eines mÃļglichen Datenflusses, bieten jedoch natÃŧrlich keine echte Sicherheit.
///
-## Verdopplung vermeiden
+## Verdopplung vermeiden { #reduce-duplication }
-Reduzierung von Code-Verdoppelung ist eine der Kern-Ideen von **FastAPI**.
+Die Reduzierung von Code-Verdoppelung ist eine der Kernideen von **FastAPI**.
-Weil Verdoppelung von Code die Wahrscheinlichkeit von Fehlern, Sicherheitsproblemen, Desynchronisation (Code wird nur an einer Stelle verändert, aber nicht an einer anderen), usw. erhÃļht.
+Da die Verdopplung von Code die Wahrscheinlichkeit von Fehlern, Sicherheitsproblemen, Problemen mit der Desynchronisation des Codes (wenn Sie an einer Stelle, aber nicht an der anderen aktualisieren) usw. erhÃļht.
-Unsere Modelle teilen alle eine Menge der Daten und verdoppeln Attribut-Namen und -Typen.
+Und diese Modelle teilen alle eine Menge der Daten und verdoppeln Attributnamen und -typen.
-Das kÃļnnen wir besser machen.
+Wir kÃļnnten es besser machen.
-Wir deklarieren ein `UserBase`-Modell, das als Basis fÃŧr unsere anderen Modelle dient. Dann kÃļnnen wir Unterklassen erstellen, die seine Attribute (Typdeklarationen, Validierungen, usw.) erben.
+Wir kÃļnnen ein `UserBase`-Modell deklarieren, das als Basis fÃŧr unsere anderen Modelle dient. Und dann kÃļnnen wir Unterklassen dieses Modells erstellen, die seine Attribute (Typdeklarationen, Validierung usw.) erben.
-Die ganze Datenkonvertierung, -validierung, -dokumentation, usw. wird immer noch wie gehabt funktionieren.
+Die ganze Datenkonvertierung, -validierung, -dokumentation usw. wird immer noch wie gewohnt funktionieren.
-Auf diese Weise beschreiben wir nur noch die Unterschiede zwischen den Modellen (mit Klartext-`password`, mit `hashed_password`, und ohne Passwort):
+Auf diese Weise kÃļnnen wir nur die Unterschiede zwischen den Modellen (mit Klartext-`password`, mit `hashed_password` und ohne Passwort) deklarieren:
{* ../../docs_src/extra_models/tutorial002_py310.py hl[7,13:14,17:18,21:22] *}
-## `Union`, oder `anyOf`
+## `Union` oder `anyOf` { #union-or-anyof }
-Sie kÃļnnen deklarieren, dass eine Response eine `Union` mehrerer Typen ist, sprich, einer dieser Typen.
+Sie kÃļnnen deklarieren, dass eine Response eine `Union` mehrerer Typen ist, das bedeutet, dass die Response einer von ihnen ist.
-Das wird in OpenAPI mit `anyOf` angezeigt.
+Dies wird in OpenAPI mit `anyOf` definiert.
-Um das zu tun, verwenden Sie Pythons Standard-Typhinweis `typing.Union`:
+Um das zu tun, verwenden Sie den Standard-Python-Typhinweis `typing.Union`:
/// note | Hinweis
-Listen Sie, wenn Sie eine `Union` definieren, denjenigen Typ zuerst, der am spezifischsten ist, gefolgt von den weniger spezifischen Typen. Im Beispiel oben, in `Union[PlaneItem, CarItem]` also den spezifischeren `PlaneItem` vor dem weniger spezifischen `CarItem`.
+Wenn Sie eine `Union` definieren, listen Sie den spezifischeren Typ zuerst auf, gefolgt vom weniger spezifischen Typ. Im Beispiel unten steht `PlaneItem` vor `CarItem` in `Union[PlaneItem, CarItem]`.
///
{* ../../docs_src/extra_models/tutorial003_py310.py hl[1,14:15,18:20,33] *}
-### `Union` in Python 3.10
-In diesem Beispiel Ãŧbergeben wir dem Argument `response_model` den Wert `Union[PlaneItem, CarItem]`.
+### `Union` in Python 3.10 { #union-in-python-3-10 }
-Da wir es als **Wert einem Argument Ãŧberreichen**, statt es als **Typannotation** zu verwenden, mÃŧssen wir `Union` verwenden, selbst in Python 3.10.
+In diesem Beispiel Ãŧbergeben wir `Union[PlaneItem, CarItem]` als Wert des Arguments `response_model`.
-Wenn es eine Typannotation gewesen wäre, hätten wir auch den vertikalen Trennstrich verwenden kÃļnnen, wie in:
+Da wir es als **Wert an ein Argument Ãŧbergeben**, anstatt es in einer **Typannotation** zu verwenden, mÃŧssen wir `Union` verwenden, sogar in Python 3.10.
+
+Wäre es eine Typannotation gewesen, hätten wir den vertikalen Strich verwenden kÃļnnen, wie in:
```Python
some_variable: PlaneItem | CarItem
```
-Aber wenn wir das in der Zuweisung `response_model=PlaneItem | CarItem` machen, erhalten wir eine Fehlermeldung, da Python versucht, eine **ungÃŧltige Operation** zwischen `PlaneItem` und `CarItem` durchzufÃŧhren, statt es als Typannotation zu interpretieren.
+Aber wenn wir das in der Zuweisung `response_model=PlaneItem | CarItem` machen, wÃŧrden wir einen Fehler erhalten, weil Python versuchen wÃŧrde, eine **ungÃŧltige Operation** zwischen `PlaneItem` und `CarItem` auszufÃŧhren, anstatt es als Typannotation zu interpretieren.
-## Listen von Modellen
+## Liste von Modellen { #list-of-models }
-Genauso kÃļnnen Sie eine Response deklarieren, die eine Liste von Objekten ist.
+Auf die gleiche Weise kÃļnnen Sie Responses von Listen von Objekten deklarieren.
-Verwenden Sie dafÃŧr Pythons Standard `typing.List` (oder nur `list` in Python 3.9 und darÃŧber):
+DafÃŧr verwenden Sie Pythons Standard-`typing.List` (oder nur `list` in Python 3.9 und hÃļher):
{* ../../docs_src/extra_models/tutorial004_py39.py hl[18] *}
-## Response mit beliebigem `dict`
-Sie kÃļnne auch eine Response deklarieren, die ein beliebiges `dict` zurÃŧckgibt, bei dem nur die Typen der SchlÃŧssel und der Werte bekannt sind, ohne ein Pydantic-Modell zu verwenden.
+## Response mit beliebigem `dict` { #response-with-arbitrary-dict }
-Das ist nÃŧtzlich, wenn Sie die gÃŧltigen Feld-/Attribut-Namen von vorneherein nicht wissen (was fÃŧr ein Pydantic-Modell notwendig ist).
+Sie kÃļnnen auch eine Response deklarieren, die ein beliebiges `dict` zurÃŧckgibt, indem Sie nur die Typen der SchlÃŧssel und Werte ohne ein Pydantic-Modell deklarieren.
-In diesem Fall kÃļnnen Sie `typing.Dict` verwenden (oder nur `dict` in Python 3.9 und darÃŧber):
+Dies ist nÃŧtzlich, wenn Sie die gÃŧltigen Feld-/Attributnamen nicht im Voraus kennen (die fÃŧr ein Pydantic-Modell benÃļtigt werden wÃŧrden).
+
+In diesem Fall kÃļnnen Sie `typing.Dict` verwenden (oder nur `dict` in Python 3.9 und hÃļher):
{* ../../docs_src/extra_models/tutorial005_py39.py hl[6] *}
-## Zusammenfassung
+
+## Zusammenfassung { #recap }
Verwenden Sie gerne mehrere Pydantic-Modelle und vererben Sie je nach Bedarf.
-Sie brauchen kein einzelnes Datenmodell pro Einheit, wenn diese Einheit verschiedene Zustände annehmen kann. So wie unsere Benutzer-âEinheitâ, welche einen Zustand mit `password`, einen mit `password_hash` und einen ohne Passwort hatte.
+Sie brauchen kein einzelnes Datenmodell pro Einheit, wenn diese Einheit in der Lage sein muss, verschiedene âZuständeâ zu haben. Wie im Fall der Benutzer-âEinheitâ mit einem Zustand einschlieÃlich `password`, `password_hash` und ohne Passwort.
diff --git a/docs/de/docs/tutorial/first-steps.md b/docs/de/docs/tutorial/first-steps.md
index 3104c8d61..374127c17 100644
--- a/docs/de/docs/tutorial/first-steps.md
+++ b/docs/de/docs/tutorial/first-steps.md
@@ -1,64 +1,80 @@
-# Erste Schritte
+# Erste Schritte { #first-steps }
Die einfachste FastAPI-Datei kÃļnnte wie folgt aussehen:
{* ../../docs_src/first_steps/tutorial001.py *}
-Kopieren Sie dies in eine Datei `main.py`.
+Kopieren Sie das in eine Datei `main.py`.
Starten Sie den Live-Server:
get-Operation gehen
+* den Pfad `/`
+* unter der Verwendung der get-Operation gehen
-/// info | `@decorator` Information
+/// info | `@decorator` Info
Diese `@something`-Syntax wird in Python âDekoratorâ genannt.
@@ -269,7 +257,7 @@ Sie kÃļnnen auch die anderen Operationen verwenden:
* `@app.put()`
* `@app.delete()`
-Oder die exotischeren:
+Und die exotischeren:
* `@app.options()`
* `@app.head()`
@@ -288,7 +276,7 @@ Wenn Sie beispielsweise GraphQL verwenden, fÃŧhren Sie normalerweise alle Aktion
///
-### Schritt 4: Definieren der **Pfadoperation-Funktion**
+### Schritt 4: Definieren der **Pfadoperation-Funktion** { #step-4-define-the-path-operation-function }
Das ist unsere â**Pfadoperation-Funktion**â:
@@ -300,7 +288,7 @@ Das ist unsere â**Pfadoperation-Funktion**â:
Dies ist eine Python-Funktion.
-Sie wird von **FastAPI** immer dann aufgerufen, wenn sie eine Anfrage an die URL "`/`" mittels einer `GET`-Operation erhält.
+Sie wird von **FastAPI** immer dann aufgerufen, wenn sie einen Request an die URL â`/`â mittels einer `GET`-Operation erhält.
In diesem Fall handelt es sich um eine `async`-Funktion.
@@ -312,11 +300,11 @@ Sie kÃļnnten sie auch als normale Funktion anstelle von `async def` definieren:
/// note | Hinweis
-Wenn Sie den Unterschied nicht kennen, lesen Sie [Async: *âIn Eile?â*](../async.md#in-eile){.internal-link target=_blank}.
+Wenn Sie den Unterschied nicht kennen, lesen Sie [Async: *âIn Eile?â*](../async.md#in-a-hurry){.internal-link target=_blank}.
///
-### Schritt 5: den Inhalt zurÃŧckgeben
+### Schritt 5: den Inhalt zurÃŧckgeben { #step-5-return-the-content }
{* ../../docs_src/first_steps/tutorial001.py hl[8] *}
@@ -324,12 +312,12 @@ Sie kÃļnnen ein `dict`, eine `list`, einzelne Werte wie `str`, `int`, usw. zurÃŧ
Sie kÃļnnen auch Pydantic-Modelle zurÃŧckgeben (dazu später mehr).
-Es gibt viele andere Objekte und Modelle, die automatisch zu JSON konvertiert werden (einschlieÃlich ORMs usw.). Versuchen Sie, Ihre Lieblingsobjekte zu verwenden. Es ist sehr wahrscheinlich, dass sie bereits unterstÃŧtzt werden.
+Es gibt viele andere Objekte und Modelle, die automatisch zu JSON konvertiert werden (einschlieÃlich ORMs, usw.). Versuchen Sie, Ihre Lieblingsobjekte zu verwenden. Es ist sehr wahrscheinlich, dass sie bereits unterstÃŧtzt werden.
-## Zusammenfassung
+## Zusammenfassung { #recap }
* Importieren Sie `FastAPI`.
* Erstellen Sie eine `app` Instanz.
-* Schreiben Sie einen **Pfadoperation-Dekorator** (wie z. B. `@app.get("/")`).
-* Schreiben Sie eine **Pfadoperation-Funktion** (wie z. B. oben `def root(): ...`).
-* Starten Sie den Entwicklungsserver (z. B. `uvicorn main:app --reload`).
+* Schreiben Sie einen **Pfadoperation-Dekorator** unter Verwendung von Dekoratoren wie `@app.get("/")`.
+* Definieren Sie eine **Pfadoperation-Funktion**, zum Beispiel `def root(): ...`.
+* Starten Sie den Entwicklungsserver mit dem Befehl `fastapi dev`.
diff --git a/docs/de/docs/tutorial/handling-errors.md b/docs/de/docs/tutorial/handling-errors.md
index 31bc6d328..51294f44f 100644
--- a/docs/de/docs/tutorial/handling-errors.md
+++ b/docs/de/docs/tutorial/handling-errors.md
@@ -1,49 +1,49 @@
-# Fehlerbehandlung
+# Fehler behandeln { #handling-errors }
-Es gibt viele Situationen, in denen Sie einem Client, der Ihre API benutzt, einen Fehler zurÃŧckgeben mÃŧssen.
+Es gibt viele Situationen, in denen Sie einem Client, der Ihre API nutzt, einen Fehler mitteilen mÃŧssen.
-Dieser Client kÃļnnte ein Browser mit einem Frontend, Code von jemand anderem, ein IoT-Gerät, usw., sein.
+Dieser Client kÃļnnte ein Browser mit einem Frontend sein, ein Code von jemand anderem, ein IoT-Gerät usw.
-Sie mÃŧssten beispielsweise einem Client sagen:
+Sie kÃļnnten dem Client mitteilen mÃŧssen, dass:
-* Dass er nicht die notwendigen Berechtigungen hat, eine Aktion auszufÃŧhren.
-* Dass er zu einer Ressource keinen Zugriff hat.
-* Dass die Ressource, auf die er zugreifen mÃļchte, nicht existiert.
+* Der Client nicht genÃŧgend Berechtigungen fÃŧr diese Operation hat.
+* Der Client keinen Zugriff auf diese Ressource hat.
+* Die Ressource, auf die der Client versucht hat, zuzugreifen, nicht existiert.
* usw.
-In diesen Fällen geben Sie normalerweise einen **HTTP-Statuscode** im Bereich **400** (400 bis 499) zurÃŧck.
+In diesen Fällen wÃŧrden Sie normalerweise einen **HTTP-Statuscode** im Bereich **400** (von 400 bis 499) zurÃŧckgeben.
-Das ist vergleichbar mit den HTTP-Statuscodes im Bereich 200 (von 200 bis 299). Diese â200âer Statuscodes bedeuten, dass der Request in einem bestimmten Aspekt ein âSuccessâ (âErfolgâ) war.
+Dies ist vergleichbar mit den HTTP-Statuscodes im Bereich 200 (von 200 bis 299). Diese â200â-Statuscodes bedeuten, dass der Request in irgendeiner Weise erfolgreich war.
-Die Statuscodes im 400er-Bereich bedeuten hingegen, dass es einen Fehler gab.
+Die Statuscodes im Bereich 400 bedeuten hingegen, dass es einen Fehler seitens des Clients gab.
-Erinnern Sie sich an all diese **404 Not Found** Fehler (und Witze)?
+Erinnern Sie sich an all diese **â404 Not Foundâ** Fehler (und Witze)?
-## `HTTPException` verwenden
+## `HTTPException` verwenden { #use-httpexception }
-Um HTTP-Responses mit Fehlern zum Client zurÃŧckzugeben, verwenden Sie `HTTPException`.
+Um HTTP-Responses mit Fehlern an den Client zurÃŧckzugeben, verwenden Sie `HTTPException`.
-### `HTTPException` importieren
+### `HTTPException` importieren { #import-httpexception }
{* ../../docs_src/handling_errors/tutorial001.py hl[1] *}
-### Eine `HTTPException` in Ihrem Code auslÃļsen
+### Eine `HTTPException` in Ihrem Code auslÃļsen { #raise-an-httpexception-in-your-code }
-`HTTPException` ist eine normale Python-Exception mit einigen zusätzlichen Daten, die fÃŧr APIs relevant sind.
+`HTTPException` ist eine normale Python-Exception mit zusätzlichen Daten, die fÃŧr APIs relevant sind.
-Weil es eine Python-Exception ist, geben Sie sie nicht zurÃŧck, (`return`), sondern Sie lÃļsen sie aus (`raise`).
+Weil es eine Python-Exception ist, geben Sie sie nicht zurÃŧck (`return`), sondern lÃļsen sie aus (`raise`).
-Das bedeutet auch, wenn Sie in einer Hilfsfunktion sind, die Sie von ihrer *Pfadoperation-Funktion* aus aufrufen, und Sie lÃļsen eine `HTTPException` von innerhalb dieser Hilfsfunktion aus, dann wird der Rest der *Pfadoperation-Funktion* nicht ausgefÃŧhrt, sondern der Request wird sofort abgebrochen und der HTTP-Error der `HTTP-Exception` wird zum Client gesendet.
+Das bedeutet auch, wenn Sie sich innerhalb einer Hilfsfunktion befinden, die Sie innerhalb Ihrer *Pfadoperation-Funktion* aufrufen, und Sie die `HTTPException` aus dieser Hilfsfunktion heraus auslÃļsen, wird der restliche Code in der *Pfadoperation-Funktion* nicht ausgefÃŧhrt. Der Request wird sofort abgebrochen und der HTTP-Error der `HTTPException` wird an den Client gesendet.
-Der Vorteil, eine Exception auszulÃļsen (`raise`), statt sie zurÃŧckzugeben (`return`) wird im Abschnitt Ãŧber Abhängigkeiten und Sicherheit klarer werden.
+Der Vorteil des AuslÃļsens einer Exception gegenÃŧber dem ZurÃŧckgeben eines Wertes wird im Abschnitt Ãŧber Abhängigkeiten und Sicherheit deutlicher werden.
-Im folgenden Beispiel lÃļsen wir, wenn der Client eine ID anfragt, die nicht existiert, eine Exception mit dem Statuscode `404` aus.
+In diesem Beispiel lÃļsen wir eine Exception mit einem Statuscode von `404` aus, wenn der Client einen Artikel mit einer nicht existierenden ID anfordert:
{* ../../docs_src/handling_errors/tutorial001.py hl[11] *}
-### Die resultierende Response
+### Die resultierende Response { #the-resulting-response }
-Wenn der Client `http://example.com/items/foo` anfragt (ein `item_id` `"foo"`), erhält dieser Client einen HTTP-Statuscode 200 und folgende JSON-Response:
+Wenn der Client `http://example.com/items/foo` anfordert (ein `item_id` `"foo"`), erhält dieser Client einen HTTP-Statuscode 200 und diese JSON-Response:
```JSON
{
@@ -51,7 +51,7 @@ Wenn der Client `http://example.com/items/foo` anfragt (ein `item_id` `"foo"`),
}
```
-Aber wenn der Client `http://example.com/items/bar` anfragt (ein nicht-existierendes `item_id` `"bar"`), erhält er einen HTTP-Statuscode 404 (der âNot Foundâ-Fehler), und eine JSON-Response wie folgt:
+Aber wenn der Client `http://example.com/items/bar` anfordert (ein nicht-existierendes `item_id` `"bar"`), erhält er einen HTTP-Statuscode 404 (der âNot Foundâ-Error) und eine JSON-Response wie:
```JSON
{
@@ -61,41 +61,41 @@ Aber wenn der Client `http://example.com/items/bar` anfragt (ein nicht-existiere
/// tip | Tipp
-Wenn Sie eine `HTTPException` auslÃļsen, kÃļnnen Sie dem Parameter `detail` jeden Wert Ãŧbergeben, der nach JSON konvertiert werden kann, nicht nur `str`.
+Wenn Sie eine `HTTPException` auslÃļsen, kÃļnnen Sie dem Parameter `detail` jeden Wert Ãŧbergeben, der in JSON konvertiert werden kann, nicht nur `str`.
-Zum Beispiel ein `dict`, eine `list`, usw.
+Sie kÃļnnten ein `dict`, eine `list`, usw. Ãŧbergeben.
-Das wird automatisch von **FastAPI** gehandhabt und der Wert nach JSON konvertiert.
+Diese werden von **FastAPI** automatisch gehandhabt und in JSON konvertiert.
///
-## Benutzerdefinierte Header hinzufÃŧgen
+## Benutzerdefinierte Header hinzufÃŧgen { #add-custom-headers }
-Es gibt Situationen, da ist es nÃŧtzlich, dem HTTP-Error benutzerdefinierte Header hinzufÃŧgen zu kÃļnnen, etwa in einigen Sicherheitsszenarien.
+Es gibt Situationen, in denen es nÃŧtzlich ist, dem HTTP-Error benutzerdefinierte Header hinzuzufÃŧgen. Zum Beispiel in einigen Sicherheitsszenarien.
-Sie mÃŧssen das wahrscheinlich nicht direkt in ihrem Code verwenden.
+Sie werden es wahrscheinlich nicht direkt in Ihrem Code verwenden mÃŧssen.
-Aber falls es in einem fortgeschrittenen Szenario notwendig ist, kÃļnnen Sie benutzerdefinierte Header wie folgt hinzufÃŧgen:
+Aber falls Sie es fÃŧr ein fortgeschrittenes Szenario benÃļtigen, kÃļnnen Sie benutzerdefinierte Header hinzufÃŧgen:
{* ../../docs_src/handling_errors/tutorial002.py hl[14] *}
-## Benutzerdefinierte Exceptionhandler definieren
+## Benutzerdefinierte Exceptionhandler installieren { #install-custom-exception-handlers }
-Sie kÃļnnen benutzerdefinierte Exceptionhandler hinzufÃŧgen, mithilfe derselben Werkzeuge fÃŧr Exceptions von Starlette.
+Sie kÃļnnen benutzerdefinierte Exceptionhandler mit den gleichen Exception-Werkzeugen von Starlette hinzufÃŧgen.
-Nehmen wir an, Sie haben eine benutzerdefinierte Exception `UnicornException`, die Sie (oder eine Bibliothek, die Sie verwenden) `raise`n kÃļnnten.
+Angenommen, Sie haben eine benutzerdefinierte Exception `UnicornException`, die Sie (oder eine Bibliothek, die Sie verwenden) `raise`n kÃļnnten.
Und Sie mÃļchten diese Exception global mit FastAPI handhaben.
-Sie kÃļnnten einen benutzerdefinierten Exceptionhandler mittels `@app.exception_handler()` hinzufÃŧgen:
+Sie kÃļnnten einen benutzerdefinierten Exceptionhandler mit `@app.exception_handler()` hinzufÃŧgen:
{* ../../docs_src/handling_errors/tutorial003.py hl[5:7,13:18,24] *}
-Wenn Sie nun `/unicorns/yolo` anfragen, `raise`d die *Pfadoperation* eine `UnicornException`.
+Hier, wenn Sie `/unicorns/yolo` anfordern, wird die *Pfadoperation* eine `UnicornException` `raise`n.
Aber diese wird von `unicorn_exception_handler` gehandhabt.
-Sie erhalten also einen sauberen Error mit einem Statuscode `418` und dem JSON-Inhalt:
+Sie erhalten also einen sauberen Fehler mit einem HTTP-Statuscode von `418` und dem JSON-Inhalt:
```JSON
{"message": "Oops! yolo did something. There goes a rainbow..."}
@@ -103,33 +103,33 @@ Sie erhalten also einen sauberen Error mit einem Statuscode `418` und dem JSON-I
/// note | Technische Details
-Sie kÃļnnen auch `from starlette.requests import Request` und `from starlette.responses import JSONResponse` verwenden.
+Sie kÃļnnten auch `from starlette.requests import Request` und `from starlette.responses import JSONResponse` verwenden.
-**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit fÃŧr Sie, den Entwickler. Die meisten verfÃŧgbaren Responses kommen aber direkt von Starlette. Das Gleiche gilt fÃŧr `Request`.
+**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, nur als Annehmlichkeit fÃŧr Sie, den Entwickler. Aber die meisten verfÃŧgbaren Responses kommen direkt von Starlette. Dasselbe gilt fÃŧr `Request`.
///
-## Die Default-Exceptionhandler Ãŧberschreiben
+## Die Default-Exceptionhandler Ãŧberschreiben { #override-the-default-exception-handlers }
**FastAPI** hat einige Default-Exceptionhandler.
-Diese Handler kÃŧmmern sich darum, Default-JSON-Responses zurÃŧckzugeben, wenn Sie eine `HTTPException` `raise`n, und wenn der Request ungÃŧltige Daten enthält.
+Diese Handler sind dafÃŧr verantwortlich, die Default-JSON-Responses zurÃŧckzugeben, wenn Sie eine `HTTPException` `raise`n und wenn der Request ungÃŧltige Daten enthält.
-Sie kÃļnnen diese Exceptionhandler mit ihren eigenen Ãŧberschreiben.
+Sie kÃļnnen diese Exceptionhandler mit Ihren eigenen Ãŧberschreiben.
-### Requestvalidierung-Exceptions Ãŧberschreiben
+### Ãberschreiben von Request-Validierungs-Exceptions { #override-request-validation-exceptions }
Wenn ein Request ungÃŧltige Daten enthält, lÃļst **FastAPI** intern einen `RequestValidationError` aus.
-Und bietet auch einen Default-Exceptionhandler dafÃŧr.
+Und es enthält auch einen Default-Exceptionhandler fÃŧr diesen.
-Um diesen zu Ãŧberschreiben, importieren Sie den `RequestValidationError` und verwenden Sie ihn in `@app.exception_handler(RequestValidationError)`, um Ihren Exceptionhandler zu dekorieren.
+Um diesen zu Ãŧberschreiben, importieren Sie den `RequestValidationError` und verwenden Sie ihn mit `@app.exception_handler(RequestValidationError)`, um den Exceptionhandler zu dekorieren.
-Der Exceptionhandler wird einen `Request` und die Exception entgegennehmen.
+Der Exceptionhandler erhält einen `Request` und die Exception.
{* ../../docs_src/handling_errors/tutorial004.py hl[2,14:16] *}
-Wenn Sie nun `/items/foo` besuchen, erhalten Sie statt des Default-JSON-Errors:
+Wenn Sie nun zu `/items/foo` gehen, erhalten Sie anstelle des standardmäÃigen JSON-Fehlers mit:
```JSON
{
@@ -146,7 +146,7 @@ Wenn Sie nun `/items/foo` besuchen, erhalten Sie statt des Default-JSON-Errors:
}
```
-eine Textversion:
+eine Textversion mit:
```
1 validation error
@@ -154,27 +154,27 @@ path -> item_id
value is not a valid integer (type=type_error.integer)
```
-#### `RequestValidationError` vs. `ValidationError`
+#### `RequestValidationError` vs. `ValidationError` { #requestvalidationerror-vs-validationerror }
/// warning | Achtung
-Das folgende sind technische Details, die Sie Ãŧberspringen kÃļnnen, wenn sie fÃŧr Sie nicht wichtig sind.
+Dies sind technische Details, die Sie Ãŧberspringen kÃļnnen, wenn sie fÃŧr Sie jetzt nicht wichtig sind.
///
-`RequestValidationError` ist eine Unterklasse von Pydantics `ValidationError`.
+`RequestValidationError` ist eine Unterklasse von Pydantics `ValidationError`.
-**FastAPI** verwendet diesen, sodass Sie, wenn Sie ein Pydantic-Modell fÃŧr `response_model` verwenden, und ihre Daten fehlerhaft sind, einen Fehler in ihrem Log sehen.
+**FastAPI** verwendet diesen so, dass, wenn Sie ein Pydantic-Modell in `response_model` verwenden und Ihre Daten einen Fehler haben, Sie den Fehler in Ihrem Log sehen.
-Aber der Client/Benutzer sieht ihn nicht. Stattdessen erhält der Client einen âInternal Server Errorâ mit einem HTTP-Statuscode `500`.
+Aber der Client/Benutzer wird ihn nicht sehen. Stattdessen erhält der Client einen âInternal Server Errorâ mit einem HTTP-Statuscode `500`.
-Das ist, wie es sein sollte, denn wenn Sie einen Pydantic-`ValidationError` in Ihrer *Response* oder irgendwo sonst in ihrem Code haben (es sei denn, im *Request* des Clients), ist das tatsächlich ein Bug in ihrem Code.
+Es sollte so sein, denn wenn Sie einen Pydantic `ValidationError` in Ihrer *Response* oder irgendwo anders in Ihrem Code haben (nicht im *Request* des Clients), ist es tatsächlich ein Fehler in Ihrem Code.
-Und während Sie den Fehler beheben, sollten ihre Clients/Benutzer keinen Zugriff auf interne Informationen Ãŧber den Fehler haben, da das eine SicherheitslÃŧcke aufdecken kÃļnnte.
+Und während Sie den Fehler beheben, sollten Ihre Clients/Benutzer keinen Zugriff auf interne Informationen Ãŧber den Fehler haben, da das eine SicherheitslÃŧcke aufdecken kÃļnnte.
-### den `HTTPException`-Handler Ãŧberschreiben
+### Ãberschreiben des `HTTPException`-Fehlerhandlers { #override-the-httpexception-error-handler }
-Genauso kÃļnnen Sie den `HTTPException`-Handler Ãŧberschreiben.
+Auf die gleiche Weise kÃļnnen Sie den `HTTPException`-Handler Ãŧberschreiben.
Zum Beispiel kÃļnnten Sie eine Klartext-Response statt JSON fÃŧr diese Fehler zurÃŧckgeben wollen:
@@ -182,21 +182,21 @@ Zum Beispiel kÃļnnten Sie eine Klartext-Response statt JSON fÃŧr diese Fehler zu
/// note | Technische Details
-Sie kÃļnnen auch `from starlette.responses import PlainTextResponse` verwenden.
+Sie kÃļnnten auch `from starlette.responses import PlainTextResponse` verwenden.
-**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit fÃŧr Sie, den Entwickler. Die meisten verfÃŧgbaren Responses kommen aber direkt von Starlette.
+**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, nur als Annehmlichkeit fÃŧr Sie, den Entwickler. Aber die meisten verfÃŧgbaren Responses kommen direkt von Starlette.
///
-### Den `RequestValidationError`-Body verwenden
+### Verwenden des `RequestValidationError`-Bodys { #use-the-requestvalidationerror-body }
Der `RequestValidationError` enthält den empfangenen `body` mit den ungÃŧltigen Daten.
-Sie kÃļnnten diesen verwenden, während Sie Ihre Anwendung entwickeln, um den Body zu loggen und zu debuggen, ihn zum Benutzer zurÃŧckzugeben, usw.
+Sie kÃļnnten diesen während der Entwicklung Ihrer Anwendung verwenden, um den Body zu loggen und zu debuggen, ihn an den Benutzer zurÃŧckzugeben usw.
{* ../../docs_src/handling_errors/tutorial005.py hl[14] *}
-Jetzt versuchen Sie, einen ungÃŧltigen Artikel zu senden:
+Versuchen Sie nun, einen ungÃŧltigen Artikel zu senden:
```JSON
{
@@ -205,7 +205,7 @@ Jetzt versuchen Sie, einen ungÃŧltigen Artikel zu senden:
}
```
-Sie erhalten eine Response, die Ihnen sagt, dass die Daten ungÃŧltig sind, und welche den empfangenen Body enthält.
+Sie erhalten eine Response, die Ihnen sagt, dass die Daten ungÃŧltig sind und die den empfangenen Body enthält:
```JSON hl_lines="12-15"
{
@@ -226,30 +226,30 @@ Sie erhalten eine Response, die Ihnen sagt, dass die Daten ungÃŧltig sind, und w
}
```
-#### FastAPIs `HTTPException` vs. Starlettes `HTTPException`
+#### FastAPIs `HTTPException` vs. Starlettes `HTTPException` { #fastapis-httpexception-vs-starlettes-httpexception }
**FastAPI** hat seine eigene `HTTPException`.
-Und **FastAPI**s `HTTPException`-Fehlerklasse erbt von Starlettes `HTTPException`-Fehlerklasse.
+Und die `HTTPException`-Fehlerklasse von **FastAPI** erbt von der `HTTPException`-Fehlerklasse von Starlette.
-Der einzige Unterschied besteht darin, dass **FastAPIs** `HTTPException` alles fÃŧr das Feld `detail` akzeptiert, was nach JSON konvertiert werden kann, während Starlettes `HTTPException` nur Strings zulässt.
+Der einzige Unterschied besteht darin, dass die `HTTPException` von **FastAPI** beliebige JSON-konvertierbare Daten fÃŧr das `detail`-Feld akzeptiert, während die `HTTPException` von Starlette nur Strings dafÃŧr akzeptiert.
-Sie kÃļnnen also weiterhin **FastAPI**s `HTTPException` wie Ãŧblich in Ihrem Code auslÃļsen.
+Sie kÃļnnen also weiterhin die `HTTPException` von **FastAPI** wie Ãŧblich in Ihrem Code auslÃļsen.
-Aber wenn Sie einen Exceptionhandler registrieren, registrieren Sie ihn fÃŧr Starlettes `HTTPException`.
+Aber wenn Sie einen Exceptionhandler registrieren, sollten Sie ihn fÃŧr die `HTTPException` von Starlette registrieren.
-Auf diese Weise wird Ihr Handler, wenn irgendein Teil von Starlettes internem Code, oder eine Starlette-Erweiterung, oder -Plugin eine Starlette-`HTTPException` auslÃļst, in der Lage sein, diese zu fangen und zu handhaben.
+Auf diese Weise, wenn irgendein Teil des internen Codes von Starlette, oder eine Starlette-Erweiterung oder ein Plug-in, eine Starlette `HTTPException` auslÃļst, wird Ihr Handler in der Lage sein, diese abzufangen und zu handhaben.
-Damit wir in diesem Beispiel beide `HTTPException`s im selben Code haben kÃļnnen, benennen wir Starlettes Exception um zu `StarletteHTTPException`:
+Um in diesem Beispiel beide `HTTPException`s im selben Code zu haben, wird die Exception von Starlette zu `StarletteHTTPException` umbenannt:
```Python
from starlette.exceptions import HTTPException as StarletteHTTPException
```
-### **FastAPI**s Exceptionhandler wiederverwenden
+### Die Exceptionhandler von **FastAPI** wiederverwenden { #reuse-fastapis-exception-handlers }
-Wenn Sie die Exception zusammen mit denselben Default-Exceptionhandlern von **FastAPI** verwenden mÃļchten, kÃļnnen Sie die Default-Exceptionhandler von `fastapi.Exception_handlers` importieren und wiederverwenden:
+Wenn Sie die Exception zusammen mit den gleichen Default-Exceptionhandlern von **FastAPI** verwenden mÃļchten, kÃļnnen Sie die Default-Exceptionhandler aus `fastapi.exception_handlers` importieren und wiederverwenden:
{* ../../docs_src/handling_errors/tutorial006.py hl[2:5,15,21] *}
-In diesem Beispiel `print`en Sie nur den Fehler mit einer sehr ausdrucksstarken Nachricht, aber Sie sehen, worauf wir hinauswollen. Sie kÃļnnen mit der Exception etwas machen und dann einfach die Default-Exceptionhandler wiederverwenden.
+In diesem Beispiel geben Sie nur den Fehler mit einer sehr ausdrucksstarken Nachricht aus, aber Sie verstehen das Prinzip. Sie kÃļnnen die Exception verwenden und dann einfach die Default-Exceptionhandler wiederverwenden.
diff --git a/docs/de/docs/tutorial/header-param-models.md b/docs/de/docs/tutorial/header-param-models.md
new file mode 100644
index 000000000..8c1bf61ae
--- /dev/null
+++ b/docs/de/docs/tutorial/header-param-models.md
@@ -0,0 +1,72 @@
+# Header-Parameter-Modelle { #header-parameter-models }
+
+Wenn Sie eine Gruppe verwandter **Header-Parameter** haben, kÃļnnen Sie ein **Pydantic-Modell** erstellen, um diese zu deklarieren.
+
+Dadurch kÃļnnen Sie das **Modell an mehreren Stellen wiederverwenden** und auch Validierungen und Metadaten fÃŧr alle Parameter gleichzeitig deklarieren. đ
+
+/// note | Hinweis
+
+Dies wird seit FastAPI Version `0.115.0` unterstÃŧtzt. đ¤
+
+///
+
+## Header-Parameter mit einem Pydantic-Modell { #header-parameters-with-a-pydantic-model }
+
+Deklarieren Sie die erforderlichen **Header-Parameter** in einem **Pydantic-Modell** und dann den Parameter als `Header`:
+
+{* ../../docs_src/header_param_models/tutorial001_an_py310.py hl[9:14,18] *}
+
+**FastAPI** wird die Daten fÃŧr **jedes Feld** aus den **Headern** des Request extrahieren und Ihnen das von Ihnen definierte Pydantic-Modell geben.
+
+## Die Dokumentation testen { #check-the-docs }
+
+Sie kÃļnnen die erforderlichen Header in der Dokumentationsoberfläche unter `/docs` sehen:
+
+
+contact-Felder| Parameter | Typ | Beschreibung |
|---|---|---|
name | str | Der identifizierende Name der Kontaktperson/Organisation. |
url | str | Die URL, die auf die Kontaktinformationen verweist. MUSS im Format einer URL vorliegen. |
email | str | Die E-Mail-Adresse der Kontaktperson/Organisation. MUSS im Format einer E-Mail-Adresse vorliegen. |
license_info-Felder| Parameter | Typ | Beschreibung |
|---|---|---|
name | str | ERFORDERLICH (wenn eine license_info festgelegt ist). Der fÃŧr die API verwendete Lizenzname. |
identifier | str | Ein SPDX-Lizenzausdruck fÃŧr die API. Das Feld identifier und das Feld url schlieÃen sich gegenseitig aus. VerfÃŧgbar seit OpenAPI 3.1.0, FastAPI 0.99.0. |
url | str | Eine URL zur Lizenz, die fÃŧr die API verwendet wird. MUSS im Format einer URL vorliegen. |
contact-Felder| Parameter | Typ | Beschreibung |
|---|---|---|
name | str | Der identifizierende Name der Kontaktperson/Organisation. |
url | str | Die URL, die auf die Kontaktinformationen verweist. MUSS im Format einer URL vorliegen. |
email | str | Die E-Mail-Adresse der Kontaktperson/Organisation. MUSS im Format einer E-Mail-Adresse vorliegen. |
license_info-Felder| Parameter | Typ | Beschreibung |
|---|---|---|
name | str | ERFORDERLICH (wenn eine license_info festgelegt ist). Der fÃŧr die API verwendete Lizenzname. |
identifier | str | Ein SPDX-Lizenzausdruck fÃŧr die API. Das Feld identifier und das Feld url schlieÃen sich gegenseitig aus. VerfÃŧgbar seit OpenAPI 3.1.0, FastAPI 0.99.0. |
url | str | Eine URL zur Lizenz, die fÃŧr die API verwendet wird. MUSS im Format einer URL vorliegen. |
-## Lizenz-ID
+## Lizenzkennung { #license-identifier }
Seit OpenAPI 3.1.0 und FastAPI 0.99.0 kÃļnnen Sie die `license_info` auch mit einem `identifier` anstelle einer `url` festlegen.
@@ -38,29 +38,29 @@ Zum Beispiel:
{* ../../docs_src/metadata/tutorial001_1.py hl[31] *}
-## Metadaten fÃŧr Tags
+## Metadaten fÃŧr Tags { #metadata-for-tags }
-Sie kÃļnnen mit dem Parameter `openapi_tags` auch zusätzliche Metadaten fÃŧr die verschiedenen Tags hinzufÃŧgen, die zum Gruppieren Ihrer Pfadoperationen verwendet werden.
+Sie kÃļnnen auch zusätzliche Metadaten fÃŧr die verschiedenen Tags hinzufÃŧgen, die zum Gruppieren Ihrer Pfadoperationen verwendet werden, mit dem Parameter `openapi_tags`.
-Es wird eine Liste benÃļtigt, die fÃŧr jedes Tag ein Dict enthält.
+Er nimmt eine Liste entgegen, die fÃŧr jeden Tag ein Dictionary enthält.
-Jedes Dict kann Folgendes enthalten:
+Jedes Dictionary kann Folgendes enthalten:
* `name` (**erforderlich**): ein `str` mit demselben Tag-Namen, den Sie im Parameter `tags` in Ihren *Pfadoperationen* und `APIRouter`n verwenden.
* `description`: ein `str` mit einer kurzen Beschreibung fÃŧr das Tag. Sie kann Markdown enthalten und wird in der Benutzeroberfläche der Dokumentation angezeigt.
* `externalDocs`: ein `dict`, das externe Dokumentation beschreibt mit:
- * `description`: ein `str` mit einer kurzen Beschreibung fÃŧr die externe Dokumentation.
- * `url` (**erforderlich**): ein `str` mit der URL fÃŧr die externe Dokumentation.
+ * `description`: ein `str` mit einer kurzen Beschreibung fÃŧr die externe Dokumentation.
+ * `url` (**erforderlich**): ein `str` mit der URL fÃŧr die externe Dokumentation.
-### Metadaten fÃŧr Tags erstellen
+### Metadaten fÃŧr Tags erstellen { #create-metadata-for-tags }
-Versuchen wir das an einem Beispiel mit Tags fÃŧr `users` und `items`.
+Versuchen wir es mit einem Beispiel mit Tags fÃŧr `users` und `items`.
-Erstellen Sie Metadaten fÃŧr Ihre Tags und Ãŧbergeben Sie sie an den Parameter `openapi_tags`:
+Erstellen Sie Metadaten fÃŧr Ihre Tags und Ãŧbergeben Sie diese an den Parameter `openapi_tags`:
{* ../../docs_src/metadata/tutorial004.py hl[3:16,18] *}
-Beachten Sie, dass Sie Markdown in den Beschreibungen verwenden kÃļnnen. Beispielsweise wird âloginâ in Fettschrift (**login**) und âfancyâ in Kursivschrift (_fancy_) angezeigt.
+Beachten Sie, dass Sie Markdown innerhalb der Beschreibungen verwenden kÃļnnen. Zum Beispiel wird âloginâ in Fettschrift (**login**) und âfancyâ in Kursivschrift (_fancy_) angezeigt.
/// tip | Tipp
@@ -68,31 +68,31 @@ Sie mÃŧssen nicht fÃŧr alle von Ihnen verwendeten Tags Metadaten hinzufÃŧgen.
///
-### Ihre Tags verwenden
+### Ihre Tags verwenden { #use-your-tags }
Verwenden Sie den Parameter `tags` mit Ihren *Pfadoperationen* (und `APIRouter`n), um diese verschiedenen Tags zuzuweisen:
{* ../../docs_src/metadata/tutorial004.py hl[21,26] *}
-/// info
+/// info | Info
Lesen Sie mehr zu Tags unter [Pfadoperation-Konfiguration](path-operation-configuration.md#tags){.internal-link target=_blank}.
///
-### Die Dokumentation anschauen
+### Die Dokumentation testen { #check-the-docs }
Wenn Sie nun die Dokumentation ansehen, werden dort alle zusätzlichen Metadaten angezeigt:
-### Reihenfolge der Tags
+### Reihenfolge der Tags { #order-of-tags }
-Die Reihenfolge der Tag-Metadaten-Dicts definiert auch die Reihenfolge, in der diese in der Benutzeroberfläche der Dokumentation angezeigt werden.
+Die Reihenfolge der Tag-Metadaten-Dictionarys definiert auch die Reihenfolge, in der diese in der Benutzeroberfläche der Dokumentation angezeigt werden.
-Auch wenn beispielsweise `users` im Alphabet nach `items` kommt, wird es vor diesen angezeigt, da wir seine Metadaten als erstes Dict der Liste hinzugefÃŧgt haben.
+Auch wenn beispielsweise `users` im Alphabet nach `items` kommt, wird es vor diesen angezeigt, da wir deren Metadaten als erstes Dictionary der Liste hinzugefÃŧgt haben.
-## OpenAPI-URL
+## OpenAPI-URL { #openapi-url }
StandardmäÃig wird das OpenAPI-Schema unter `/openapi.json` bereitgestellt.
@@ -104,16 +104,16 @@ Um beispielsweise festzulegen, dass es unter `/api/v1/openapi.json` bereitgestel
Wenn Sie das OpenAPI-Schema vollständig deaktivieren mÃļchten, kÃļnnen Sie `openapi_url=None` festlegen, wodurch auch die Dokumentationsbenutzeroberflächen deaktiviert werden, die es verwenden.
-## URLs der Dokumentationen
+## Dokumentations-URLs { #docs-urls }
Sie kÃļnnen die beiden enthaltenen Dokumentationsbenutzeroberflächen konfigurieren:
* **Swagger UI**: bereitgestellt unter `/docs`.
- * Sie kÃļnnen deren URL mit dem Parameter `docs_url` festlegen.
- * Sie kÃļnnen sie deaktivieren, indem Sie `docs_url=None` festlegen.
+ * Sie kÃļnnen deren URL mit dem Parameter `docs_url` festlegen.
+ * Sie kÃļnnen sie deaktivieren, indem Sie `docs_url=None` festlegen.
* **ReDoc**: bereitgestellt unter `/redoc`.
- * Sie kÃļnnen deren URL mit dem Parameter `redoc_url` festlegen.
- * Sie kÃļnnen sie deaktivieren, indem Sie `redoc_url=None` festlegen.
+ * Sie kÃļnnen deren URL mit dem Parameter `redoc_url` festlegen.
+ * Sie kÃļnnen sie deaktivieren, indem Sie `redoc_url=None` festlegen.
Um beispielsweise Swagger UI so einzustellen, dass sie unter `/documentation` bereitgestellt wird, und ReDoc zu deaktivieren:
diff --git a/docs/de/docs/tutorial/middleware.md b/docs/de/docs/tutorial/middleware.md
index d3699be1b..a1e2ba9df 100644
--- a/docs/de/docs/tutorial/middleware.md
+++ b/docs/de/docs/tutorial/middleware.md
@@ -1,8 +1,8 @@
-# Middleware
+# Middleware { #middleware }
Sie kÃļnnen Middleware zu **FastAPI**-Anwendungen hinzufÃŧgen.
-Eine âMiddlewareâ ist eine Funktion, die mit jedem **Request** arbeitet, bevor er von einer bestimmten *Pfadoperation* verarbeitet wird. Und auch mit jeder **Response**, bevor sie zurÃŧckgegeben wird.
+Eine âMiddlewareâ ist eine Funktion, die mit jedem **Request** arbeitet, bevor er von einer bestimmten *Pfadoperation* verarbeitet wird. Und auch mit jeder **Response**, bevor sie zurÃŧckgegeben wird.
* Sie nimmt jeden **Request** entgegen, der an Ihre Anwendung gesendet wird.
* Sie kann dann etwas mit diesem **Request** tun oder beliebigen Code ausfÃŧhren.
@@ -15,11 +15,11 @@ Eine âMiddlewareâ ist eine Funktion, die mit jedem **Request** arbeitet, bev
Wenn Sie Abhängigkeiten mit `yield` haben, wird der Exit-Code *nach* der Middleware ausgefÃŧhrt.
-Wenn es Hintergrundaufgaben gab (später dokumentiert), werden sie *nach* allen Middlewares ausgefÃŧhrt.
+Wenn es Hintergrundtasks gab (dies wird später im [Hintergrundtasks](background-tasks.md){.internal-link target=_blank}-Abschnitt behandelt), werden sie *nach* allen Middlewares ausgefÃŧhrt.
///
-## Erstellung einer Middleware
+## Eine Middleware erstellen { #create-a-middleware }
Um eine Middleware zu erstellen, verwenden Sie den Dekorator `@app.middleware("http")` Ãŧber einer Funktion.
@@ -35,9 +35,9 @@ Die Middleware-Funktion erhält:
/// tip | Tipp
-Beachten Sie, dass benutzerdefinierte proprietäre Header hinzugefÃŧgt werden kÃļnnen. Verwenden Sie dafÃŧr das Präfix 'X-'.
+Beachten Sie, dass benutzerdefinierte proprietäre Header hinzugefÃŧgt werden kÃļnnen unter Verwendung des `X-`-Präfixes.
-Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen soll, mÃŧssen Sie sie zu Ihrer CORS-Konfigurationen ([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank}) hinzufÃŧgen, indem Sie den Parameter `expose_headers` verwenden, der in der Starlette-CORS-Dokumentation dokumentiert ist.
+Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen soll, mÃŧssen Sie sie zu Ihrer CORS-Konfiguration ([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank}) hinzufÃŧgen, indem Sie den Parameter `expose_headers` verwenden, der in der Starlettes CORS-Dokumentation dokumentiert ist.
///
@@ -49,7 +49,7 @@ Sie kÃļnnten auch `from starlette.requests import Request` verwenden.
///
-### Vor und nach der `response`
+### Vor und nach der `response` { #before-and-after-the-response }
Sie kÃļnnen Code hinzufÃŧgen, der mit dem `request` ausgefÃŧhrt wird, bevor dieser von einer beliebigen *Pfadoperation* empfangen wird.
@@ -59,8 +59,37 @@ Sie kÃļnnten beispielsweise einen benutzerdefinierten Header `X-Process-Time` hi
{* ../../docs_src/middleware/tutorial001.py hl[10,12:13] *}
-## Andere Middlewares
+/// tip | Tipp
-Sie kÃļnnen später mehr Ãŧber andere Middlewares in [Handbuch fÃŧr fortgeschrittene Benutzer: Fortgeschrittene Middleware](../advanced/middleware.md){.internal-link target=_blank} lesen.
+Hier verwenden wir `time.perf_counter()` anstelle von `time.time()`, da es fÃŧr diese Anwendungsfälle präziser sein kann. đ¤
-In der nächsten Sektion erfahren Sie, wie Sie CORS mit einer Middleware behandeln kÃļnnen.
+///
+
+## AusfÃŧhrungsreihenfolge bei mehreren Middlewares { #multiple-middleware-execution-order }
+
+Wenn Sie mehrere Middlewares hinzufÃŧgen, entweder mit dem `@app.middleware()` Dekorator oder der Methode `app.add_middleware()`, umschlieÃt jede neue Middleware die Anwendung und bildet einen Stapel. Die zuletzt hinzugefÃŧgte Middleware ist die *äuÃerste*, und die erste ist die *innerste*.
+
+Auf dem Requestpfad läuft die *äuÃerste* Middleware zuerst.
+
+Auf dem Responsepfad läuft sie zuletzt.
+
+Zum Beispiel:
+
+```Python
+app.add_middleware(MiddlewareA)
+app.add_middleware(MiddlewareB)
+```
+
+Dies fÃŧhrt zu folgender AusfÃŧhrungsreihenfolge:
+
+* **Request**: MiddlewareB â MiddlewareA â Route
+
+* **Response**: Route â MiddlewareA â MiddlewareB
+
+Dieses Stapelverhalten stellt sicher, dass Middlewares in einer vorhersehbaren und kontrollierbaren Reihenfolge ausgefÃŧhrt werden.
+
+## Andere Middlewares { #other-middlewares }
+
+Sie kÃļnnen später mehr Ãŧber andere Middlewares im [Handbuch fÃŧr fortgeschrittene Benutzer: Fortgeschrittene Middleware](../advanced/middleware.md){.internal-link target=_blank} lesen.
+
+In der nächsten Sektion erfahren Sie, wie Sie CORS mit einer Middleware behandeln kÃļnnen.
diff --git a/docs/de/docs/tutorial/path-operation-configuration.md b/docs/de/docs/tutorial/path-operation-configuration.md
index 7473e515b..c483f4e40 100644
--- a/docs/de/docs/tutorial/path-operation-configuration.md
+++ b/docs/de/docs/tutorial/path-operation-configuration.md
@@ -1,6 +1,6 @@
-# Pfadoperation-Konfiguration
+# Pfadoperation-Konfiguration { #path-operation-configuration }
-Es gibt mehrere Konfigurations-Parameter, die Sie Ihrem *Pfadoperation-Dekorator* Ãŧbergeben kÃļnnen.
+Es gibt mehrere Parameter, die Sie Ihrem *Pfadoperation-Dekorator* Ãŧbergeben kÃļnnen, um ihn zu konfigurieren.
/// warning | Achtung
@@ -8,13 +8,13 @@ Beachten Sie, dass diese Parameter direkt dem *Pfadoperation-Dekorator* Ãŧbergeb
///
-## Response-Statuscode
+## Response-Statuscode { #response-status-code }
-Sie kÃļnnen den (HTTP-)`status_code` definieren, den die Response Ihrer *Pfadoperation* verwenden soll.
+Sie kÃļnnen den (HTTP-)`status_code` definieren, der in der Response Ihrer *Pfadoperation* verwendet werden soll.
Sie kÃļnnen direkt den `int`-Code Ãŧbergeben, etwa `404`.
-Aber falls Sie sich nicht mehr erinnern, wofÃŧr jede Nummer steht, kÃļnnen Sie die AbkÃŧrzungs-Konstanten in `status` verwenden:
+Aber falls Sie sich nicht mehr erinnern, wofÃŧr jeder Nummerncode steht, kÃļnnen Sie die AbkÃŧrzungs-Konstanten in `status` verwenden:
{* ../../docs_src/path_operation_configuration/tutorial001_py310.py hl[1,15] *}
@@ -28,9 +28,9 @@ Sie kÃļnnen auch `from starlette import status` verwenden.
///
-## Tags
+## Tags { #tags }
-Sie kÃļnnen Ihrer *Pfadoperation* Tags hinzufÃŧgen, mittels des Parameters `tags`, dem eine `list`e von `str`s Ãŧbergeben wird (in der Regel nur ein `str`):
+Sie kÃļnnen Ihrer *Pfadoperation* Tags hinzufÃŧgen, indem Sie dem Parameter `tags` eine `list`e von `str`s Ãŧbergeben (in der Regel nur ein `str`):
{* ../../docs_src/path_operation_configuration/tutorial002_py310.py hl[15,20,25] *}
@@ -38,47 +38,47 @@ Diese werden zum OpenAPI-Schema hinzugefÃŧgt und von den automatischen Dokumenta
-### Tags mittels Enumeration
+### Tags mittels Enumeration { #tags-with-enums }
-Wenn Sie eine groÃe Anwendung haben, kÃļnnen sich am Ende **viele Tags** anhäufen, und Sie mÃļchten sicherstellen, dass Sie fÃŧr verwandte *Pfadoperationen* immer den **gleichen Tag** nehmen.
+Wenn Sie eine groÃe Anwendung haben, kÃļnnen sich am Ende **viele Tags** anhäufen, und Sie mÃļchten sicherstellen, dass Sie fÃŧr verwandte *Pfadoperationen* immer den **gleichen Tag** verwenden.
In diesem Fall macht es Sinn, die Tags in einem `Enum` zu speichern.
-**FastAPI** unterstÃŧtzt diese genauso wie einfache Strings:
+**FastAPI** unterstÃŧtzt das auf die gleiche Weise wie einfache Strings:
{* ../../docs_src/path_operation_configuration/tutorial002b.py hl[1,8:10,13,18] *}
-## Zusammenfassung und Beschreibung
+## Zusammenfassung und Beschreibung { #summary-and-description }
-Sie kÃļnnen eine Zusammenfassung (`summary`) und eine Beschreibung (`description`) hinzufÃŧgen:
+Sie kÃļnnen eine `summary` und eine `description` hinzufÃŧgen:
{* ../../docs_src/path_operation_configuration/tutorial003_py310.py hl[18:19] *}
-## Beschreibung mittels Docstring
+## Beschreibung mittels Docstring { #description-from-docstring }
Da Beschreibungen oft mehrere Zeilen lang sind, kÃļnnen Sie die Beschreibung der *Pfadoperation* im Docstring der Funktion deklarieren, und **FastAPI** wird sie daraus auslesen.
-Sie kÃļnnen im Docstring Markdown schreiben, es wird korrekt interpretiert und angezeigt (die EinrÃŧckung des Docstring beachtend).
+Sie kÃļnnen Markdown im Docstring schreiben, es wird korrekt interpretiert und angezeigt (unter BerÃŧcksichtigung der EinrÃŧckung des Docstring).
{* ../../docs_src/path_operation_configuration/tutorial004_py310.py hl[17:25] *}
-In der interaktiven Dokumentation sieht das dann so aus:
+Es wird in der interaktiven Dokumentation verwendet:
-## Beschreibung der Response
+## Beschreibung der Response { #response-description }
-Die Response kÃļnnen Sie mit dem Parameter `response_description` beschreiben:
+Sie kÃļnnen die Response mit dem Parameter `response_description` beschreiben:
{* ../../docs_src/path_operation_configuration/tutorial005_py310.py hl[19] *}
-/// info
+/// info | Info
-beachten Sie, dass sich `response_description` speziell auf die Response bezieht, während `description` sich generell auf die *Pfadoperation* bezieht.
+Beachten Sie, dass sich `response_description` speziell auf die Response bezieht, während `description` sich generell auf die *Pfadoperation* bezieht.
///
-/// check
+/// check | Testen
OpenAPI verlangt, dass jede *Pfadoperation* Ãŧber eine Beschreibung der Response verfÃŧgt.
@@ -88,13 +88,13 @@ Daher, wenn Sie keine vergeben, wird **FastAPI** automatisch eine fÃŧr âErfolg
-## Eine *Pfadoperation* deprecaten
+## Eine *Pfadoperation* deprecaten { #deprecate-a-path-operation }
-Wenn Sie eine *Pfadoperation* als deprecated kennzeichnen mÃļchten, ohne sie zu entfernen, fÃŧgen Sie den Parameter `deprecated` hinzu:
+Wenn Sie eine *Pfadoperation* als deprecatet kennzeichnen mÃļchten, ohne sie zu entfernen, fÃŧgen Sie den Parameter `deprecated` hinzu:
{* ../../docs_src/path_operation_configuration/tutorial006.py hl[16] *}
-Sie wird in der interaktiven Dokumentation gut sichtbar als deprecated markiert werden:
+Sie wird in der interaktiven Dokumentation gut sichtbar als deprecatet markiert werden:
@@ -102,6 +102,6 @@ Vergleichen Sie, wie deprecatete und nicht-deprecatete *Pfadoperationen* aussehe
-## Zusammenfassung
+## Zusammenfassung { #recap }
Sie kÃļnnen auf einfache Weise Metadaten fÃŧr Ihre *Pfadoperationen* definieren, indem Sie den *Pfadoperation-Dekoratoren* Parameter hinzufÃŧgen.
diff --git a/docs/de/docs/tutorial/path-params-numeric-validations.md b/docs/de/docs/tutorial/path-params-numeric-validations.md
index 1acdd5b4e..5b7474944 100644
--- a/docs/de/docs/tutorial/path-params-numeric-validations.md
+++ b/docs/de/docs/tutorial/path-params-numeric-validations.md
@@ -1,169 +1,154 @@
-# Pfad-Parameter und Validierung von Zahlen
+# Pfad-Parameter und Validierung von Zahlen { #path-parameters-and-numeric-validations }
-So wie Sie mit `Query` fÃŧr Query-Parameter zusätzliche Validierungen und Metadaten hinzufÃŧgen kÃļnnen, kÃļnnen Sie das mittels `Path` auch fÃŧr Pfad-Parameter tun.
+So wie Sie mit `Query` fÃŧr Query-Parameter zusätzliche Validierungen und Metadaten deklarieren kÃļnnen, kÃļnnen Sie mit `Path` die gleichen Validierungen und Metadaten fÃŧr Pfad-Parameter deklarieren.
-## `Path` importieren
+## `Path` importieren { #import-path }
-Importieren Sie zuerst `Path` von `fastapi`, und importieren Sie `Annotated`.
+Importieren Sie zuerst `Path` von `fastapi`, und importieren Sie `Annotated`:
{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *}
-/// info
+/// info | Info
-FastAPI unterstÃŧtzt (und empfiehlt die Verwendung von) `Annotated` seit Version 0.95.0.
+FastAPI hat in Version 0.95.0 UnterstÃŧtzung fÃŧr `Annotated` hinzugefÃŧgt und es zur Verwendung empfohlen.
-Wenn Sie eine ältere Version haben, werden Sie Fehler angezeigt bekommen, wenn Sie versuchen, `Annotated` zu verwenden.
+Wenn Sie eine ältere Version haben, wÃŧrden Fehler angezeigt werden, wenn Sie versuchen, `Annotated` zu verwenden.
-Bitte [aktualisieren Sie FastAPI](../deployment/versions.md#upgrade-der-fastapi-versionen){.internal-link target=_blank} daher mindestens zu Version 0.95.1, bevor Sie `Annotated` verwenden.
+Stellen Sie sicher, dass Sie [FastAPI aktualisieren](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank}, auf mindestens Version 0.95.1, bevor Sie `Annotated` verwenden.
///
-## Metadaten deklarieren
+## Metadaten deklarieren { #declare-metadata }
-Sie kÃļnnen die gleichen Parameter deklarieren wie fÃŧr `Query`.
+Sie kÃļnnen dieselben Parameter wie fÃŧr `Query` deklarieren.
-Um zum Beispiel einen `title`-Metadaten-Wert fÃŧr den Pfad-Parameter `item_id` zu deklarieren, schreiben Sie:
+Um zum Beispiel einen `title`-Metadaten-Wert fÃŧr den Pfad-Parameter `item_id` zu deklarieren, kÃļnnen Sie schreiben:
{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[10] *}
/// note | Hinweis
-Ein Pfad-Parameter ist immer erforderlich, weil er Teil des Pfads sein muss.
-
-Sie sollten ihn daher mit `...` deklarieren, um ihn als erforderlich auszuzeichnen.
-
-Doch selbst wenn Sie ihn mit `None` deklarieren, oder einen Defaultwert setzen, bewirkt das nichts, er bleibt immer erforderlich.
+Ein Pfad-Parameter ist immer erforderlich, da er Teil des Pfads sein muss. Selbst wenn Sie ihn mit `None` deklarieren oder einen Defaultwert setzen, wÃŧrde das nichts ändern, er wäre dennoch immer erforderlich.
///
-## Sortieren Sie die Parameter, wie Sie mÃļchten
+## Die Parameter sortieren, wie Sie mÃļchten { #order-the-parameters-as-you-need }
/// tip | Tipp
-Wenn Sie `Annotated` verwenden, ist das folgende nicht so wichtig / nicht notwendig.
+Das ist wahrscheinlich nicht so wichtig oder notwendig, wenn Sie `Annotated` verwenden.
///
-Nehmen wir an, Sie mÃļchten den Query-Parameter `q` als erforderlichen `str` deklarieren.
+Angenommen, Sie mÃļchten den Query-Parameter `q` als erforderlichen `str` deklarieren.
-Und Sie mÃŧssen sonst nichts anderes fÃŧr den Parameter deklarieren, Sie brauchen also nicht wirklich `Query`.
+Und Sie mÃŧssen sonst nichts anderes fÃŧr diesen Parameter deklarieren, Sie brauchen also `Query` nicht wirklich.
-Aber Sie brauchen `Path` fÃŧr den `item_id`-Pfad-Parameter. Und Sie mÃļchten aus irgendeinem Grund nicht `Annotated` verwenden.
+Aber Sie mÃŧssen dennoch `Path` fÃŧr den `item_id`-Pfad-Parameter verwenden. Und aus irgendeinem Grund mÃļchten Sie `Annotated` nicht verwenden.
-Python wird sich beschweren, wenn Sie einen Parameter mit Defaultwert vor einen Parameter ohne Defaultwert setzen.
+Python wird sich beschweren, wenn Sie einen Wert mit einem âDefaultâ vor einem Wert ohne âDefaultâ setzen.
-Aber Sie kÃļnnen die Reihenfolge der Parameter ändern, den Query-Parameter ohne Defaultwert zuerst.
+Aber Sie kÃļnnen die Reihenfolge ändern und den Wert ohne Default (den Query-Parameter `q`) zuerst setzen.
-FÃŧr **FastAPI** ist es nicht wichtig. Es erkennt die Parameter anhand ihres Namens, ihrer Typen, und ihrer Defaultwerte (`Query`, `Path`, usw.). Es kÃŧmmert sich nicht um die Reihenfolge.
+FÃŧr **FastAPI** spielt es keine Rolle. Es erkennt die Parameter anhand ihrer Namen, Typen und Default-Deklarationen (`Query`, `Path`, usw.), es kÃŧmmert sich nicht um die Reihenfolge.
Sie kÃļnnen Ihre Funktion also so deklarieren:
-//// tab | Python 3.8 nicht annotiert
+{* ../../docs_src/path_params_numeric_validations/tutorial002.py hl[7] *}
+
+Aber bedenken Sie, dass Sie dieses Problem nicht haben, wenn Sie `Annotated` verwenden, da es nicht darauf ankommt, dass Sie keine Funktionsparameter-Defaultwerte fÃŧr `Query()` oder `Path()` verwenden.
+
+{* ../../docs_src/path_params_numeric_validations/tutorial002_an_py39.py *}
+
+## Die Parameter sortieren, wie Sie mÃļchten: Tricks { #order-the-parameters-as-you-need-tricks }
/// tip | Tipp
-Bevorzugen Sie die `Annotated`-Version, falls mÃļglich.
+Das ist wahrscheinlich nicht so wichtig oder notwendig, wenn Sie `Annotated` verwenden.
///
-```Python hl_lines="7"
-{!> ../../docs_src/path_params_numeric_validations/tutorial002.py!}
-```
+Hier ist ein **kleiner Trick**, der nÃŧtzlich sein kann, obwohl Sie ihn nicht oft benÃļtigen werden.
-////
+Wenn Sie:
-Aber bedenken Sie, dass Sie dieses Problem nicht haben, wenn Sie `Annotated` verwenden, da Sie nicht die Funktions-Parameter-Defaultwerte fÃŧr `Query()` oder `Path()` verwenden.
+* den `q`-Query-Parameter sowohl ohne `Query` als auch ohne Defaultwert deklarieren
+* den Pfad-Parameter `item_id` mit `Path` deklarieren
+* sie in einer anderen Reihenfolge haben
+* nicht `Annotated` verwenden
-{* ../../docs_src/path_params_numeric_validations/tutorial002_an_py39.py hl[10] *}
+... mÃļchten, dann hat Python eine kleine Spezial-Syntax dafÃŧr.
-## Sortieren Sie die Parameter wie Sie mÃļchten: Tricks
+Ãbergeben Sie `*`, als den ersten Parameter der Funktion.
-/// tip | Tipp
-
-Wenn Sie `Annotated` verwenden, ist das folgende nicht so wichtig / nicht notwendig.
-
-///
-
-Hier ein **kleiner Trick**, der nÃŧtzlich sein kann, aber Sie werden ihn nicht oft brauchen.
-
-Wenn Sie eines der folgenden Dinge tun mÃļchten:
-
-* den `q`-Parameter ohne `Query` oder irgendeinem Defaultwert deklarieren
-* den Pfad-Parameter `item_id` mittels `Path` deklarieren
-* die Parameter in einer unterschiedlichen Reihenfolge haben
-* `Annotated` nicht verwenden
-
-... dann hat Python eine kleine Spezial-Syntax fÃŧr Sie.
-
-Ãbergeben Sie der Funktion `*` als ersten Parameter.
-
-Python macht nichts mit diesem `*`, aber es wird wissen, dass alle folgenden Parameter als Keyword-Argumente (SchlÃŧssel-Wert-Paare), auch bekannt als kwargs, verwendet werden. Selbst wenn diese keinen Defaultwert haben.
+Python wird nichts mit diesem `*` machen, aber es wird wissen, dass alle folgenden Parameter als SchlÃŧsselwortargumente (SchlÃŧssel-Wert-Paare) verwendet werden sollen, auch bekannt als kwargs. Selbst wenn diese keinen Defaultwert haben.
{* ../../docs_src/path_params_numeric_validations/tutorial003.py hl[7] *}
-### Besser mit `Annotated`
+### Besser mit `Annotated` { #better-with-annotated }
-Bedenken Sie, dass Sie, wenn Sie `Annotated` verwenden, dieses Problem nicht haben, weil Sie keine Defaultwerte fÃŧr Ihre Funktionsparameter haben. Sie mÃŧssen daher wahrscheinlich auch nicht `*` verwenden.
+Bedenken Sie, dass Sie, wenn Sie `Annotated` verwenden, da Sie keine Funktionsparameter-Defaultwerte verwenden, dieses Problem nicht haben werden und wahrscheinlich nicht `*` verwenden mÃŧssen.
{* ../../docs_src/path_params_numeric_validations/tutorial003_an_py39.py hl[10] *}
-## Validierung von Zahlen: GrÃļÃer oder gleich
+## Validierung von Zahlen: GrÃļÃer oder gleich { #number-validations-greater-than-or-equal }
-Mit `Query` und `Path` (und anderen, die Sie später kennenlernen), kÃļnnen Sie Zahlenbeschränkungen deklarieren.
+Mit `Query` und `Path` (und anderen, die Sie später sehen werden) kÃļnnen Sie Zahlenbeschränkungen deklarieren.
+
+Hier, mit `ge=1`, muss `item_id` eine ganze Zahl sein, die â`g`reater than or `e`qual toâ (grÃļÃer oder gleich) `1` ist.
-Hier, mit `ge=1`, wird festgelegt, dass `item_id` eine Ganzzahl benÃļtigt, die grÃļÃer oder gleich `1` ist (`g`reater than or `e`qual).
{* ../../docs_src/path_params_numeric_validations/tutorial004_an_py39.py hl[10] *}
-## Validierung von Zahlen: GrÃļÃer und kleiner oder gleich
+## Validierung von Zahlen: GrÃļÃer und kleiner oder gleich { #number-validations-greater-than-and-less-than-or-equal }
-Das Gleiche trifft zu auf:
+Das Gleiche gilt fÃŧr:
-* `gt`: `g`reater `t`han â grÃļÃer als
-* `le`: `l`ess than or `e`qual â kleiner oder gleich
+* `gt`: `g`reater `t`han (grÃļÃer als)
+* `le`: `l`ess than or `e`qual (kleiner oder gleich)
{* ../../docs_src/path_params_numeric_validations/tutorial005_an_py39.py hl[10] *}
-## Validierung von Zahlen: Floats, grÃļÃer und kleiner
+## Validierung von Zahlen: Floats, grÃļÃer und kleiner { #number-validations-floats-greater-than-and-less-than }
-Zahlenvalidierung funktioniert auch fÃŧr `float`-Werte.
+Zahlenvalidierung funktioniert auch fÃŧr `float`-Werte.
-Hier wird es wichtig, in der Lage zu sein, gt zu deklarieren, und nicht nur ge, da Sie hiermit bestimmen kÃļnnen, dass ein Wert, zum Beispiel, grÃļÃer als `0` sein muss, obwohl er kleiner als `1` ist.
+Hier wird es wichtig, in der Lage zu sein, gt und nicht nur ge zu deklarieren. Da Sie mit dieser Option erzwingen kÃļnnen, dass ein Wert grÃļÃer als `0` sein muss, selbst wenn er kleiner als `1` ist.
-`0.5` wäre also ein gÃŧltiger Wert, aber nicht `0.0` oder `0`.
+Also wäre `0.5` ein gÃŧltiger Wert. Aber `0.0` oder `0` nicht.
-Das gleiche gilt fÃŧr lt.
+Und das Gleiche gilt fÃŧr lt.
{* ../../docs_src/path_params_numeric_validations/tutorial006_an_py39.py hl[13] *}
-## Zusammenfassung
+## Zusammenfassung { #recap }
-Mit `Query` und `Path` (und anderen, die Sie noch nicht gesehen haben) kÃļnnen Sie Metadaten und Stringvalidierungen deklarieren, so wie in [Query-Parameter und Stringvalidierungen](query-params-str-validations.md){.internal-link target=_blank} beschrieben.
+Mit `Query`, `Path` (und anderen, die Sie noch nicht gesehen haben) kÃļnnen Sie Metadaten und Stringvalidierungen auf die gleichen Weisen deklarieren wie in [Query-Parameter und Stringvalidierungen](query-params-str-validations.md){.internal-link target=_blank} beschrieben.
-Und Sie kÃļnnen auch Validierungen fÃŧr Zahlen deklarieren:
+Und Sie kÃļnnen auch Zahlenvalidierungen deklarieren:
-* `gt`: `g`reater `t`han â grÃļÃer als
-* `ge`: `g`reater than or `e`qual â grÃļÃer oder gleich
-* `lt`: `l`ess `t`han â kleiner als
-* `le`: `l`ess than or `e`qual â kleiner oder gleich
+* `gt`: `g`reater `t`han (grÃļÃer als)
+* `ge`: `g`reater than or `e`qual (grÃļÃer oder gleich)
+* `lt`: `l`ess `t`han (kleiner als)
+* `le`: `l`ess than or `e`qual (kleiner oder gleich)
-/// info
+/// info | Info
-`Query`, `Path`, und andere Klassen, die Sie später kennenlernen, sind Unterklassen einer allgemeinen `Param`-Klasse.
+`Query`, `Path`, und andere Klassen, die Sie später sehen werden, sind Unterklassen einer gemeinsamen `Param`-Klasse.
-Sie alle teilen die gleichen Parameter fÃŧr zusätzliche Validierung und Metadaten, die Sie gesehen haben.
+Alle von ihnen teilen die gleichen Parameter fÃŧr zusätzliche Validierung und Metadaten, die Sie gesehen haben.
///
/// note | Technische Details
-`Query`, `Path` und andere, die Sie von `fastapi` importieren, sind tatsächlich Funktionen.
+Wenn Sie `Query`, `Path` und andere von `fastapi` importieren, sind sie tatsächlich Funktionen.
-Die, wenn sie aufgerufen werden, Instanzen der Klassen mit demselben Namen zurÃŧckgeben.
+Die, wenn sie aufgerufen werden, Instanzen von Klassen mit demselben Namen zurÃŧckgeben.
-Sie importieren also `Query`, welches eine Funktion ist. Aber wenn Sie es aufrufen, gibt es eine Instanz der Klasse zurÃŧck, die auch `Query` genannt wird.
+Sie importieren also `Query`, was eine Funktion ist. Und wenn Sie sie aufrufen, gibt sie eine Instanz einer Klasse zurÃŧck, die auch `Query` genannt wird.
Diese Funktionen existieren (statt die Klassen direkt zu verwenden), damit Ihr Editor keine Fehlermeldungen Ãŧber ihre Typen ausgibt.
-Auf diese Weise kÃļnnen Sie Ihren Editor und Ihre Programmier-Tools verwenden, ohne besondere Einstellungen vornehmen zu mÃŧssen, um diese Fehlermeldungen stummzuschalten.
+Auf diese Weise kÃļnnen Sie Ihren normalen Editor und Ihre Programmier-Tools verwenden, ohne besondere Einstellungen vornehmen zu mÃŧssen, um diese Fehlermeldungen stummzuschalten.
///
diff --git a/docs/de/docs/tutorial/path-params.md b/docs/de/docs/tutorial/path-params.md
index 123990940..1db288fb8 100644
--- a/docs/de/docs/tutorial/path-params.md
+++ b/docs/de/docs/tutorial/path-params.md
@@ -1,18 +1,18 @@
-# Pfad-Parameter
+# Pfad-Parameter { #path-parameters }
-Sie kÃļnnen Pfad-âParameterâ oder -âVariablenâ mit der gleichen Syntax deklarieren, welche in Python-Format-Strings verwendet wird:
+Sie kÃļnnen Pfad-âParameterâ oder -âVariablenâ mit der gleichen Syntax deklarieren, welche in Python-Formatstrings verwendet wird:
{* ../../docs_src/path_params/tutorial001.py hl[6:7] *}
Der Wert des Pfad-Parameters `item_id` wird Ihrer Funktion als das Argument `item_id` Ãŧbergeben.
-Wenn Sie dieses Beispiel ausfÃŧhren und auf http://127.0.0.1:8000/items/foo gehen, sehen Sie als Response:
+Wenn Sie dieses Beispiel ausfÃŧhren und auf http://127.0.0.1:8000/items/foo gehen, sehen Sie als Response:
```JSON
{"item_id":"foo"}
```
-## Pfad-Parameter mit Typen
+## Pfad-Parameter mit Typen { #path-parameters-with-types }
Sie kÃļnnen den Typ eines Pfad-Parameters in der Argumentliste der Funktion deklarieren, mit Standard-Python-Typannotationen:
@@ -20,13 +20,13 @@ Sie kÃļnnen den Typ eines Pfad-Parameters in der Argumentliste der Funktion dekl
In diesem Fall wird `item_id` als `int` deklariert, also als Ganzzahl.
-/// check
+/// check | Testen
Dadurch erhalten Sie Editor-UnterstÃŧtzung innerhalb Ihrer Funktion, mit FehlerprÃŧfungen, Codevervollständigung, usw.
///
-## Daten-Konversion
+## Daten-Konversion { #data-conversion }
Wenn Sie dieses Beispiel ausfÃŧhren und Ihren Browser unter http://127.0.0.1:8000/items/3 Ãļffnen, sehen Sie als Response:
@@ -34,15 +34,15 @@ Wenn Sie dieses Beispiel ausfÃŧhren und Ihren Browser unter âparsenâ.
+Sprich, mit dieser Typdeklaration wird **FastAPI** den Request automatisch âparsenâ.
///
-## Datenvalidierung
+## Datenvalidierung { #data-validation }
Wenn Sie aber im Browser http://127.0.0.1:8000/items/foo besuchen, erhalten Sie eine hÃŧbsche HTTP-Fehlermeldung:
@@ -56,8 +56,7 @@ Wenn Sie aber im Browser http://127.0.0.1:8000/items/4.2
-/// check
+/// check | Testen
Sprich, mit der gleichen Python-Typdeklaration gibt Ihnen **FastAPI** Datenvalidierung.
Beachten Sie, dass die Fehlermeldung auch direkt die Stelle anzeigt, wo die Validierung nicht erfolgreich war.
-Das ist unglaublich hilfreich, wenn Sie Code entwickeln und debuggen, welcher mit ihrer API interagiert.
+Das ist unglaublich hilfreich, wenn Sie Code entwickeln und debuggen, welcher mit Ihrer API interagiert.
///
-## Dokumentation
+## Dokumentation { #documentation }
Wenn Sie die Seite http://127.0.0.1:8000/docs in Ihrem Browser Ãļffnen, sehen Sie eine automatische, interaktive API-Dokumentation:
-/// check
+/// check | Testen
Wiederum, mit dieser gleichen Python-Typdeklaration gibt Ihnen **FastAPI** eine automatische, interaktive Dokumentation (verwendet die Swagger-Benutzeroberfläche).
@@ -91,7 +90,7 @@ Beachten Sie, dass der Pfad-Parameter dort als Ganzzahl deklariert ist.
///
-## NÃŧtzliche Standards. Alternative Dokumentation
+## NÃŧtzliche Standards, alternative Dokumentation { #standards-based-benefits-alternative-documentation }
Und weil das generierte Schema vom OpenAPI-Standard kommt, gibt es viele kompatible Tools.
@@ -101,15 +100,15 @@ Zum Beispiel bietet **FastAPI** selbst eine alternative API-Dokumentation (verwe
Und viele weitere kompatible Tools. Inklusive Codegenerierung fÃŧr viele Sprachen.
-## Pydantic
+## Pydantic { #pydantic }
-Die ganze Datenvalidierung wird hinter den Kulissen von Pydantic durchgefÃŧhrt, Sie profitieren also von dessen Vorteilen. Und Sie wissen, dass Sie in guten Händen sind.
+Die ganze Datenvalidierung wird hinter den Kulissen von Pydantic durchgefÃŧhrt, Sie profitieren also von dessen Vorteilen. Und Sie wissen, dass Sie in guten Händen sind.
-Sie kÃļnnen fÃŧr Typ Deklarationen auch `str`, `float`, `bool` und viele andere komplexe Datentypen verwenden.
+Sie kÃļnnen fÃŧr Typdeklarationen auch `str`, `float`, `bool` und viele andere komplexe Datentypen verwenden.
Mehrere davon werden wir in den nächsten Kapiteln erkunden.
-## Die Reihenfolge ist wichtig
+## Die Reihenfolge ist wichtig { #order-matters }
Wenn Sie *Pfadoperationen* erstellen, haben Sie manchmal einen fixen Pfad.
@@ -129,23 +128,23 @@ Sie kÃļnnen eine Pfadoperation auch nicht erneut definieren:
Die erste Definition wird immer verwendet werden, da ihr Pfad zuerst Ãŧbereinstimmt.
-## Vordefinierte Parameterwerte
+## Vordefinierte Parameterwerte { #predefined-values }
-Wenn Sie eine *Pfadoperation* haben, welche einen *Pfad-Parameter* hat, aber Sie wollen, dass dessen gÃŧltige Werte vordefiniert sind, kÃļnnen Sie ein Standard-Python `Enum` verwenden.
+Wenn Sie eine *Pfadoperation* haben, welche einen *Pfad-Parameter* hat, aber Sie wollen, dass dessen gÃŧltige Werte vordefiniert sind, kÃļnnen Sie ein Standard-Python `Enum` verwenden.
-### Erstellen Sie eine `Enum`-Klasse
+### Eine `Enum`-Klasse erstellen { #create-an-enum-class }
Importieren Sie `Enum` und erstellen Sie eine Unterklasse, die von `str` und `Enum` erbt.
-Indem Sie von `str` erben, weià die API Dokumentation, dass die Werte des Enums vom Typ `str` sein mÃŧssen, und wird in der Lage sein, korrekt zu rendern.
+Indem Sie von `str` erben, weià die API-Dokumentation, dass die Werte vom Typ `str` sein mÃŧssen, und wird in der Lage sein, korrekt zu rendern.
Erstellen Sie dann Klassen-Attribute mit festgelegten Werten, welches die erlaubten Werte sein werden:
{* ../../docs_src/path_params/tutorial005.py hl[1,6:9] *}
-/// info
+/// info | Info
-Enumerationen (oder kurz Enums) gibt es in Python seit Version 3.4.
+Enumerationen (oder Enums) gibt es in Python seit Version 3.4.
///
@@ -155,31 +154,31 @@ Falls Sie sich fragen, was âAlexNetâ, âResNetâ und âLeNetâ ist, das
///
-### Deklarieren Sie einen *Pfad-Parameter*
+### Einen *Pfad-Parameter* deklarieren { #declare-a-path-parameter }
Dann erstellen Sie einen *Pfad-Parameter*, der als Typ die gerade erstellte Enum-Klasse hat (`ModelName`):
{* ../../docs_src/path_params/tutorial005.py hl[16] *}
-### Testen Sie es in der API-Dokumentation
+### Die API-Dokumentation testen { #check-the-docs }
Weil die erlaubten Werte fÃŧr den *Pfad-Parameter* nun vordefiniert sind, kann die interaktive Dokumentation sie als Auswahl-Drop-Down anzeigen:
-### Mit Python-*Enums* arbeiten
+### Mit Python-*Enumerationen* arbeiten { #working-with-python-enumerations }
-Der *Pfad-Parameter* wird ein *Member eines Enums* sein.
+Der *Pfad-Parameter* wird ein *Member einer Enumeration* sein.
-#### *Enum-Member* vergleichen
+#### *Enumeration-Member* vergleichen { #compare-enumeration-members }
-Sie kÃļnnen ihn mit einem Member Ihres Enums `ModelName` vergleichen:
+Sie kÃļnnen ihn mit einem Member Ihrer Enumeration `ModelName` vergleichen:
{* ../../docs_src/path_params/tutorial005.py hl[17] *}
-#### *Enum-Wert* erhalten
+#### *Enumerations-Wert* erhalten { #get-the-enumeration-value }
-Den tatsächlichen Wert (in diesem Fall ein `str`) erhalten Sie via `model_name.value`, oder generell, `ihr_enum_member.value`:
+Den tatsächlichen Wert (in diesem Fall ein `str`) erhalten Sie via `model_name.value`, oder generell, `your_enum_member.value`:
{* ../../docs_src/path_params/tutorial005.py hl[20] *}
@@ -189,7 +188,7 @@ Sie kÃļnnen den Wert `"lenet"` auÃerdem mittels `ModelName.lenet.value` abrufen
///
-#### *Enum-Member* zurÃŧckgeben
+#### *Enumeration-Member* zurÃŧckgeben { #return-enumeration-members }
Sie kÃļnnen *Enum-Member* in ihrer *Pfadoperation* zurÃŧckgeben, sogar verschachtelt in einem JSON-Body (z. B. als `dict`).
@@ -206,7 +205,7 @@ In Ihrem Client erhalten Sie eine JSON-Response, wie etwa:
}
```
-## Pfad Parameter die Pfade enthalten
+## Pfad-Parameter, die Pfade enthalten { #path-parameters-containing-paths }
Angenommen, Sie haben eine *Pfadoperation* mit einem Pfad `/files/{file_path}`.
@@ -214,7 +213,7 @@ Aber `file_path` soll selbst einen *Pfad* enthalten, etwa `home/johndoe/myfile.t
Sprich, die URL fÃŧr diese Datei wäre etwas wie: `/files/home/johndoe/myfile.txt`.
-### OpenAPI UnterstÃŧtzung
+### OpenAPI-UnterstÃŧtzung { #openapi-support }
OpenAPI bietet nicht die MÃļglichkeit, dass ein *Pfad-Parameter* seinerseits einen *Pfad* enthalten kann, das wÃŧrde zu Szenarios fÃŧhren, die schwierig zu testen und zu definieren sind.
@@ -222,7 +221,7 @@ Trotzdem kÃļnnen Sie das in **FastAPI** tun, indem Sie eines der internen Tools
Die Dokumentation wÃŧrde weiterhin funktionieren, allerdings wird nicht dokumentiert werden, dass der Parameter ein Pfad sein sollte.
-### Pfad Konverter
+### Pfad-Konverter { #path-convertor }
Mittels einer Option direkt von Starlette kÃļnnen Sie einen *Pfad-Parameter* deklarieren, der einen Pfad enthalten soll, indem Sie eine URL wie folgt definieren:
@@ -244,12 +243,12 @@ In dem Fall wäre die URL: `/files//home/johndoe/myfile.txt`, mit einem doppelte
///
-## Zusammenfassung
+## Zusammenfassung { #recap }
In **FastAPI** erhalten Sie mittels kurzer, intuitiver Typdeklarationen:
* Editor-UnterstÃŧtzung: FehlerprÃŧfungen, Codevervollständigung, usw.
-* Daten "parsen"
+* Daten "parsen"
* Datenvalidierung
* API-Annotationen und automatische Dokumentation
diff --git a/docs/de/docs/tutorial/query-param-models.md b/docs/de/docs/tutorial/query-param-models.md
new file mode 100644
index 000000000..7d3f2d32e
--- /dev/null
+++ b/docs/de/docs/tutorial/query-param-models.md
@@ -0,0 +1,68 @@
+# Query-Parameter-Modelle { #query-parameter-models }
+
+Wenn Sie eine Gruppe von **Query-Parametern** haben, die miteinander in Beziehung stehen, kÃļnnen Sie ein **Pydantic-Modell** erstellen, um diese zu deklarieren.
+
+Dadurch kÃļnnen Sie das **Modell an mehreren Stellen wiederverwenden** und gleichzeitig Validierungen und Metadaten fÃŧr alle Parameter auf einmal deklarieren. đ
+
+/// note | Hinweis
+
+Dies wird seit FastAPI Version `0.115.0` unterstÃŧtzt. đ¤
+
+///
+
+## Query-Parameter mit einem Pydantic-Modell { #query-parameters-with-a-pydantic-model }
+
+Deklarieren Sie die benÃļtigten **Query-Parameter** in einem **Pydantic-Modell** und dann den Parameter als `Query`:
+
+{* ../../docs_src/query_param_models/tutorial001_an_py310.py hl[9:13,17] *}
+
+**FastAPI** wird die Daten fÃŧr **jedes Feld** aus den **Query-Parametern** des Request extrahieren und Ihnen das definierte Pydantic-Modell bereitstellen.
+
+## Die Dokumentation testen { #check-the-docs }
+
+Sie kÃļnnen die Query-Parameter in der Dokumentations-Oberfläche unter `/docs` einsehen:
+
+
+
-### Query-Parameter-Liste / Mehrere Werte mit Defaults
+### Query-Parameter-Liste / Mehrere Werte mit Defaults { #query-parameter-list-multiple-values-with-defaults }
-Und Sie kÃļnnen auch eine Default-`list`e von Werten definieren, wenn keine Ãŧbergeben werden:
+Sie kÃļnnen auch eine Default-`list` von Werten definieren, wenn keine bereitgestellt werden:
{* ../../docs_src/query_params_str_validations/tutorial012_an_py39.py hl[9] *}
-Wenn Sie auf:
+Wenn Sie zu:
```
http://localhost:8000/items/
```
-gehen, wird der Default fÃŧr `q` verwendet: `["foo", "bar"]`, und als Response erhalten Sie:
+gehen, wird der Default fÃŧr `q` sein: `["foo", "bar"]`, und Ihre Response wird sein:
```JSON
{
@@ -395,9 +325,9 @@ gehen, wird der Default fÃŧr `q` verwendet: `["foo", "bar"]`, und als Response e
}
```
-#### `list` alleine verwenden
+#### Nur `list` verwenden { #using-just-list }
-Sie kÃļnnen auch `list` direkt verwenden, anstelle von `List[str]` (oder `list[str]` in Python 3.9+):
+Sie kÃļnnen auch `list` direkt verwenden, anstelle von `list[str]`:
{* ../../docs_src/query_params_str_validations/tutorial013_an_py39.py hl[9] *}
@@ -405,35 +335,35 @@ Sie kÃļnnen auch `list` direkt verwenden, anstelle von `List[str]` (oder `list[s
Beachten Sie, dass FastAPI in diesem Fall den Inhalt der Liste nicht ÃŧberprÃŧft.
-Zum Beispiel wÃŧrde `List[int]` ÃŧberprÃŧfen (und dokumentieren) dass die Liste Ganzzahlen enthält. `list` alleine macht das nicht.
+Zum Beispiel wÃŧrde `list[int]` ÃŧberprÃŧfen (und dokumentieren), dass der Inhalt der Liste Ganzzahlen sind. Aber `list` alleine wÃŧrde das nicht.
///
-## Deklarieren von mehr Metadaten
+## Mehr Metadaten deklarieren { #declare-more-metadata }
-Sie kÃļnnen mehr Informationen zum Parameter hinzufÃŧgen.
+Sie kÃļnnen mehr Informationen Ãŧber den Parameter hinzufÃŧgen.
-Diese Informationen werden zur generierten OpenAPI hinzugefÃŧgt, und von den Dokumentations-Oberflächen und von externen Tools verwendet.
+Diese Informationen werden in das generierte OpenAPI aufgenommen und von den Dokumentationsoberflächen und externen Tools verwendet.
/// note | Hinweis
-Beachten Sie, dass verschiedene Tools OpenAPI mÃļglicherweise unterschiedlich gut unterstÃŧtzen.
+Beachten Sie, dass verschiedene Tools mÃļglicherweise unterschiedliche UnterstÃŧtzungslevels fÃŧr OpenAPI haben.
-Einige kÃļnnten noch nicht alle zusätzlichen Informationen anzeigen, die Sie deklariert haben, obwohl in den meisten Fällen geplant ist, das fehlende Feature zu implementieren.
+Einige davon kÃļnnten noch nicht alle zusätzlichen Informationen anzuzeigen, die Sie erklärten, obwohl in den meisten Fällen die fehlende Funktionalität bereits in der Entwicklung geplant ist.
///
-Sie kÃļnnen einen Titel hinzufÃŧgen â `title`:
+Sie kÃļnnen einen `title` hinzufÃŧgen:
{* ../../docs_src/query_params_str_validations/tutorial007_an_py310.py hl[10] *}
-Und eine Beschreibung â `description`:
+Und eine `description`:
{* ../../docs_src/query_params_str_validations/tutorial008_an_py310.py hl[14] *}
-## Alias-Parameter
+## Alias-Parameter { #alias-parameters }
-Stellen Sie sich vor, der Parameter soll `item-query` sein.
+Stellen Sie sich vor, Sie mÃļchten, dass der Parameter `item-query` ist.
Wie in:
@@ -443,37 +373,99 @@ http://127.0.0.1:8000/items/?item-query=foobaritems
Aber `item-query` ist kein gÃŧltiger Name fÃŧr eine Variable in Python.
-Am ähnlichsten wäre `item_query`.
+Der am ähnlichsten wäre `item_query`.
-Aber Sie mÃļchten dennoch exakt `item-query` verwenden.
+Aber Sie benÃļtigen dennoch, dass er genau `item-query` ist ...
-Dann kÃļnnen Sie einen `alias` deklarieren, und dieser Alias wird verwendet, um den Parameter-Wert zu finden:
+Dann kÃļnnen Sie ein `alias` deklarieren, und dieser Alias wird verwendet, um den Parameterwert zu finden:
{* ../../docs_src/query_params_str_validations/tutorial009_an_py310.py hl[9] *}
-## Parameter als deprecated ausweisen
+## Parameter als deprecatet ausweisen { #deprecating-parameters }
-Nehmen wir an, Sie mÃļgen diesen Parameter nicht mehr.
+Nehmen wir an, Ihnen gefällt dieser Parameter nicht mehr.
-Sie mÃŧssen ihn eine Weile dort belassen, weil Clients ihn benutzen, aber Sie mÃļchten, dass die Dokumentation klar anzeigt, dass er deprecated ist.
+Sie mÃŧssen ihn eine Weile dort belassen, da es Clients gibt, die ihn verwenden, aber Sie mÃļchten, dass die Dokumentation ihn klar als deprecatet anzeigt.
-In diesem Fall fÃŧgen Sie den Parameter `deprecated=True` zu `Query` hinzu.
+Dann Ãŧbergeben Sie den Parameter `deprecated=True` an `Query`:
{* ../../docs_src/query_params_str_validations/tutorial010_an_py310.py hl[19] *}
-Die Dokumentation wird das so anzeigen:
+Die Dokumentation wird es so anzeigen:
-## Parameter von OpenAPI ausschlieÃen
+## Parameter von OpenAPI ausschlieÃen { #exclude-parameters-from-openapi }
-Um einen Query-Parameter vom generierten OpenAPI-Schema auszuschlieÃen (und daher von automatischen Dokumentations-Systemen), setzen Sie den Parameter `include_in_schema` in `Query` auf `False`.
+Um einen Query-Parameter aus dem generierten OpenAPI-Schema auszuschlieÃen (und somit aus den automatischen Dokumentationssystemen), setzen Sie den Parameter `include_in_schema` von `Query` auf `False`:
{* ../../docs_src/query_params_str_validations/tutorial014_an_py310.py hl[10] *}
-## Zusammenfassung
+## Benutzerdefinierte Validierung { #custom-validation }
-Sie kÃļnnen zusätzliche Validierungen und Metadaten zu ihren Parametern hinzufÃŧgen.
+Es kann Fälle geben, in denen Sie eine **benutzerdefinierte Validierung** durchfÃŧhren mÃŧssen, die nicht mit den oben gezeigten Parametern durchgefÃŧhrt werden kann.
+
+In diesen Fällen kÃļnnen Sie eine **benutzerdefinierte Validierungsfunktion** verwenden, die nach der normalen Validierung angewendet wird (z. B. nach der Validierung, dass der Wert ein `str` ist).
+
+Sie kÃļnnen dies mit Pydantic's `AfterValidator` innerhalb von `Annotated` erreichen.
+
+/// tip | Tipp
+
+Pydantic unterstÃŧtzt auch `BeforeValidator` und andere. đ¤
+
+///
+
+Zum Beispiel ÃŧberprÃŧft dieser benutzerdefinierte Validator, ob die Artikel-ID mit `isbn-` fÃŧr eine ISBN-Buchnummer oder mit `imdb-` fÃŧr eine IMDB-Film-URL-ID beginnt:
+
+{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
+
+/// info | Info
+
+Dies ist verfÃŧgbar seit Pydantic Version 2 oder hÃļher. đ
+
+///
+
+/// tip | Tipp
+
+Wenn Sie irgendeine Art von Validierung durchfÃŧhren mÃŧssen, die eine Kommunikation mit einer **externen Komponente** erfordert, wie z. B. einer Datenbank oder einer anderen API, sollten Sie stattdessen **FastAPI-Abhängigkeiten** verwenden. Sie werden diese später kennenlernen.
+
+Diese benutzerdefinierten Validatoren sind fÃŧr Dinge gedacht, die einfach mit denselben **Daten** ÃŧberprÃŧft werden kÃļnnen, die im Request bereitgestellt werden.
+
+///
+
+### Dieses Codebeispiel verstehen { #understand-that-code }
+
+Der wichtige Punkt ist einfach die Verwendung von **`AfterValidator` mit einer Funktion innerhalb von `Annotated`**. FÃŧhlen Sie sich frei, diesen Teil zu Ãŧberspringen. đ¤¸
+
+---
+
+Aber wenn Sie neugierig auf dieses spezielle Codebeispiel sind und immer noch Spaà haben, hier sind einige zusätzliche Details.
+
+#### Zeichenkette mit `value.startswith()` { #string-with-value-startswith }
+
+Haben Sie bemerkt? Eine Zeichenkette mit `value.startswith()` kann ein Tuple Ãŧbernehmen, und es wird jeden Wert im Tuple ÃŧberprÃŧfen:
+
+{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[16:19] hl[17] *}
+
+#### Ein zufälliges Item { #a-random-item }
+
+Mit `data.items()` erhalten wir ein iterierbares Objekt mit Tupeln, die SchlÃŧssel und Wert fÃŧr jedes Dictionary-Element enthalten.
+
+Wir konvertieren dieses iterierbare Objekt mit `list(data.items())` in eine richtige `list`.
+
+Dann kÃļnnen wir mit `random.choice()` einen **zufälligen Wert** aus der Liste erhalten, also bekommen wir ein Tuple mit `(id, name)`. Es wird etwas wie `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")` sein.
+
+Dann **weisen wir diese beiden Werte** des Tupels den Variablen `id` und `name` zu.
+
+Wenn der Benutzer also keine Artikel-ID bereitgestellt hat, erhält er trotzdem einen zufälligen Vorschlag.
+
+... wir tun all dies in einer **einzelnen einfachen Zeile**. đ¤¯ Lieben Sie nicht auch Python? đ
+
+{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[22:30] hl[29] *}
+
+## Zusammenfassung { #recap }
+
+Sie kÃļnnen zusätzliche Validierungen und Metadaten fÃŧr Ihre Parameter deklarieren.
Allgemeine Validierungen und Metadaten:
@@ -482,12 +474,14 @@ Allgemeine Validierungen und Metadaten:
* `description`
* `deprecated`
-Validierungen spezifisch fÃŧr Strings:
+Validierungen, die spezifisch fÃŧr Strings sind:
* `min_length`
* `max_length`
* `pattern`
-In diesen Beispielen haben Sie gesehen, wie Sie Validierungen fÃŧr Strings hinzufÃŧgen.
+Benutzerdefinierte Validierungen mit `AfterValidator`.
-In den nächsten Kapiteln sehen wir, wie man Validierungen fÃŧr andere Typen hinzufÃŧgt, etwa fÃŧr Zahlen.
+In diesen Beispielen haben Sie gesehen, wie Sie Validierungen fÃŧr `str`-Werte deklarieren.
+
+Sehen Sie sich die nächsten Kapitel an, um zu erfahren, wie Sie Validierungen fÃŧr andere Typen, wie z. B. Zahlen, deklarieren.
diff --git a/docs/de/docs/tutorial/query-params.md b/docs/de/docs/tutorial/query-params.md
index 0b0f473e2..e46f31ad0 100644
--- a/docs/de/docs/tutorial/query-params.md
+++ b/docs/de/docs/tutorial/query-params.md
@@ -1,10 +1,10 @@
-# Query-Parameter
+# Query-Parameter { #query-parameters }
-Wenn Sie in ihrer Funktion Parameter deklarieren, die nicht Teil der Pfad-Parameter sind, dann werden diese automatisch als âQueryâ-Parameter interpretiert.
+Wenn Sie in Ihrer Funktion andere Parameter deklarieren, die nicht Teil der Pfad-Parameter sind, dann werden diese automatisch als âQueryâ-Parameter interpretiert.
{* ../../docs_src/query_params/tutorial001.py hl[9] *}
-Query-Parameter (Deutsch: Abfrage-Parameter) sind die SchlÃŧssel-Wert-Paare, die nach dem `?` in einer URL aufgelistet sind, getrennt durch `&`-Zeichen.
+Die Query ist die Menge von SchlÃŧssel-Wert-Paaren, die nach dem `?` in einer URL folgen und durch `&`-Zeichen getrennt sind.
Zum Beispiel sind in der URL:
@@ -19,18 +19,18 @@ http://127.0.0.1:8000/items/?skip=0&limit=10
Da sie Teil der URL sind, sind sie ânaturgemäÃâ Strings.
-Aber wenn Sie sie mit Python-Typen deklarieren (im obigen Beispiel als `int`), werden sie zu diesem Typ konvertiert, und gegen diesen validiert.
+Aber wenn Sie sie mit Python-Typen deklarieren (im obigen Beispiel als `int`), werden sie zu diesem Typ konvertiert und gegen diesen validiert.
-Die gleichen Prozesse, die fÃŧr Pfad-Parameter stattfinden, werden auch auf Query-Parameter angewendet:
+Die gleichen Prozesse, die fÃŧr Pfad-Parameter gelten, werden auch auf Query-Parameter angewendet:
* Editor UnterstÃŧtzung (natÃŧrlich)
-* âParsenâ der Daten
+* Daten-âParsenâ
* Datenvalidierung
* Automatische Dokumentation
-## Defaultwerte
+## Defaultwerte { #defaults }
-Da Query-Parameter nicht ein festgelegter Teil des Pfades sind, kÃļnnen sie optional sein und Defaultwerte haben.
+Da Query-Parameter kein fester Teil eines Pfades sind, kÃļnnen sie optional sein und Defaultwerte haben.
Im obigen Beispiel haben sie die Defaultwerte `skip=0` und `limit=10`.
@@ -52,28 +52,28 @@ Aber wenn Sie zum Beispiel zu:
http://127.0.0.1:8000/items/?skip=20
```
-gehen, werden die Parameter-Werte Ihrer Funktion sein:
+gehen, werden die Parameterwerte Ihrer Funktion sein:
* `skip=20`: da Sie das in der URL gesetzt haben
* `limit=10`: weil das der Defaultwert ist
-## Optionale Parameter
+## Optionale Parameter { #optional-parameters }
Auf die gleiche Weise kÃļnnen Sie optionale Query-Parameter deklarieren, indem Sie deren Defaultwert auf `None` setzen:
{* ../../docs_src/query_params/tutorial002_py310.py hl[7] *}
-In diesem Fall wird der Funktionsparameter `q` optional, und standardmäÃig `None` sein.
+In diesem Fall wird der Funktionsparameter `q` optional und standardmäÃig `None` sein.
-/// check
+/// check | Testen
Beachten Sie auch, dass **FastAPI** intelligent genug ist, um zu erkennen, dass `item_id` ein Pfad-Parameter ist und `q` keiner, daher muss letzteres ein Query-Parameter sein.
///
-## Query-Parameter Typkonvertierung
+## Query-Parameter Typkonvertierung { #query-parameter-type-conversion }
-Sie kÃļnnen auch `bool`-Typen deklarieren und sie werden konvertiert:
+Sie kÃļnnen auch `bool`-Typen deklarieren, und sie werden konvertiert:
{* ../../docs_src/query_params/tutorial003_py310.py hl[7] *}
@@ -109,9 +109,9 @@ http://127.0.0.1:8000/items/foo?short=yes
gehen, oder zu irgendeiner anderen Variante der GroÃ-/Kleinschreibung (Alles groÃ, Anfangsbuchstabe groÃ, usw.), dann wird Ihre Funktion den Parameter `short` mit dem `bool`-Wert `True` sehen, ansonsten mit dem Wert `False`.
-## Mehrere Pfad- und Query-Parameter
+## Mehrere Pfad- und Query-Parameter { #multiple-path-and-query-parameters }
-Sie kÃļnnen mehrere Pfad-Parameter und Query-Parameter gleichzeitig deklarieren, **FastAPI** weiÃ, was welches ist.
+Sie kÃļnnen mehrere Pfad-Parameter und Query-Parameter gleichzeitig deklarieren, **FastAPI** weiÃ, welches welcher ist.
Und Sie mÃŧssen sie auch nicht in einer spezifischen Reihenfolge deklarieren.
@@ -119,7 +119,7 @@ Parameter werden anhand ihres Namens erkannt:
{* ../../docs_src/query_params/tutorial004_py310.py hl[6,8] *}
-## Erforderliche Query-Parameter
+## Erforderliche Query-Parameter { #required-query-parameters }
Wenn Sie einen Defaultwert fÃŧr Nicht-Pfad-Parameter deklarieren (Bis jetzt haben wir nur Query-Parameter gesehen), dann ist der Parameter nicht erforderlich.
@@ -149,8 +149,7 @@ http://127.0.0.1:8000/items/foo-item
"needy"
],
"msg": "Field required",
- "input": null,
- "url": "https://errors.pydantic.dev/2.1/v/missing"
+ "input": null
}
]
}
@@ -183,6 +182,6 @@ In diesem Fall gibt es drei Query-Parameter:
/// tip | Tipp
-Sie kÃļnnen auch `Enum`s verwenden, auf die gleiche Weise wie mit [Pfad-Parametern](path-params.md#vordefinierte-parameterwerte){.internal-link target=_blank}.
+Sie kÃļnnen auch `Enum`s verwenden, auf die gleiche Weise wie mit [Pfad-Parametern](path-params.md#predefined-values){.internal-link target=_blank}.
///
diff --git a/docs/de/docs/tutorial/request-files.md b/docs/de/docs/tutorial/request-files.md
index 1f01b0d1e..0aee898b9 100644
--- a/docs/de/docs/tutorial/request-files.md
+++ b/docs/de/docs/tutorial/request-files.md
@@ -1,40 +1,44 @@
-# Dateien im Request
+# Dateien im Request { #request-files }
-Mit `File` kÃļnnen sie vom Client hochzuladende Dateien definieren.
+Sie kÃļnnen Dateien, die vom Client hochgeladen werden, mithilfe von `File` definieren.
-/// info
+/// info | Info
-Um hochgeladene Dateien zu empfangen, installieren Sie zuerst `python-multipart`.
+Um hochgeladene Dateien zu empfangen, installieren Sie zuerst `python-multipart`.
-Z. B. `pip install python-multipart`.
+Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren und dann das Paket installieren, zum Beispiel:
-Das, weil hochgeladene Dateien als âFormulardatenâ gesendet werden.
+```console
+$ pip install python-multipart
+```
+
+Das liegt daran, dass hochgeladene Dateien als âFormulardatenâ gesendet werden.
///
-## `File` importieren
+## `File` importieren { #import-file }
Importieren Sie `File` und `UploadFile` von `fastapi`:
{* ../../docs_src/request_files/tutorial001_an_py39.py hl[3] *}
-## `File`-Parameter definieren
+## `File`-Parameter definieren { #define-file-parameters }
Erstellen Sie Datei-Parameter, so wie Sie es auch mit `Body` und `Form` machen wÃŧrden:
{* ../../docs_src/request_files/tutorial001_an_py39.py hl[9] *}
-/// info
+/// info | Info
`File` ist eine Klasse, die direkt von `Form` erbt.
-Aber erinnern Sie sich, dass, wenn Sie `Query`, `Path`, `File` und andere von `fastapi` importieren, diese tatsächlich Funktionen sind, welche spezielle Klassen zurÃŧckgeben
+Aber erinnern Sie sich, dass, wenn Sie `Query`, `Path`, `File` und andere von `fastapi` importieren, diese tatsächlich Funktionen sind, welche spezielle Klassen zurÃŧckgeben.
///
/// tip | Tipp
-Um Dateibodys zu deklarieren, mÃŧssen Sie `File` verwenden, da diese Parameter sonst als Query-Parameter oder Body(-JSON)-Parameter interpretiert werden wÃŧrden.
+Um Dateibodys zu deklarieren, mÃŧssen Sie `File` verwenden, da diese Parameter sonst als Query-Parameter oder Body (JSON)-Parameter interpretiert werden wÃŧrden.
///
@@ -46,7 +50,7 @@ Bedenken Sie, dass das bedeutet, dass sich der gesamte Inhalt der Datei im Arbei
Aber es gibt viele Fälle, in denen Sie davon profitieren, `UploadFile` zu verwenden.
-## Datei-Parameter mit `UploadFile`
+## Datei-Parameter mit `UploadFile` { #file-parameters-with-uploadfile }
Definieren Sie einen Datei-Parameter mit dem Typ `UploadFile`:
@@ -55,20 +59,20 @@ Definieren Sie einen Datei-Parameter mit dem Typ `UploadFile`:
`UploadFile` zu verwenden, hat mehrere VorzÃŧge gegenÃŧber `bytes`:
* Sie mÃŧssen `File()` nicht als Parameter-Defaultwert verwenden.
-* Es wird eine âSpoolâ-Datei verwendet:
+* Es wird eine âgespoolteâ Datei verwendet:
* Eine Datei, die bis zu einem bestimmten GrÃļÃen-Limit im Arbeitsspeicher behalten wird, und wenn das Limit Ãŧberschritten wird, auf der Festplatte gespeichert wird.
* Das bedeutet, es wird fÃŧr groÃe Dateien wie Bilder, Videos, groÃe Binärdateien, usw. gut funktionieren, ohne den ganzen Arbeitsspeicher aufzubrauchen.
* Sie kÃļnnen Metadaten aus der hochgeladenen Datei auslesen.
-* Es hat eine file-like `async`hrone Schnittstelle.
-* Es stellt ein tatsächliches Python-`SpooledTemporaryFile`-Objekt bereit, welches Sie direkt anderen Bibliotheken Ãŧbergeben kÃļnnen, die ein dateiartiges Objekt erwarten.
+* Es hat eine dateiartige `async`hrone Schnittstelle.
+* Es stellt ein tatsächliches Python-`SpooledTemporaryFile`-Objekt bereit, welches Sie direkt anderen Bibliotheken Ãŧbergeben kÃļnnen, die ein dateiartiges Objekt erwarten.
-### `UploadFile`
+### `UploadFile` { #uploadfile }
`UploadFile` hat die folgenden Attribute:
* `filename`: Ein `str` mit dem ursprÃŧnglichen Namen der hochgeladenen Datei (z. B. `meinbild.jpg`).
* `content_type`: Ein `str` mit dem Inhaltstyp (MIME-Typ / Medientyp) (z. B. `image/jpeg`).
-* `file`: Ein `SpooledTemporaryFile` (ein file-like Objekt). Das ist das tatsächliche Python-Objekt, das Sie direkt anderen Funktionen oder Bibliotheken Ãŧbergeben kÃļnnen, welche ein âfile-likeâ-Objekt erwarten.
+* `file`: Ein `SpooledTemporaryFile` (ein dateiartiges Objekt). Das ist das tatsächliche Python-Objekt, das Sie direkt anderen Funktionen oder Bibliotheken Ãŧbergeben kÃļnnen, welche ein âfile-likeâ-Objekt erwarten.
`UploadFile` hat die folgenden `async`hronen Methoden. Sie alle rufen die entsprechenden Methoden des darunterliegenden Datei-Objekts auf (wobei intern `SpooledTemporaryFile` verwendet wird).
@@ -79,7 +83,7 @@ Definieren Sie einen Datei-Parameter mit dem Typ `UploadFile`:
* Das ist besonders dann nÃŧtzlich, wenn Sie `await myfile.read()` einmal ausfÃŧhren und dann diese Inhalte erneut auslesen mÃŧssen.
* `close()`: SchlieÃt die Datei.
-Da alle diese Methoden `async`hron sind, mÃŧssen Sie sie `await`en (âerwartenâ).
+Da alle diese Methoden `async`hron sind, mÃŧssen Sie sie âawaitâen (âerwartenâ).
Zum Beispiel kÃļnnen Sie innerhalb einer `async` *Pfadoperation-Funktion* den Inhalt wie folgt auslesen:
@@ -105,9 +109,9 @@ Wenn Sie die `async`-Methoden verwenden, fÃŧhrt **FastAPI** die Datei-Methoden i
///
-## Was sind âFormulardatenâ
+## Was sind âFormulardatenâ { #what-is-form-data }
-HTML-Formulare (``) senden die Daten in einer âspeziellenâ Kodierung zum Server, welche sich von JSON unterscheidet.
+Der Weg, wie HTML-Formulare (``) die Daten zum Server senden, verwendet normalerweise eine âspezielleâ Kodierung fÃŧr diese Daten. Diese unterscheidet sich von JSON.
**FastAPI** stellt sicher, dass diese Daten korrekt ausgelesen werden, statt JSON zu erwarten.
@@ -117,31 +121,31 @@ Daten aus Formularen werden, wenn es keine Dateien sind, normalerweise mit dem <
Sollte das Formular aber Dateien enthalten, dann werden diese mit `multipart/form-data` kodiert. Wenn Sie `File` verwenden, wird **FastAPI** wissen, dass es die Dateien vom korrekten Teil des Bodys holen muss.
-Wenn Sie mehr Ãŧber Formularfelder und ihre Kodierungen lesen mÃļchten, besuchen Sie die MDN-Webdokumentation fÃŧr POST.
+Wenn Sie mehr Ãŧber diese Kodierungen und Formularfelder lesen mÃļchten, besuchen Sie die MDN-Webdokumentation fÃŧr POST.
///
/// warning | Achtung
-Sie kÃļnnen mehrere `File`- und `Form`-Parameter in einer *Pfadoperation* deklarieren, aber Sie kÃļnnen nicht gleichzeitig auch `Body`-Felder deklarieren, welche Sie als JSON erwarten, da der Request den Body mittels `multipart/form-data` statt `application/json` kodiert.
+Sie kÃļnnen mehrere `File`- und `Form`-Parameter in einer *Pfadoperation* deklarieren, aber Sie kÃļnnen nicht gleichzeitig auch `Body`-Felder deklarieren, welche Sie als JSON erwarten, da der Request den Body mittels `multipart/form-data` statt `application/json` kodiert.
Das ist keine Limitation von **FastAPI**, sondern Teil des HTTP-Protokolls.
///
-## Optionaler Datei-Upload
+## Optionaler Datei-Upload { #optional-file-upload }
Sie kÃļnnen eine Datei optional machen, indem Sie Standard-Typannotationen verwenden und den Defaultwert auf `None` setzen:
{* ../../docs_src/request_files/tutorial001_02_an_py310.py hl[9,17] *}
-## `UploadFile` mit zusätzlichen Metadaten
+## `UploadFile` mit zusätzlichen Metadaten { #uploadfile-with-additional-metadata }
-Sie kÃļnnen auch `File()` zusammen mit `UploadFile` verwenden, um zum Beispiel zusätzliche Metadaten zu setzen:
+Sie kÃļnnen auch `File()` mit `UploadFile` verwenden, um zum Beispiel zusätzliche Metadaten zu setzen:
{* ../../docs_src/request_files/tutorial001_03_an_py39.py hl[9,15] *}
-## Mehrere Datei-Uploads
+## Mehrere Datei-Uploads { #multiple-file-uploads }
Es ist auch mÃļglich, mehrere Dateien gleichzeitig hochzuladen.
@@ -151,22 +155,22 @@ Um das zu machen, deklarieren Sie eine Liste von `bytes` oder `UploadFile`s:
{* ../../docs_src/request_files/tutorial002_an_py39.py hl[10,15] *}
-Sie erhalten, wie deklariert, eine `list`e von `bytes` oder `UploadFile`s.
+Sie erhalten, wie deklariert, eine `list` von `bytes` oder `UploadFile`s.
/// note | Technische Details
Sie kÃļnnen auch `from starlette.responses import HTMLResponse` verwenden.
-**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit fÃŧr Sie, den Entwickler. Die meisten verfÃŧgbaren Responses kommen aber direkt von Starlette.
+**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit fÃŧr Sie, den Entwickler. Die meisten verfÃŧgbaren Responses kommen aber direkt von Starlette.
///
-### Mehrere Datei-Uploads mit zusätzlichen Metadaten
+### Mehrere Datei-Uploads mit zusätzlichen Metadaten { #multiple-file-uploads-with-additional-metadata }
Und so wie zuvor kÃļnnen Sie `File()` verwenden, um zusätzliche Parameter zu setzen, sogar fÃŧr `UploadFile`:
{* ../../docs_src/request_files/tutorial003_an_py39.py hl[11,18:20] *}
-## Zusammenfassung
+## Zusammenfassung { #recap }
Verwenden Sie `File`, `bytes` und `UploadFile`, um hochladbare Dateien im Request zu deklarieren, die als Formulardaten gesendet werden.
diff --git a/docs/de/docs/tutorial/request-form-models.md b/docs/de/docs/tutorial/request-form-models.md
new file mode 100644
index 000000000..fbc6c094c
--- /dev/null
+++ b/docs/de/docs/tutorial/request-form-models.md
@@ -0,0 +1,78 @@
+# Formularmodelle { #form-models }
+
+Sie kÃļnnen **Pydantic-Modelle** verwenden, um **Formularfelder** in FastAPI zu deklarieren.
+
+/// info | Info
+
+Um Formulare zu verwenden, installieren Sie zuerst `python-multipart`.
+
+Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren und es dann installieren, zum Beispiel:
+
+```console
+$ pip install python-multipart
+```
+
+///
+
+/// note | Hinweis
+
+Dies wird seit FastAPI Version `0.113.0` unterstÃŧtzt. đ¤
+
+///
+
+## Pydantic-Modelle fÃŧr Formulare { #pydantic-models-for-forms }
+
+Sie mÃŧssen nur ein **Pydantic-Modell** mit den Feldern deklarieren, die Sie als **Formularfelder** erhalten mÃļchten, und dann den Parameter als `Form` deklarieren:
+
+{* ../../docs_src/request_form_models/tutorial001_an_py39.py hl[9:11,15] *}
+
+**FastAPI** wird die Daten fÃŧr **jedes Feld** aus den **Formulardaten** im Request **extrahieren** und Ihnen das von Ihnen definierte Pydantic-Modell Ãŧbergeben.
+
+## Die Dokumentation testen { #check-the-docs }
+
+Sie kÃļnnen dies in der Dokumentations-UI unter `/docs` testen:
+
+
+POST.
+Wenn Sie mehr Ãŧber Formularfelder und ihre Kodierungen lesen mÃļchten, besuchen Sie die MDN-Webdokumentation fÃŧr POST.
///
/// warning | Achtung
-Sie kÃļnnen mehrere `Form`-Parameter in einer *Pfadoperation* deklarieren, aber Sie kÃļnnen nicht gleichzeitig auch `Body`-Felder deklarieren, welche Sie als JSON erwarten, da der Request den Body mittels `application/x-www-form-urlencoded` statt `application/json` kodiert.
+Sie kÃļnnen mehrere `Form`-Parameter in einer *Pfadoperation* deklarieren, aber Sie kÃļnnen nicht gleichzeitig auch `Body`-Felder deklarieren, welche Sie als JSON erwarten, da der Request den Body mittels `application/x-www-form-urlencoded` statt `application/json` kodiert.
Das ist keine Limitation von **FastAPI**, sondern Teil des HTTP-Protokolls.
///
-## Zusammenfassung
+## Zusammenfassung { #recap }
Verwenden Sie `Form`, um Eingabe-Parameter fÃŧr Formulardaten zu deklarieren.
diff --git a/docs/de/docs/tutorial/response-model.md b/docs/de/docs/tutorial/response-model.md
index faf9be516..7b77125cb 100644
--- a/docs/de/docs/tutorial/response-model.md
+++ b/docs/de/docs/tutorial/response-model.md
@@ -1,6 +1,6 @@
-# Responsemodell â RÃŧckgabetyp
+# Responsemodell â RÃŧckgabetyp { #response-model-return-type }
-Sie kÃļnnen den Typ der Response deklarieren, indem Sie den **RÃŧckgabetyp** der *Pfadoperation* annotieren.
+Sie kÃļnnen den Typ der Response deklarieren, indem Sie den **RÃŧckgabetyp** der *Pfadoperation* annotieren.
Hierbei kÃļnnen Sie **Typannotationen** genauso verwenden, wie Sie es bei Werten von Funktions-**Parametern** machen; verwenden Sie Pydantic-Modelle, Listen, Dicts und skalare Werte wie Nummern, Booleans, usw.
@@ -9,7 +9,7 @@ Hierbei kÃļnnen Sie **Typannotationen** genauso verwenden, wie Sie es bei Werten
FastAPI wird diesen RÃŧckgabetyp verwenden, um:
* Die zurÃŧckzugebenden Daten zu **validieren**.
- * Wenn die Daten ungÃŧltig sind (Sie haben z. B. ein Feld vergessen), bedeutet das, *Ihr* Anwendungscode ist fehlerhaft, er gibt nicht zurÃŧck, was er sollte, und daher wird ein Server-Error ausgegeben, statt falscher Daten. So kÃļnnen Sie und ihre Clients sicher sein, dass diese die erwarteten Daten, in der richtigen Form erhalten.
+ * Wenn die Daten ungÃŧltig sind (Sie haben z. B. ein Feld vergessen), bedeutet das, *Ihr* Anwendungscode ist fehlerhaft, er gibt nicht zurÃŧck, was er sollte, und daher wird ein Server-Error ausgegeben, statt falscher Daten. So kÃļnnen Sie und Ihre Clients sicher sein, dass diese die erwarteten Daten, in der richtigen Form erhalten.
* In der OpenAPI *Pfadoperation* ein **JSON-Schema** fÃŧr die Response hinzuzufÃŧgen.
* Dieses wird von der **automatischen Dokumentation** verwendet.
* Es wird auch von automatisch Client-Code-generierenden Tools verwendet.
@@ -19,11 +19,11 @@ Aber am wichtigsten:
* Es wird die Ausgabedaten auf das **limitieren und filtern**, was im RÃŧckgabetyp definiert ist.
* Das ist insbesondere fÃŧr die **Sicherheit** wichtig, mehr dazu unten.
-## `response_model`-Parameter
+## `response_model`-Parameter { #response-model-parameter }
Es gibt Fälle, da mÃļchten oder mÃŧssen Sie Daten zurÃŧckgeben, die nicht genau dem entsprechen, was der Typ deklariert.
-Zum Beispiel kÃļnnten Sie **ein Dict zurÃŧckgeben** wollen, oder ein Datenbank-Objekt, aber **es als Pydantic-Modell deklarieren**. Auf diese Weise Ãŧbernimmt das Pydantic-Modell alle Datendokumentation, -validierung, usw. fÃŧr das Objekt, welches Sie zurÃŧckgeben (z. B. ein Dict oder ein Datenbank-Objekt).
+Zum Beispiel kÃļnnten Sie **ein Dictionary zurÃŧckgeben** wollen, oder ein Datenbank-Objekt, aber **es als Pydantic-Modell deklarieren**. Auf diese Weise Ãŧbernimmt das Pydantic-Modell alle Datendokumentation, -validierung, usw. fÃŧr das Objekt, welches Sie zurÃŧckgeben (z. B. ein Dictionary oder ein Datenbank-Objekt).
WÃŧrden Sie eine hierfÃŧr eine RÃŧckgabetyp-Annotation verwenden, dann wÃŧrden Tools und Editoren (korrekterweise) Fehler ausgeben, die Ihnen sagen, dass Ihre Funktion einen Typ zurÃŧckgibt (z. B. ein Dict), der sich unterscheidet von dem, was Sie deklariert haben (z. B. ein Pydantic-Modell).
@@ -41,7 +41,7 @@ Sie kÃļnnen `response_model` in jeder mÃļglichen *Pfadoperation* verwenden:
/// note | Hinweis
-Beachten Sie, dass `response_model` ein Parameter der âDekoratorâ-Methode ist (`get`, `post`, usw.). Nicht der *Pfadoperation-Funktion*, so wie die anderen Parameter.
+Beachten Sie, dass `response_model` ein Parameter der âDekoratorâ-Methode ist (`get`, `post`, usw.). Nicht der *Pfadoperation-Funktion*, so wie die anderen Parameter und der Body.
///
@@ -51,32 +51,41 @@ FastAPI wird dieses `response_model` nehmen, um die Daten zu dokumentieren, vali
/// tip | Tipp
-Wenn Sie in Ihrem Editor strikte Typchecks haben, mypy, usw., kÃļnnen Sie den Funktions-RÃŧckgabetyp als `Any` deklarieren.
+Wenn Sie in Ihrem Editor strikte Typchecks haben, mypy, usw., kÃļnnen Sie den Funktions-RÃŧckgabetyp als `Any` deklarieren.
So sagen Sie dem Editor, dass Sie absichtlich *irgendetwas* zurÃŧckgeben. Aber FastAPI wird trotzdem die Dokumentation, Validierung, Filterung, usw. der Daten Ãŧbernehmen, via `response_model`.
///
-### `response_model`-Priorität
+### `response_model`-Priorität { #response-model-priority }
Wenn sowohl RÃŧckgabetyp als auch `response_model` deklariert sind, hat `response_model` die Priorität und wird von FastAPI bevorzugt verwendet.
-So kÃļnnen Sie korrekte Typannotationen zu ihrer Funktion hinzufÃŧgen, die von ihrem Editor und Tools wie mypy verwendet werden. Und dennoch Ãŧbernimmt FastAPI die Validierung und Dokumentation, usw., der Daten anhand von `response_model`.
+So kÃļnnen Sie korrekte Typannotationen zu Ihrer Funktion hinzufÃŧgen, die von Ihrem Editor und Tools wie mypy verwendet werden. Und dennoch Ãŧbernimmt FastAPI die Validierung und Dokumentation, usw., der Daten anhand von `response_model`.
-Sie kÃļnnen auch `response_model=None` verwenden, um das Erstellen eines Responsemodells fÃŧr diese *Pfadoperation* zu unterbinden. Sie kÃļnnten das tun wollen, wenn sie Dinge annotieren, die nicht gÃŧltige Pydantic-Felder sind. Ein Beispiel dazu werden Sie in einer der Abschnitte unten sehen.
+Sie kÃļnnen auch `response_model=None` verwenden, um das Erstellen eines Responsemodells fÃŧr diese *Pfadoperation* zu unterbinden. Sie kÃļnnten das tun wollen, wenn Sie Dinge annotieren, die nicht gÃŧltige Pydantic-Felder sind. Ein Beispiel dazu werden Sie in einer der Abschnitte unten sehen.
-## Dieselben Eingabedaten zurÃŧckgeben
+## Dieselben Eingabedaten zurÃŧckgeben { #return-the-same-input-data }
Im Folgenden deklarieren wir ein `UserIn`-Modell; es enthält ein Klartext-Passwort:
{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
-/// info
+/// info | Info
Um `EmailStr` zu verwenden, installieren Sie zuerst `email-validator`.
-Z. B. `pip install email-validator`
-oder `pip install pydantic[email]`.
+Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren und es dann installieren, zum Beispiel:
+
+```console
+$ pip install email-validator
+```
+
+oder mit:
+
+```console
+$ pip install "pydantic[email]"
+```
///
@@ -96,7 +105,7 @@ Speichern Sie niemals das Klartext-Passwort eines Benutzers, oder versenden Sie
///
-## Ausgabemodell hinzufÃŧgen
+## Ausgabemodell hinzufÃŧgen { #add-an-output-model }
Wir kÃļnnen stattdessen ein Eingabemodell mit dem Klartext-Passwort, und ein Ausgabemodell ohne das Passwort erstellen:
@@ -112,7 +121,7 @@ Obwohl unsere *Pfadoperation-Funktion* hier denselben `user` von der Eingabe zur
Darum wird **FastAPI** sich darum kÃŧmmern, dass alle Daten, die nicht im Ausgabemodell deklariert sind, herausgefiltert werden (mittels Pydantic).
-### `response_model` oder RÃŧckgabewert
+### `response_model` oder RÃŧckgabewert { #response-model-or-return-type }
Da unsere zwei Modelle in diesem Fall unterschiedlich sind, wÃŧrde, wenn wir den RÃŧckgabewert der Funktion als `UserOut` deklarieren, der Editor sich beschweren, dass wir einen ungÃŧltigen Typ zurÃŧckgeben, weil das unterschiedliche Klassen sind.
@@ -120,11 +129,11 @@ Darum mÃŧssen wir es in diesem Fall im `response_model`-Parameter deklarieren.
... aber lesen Sie weiter, um zu sehen, wie man das anders lÃļsen kann.
-## RÃŧckgabewert und Datenfilterung
+## RÃŧckgabewert und Datenfilterung { #return-type-and-data-filtering }
-FÃŧhren wir unser vorheriges Beispiel fort. Wir wollten **die Funktion mit einem Typ annotieren**, aber etwas zurÃŧckgeben, das **weniger Daten** enthält.
+FÃŧhren wir unser vorheriges Beispiel fort. Wir wollten **die Funktion mit einem Typ annotieren**, aber wir wollten in der Funktion tatsächlich etwas zurÃŧckgeben, das **mehr Daten** enthält.
-Wir mÃļchten auch, dass FastAPI die Daten weiterhin, dem Responsemodell entsprechend, **filtert**.
+Wir mÃļchten, dass FastAPI die Daten weiterhin mithilfe des Responsemodells **filtert**. Selbst wenn die Funktion mehr Daten zurÃŧckgibt, soll die Response nur die Felder enthalten, die im Responsemodell deklariert sind.
Im vorherigen Beispiel mussten wir den `response_model`-Parameter verwenden, weil die Klassen unterschiedlich waren. Das bedeutet aber auch, wir bekommen keine UnterstÃŧtzung vom Editor und anderen Tools, die den Funktions-RÃŧckgabewert ÃŧberprÃŧfen.
@@ -138,17 +147,17 @@ Damit erhalten wir Tool-UnterstÃŧtzung, vom Editor und mypy, da dieser Code hins
Wie funktioniert das? Schauen wir uns das mal an. đ¤
-### Typannotationen und Tooling
+### Typannotationen und Tooling { #type-annotations-and-tooling }
Sehen wir uns zunächst an, wie Editor, mypy und andere Tools dies sehen wÃŧrden.
-`BaseUser` verfÃŧgt Ãŧber die Basis-Felder. Dann erbt `UserIn` von `BaseUser` und fÃŧgt das Feld `Passwort` hinzu, sodass dass es nun alle Felder beider Modelle hat.
+`BaseUser` verfÃŧgt Ãŧber die Basis-Felder. Dann erbt `UserIn` von `BaseUser` und fÃŧgt das Feld `password` hinzu, sodass es nun alle Felder beider Modelle hat.
Wir annotieren den FunktionsrÃŧckgabetyp als `BaseUser`, geben aber tatsächlich eine `UserIn`-Instanz zurÃŧck.
FÃŧr den Editor, mypy und andere Tools ist das kein Problem, da `UserIn` eine Unterklasse von `BaseUser` ist (Salopp: `UserIn` ist ein `BaseUser`). Es handelt sich um einen *gÃŧltigen* Typ, solange irgendetwas Ãŧberreicht wird, das ein `BaseUser` ist.
-### FastAPI Datenfilterung
+### FastAPI Datenfilterung { #fastapi-data-filtering }
FastAPI seinerseits wird den RÃŧckgabetyp sehen und sicherstellen, dass das, was zurÃŧckgegeben wird, **nur** diejenigen Felder enthält, welche im Typ deklariert sind.
@@ -156,7 +165,7 @@ FastAPI macht intern mehrere Dinge mit Pydantic, um sicherzustellen, dass obige
Auf diese Weise erhalten Sie das beste beider Welten: Sowohl Typannotationen mit **Tool-UnterstÃŧtzung** als auch **Datenfilterung**.
-## Anzeige in der Dokumentation
+## Anzeige in der Dokumentation { #see-it-in-the-docs }
Wenn Sie sich die automatische Dokumentation betrachten, kÃļnnen Sie sehen, dass Eingabe- und Ausgabemodell beide ihr eigenes JSON-Schema haben:
@@ -166,11 +175,11 @@ Und beide Modelle werden auch in der interaktiven API-Dokumentation verwendet:
-## Andere RÃŧckgabetyp-Annotationen
+## Andere RÃŧckgabetyp-Annotationen { #other-return-type-annotations }
Es kann Fälle geben, bei denen Sie etwas zurÃŧckgeben, das kein gÃŧltiges Pydantic-Feld ist, und Sie annotieren es in der Funktion nur, um UnterstÃŧtzung von Tools zu erhalten (Editor, mypy, usw.).
-### Eine Response direkt zurÃŧckgeben
+### Eine Response direkt zurÃŧckgeben { #return-a-response-directly }
Der häufigste Anwendungsfall ist, wenn Sie [eine Response direkt zurÃŧckgeben, wie es später im Handbuch fÃŧr fortgeschrittene Benutzer erläutert wird](../advanced/response-directly.md){.internal-link target=_blank}.
@@ -180,7 +189,7 @@ Dieser einfache Anwendungsfall wird automatisch von FastAPI gehandhabt, weil die
Und Tools werden auch glÃŧcklich sein, weil sowohl `RedirectResponse` als auch `JSONResponse` Unterklassen von `Response` sind, die Typannotation ist daher korrekt.
-### Eine Unterklasse von Response annotieren
+### Eine Unterklasse von Response annotieren { #annotate-a-response-subclass }
Sie kÃļnnen auch eine Unterklasse von `Response` in der Typannotation verwenden.
@@ -188,17 +197,17 @@ Sie kÃļnnen auch eine Unterklasse von `Response` in der Typannotation verwenden.
Das wird ebenfalls funktionieren, weil `RedirectResponse` eine Unterklasse von `Response` ist, und FastAPI sich um diesen einfachen Anwendungsfall automatisch kÃŧmmert.
-### UngÃŧltige RÃŧckgabetyp-Annotationen
+### UngÃŧltige RÃŧckgabetyp-Annotationen { #invalid-return-type-annotations }
Aber wenn Sie ein beliebiges anderes Objekt zurÃŧckgeben, das kein gÃŧltiger Pydantic-Typ ist (z. B. ein Datenbank-Objekt), und Sie annotieren es so in der Funktion, wird FastAPI versuchen, ein Pydantic-Responsemodell von dieser Typannotation zu erstellen, und scheitern.
-Das gleiche wird passieren, wenn Sie eine Union mehrerer Typen haben, und einer oder mehrere sind nicht gÃŧltige Pydantic-Typen. Zum Beispiel funktioniert folgendes nicht đĨ:
+Das gleiche wird passieren, wenn Sie eine Union mehrerer Typen haben, und einer oder mehrere sind nicht gÃŧltige Pydantic-Typen. Zum Beispiel funktioniert folgendes nicht đĨ:
{* ../../docs_src/response_model/tutorial003_04_py310.py hl[8] *}
... das scheitert, da die Typannotation kein Pydantic-Typ ist, und auch keine einzelne `Response`-Klasse, oder -Unterklasse, es ist eine Union (eines von beiden) von `Response` und `dict`.
-### Responsemodell deaktivieren
+### Responsemodell deaktivieren { #disable-response-model }
Beim Beispiel oben fortsetzend, mÃļgen Sie vielleicht die standardmäÃige Datenvalidierung, -Dokumentation, -Filterung, usw., die von FastAPI durchgefÃŧhrt wird, nicht haben.
@@ -210,7 +219,7 @@ In diesem Fall kÃļnnen Sie die Generierung des Responsemodells abschalten, indem
Das bewirkt, dass FastAPI die Generierung des Responsemodells unterlässt, und damit kÃļnnen Sie jede gewÃŧnschte RÃŧckgabetyp-Annotation haben, ohne dass es Ihre FastAPI-Anwendung beeinflusst. đ¤
-## Parameter fÃŧr die Enkodierung des Responsemodells
+## Parameter fÃŧr die Enkodierung des Responsemodells { #response-model-encoding-parameters }
Ihr Responsemodell kÃļnnte Defaultwerte haben, wie:
@@ -224,7 +233,7 @@ Aber Sie mÃļchten diese vielleicht vom Resultat ausschlieÃen, wenn Sie gar nich
Wenn Sie zum Beispiel Modelle mit vielen optionalen Attributen in einer NoSQL-Datenbank haben, und Sie mÃļchten nicht ellenlange JSON-Responses voller Defaultwerte senden.
-### Den `response_model_exclude_unset`-Parameter verwenden
+### Den `response_model_exclude_unset`-Parameter verwenden { #use-the-response-model-exclude-unset-parameter }
Sie kÃļnnen den *Pfadoperation-Dekorator*-Parameter `response_model_exclude_unset=True` setzen:
@@ -241,21 +250,21 @@ Wenn Sie also den Artikel mit der ID `foo` bei der *Pfadoperation* anfragen, wir
}
```
-/// info
+/// info | Info
-In Pydantic v1 hieà diese Methode `.dict()`, in Pydantic v2 wurde sie deprecated (aber immer noch unterstÃŧtzt) und in `.model_dump()` umbenannt.
+In Pydantic v1 hieà diese Methode `.dict()`, in Pydantic v2 wurde sie deprecatet (aber immer noch unterstÃŧtzt) und in `.model_dump()` umbenannt.
Die Beispiele hier verwenden `.dict()` fÃŧr die Kompatibilität mit Pydantic v1, Sie sollten jedoch stattdessen `.model_dump()` verwenden, wenn Sie Pydantic v2 verwenden kÃļnnen.
///
-/// info
+/// info | Info
FastAPI verwendet `.dict()` von Pydantic Modellen, mit dessen `exclude_unset`-Parameter, um das zu erreichen.
///
-/// info
+/// info | Info
Sie kÃļnnen auch:
@@ -266,9 +275,9 @@ verwenden, wie in der Response mit dem Parameter `status_code` in jeder der *Pfadoperationen* deklarieren:
* `@app.get()`
* `@app.post()`
@@ -12,90 +12,90 @@ So wie ein Responsemodell, kÃļnnen Sie auch einen HTTP-Statuscode fÃŧr die Respo
/// note | Hinweis
-Beachten Sie, dass `status_code` ein Parameter der âDekoratorâ-Methode ist (`get`, `post`, usw.). Nicht der *Pfadoperation-Funktion*, so wie die anderen Parameter und der Body.
+Beachten Sie, dass `status_code` ein Parameter der âDekoratorâ-Methode ist (`get`, `post`, usw.). Nicht der *Pfadoperation-Funktion*, wie alle anderen Parameter und der Body.
///
Dem `status_code`-Parameter wird eine Zahl mit dem HTTP-Statuscode Ãŧbergeben.
-/// info
+/// info | Info
-Alternativ kann `status_code` auch ein `IntEnum` erhalten, so wie Pythons `http.HTTPStatus`.
+Alternativ kann `status_code` auch ein `IntEnum` erhalten, wie etwa Pythons `http.HTTPStatus`.
///
-Das wird:
+Dies wird:
* Diesen Statuscode mit der Response zurÃŧcksenden.
-* Ihn als solchen im OpenAPI-Schema dokumentieren (und somit in den Benutzeroberflächen):
+* Diesen im OpenAPI-Schema dokumentieren (und somit in den Benutzeroberflächen):
/// note | Hinweis
-Einige Responsecodes (siehe nächster Abschnitt) kennzeichnen, dass die Response keinen Body hat.
+Einige Responsecodes (siehe nächsten Abschnitt) kennzeichnen, dass die Response keinen Body hat.
-FastAPI versteht das und wird in der OpenAPI-Dokumentation anzeigen, dass es keinen Responsebody gibt.
+FastAPI erkennt dies und erstellt eine OpenAPI-Dokumentation, die zeigt, dass es keinen Responsebody gibt.
///
-## Ãber HTTP-Statuscodes
+## Ãber HTTP-Statuscodes { #about-http-status-codes }
/// note | Hinweis
-Wenn Sie bereits wissen, was HTTP-Statuscodes sind, Ãŧberspringen Sie dieses Kapitel und fahren Sie mit dem nächsten fort.
+Wenn Sie bereits wissen, was HTTP-Statuscodes sind, kÃļnnen Sie diesen Abschnitt Ãŧberspringen und mit dem nächsten fortfahren.
///
-In HTTP senden Sie als Teil der Response einen aus drei Ziffern bestehenden numerischen Statuscode.
+In HTTP senden Sie einen numerischen Statuscode mit 3 Ziffern als Teil der Response.
-Diese Statuscodes haben einen Namen zugeordnet, um sie besser zu erkennen, aber der wichtige Teil ist die Zahl.
+Diese Statuscodes haben einen zugeordneten Namen, um sie leichter zu erkennen, aber der wichtige Teil ist die Zahl.
-Kurz:
+Kurz gefasst:
-* `100` und darÃŧber stehen fÃŧr âInformationâ. Diese verwenden Sie selten direkt. Responses mit diesen Statuscodes kÃļnnen keinen Body haben.
-* **`200`** und darÃŧber stehen fÃŧr Responses, die âSuccessfulâ (âErfolgreichâ) waren. Diese verwenden Sie am häufigsten.
- * `200` ist der Default-Statuscode, welcher bedeutet, alles ist âOKâ.
- * Ein anderes Beispiel ist `201`, âCreatedâ (âErzeugtâ). Wird in der Regel verwendet, wenn ein neuer Datensatz in der Datenbank erzeugt wurde.
- * Ein spezieller Fall ist `204`, âNo Contentâ (âKein Inhaltâ). Diese Response wird verwendet, wenn es keinen Inhalt gibt, der zum Client zurÃŧckgeschickt wird, diese Response hat also keinen Body.
-* **`300`** und darÃŧber steht fÃŧr âRedirectionâ (âUmleitungâ). Responses mit diesen Statuscodes kÃļnnen einen oder keinen Body haben, mit Ausnahme von `304`, âNot Modifiedâ (âNicht verändertâ), welche keinen haben darf.
-* **`400`** und darÃŧber stehen fÃŧr âClient errorâ-Responses (âClient-Fehlerâ). Auch diese verwenden Sie am häufigsten.
+* `100 - 199` stehen fÃŧr âInformationâ. Sie verwenden diese selten direkt. Responses mit diesen Statuscodes dÃŧrfen keinen Body haben.
+* **`200 - 299`** stehen fÃŧr âSuccessfulâ-Responses (âErfolgreichâ). Diese werden Sie am häufigsten verwenden.
+ * `200` ist der Default-Statuscode, was bedeutet, alles ist âOKâ.
+ * Ein weiteres Beispiel wäre `201`, âCreatedâ (âErzeugtâ). Dieser wird Ãŧblicherweise verwendet, nachdem ein neuer Datensatz in der Datenbank erstellt wurde.
+ * Ein spezieller Fall ist `204`, âNo Contentâ (âKein Inhaltâ). Diese Response wird verwendet, wenn es keinen Inhalt gibt, der an den Client zurÃŧckgeschickt werden soll, und diese Response darf daher keinen Body haben.
+* **`300 - 399`** stehen fÃŧr âRedirectionâ (âUmleitungâ). Responses mit diesen Statuscodes kÃļnnen einen Body haben oder nicht, auÃer bei `304`, âNot Modifiedâ (âNicht verändertâ), die keinen haben darf.
+* **`400 - 499`** stehen fÃŧr âClient errorâ-Responses (âClient-Fehlerâ). Diese sind die zweithäufigsten, die Sie vermutlich verwenden werden.
* Ein Beispiel ist `404`, fÃŧr eine âNot Foundâ-Response (âNicht gefundenâ).
* FÃŧr allgemeine Fehler beim Client kÃļnnen Sie einfach `400` verwenden.
-* `500` und darÃŧber stehen fÃŧr Server-Fehler. Diese verwenden Sie fast nie direkt. Wenn etwas an irgendeiner Stelle in Ihrem Anwendungscode oder im Server schiefläuft, wird automatisch einer dieser Fehler-Statuscodes zurÃŧckgegeben.
+* `500 - 599` stehen fÃŧr Server-Fehler. Diese verwenden Sie fast nie direkt. Wenn in Ihrem Anwendungscode oder Server etwas schiefgeht, wird automatisch einer dieser Fehler-Statuscodes zurÃŧckgegeben.
/// tip | Tipp
-Um mehr Ãŧber Statuscodes zu lernen, und welcher wofÃŧr verwendet wird, lesen Sie die MDN Dokumentation Ãŧber HTTP-Statuscodes.
+Um mehr Ãŧber die einzelnen Statuscodes zu erfahren und welcher wofÃŧr verwendet wird, sehen Sie sich die MDN Dokumentation Ãŧber HTTP-Statuscodes an.
///
-## AbkÃŧrzung, um die Namen zu erinnern
+## AbkÃŧrzung zur Erinnerung an die Namen { #shortcut-to-remember-the-names }
-Schauen wir uns das vorherige Beispiel noch einmal an:
+Lassen Sie uns das vorherige Beispiel noch einmal anschauen:
{* ../../docs_src/response_status_code/tutorial001.py hl[6] *}
`201` ist der Statuscode fÃŧr âCreatedâ (âErzeugtâ).
-Aber Sie mÃŧssen sich nicht daran erinnern, welcher dieser Codes was bedeutet.
+Aber Sie mÃŧssen sich nicht merken, was jeder dieser Codes bedeutet.
-Sie kÃļnnen die Hilfsvariablen von `fastapi.status` verwenden.
+Sie kÃļnnen die Annehmlichkeit von Variablen aus `fastapi.status` nutzen.
{* ../../docs_src/response_status_code/tutorial002.py hl[1,6] *}
-Diese sind nur eine Annehmlichkeit und enthalten dieselbe Nummer, aber auf diese Weise kÃļnnen Sie die Autovervollständigung Ihres Editors verwenden, um sie zu finden:
+Diese sind nur eine Annehmlichkeit, sie enthalten dieselbe Zahl, aber so kÃļnnen Sie die Autovervollständigung Ihres Editors verwenden, um sie zu finden:
/// note | Technische Details
-Sie kÃļnnen auch `from starlette import status` verwenden.
+Sie kÃļnnten auch `from starlette import status` verwenden.
-**FastAPI** bietet dieselben `starlette.status`-Codes auch via `fastapi.status` an, als Annehmlichkeit fÃŧr Sie, den Entwickler. Sie kommen aber direkt von Starlette.
+**FastAPI** bietet dieselben `starlette.status`-Codes auch via `fastapi.status` an, rein zu Ihrer Annehmlichkeit als Entwickler. Aber sie stammen direkt von Starlette.
///
-## Den Defaultwert ändern
+## Den Defaultwert ändern { #changing-the-default }
-Später sehen Sie, im [Handbuch fÃŧr fortgeschrittene Benutzer](../advanced/response-change-status-code.md){.internal-link target=_blank}, wie Sie einen anderen Statuscode zurÃŧckgeben kÃļnnen, als den Default, den Sie hier deklarieren.
+Später im [Handbuch fÃŧr fortgeschrittene Benutzer](../advanced/response-change-status-code.md){.internal-link target=_blank} werden Sie sehen, wie Sie einen anderen Statuscode zurÃŧckgeben kÃļnnen, als den Default, den Sie hier deklarieren.
diff --git a/docs/de/docs/tutorial/schema-extra-example.md b/docs/de/docs/tutorial/schema-extra-example.md
index f065ad4ca..e2ffed292 100644
--- a/docs/de/docs/tutorial/schema-extra-example.md
+++ b/docs/de/docs/tutorial/schema-extra-example.md
@@ -1,10 +1,10 @@
-# Beispiel-Request-Daten deklarieren
+# Beispiel-Request-Daten deklarieren { #declare-request-example-data }
-Sie kÃļnnen Beispiele fÃŧr die Daten deklarieren, die Ihre Anwendung empfangen kann.
+Sie kÃļnnen Beispiele fÃŧr die Daten deklarieren, die Ihre App empfangen kann.
Hier sind mehrere MÃļglichkeiten, das zu tun.
-## Zusätzliche JSON-Schemadaten in Pydantic-Modellen
+## Zusätzliche JSON-Schemadaten in Pydantic-Modellen { #extra-json-schema-data-in-pydantic-models }
Sie kÃļnnen `examples` (âBeispieleâ) fÃŧr ein Pydantic-Modell deklarieren, welche dem generierten JSON-Schema hinzugefÃŧgt werden.
@@ -24,7 +24,7 @@ Diese zusätzlichen Informationen werden unverändert zum fÃŧr dieses Modell aus
//// tab | Pydantic v2
-In Pydantic Version 2 wÃŧrden Sie das Attribut `model_config` verwenden, das ein `dict` akzeptiert, wie beschrieben in Pydantic-Dokumentation: Configuration.
+In Pydantic Version 2 wÃŧrden Sie das Attribut `model_config` verwenden, das ein `dict` akzeptiert, wie beschrieben in Pydantic-Dokumentation: Configuration.
Sie kÃļnnen `json_schema_extra` setzen, mit einem `dict`, das alle zusätzlichen Daten enthält, die im generierten JSON-Schema angezeigt werden sollen, einschlieÃlich `examples`.
@@ -46,23 +46,23 @@ Sie kÃļnnten das beispielsweise verwenden, um Metadaten fÃŧr eine Frontend-Benut
///
-/// info
+/// info | Info
OpenAPI 3.1.0 (verwendet seit FastAPI 0.99.0) hat UnterstÃŧtzung fÃŧr `examples` hinzugefÃŧgt, was Teil des **JSON Schema** Standards ist.
-Zuvor unterstÃŧtzte es nur das SchlÃŧsselwort `example` mit einem einzigen Beispiel. Dieses wird weiterhin von OpenAPI 3.1.0 unterstÃŧtzt, ist jedoch deprecated und nicht Teil des JSON Schema Standards. Wir empfehlen Ihnen daher, von `example` nach `examples` zu migrieren. đ¤
+Zuvor unterstÃŧtzte es nur das SchlÃŧsselwort `example` mit einem einzigen Beispiel. Dieses wird weiterhin von OpenAPI 3.1.0 unterstÃŧtzt, ist jedoch deprecatet und nicht Teil des JSON Schema Standards. Wir empfehlen Ihnen daher, von `example` nach `examples` zu migrieren. đ¤
Mehr erfahren Sie am Ende dieser Seite.
///
-## Zusätzliche Argumente fÃŧr `Field`
+## Zusätzliche Argumente fÃŧr `Field` { #field-additional-arguments }
Wenn Sie `Field()` mit Pydantic-Modellen verwenden, kÃļnnen Sie ebenfalls zusätzliche `examples` deklarieren:
{* ../../docs_src/schema_extra_example/tutorial002_py310.py hl[2,8:11] *}
-## `examples` im JSON-Schema â OpenAPI
+## `examples` im JSON-Schema â OpenAPI { #examples-in-json-schema-openapi }
Bei Verwendung von:
@@ -76,19 +76,19 @@ Bei Verwendung von:
kÃļnnen Sie auch eine Gruppe von `examples` mit zusätzlichen Informationen deklarieren, die zu ihren **JSON-Schemas** innerhalb von **OpenAPI** hinzugefÃŧgt werden.
-### `Body` mit `examples`
+### `Body` mit `examples` { #body-with-examples }
Hier Ãŧbergeben wir `examples`, welches ein einzelnes Beispiel fÃŧr die in `Body()` erwarteten Daten enthält:
{* ../../docs_src/schema_extra_example/tutorial003_an_py310.py hl[22:29] *}
-### Beispiel in der Dokumentations-Benutzeroberfläche
+### Beispiel in der Dokumentations-Benutzeroberfläche { #example-in-the-docs-ui }
Mit jeder der oben genannten Methoden wÃŧrde es in `/docs` so aussehen:
-### `Body` mit mehreren `examples`
+### `Body` mit mehreren `examples` { #body-with-multiple-examples }
Sie kÃļnnen natÃŧrlich auch mehrere `examples` Ãŧbergeben:
@@ -96,9 +96,9 @@ Sie kÃļnnen natÃŧrlich auch mehrere `examples` Ãŧbergeben:
Wenn Sie das tun, werden die Beispiele Teil des internen **JSON-Schemas** fÃŧr diese Body-Daten.
-Während dies geschrieben wird, unterstÃŧtzt Swagger UI, das fÃŧr die Anzeige der Dokumentations-Benutzeroberfläche zuständige Tool, jedoch nicht die Anzeige mehrerer Beispiele fÃŧr die Daten in **JSON Schema**. Aber lesen Sie unten fÃŧr einen Workaround weiter.
+Während dies geschrieben wird, unterstÃŧtzt Swagger UI, das fÃŧr die Anzeige der Dokumentations-Benutzeroberfläche zuständige Tool, jedoch nicht die Anzeige mehrerer Beispiele fÃŧr die Daten in **JSON Schema**. Aber lesen Sie unten fÃŧr einen Workaround weiter.
-### OpenAPI-spezifische `examples`
+### OpenAPI-spezifische `examples` { #openapi-specific-examples }
Schon bevor **JSON Schema** `examples` unterstÃŧtzte, unterstÃŧtzte OpenAPI ein anderes Feld, das auch `examples` genannt wurde.
@@ -106,11 +106,11 @@ Diese **OpenAPI-spezifischen** `examples` finden sich in einem anderen Abschnitt
Und Swagger UI unterstÃŧtzt dieses spezielle Feld `examples` schon seit einiger Zeit. Sie kÃļnnen es also verwenden, um verschiedene **Beispiele in der Benutzeroberfläche der Dokumentation anzuzeigen**.
-Das Format dieses OpenAPI-spezifischen Felds `examples` ist ein `dict` mit **mehreren Beispielen** (anstelle einer `list`e), jedes mit zusätzlichen Informationen, die auch zu **OpenAPI** hinzugefÃŧgt werden.
+Das Format dieses OpenAPI-spezifischen Felds `examples` ist ein `dict` mit **mehreren Beispielen** (anstelle einer `list`), jedes mit zusätzlichen Informationen, die auch zu **OpenAPI** hinzugefÃŧgt werden.
Dies erfolgt nicht innerhalb jedes in OpenAPI enthaltenen JSON-Schemas, sondern auÃerhalb, in der *Pfadoperation*.
-### Verwendung des Parameters `openapi_examples`
+### Verwendung des Parameters `openapi_examples` { #using-the-openapi-examples-parameter }
Sie kÃļnnen die OpenAPI-spezifischen `examples` in FastAPI mit dem Parameter `openapi_examples` deklarieren, fÃŧr:
@@ -122,7 +122,7 @@ Sie kÃļnnen die OpenAPI-spezifischen `examples` in FastAPI mit dem Parameter `op
* `Form()`
* `File()`
-Die SchlÃŧssel des `dict` identifizieren jedes Beispiel, und jeder Wert (`"value"`) ist ein weiteres `dict`.
+Die SchlÃŧssel des `dict` identifizieren jedes Beispiel, und jeder Wert ist ein weiteres `dict`.
Jedes spezifische Beispiel-`dict` in den `examples` kann Folgendes enthalten:
@@ -135,13 +135,13 @@ Sie kÃļnnen es so verwenden:
{* ../../docs_src/schema_extra_example/tutorial005_an_py310.py hl[23:49] *}
-### OpenAPI-Beispiele in der Dokumentations-Benutzeroberfläche
+### OpenAPI-Beispiele in der Dokumentations-Benutzeroberfläche { #openapi-examples-in-the-docs-ui }
Wenn `openapi_examples` zu `Body()` hinzugefÃŧgt wird, wÃŧrde `/docs` so aussehen:
-## Technische Details
+## Technische Details { #technical-details }
/// tip | Tipp
@@ -177,23 +177,23 @@ OpenAPI fÃŧgte auch die Felder `example` und `examples` zu anderen Teilen der Sp
* `File()`
* `Form()`
-/// info
+/// info | Info
Dieser alte, OpenAPI-spezifische `examples`-Parameter heiÃt seit FastAPI `0.103.0` jetzt `openapi_examples`.
///
-### JSON Schemas Feld `examples`
+### JSON Schemas Feld `examples` { #json-schemas-examples-field }
Aber dann fÃŧgte JSON Schema ein `examples`-Feld zu einer neuen Version der Spezifikation hinzu.
Und dann basierte das neue OpenAPI 3.1.0 auf der neuesten Version (JSON Schema 2020-12), die dieses neue Feld `examples` enthielt.
-Und jetzt hat dieses neue `examples`-Feld Vorrang vor dem alten (und benutzerdefinierten) `example`-Feld, im Singular, das jetzt deprecated ist.
+Und jetzt hat dieses neue `examples`-Feld Vorrang vor dem alten (und benutzerdefinierten) `example`-Feld, im Singular, das jetzt deprecatet ist.
-Dieses neue `examples`-Feld in JSON Schema ist **nur eine `list`e** von Beispielen, kein Dict mit zusätzlichen Metadaten wie an den anderen Stellen in OpenAPI (oben beschrieben).
+Dieses neue `examples`-Feld in JSON Schema ist **nur eine `list`** von Beispielen, kein Dict mit zusätzlichen Metadaten wie an den anderen Stellen in OpenAPI (oben beschrieben).
-/// info
+/// info | Info
Selbst, nachdem OpenAPI 3.1.0 verÃļffentlicht wurde, mit dieser neuen, einfacheren Integration mit JSON Schema, unterstÃŧtzte Swagger UI, das Tool, das die automatische Dokumentation bereitstellt, eine Zeit lang OpenAPI 3.1.0 nicht (das tut es seit Version 5.0.0 đ).
@@ -201,7 +201,7 @@ Aus diesem Grund verwendeten Versionen von FastAPI vor 0.99.0 immer noch Version
///
-### Pydantic- und FastAPI-`examples`
+### Pydantic- und FastAPI-`examples` { #pydantic-and-fastapi-examples }
Wenn Sie `examples` innerhalb eines Pydantic-Modells hinzufÃŧgen, indem Sie `schema_extra` oder `Field(examples=["something"])` verwenden, wird dieses Beispiel dem **JSON-Schema** fÃŧr dieses Pydantic-Modell hinzugefÃŧgt.
@@ -211,14 +211,14 @@ In Versionen von FastAPI vor 0.99.0 (0.99.0 und hÃļher verwenden das neuere Open
Aber jetzt, da FastAPI 0.99.0 und hÃļher, OpenAPI 3.1.0 verwendet, das JSON Schema 2020-12 verwendet, und Swagger UI 5.0.0 und hÃļher, ist alles konsistenter und die Beispiele sind in JSON Schema enthalten.
-### Swagger-Benutzeroberfläche und OpenAPI-spezifische `examples`.
+### Swagger-Benutzeroberfläche und OpenAPI-spezifische `examples` { #swagger-ui-and-openapi-specific-examples }
Da die Swagger-Benutzeroberfläche derzeit nicht mehrere JSON Schema Beispiele unterstÃŧtzt (Stand: 26.08.2023), hatten Benutzer keine MÃļglichkeit, mehrere Beispiele in der Dokumentation anzuzeigen.
Um dieses Problem zu lÃļsen, hat FastAPI `0.103.0` **UnterstÃŧtzung** fÃŧr die Deklaration desselben alten **OpenAPI-spezifischen** `examples`-Felds mit dem neuen Parameter `openapi_examples` hinzugefÃŧgt. đ¤
-### Zusammenfassung
+### Zusammenfassung { #summary }
Ich habe immer gesagt, dass ich Geschichte nicht so sehr mag ... und jetzt schauen Sie mich an, wie ich âTechnikgeschichteâ-Unterricht gebe. đ
-Kurz gesagt: **Upgraden Sie auf FastAPI 0.99.0 oder hÃļher**, und die Dinge sind viel **einfacher, konsistenter und intuitiver**, und Sie mÃŧssen nicht alle diese historischen Details kennen. đ
+Kurz gesagt: **Aktualisieren Sie auf FastAPI 0.99.0 oder hÃļher**, und die Dinge sind viel **einfacher, konsistenter und intuitiver**, und Sie mÃŧssen nicht alle diese historischen Details kennen. đ
diff --git a/docs/de/docs/tutorial/security/first-steps.md b/docs/de/docs/tutorial/security/first-steps.md
index 8fa33db7e..20fcd0c00 100644
--- a/docs/de/docs/tutorial/security/first-steps.md
+++ b/docs/de/docs/tutorial/security/first-steps.md
@@ -1,8 +1,8 @@
-# Sicherheit â Erste Schritte
+# Sicherheit â Erste Schritte { #security-first-steps }
Stellen wir uns vor, dass Sie Ihre **Backend**-API auf einer Domain haben.
-Und Sie haben ein **Frontend** auf einer anderen Domain oder in einem anderen Pfad derselben Domain (oder in einer mobilen Anwendung).
+Und Sie haben ein **Frontend** auf einer anderen Domain oder in einem anderen Pfad derselben Domain (oder in einer Mobile-Anwendung).
Und Sie mÃļchten eine MÃļglichkeit haben, dass sich das Frontend mithilfe eines **Benutzernamens** und eines **Passworts** beim Backend authentisieren kann.
@@ -12,25 +12,33 @@ Aber ersparen wir Ihnen die Zeit, die gesamte lange Spezifikation zu lesen, nur
Lassen Sie uns die von **FastAPI** bereitgestellten Tools verwenden, um Sicherheit zu gewährleisten.
-## Wie es aussieht
+## Wie es aussieht { #how-it-looks }
Lassen Sie uns zunächst einfach den Code verwenden und sehen, wie er funktioniert, und dann kommen wir zurÃŧck, um zu verstehen, was passiert.
-## `main.py` erstellen
+## `main.py` erstellen { #create-main-py }
Kopieren Sie das Beispiel in eine Datei `main.py`:
{* ../../docs_src/security/tutorial001_an_py39.py *}
-## AusfÃŧhren
+## AusfÃŧhren { #run-it }
-/// info
+/// info | Info
-Um hochgeladene Dateien zu empfangen, installieren Sie zuerst `python-multipart`.
+Das Paket `python-multipart` wird automatisch mit **FastAPI** installiert, wenn Sie den Befehl `pip install "fastapi[standard]"` ausfÃŧhren.
-Z. B. `pip install python-multipart`.
+Wenn Sie jedoch den Befehl `pip install fastapi` verwenden, ist das Paket `python-multipart` nicht standardmäÃig enthalten.
-Das, weil **OAuth2** âFormulardatenâ zum Senden von `username` und `password` verwendet.
+Um es manuell zu installieren, stellen Sie sicher, dass Sie eine [Virtuelle Umgebung](../../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren und es dann mit:
+
+```console
+$ pip install python-multipart
+```
+
+installieren.
+
+Das liegt daran, dass **OAuth2** âFormulardatenâ zum Senden von `username` und `password` verwendet.
///
@@ -39,14 +47,14 @@ FÃŧhren Sie das Beispiel aus mit:
-Wenn Sie die Developer Tools Ãļffnen, kÃļnnen Sie sehen, dass die gesendeten Daten nur den Token enthalten. Das Passwort wird nur bei der ersten Anfrage gesendet, um den Benutzer zu authentisieren und diesen Zugriffstoken zu erhalten, aber nicht mehr danach:
+Wenn Sie die Developer Tools Ãļffnen, kÃļnnen Sie sehen, dass die gesendeten Daten nur den Token enthalten. Das Passwort wird nur beim ersten Request gesendet, um den Benutzer zu authentisieren und diesen Zugriffstoken zu erhalten, aber nicht mehr danach:
/// note | Hinweis
-Beachten Sie den Header `Authorization` mit einem Wert, der mit `Bearer` beginnt.
+Beachten Sie den Header `Authorization` mit einem Wert, der mit `Bearer ` beginnt.
///
-## Fortgeschrittene Verwendung mit `scopes`
+## Fortgeschrittene Verwendung mit `scopes` { #advanced-usage-with-scopes }
OAuth2 hat ein Konzept von âScopesâ.
@@ -252,7 +250,7 @@ AnschlieÃend kÃļnnen Sie diesen Token einem Benutzer direkt oder einem Dritten
Wie Sie sie verwenden und wie sie in **FastAPI** integriert sind, erfahren Sie später im **Handbuch fÃŧr fortgeschrittene Benutzer**.
-## Zusammenfassung
+## Zusammenfassung { #recap }
Mit dem, was Sie bis hier gesehen haben, kÃļnnen Sie eine sichere **FastAPI**-Anwendung mithilfe von Standards wie OAuth2 und JWT einrichten.
@@ -266,10 +264,10 @@ Viele Packages, die es stark vereinfachen, mÃŧssen viele Kompromisse beim Datenm
Es gibt Ihnen die volle Flexibilität, diejenigen auszuwählen, die am besten zu Ihrem Projekt passen.
-Und Sie kÃļnnen viele gut gepflegte und weit verbreitete Packages wie `passlib` und `python-jose` direkt verwenden, da **FastAPI** keine komplexen Mechanismen zur Integration externer Pakete erfordert.
+Und Sie kÃļnnen viele gut gepflegte und weit verbreitete Packages wie `passlib` und `PyJWT` direkt verwenden, da **FastAPI** keine komplexen Mechanismen zur Integration externer Pakete erfordert.
Aber es bietet Ihnen die Werkzeuge, um den Prozess so weit wie mÃļglich zu vereinfachen, ohne Kompromisse bei Flexibilität, Robustheit oder Sicherheit einzugehen.
Und Sie kÃļnnen sichere Standardprotokolle wie OAuth2 auf relativ einfache Weise verwenden und implementieren.
-Im **Handbuch fÃŧr fortgeschrittene Benutzer** erfahren Sie mehr darÃŧber, wie Sie OAuth2-âScopesâ fÃŧr ein feingranuliertes Berechtigungssystem verwenden, das denselben Standards folgt. OAuth2 mit Scopes ist der Mechanismus, der von vielen groÃen Authentifizierungsanbietern wie Facebook, Google, GitHub, Microsoft, Twitter, usw. verwendet wird, um Drittanbieteranwendungen zu autorisieren, im Namen ihrer Benutzer mit ihren APIs zu interagieren.
+Im **Handbuch fÃŧr fortgeschrittene Benutzer** erfahren Sie mehr darÃŧber, wie Sie OAuth2-âScopesâ fÃŧr ein feingranuliertes Berechtigungssystem verwenden, das denselben Standards folgt. OAuth2 mit Scopes ist der Mechanismus, der von vielen groÃen Authentifizierungsanbietern wie Facebook, Google, GitHub, Microsoft, X (Twitter), usw. verwendet wird, um Drittanbieteranwendungen zu autorisieren, im Namen ihrer Benutzer mit ihren APIs zu interagieren.
diff --git a/docs/de/docs/tutorial/security/simple-oauth2.md b/docs/de/docs/tutorial/security/simple-oauth2.md
index c0c93cd26..28cb83ba9 100644
--- a/docs/de/docs/tutorial/security/simple-oauth2.md
+++ b/docs/de/docs/tutorial/security/simple-oauth2.md
@@ -1,8 +1,8 @@
-# Einfaches OAuth2 mit Password und Bearer
+# Einfaches OAuth2 mit Password und Bearer { #simple-oauth2-with-password-and-bearer }
Lassen Sie uns nun auf dem vorherigen Kapitel aufbauen und die fehlenden Teile hinzufÃŧgen, um einen vollständigen Sicherheits-Flow zu erhalten.
-## `username` und `password` entgegennehmen
+## `username` und `password` entgegennehmen { #get-the-username-and-password }
Wir werden **FastAPIs** Sicherheits-Werkzeuge verwenden, um den `username` und das `password` entgegenzunehmen.
@@ -18,7 +18,7 @@ Aber fÃŧr die Login-*Pfadoperation* mÃŧssen wir diese Namen verwenden, um mit de
Die Spezifikation besagt auch, dass `username` und `password` als Formulardaten gesendet werden mÃŧssen (hier also kein JSON).
-### `scope`
+### `scope` { #scope }
Ferner sagt die Spezifikation, dass der Client ein weiteres Formularfeld "`scope`" (âGeltungsbereichâ) senden kann.
@@ -32,7 +32,7 @@ Diese werden normalerweise verwendet, um bestimmte Sicherheitsberechtigungen zu
* `instagram_basic` wird von Facebook / Instagram verwendet.
* `https://www.googleapis.com/auth/drive` wird von Google verwendet.
-/// info
+/// info | Info
In OAuth2 ist ein âScopeâ nur ein String, der eine bestimmte erforderliche Berechtigung deklariert.
@@ -44,11 +44,11 @@ FÃŧr OAuth2 sind es einfach nur Strings.
///
-## Code, um `username` und `password` entgegenzunehmen.
+## Code, um `username` und `password` entgegenzunehmen { #code-to-get-the-username-and-password }
Lassen Sie uns nun die von **FastAPI** bereitgestellten Werkzeuge verwenden, um das zu erledigen.
-### `OAuth2PasswordRequestForm`
+### `OAuth2PasswordRequestForm` { #oauth2passwordrequestform }
Importieren Sie zunächst `OAuth2PasswordRequestForm` und verwenden Sie es als Abhängigkeit mit `Depends` in der *Pfadoperation* fÃŧr `/token`:
@@ -59,7 +59,7 @@ Importieren Sie zunächst `OAuth2PasswordRequestForm` und verwenden Sie es als A
* Dem `username`.
* Dem `password`.
* Einem optionalen `scope`-Feld als langem String, bestehend aus durch Leerzeichen getrennten Strings.
-* Einem optionalen `grant_type` (âArt der Anmeldungâ).
+* Einem optionalen `grant_type`.
/// tip | Tipp
@@ -72,7 +72,7 @@ Wenn Sie es erzwingen mÃŧssen, verwenden Sie `OAuth2PasswordRequestFormStrict` a
* Eine optionale `client_id` (benÃļtigen wir fÃŧr unser Beispiel nicht).
* Ein optionales `client_secret` (benÃļtigen wir fÃŧr unser Beispiel nicht).
-/// info
+/// info | Info
`OAuth2PasswordRequestForm` ist keine spezielle Klasse fÃŧr **FastAPI**, so wie `OAuth2PasswordBearer`.
@@ -84,7 +84,7 @@ Da es sich jedoch um einen häufigen Anwendungsfall handelt, wird er zur Vereinf
///
-### Die Formulardaten verwenden
+### Die Formulardaten verwenden { #use-the-form-data }
/// tip | Tipp
@@ -102,7 +102,7 @@ FÃŧr den Fehler verwenden wir die Exception `HTTPException`:
{* ../../docs_src/security/tutorial003_an_py310.py hl[3,79:81] *}
-### Das Passwort ÃŧberprÃŧfen
+### Das Passwort ÃŧberprÃŧfen { #check-the-password }
Zu diesem Zeitpunkt liegen uns die Benutzerdaten aus unserer Datenbank vor, das Passwort haben wir jedoch noch nicht ÃŧberprÃŧft.
@@ -112,7 +112,7 @@ Sie sollten niemals Klartext-PasswÃļrter speichern, daher verwenden wir ein (gef
Wenn die PasswÃļrter nicht Ãŧbereinstimmen, geben wir denselben Fehler zurÃŧck.
-#### Passwort-Hashing
+#### Passwort-Hashing { #password-hashing }
âHashingâ bedeutet: Konvertieren eines Inhalts (in diesem Fall eines Passworts) in eine Folge von Bytes (ein schlichter String), die wie Kauderwelsch aussieht.
@@ -120,7 +120,7 @@ Immer wenn Sie genau den gleichen Inhalt (genau das gleiche Passwort) Ãŧbergeben
Sie kÃļnnen jedoch nicht vom Kauderwelsch zurÃŧck zum Passwort konvertieren.
-##### Warum Passwort-Hashing verwenden?
+##### Warum Passwort-Hashing verwenden? { #why-use-password-hashing }
Wenn Ihre Datenbank gestohlen wird, hat der Dieb nicht die Klartext-PasswÃļrter Ihrer Benutzer, sondern nur die Hashes.
@@ -128,7 +128,7 @@ Der Dieb kann also nicht versuchen, die gleichen PasswÃļrter in einem anderen Sy
{* ../../docs_src/security/tutorial003_an_py310.py hl[82:85] *}
-#### Ãber `**user_dict`
+#### Ãber `**user_dict` { #about-user-dict }
`UserInDB(**user_dict)` bedeutet:
@@ -144,15 +144,15 @@ UserInDB(
)
```
-/// info
+/// info | Info
-Eine ausfÃŧhrlichere Erklärung von `**user_dict` finden Sie in [der Dokumentation fÃŧr **Extra Modelle**](../extra-models.md#uber-user_indict){.internal-link target=_blank}.
+Eine ausfÃŧhrlichere Erklärung von `**user_dict` finden Sie in [der Dokumentation fÃŧr **Extra Modelle**](../extra-models.md#about-user-in-dict){.internal-link target=_blank}.
///
-## Den Token zurÃŧckgeben
+## Den Token zurÃŧckgeben { #return-the-token }
-Die Response des `token`-Endpunkts muss ein JSON-Objekt sein.
+Die Response des `token`-Endpunkts muss ein JSON-Objekt sein.
Es sollte einen `token_type` haben. Da wir in unserem Fall âBearerâ-Token verwenden, sollte der Token-Typ "`bearer`" sein.
@@ -182,7 +182,7 @@ Den Rest erledigt **FastAPI** fÃŧr Sie.
///
-## Die Abhängigkeiten aktualisieren
+## Die Abhängigkeiten aktualisieren { #update-the-dependencies }
Jetzt werden wir unsere Abhängigkeiten aktualisieren.
@@ -196,7 +196,7 @@ In unserem Endpunkt erhalten wir also nur dann einen Benutzer, wenn der Benutzer
{* ../../docs_src/security/tutorial003_an_py310.py hl[58:66,69:74,94] *}
-/// info
+/// info | Info
Der zusätzliche Header `WWW-Authenticate` mit dem Wert `Bearer`, den wir hier zurÃŧckgeben, ist ebenfalls Teil der Spezifikation.
@@ -214,11 +214,11 @@ Das ist der Vorteil von Standards ...
///
-## Es in Aktion sehen
+## Es in Aktion sehen { #see-it-in-action }
Ãffnen Sie die interaktive Dokumentation: http://127.0.0.1:8000/docs.
-### Authentifizieren
+### Authentifizieren { #authenticate }
Klicken Sie auf den Button âAuthorizeâ.
@@ -234,7 +234,7 @@ Nach der Authentifizierung im System sehen Sie Folgendes:
-### Die eigenen Benutzerdaten ansehen
+### Die eigenen Benutzerdaten ansehen { #get-your-own-user-data }
Verwenden Sie nun die Operation `GET` mit dem Pfad `/users/me`.
@@ -260,7 +260,7 @@ Wenn Sie auf das Schlosssymbol klicken und sich abmelden und dann den gleichen V
}
```
-### Inaktiver Benutzer
+### Inaktiver Benutzer { #inactive-user }
Versuchen Sie es nun mit einem inaktiven Benutzer und authentisieren Sie sich mit:
@@ -278,7 +278,7 @@ Sie erhalten die Fehlermeldung âInactive userâ:
}
```
-## Zusammenfassung
+## Zusammenfassung { #recap }
Sie verfÃŧgen jetzt Ãŧber die Tools, um ein vollständiges Sicherheitssystem basierend auf `username` und `password` fÃŧr Ihre API zu implementieren.
diff --git a/docs/de/docs/tutorial/sql-databases.md b/docs/de/docs/tutorial/sql-databases.md
new file mode 100644
index 000000000..cf9731aee
--- /dev/null
+++ b/docs/de/docs/tutorial/sql-databases.md
@@ -0,0 +1,357 @@
+# SQL (Relationale) Datenbanken { #sql-relational-databases }
+
+**FastAPI** erfordert nicht, dass Sie eine SQL (relationale) Datenbank verwenden. Sondern Sie kÃļnnen **jede beliebige Datenbank** verwenden, die Sie mÃļchten.
+
+Hier werden wir ein Beispiel mit SQLModel sehen.
+
+**SQLModel** basiert auf SQLAlchemy und Pydantic. Es wurde vom selben Autor wie **FastAPI** entwickelt, um die perfekte Ergänzung fÃŧr FastAPI-Anwendungen zu sein, die **SQL-Datenbanken** verwenden mÃŧssen.
+
+/// tip | Tipp
+
+Sie kÃļnnten jede andere SQL- oder NoSQL-Datenbankbibliothek verwenden, die Sie mÃļchten (in einigen Fällen als âORMsâ bezeichnet), FastAPI zwingt Sie nicht, irgendetwas zu verwenden. đ
+
+///
+
+Da SQLModel auf SQLAlchemy basiert, kÃļnnen Sie problemlos **jede von SQLAlchemy unterstÃŧtzte Datenbank** verwenden (was auch bedeutet, dass sie von SQLModel unterstÃŧtzt werden), wie:
+
+* PostgreSQL
+* MySQL
+* SQLite
+* Oracle
+* Microsoft SQL Server, usw.
+
+In diesem Beispiel verwenden wir **SQLite**, da es eine einzelne Datei verwendet und Python integrierte UnterstÃŧtzung bietet. Sie kÃļnnen also dieses Beispiel kopieren und direkt ausfÃŧhren.
+
+Später, fÃŧr Ihre Produktionsanwendung, mÃļchten Sie mÃļglicherweise einen Datenbankserver wie **PostgreSQL** verwenden.
+
+/// tip | Tipp
+
+Es gibt einen offiziellen Projektgenerator mit **FastAPI** und **PostgreSQL**, einschlieÃlich eines Frontends und weiterer Tools: https://github.com/fastapi/full-stack-fastapi-template
+
+///
+
+Dies ist ein sehr einfaches und kurzes Tutorial. Wenn Sie mehr Ãŧber Datenbanken im Allgemeinen, Ãŧber SQL oder fortgeschrittenere Funktionen erfahren mÃļchten, besuchen Sie die SQLModel-Dokumentation.
+
+## `SQLModel` installieren { #install-sqlmodel }
+
+Stellen Sie zunächst sicher, dass Sie Ihre [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren und dann `sqlmodel` installieren:
+
+
+
+lt
+* XWT
+* PSGI
+
+### The abbr gives an explanation { #the-abbr-gives-an-explanation }
+
+* cluster
+* Deep Learning
+
+### The abbr gives a full phrase and an explanation { #the-abbr-gives-a-full-phrase-and-an-explanation }
+
+* MDN
+* I/O.
+
+////
+
+//// tab | Info
+
+"title" attributes of "abbr" elements are translated following some specific instructions.
+
+Translations can add their own "abbr" elements which the LLM should not remove. E.g. to explain English words.
+
+See section `### HTML abbr elements` in the general prompt in `scripts/translate.py`.
+
+////
+
+## Headings { #headings }
+
+//// tab | Test
+
+### Develop a webapp - a tutorial { #develop-a-webapp-a-tutorial }
+
+Hello.
+
+### Type hints and -annotations { #type-hints-and-annotations }
+
+Hello again.
+
+### Super- and subclasses { #super-and-subclasses }
+
+Hello again.
+
+////
+
+//// tab | Info
+
+The only hard rule for headings is that the LLM leaves the hash part inside curly brackets unchanged, which ensures that links do not break.
+
+See section `### Headings` in the general prompt in `scripts/translate.py`.
+
+For some language specific instructions, see e.g. section `### Headings` in `docs/de/llm-prompt.md`.
+
+////
+
+## Terms used in the docs { #terms-used-in-the-docs }
+
+//// tab | Test
+
+* you
+* your
+
+* e.g.
+* etc.
+
+* `foo` as an `int`
+* `bar` as a `str`
+* `baz` as a `list`
+
+* the Tutorial - User guide
+* the Advanced User Guide
+* the SQLModel docs
+* the API docs
+* the automatic docs
+
+* Data Science
+* Deep Learning
+* Machine Learning
+* Dependency Injection
+* HTTP Basic authentication
+* HTTP Digest
+* ISO format
+* the JSON Schema standard
+* the JSON schema
+* the schema definition
+* Password Flow
+* Mobile
+
+* deprecated
+* designed
+* invalid
+* on the fly
+* standard
+* default
+* case-sensitive
+* case-insensitive
+
+* to serve the application
+* to serve the page
+
+* the app
+* the application
+
+* the request
+* the response
+* the error response
+
+* the path operation
+* the path operation decorator
+* the path operation function
+
+* the body
+* the request body
+* the response body
+* the JSON body
+* the form body
+* the file body
+* the function body
+
+* the parameter
+* the body parameter
+* the path parameter
+* the query parameter
+* the cookie parameter
+* the header parameter
+* the form parameter
+* the function parameter
+
+* the event
+* the startup event
+* the startup of the server
+* the shutdown event
+* the lifespan event
+
+* the handler
+* the event handler
+* the exception handler
+* to handle
+
+* the model
+* the Pydantic model
+* the data model
+* the database model
+* the form model
+* the model object
+
+* the class
+* the base class
+* the parent class
+* the subclass
+* the child class
+* the sibling class
+* the class method
+
+* the header
+* the headers
+* the authorization header
+* the `Authorization` header
+* the forwarded header
+
+* the dependency injection system
+* the dependency
+* the dependable
+* the dependant
+
+* I/O bound
+* CPU bound
+* concurrency
+* parallelism
+* multiprocessing
+
+* the env var
+* the environment variable
+* the `PATH`
+* the `PATH` variable
+
+* the authentication
+* the authentication provider
+* the authorization
+* the authorization form
+* the authorization provider
+* the user authenticates
+* the system authenticates the user
+
+* the CLI
+* the command line interface
+
+* the server
+* the client
+
+* the cloud provider
+* the cloud service
+
+* the development
+* the development stages
+
+* the dict
+* the dictionary
+* the enumeration
+* the enum
+* the enum member
+
+* the encoder
+* the decoder
+* to encode
+* to decode
+
+* the exception
+* to raise
+
+* the expression
+* the statement
+
+* the frontend
+* the backend
+
+* the GitHub discussion
+* the GitHub issue
+
+* the performance
+* the performance optimization
+
+* the return type
+* the return value
+
+* the security
+* the security scheme
+
+* the task
+* the background task
+* the task function
+
+* the template
+* the template engine
+
+* the type annotation
+* the type hint
+
+* the server worker
+* the Uvicorn worker
+* the Gunicorn Worker
+* the worker process
+* the worker class
+* the workload
+
+* the deployment
+* to deploy
+
+* the SDK
+* the software development kit
+
+* the `APIRouter`
+* the `requirements.txt`
+* the Bearer Token
+* the breaking change
+* the bug
+* the button
+* the callable
+* the code
+* the commit
+* the context manager
+* the coroutine
+* the database session
+* the disk
+* the domain
+* the engine
+* the fake X
+* the HTTP GET method
+* the item
+* the library
+* the lifespan
+* the lock
+* the middleware
+* the mobile application
+* the module
+* the mounting
+* the network
+* the origin
+* the override
+* the payload
+* the processor
+* the property
+* the proxy
+* the pull request
+* the query
+* the RAM
+* the remote machine
+* the status code
+* the string
+* the tag
+* the web framework
+* the wildcard
+* to return
+* to validate
+
+////
+
+//// tab | Info
+
+This is a not complete and not normative list of (mostly) technical terms seen in the docs. It may be helpful for the prompt designer to figure out for which terms the LLM needs a helping hand. For example when it keeps reverting a good translation to a suboptimal translation. Or when it has problems conjugating/declinating a term in your language.
+
+See e.g. section `### List of English terms and their preferred German translations` in `docs/de/llm-prompt.md`.
+
+////
diff --git a/docs/en/docs/about/index.md b/docs/en/docs/about/index.md
index 27b78696b..d178dfec7 100644
--- a/docs/en/docs/about/index.md
+++ b/docs/en/docs/about/index.md
@@ -1,3 +1,3 @@
-# About
+# About { #about }
About FastAPI, its design, inspiration and more. đ¤
diff --git a/docs/en/docs/advanced/additional-responses.md b/docs/en/docs/advanced/additional-responses.md
index 03d48c2a7..799532c5b 100644
--- a/docs/en/docs/advanced/additional-responses.md
+++ b/docs/en/docs/advanced/additional-responses.md
@@ -1,4 +1,4 @@
-# Additional Responses in OpenAPI
+# Additional Responses in OpenAPI { #additional-responses-in-openapi }
/// warning
@@ -14,7 +14,7 @@ Those additional responses will be included in the OpenAPI schema, so they will
But for those additional responses you have to make sure you return a `Response` like `JSONResponse` directly, with your status code and content.
-## Additional Response with `model`
+## Additional Response with `model` { #additional-response-with-model }
You can pass to your *path operation decorators* a parameter `responses`.
@@ -169,7 +169,7 @@ The schemas are referenced to another place inside the OpenAPI schema:
}
```
-## Additional media types for the main response
+## Additional media types for the main response { #additional-media-types-for-the-main-response }
You can use this same `responses` parameter to add different media types for the same main response.
@@ -191,7 +191,7 @@ But if you have specified a custom response class with `None` as its media type,
///
-## Combining information
+## Combining information { #combining-information }
You can also combine response information from multiple places, including the `response_model`, `status_code`, and `responses` parameters.
@@ -209,7 +209,7 @@ It will all be combined and included in your OpenAPI, and shown in the API docs:
-## Combine predefined responses and custom ones
+## Combine predefined responses and custom ones { #combine-predefined-responses-and-custom-ones }
You might want to have some predefined responses that apply to many *path operations*, but you want to combine them with custom responses needed by each *path operation*.
@@ -239,7 +239,7 @@ For example:
{* ../../docs_src/additional_responses/tutorial004.py hl[13:17,26] *}
-## More information about OpenAPI responses
+## More information about OpenAPI responses { #more-information-about-openapi-responses }
To see what exactly you can include in the responses, you can check these sections in the OpenAPI specification:
diff --git a/docs/en/docs/advanced/additional-status-codes.md b/docs/en/docs/advanced/additional-status-codes.md
index 077a00488..23bcd13c3 100644
--- a/docs/en/docs/advanced/additional-status-codes.md
+++ b/docs/en/docs/advanced/additional-status-codes.md
@@ -1,10 +1,10 @@
-# Additional Status Codes
+# Additional Status Codes { #additional-status-codes }
By default, **FastAPI** will return the responses using a `JSONResponse`, putting the content you return from your *path operation* inside of that `JSONResponse`.
It will use the default status code or the one you set in your *path operation*.
-## Additional status codes
+## Additional status codes { #additional-status-codes_1 }
If you want to return additional status codes apart from the main one, you can do that by returning a `Response` directly, like a `JSONResponse`, and set the additional status code directly.
@@ -34,7 +34,7 @@ You could also use `from starlette.responses import JSONResponse`.
///
-## OpenAPI and API docs
+## OpenAPI and API docs { #openapi-and-api-docs }
If you return additional status codes and responses directly, they won't be included in the OpenAPI schema (the API docs), because FastAPI doesn't have a way to know beforehand what you are going to return.
diff --git a/docs/en/docs/advanced/advanced-dependencies.md b/docs/en/docs/advanced/advanced-dependencies.md
index f933fd264..e0404b389 100644
--- a/docs/en/docs/advanced/advanced-dependencies.md
+++ b/docs/en/docs/advanced/advanced-dependencies.md
@@ -1,6 +1,6 @@
-# Advanced Dependencies
+# Advanced Dependencies { #advanced-dependencies }
-## Parameterized dependencies
+## Parameterized dependencies { #parameterized-dependencies }
All the dependencies we have seen are a fixed function or class.
@@ -10,7 +10,7 @@ Let's imagine that we want to have a dependency that checks if the query paramet
But we want to be able to parameterize that fixed content.
-## A "callable" instance
+## A "callable" instance { #a-callable-instance }
In Python there's a way to make an instance of a class a "callable".
@@ -22,7 +22,7 @@ To do that, we declare a method `__call__`:
In this case, this `__call__` is what **FastAPI** will use to check for additional parameters and sub-dependencies, and this is what will be called to pass a value to the parameter in your *path operation function* later.
-## Parameterize the instance
+## Parameterize the instance { #parameterize-the-instance }
And now, we can use `__init__` to declare the parameters of the instance that we can use to "parameterize" the dependency:
@@ -30,7 +30,7 @@ And now, we can use `__init__` to declare the parameters of the instance that we
In this case, **FastAPI** won't ever touch or care about `__init__`, we will use it directly in our code.
-## Create an instance
+## Create an instance { #create-an-instance }
We could create an instance of this class with:
@@ -38,7 +38,7 @@ We could create an instance of this class with:
And that way we are able to "parameterize" our dependency, that now has `"bar"` inside of it, as the attribute `checker.fixed_content`.
-## Use the instance as a dependency
+## Use the instance as a dependency { #use-the-instance-as-a-dependency }
Then, we could use this `checker` in a `Depends(checker)`, instead of `Depends(FixedContentQueryChecker)`, because the dependency is the instance, `checker`, not the class itself.
@@ -63,3 +63,91 @@ In the chapters about security, there are utility functions that are implemented
If you understood all this, you already know how those utility tools for security work underneath.
///
+
+## Dependencies with `yield`, `HTTPException`, `except` and Background Tasks { #dependencies-with-yield-httpexception-except-and-background-tasks }
+
+/// warning
+
+You most probably don't need these technical details.
+
+These details are useful mainly if you had a FastAPI application older than 0.118.0 and you are facing issues with dependencies with `yield`.
+
+///
+
+Dependencies with `yield` have evolved over time to account for the different use cases and to fix some issues, here's a summary of what has changed.
+
+### Dependencies with `yield` and `StreamingResponse`, Technical Details { #dependencies-with-yield-and-streamingresponse-technical-details }
+
+Before FastAPI 0.118.0, if you used a dependency with `yield`, it would run the exit code after the *path operation function* returned but right before sending the response.
+
+The intention was to avoid holding resources for longer than necessary, waiting for the response to travel through the network.
+
+This change also meant that if you returned a `StreamingResponse`, the exit code of the dependency with `yield` would have been already run.
+
+For example, if you had a database session in a dependency with `yield`, the `StreamingResponse` would not be able to use that session while streaming data because the session would have already been closed in the exit code after `yield`.
+
+This behavior was reverted in 0.118.0, to make the exit code after `yield` be executed after the response is sent.
+
+/// info
+
+As you will see below, this is very similar to the behavior before version 0.106.0, but with several improvements and bug fixes for corner cases.
+
+///
+
+#### Use Cases with Early Exit Code { #use-cases-with-early-exit-code }
+
+There are some use cases with specific conditions that could benefit from the old behavior of running the exit code of dependencies with `yield` before sending the response.
+
+For example, imagine you have code that uses a database session in a dependency with `yield` only to verify a user, but the database session is never used again in the *path operation function*, only in the dependency, **and** the response takes a long time to be sent, like a `StreamingResponse` that sends data slowly, but for some reason doesn't use the database.
+
+In this case, the database session would be held until the response is finished being sent, but if you don't use it, then it wouldn't be necessary to hold it.
+
+Here's how it could look like:
+
+{* ../../docs_src/dependencies/tutorial013_an_py310.py *}
+
+The exit code, the automatic closing of the `Session` in:
+
+{* ../../docs_src/dependencies/tutorial013_an_py310.py ln[19:21] *}
+
+...would be run after the the response finishes sending the slow data:
+
+{* ../../docs_src/dependencies/tutorial013_an_py310.py ln[30:38] hl[31:33] *}
+
+But as `generate_stream()` doesn't use the database session, it is not really necessary to keep the session open while sending the response.
+
+If you have this specific use case using SQLModel (or SQLAlchemy), you could explicitly close the session after you don't need it anymore:
+
+{* ../../docs_src/dependencies/tutorial014_an_py310.py ln[24:28] hl[28] *}
+
+That way the session would release the database connection, so other requests could use it.
+
+If you have a different use case that needs to exit early from a dependency with `yield`, please create a GitHub Discussion Question with your specific use case and why you would benefit from having early closing for dependencies with `yield`.
+
+If there are compelling use cases for early closing in dependencies with `yield`, I would consider adding a new way to opt in to early closing.
+
+### Dependencies with `yield` and `except`, Technical Details { #dependencies-with-yield-and-except-technical-details }
+
+Before FastAPI 0.110.0, if you used a dependency with `yield`, and then you captured an exception with `except` in that dependency, and you didn't raise the exception again, the exception would be automatically raised/forwarded to any exception handlers or the internal server error handler.
+
+This was changed in version 0.110.0 to fix unhandled memory consumption from forwarded exceptions without a handler (internal server errors), and to make it consistent with the behavior of regular Python code.
+
+### Background Tasks and Dependencies with `yield`, Technical Details { #background-tasks-and-dependencies-with-yield-technical-details }
+
+Before FastAPI 0.106.0, raising exceptions after `yield` was not possible, the exit code in dependencies with `yield` was executed *after* the response was sent, so [Exception Handlers](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank} would have already run.
+
+This was designed this way mainly to allow using the same objects "yielded" by dependencies inside of background tasks, because the exit code would be executed after the background tasks were finished.
+
+This was changed in FastAPI 0.106.0 with the intention to not hold resources while waiting for the response to travel through the network.
+
+/// tip
+
+Additionally, a background task is normally an independent set of logic that should be handled separately, with its own resources (e.g. its own database connection).
+
+So, this way you will probably have cleaner code.
+
+///
+
+If you used to rely on this behavior, now you should create the resources for background tasks inside the background task itself, and use internally only data that doesn't depend on the resources of dependencies with `yield`.
+
+For example, instead of using the same database session, you would create a new database session inside of the background task, and you would obtain the objects from the database using this new session. And then instead of passing the object from the database as a parameter to the background task function, you would pass the ID of that object and then obtain the object again inside the background task function.
diff --git a/docs/en/docs/advanced/async-tests.md b/docs/en/docs/advanced/async-tests.md
index 8d6929222..e920e22c3 100644
--- a/docs/en/docs/advanced/async-tests.md
+++ b/docs/en/docs/advanced/async-tests.md
@@ -1,4 +1,4 @@
-# Async Tests
+# Async Tests { #async-tests }
You have already seen how to test your **FastAPI** applications using the provided `TestClient`. Up to now, you have only seen how to write synchronous tests, without using `async` functions.
@@ -6,11 +6,11 @@ Being able to use asynchronous functions in your tests could be useful, for exam
Let's look at how we can make that work.
-## pytest.mark.anyio
+## pytest.mark.anyio { #pytest-mark-anyio }
If we want to call asynchronous functions in our tests, our test functions have to be asynchronous. AnyIO provides a neat plugin for this, that allows us to specify that some test functions are to be called asynchronously.
-## HTTPX
+## HTTPX { #httpx }
Even if your **FastAPI** application uses normal `def` functions instead of `async def`, it is still an `async` application underneath.
@@ -18,7 +18,7 @@ The `TestClient` does some magic inside to call the asynchronous FastAPI applica
The `TestClient` is based on HTTPX, and luckily, we can use it directly to test the API.
-## Example
+## Example { #example }
For a simple example, let's consider a file structure similar to the one described in [Bigger Applications](../tutorial/bigger-applications.md){.internal-link target=_blank} and [Testing](../tutorial/testing.md){.internal-link target=_blank}:
@@ -38,7 +38,7 @@ The file `test_main.py` would have the tests for `main.py`, it could look like t
{* ../../docs_src/async_tests/test_main.py *}
-## Run it
+## Run it { #run-it }
You can run your tests as usual via:
@@ -52,7 +52,7 @@ $ pytest
-## Available responses
+## Available responses { #available-responses }
Here are some of the available responses.
@@ -121,7 +121,7 @@ You could also use `from starlette.responses import HTMLResponse`.
///
-### `Response`
+### `Response` { #response }
The main `Response` class, all the other responses inherit from it.
@@ -138,23 +138,23 @@ FastAPI (actually Starlette) will automatically include a Content-Length header.
{* ../../docs_src/response_directly/tutorial002.py hl[1,18] *}
-### `HTMLResponse`
+### `HTMLResponse` { #htmlresponse }
Takes some text or bytes and returns an HTML response, as you read above.
-### `PlainTextResponse`
+### `PlainTextResponse` { #plaintextresponse }
Takes some text or bytes and returns a plain text response.
{* ../../docs_src/custom_response/tutorial005.py hl[2,7,9] *}
-### `JSONResponse`
+### `JSONResponse` { #jsonresponse }
Takes some data and returns an `application/json` encoded response.
This is the default response used in **FastAPI**, as you read above.
-### `ORJSONResponse`
+### `ORJSONResponse` { #orjsonresponse }
A fast alternative JSON response using `orjson`, as you read above.
@@ -164,7 +164,7 @@ This requires installing `orjson` for example with `pip install orjson`.
///
-### `UJSONResponse`
+### `UJSONResponse` { #ujsonresponse }
An alternative JSON response using `ujson`.
@@ -188,7 +188,7 @@ It's possible that `ORJSONResponse` might be a faster alternative.
///
-### `RedirectResponse`
+### `RedirectResponse` { #redirectresponse }
Returns an HTTP redirect. Uses a 307 status code (Temporary Redirect) by default.
@@ -213,15 +213,15 @@ You can also use the `status_code` parameter combined with the `response_class`
{* ../../docs_src/custom_response/tutorial006c.py hl[2,7,9] *}
-### `StreamingResponse`
+### `StreamingResponse` { #streamingresponse }
Takes an async generator or a normal generator/iterator and streams the response body.
{* ../../docs_src/custom_response/tutorial007.py hl[2,14] *}
-#### Using `StreamingResponse` with file-like objects
+#### Using `StreamingResponse` with file-like objects { #using-streamingresponse-with-file-like-objects }
-If you have a file-like object (e.g. the object returned by `open()`), you can create a generator function to iterate over that file-like object.
+If you have a file-like object (e.g. the object returned by `open()`), you can create a generator function to iterate over that file-like object.
That way, you don't have to read it all first in memory, and you can pass that generator function to the `StreamingResponse`, and return it.
@@ -243,7 +243,7 @@ Notice that here as we are using standard `open()` that doesn't support `async`
///
-### `FileResponse`
+### `FileResponse` { #fileresponse }
Asynchronously streams a file as the response.
@@ -264,7 +264,7 @@ You can also use the `response_class` parameter:
In this case, you can return the file path directly from your *path operation* function.
-## Custom response class
+## Custom response class { #custom-response-class }
You can create your own custom response class, inheriting from `Response` and using it.
@@ -292,7 +292,7 @@ Now instead of returning:
Of course, you will probably find much better ways to take advantage of this than formatting JSON. đ
-## Default response class
+## Default response class { #default-response-class }
When creating a **FastAPI** class instance or an `APIRouter` you can specify which response class to use by default.
@@ -308,6 +308,6 @@ You can still override `response_class` in *path operations* as before.
///
-## Additional documentation
+## Additional documentation { #additional-documentation }
You can also declare the media type and many other details in OpenAPI using `responses`: [Additional Responses in OpenAPI](additional-responses.md){.internal-link target=_blank}.
diff --git a/docs/en/docs/advanced/dataclasses.md b/docs/en/docs/advanced/dataclasses.md
index 2936c6d5d..b7b9b65c5 100644
--- a/docs/en/docs/advanced/dataclasses.md
+++ b/docs/en/docs/advanced/dataclasses.md
@@ -1,4 +1,4 @@
-# Using Dataclasses
+# Using Dataclasses { #using-dataclasses }
FastAPI is built on top of **Pydantic**, and I have been showing you how to use Pydantic models to declare requests and responses.
@@ -28,7 +28,7 @@ But if you have a bunch of dataclasses laying around, this is a nice trick to us
///
-## Dataclasses in `response_model`
+## Dataclasses in `response_model` { #dataclasses-in-response-model }
You can also use `dataclasses` in the `response_model` parameter:
@@ -40,7 +40,7 @@ This way, its schema will show up in the API docs user interface:
-## Dataclasses in Nested Data Structures
+## Dataclasses in Nested Data Structures { #dataclasses-in-nested-data-structures }
You can also combine `dataclasses` with other type annotations to make nested data structures.
@@ -84,12 +84,12 @@ You can combine `dataclasses` with other type annotations in many different comb
Check the in-code annotation tips above to see more specific details.
-## Learn More
+## Learn More { #learn-more }
You can also combine `dataclasses` with other Pydantic models, inherit from them, include them in your own models, etc.
To learn more, check the Pydantic docs about dataclasses.
-## Version
+## Version { #version }
This is available since FastAPI version `0.67.0`. đ
diff --git a/docs/en/docs/advanced/events.md b/docs/en/docs/advanced/events.md
index 19465d891..c805e81ee 100644
--- a/docs/en/docs/advanced/events.md
+++ b/docs/en/docs/advanced/events.md
@@ -1,4 +1,4 @@
-# Lifespan Events
+# Lifespan Events { #lifespan-events }
You can define logic (code) that should be executed before the application **starts up**. This means that this code will be executed **once**, **before** the application **starts receiving requests**.
@@ -8,7 +8,7 @@ Because this code is executed before the application **starts** taking requests,
This can be very useful for setting up **resources** that you need to use for the whole app, and that are **shared** among requests, and/or that you need to **clean up** afterwards. For example, a database connection pool, or loading a shared machine learning model.
-## Use Case
+## Use Case { #use-case }
Let's start with an example **use case** and then see how to solve it with this.
@@ -22,7 +22,7 @@ You could load it at the top level of the module/file, but that would also mean
That's what we'll solve, let's load the model before the requests are handled, but only right before the application starts receiving requests, not while the code is being loaded.
-## Lifespan
+## Lifespan { #lifespan }
You can define this *startup* and *shutdown* logic using the `lifespan` parameter of the `FastAPI` app, and a "context manager" (I'll show you what that is in a second).
@@ -44,7 +44,7 @@ Maybe you need to start a new version, or you just got tired of running it. đ¤ˇ
///
-### Lifespan function
+### Lifespan function { #lifespan-function }
The first thing to notice, is that we are defining an async function with `yield`. This is very similar to Dependencies with `yield`.
@@ -54,7 +54,7 @@ The first part of the function, before the `yield`, will be executed **before**
And the part after the `yield` will be executed **after** the application has finished.
-### Async Context Manager
+### Async Context Manager { #async-context-manager }
If you check, the function is decorated with an `@asynccontextmanager`.
@@ -84,7 +84,7 @@ The `lifespan` parameter of the `FastAPI` app takes an **async context manager**
{* ../../docs_src/events/tutorial003.py hl[22] *}
-## Alternative Events (deprecated)
+## Alternative Events (deprecated) { #alternative-events-deprecated }
/// warning
@@ -100,7 +100,7 @@ You can define event handlers (functions) that need to be executed before the ap
These functions can be declared with `async def` or normal `def`.
-### `startup` event
+### `startup` event { #startup-event }
To add a function that should be run before the application starts, declare it with the event `"startup"`:
@@ -112,7 +112,7 @@ You can add more than one event handler function.
And your application won't start receiving requests until all the `startup` event handlers have completed.
-### `shutdown` event
+### `shutdown` event { #shutdown-event }
To add a function that should be run when the application is shutting down, declare it with the event `"shutdown"`:
@@ -138,7 +138,7 @@ So, we declare the event handler function with standard `def` instead of `async
///
-### `startup` and `shutdown` together
+### `startup` and `shutdown` together { #startup-and-shutdown-together }
There's a high chance that the logic for your *startup* and *shutdown* is connected, you might want to start something and then finish it, acquire a resource and then release it, etc.
@@ -146,7 +146,7 @@ Doing that in separated functions that don't share logic or variables together i
Because of that, it's now recommended to instead use the `lifespan` as explained above.
-## Technical Details
+## Technical Details { #technical-details }
Just a technical detail for the curious nerds. đ¤
@@ -160,6 +160,6 @@ Including how to handle lifespan state that can be used in other areas of your c
///
-## Sub Applications
+## Sub Applications { #sub-applications }
đ¨ Keep in mind that these lifespan events (startup and shutdown) will only be executed for the main application, not for [Sub Applications - Mounts](sub-applications.md){.internal-link target=_blank}.
diff --git a/docs/en/docs/advanced/generate-clients.md b/docs/en/docs/advanced/generate-clients.md
index 55e6a08b1..897c30808 100644
--- a/docs/en/docs/advanced/generate-clients.md
+++ b/docs/en/docs/advanced/generate-clients.md
@@ -1,34 +1,42 @@
-# Generate Clients
+# Generating SDKs { #generating-sdks }
-As **FastAPI** is based on the OpenAPI specification, you get automatic compatibility with many tools, including the automatic API docs (provided by Swagger UI).
+Because **FastAPI** is based on the **OpenAPI** specification, its APIs can be described in a standard format that many tools understand.
-One particular advantage that is not necessarily obvious is that you can **generate clients** (sometimes called **SDKs** ) for your API, for many different **programming languages**.
+This makes it easy to generate up-to-date **documentation**, client libraries (**SDKs**) in multiple languages, and **testing** or **automation workflows** that stay in sync with your code.
-## OpenAPI Client Generators
+In this guide, you'll learn how to generate a **TypeScript SDK** for your FastAPI backend.
-There are many tools to generate clients from **OpenAPI**.
+## Open Source SDK Generators { #open-source-sdk-generators }
-A common tool is OpenAPI Generator.
+A versatile option is the OpenAPI Generator, which supports **many programming languages** and can generate SDKs from your OpenAPI specification.
-If you are building a **frontend**, a very interesting alternative is openapi-ts.
+For **TypeScript clients**, Hey API is a purpose-built solution, providing an optimized experience for the TypeScript ecosystem.
-## Client and SDK Generators - Sponsor
+You can discover more SDK generators on OpenAPI.Tools.
-There are also some **company-backed** Client and SDK generators based on OpenAPI (FastAPI), in some cases they can offer you **additional features** on top of high-quality generated SDKs/clients.
+/// tip
-Some of them also ⨠[**sponsor FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} â¨, this ensures the continued and healthy **development** of FastAPI and its **ecosystem**.
+FastAPI automatically generates **OpenAPI 3.1** specifications, so any tool you use must support this version.
-And it shows their true commitment to FastAPI and its **community** (you), as they not only want to provide you a **good service** but also want to make sure you have a **good and healthy framework**, FastAPI. đ
+///
+
+## SDK Generators from FastAPI Sponsors { #sdk-generators-from-fastapi-sponsors }
+
+This section highlights **venture-backed** and **company-supported** solutions from companies that sponsor FastAPI. These products provide **additional features** and **integrations** on top of high-quality generated SDKs.
+
+By ⨠[**sponsoring FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} â¨, these companies help ensure the framework and its **ecosystem** remain healthy and **sustainable**.
+
+Their sponsorship also demonstrates a strong commitment to the FastAPI **community** (you), showing that they care not only about offering a **great service** but also about supporting a **robust and thriving framework**, FastAPI. đ
For example, you might want to try:
* Speakeasy
-* Stainless
+* Stainless
* liblab
-There are also several other companies offering similar services that you can search and find online. đ¤
+Some of these solutions may also be open source or offer free tiers, so you can try them without a financial commitment. Other commercial SDK generators are available and can be found online. đ¤
-## Generate a TypeScript Frontend Client
+## Create a TypeScript SDK { #create-a-typescript-sdk }
Let's start with a simple FastAPI application:
@@ -36,80 +44,33 @@ Let's start with a simple FastAPI application:
Notice that the *path operations* define the models they use for request payload and response payload, using the models `Item` and `ResponseMessage`.
-### API Docs
+### API Docs { #api-docs }
-If you go to the API docs, you will see that it has the **schemas** for the data to be sent in requests and received in responses:
+If you go to `/docs`, you will see that it has the **schemas** for the data to be sent in requests and received in responses:
You can see those schemas because they were declared with the models in the app.
-That information is available in the app's **OpenAPI schema**, and then shown in the API docs (by Swagger UI).
+That information is available in the app's **OpenAPI schema**, and then shown in the API docs.
-And that same information from the models that is included in OpenAPI is what can be used to **generate the client code**.
+That same information from the models that is included in OpenAPI is what can be used to **generate the client code**.
-### Generate a TypeScript Client
+### Hey API { #hey-api }
-Now that we have the app with the models, we can generate the client code for the frontend.
+Once we have a FastAPI app with the models, we can use Hey API to generate a TypeScript client. The fastest way to do that is via npx.
-#### Install `openapi-ts`
-
-You can install `openapi-ts` in your frontend code with:
-
-
@@ -131,30 +92,30 @@ The response object will also have autocompletion:
-## FastAPI App with Tags
+## FastAPI App with Tags { #fastapi-app-with-tags }
-In many cases your FastAPI app will be bigger, and you will probably use tags to separate different groups of *path operations*.
+In many cases, your FastAPI app will be bigger, and you will probably use tags to separate different groups of *path operations*.
For example, you could have a section for **items** and another section for **users**, and they could be separated by tags:
{* ../../docs_src/generate_clients/tutorial002_py39.py hl[21,26,34] *}
-### Generate a TypeScript Client with Tags
+### Generate a TypeScript Client with Tags { #generate-a-typescript-client-with-tags }
If you generate a client for a FastAPI app using tags, it will normally also separate the client code based on the tags.
-This way you will be able to have things ordered and grouped correctly for the client code:
+This way, you will be able to have things ordered and grouped correctly for the client code:
-In this case you have:
+In this case, you have:
* `ItemsService`
* `UsersService`
-### Client Method Names
+### Client Method Names { #client-method-names }
-Right now the generated method names like `createItemItemsPost` don't look very clean:
+Right now, the generated method names like `createItemItemsPost` don't look very clean:
```TypeScript
ItemsService.createItemItemsPost({name: "Plumbus", price: 5})
@@ -166,17 +127,17 @@ OpenAPI requires that each operation ID is unique across all the *path operation
But I'll show you how to improve that next. đ¤
-## Custom Operation IDs and Better Method Names
+## Custom Operation IDs and Better Method Names { #custom-operation-ids-and-better-method-names }
You can **modify** the way these operation IDs are **generated** to make them simpler and have **simpler method names** in the clients.
-In this case you will have to ensure that each operation ID is **unique** in some other way.
+In this case, you will have to ensure that each operation ID is **unique** in some other way.
For example, you could make sure that each *path operation* has a tag, and then generate the operation ID based on the **tag** and the *path operation* **name** (the function name).
-### Custom Generate Unique ID Function
+### Custom Generate Unique ID Function { #custom-generate-unique-id-function }
-FastAPI uses a **unique ID** for each *path operation*, it is used for the **operation ID** and also for the names of any needed custom models, for requests or responses.
+FastAPI uses a **unique ID** for each *path operation*, which is used for the **operation ID** and also for the names of any needed custom models, for requests or responses.
You can customize that function. It takes an `APIRoute` and outputs a string.
@@ -186,15 +147,15 @@ You can then pass that custom function to **FastAPI** as the `generate_unique_id
{* ../../docs_src/generate_clients/tutorial003_py39.py hl[6:7,10] *}
-### Generate a TypeScript Client with Custom Operation IDs
+### Generate a TypeScript Client with Custom Operation IDs { #generate-a-typescript-client-with-custom-operation-ids }
-Now if you generate the client again, you will see that it has the improved method names:
+Now, if you generate the client again, you will see that it has the improved method names:
As you see, the method names now have the tag and then the function name, now they don't include information from the URL path and the HTTP operation.
-### Preprocess the OpenAPI Specification for the Client Generator
+### Preprocess the OpenAPI Specification for the Client Generator { #preprocess-the-openapi-specification-for-the-client-generator }
The generated code still has some **duplicated information**.
@@ -202,7 +163,7 @@ We already know that this method is related to the **items** because that word i
We will probably still want to keep it for OpenAPI in general, as that will ensure that the operation IDs are **unique**.
-But for the generated client we could **modify** the OpenAPI operation IDs right before generating the clients, just to make those method names nicer and **cleaner**.
+But for the generated client, we could **modify** the OpenAPI operation IDs right before generating the clients, just to make those method names nicer and **cleaner**.
We could download the OpenAPI JSON to a file `openapi.json` and then we could **remove that prefixed tag** with a script like this:
@@ -218,35 +179,21 @@ We could download the OpenAPI JSON to a file `openapi.json` and then we could **
With that, the operation IDs would be renamed from things like `items-get_items` to just `get_items`, that way the client generator can generate simpler method names.
-### Generate a TypeScript Client with the Preprocessed OpenAPI
+### Generate a TypeScript Client with the Preprocessed OpenAPI { #generate-a-typescript-client-with-the-preprocessed-openapi }
-Now as the end result is in a file `openapi.json`, you would modify the `package.json` to use that local file, for example:
+Since the end result is now in an `openapi.json` file, you need to update your input location:
-```JSON hl_lines="7"
-{
- "name": "frontend-app",
- "version": "1.0.0",
- "description": "",
- "main": "index.js",
- "scripts": {
- "generate-client": "openapi-ts --input ./openapi.json --output ./src/client --client axios"
- },
- "author": "",
- "license": "",
- "devDependencies": {
- "@hey-api/openapi-ts": "^0.27.38",
- "typescript": "^4.6.2"
- }
-}
+```sh
+npx @hey-api/openapi-ts -i ./openapi.json -o src/client
```
After generating the new client, you would now have **clean method names**, with all the **autocompletion**, **inline errors**, etc:
-## Benefits
+## Benefits { #benefits }
-When using the automatically generated clients you would get **autocompletion** for:
+When using the automatically generated clients, you would get **autocompletion** for:
* Methods.
* Request payloads in the body, query parameters, etc.
@@ -256,6 +203,6 @@ You would also have **inline errors** for everything.
And whenever you update the backend code, and **regenerate** the frontend, it would have any new *path operations* available as methods, the old ones removed, and any other change would be reflected on the generated code. đ¤
-This also means that if something changed it will be **reflected** on the client code automatically. And if you **build** the client it will error out if you have any **mismatch** in the data used.
+This also means that if something changed, it will be **reflected** on the client code automatically. And if you **build** the client, it will error out if you have any **mismatch** in the data used.
So, you would **detect many errors** very early in the development cycle instead of having to wait for the errors to show up to your final users in production and then trying to debug where the problem is. â¨
diff --git a/docs/en/docs/advanced/index.md b/docs/en/docs/advanced/index.md
index 47385e2c6..9355516fb 100644
--- a/docs/en/docs/advanced/index.md
+++ b/docs/en/docs/advanced/index.md
@@ -1,6 +1,6 @@
-# Advanced User Guide
+# Advanced User Guide { #advanced-user-guide }
-## Additional Features
+## Additional Features { #additional-features }
The main [Tutorial - User Guide](../tutorial/index.md){.internal-link target=_blank} should be enough to give you a tour through all the main features of **FastAPI**.
@@ -14,7 +14,7 @@ And it's possible that for your use case, the solution is in one of them.
///
-## Read the Tutorial first
+## Read the Tutorial first { #read-the-tutorial-first }
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}.
diff --git a/docs/en/docs/advanced/middleware.md b/docs/en/docs/advanced/middleware.md
index 1d40b1c8f..d1be4afff 100644
--- a/docs/en/docs/advanced/middleware.md
+++ b/docs/en/docs/advanced/middleware.md
@@ -1,4 +1,4 @@
-# Advanced Middleware
+# Advanced Middleware { #advanced-middleware }
In the main tutorial you read how to add [Custom Middleware](../tutorial/middleware.md){.internal-link target=_blank} to your application.
@@ -6,7 +6,7 @@ And then you also read how to handle [CORS with the `CORSMiddleware`](../tutoria
In this section we'll see how to use other middlewares.
-## Adding ASGI middlewares
+## Adding ASGI middlewares { #adding-asgi-middlewares }
As **FastAPI** is based on Starlette and implements the ASGI specification, you can use any ASGI middleware.
@@ -39,7 +39,7 @@ app.add_middleware(UnicornMiddleware, some_config="rainbow")
`app.add_middleware()` receives a middleware class as the first argument and any additional arguments to be passed to the middleware.
-## Integrated middlewares
+## Integrated middlewares { #integrated-middlewares }
**FastAPI** includes several middlewares for common use cases, we'll see next how to use them.
@@ -51,7 +51,7 @@ For the next examples, you could also use `from starlette.middleware.something i
///
-## `HTTPSRedirectMiddleware`
+## `HTTPSRedirectMiddleware` { #httpsredirectmiddleware }
Enforces that all incoming requests must either be `https` or `wss`.
@@ -59,7 +59,7 @@ Any incoming request to `http` or `ws` will be redirected to the secure scheme i
{* ../../docs_src/advanced_middleware/tutorial001.py hl[2,6] *}
-## `TrustedHostMiddleware`
+## `TrustedHostMiddleware` { #trustedhostmiddleware }
Enforces that all incoming requests have a correctly set `Host` header, in order to guard against HTTP Host Header attacks.
@@ -68,10 +68,11 @@ Enforces that all incoming requests have a correctly set `Host` header, in order
The following arguments are supported:
* `allowed_hosts` - A list of domain names that should be allowed as hostnames. Wildcard domains such as `*.example.com` are supported for matching subdomains. To allow any hostname either use `allowed_hosts=["*"]` or omit the middleware.
+* `www_redirect` - If set to True, requests to non-www versions of the allowed hosts will be redirected to their www counterparts. Defaults to `True`.
If an incoming request does not validate correctly then a `400` response will be sent.
-## `GZipMiddleware`
+## `GZipMiddleware` { #gzipmiddleware }
Handles GZip responses for any request that includes `"gzip"` in the `Accept-Encoding` header.
@@ -84,7 +85,7 @@ The following arguments are supported:
* `minimum_size` - Do not GZip responses that are smaller than this minimum size in bytes. Defaults to `500`.
* `compresslevel` - Used during GZip compression. It is an integer ranging from 1 to 9. Defaults to `9`. Lower value results in faster compression but larger file sizes, while higher value results in slower compression but smaller file sizes.
-## Other middlewares
+## Other middlewares { #other-middlewares }
There are many other ASGI middlewares.
diff --git a/docs/en/docs/advanced/openapi-callbacks.md b/docs/en/docs/advanced/openapi-callbacks.md
index ca9065a89..059d893c2 100644
--- a/docs/en/docs/advanced/openapi-callbacks.md
+++ b/docs/en/docs/advanced/openapi-callbacks.md
@@ -1,4 +1,4 @@
-# OpenAPI Callbacks
+# OpenAPI Callbacks { #openapi-callbacks }
You could create an API with a *path operation* that could trigger a request to an *external API* created by someone else (probably the same developer that would be *using* your API).
@@ -6,7 +6,7 @@ The process that happens when your API app calls the *external API* is named a "
In this case, you could want to document how that external API *should* look like. What *path operation* it should have, what body it should expect, what response it should return, etc.
-## An app with callbacks
+## An app with callbacks { #an-app-with-callbacks }
Let's see all this with an example.
@@ -23,7 +23,7 @@ Then your API will (let's imagine):
* Send a notification back to the API user (the external developer).
* This will be done by sending a POST request (from *your API*) to some *external API* provided by that external developer (this is the "callback").
-## The normal **FastAPI** app
+## The normal **FastAPI** app { #the-normal-fastapi-app }
Let's first see how the normal API app would look like before adding the callback.
@@ -41,7 +41,7 @@ The `callback_url` query parameter uses a Pydantic OpenAPI 3 expression (see more below) where it can use variables with parameters and parts of the original request sent to *your API*.
-### The callback path expression
+### The callback path expression { #the-callback-path-expression }
The callback *path* can have an OpenAPI 3 expression that can contain parts of the original request sent to *your API*.
@@ -163,7 +163,7 @@ Notice how the callback URL used contains the URL received as a query parameter
///
-### Add the callback router
+### Add the callback router { #add-the-callback-router }
At this point you have the *callback path operation(s)* needed (the one(s) that the *external developer* should implement in the *external API*) in the callback router you created above.
@@ -177,7 +177,7 @@ Notice that you are not passing the router itself (`invoices_callback_router`) t
///
-### Check the docs
+### Check the docs { #check-the-docs }
Now you can start your app and go to http://127.0.0.1:8000/docs.
diff --git a/docs/en/docs/advanced/openapi-webhooks.md b/docs/en/docs/advanced/openapi-webhooks.md
index 97aaa41af..416cf4b75 100644
--- a/docs/en/docs/advanced/openapi-webhooks.md
+++ b/docs/en/docs/advanced/openapi-webhooks.md
@@ -1,4 +1,4 @@
-# OpenAPI Webhooks
+# OpenAPI Webhooks { #openapi-webhooks }
There are cases where you want to tell your API **users** that your app could call *their* app (sending a request) with some data, normally to **notify** of some type of **event**.
@@ -6,7 +6,7 @@ This means that instead of the normal process of your users sending requests to
This is normally called a **webhook**.
-## Webhooks steps
+## Webhooks steps { #webhooks-steps }
The process normally is that **you define** in your code what is the message that you will send, the **body of the request**.
@@ -16,7 +16,7 @@ And **your users** define in some way (for example in a web dashboard somewhere)
All the **logic** about how to register the URLs for webhooks and the code to actually send those requests is up to you. You write it however you want to in **your own code**.
-## Documenting webhooks with **FastAPI** and OpenAPI
+## Documenting webhooks with **FastAPI** and OpenAPI { #documenting-webhooks-with-fastapi-and-openapi }
With **FastAPI**, using OpenAPI, you can define the names of these webhooks, the types of HTTP operations that your app can send (e.g. `POST`, `PUT`, etc.) and the request **bodies** that your app would send.
@@ -28,7 +28,7 @@ Webhooks are available in OpenAPI 3.1.0 and above, supported by FastAPI `0.99.0`
///
-## An app with webhooks
+## An app with webhooks { #an-app-with-webhooks }
When you create a **FastAPI** application, there is a `webhooks` attribute that you can use to define *webhooks*, the same way you would define *path operations*, for example with `@app.webhooks.post()`.
@@ -46,7 +46,7 @@ Notice that with webhooks you are actually not declaring a *path* (like `/items/
This is because it is expected that **your users** would define the actual **URL path** where they want to receive the webhook request in some other way (e.g. a web dashboard).
-### Check the docs
+### Check the docs { #check-the-docs }
Now you can start your app and go to http://127.0.0.1:8000/docs.
diff --git a/docs/en/docs/advanced/path-operation-advanced-configuration.md b/docs/en/docs/advanced/path-operation-advanced-configuration.md
index c4814ebd2..b9961f9f3 100644
--- a/docs/en/docs/advanced/path-operation-advanced-configuration.md
+++ b/docs/en/docs/advanced/path-operation-advanced-configuration.md
@@ -1,6 +1,6 @@
-# Path Operation Advanced Configuration
+# Path Operation Advanced Configuration { #path-operation-advanced-configuration }
-## OpenAPI operationId
+## OpenAPI operationId { #openapi-operationid }
/// warning
@@ -14,7 +14,7 @@ You would have to make sure that it is unique for each operation.
{* ../../docs_src/path_operation_advanced_configuration/tutorial001.py hl[6] *}
-### Using the *path operation function* name as the operationId
+### Using the *path operation function* name as the operationId { #using-the-path-operation-function-name-as-the-operationid }
If you want to use your APIs' function names as `operationId`s, you can iterate over all of them and override each *path operation's* `operation_id` using their `APIRoute.name`.
@@ -36,13 +36,13 @@ Even if they are in different modules (Python files).
///
-## Exclude from OpenAPI
+## Exclude from OpenAPI { #exclude-from-openapi }
To exclude a *path operation* from the generated OpenAPI schema (and thus, from the automatic documentation systems), use the parameter `include_in_schema` and set it to `False`:
{* ../../docs_src/path_operation_advanced_configuration/tutorial003.py hl[6] *}
-## Advanced description from docstring
+## Advanced description from docstring { #advanced-description-from-docstring }
You can limit the lines used from the docstring of a *path operation function* for OpenAPI.
@@ -52,7 +52,7 @@ It won't show up in the documentation, but other tools (such as Sphinx) will be
{* ../../docs_src/path_operation_advanced_configuration/tutorial004.py hl[19:29] *}
-## Additional Responses
+## Additional Responses { #additional-responses }
You probably have seen how to declare the `response_model` and `status_code` for a *path operation*.
@@ -62,7 +62,7 @@ You can also declare additional responses with their models, status codes, etc.
There's a whole chapter here in the documentation about it, you can read it at [Additional Responses in OpenAPI](additional-responses.md){.internal-link target=_blank}.
-## OpenAPI Extra
+## OpenAPI Extra { #openapi-extra }
When you declare a *path operation* in your application, **FastAPI** automatically generates the relevant metadata about that *path operation* to be included in the OpenAPI schema.
@@ -88,7 +88,7 @@ If you only need to declare additional responses, a more convenient way to do it
You can extend the OpenAPI schema for a *path operation* using the parameter `openapi_extra`.
-### OpenAPI Extensions
+### OpenAPI Extensions { #openapi-extensions }
This `openapi_extra` can be helpful, for example, to declare [OpenAPI Extensions](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#specificationExtensions):
@@ -129,7 +129,7 @@ And if you see the resulting OpenAPI (at `/openapi.json` in your API), you will
}
```
-### Custom OpenAPI *path operation* schema
+### Custom OpenAPI *path operation* schema { #custom-openapi-path-operation-schema }
The dictionary in `openapi_extra` will be deeply merged with the automatically generated OpenAPI schema for the *path operation*.
@@ -145,7 +145,7 @@ In this example, we didn't declare any Pydantic model. In fact, the request body
Nevertheless, we can declare the expected schema for the request body.
-### Custom OpenAPI content type
+### Custom OpenAPI content type { #custom-openapi-content-type }
Using this same trick, you could use a Pydantic model to define the JSON Schema that is then included in the custom OpenAPI schema section for the *path operation*.
diff --git a/docs/en/docs/advanced/response-change-status-code.md b/docs/en/docs/advanced/response-change-status-code.md
index 6d3f9f3e8..912ed0f1a 100644
--- a/docs/en/docs/advanced/response-change-status-code.md
+++ b/docs/en/docs/advanced/response-change-status-code.md
@@ -1,10 +1,10 @@
-# Response - Change Status Code
+# Response - Change Status Code { #response-change-status-code }
You probably read before that you can set a default [Response Status Code](../tutorial/response-status-code.md){.internal-link target=_blank}.
But in some cases you need to return a different status code than the default.
-## Use case
+## Use case { #use-case }
For example, imagine that you want to return an HTTP status code of "OK" `200` by default.
@@ -14,7 +14,7 @@ But you still want to be able to filter and convert the data you return with a `
For those cases, you can use a `Response` parameter.
-## Use a `Response` parameter
+## Use a `Response` parameter { #use-a-response-parameter }
You can declare a parameter of type `Response` in your *path operation function* (as you can do for cookies and headers).
diff --git a/docs/en/docs/advanced/response-cookies.md b/docs/en/docs/advanced/response-cookies.md
index f6d17f35d..d8f77b56a 100644
--- a/docs/en/docs/advanced/response-cookies.md
+++ b/docs/en/docs/advanced/response-cookies.md
@@ -1,6 +1,6 @@
-# Response Cookies
+# Response Cookies { #response-cookies }
-## Use a `Response` parameter
+## Use a `Response` parameter { #use-a-response-parameter }
You can declare a parameter of type `Response` in your *path operation function*.
@@ -16,7 +16,7 @@ And if you declared a `response_model`, it will still be used to filter and conv
You can also declare the `Response` parameter in dependencies, and set cookies (and headers) in them.
-## Return a `Response` directly
+## Return a `Response` directly { #return-a-response-directly }
You can also create cookies when returning a `Response` directly in your code.
@@ -36,7 +36,7 @@ And also that you are not sending any data that should have been filtered by a `
///
-### More info
+### More info { #more-info }
/// note | Technical Details
diff --git a/docs/en/docs/advanced/response-directly.md b/docs/en/docs/advanced/response-directly.md
index 759b762b5..3197e1bd4 100644
--- a/docs/en/docs/advanced/response-directly.md
+++ b/docs/en/docs/advanced/response-directly.md
@@ -1,4 +1,4 @@
-# Return a Response Directly
+# Return a Response Directly { #return-a-response-directly }
When you create a **FastAPI** *path operation* you can normally return any data from it: a `dict`, a `list`, a Pydantic model, a database model, etc.
@@ -10,7 +10,7 @@ But you can return a `JSONResponse` directly from your *path operations*.
It might be useful, for example, to return custom headers or cookies.
-## Return a `Response`
+## Return a `Response` { #return-a-response }
In fact, you can return any `Response` or any sub-class of it.
@@ -26,7 +26,7 @@ It won't do any data conversion with Pydantic models, it won't convert the conte
This gives you a lot of flexibility. You can return any data type, override any data declaration or validation, etc.
-## Using the `jsonable_encoder` in a `Response`
+## Using the `jsonable_encoder` in a `Response` { #using-the-jsonable-encoder-in-a-response }
Because **FastAPI** doesn't make any changes to a `Response` you return, you have to make sure its contents are ready for it.
@@ -44,7 +44,7 @@ You could also use `from starlette.responses import JSONResponse`.
///
-## Returning a custom `Response`
+## Returning a custom `Response` { #returning-a-custom-response }
The example above shows all the parts you need, but it's not very useful yet, as you could have just returned the `item` directly, and **FastAPI** would put it in a `JSONResponse` for you, converting it to a `dict`, etc. All that by default.
@@ -56,7 +56,7 @@ You could put your XML content in a string, put that in a `Response`, and return
{* ../../docs_src/response_directly/tutorial002.py hl[1,18] *}
-## Notes
+## Notes { #notes }
When you return a `Response` directly its data is not validated, converted (serialized), or documented automatically.
diff --git a/docs/en/docs/advanced/response-headers.md b/docs/en/docs/advanced/response-headers.md
index 97e888983..19c9ff2ad 100644
--- a/docs/en/docs/advanced/response-headers.md
+++ b/docs/en/docs/advanced/response-headers.md
@@ -1,6 +1,6 @@
-# Response Headers
+# Response Headers { #response-headers }
-## Use a `Response` parameter
+## Use a `Response` parameter { #use-a-response-parameter }
You can declare a parameter of type `Response` in your *path operation function* (as you can do for cookies).
@@ -16,7 +16,7 @@ And if you declared a `response_model`, it will still be used to filter and conv
You can also declare the `Response` parameter in dependencies, and set headers (and cookies) in them.
-## Return a `Response` directly
+## Return a `Response` directly { #return-a-response-directly }
You can also add headers when you return a `Response` directly.
@@ -34,8 +34,8 @@ And as the `Response` can be used frequently to set headers and cookies, **FastA
///
-## Custom Headers
+## Custom Headers { #custom-headers }
-Keep in mind that custom proprietary headers can be added using the 'X-' prefix.
+Keep in mind that custom proprietary headers can be added using the `X-` prefix.
But if you have custom headers that you want a client in a browser to be able to see, you need to add them to your CORS configurations (read more in [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md){.internal-link target=_blank}), using the parameter `expose_headers` documented in Starlette's CORS docs.
diff --git a/docs/en/docs/advanced/security/http-basic-auth.md b/docs/en/docs/advanced/security/http-basic-auth.md
index 234e2f940..01b98eeff 100644
--- a/docs/en/docs/advanced/security/http-basic-auth.md
+++ b/docs/en/docs/advanced/security/http-basic-auth.md
@@ -1,4 +1,4 @@
-# HTTP Basic Auth
+# HTTP Basic Auth { #http-basic-auth }
For the simplest cases, you can use HTTP Basic Auth.
@@ -12,7 +12,7 @@ That tells the browser to show the integrated prompt for a username and password
Then, when you type that username and password, the browser sends them in the header automatically.
-## Simple HTTP Basic Auth
+## Simple HTTP Basic Auth { #simple-http-basic-auth }
* Import `HTTPBasic` and `HTTPBasicCredentials`.
* Create a "`security` scheme" using `HTTPBasic`.
@@ -26,7 +26,7 @@ When you try to open the URL for the first time (or click the "Execute" button i
-## Check the username
+## Check the username { #check-the-username }
Here's a more complete example.
@@ -52,7 +52,7 @@ if not (credentials.username == "stanleyjobson") or not (credentials.password ==
But by using the `secrets.compare_digest()` it will be secure against a type of attacks called "timing attacks".
-### Timing Attacks
+### Timing Attacks { #timing-attacks }
But what's a "timing attack"?
@@ -80,19 +80,19 @@ if "stanleyjobsox" == "stanleyjobson" and "love123" == "swordfish":
Python will have to compare the whole `stanleyjobso` in both `stanleyjobsox` and `stanleyjobson` before realizing that both strings are not the same. So it will take some extra microseconds to reply back "Incorrect username or password".
-#### The time to answer helps the attackers
+#### The time to answer helps the attackers { #the-time-to-answer-helps-the-attackers }
At that point, by noticing that the server took some microseconds longer to send the "Incorrect username or password" response, the attackers will know that they got _something_ right, some of the initial letters were right.
And then they can try again knowing that it's probably something more similar to `stanleyjobsox` than to `johndoe`.
-#### A "professional" attack
+#### A "professional" attack { #a-professional-attack }
Of course, the attackers would not try all this by hand, they would write a program to do it, possibly with thousands or millions of tests per second. And they would get just one extra correct letter at a time.
But doing that, in some minutes or hours the attackers would have guessed the correct username and password, with the "help" of our application, just using the time taken to answer.
-#### Fix it with `secrets.compare_digest()`
+#### Fix it with `secrets.compare_digest()` { #fix-it-with-secrets-compare-digest }
But in our code we are actually using `secrets.compare_digest()`.
@@ -100,7 +100,7 @@ In short, it will take the same time to compare `stanleyjobsox` to `stanleyjobso
That way, using `secrets.compare_digest()` in your application code, it will be safe against this whole range of security attacks.
-### Return the error
+### Return the error { #return-the-error }
After detecting that the credentials are incorrect, return an `HTTPException` with a status code 401 (the same returned when no credentials are provided) and add the header `WWW-Authenticate` to make the browser show the login prompt again:
diff --git a/docs/en/docs/advanced/security/index.md b/docs/en/docs/advanced/security/index.md
index edb42132e..996d716b4 100644
--- a/docs/en/docs/advanced/security/index.md
+++ b/docs/en/docs/advanced/security/index.md
@@ -1,6 +1,6 @@
-# Advanced Security
+# Advanced Security { #advanced-security }
-## Additional Features
+## Additional Features { #additional-features }
There are some extra features to handle security apart from the ones covered in the [Tutorial - User Guide: Security](../../tutorial/security/index.md){.internal-link target=_blank}.
@@ -12,7 +12,7 @@ And it's possible that for your use case, the solution is in one of them.
///
-## Read the Tutorial first
+## Read the Tutorial first { #read-the-tutorial-first }
The next sections assume you already read the main [Tutorial - User Guide: Security](../../tutorial/security/index.md){.internal-link target=_blank}.
diff --git a/docs/en/docs/advanced/security/oauth2-scopes.md b/docs/en/docs/advanced/security/oauth2-scopes.md
index 4cb0b39bc..67c927cd0 100644
--- a/docs/en/docs/advanced/security/oauth2-scopes.md
+++ b/docs/en/docs/advanced/security/oauth2-scopes.md
@@ -1,12 +1,12 @@
-# OAuth2 scopes
+# OAuth2 scopes { #oauth2-scopes }
You can use OAuth2 scopes directly with **FastAPI**, they are integrated to work seamlessly.
This would allow you to have a more fine-grained permission system, following the OAuth2 standard, integrated into your OpenAPI application (and the API docs).
-OAuth2 with scopes is the mechanism used by many big authentication providers, like Facebook, Google, GitHub, Microsoft, Twitter, etc. They use it to provide specific permissions to users and applications.
+OAuth2 with scopes is the mechanism used by many big authentication providers, like Facebook, Google, GitHub, Microsoft, X (Twitter), etc. They use it to provide specific permissions to users and applications.
-Every time you "log in with" Facebook, Google, GitHub, Microsoft, Twitter, that application is using OAuth2 with scopes.
+Every time you "log in with" Facebook, Google, GitHub, Microsoft, X (Twitter), that application is using OAuth2 with scopes.
In this section you will see how to manage authentication and authorization with the same OAuth2 with scopes in your **FastAPI** application.
@@ -26,7 +26,7 @@ But if you know you need it, or you are curious, keep reading.
///
-## OAuth2 scopes and OpenAPI
+## OAuth2 scopes and OpenAPI { #oauth2-scopes-and-openapi }
The OAuth2 specification defines "scopes" as a list of strings separated by spaces.
@@ -58,15 +58,15 @@ For OAuth2 they are just strings.
///
-## Global view
+## Global view { #global-view }
First, let's quickly see the parts that change from the examples in the main **Tutorial - User Guide** for [OAuth2 with Password (and hashing), Bearer with JWT tokens](../../tutorial/security/oauth2-jwt.md){.internal-link target=_blank}. Now using OAuth2 scopes:
-{* ../../docs_src/security/tutorial005_an_py310.py hl[5,9,13,47,65,106,108:116,122:125,129:135,140,156] *}
+{* ../../docs_src/security/tutorial005_an_py310.py hl[5,9,13,47,65,106,108:116,122:126,130:136,141,157] *}
Now let's review those changes step by step.
-## OAuth2 Security scheme
+## OAuth2 Security scheme { #oauth2-security-scheme }
The first change is that now we are declaring the OAuth2 security scheme with two available scopes, `me` and `items`.
@@ -82,7 +82,7 @@ This is the same mechanism used when you give permissions while logging in with
-## JWT token with scopes
+## JWT token with scopes { #jwt-token-with-scopes }
Now, modify the token *path operation* to return the scopes requested.
@@ -98,9 +98,9 @@ But in your application, for security, you should make sure you only add the sco
///
-{* ../../docs_src/security/tutorial005_an_py310.py hl[156] *}
+{* ../../docs_src/security/tutorial005_an_py310.py hl[157] *}
-## Declare scopes in *path operations* and dependencies
+## Declare scopes in *path operations* and dependencies { #declare-scopes-in-path-operations-and-dependencies }
Now we declare that the *path operation* for `/users/me/items/` requires the scope `items`.
@@ -124,7 +124,7 @@ We are doing it here to demonstrate how **FastAPI** handles scopes declared at d
///
-{* ../../docs_src/security/tutorial005_an_py310.py hl[5,140,171] *}
+{* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *}
/// info | Technical Details
@@ -136,7 +136,7 @@ But when you import `Query`, `Path`, `Depends`, `Security` and others from `fast
///
-## Use `SecurityScopes`
+## Use `SecurityScopes` { #use-securityscopes }
Now update the dependency `get_current_user`.
@@ -152,7 +152,7 @@ This `SecurityScopes` class is similar to `Request` (`Request` was used to get t
{* ../../docs_src/security/tutorial005_an_py310.py hl[9,106] *}
-## Use the `scopes`
+## Use the `scopes` { #use-the-scopes }
The parameter `security_scopes` will be of type `SecurityScopes`.
@@ -166,7 +166,7 @@ In this exception, we include the scopes required (if any) as a string separated
{* ../../docs_src/security/tutorial005_an_py310.py hl[106,108:116] *}
-## Verify the `username` and data shape
+## Verify the `username` and data shape { #verify-the-username-and-data-shape }
We verify that we get a `username`, and extract the scopes.
@@ -180,17 +180,17 @@ Instead of, for example, a `dict`, or something else, as it could break the appl
We also verify that we have a user with that username, and if not, we raise that same exception we created before.
-{* ../../docs_src/security/tutorial005_an_py310.py hl[47,117:128] *}
+{* ../../docs_src/security/tutorial005_an_py310.py hl[47,117:129] *}
-## Verify the `scopes`
+## Verify the `scopes` { #verify-the-scopes }
We now verify that all the scopes required, by this dependency and all the dependants (including *path operations*), are included in the scopes provided in the token received, otherwise raise an `HTTPException`.
For this, we use `security_scopes.scopes`, that contains a `list` with all these scopes as `str`.
-{* ../../docs_src/security/tutorial005_an_py310.py hl[129:135] *}
+{* ../../docs_src/security/tutorial005_an_py310.py hl[130:136] *}
-## Dependency tree and scopes
+## Dependency tree and scopes { #dependency-tree-and-scopes }
Let's review again this dependency tree and the scopes.
@@ -223,7 +223,7 @@ All depending on the `scopes` declared in each *path operation* and each depende
///
-## More details about `SecurityScopes`
+## More details about `SecurityScopes` { #more-details-about-securityscopes }
You can use `SecurityScopes` at any point, and in multiple places, it doesn't have to be at the "root" dependency.
@@ -233,7 +233,7 @@ Because the `SecurityScopes` will have all the scopes declared by dependants, yo
They will be checked independently for each *path operation*.
-## Check it
+## Check it { #check-it }
If you open the API docs, you can authenticate and specify which scopes you want to authorize.
@@ -245,7 +245,7 @@ And if you select the scope `me` but not the scope `items`, you will be able to
That's what would happen to a third party application that tried to access one of these *path operations* with a token provided by a user, depending on how many permissions the user gave the application.
-## About third party integrations
+## About third party integrations { #about-third-party-integrations }
In this example we are using the OAuth2 "password" flow.
@@ -269,6 +269,6 @@ But in the end, they are implementing the same OAuth2 standard.
**FastAPI** includes utilities for all these OAuth2 authentication flows in `fastapi.security.oauth2`.
-## `Security` in decorator `dependencies`
+## `Security` in decorator `dependencies` { #security-in-decorator-dependencies }
The same way you can define a `list` of `Depends` in the decorator's `dependencies` parameter (as explained in [Dependencies in path operation decorators](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}), you could also use `Security` with `scopes` there.
diff --git a/docs/en/docs/advanced/settings.md b/docs/en/docs/advanced/settings.md
index 1af19a045..a218c3d01 100644
--- a/docs/en/docs/advanced/settings.md
+++ b/docs/en/docs/advanced/settings.md
@@ -1,4 +1,4 @@
-# Settings and Environment Variables
+# Settings and Environment Variables { #settings-and-environment-variables }
In many cases your application could need some external settings or configurations, for example secret keys, database credentials, credentials for email services, etc.
@@ -12,17 +12,17 @@ To understand environment variables you can read [Environment Variables](../envi
///
-## Types and validation
+## Types and validation { #types-and-validation }
These environment variables can only handle text strings, as they are external to Python and have to be compatible with other programs and the rest of the system (and even with different operating systems, as Linux, Windows, macOS).
That means that any value read in Python from an environment variable will be a `str`, and any conversion to a different type or any validation has to be done in code.
-## Pydantic `Settings`
+## Pydantic `Settings` { #pydantic-settings }
Fortunately, Pydantic provides a great utility to handle these settings coming from environment variables with Pydantic: Settings management.
-### Install `pydantic-settings`
+### Install `pydantic-settings` { #install-pydantic-settings }
First, make sure you create your [virtual environment](../virtual-environments.md){.internal-link target=_blank}, activate it, and then install the `pydantic-settings` package:
@@ -52,7 +52,7 @@ In Pydantic v1 it came included with the main package. Now it is distributed as
///
-### Create the `Settings` object
+### Create the `Settings` object { #create-the-settings-object }
Import `BaseSettings` from Pydantic and create a sub-class, very much like with a Pydantic model.
@@ -88,13 +88,13 @@ Then, when you create an instance of that `Settings` class (in this case, in the
Next it will convert and validate the data. So, when you use that `settings` object, you will have data of the types you declared (e.g. `items_per_user` will be an `int`).
-### Use the `settings`
+### Use the `settings` { #use-the-settings }
Then you can use the new `settings` object in your application:
{* ../../docs_src/settings/tutorial001.py hl[18:20] *}
-### Run the server
+### Run the server { #run-the-server }
Next, you would run the server passing the configurations as environment variables, for example you could set an `ADMIN_EMAIL` and `APP_NAME` with:
@@ -120,7 +120,7 @@ The `app_name` would be `"ChimichangApp"`.
And the `items_per_user` would keep its default value of `50`.
-## Settings in another module
+## Settings in another module { #settings-in-another-module }
You could put those settings in another module file as you saw in [Bigger Applications - Multiple Files](../tutorial/bigger-applications.md){.internal-link target=_blank}.
@@ -138,13 +138,13 @@ You would also need a file `__init__.py` as you saw in [Bigger Applications - Mu
///
-## Settings in a dependency
+## Settings in a dependency { #settings-in-a-dependency }
In some occasions it might be useful to provide the settings from a dependency, instead of having a global object with `settings` that is used everywhere.
This could be especially useful during testing, as it's very easy to override a dependency with your own custom settings.
-### The config file
+### The config file { #the-config-file }
Coming from the previous example, your `config.py` file could look like:
@@ -152,7 +152,7 @@ Coming from the previous example, your `config.py` file could look like:
Notice that now we don't create a default instance `settings = Settings()`.
-### The main app file
+### The main app file { #the-main-app-file }
Now we create a dependency that returns a new `config.Settings()`.
@@ -170,7 +170,7 @@ And then we can require it from the *path operation function* as a dependency an
{* ../../docs_src/settings/app02_an_py39/main.py hl[17,19:21] *}
-### Settings and testing
+### Settings and testing { #settings-and-testing }
Then it would be very easy to provide a different settings object during testing by creating a dependency override for `get_settings`:
@@ -180,7 +180,7 @@ In the dependency override we set a new value for the `admin_email` when creatin
Then we can test that it is used.
-## Reading a `.env` file
+## Reading a `.env` file { #reading-a-env-file }
If you have many settings that possibly change a lot, maybe in different environments, it might be useful to put them on a file and then read them from it as if they were environment variables.
@@ -202,7 +202,7 @@ For this to work, you need to `pip install python-dotenv`.
///
-### The `.env` file
+### The `.env` file { #the-env-file }
You could have a `.env` file with:
@@ -211,7 +211,7 @@ ADMIN_EMAIL="deadpool@example.com"
APP_NAME="ChimichangApp"
```
-### Read settings from `.env`
+### Read settings from `.env` { #read-settings-from-env }
And then update your `config.py` with:
@@ -247,7 +247,7 @@ In Pydantic version 1 the configuration was done in an internal class `Config`,
Here we define the config `env_file` inside of your Pydantic `Settings` class, and set the value to the filename with the dotenv file we want to use.
-### Creating the `Settings` only once with `lru_cache`
+### Creating the `Settings` only once with `lru_cache` { #creating-the-settings-only-once-with-lru-cache }
Reading a file from disk is normally a costly (slow) operation, so you probably want to do it only once and then reuse the same settings object, instead of reading it for each request.
@@ -274,7 +274,7 @@ But as we are using the `@lru_cache` decorator on top, the `Settings` object wil
Then for any subsequent call of `get_settings()` in the dependencies for the next requests, instead of executing the internal code of `get_settings()` and creating a new `Settings` object, it will return the same object that was returned on the first call, again and again.
-#### `lru_cache` Technical Details
+#### `lru_cache` Technical Details { #lru-cache-technical-details }
`@lru_cache` modifies the function it decorates to return the same value that was returned the first time, instead of computing it again, executing the code of the function every time.
@@ -337,7 +337,7 @@ That way, it behaves almost as if it was just a global variable. But as it uses
`@lru_cache` is part of `functools` which is part of Python's standard library, you can read more about it in the Python docs for `@lru_cache`.
-## Recap
+## Recap { #recap }
You can use Pydantic Settings to handle the settings or configurations for your application, with all the power of Pydantic models.
diff --git a/docs/en/docs/advanced/sub-applications.md b/docs/en/docs/advanced/sub-applications.md
index 48e329fc1..fbd0e1af3 100644
--- a/docs/en/docs/advanced/sub-applications.md
+++ b/docs/en/docs/advanced/sub-applications.md
@@ -1,18 +1,18 @@
-# Sub Applications - Mounts
+# Sub Applications - Mounts { #sub-applications-mounts }
If you need to have two independent FastAPI applications, with their own independent OpenAPI and their own docs UIs, you can have a main app and "mount" one (or more) sub-application(s).
-## Mounting a **FastAPI** application
+## Mounting a **FastAPI** application { #mounting-a-fastapi-application }
"Mounting" means adding a completely "independent" application in a specific path, that then takes care of handling everything under that path, with the _path operations_ declared in that sub-application.
-### Top-level application
+### Top-level application { #top-level-application }
First, create the main, top-level, **FastAPI** application, and its *path operations*:
{* ../../docs_src/sub_applications/tutorial001.py hl[3, 6:8] *}
-### Sub-application
+### Sub-application { #sub-application }
Then, create your sub-application, and its *path operations*.
@@ -20,7 +20,7 @@ This sub-application is just another standard FastAPI application, but this is t
{* ../../docs_src/sub_applications/tutorial001.py hl[11, 14:16] *}
-### Mount the sub-application
+### Mount the sub-application { #mount-the-sub-application }
In your top-level application, `app`, mount the sub-application, `subapi`.
@@ -28,7 +28,7 @@ In this case, it will be mounted at the path `/subapi`:
{* ../../docs_src/sub_applications/tutorial001.py hl[11, 19] *}
-### Check the automatic API docs
+### Check the automatic API docs { #check-the-automatic-api-docs }
Now, run the `fastapi` command with your file:
@@ -56,7 +56,7 @@ You will see the automatic API docs for the sub-application, including only its
If you try interacting with any of the two user interfaces, they will work correctly, because the browser will be able to talk to each specific app or sub-app.
-### Technical Details: `root_path`
+### Technical Details: `root_path` { #technical-details-root-path }
When you mount a sub-application as described above, FastAPI will take care of communicating the mount path for the sub-application using a mechanism from the ASGI specification called a `root_path`.
diff --git a/docs/en/docs/advanced/templates.md b/docs/en/docs/advanced/templates.md
index d9b0ca6f1..f41c47fe8 100644
--- a/docs/en/docs/advanced/templates.md
+++ b/docs/en/docs/advanced/templates.md
@@ -1,4 +1,4 @@
-# Templates
+# Templates { #templates }
You can use any template engine you want with **FastAPI**.
@@ -6,7 +6,7 @@ A common choice is Jinja2, the same one used by Flask and other tools.
There are utilities to configure it easily that you can use directly in your **FastAPI** application (provided by Starlette).
-## Install dependencies
+## Install dependencies { #install-dependencies }
Make sure you create a [virtual environment](../virtual-environments.md){.internal-link target=_blank}, activate it, and install `jinja2`:
@@ -20,7 +20,7 @@ $ pip install jinja2
-## Change the Theme
+## Change the Theme { #change-the-theme }
The same way you could set the syntax highlighting theme with the key `"syntaxHighlight.theme"` (notice that it has a dot in the middle):
@@ -34,7 +34,7 @@ That configuration would change the syntax highlighting color theme:
-## Change Default Swagger UI Parameters
+## Change Default Swagger UI Parameters { #change-default-swagger-ui-parameters }
FastAPI includes some default configuration parameters appropriate for most of the use cases.
@@ -48,11 +48,11 @@ For example, to disable `deepLinking` you could pass these settings to `swagger_
{* ../../docs_src/configure_swagger_ui/tutorial003.py hl[3] *}
-## Other Swagger UI Parameters
+## Other Swagger UI Parameters { #other-swagger-ui-parameters }
To see all the other possible configurations you can use, read the official docs for Swagger UI parameters.
-## JavaScript-only settings
+## JavaScript-only settings { #javascript-only-settings }
Swagger UI also allows other configurations to be **JavaScript-only** objects (for example, JavaScript functions).
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 9d2238e4f..91228c8c9 100644
--- a/docs/en/docs/how-to/custom-docs-ui-assets.md
+++ b/docs/en/docs/how-to/custom-docs-ui-assets.md
@@ -1,4 +1,4 @@
-# Custom Docs UI Static Assets (Self-Hosting)
+# Custom Docs UI Static Assets (Self-Hosting) { #custom-docs-ui-static-assets-self-hosting }
The API docs use **Swagger UI** and **ReDoc**, and each of those need some JavaScript and CSS files.
@@ -6,13 +6,13 @@ By default, those files are served from a CDN, for example you want to use `https://unpkg.com/`.
This could be useful if for example you live in a country that restricts some URLs.
-### Disable the automatic docs
+### Disable the automatic docs { #disable-the-automatic-docs }
The first step is to disable the automatic docs, as by default, those use the default CDN.
@@ -20,7 +20,7 @@ To disable them, set their URLs to `None` when creating your `FastAPI` app:
{* ../../docs_src/custom_docs_ui/tutorial001.py hl[8] *}
-### Include the custom docs
+### Include the custom docs { #include-the-custom-docs }
Now you can create the *path operations* for the custom docs.
@@ -46,23 +46,23 @@ Swagger UI will handle it behind the scenes for you, but it needs this "redirect
///
-### Create a *path operation* to test it
+### Create a *path operation* to test it { #create-a-path-operation-to-test-it }
Now, to be able to test that everything works, create a *path operation*:
{* ../../docs_src/custom_docs_ui/tutorial001.py hl[36:38] *}
-### Test it
+### Test it { #test-it }
Now, you should be able to go to your docs at http://127.0.0.1:8000/docs, and reload the page, it will load those assets from the new CDN.
-## Self-hosting JavaScript and CSS for docs
+## Self-hosting JavaScript and CSS for docs { #self-hosting-javascript-and-css-for-docs }
Self-hosting the JavaScript and CSS could be useful if, for example, you need your app to keep working even while offline, without open Internet access, or in a local network.
Here you'll see how to serve those files yourself, in the same FastAPI app, and configure the docs to use them.
-### Project file structure
+### Project file structure { #project-file-structure }
Let's say your project file structure looks like this:
@@ -85,11 +85,11 @@ Your new file structure could look like this:
âââ static/
```
-### Download the files
+### Download the files { #download-the-files }
Download the static files needed for the docs and put them on that `static/` directory.
-You can probably right-click each link and select an option similar to `Save link as...`.
+You can probably right-click each link and select an option similar to "Save link as...".
**Swagger UI** uses the files:
@@ -113,14 +113,14 @@ After that, your file structure could look like:
âââ swagger-ui.css
```
-### Serve the static files
+### Serve the static files { #serve-the-static-files }
* Import `StaticFiles`.
* "Mount" a `StaticFiles()` instance in a specific path.
{* ../../docs_src/custom_docs_ui/tutorial002.py hl[7,11] *}
-### Test the static files
+### Test the static files { #test-the-static-files }
Start your application and go to http://127.0.0.1:8000/static/redoc.standalone.js.
@@ -138,7 +138,7 @@ That confirms that you are being able to serve static files from your app, and t
Now we can configure the app to use those static files for the docs.
-### Disable the automatic docs for static files
+### Disable the automatic docs for static files { #disable-the-automatic-docs-for-static-files }
The same as when using a custom CDN, the first step is to disable the automatic docs, as those use the CDN by default.
@@ -146,7 +146,7 @@ To disable them, set their URLs to `None` when creating your `FastAPI` app:
{* ../../docs_src/custom_docs_ui/tutorial002.py hl[9] *}
-### Include the custom docs for static files
+### Include the custom docs for static files { #include-the-custom-docs-for-static-files }
And the same way as with a custom CDN, now you can create the *path operations* for the custom docs.
@@ -172,13 +172,13 @@ Swagger UI will handle it behind the scenes for you, but it needs this "redirect
///
-### Create a *path operation* to test static files
+### Create a *path operation* to test static files { #create-a-path-operation-to-test-static-files }
Now, to be able to test that everything works, create a *path operation*:
{* ../../docs_src/custom_docs_ui/tutorial002.py hl[39:41] *}
-### Test Static Files UI
+### Test Static Files UI { #test-static-files-ui }
Now, you should be able to disconnect your WiFi, go to your docs at http://127.0.0.1:8000/docs, and reload the page.
diff --git a/docs/en/docs/how-to/custom-request-and-route.md b/docs/en/docs/how-to/custom-request-and-route.md
index 9b4160d75..6df24a080 100644
--- a/docs/en/docs/how-to/custom-request-and-route.md
+++ b/docs/en/docs/how-to/custom-request-and-route.md
@@ -1,4 +1,4 @@
-# Custom Request and APIRoute class
+# Custom Request and APIRoute class { #custom-request-and-apiroute-class }
In some cases, you may want to override the logic used by the `Request` and `APIRoute` classes.
@@ -14,7 +14,7 @@ If you are just starting with **FastAPI** you might want to skip this section.
///
-## Use cases
+## Use cases { #use-cases }
Some use cases include:
@@ -22,13 +22,13 @@ Some use cases include:
* Decompressing gzip-compressed request bodies.
* Automatically logging all request bodies.
-## Handling custom request body encodings
+## Handling custom request body encodings { #handling-custom-request-body-encodings }
Let's see how to make use of a custom `Request` subclass to decompress gzip requests.
And an `APIRoute` subclass to use that custom request class.
-### Create a custom `GzipRequest` class
+### Create a custom `GzipRequest` class { #create-a-custom-gziprequest-class }
/// tip
@@ -44,7 +44,7 @@ That way, the same route class can handle gzip compressed or uncompressed reques
{* ../../docs_src/custom_request_and_route/tutorial001.py hl[8:15] *}
-### Create a custom `GzipRoute` class
+### Create a custom `GzipRoute` class { #create-a-custom-gziproute-class }
Next, we create a custom subclass of `fastapi.routing.APIRoute` that will make use of the `GzipRequest`.
@@ -78,7 +78,7 @@ After that, all of the processing logic is the same.
But because of our changes in `GzipRequest.body`, the request body will be automatically decompressed when it is loaded by **FastAPI** when needed.
-## Accessing the request body in an exception handler
+## Accessing the request body in an exception handler { #accessing-the-request-body-in-an-exception-handler }
/// tip
@@ -98,7 +98,7 @@ If an exception occurs, the`Request` instance will still be in scope, so we can
{* ../../docs_src/custom_request_and_route/tutorial002.py hl[16:18] *}
-## Custom `APIRoute` class in a router
+## Custom `APIRoute` class in a router { #custom-apiroute-class-in-a-router }
You can also set the `route_class` parameter of an `APIRouter`:
diff --git a/docs/en/docs/how-to/extending-openapi.md b/docs/en/docs/how-to/extending-openapi.md
index 26c742c20..5e672665e 100644
--- a/docs/en/docs/how-to/extending-openapi.md
+++ b/docs/en/docs/how-to/extending-openapi.md
@@ -1,10 +1,10 @@
-# Extending OpenAPI
+# Extending OpenAPI { #extending-openapi }
There are some cases where you might need to modify the generated OpenAPI schema.
In this section you will see how.
-## The normal process
+## The normal process { #the-normal-process }
The normal (default) process, is as follows.
@@ -33,31 +33,31 @@ The parameter `summary` is available in OpenAPI 3.1.0 and above, supported by Fa
///
-## Overriding the defaults
+## Overriding the defaults { #overriding-the-defaults }
Using the information above, you can use the same utility function to generate the OpenAPI schema and override each part that you need.
For example, let's add ReDoc's OpenAPI extension to include a custom logo.
-### Normal **FastAPI**
+### Normal **FastAPI** { #normal-fastapi }
First, write all your **FastAPI** application as normally:
{* ../../docs_src/extending_openapi/tutorial001.py hl[1,4,7:9] *}
-### Generate the OpenAPI schema
+### Generate the OpenAPI schema { #generate-the-openapi-schema }
Then, use the same utility function to generate the OpenAPI schema, inside a `custom_openapi()` function:
{* ../../docs_src/extending_openapi/tutorial001.py hl[2,15:21] *}
-### Modify the OpenAPI schema
+### Modify the OpenAPI schema { #modify-the-openapi-schema }
Now you can add the ReDoc extension, adding a custom `x-logo` to the `info` "object" in the OpenAPI schema:
{* ../../docs_src/extending_openapi/tutorial001.py hl[22:24] *}
-### Cache the OpenAPI schema
+### Cache the OpenAPI schema { #cache-the-openapi-schema }
You can use the property `.openapi_schema` as a "cache", to store your generated schema.
@@ -67,13 +67,13 @@ It will be generated only once, and then the same cached schema will be used for
{* ../../docs_src/extending_openapi/tutorial001.py hl[13:14,25:26] *}
-### Override the method
+### Override the method { #override-the-method }
Now you can replace the `.openapi()` method with your new function.
{* ../../docs_src/extending_openapi/tutorial001.py hl[29] *}
-### Check it
+### Check it { #check-it }
Once you go to http://127.0.0.1:8000/redoc you will see that you are using your custom logo (in this example, **FastAPI**'s logo):
diff --git a/docs/en/docs/how-to/general.md b/docs/en/docs/how-to/general.md
index 04367c6b7..934719260 100644
--- a/docs/en/docs/how-to/general.md
+++ b/docs/en/docs/how-to/general.md
@@ -1,39 +1,39 @@
-# General - How To - Recipes
+# General - How To - Recipes { #general-how-to-recipes }
Here are several pointers to other places in the docs, for general or frequent questions.
-## Filter Data - Security
+## Filter Data - Security { #filter-data-security }
To ensure that you don't return more data than you should, read the docs for [Tutorial - Response Model - Return Type](../tutorial/response-model.md){.internal-link target=_blank}.
-## Documentation Tags - OpenAPI
+## Documentation Tags - OpenAPI { #documentation-tags-openapi }
To add tags to your *path operations*, and group them in the docs UI, read the docs for [Tutorial - Path Operation Configurations - Tags](../tutorial/path-operation-configuration.md#tags){.internal-link target=_blank}.
-## Documentation Summary and Description - OpenAPI
+## Documentation Summary and Description - OpenAPI { #documentation-summary-and-description-openapi }
To add a summary and description to your *path operations*, and show them in the docs UI, read the docs for [Tutorial - Path Operation Configurations - Summary and Description](../tutorial/path-operation-configuration.md#summary-and-description){.internal-link target=_blank}.
-## Documentation Response description - OpenAPI
+## Documentation Response description - OpenAPI { #documentation-response-description-openapi }
To define the description of the response, shown in the docs UI, read the docs for [Tutorial - Path Operation Configurations - Response description](../tutorial/path-operation-configuration.md#response-description){.internal-link target=_blank}.
-## Documentation Deprecate a *Path Operation* - OpenAPI
+## Documentation Deprecate a *Path Operation* - OpenAPI { #documentation-deprecate-a-path-operation-openapi }
To deprecate a *path operation*, and show it in the docs UI, read the docs for [Tutorial - Path Operation Configurations - Deprecation](../tutorial/path-operation-configuration.md#deprecate-a-path-operation){.internal-link target=_blank}.
-## Convert any Data to JSON-compatible
+## Convert any Data to JSON-compatible { #convert-any-data-to-json-compatible }
To convert any data to JSON-compatible, read the docs for [Tutorial - JSON Compatible Encoder](../tutorial/encoder.md){.internal-link target=_blank}.
-## OpenAPI Metadata - Docs
+## OpenAPI Metadata - Docs { #openapi-metadata-docs }
To add metadata to your OpenAPI schema, including a license, version, contact, etc, read the docs for [Tutorial - Metadata and Docs URLs](../tutorial/metadata.md){.internal-link target=_blank}.
-## OpenAPI Custom URL
+## OpenAPI Custom URL { #openapi-custom-url }
To customize the OpenAPI URL (or remove it), read the docs for [Tutorial - Metadata and Docs URLs](../tutorial/metadata.md#openapi-url){.internal-link target=_blank}.
-## OpenAPI Docs URLs
+## OpenAPI Docs URLs { #openapi-docs-urls }
To update the URLs used for the automatically generated docs user interfaces, read the docs for [Tutorial - Metadata and Docs URLs](../tutorial/metadata.md#docs-urls){.internal-link target=_blank}.
diff --git a/docs/en/docs/how-to/graphql.md b/docs/en/docs/how-to/graphql.md
index 361010736..99b024d39 100644
--- a/docs/en/docs/how-to/graphql.md
+++ b/docs/en/docs/how-to/graphql.md
@@ -1,4 +1,4 @@
-# GraphQL
+# GraphQL { #graphql }
As **FastAPI** is based on the **ASGI** standard, it's very easy to integrate any **GraphQL** library also compatible with ASGI.
@@ -14,7 +14,7 @@ Make sure you evaluate if the **benefits** for your use case compensate the **dr
///
-## GraphQL Libraries
+## GraphQL Libraries { #graphql-libraries }
Here are some of the **GraphQL** libraries that have **ASGI** support. You could use them with **FastAPI**:
@@ -27,7 +27,7 @@ Here are some of the **GraphQL** libraries that have **ASGI** support. You could
* Graphene
* With starlette-graphene3
-## GraphQL with Strawberry
+## GraphQL with Strawberry { #graphql-with-strawberry }
If you need or want to work with **GraphQL**, **Strawberry** is the **recommended** library as it has the design closest to **FastAPI's** design, it's all based on **type annotations**.
@@ -41,7 +41,7 @@ You can learn more about Strawberry in the Strawberry with FastAPI.
-## Older `GraphQLApp` from Starlette
+## Older `GraphQLApp` from Starlette { #older-graphqlapp-from-starlette }
Previous versions of Starlette included a `GraphQLApp` class to integrate with Graphene.
@@ -53,7 +53,7 @@ If you need GraphQL, I still would recommend you check out official GraphQL documentation.
diff --git a/docs/en/docs/how-to/index.md b/docs/en/docs/how-to/index.md
index 730dce5d5..5a8ce08de 100644
--- a/docs/en/docs/how-to/index.md
+++ b/docs/en/docs/how-to/index.md
@@ -1,4 +1,4 @@
-# How To - Recipes
+# How To - Recipes { #how-to-recipes }
Here you will see different recipes or "how to" guides for **several topics**.
diff --git a/docs/en/docs/how-to/separate-openapi-schemas.md b/docs/en/docs/how-to/separate-openapi-schemas.md
index 9a27638fe..3c78a56d3 100644
--- a/docs/en/docs/how-to/separate-openapi-schemas.md
+++ b/docs/en/docs/how-to/separate-openapi-schemas.md
@@ -1,4 +1,4 @@
-# Separate OpenAPI Schemas for Input and Output or Not
+# Separate OpenAPI Schemas for Input and Output or Not { #separate-openapi-schemas-for-input-and-output-or-not }
When using **Pydantic v2**, the generated OpenAPI is a bit more exact and **correct** than before. đ
@@ -6,13 +6,13 @@ In fact, in some cases, it will even have **two JSON Schemas** in OpenAPI for th
Let's see how that works and how to change it if you need to do that.
-## Pydantic Models for Input and Output
+## Pydantic Models for Input and Output { #pydantic-models-for-input-and-output }
Let's say you have a Pydantic model with default values, like this one:
{* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py ln[1:7] hl[7] *}
-### Model for Input
+### Model for Input { #model-for-input }
If you use this model as an input like here:
@@ -20,7 +20,7 @@ If you use this model as an input like here:
...then the `description` field will **not be required**. Because it has a default value of `None`.
-### Input Model in Docs
+### Input Model in Docs { #input-model-in-docs }
You can confirm that in the docs, the `description` field doesn't have a **red asterisk**, it's not marked as required:
@@ -28,7 +28,7 @@ You can confirm that in the docs, the `description` field doesn't have a **red a
-### Model for Input and Output in Docs
+### Model for Input and Output in Docs { #model-for-input-and-output-in-docs }
And if you check all the available Schemas (JSON Schemas) in OpenAPI, you will see that there are two, one `Item-Input` and one `Item-Output`.
@@ -77,7 +77,7 @@ But for `Item-Output`, `description` is **required**, it has a red asterisk.
With this feature from **Pydantic v2**, your API documentation is more **precise**, and if you have autogenerated clients and SDKs, they will be more precise too, with a better **developer experience** and consistency. đ
-## Do not Separate Schemas
+## Do not Separate Schemas { #do-not-separate-schemas }
Now, there are some cases where you might want to have the **same schema for input and output**.
@@ -93,7 +93,7 @@ Support for `separate_input_output_schemas` was added in FastAPI `0.102.0`. đ¤
{* ../../docs_src/separate_openapi_schemas/tutorial002_py310.py hl[10] *}
-### Same Schema for Input and Output Models in Docs
+### Same Schema for Input and Output Models in Docs { #same-schema-for-input-and-output-models-in-docs }
And now there will be one single schema for input and output for the model, only `Item`, and it will have `description` as **not required**:
diff --git a/docs/en/docs/how-to/testing-database.md b/docs/en/docs/how-to/testing-database.md
index d0ed15bca..400fdcfc6 100644
--- a/docs/en/docs/how-to/testing-database.md
+++ b/docs/en/docs/how-to/testing-database.md
@@ -1,4 +1,4 @@
-# Testing a Database
+# Testing a Database { #testing-a-database }
You can study about databases, SQL, and SQLModel in the SQLModel docs. đ¤
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/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/speakeasy.png b/docs/en/docs/img/sponsors/speakeasy.png
index 5ddc25487..7bb9c3a18 100644
Binary files a/docs/en/docs/img/sponsors/speakeasy.png and b/docs/en/docs/img/sponsors/speakeasy.png differ
diff --git a/docs/en/docs/index.md b/docs/en/docs/index.md
index 938882d7d..aaadf3cc2 100644
--- a/docs/en/docs/index.md
+++ b/docs/en/docs/index.md
@@ -1,4 +1,4 @@
-# FastAPI
+# FastAPI { #fastapi }
-
-
-- ×Ē׊×Ē××Ē FastAPI, ×××Ļ××ĸ×× ××××××, ×§×× ××××××, ××××¨× ××Ē×× ××Ē, ×××× × ×ץ××××Ē ×××Ļ×ר -
- - ---- - -**×Ē××ĸ××**: https://fastapi.tiangolo.com - -**×§××**: https://github.com/fastapi/fastapi - ---- - -FastAPI ××× ×Ē׊×Ē××Ē ×¨×Š×Ē ××××¨× ××Ē ×××××¨× (×××Ļ××ĸ×× ××××××) ××× ×××Ē ×××Š×§× ×Ē×× ××Ē ××׊×××× (API) ×ĸ× ×¤×××Ē×× 3.6+ ×××Ē×ץץ ×ĸ× ×¨××× ××פ×ץ×× ×Ą×× ×ר××××. - -×Ē××× ××Ē ××פ×Ē× ××: - -- **×××ר×**: ×××Ļ××ĸ×× ×××××× ××××, ××§× × ××× ×ĸ× NodeJS × - Go (×Ē××××Ē × - Starlette × - Pydantic). [×××Ē ××Ē׊×Ē×××Ē ×פ×××Ē×× ××××ר××Ē ××××Ēר](#_14). - -- **××××¨× ××Ē×× ××Ē**: ×××××¨× ××Ē ×××ר××Ē ×¤××Ē×× ××Ē××× ××Ē ×××׊××Ē ×× - %200 ×ĸ× %300. \* -- **פ×××Ē ×Š×××××Ē**: ×× ×ĸ× × - %40 ×׊×××××Ē ×× ×׊ (×פ×Ē×××). \* -- **××× ×××××××××Ē**: ×Ē××××Ē ×ĸ××¨× ××ĸ×××. ×׊××× ××× ××§××. פ×××Ē ××× × ×פ×× ×Š×××××Ē. -- **×§××**: ××Ē××× × ×Ē ×××××Ē ×§×× ×׊×××׊ ×××××××. פ×××Ē ××× ×§×¨×××Ē ×Ē××ĸ××. -- **×§×Ļר×**: ×××ĸ×¨× ×Š×פ×× ×§××. ×ץפר ×Ē××× ××Ē ××× ××ר××Ē ×¤×¨××ר. פ×××Ē ×Š×××××Ē. -- **×ץ×× ×**: ×§××× ×§×× ×××× ×ץ××××Ē ×××Ļ×ר. ×ĸ× ×Ē××ĸ×× ××× ×רק×××× ×××××××. -- **×××ץץ×Ē ×Ą×× ×ר×××**: ×××ץץ×Ē ×ĸ× (××Ē××××Ē ××××××× × -) ×ץ××× ×¨××× ×פ×Ē×××× ××××Š×§× ×Ē×× ××Ē ××׊××××: OpenAPI (××××ĸ×× ×׊×ĸ×ר × - Swagger) × - JSON Schema. - -\* ××ĸר×× ×××ץץ×Ē ×ĸ× ××××§××Ē ×Š× ×Ļ×××Ē ×¤××Ē×× ×¤× ××× ×Š××× × ×פ×××§×Ļ×××Ē ×ץ××××Ē ×××Ļ×ר. - -## × ××Ē× × ×ץ××Ē - - - -{% if sponsors %} -{% for sponsor in sponsors.gold -%} -async def...uvicorn main:app --reload...app = FastAPI().
-- --reload: ×ר×× ×׊ר×Ē ×××Ē××Ē×× ×××ר ׊×× ×××× ××§××. ×ĸ×Š× ×××Ē ×¨×§ ×ץ××××Ē ×¤××Ē××.
-
-/items/{item_id}.
-- ×Š× × × _× ×Ē××××_ ××§×××× _×ק׊××Ē_ `GET` (××××ĸ××Ē ×× ×*××Ē××××Ē* HTTP).
-- × _× ×Ē××_ /items/{item_id} ×××× \*פר××ר × ×Ē××\_ `item_id` ׊×××ר ×××××Ē `int`.
-- × _× ×Ē××_ /items/{item_id} \*פר××ר ׊××××Ē×\_ ××פ×Ļ××× ×× `q`.
-
-### ×Ē××ĸ×× API ××× ×רק××××
-
-××ĸ×Ē ×¤× × ×××Ē×××Ē http://127.0.0.1:8000/docs.
-
-××Ē× ×Ēר×× ××Ē ××Ē××ĸ×× ×××××××× (×ץ×פק ×ĸ× ××× Swagger UI):
-
-
-
-### ×Ē××ĸ×× ××××¨× ××××
-
-××ĸ×Ē ×¤× × ×××Ē×××Ē http://127.0.0.1:8000/redoc.
-
-××Ē× ×Ēר×× ×Ē××ĸ×× ××××¨× ×××× (×ץ×פק ×ĸ× ××× ReDoc):
-
-
-
-## ׊×ר×× ××××××
-
-××ĸ×Ē ×ĸר×× ××Ē ××§×××Ĩ `main.py` ×× ×Š×××× ××§×× ×××Ŗ ××ק׊×Ē `PUT`.
-
-×××××¨× ××Ē ××××Ŗ ××ĸ×ר×Ē ×¨××× ××פ×ץ×× ×Ą×× ×ר××××, ×××××Ē × - `Pydantic`.
-
-```Python hl_lines="4 9-12 25-27"
-from typing import Union
-
-from fastapi import FastAPI
-from pydantic import BaseModel
-
-app = FastAPI()
-
-
-class Item(BaseModel):
- name: str
- price: float
- is_offer: Union[bool, None] = None
-
-
-@app.get("/")
-def read_root():
- return {"Hello": "World"}
-
-
-@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Union[str, None] = None):
- return {"item_id": item_id, "q": q}
-
-
-@app.put("/items/{item_id}")
-def update_item(item_id: int, item: Item):
- return {"item_name": item.name, "item_id": item_id}
-```
-
-×׊ר×Ē ×××× ×××Ē××Ē×× ××××××××Ē (×××ר ×××ץפ×Ē× --reload ×פק×××Ē `uvicorn` ׊×××ĸ××).
-
-### ׊×ר×× ××Ē××ĸ×× ×××× ×רק××××
-
-××ĸ×Ē ×¤× × ×××Ē×××Ē http://127.0.0.1:8000/docs.
-
-- ××Ē××ĸ×× ×××××××× ××Ē×ĸ×××, ×××× ××××Ŗ ×××׊:
-
-
-
-- ×××Ļ× ×ĸ× ××פ×Ē×ר "Try it out", ××× ××פ׊ר ××× ×××× ××Ē ×פר××ר×× ×××ĸ××× ×׊×ר××Ē ××× × - API.
-
-
-
-- ××ר ×× ×××Ļ× ×ĸ× ××פ×Ē×ר "Execute", ×××Ēר ××Ēק׊ר ×ĸ× × - API ׊×××, ×׊×× ××Ē ×פר××ר××, ×׊×× ××Ē ××Ē××Ļ×××Ē ××× ×ר×× ×××Ē× ×ĸ× ××ץ×:
-
-
-
-### ׊×ר×× ××Ē××ĸ×× ×××××¨× ××××
-
-××ĸ×Ē ×¤× × ×××Ē×××Ē http://127.0.0.1:8000/redoc.
-
-- ××Ē××ĸ×× ×××××¨× ×××× ×× ×ר×× ××Ē ×¤×¨××ר ×׊××××Ē× ×××××Ŗ ×××׊××.
-
-
-
-### ץ××××
-
-×ץ××××, ××Ē× ××ר×××× ** פ×ĸ× ×××Ē** ×ĸ× ××פ××Ą× ×פר××ר××, ×××Ŗ ×××' ×פר××ר×× ×פ×× ×§×Ļ××.
-
-××Ē× ×ĸ×׊×× ××Ē ×× ×ĸ× ××פ××Ą× ×¤×××Ē×× ××××¨× ×××.
-
-××Ē× ×× ×Ļר×××× ××××× ×Ē×××ר ××׊, ××Ē××××Ē ×× ××××§××Ē ×Š× ×Ą×¤×¨××× ×Ą×¤××Ļ×פ××Ē, ×××'
-
-רק **פ×××Ē×× 3.6+** ץ×× ×ר××.
-
-××××××, × - `int`:
-
-```Python
-item_id: int
-```
-
-×× ××××× `Item` ××ר×× ×××Ēר:
-
-```Python
-item: Item
-```
-
-...××ĸ× ××ר××Ē ×××פ×ץ ××××Ē ××× ××Ē× ××§××××:
-
-- ×Ē××××Ē ×ĸ×ר×, ××××:
- - ×׊××××Ē.
- - ××××§×Ē ××פ×ץ××.
-- ×××××Ē ××××ĸ:
- - ׊×××××Ē ×ר×ר××Ē ×××××××××Ē ××׊ר ×××× ×Ą ××××ĸ ×× ×××§× .
- - ×××××Ē ×פ××× ×××××××§×× JSON ××§×× × ××.
-- ×××¨× ×Š× ××××ĸ ×§××: ×××¨× ×Š× ××××ĸ ׊××××ĸ ××ר׊×Ē ×××××ĸ ×××פ×ץ×× ×Š× ×¤×××Ē××. ×§××¨× ×:
- - JSON.
- - פר×××¨× × ×Ē××.
- - פר×××¨× ×Š××××Ē×.
- - ×ĸ×××××Ē.
- - ×××Ēר××Ē.
- - ×פץ××.
- - ×§××Ļ××.
-- ×××¨× ×Š× ××××ĸ פ××: ×××¨× ×Š× ××××ĸ ×××פ×ץ×× ×פ×××Ē×× ×××××ĸ ר׊×Ē (× - JSON):
- - ××××¨× ××פ××Ą× ×¤×××Ē×× (`str`, `int`, `float`, `bool`, `list`, etc).
- - ×ĸ×Ļ×× `datetime`.
- - ×ĸ×Ļ×× `UUID`.
- - ××××× ×ץ××Ą× × ×Ē×× ××.
- - ...×ר××× ××ר××.
-- ×Ē××ĸ×× API ××××××× ×××× ×רק×××××Ē ×××× ×Š×Ē× ××××¨× ×××××Ē ×××׊ק ××׊×Ē×׊:
- - Swagger UI.
- - ReDoc.
-
----
-
-××××¨× ×××××××Ē ××§×× ××§××××Ē, **FastAPI** ××××:
-
-- ××××Ē ×Š×׊ `item_id` ×× ×Ē×× ××ק׊××Ē `GET` × - `PUT`.
-- ××××Ē ×Š× - `item_id` ××× ×××פ×ץ `int` ××ק׊××Ē `GET` × - `PUT`.
- - ×× ××× ××, ×××§×× ×ר×× ×Š×××× ×ר××¨× ×׊×××׊××Ē.
-- ×××××§ ××× ×§××× ×¤×¨××ר ׊××××Ē× ××Š× `q` (×§×¨× `http://127.0.0.1:8000/items/foo?q=somequery`) ××ק׊××Ē `GET`.
- - ×××ר ××פר××ר `q` ××××ר ×ĸ× = None, ××× ××פ×Ļ××× ××.
- - ×××× × - `None` ××× ××× ×××× (××× ××××Ŗ ×××§×¨× ×Š× `PUT`).
-- ××ק׊××Ē `PUT` ×× ×Ē×× /items/{item_id}, ×קר×× ××Ē ×××Ŗ ×××§×Š× × - JSON:
- - ××××Ē ×Š××× ×××× ××Ē ××פ××× ××××× `name` ׊×××ר ×××××Ē ×××פ×ץ `str`.
- - ××××Ē ×Š××× ×××× ××Ē ××פ××× ××××× `price` ׊×××× ×××××Ē ×××פ×ץ `float`.
- - ×××××§ ××× ××× ×××× ××Ē ××פ××× ×ר׊××Ē `is_offer` ׊×××ר ×××××Ē ×××פ×ץ `bool`, ×× ××× × ××Ļ×.
- - ×× ×× ××ĸ××× ×× ×××××××§× JSON ××§×× ×.
-- ××××ר × - JSON ××- JSON ××××××××Ē.
-- ××Ē×ĸ× ××× ××××Ļ×ĸ××Ē OpenAPI, ×Ē××ĸ×× ×Š×× ××××× ××׊×Ē×׊:
- - ××ĸר×××Ē ×Ē××ĸ×× ××× ×רק××××××Ē.
- - ××ĸר×××Ē ×××Ļ×ר ×§×× ×××××××××Ē, ××ר×× ×Š×¤××Ē.
-- ×ץפק ×׊×ר××Ē ×Š×Ē× ××ĸר×××Ē ×Ē××ĸ×× ×¨×Š×Ē×××Ē.
-
----
-
-רק ×ר×× × ××Ē ×§×Ļ× ×קר×××, ××× ××ר ×׊ ××× ×¨×ĸ××× ×Š× ××× ××× ×ĸ×××.
-
-× ×Ą× ××Š× ××Ē ××Ē ×׊×ר×:
-
-```Python
- return {"item_name": item.name, "item_id": item_id}
-```
-
-...×:
-
-```Python
- ... "item_name": item.name ...
-```
-
-...×:
-
-```Python
- ... "item_price": item.price ...
-```
-
-...×ר×× ××× ××ĸ××¨× ×Š××× ×׊××× ××Ē ×××פ××× ×× ×××××ĸ ××Ē ×××פ×ץ×× ×Š×××:
-
-
-
-×××××× ×××Ēר ׊××× ×Š×××××Ē ×ĸ×× ×Ē××× ××Ē, ר×× ××Ē ×××ר×× - ××׊×Ē×׊.
-
-**××Ēר××Ē ×Ą×¤×××ר××**: ×××ר×× - ××׊×Ē×׊ ××××:
-
-- ××ר×× ×ĸ× **פר××ר××** ×××§×ר××Ē ××ר×× ×׊×× ×× ××××: **×××Ēר××Ē**, **×ĸ×××××Ē**, **×פץ××** × - **×§××Ļ××**.
-- ××× ××§×××ĸ **××××××Ē ×××××Ē** ××ĸ×ר×Ē `maximum_length` ×× `regex`.
-- ××¨× ×××§× ××§×× ××׊×Ē×׊ ×**××רק×Ē ×Ē×××××Ē**.
-- ××××× ×××Ē×××Ē××Ē, ×××× ×Ē×××× × - **OAuth2** ×ĸ× **JWT** ×××Ē×××Ē××Ē **HTTP Basic**.
-- ××× ××§××Ē ××Ē×§××××Ē (××× ×§×××Ē ××××Ē× ××××) ×××ר××Ē ××××××§×× JSON ××§×× × ×× (×Ē××××Ē × - Pydantic).
-- ××× ×רק×Ļ×× ×ĸ× **GraphQL** ××¨× Strawberry ×ץפר×××Ē ××ר××Ē.
-- ×Ē××× ××Ē × ×ץפ××Ē ×¨×××Ē (×Ē××××Ē × - Starlette) ××××:
- - **WebSockets**
- - ××××§××Ē ×§×××Ē ×××××× ×××ץץ××Ē ×ĸ× `requests` × - `pytest`
- - **CORS**
- - **Cookie Sessions**
- - ...××ĸ××.
-
-## ×××Ļ××ĸ××
-
-××××§××Ē ×ĸ×Ļ×××××Ē ×Š× TechEmpower ×ר×× ×Š×פ×××§×Ļ×××Ē **FastAPI** ׊ר×Ļ××Ē ×Ē××Ē Uvicorn ×× ××Ē׊×Ē×××Ē ×פ×××Ē×× ××××ר××Ē ××××Ēר, רק ××Ē××Ē × - Starlette × - Uvicorn ×ĸ×Ļ×× (׊ - FastAPI ×××ץץ×Ē ×ĸ××××). (\*)
-
-××× ××××× ×ĸ×× ×ĸ× ×× ×׊×, ר×× ××Ē ×פרק Benchmarks.
-
-## ×Ē×××××Ē ××פ×Ļ××× ××××Ē
-
-×׊×××׊ Pydantic:
-
-- email-validator - ××××××Ē ××Ē××××Ē ××××××.
-
-×׊×××׊ Starlette:
-
-- httpx - ×ר×׊ ×× ×ר×Ļ×× ×× ××׊×Ē×׊ × - `TestClient`.
-- jinja2 - ×ר×׊ ×× ×ר×Ļ×× ×× ××׊×Ē×׊ ××ר×ר×Ē ××××× ×Š× ×Ē×Ļ×ר×Ē ×××פ××××××.
-- python-multipart - ×ר×׊ ×× ×ר×Ļ×× ×× ××Ē××× × "פרץ×ר" ×פץ××, ×××Ļ××ĸ××Ē request.form().
-- itsdangerous - ×ר×׊ ×× ×ר×Ļ×× ×× ××׊×Ē×׊ × - `SessionMiddleware`.
-- pyyaml - ×ר×׊ ×× ×ר×Ļ×× ×× ××׊×Ē×׊ × - `SchemaGenerator` ×Š× Starlette (×× ×¨×× ×Š××Ē× ×× ×Ļר×××× ××Ē ×× ×ĸ× FastAPI).
-
-×׊×××׊ FastAPI / Starlette:
-
-- uvicorn - ×׊ר×Ē ×Š×××ĸ× ××××׊ ××Ē ××פ×××§×Ļ×× ×Š×××.
-- orjson - ×ר×׊ ×× ×ר×Ļ×× ×× ××׊×Ē×׊ × - `ORJSONResponse`.
-- ujson - ×ר×׊ ×× ×ר×Ļ×× ×× ××׊×Ē×׊ × - `UJSONResponse`.
-
-×Ē×××× ×××Ē×§×× ××Ē ×× ××× ××××Ļ×ĸ××Ē pip install "fastapi[all]".
-
-## ר׊×××
-
-×פר×××§× ××× ××× ×Ē××Ē ××Ē× ××× ×Š× ×¨×Š××× MIT.
diff --git a/docs/he/mkdocs.yml b/docs/he/mkdocs.yml
deleted file mode 100644
index de18856f4..000000000
--- a/docs/he/mkdocs.yml
+++ /dev/null
@@ -1 +0,0 @@
-INHERIT: ../en/mkdocs.yml
diff --git a/docs/hu/docs/index.md b/docs/hu/docs/index.md
deleted file mode 100644
index 45ff49c3b..000000000
--- a/docs/hu/docs/index.md
+++ /dev/null
@@ -1,467 +0,0 @@
-
-- FastAPI keretrendszer, nagy teljesÃtmÊny, kÃļnnyen tanulhatÃŗ, gyorsan kÃŗdolhatÃŗ, productionre kÊsz -
- - ---- - -**DokumentÃĄciÃŗ**: https://fastapi.tiangolo.com - -**ForrÃĄs kÃŗd**: https://github.com/fastapi/fastapi - ---- -A FastAPI egy modern, gyors (nagy teljesÃtmÊnyÅą), webes keretrendszer API-ok ÊpÃtÊsÊhez Python -al, a Python szabvÃĄnyos tÃpusjelÃļlÊseire ÊpÃtve. - - -Kulcs funkciÃŗk: - -* **Gyors**: Nagyon nagy teljesÃtmÊny, a **NodeJS**-el Ês a **Go**-val egyenrangÃē (a Starlettenek Ês a Pydantic-nek kÃļszÃļnhetÅen). [Az egyik leggyorsabb Python keretrendszer](#performance). -* **Gyorsan kÃŗdolhatÃŗ**: A funkciÃŗk fejlesztÊsi sebessÊgÊt 200-300 szÃĄzalÊkkal megnÃļveli. * -* **Kevesebb hiba**: KÃļrÃŧlbelÃŧl 40%-al csÃļkkenti az emberi (fejlesztÅi) hibÃĄk szÃĄmÃĄt. * -* **IntuitÃv**: KivÃĄlÃŗ szerkesztÅ tÃĄmogatÃĄs. KiegÊszÃtÊs mindenhol. Kevesebb hibakeresÊssel tÃļltÃļtt idÅ. -* **EgyszerÅą**: EgyszerÅą tanulÃĄsra Ês hasznÃĄlatra tervezve. Kevesebb dokumentÃĄciÃŗ olvasÃĄssal tÃļltÃļtt idÅ. -* **RÃļvid**: KÃŗd duplikÃĄciÃŗ minimalizÃĄlÃĄsa. TÃļbb funkciÃŗ minden paramÊter deklarÃĄlÃĄsÃĄval. Kevesebb hiba. -* **Robosztus**: Production ready kÃŗd. Automatikus interaktÃv dokumentÃĄciÃŗ val. -* **SzabvÃĄny alapÃē**: Az API-ok nyÃlt szabvÃĄnyaira alapulÃŗ (Ês azokkal teljesen kompatibilis): OpenAPI (korÃĄbban Swagger nÊven ismert) Ês a JSON Schema. - -* Egy production alkalmazÃĄsokat ÊpÃtÅ belsÅ fejlesztÅi csapat tesztjein alapulÃŗ becslÊs. - -## Szponzorok - - - -{% if sponsors %} -{% for sponsor in sponsors.gold -%} -async def-et...uvicorn main:app --reload...email-validator - e-mail validÃĄciÃŗkra.
-* pydantic-settings - BeÃĄllÃtÃĄsok kÃļvetÊsÊre.
-* pydantic-extra-types - Extra tÃpusok Pydantic-hoz.
-
-Starlette ÃĄltal hasznÃĄlt:
-
-* httpx - KÃļvetelmÊny ha a `TestClient`-et akarod hasznÃĄlni.
-* jinja2 - KÃļvetelmÊny ha az alap template konfigurÃĄciÃŗt akarod hasznÃĄlni.
-* python-multipart - KÃļvetelmÊny ha "parsing"-ot akarsz tÃĄmogatni, `request.form()`-al.
-* itsdangerous - KÃļvetelmÊny `SessionMiddleware` tÃĄmogatÃĄshoz.
-* pyyaml - KÃļvetelmÊny a Starlette `SchemaGenerator`-ÃĄnak tÃĄmogatÃĄsÃĄhoz (valÃŗszÃnÅąleg erre nincs szÃŧksÊg FastAPI hasznÃĄlÃĄsa esetÊn).
-
-FastAPI / Starlette ÃĄltal hasznÃĄlt
-
-* uvicorn - Szerverekhez amÃg betÃļltik Ês szolgÃĄltatjÃĄk az applikÃĄciÃŗdat.
-* orjson - KÃļvetelmÊny ha `ORJSONResponse`-t akarsz hasznÃĄlni.
-* ujson - KÃļvetelmÊny ha `UJSONResponse`-t akarsz hasznÃĄlni.
-
-Ezeket mind telepÃtheted a `pip install "fastapi[all]"` paranccsal.
-
-## Licensz
-Ez a projekt az MIT license, licensz alatt fut
diff --git a/docs/hu/mkdocs.yml b/docs/hu/mkdocs.yml
deleted file mode 100644
index de18856f4..000000000
--- a/docs/hu/mkdocs.yml
+++ /dev/null
@@ -1 +0,0 @@
-INHERIT: ../en/mkdocs.yml
diff --git a/docs/id/docs/index.md b/docs/id/docs/index.md
deleted file mode 100644
index 5fb0c4c9c..000000000
--- a/docs/id/docs/index.md
+++ /dev/null
@@ -1,495 +0,0 @@
-# FastAPI
-
-
-
-
-- FastAPI, framework performa tinggi, mudah dipelajari, cepat untuk coding, siap untuk pengembangan -
- - ---- - -**Dokumentasi**: https://fastapi.tiangolo.com - -**Kode Sumber**: https://github.com/fastapi/fastapi - ---- - -FastAPI adalah *framework* *web* moderen, cepat (performa-tinggi) untuk membangun API dengan Python berdasarkan tipe petunjuk Python. - -Fitur utama FastAPI: - -* **Cepat**: Performa sangat tinggi, setara **NodeJS** dan **Go** (berkat Starlette dan Pydantic). [Salah satu *framework* Python tercepat yang ada](#performa). -* **Cepat untuk coding**: Meningkatkan kecepatan pengembangan fitur dari 200% sampai 300%. * -* **Sedikit bug**: Mengurangi hingga 40% kesalahan dari manusia (pemrogram). * -* **Intuitif**: Dukungan editor hebat. Penyelesaian di mana pun. Lebih sedikit *debugging*. -* **Mudah**: Dibuat mudah digunakan dan dipelajari. Sedikit waktu membaca dokumentasi. -* **Ringkas**: Mengurasi duplikasi kode. Beragam fitur dari setiap deklarasi parameter. Lebih sedikit *bug*. -* **Handal**: Dapatkan kode siap-digunakan. Dengan dokumentasi otomatis interaktif. -* **Standar-resmi**: Berdasarkan (kompatibel dengan ) standar umum untuk API: OpenAPI (sebelumnya disebut Swagger) dan JSON Schema. - -* estimasi berdasarkan pengujian tim internal pengembangan applikasi siap pakai. - -## Sponsor - - - -{% if sponsors %} -{% for sponsor in sponsors.gold -%} -async def...fastapi dev main.py...email-validator - untuk validasi email.
-
-Digunakan oleh Starlette:
-
-* httpx - Dibutuhkan jika anda menggunakan `TestClient`.
-* jinja2 - Dibutuhkan jika anda menggunakan konfigurasi template bawaan.
-* python-multipart - Dibutuhkan jika anda menggunakan form dukungan "parsing", dengan `request.form()`.
-
-Digunakan oleh FastAPI / Starlette:
-
-* uvicorn - untuk server yang memuat dan melayani aplikasi anda. Termasuk `uvicorn[standard]`, yang memasukan sejumlah dependensi (misal `uvloop`) untuk needed melayani dengan performa tinggi.
-* `fastapi-cli` - untuk menyediakan perintah `fastapi`.
-
-### Tanpda dependensi `standard`
-
-Jika anda tidak ingin menambahkan dependensi opsional `standard`, anda dapat menggunakan `pip install fastapi` daripada `pip install "fastapi[standard]"`.
-
-### Dependensi Opsional Tambahan
-
-Ada beberapa dependensi opsional yang bisa anda install.
-
-Dependensi opsional tambahan Pydantic:
-
-* pydantic-settings - untuk manajemen setting.
-* pydantic-extra-types - untuk tipe tambahan yang digunakan dengan Pydantic.
-
-Dependensi tambahan opsional FastAPI:
-
-* orjson - Diperlukan jika anda akan menggunakan`ORJSONResponse`.
-* ujson - Diperlukan jika anda akan menggunakan `UJSONResponse`.
-
-## Lisensi
-
-Project terlisensi dengan lisensi MIT.
diff --git a/docs/id/docs/tutorial/first-steps.md b/docs/id/docs/tutorial/first-steps.md
deleted file mode 100644
index 9b461507d..000000000
--- a/docs/id/docs/tutorial/first-steps.md
+++ /dev/null
@@ -1,332 +0,0 @@
-# Langkah Pertama
-
-File FastAPI yang paling sederhana bisa seperti berikut:
-
-{* ../../docs_src/first_steps/tutorial001.py *}
-
-Salin file tersebut ke `main.py`.
-
-Jalankan di server:
-
-get
-
-/// info | `@decorator` Info
-
-Sintaksis `@sesuatu` di Python disebut "dekorator".
-
-Dekorator ditempatkan di atas fungsi. Seperti sebuah topi cantik (Saya pikir istilah ini berasal dari situ).
-
-"dekorator" memanggil dan bekerja dengan fungsi yang ada di bawahnya
-
-Pada kondisi ini, dekorator ini memberi tahu **FastAPI** bahwa fungsi di bawah nya berhubungan dengan **path** `/` dengan **operasi** `get`.
-
-Sehingga disebut **dekorator operasi path**.
-
-///
-
-Operasi lainnya yang bisa digunakan:
-
-* `@app.post()`
-* `@app.put()`
-* `@app.delete()`
-
-Dan operasi unik lainnya:
-
-* `@app.options()`
-* `@app.head()`
-* `@app.patch()`
-* `@app.trace()`
-
-/// tip | Tips
-
-Jika anda bisa menggunakan operasi apa saja (metode HTTP).
-
-**FastAPI** tidak mengharuskan anda menggunakan operasi tertentu.
-
-Informasi di sini hanyalah sebagai panduan, bukan keharusan.
-
-Sebagai contoh, ketika menggunakan GraphQL, semua operasi umumnya hanya menggunakan `POST`.
-
-///
-
-### Langkah 4: mendefinisikan **fungsi operasi path**
-
-Ini "**fungsi operasi path**" kita:
-
-* **path**: adalah `/`.
-* **operasi**: adalah `get`.
-* **fungsi**: adalah fungsi yang ada di bawah dekorator (di bawah `@app.get("/")`).
-
-{* ../../docs_src/first_steps/tutorial001.py hl[7] *}
-
-Ini adalah fungsi Python.
-
-Fungsi ini dipanggil **FastAPI** setiap kali menerima request ke URL "`/`" dengan operasi `GET`.
-
-Di kondisi ini, ini adalah sebuah fungsi `async`.
-
----
-
-Anda bisa mendefinisikan fungsi ini sebagai fungsi normal daripada `async def`:
-
-{* ../../docs_src/first_steps/tutorial003.py hl[7] *}
-
-/// note | Catatan
-
-Jika anda tidak tahu perbedaannya, kunjungi [Async: *"Panduan cepat"*](../async.md#in-a-hurry){.internal-link target=_blank}.
-
-///
-
-### Langkah 5: hasilkan konten
-
-{* ../../docs_src/first_steps/tutorial001.py hl[8] *}
-
-Anda bisa menghasilkan `dict`, `list`, nilai singular seperti `str`, `int`, dll.
-
-Anda juga bisa menghasilkan model Pydantic (anda akan belajar mengenai ini nanti).
-
-Ada banyak objek dan model yang secara otomatis dikonversi ke JSON (termasuk ORM, dll). Anda bisa menggunakan yang anda suka, kemungkinan sudah didukung.
-
-## Ringkasan
-
-* Impor `FastAPI`.
-* Buat sebuah instance `app`.
-* Tulis **dekorator operasi path** menggunakan dekorator seperti `@app.get("/")`.
-* Definisikan **fungsi operasi path**; sebagai contoh, `def root(): ...`.
-* Jalankan server development dengan perintah `fastapi dev`.
diff --git a/docs/id/docs/tutorial/index.md b/docs/id/docs/tutorial/index.md
deleted file mode 100644
index c01ec9a89..000000000
--- a/docs/id/docs/tutorial/index.md
+++ /dev/null
@@ -1,83 +0,0 @@
-# Tutorial - Pedoman Pengguna - Pengenalan
-
-Tutorial ini menunjukan cara menggunakan ***FastAPI*** dengan semua fitur-fiturnya, tahap demi tahap.
-
-Setiap bagian dibangun secara bertahap dari bagian sebelumnya, tetapi terstruktur untuk memisahkan banyak topik, sehingga kamu bisa secara langsung menuju ke topik spesifik untuk menyelesaikan kebutuhan API tertentu.
-
-Ini juga dibangun untuk digunakan sebagai referensi yang akan datang.
-
-Sehingga kamu dapat kembali lagi dan mencari apa yang kamu butuhkan dengan tepat.
-
-## Jalankan kode
-
-Semua blok-blok kode dapat disalin dan digunakan langsung (Mereka semua sebenarnya adalah file python yang sudah teruji).
-
-Untuk menjalankan setiap contoh, salin kode ke file `main.py`, dan jalankan `uvicorn` dengan:
-
-
-
-/// check | Periksa
-
-Dengan deklarasi tipe data Python yang sama, **FastAPI** membuat dokumentasi interaktif otomatis (terintegrasi Swagger UI).
-
-Perhatikan parameter path dideklarasikan sebagai integer.
-
-///
-
-## Keuntungan basis-standar, dokumentasi alternatif
-
-Karena skema yang dibuat berasal dari standar OpenAPI, maka banyak alat lain yang kompatibel.
-
-Sehingga **FastAPI** menyediakan dokumentasi alternatif (menggunakan ReDoc), yang bisa diakses di http://127.0.0.1:8000/redoc:
-
-
-
-Cara yang sama untuk menggunakan tools kompatibel lainnya. Termasuk alat membuat kode otomatis untuk banyak bahasa.
-
-## Pydantic
-
-Semua validasi data dikerjakan di belakang layar oleh Pydantic, sehingga anda mendapatkan banyak kemudahan. Anda juga tahu proses ini akan ditangani dengan baik.
-
-Anda bisa mendeklarasikan tipe data dengan `str`, `float`, `bool` dan banyak tipe data kompleks lainnya.
-
-Beberapa tipe di atas akan dibahas pada bab berikutnya tutorial ini.
-
-## Urutan berpengaruh
-
-Ketika membuat *operasi path*, anda bisa menghadapi kondisi dimana *path* nya sudah tetap.
-
-Seperti `/users/me`, untuk mendapatkan data user yang sedang aktif.
-
-Kemudian anda bisa memiliki path `/users/{user_id}` untuk mendapatkan data user tertentu melalui user ID.
-
-karena *operasi path* dievaluasi melalui urutan, anda harus memastikan path untuk `/users/me` dideklarasikan sebelum `/user/{user_id}`:
-
-{* ../../docs_src/path_params/tutorial003.py hl[6,11] *}
-
-Sebaliknya, path `/users/{user_id}` juga akan sesuai dengan `/users/me`, "menganggap" menerima parameter `user_id` dengan nilai `"me"`.
-
-Serupa, anda juga tidak bisa mendefinisikan operasi path:
-
-{* ../../docs_src/path_params/tutorial003b.py hl[6,11] *}
-
-Path pertama akan selalu digunakan karena path sesuai dengan yang pertama.
-
-## Nilai terdefinisi
-
-Jika ada *operasi path* yang menerima *parameter path*, tetapi anda ingin nilai valid *parameter path* sudah terdefinisi, anda bisa menggunakan standar Python `Enum`.
-
-### Membuat class `Enum`
-
-Import `Enum` dan buat *sub-class* warisan dari `str` dan `Enum`.
-
-Dengan warisan dari `str` dokumen API mengetahui nilai nya harus berjenis `string` supaya bisa digunakan dengan benar.
-
-Kemudian buat atribut *class* dengan nilai tetap *string* yang benar:
-
-{* ../../docs_src/path_params/tutorial005.py hl[1,6:9] *}
-
-/// info
-
-Enumerasi (atau enum) tersedia di Python sejak versi 3.4.
-
-///
-
-/// tip | Tips
-
-"AlxexNet", "ResNet", dan "LeNet" adalah nama model *Machine Learning*.
-
-///
-
-### Mendeklarasikan *parameter path*
-
-Kemudian buat *parameter path* dengan tipe anotasi menggunakan *class* enum dari (`ModelName`)
-
-{* ../../docs_src/path_params/tutorial005.py hl[16] *}
-
-### Periksa dokumentasi
-
-Karena nilai yang tersedia untuk *parameter path* telah terdefinisi, dokumen interatik bisa memunculkan:
-
-
-
-### Bekerja dengan *enumarasi* Python
-
-Nilai *parameter path* akan menjadi *anggota enumerasi*.
-
-#### Membandingkan *anggota enumerasi*
-
-Anda bisa membandingkan parameter *path* dengan *anggota enumerasi* di enum `ModelName` yang anda buat:
-
-{* ../../docs_src/path_params/tutorial005.py hl[17] *}
-
-#### Mendapatkan *nilai enumerasi*
-
-Anda bisa mendapatkan nilai (`str` dalam kasus ini) menggunakan `model_name.value`, atau secara umum `anggota_enum_anda.value`:
-
-{* ../../docs_src/path_params/tutorial005.py hl[20] *}
-
-/// tip | Tips
-
-Anda bisa mengakses nilai `"lenet"` dnegan `ModelName.lenet.value`.
-
-///
-
-#### Menghasilkan *anggota enumerasi*
-
-Anda bisa menghasilkan *anggota enumerasi* dari *operasi path* bahkan di body JSON bersarang (contoh `dict`).
-
-They will be converted to their corresponding values (strings in this case) before returning them to the client:
-
-{* ../../docs_src/path_params/tutorial005.py hl[18,21,23] *}
-
-Klien akan mendapatkan respon JSON seperti berikut:
-
-```JSON
-{
- "model_name": "alexnet",
- "message": "Deep Learning FTW!"
-}
-```
-
-## Parameter path berisi path
-
-Misalkan terdapat *operasi path* dengan path `/files/{file_path}`.
-
-Tetapi anda memerlukan `file_path` itu berisi *path*, seperti like `home/johndoe/myfile.txt`.
-
-Sehingga URL untuk file tersebut akan seperti: `/files/home/johndoe/myfile.txt`.
-
-### Dukungan OpenAPI
-
-OpenAPI tidak bisa mendeklarasikan *parameter path* berisi *path* di dalamnya, karena menyebabkan kondisi yang sulit di*test* dan didefinisikan.
-
-Tetapi, di **FastAPI** anda tetap bisa melakukannya dengan menggunakan *tools* internal dari Starlette.
-
-Dan dokumentasi tetap berfungsi walaupun tidak menambahkan keterangan bahwa parameter harus berisi *path*.
-
-### Konverter path
-
-Melalui Starlette anda bisa mendeklarasikan *parameter path* berisi *path* dengan URL seperti:
-
-```
-/files/{file_path:path}
-```
-
-Dikondisi ini nama parameter adalah `file_path` dan bagian terakhir `:path` menginformasikan parameter harus sesuai dengan setiap *path*.
-
-Sehingga anda bisa menggunakan:
-
-{* ../../docs_src/path_params/tutorial004.py hl[6] *}
-
-/// tip | Tips
-
-Anda mungkin perlu parameter berisi `/home/johndoe/myfile.txt` di awali garis belakang (`/`).
-
-Di kondisi ini, URL nya menjadi: `/files//home/johndoe/myfile.txt`, dengan dua garis belakang (`//`) di antara `files` dan `home`.
-
-///
-
-## Ringkasan
-
-Di **FastAPI** dengan menggunakan deklarasi tipe Python standar, pendek, intuitif, anda mendapatkan:
-
-* Dukungan editor: pemeriksaan kesalahan, autocompletion, dll.
-* "Parsing" data.
-* Validasi data.
-* Annotasi API dan dokumentasi otomatis.
-
-Semua itu anda hanya perlu mendeklarasikan sekali saja.
-
-Ini adalah salah satu keunggulan **FastAPI** dibandingkan dengan *framework* lainnya (selain dari performa Python *native*c)
diff --git a/docs/id/docs/tutorial/static-files.md b/docs/id/docs/tutorial/static-files.md
deleted file mode 100644
index b55f31394..000000000
--- a/docs/id/docs/tutorial/static-files.md
+++ /dev/null
@@ -1,40 +0,0 @@
-# Berkas Statis
-
-Anda dapat menyajikan berkas statis secara otomatis dari sebuah direktori menggunakan `StaticFiles`.
-
-## Penggunaan `StaticFiles`
-
-* Mengimpor `StaticFiles`.
-* "Mount" representatif `StaticFiles()` di jalur spesifik.
-
-{* ../../docs_src/static_files/tutorial001.py hl[2,6] *}
-
-/// note | Detail Teknis
-
-Anda dapat pula menggunakan `from starlette.staticfiles import StaticFiles`.
-
-**FastAPI** menyediakan `starlette.staticfiles` sama seperti `fastapi.staticfiles` sebagai kemudahan pada Anda, yaitu para pengembang. Tetapi ini asli berasal langsung dari Starlette.
-
-///
-
-### Apa itu "Mounting"
-
-"Mounting" dimaksud menambah aplikasi "independen" secara lengkap di jalur spesifik, kemudian menangani seluruh sub-jalur.
-
-Hal ini berbeda dari menggunakan `APIRouter` karena aplikasi yang dimount benar-benar independen. OpenAPI dan dokumentasi dari aplikasi utama Anda tak akan menyertakan apa pun dari aplikasi yang dimount, dst.
-
-Anda dapat mempelajari mengenai ini dalam [Panduan Pengguna Lanjutan](../advanced/index.md){.internal-link target=_blank}.
-
-## Detail
-
-Terhadap `"/static"` pertama mengacu pada sub-jalur yang akan menjadi tempat "sub-aplikasi" ini akan "dimount". Maka, jalur apa pun yang dimulai dengan `"/static"` akan ditangani oleh sub-jalur tersebut.
-
-Terhadap `directory="static"` mengacu pada nama direktori yang berisi berkas statis Anda.
-
-Terhadap `name="static"` ialah nama yang dapat digunakan secara internal oleh **FastAPI**.
-
-Seluruh parameter ini dapat berbeda dari sekadar "`static`", sesuaikan parameter dengan keperluan dan detail spesifik akan aplikasi Anda.
-
-## Info lanjutan
-
-Sebagai detail dan opsi tambahan lihat dokumentasi Starlette perihal Berkas Statis.
diff --git a/docs/id/mkdocs.yml b/docs/id/mkdocs.yml
deleted file mode 100644
index de18856f4..000000000
--- a/docs/id/mkdocs.yml
+++ /dev/null
@@ -1 +0,0 @@
-INHERIT: ../en/mkdocs.yml
diff --git a/docs/it/docs/index.md b/docs/it/docs/index.md
deleted file mode 100644
index dc8f5b846..000000000
--- a/docs/it/docs/index.md
+++ /dev/null
@@ -1,463 +0,0 @@
-
-- FastAPI framework, alte prestazioni, facile da imparare, rapido da implementare, pronto per il rilascio in produzione -
- - - ---- - -**Documentazione**: https://fastapi.tiangolo.com - -**Codice Sorgente**: https://github.com/fastapi/fastapi - ---- - -FastAPI è un web framework moderno e veloce (a prestazioni elevate) che serve a creare API con Python 3.6+ basato sulle annotazioni di tipo di Python. - -Le sue caratteristiche principali sono: - -* **Velocità **: Prestazioni molto elevate, alla pari di **NodeJS** e **Go** (grazie a Starlette e Pydantic). [Uno dei framework Python piÚ veloci in circolazione](#performance). -* **Veloce da programmare**: Velocizza il lavoro consentendo il rilascio di nuove funzionalità tra il 200% e il 300% piÚ rapidamente. * -* **Meno bug**: Riduce di circa il 40% gli errori che commettono gli sviluppatori durante la scrittura del codice. * -* **Intuitivo**: Grande supporto per gli editor di testo con autocompletamento in ogni dove. In questo modo si puÃ˛ dedicare meno tempo al debugging. -* **Facile**: Progettato per essere facile da usare e imparare. Si riduce il tempo da dedicare alla lettura della documentazione. -* **Sintentico**: Minimizza la duplicazione di codice. Molteplici funzionalità , ognuna con la propria dichiarazione dei parametri. Meno errori. -* **Robusto**: Crea codice pronto per la produzione con documentazione automatica interattiva. -* **Basato sugli standard**: Basato su (e completamente compatibile con) gli open standard per le API: OpenAPI (precedentemente Swagger) e JSON Schema. - -* Stima basata sull'esito di test eseguiti su codice sorgente di applicazioni rilasciate in produzione da un team interno di sviluppatori. - -## Sponsor - - - -{% if sponsors %} -{% for sponsor in sponsors.gold -%} -async def...uvicorn main:app --reload...email-validator - per la validazione di email.
-
-Usate da Starlette:
-
-* requests - Richiesto se vuoi usare il `TestClient`.
-* aiofiles - Richiesto se vuoi usare `FileResponse` o `StaticFiles`.
-* jinja2 - Richiesto se vuoi usare la configurazione template di default.
-* python-multipart - Richiesto se vuoi supportare il "parsing" con `request.form()`.
-* itsdangerous - Richiesto per usare `SessionMiddleware`.
-* pyyaml - Richiesto per il supporto dello `SchemaGenerator` di Starlette (probabilmente non ti serve con FastAPI).
-* graphene - Richiesto per il supporto di `GraphQLApp`.
-
-Usate da FastAPI / Starlette:
-
-* uvicorn - per il server che carica e serve la tua applicazione.
-* orjson - ichiesto se vuoi usare `ORJSONResponse`.
-* ujson - Richiesto se vuoi usare `UJSONResponse`.
-
-Puoi installarle tutte con `pip install fastapi[all]`.
-
-## Licenza
-
-Questo progetto è concesso in licenza in base ai termini della licenza MIT.
diff --git a/docs/it/mkdocs.yml b/docs/it/mkdocs.yml
deleted file mode 100644
index de18856f4..000000000
--- a/docs/it/mkdocs.yml
+++ /dev/null
@@ -1 +0,0 @@
-INHERIT: ../en/mkdocs.yml
diff --git a/docs/ja/docs/async.md b/docs/ja/docs/async.md
index d1da1f82d..90a2e2ee5 100644
--- a/docs/ja/docs/async.md
+++ b/docs/ja/docs/async.md
@@ -338,7 +338,7 @@ async def read_burgers():
äģĨåãŽããŧã¸ã§ãŗãŽPythonã§ã¯ããšãŦãããGeventãåŠį¨ã§ããžããããããããŗãŧãã¯įč§Ŗããããã¯ããããĻãčå¯ãã¯ãããĢč¤éã§ãã
-äģĨåãŽããŧã¸ã§ãŗãŽNodeJS / ããŠãĻãļJavaScriptã§ã¯ãããŗãŧãĢããã¯ããäŊŋį¨ããĻããžãããããã¯ããŗãŧãĢããã¯å°įãĢã¤ãĒãããžãã
+äģĨåãŽããŧã¸ã§ãŗãŽNodeJS / ããŠãĻãļJavaScriptã§ã¯ãããŗãŧãĢããã¯ããäŊŋį¨ããĻããžãããããã¯ãããŗãŧãĢããã¯å°įããĢã¤ãĒãããžãã
## ãŗãĢãŧããŗ
diff --git a/docs/ja/docs/help-fastapi.md b/docs/ja/docs/help-fastapi.md
index d999fa127..8cf0c2163 100644
--- a/docs/ja/docs/help-fastapi.md
+++ b/docs/ja/docs/help-fastapi.md
@@ -31,18 +31,18 @@ GitHubã§FastAPIããWatchãã§ããžã (åŗä¸é¨ãŽWatchããŋãŗãã¯ãĒ
* **GitHub** ã§ããŠããŧã
* äģãŽãĒãŧããŗãŊãŧãšããã¸ã§ã¯ããįĸēčĒã§ããžããäŊããŽåŠããĢãĒãããŽãčĻã¤ãããããããžããã
* æ°ããĒãĒãŧããŗãŊãŧãšããã¸ã§ã¯ããäŊæããã¨ããĢéįĨãããžãã
-* **Twitter** ã§ããŠããŧã
+* **X (Twitter)** ã§ããŠããŧã
* FastAPIãŽäŊŋį¨į¨éãæããĻãã ãã (čããĻãŋããã§ã)ã
* æ°ããĒããŧãĢãŽįē襨ããĒãĒãŧãšãčããžãã
* **Linkedin** ã§ã¤ãĒããã
- * æ°ããĒããŧãĢãŽįē襨ããĒãĒãŧãšãčããžã (ãã ãTwitterãŽæšãåŠį¨é ģåēĻãéĢãã§ãã đ¤ˇââ)ã
+ * æ°ããĒããŧãĢãŽįē襨ããĒãĒãŧãšãčããžã (ãã ãX (Twitter)ãŽæšãåŠį¨é ģåēĻãéĢãã§ãã đ¤ˇââ)ã
* **Dev.to** ã **Medium** ã§čäŊįŠãčĒã (ãžãã¯ããŠããŧ)ã
* ãĸã¤ããĸãäŊæããŧãĢãĢã¤ããĻãŽč¨äēãčĒããžãã
* æ°čĻč¨äēãŽåˇįãéįĨããĻãããžãã
## **FastAPI** ãĢéĸãããã¤ãŧã
-**FastAPI** ãĢã¤ããĻãã¤ãŧãããéįēč
ãäģãŽäēēãĢãŠããæ°ãĢå
ĨãŖããŽãæããĻãã ãããđ
+**FastAPI** ãĢã¤ããĻãã¤ãŧãããéįēč
ãäģãŽäēēãĢãŠããæ°ãĢå
ĨãŖããŽãæããĻãã ãããđ
**FastAPI** ããŠãŽãããĢäŊŋããããŠããæ°ãĢå
ĨããããŠããĒããã¸ã§ã¯ã/äŧį¤žã§äŊŋãããĻããããĒãŠãĢã¤ããĻįĨãããã§ãã
diff --git a/docs/ja/docs/index.md b/docs/ja/docs/index.md
index 1ba85f8e0..c4ff6beeb 100644
--- a/docs/ja/docs/index.md
+++ b/docs/ja/docs/index.md
@@ -88,7 +88,7 @@ FastAPI ã¯ãPythonãŽæ¨æēã§ããåããŗããĢåēãĨããĻPython äģĨé
"_į§ã¯**FastAPI**ãĢã¯ã¯ã¯ã¯ããĻããžãã ããĄãããĄãæĨŊããã§ãīŧ_"
-- FastAPI framework, zeer goede prestaties, eenvoudig te leren, snel te programmeren, klaar voor productie -
- - ---- - -**Documentatie**: https://fastapi.tiangolo.com - -**Broncode**: https://github.com/tiangolo/fastapi - ---- - -FastAPI is een modern, snel (zeer goede prestaties), web framework voor het bouwen van API's in Python, gebruikmakend van standaard Python type-hints. - -De belangrijkste kenmerken zijn: - -* **Snel**: Zeer goede prestaties, vergelijkbaar met **NodeJS** en **Go** (dankzij Starlette en Pydantic). [Een van de snelste beschikbare Python frameworks](#prestaties). -* **Snel te programmeren**: Verhoog de snelheid om functionaliteit te ontwikkelen met ongeveer 200% tot 300%. * -* **Minder bugs**: Verminder ongeveer 40% van de door mensen (ontwikkelaars) veroorzaakte fouten. * -* **Intuïtief**: Buitengewoon goede ondersteuning voor editors. Overal automische code aanvulling. Minder tijd kwijt aan debuggen. -* **Eenvoudig**: Ontworpen om gemakkelijk te gebruiken en te leren. Minder tijd nodig om documentatie te lezen. -* **Kort**: Minimaliseer codeduplicatie. Elke parameterdeclaratie ondersteunt meerdere functionaliteiten. Minder bugs. -* **Robust**: Code gereed voor productie. Met automatische interactieve documentatie. -* **Standards-based**: Gebaseerd op (en volledig verenigbaar met) open standaarden voor API's: OpenAPI (voorheen bekend als Swagger) en JSON Schema. - -* schatting op basis van testen met een intern ontwikkelteam en bouwen van productieapplicaties. - -## Sponsors - - - -{% if sponsors %} -{% for sponsor in sponsors.gold -%} -async def...fastapi dev main.py...email_validator - voor email validatie.
-
-Gebruikt door Starlette:
-
-* httpx - Vereist indien je de `TestClient` wil gebruiken.
-* jinja2 - Vereist als je de standaard templateconfiguratie wil gebruiken.
-* python-multipart - Vereist indien je "parsen" van formulieren wil ondersteunen met `requests.form()`.
-
-Gebruikt door FastAPI / Starlette:
-
-* uvicorn - voor de server die jouw applicatie laadt en bedient.
-* `fastapi-cli` - om het `fastapi` commando te voorzien.
-
-### Zonder `standard` Afhankelijkheden
-
-Indien je de optionele `standard` afhankelijkheden niet wenst te installeren, kan je installeren met `pip install fastapi` in plaats van `pip install "fastapi[standard]"`.
-
-### Bijkomende Optionele Afhankelijkheden
-
-Er zijn nog een aantal bijkomende afhankelijkheden die je eventueel kan installeren.
-
-Bijkomende optionele afhankelijkheden voor Pydantic:
-
-* pydantic-settings - voor het beheren van settings.
-* pydantic-extra-types - voor extra data types die gebruikt kunnen worden met Pydantic.
-
-Bijkomende optionele afhankelijkheden voor FastAPI:
-
-* orjson - Vereist indien je `ORJSONResponse` wil gebruiken.
-* ujson - Vereist indien je `UJSONResponse` wil gebruiken.
-
-## Licentie
-
-Dit project is gelicenseerd onder de voorwaarden van de MIT licentie.
diff --git a/docs/nl/docs/python-types.md b/docs/nl/docs/python-types.md
deleted file mode 100644
index fb8b1e5fd..000000000
--- a/docs/nl/docs/python-types.md
+++ /dev/null
@@ -1,587 +0,0 @@
-# Introductie tot Python Types
-
-Python biedt ondersteuning voor optionele "type hints" (ook wel "type annotaties" genoemd).
-
-Deze **"type hints"** of annotaties zijn een speciale syntax waarmee het type van een variabele kan worden gedeclareerd.
-
-Door types voor je variabelen te declareren, kunnen editors en hulpmiddelen je beter ondersteunen.
-
-Dit is slechts een **korte tutorial/opfrisser** over Python type hints. Het behandelt enkel het minimum dat nodig is om ze te gebruiken met **FastAPI**... en dat is relatief weinig.
-
-**FastAPI** is helemaal gebaseerd op deze type hints, ze geven veel voordelen.
-
-Maar zelfs als je **FastAPI** nooit gebruikt, heb je er baat bij om er iets over te leren.
-
-/// note
-
-Als je een Python expert bent en alles al weet over type hints, sla dan dit hoofdstuk over.
-
-///
-
-## Motivatie
-
-Laten we beginnen met een eenvoudig voorbeeld:
-
-{* ../../docs_src/python_types/tutorial001.py *}
-
-
-Het aanroepen van dit programma leidt tot het volgende resultaat:
-
-```
-John Doe
-```
-
-De functie voert het volgende uit:
-
-* Neem een `first_name` en een `last_name`
-* Converteer de eerste letter van elk naar een hoofdletter met `title()`.
-``
-* Voeg samen met een spatie in het midden.
-
-{* ../../docs_src/python_types/tutorial001.py hl[2] *}
-
-
-### Bewerk het
-
-Dit is een heel eenvoudig programma.
-
-Maar stel je nu voor dat je het vanaf nul zou moeten maken.
-
-Op een gegeven moment zou je aan de definitie van de functie zijn begonnen, je had de parameters klaar...
-
-Maar dan moet je âdie methode die de eerste letter naar hoofdletters converteertâ aanroepen.
-
-Was het `upper`? Was het `uppercase`? `first_uppercase`? `capitalize`?
-
-Dan roep je de hulp in van je oude programmeursvriend, (automatische) code aanvulling in je editor.
-
-Je typt de eerste parameter van de functie, `first_name`, dan een punt (`.`) en drukt dan op `Ctrl+Spatie` om de aanvulling te activeren.
-
-Maar helaas krijg je niets bruikbaars:
-
-
-
-### Types toevoegen
-
-Laten we een enkele regel uit de vorige versie aanpassen.
-
-We zullen precies dit fragment, de parameters van de functie, wijzigen van:
-
-```Python
- first_name, last_name
-```
-
-naar:
-
-```Python
- first_name: str, last_name: str
-```
-
-Dat is alles.
-
-Dat zijn de "type hints":
-
-{* ../../docs_src/python_types/tutorial002.py hl[1] *}
-
-
-Dit is niet hetzelfde als het declareren van standaardwaarden zoals bij:
-
-```Python
- first_name="john", last_name="doe"
-```
-
-Het is iets anders.
-
-We gebruiken dubbele punten (`:`), geen gelijkheidstekens (`=`).
-
-Het toevoegen van type hints verandert normaal gesproken niet wat er gebeurt in je programma t.o.v. wat er zonder type hints zou gebeuren.
-
-Maar stel je voor dat je weer bezig bent met het maken van een functie, maar deze keer met type hints.
-
-Op hetzelfde moment probeer je de automatische aanvulling te activeren met `Ctrl+Spatie` en je ziet:
-
-
-
-Nu kun je de opties bekijken en er doorheen scrollen totdat je de optie vindt die âeen belletje doet rinkelenâ:
-
-
-
-### Meer motivatie
-
-Bekijk deze functie, deze heeft al type hints:
-
-{* ../../docs_src/python_types/tutorial003.py hl[1] *}
-
-
-Omdat de editor de types van de variabelen kent, krijgt u niet alleen aanvulling, maar ook controles op fouten:
-
-
-
-Nu weet je hoe je het moet oplossen, converteer `age` naar een string met `str(age)`:
-
-{* ../../docs_src/python_types/tutorial004.py hl[2] *}
-
-
-## Types declareren
-
-Je hebt net de belangrijkste plek om type hints te declareren gezien. Namelijk als functieparameters.
-
-Dit is ook de belangrijkste plek waar je ze gebruikt met **FastAPI**.
-
-### Eenvoudige types
-
-Je kunt alle standaard Python types declareren, niet alleen `str`.
-
-Je kunt bijvoorbeeld het volgende gebruiken:
-
-* `int`
-* `float`
-* `bool`
-* `bytes`
-
-{* ../../docs_src/python_types/tutorial005.py hl[1] *}
-
-
-### Generieke types met typeparameters
-
-Er zijn enkele datastructuren die andere waarden kunnen bevatten, zoals `dict`, `list`, `set` en `tuple` en waar ook de interne waarden hun eigen type kunnen hebben.
-
-Deze types die interne types hebben worden â**generieke**â types genoemd. Het is mogelijk om ze te declareren, zelfs met hun interne types.
-
-Om deze types en de interne types te declareren, kun je de standaard Python module `typing` gebruiken. Deze module is speciaal gemaakt om deze type hints te ondersteunen.
-
-#### Nieuwere versies van Python
-
-De syntax met `typing` is **verenigbaar** met alle versies, van Python 3.6 tot aan de nieuwste, inclusief Python 3.9, Python 3.10, enz.
-
-Naarmate Python zich ontwikkelt, worden **nieuwere versies**, met verbeterde ondersteuning voor deze type annotaties, beschikbaar. In veel gevallen hoef je niet eens de `typing` module te importeren en te gebruiken om de type annotaties te declareren.
-
-Als je een recentere versie van Python kunt kiezen voor je project, kun je profiteren van die extra eenvoud.
-
-In alle documentatie staan voorbeelden die compatibel zijn met elke versie van Python (als er een verschil is).
-
-Bijvoorbeeld â**Python 3.6+**â betekent dat het compatibel is met Python 3.6 of hoger (inclusief 3.7, 3.8, 3.9, 3.10, etc). En â**Python 3.9+**â betekent dat het compatibel is met Python 3.9 of hoger (inclusief 3.10, etc).
-
-Als je de **laatste versies van Python** kunt gebruiken, gebruik dan de voorbeelden voor de laatste versie, die hebben de **beste en eenvoudigste syntax**, bijvoorbeeld â**Python 3.10+**â.
-
-#### List
-
-Laten we bijvoorbeeld een variabele definiÃĢren als een `list` van `str`.
-
-//// tab | Python 3.9+
-
-Declareer de variabele met dezelfde dubbele punt (`:`) syntax.
-
-Als type, vul `list` in.
-
-Doordat de list een type is dat enkele interne types bevat, zet je ze tussen vierkante haakjes:
-
-```Python hl_lines="1"
-{!> ../../docs_src/python_types/tutorial006_py39.py!}
-```
-
-////
-
-//// tab | Python 3.8+
-
-Van `typing`, importeer `List` (met een hoofdletter `L`):
-
-```Python hl_lines="1"
-{!> ../../docs_src/python_types/tutorial006.py!}
-```
-
-Declareer de variabele met dezelfde dubbele punt (`:`) syntax.
-
-Zet als type de `List` die je hebt geïmporteerd uit `typing`.
-
-Doordat de list een type is dat enkele interne types bevat, zet je ze tussen vierkante haakjes:
-
-```Python hl_lines="4"
-{!> ../../docs_src/python_types/tutorial006.py!}
-```
-
-////
-
-/// info
-
-De interne types tussen vierkante haakjes worden âtypeparametersâ genoemd.
-
-In dit geval is `str` de typeparameter die wordt doorgegeven aan `List` (of `list` in Python 3.9 en hoger).
-
-///
-
-Dat betekent: âde variabele `items` is een `list`, en elk van de items in deze list is een `str`â.
-
-/// tip
-
-Als je Python 3.9 of hoger gebruikt, hoef je `List` niet te importeren uit `typing`, je kunt in plaats daarvan hetzelfde reguliere `list` type gebruiken.
-
-///
-
-Door dat te doen, kan je editor ondersteuning bieden, zelfs tijdens het verwerken van items uit de list:
-
-
-
-Zonder types is dat bijna onmogelijk om te bereiken.
-
-Merk op dat de variabele `item` een van de elementen is in de lijst `items`.
-
-Toch weet de editor dat het een `str` is, en biedt daar vervolgens ondersteuning voor aan.
-
-#### Tuple en Set
-
-Je kunt hetzelfde doen om `tuple`s en `set`s te declareren:
-
-//// 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!}
-```
-
-////
-
-Dit betekent:
-
-* De variabele `items_t` is een `tuple` met 3 items, een `int`, nog een `int`, en een `str`.
-* De variabele `items_s` is een `set`, en elk van de items is van het type `bytes`.
-
-#### Dict
-
-Om een `dict` te definiÃĢren, geef je 2 typeparameters door, gescheiden door komma's.
-
-De eerste typeparameter is voor de sleutels (keys) van de `dict`.
-
-De tweede typeparameter is voor de waarden (values) van het `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!}
-```
-
-////
-
-Dit betekent:
-
-* De variabele `prices` is een `dict`:
- * De sleutels van dit `dict` zijn van het type `str` (bijvoorbeeld de naam van elk item).
- * De waarden van dit `dict` zijn van het type `float` (bijvoorbeeld de prijs van elk item).
-
-#### Union
-
-Je kunt een variable declareren die van **verschillende types** kan zijn, bijvoorbeeld een `int` of een `str`.
-
-In Python 3.6 en hoger (inclusief Python 3.10) kun je het `Union`-type van `typing` gebruiken en de mogelijke types die je wilt accepteren, tussen de vierkante haakjes zetten.
-
-In Python 3.10 is er ook een **nieuwe syntax** waarin je de mogelijke types kunt scheiden door een verticale balk (`|`).
-
-//// 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!}
-```
-
-////
-
-In beide gevallen betekent dit dat `item` een `int` of een `str` kan zijn.
-
-#### Mogelijk `None`
-
-Je kunt declareren dat een waarde een type kan hebben, zoals `str`, maar dat het ook `None` kan zijn.
-
-In Python 3.6 en hoger (inclusief Python 3.10) kun je het declareren door `Optional` te importeren en te gebruiken vanuit de `typing`-module.
-
-```Python hl_lines="1 4"
-{!../../docs_src/python_types/tutorial009.py!}
-```
-
-Door `Optional[str]` te gebruiken in plaats van alleen `str`, kan de editor je helpen fouten te detecteren waarbij je ervan uit zou kunnen gaan dat een waarde altijd een `str` is, terwijl het in werkelijkheid ook `None` zou kunnen zijn.
-
-`Optional[EenType]` is eigenlijk een snelkoppeling voor `Union[EenType, None]`, ze zijn equivalent.
-
-Dit betekent ook dat je in Python 3.10 `EenType | None` kunt gebruiken:
-
-//// 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+ alternative
-
-```Python hl_lines="1 4"
-{!> ../../docs_src/python_types/tutorial009b.py!}
-```
-
-////
-
-#### Gebruik van `Union` of `Optional`
-
-Als je een Python versie lager dan 3.10 gebruikt, is dit een tip vanuit mijn **subjectieve** standpunt:
-
-* đ¨ Vermijd het gebruik van `Optional[EenType]`.
-* Gebruik in plaats daarvan **`Union[EenType, None]`** â¨.
-
-Beide zijn gelijkwaardig en onderliggend zijn ze hetzelfde, maar ik zou `Union` aanraden in plaats van `Optional` omdat het woord â**optional**â lijkt te impliceren dat de waarde optioneel is, en het eigenlijk betekent âhet kan `None` zijnâ, zelfs als het niet optioneel is en nog steeds vereist is.
-
-Ik denk dat `Union[SomeType, None]` explicieter is over wat het betekent.
-
-Het gaat alleen om de woorden en naamgeving. Maar die naamgeving kan invloed hebben op hoe jij en je teamgenoten over de code denken.
-
-Laten we als voorbeeld deze functie nemen:
-
-{* ../../docs_src/python_types/tutorial009c.py hl[1,4] *}
-
-
-De parameter `name` is gedefinieerd als `Optional[str]`, maar is **niet optioneel**, je kunt de functie niet aanroepen zonder de parameter:
-
-```Python
-say_hi() # Oh, nee, dit geeft een foutmelding! đą
-```
-
-De `name` parameter is **nog steeds vereist** (niet *optioneel*) omdat het geen standaardwaarde heeft. Toch accepteert `name` `None` als waarde:
-
-```Python
-say_hi(name=None) # Dit werkt, None is geldig đ
-```
-
-Het goede nieuws is dat als je eenmaal Python 3.10 gebruikt, je je daar geen zorgen meer over hoeft te maken, omdat je dan gewoon `|` kunt gebruiken om unions van types te definiÃĢren:
-
-{* ../../docs_src/python_types/tutorial009c_py310.py hl[1,4] *}
-
-
-Dan hoef je je geen zorgen te maken over namen als `Optional` en `Union`. đ
-
-#### Generieke typen
-
-De types die typeparameters in vierkante haakjes gebruiken, worden **Generieke types** of **Generics** genoemd, bijvoorbeeld:
-
-//// tab | Python 3.10+
-
-Je kunt dezelfde ingebouwde types gebruiken als generics (met vierkante haakjes en types erin):
-
-* `list`
-* `tuple`
-* `set`
-* `dict`
-
-Hetzelfde als bij Python 3.8, uit de `typing`-module:
-
-* `Union`
-* `Optional` (hetzelfde als bij Python 3.8)
-* ...en anderen.
-
-In Python 3.10 kun je , als alternatief voor de generieke `Union` en `Optional`, de verticale lijn (`|`) gebruiken om unions van typen te voorzien, dat is veel beter en eenvoudiger.
-
-////
-
-//// tab | Python 3.9+
-
-Je kunt dezelfde ingebouwde types gebruiken als generieke types (met vierkante haakjes en types erin):
-
-* `list`
-* `tuple`
-* `set`
-* `dict`
-
-En hetzelfde als met Python 3.8, vanuit de `typing`-module:
-
-* `Union`
-* `Optional`
-* ...en anderen.
-
-////
-
-//// tab | Python 3.8+
-
-* `List`
-* `Tuple`
-* `Set`
-* `Dict`
-* `Union`
-* `Optional`
-* ...en anderen.
-
-////
-
-### Klassen als types
-
-Je kunt een klasse ook declareren als het type van een variabele.
-
-Stel dat je een klasse `Person` hebt, met een naam:
-
-{* ../../docs_src/python_types/tutorial010.py hl[1:3] *}
-
-
-Vervolgens kun je een variabele van het type `Persoon` declareren:
-
-{* ../../docs_src/python_types/tutorial010.py hl[6] *}
-
-
-Dan krijg je ook nog eens volledige editorondersteuning:
-
-
-
-Merk op dat dit betekent dat "`one_person` een **instantie** is van de klasse `Person`".
-
-Dit betekent niet dat `one_person` de **klasse** is met de naam `Person`.
-
-## Pydantic modellen
-
-Pydantic is een Python-pakket voor het uitvoeren van datavalidatie.
-
-Je declareert de "vorm" van de data als klassen met attributen.
-
-Elk attribuut heeft een type.
-
-Vervolgens maak je een instantie van die klasse met een aantal waarden en het valideert de waarden, converteert ze naar het juiste type (als dat het geval is) en geeft je een object met alle data terug.
-
-Daarnaast krijg je volledige editorondersteuning met dat resulterende object.
-
-Een voorbeeld uit de officiÃĢle Pydantic-documentatie:
-
-//// 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
-
-Om meer te leren over Pydantic, bekijk de documentatie.
-
-///
-
-**FastAPI** is volledig gebaseerd op Pydantic.
-
-Je zult veel meer van dit alles in de praktijk zien in de [Tutorial - Gebruikershandleiding](tutorial/index.md){.internal-link target=_blank}.
-
-/// tip
-
-Pydantic heeft een speciaal gedrag wanneer je `Optional` of `Union[EenType, None]` gebruikt zonder een standaardwaarde, je kunt er meer over lezen in de Pydantic-documentatie over Verplichte optionele velden.
-
-///
-
-## Type Hints met Metadata Annotaties
-
-Python heeft ook een functie waarmee je **extra metadata** in deze type hints kunt toevoegen met behulp van `Annotated`.
-
-//// tab | Python 3.9+
-
-In Python 3.9 is `Annotated` onderdeel van de standaardpakket, dus je kunt het importeren vanuit `typing`.
-
-```Python hl_lines="1 4"
-{!> ../../docs_src/python_types/tutorial013_py39.py!}
-```
-
-////
-
-//// tab | Python 3.8+
-
-In versies lager dan Python 3.9 importeer je `Annotated` vanuit `typing_extensions`.
-
-Het wordt al geïnstalleerd met **FastAPI**.
-
-```Python hl_lines="1 4"
-{!> ../../docs_src/python_types/tutorial013.py!}
-```
-
-////
-
-Python zelf doet niets met deze `Annotated` en voor editors en andere hulpmiddelen is het type nog steeds een `str`.
-
-Maar je kunt deze ruimte in `Annotated` gebruiken om **FastAPI** te voorzien van extra metadata over hoe je wilt dat je applicatie zich gedraagt.
-
-Het belangrijkste om te onthouden is dat **de eerste *typeparameter*** die je doorgeeft aan `Annotated` het **werkelijke type** is. De rest is gewoon metadata voor andere hulpmiddelen.
-
-Voor nu hoef je alleen te weten dat `Annotated` bestaat en dat het standaard Python is. đ
-
-Later zul je zien hoe **krachtig** het kan zijn.
-
-/// tip
-
-Het feit dat dit **standaard Python** is, betekent dat je nog steeds de **best mogelijke ontwikkelaarservaring** krijgt in je editor, met de hulpmiddelen die je gebruikt om je code te analyseren en te refactoren, enz. â¨
-
-Daarnaast betekent het ook dat je code zeer verenigbaar zal zijn met veel andere Python-hulpmiddelen en -pakketten. đ
-
-///
-
-## Type hints in **FastAPI**
-
-**FastAPI** maakt gebruik van type hints om verschillende dingen te doen.
-
-Met **FastAPI** declareer je parameters met type hints en krijg je:
-
-* **Editor ondersteuning**.
-* **Type checks**.
-
-...en **FastAPI** gebruikt dezelfde declaraties om:
-
-* **Vereisten te definïeren **: van request pad parameters, query parameters, headers, bodies, dependencies, enz.
-* **Data te converteren**: van de request naar het vereiste type.
-* **Data te valideren**: afkomstig van elke request:
- * **Automatische foutmeldingen** te genereren die naar de client worden geretourneerd wanneer de data ongeldig is.
-* De API met OpenAPI te **documenteren**:
- * die vervolgens wordt gebruikt door de automatische interactieve documentatie gebruikersinterfaces.
-
-Dit klinkt misschien allemaal abstract. Maak je geen zorgen. Je ziet dit allemaal in actie in de [Tutorial - Gebruikershandleiding](tutorial/index.md){.internal-link target=_blank}.
-
-Het belangrijkste is dat door standaard Python types te gebruiken, op ÊÊn plek (in plaats van meer klassen, decorators, enz. toe te voegen), **FastAPI** een groot deel van het werk voor je doet.
-
-/// info
-
-Als je de hele tutorial al hebt doorgenomen en terug bent gekomen om meer te weten te komen over types, is een goede bron het "cheat sheet" van `mypy`.
-
-///
diff --git a/docs/nl/mkdocs.yml b/docs/nl/mkdocs.yml
deleted file mode 100644
index de18856f4..000000000
--- a/docs/nl/mkdocs.yml
+++ /dev/null
@@ -1 +0,0 @@
-INHERIT: ../en/mkdocs.yml
diff --git a/docs/pl/docs/features.md b/docs/pl/docs/features.md
deleted file mode 100644
index 80d3bdece..000000000
--- a/docs/pl/docs/features.md
+++ /dev/null
@@ -1,201 +0,0 @@
-# Cechy
-
-## Cechy FastAPI
-
-**FastAPI** zapewnia Ci nastÄpujÄ
ce korzyÅci:
-
-### Oparcie o standardy open
-
-* OpenAPI do tworzenia API, w tym deklaracji ÅcieÅŧek operacji, parametrÃŗw, ciaÅ zapytaÅ, bezpieczeÅstwa, itp.
-* Automatyczna dokumentacja modelu danych za pomocÄ
JSON Schema (poniewaÅŧ OpenAPI bazuje na JSON Schema).
-* Zaprojektowane z myÅlÄ
o zgodnoÅci z powyÅŧszymi standardami zamiast dodawania ich obsÅugi po fakcie.
-* MoÅŧliwoÅÄ automatycznego **generowania kodu klienta** w wielu jÄzykach.
-
-### Automatyczna dokumentacja
-
-Interaktywna dokumentacja i webowe interfejsy do eksploracji API. Z racji tego, Åŧe framework bazuje na OpenAPI, istnieje wiele opcji, z czego 2 sÄ
domyÅlnie doÅÄ
czone.
-
-* Swagger UI, z interaktywnym interfejsem - odpytuj i testuj swoje API bezpoÅrednio z przeglÄ
darki.
-
-
-
-* Alternatywna dokumentacja API z ReDoc.
-
-
-
-### Nowoczesny Python
-
-Wszystko opiera siÄ na standardowych deklaracjach typu **Python 3.8** (dziÄki Pydantic). Brak nowej skÅadni do uczenia. Po prostu standardowy, wspÃŗÅczesny Python.
-
-JeÅli potrzebujesz szybkiego przypomnienia jak uÅŧywaÄ deklaracji typÃŗw w Pythonie (nawet jeÅli nie uÅŧywasz FastAPI), sprawdÅē krÃŗtki samouczek: [Python Types](python-types.md){.internal-link target=_blank}.
-
-Wystarczy, Åŧe napiszesz standardowe deklaracje typÃŗw Pythona:
-
-```Python
-from datetime import date
-
-from pydantic import BaseModel
-
-# Zadeklaruj parametr jako str
-# i uzyskaj wsparcie edytora wewnÄ
trz funkcji
-def main(user_id: str):
- return user_id
-
-
-# Model Pydantic
-class User(BaseModel):
- id: int
- name: str
- joined: date
-```
-
-A one bÄdÄ
mogÅy zostaÄ pÃŗÅēniej uÅŧyte w nastÄpujÄ
cy sposÃŗb:
-
-```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` oznacza:
-
-PrzekaÅŧ klucze i wartoÅci sÅownika `second_user_data` bezpoÅrednio jako argumenty klucz-wartoÅÄ, co jest rÃŗwnoznaczne z: `User(id=4, name="Mary", joined="2018-11-30")`
-
-///
-
-### Wsparcie edytora
-
-CaÅy framework zostaÅ zaprojektowany tak, aby byÅ Åatwy i intuicyjny w uÅŧyciu. Wszystkie pomysÅy zostaÅy przetestowane na wielu edytorach jeszcze przed rozpoczÄciem procesu tworzenia, aby zapewniÄ najlepsze wraÅŧenia programistyczne.
-
-Ostatnia ankieta Python developer survey jasno wskazuje, Åŧe najczÄÅciej uÅŧywanÄ
funkcjonalnoÅciÄ
jest autouzupeÅnianie w edytorze.
-
-CaÅa struktura frameworku **FastAPI** jest na tym oparta. AutouzupeÅnianie dziaÅa wszÄdzie.
-
-Rzadko bÄdziesz musiaÅ wracaÄ do dokumentacji.
-
-Oto, jak twÃŗj edytor moÅŧe Ci pomÃŗc:
-
-* Visual Studio Code:
-
-
-
-* PyCharm:
-
-
-
-Otrzymasz uzupeÅnienie nawet w miejscach, w ktÃŗrych normalnie uzupeÅnienia nie ma. Na przykÅad klucz "price" w treÅci JSON (ktÃŗry mÃŗgÅ byÄ zagnieÅŧdÅŧony), ktÃŗry pochodzi z zapytania.
-
-Koniec z wpisywaniem bÅÄdnych nazw kluczy, przechodzeniem tam i z powrotem w dokumentacji lub przewijaniem w gÃŗrÄ i w dÃŗÅ, aby sprawdziÄ, czy w koÅcu uÅŧyÅeÅ nazwy `username` czy `user_name`.
-
-### ZwiÄzÅoÅÄ
-
-Wszystko posiada sensowne **domyÅlne wartoÅci**. WszÄdzie znajdziesz opcjonalne konfiguracje. Wszystkie parametry moÅŧesz dostroiÄ, aby zrobiÄ to co potrzebujesz do zdefiniowania API.
-
-Ale domyÅlnie wszystko **"po prostu dziaÅa"**.
-
-### Walidacja
-
-* Walidacja wiÄkszoÅci (lub wszystkich?) **typÃŗw danych** Pythona, w tym:
- * ObiektÃŗw JSON (`dict`).
- * Tablic JSON (`list`) ze zdefiniowanym typem elementÃŗw.
- * PÃŗl tekstowych (`str`) z okreÅleniem minimalnej i maksymalnej dÅugoÅci.
- * Liczb (`int`, `float`) z wartoÅciami minimalnymi, maksymalnymi, itp.
-
-* Walidacja bardziej egzotycznych typÃŗw danych, takich jak:
- * URL.
- * Email.
- * UUID.
- * ...i inne.
-
-CaÅa walidacja jest obsÅugiwana przez ugruntowanÄ
i solidnÄ
bibliotekÄ **Pydantic**.
-
-### BezpieczeÅstwo i uwierzytelnianie
-
-BezpieczeÅstwo i uwierzytelnianie jest zintegrowane. Bez Åŧadnych kompromisÃŗw z bazami czy modelami danych.
-
-Wszystkie schematy bezpieczeÅstwa zdefiniowane w OpenAPI, w tym:
-
-* Podstawowy protokÃŗÅ HTTP.
-* **OAuth2** (rÃŗwnieÅŧ z **tokenami JWT**). SprawdÅē samouczek [OAuth2 with JWT](tutorial/security/oauth2-jwt.md){.internal-link target=_blank}.
-* Klucze API w:
- * NagÅÃŗwkach.
- * Parametrach zapytaÅ.
- * Ciasteczkach, itp.
-
-Plus wszystkie funkcje bezpieczeÅstwa Starlette (wÅÄ
czajÄ
c w to **ciasteczka sesyjne**).
-
-Wszystko zbudowane jako narzÄdzia i komponenty wielokrotnego uÅŧytku, ktÃŗre moÅŧna Åatwo zintegrowaÄ z systemami, magazynami oraz bazami danych - relacyjnymi, NoSQL, itp.
-
-### Wstrzykiwanie ZaleÅŧnoÅci
-
-FastAPI zawiera niezwykle Åatwy w uÅŧyciu, ale niezwykle potÄÅŧny system Wstrzykiwania ZaleÅŧnoÅci.
-
-* Nawet zaleÅŧnoÅci mogÄ
mieÄ zaleÅŧnoÅci, tworzÄ
c hierarchiÄ lub **"graf" zaleÅŧnoÅci**.
-* Wszystko jest **obsÅugiwane automatycznie** przez framework.
-* Wszystkie zaleÅŧnoÅci mogÄ
wymagaÄ danych w ÅŧÄ
daniach oraz rozszerzaÄ ograniczenia i automatycznÄ
dokumentacjÄ **operacji na ÅcieÅŧce**.
-* **Automatyczna walidacja** parametrÃŗw *operacji na ÅcieÅŧce* zdefiniowanych w zaleÅŧnoÅciach.
-* ObsÅuga zÅoÅŧonych systemÃŗw uwierzytelniania uÅŧytkownikÃŗw, **poÅÄ
czeÅ z bazami danych**, itp.
-* Bazy danych, front end, itp. **bez kompromisÃŗw**, ale wciÄ
Åŧ Åatwe do integracji.
-
-### Nieograniczone "wtyczki"
-
-Lub ujmujÄ
c to inaczej - brak potrzeby wtyczek. Importuj i uÅŧywaj kod, ktÃŗry potrzebujesz.
-
-KaÅŧda integracja zostaÅa zaprojektowana tak, aby byÅa tak prosta w uÅŧyciu (z zaleÅŧnoÅciami), Åŧe moÅŧesz utworzyÄ "wtyczkÄ" dla swojej aplikacji w 2 liniach kodu, uÅŧywajÄ
c tej samej struktury i skÅadni, ktÃŗre sÄ
uÅŧywane w *operacjach na ÅcieÅŧce*.
-
-### Testy
-
-* 100% pokrycia kodu testami.
-* 100% adnotacji typÃŗw.
-* UÅŧywany w aplikacjach produkcyjnych.
-
-## Cechy Starlette
-
-**FastAPI** jest w peÅni kompatybilny z (oraz bazuje na) Starlette. Tak wiÄc kaÅŧdy dodatkowy kod Starlette, ktÃŗry posiadasz, rÃŗwnieÅŧ bÄdzie dziaÅaÅ.
-
-`FastAPI` jest w rzeczywistoÅci podklasÄ
`Starlette`, wiÄc jeÅli juÅŧ znasz lub uÅŧywasz Starlette, wiÄkszoÅÄ funkcji bÄdzie dziaÅaÄ w ten sam sposÃŗb.
-
-DziÄki **FastAPI** otrzymujesz wszystkie funkcje **Starlette** (poniewaÅŧ FastAPI to po prostu Starlette na sterydach):
-
-* Bardzo imponujÄ
ca wydajnoÅÄ. Jest to jeden z najszybszych dostÄpnych frameworkÃŗw Pythona, na rÃŗwni z **NodeJS** i **Go**.
-* Wsparcie dla **WebSocket**.
-* Zadania w tle.
-* Eventy startup i shutdown.
-* Klient testowy zbudowany na bazie biblioteki `requests`.
-* **CORS**, GZip, pliki statyczne, streamy.
-* ObsÅuga **sesji i ciasteczek**.
-* 100% pokrycie testami.
-* 100% adnotacji typÃŗw.
-
-## Cechy Pydantic
-
-**FastAPI** jest w peÅni kompatybilny z (oraz bazuje na) Pydantic. Tak wiÄc kaÅŧdy dodatkowy kod Pydantic, ktÃŗry posiadasz, rÃŗwnieÅŧ bÄdzie dziaÅaÅ.
-
-WliczajÄ
c w to zewnÄtrzne biblioteki, rÃŗwnieÅŧ oparte o Pydantic, takie jak ORM, ODM dla baz danych.
-
-Oznacza to, Åŧe w wielu przypadkach moÅŧesz przekazaÄ ten sam obiekt, ktÃŗry otrzymasz z ÅŧÄ
dania **bezpoÅrednio do bazy danych**, poniewaÅŧ wszystko jest walidowane automatycznie.
-
-DziaÅa to rÃŗwnieÅŧ w drugÄ
stronÄ, w wielu przypadkach moÅŧesz po prostu przekazaÄ obiekt otrzymany z bazy danych **bezpoÅrednio do klienta**.
-
-DziÄki **FastAPI** otrzymujesz wszystkie funkcje **Pydantic** (poniewaÅŧ FastAPI bazuje na Pydantic do obsÅugi wszystkich danych):
-
-* **Bez prania mÃŗzgu**:
- * Brak nowego mikrojÄzyka do definiowania schematu, ktÃŗrego trzeba siÄ nauczyÄ.
- * JeÅli znasz adnotacje typÃŗw Pythona to wiesz jak uÅŧywaÄ Pydantic.
-* Dobrze wspÃŗÅpracuje z Twoim **IDE/linterem/mÃŗzgiem**:
- * PoniewaÅŧ struktury danych Pydantic to po prostu instancje klas, ktÃŗre definiujesz; autouzupeÅnianie, linting, mypy i twoja intuicja powinny dziaÅaÄ poprawnie z Twoimi zwalidowanymi danymi.
-* Walidacja **zÅoÅŧonych struktur**:
- * Wykorzystanie hierarchicznych modeli Pydantic, Pythonowego moduÅu `typing` zawierajÄ
cego `List`, `Dict`, itp.
- * Walidatory umoÅŧliwiajÄ
jasne i Åatwe definiowanie, sprawdzanie zÅoÅŧonych struktur danych oraz dokumentowanie ich jako JSON Schema.
- * MoÅŧesz mieÄ gÅÄboko **zagnieÅŧdÅŧone obiekty JSON** i wszystkie je poddaÄ walidacji i adnotowaÄ.
-* **RozszerzalnoÅÄ**:
- * Pydantic umoÅŧliwia zdefiniowanie niestandardowych typÃŗw danych lub rozszerzenie walidacji o metody na modelu, na ktÃŗrych uÅŧyty jest dekorator walidatora.
-* 100% pokrycie testami.
diff --git a/docs/pl/docs/help-fastapi.md b/docs/pl/docs/help-fastapi.md
deleted file mode 100644
index 3ea328dc2..000000000
--- a/docs/pl/docs/help-fastapi.md
+++ /dev/null
@@ -1,269 +0,0 @@
-# PomÃŗÅŧ FastAPI - Uzyskaj pomoc
-
-Czy podoba Ci siÄ **FastAPI**?
-
-Czy chciaÅbyÅ pomÃŗc FastAPI, jego uÅŧytkownikom i autorowi?
-
-MoÅŧe napotkaÅeÅ na trudnoÅci z **FastAPI** i potrzebujesz pomocy?
-
-Istnieje kilka bardzo Åatwych sposobÃŗw, aby pomÃŗc (czasami wystarczy jedno lub dwa klikniÄcia).
-
-Istnieje rÃŗwnieÅŧ kilka sposobÃŗw uzyskania pomocy.
-
-## Zapisz siÄ do newslettera
-
-MoÅŧesz zapisaÄ siÄ do rzadkiego [newslettera o **FastAPI i jego przyjacioÅach**](newsletter.md){.internal-link target=_blank}, aby byÄ na bieÅŧÄ
co z:
-
-* AktualnoÅciami o FastAPI i przyjacioÅach đ
-* Przewodnikami đ
-* Funkcjami â¨
-* PrzeÅomowymi zmianami đ¨
-* Poradami i sztuczkami â
-
-## ÅledÅē FastAPI na Twitterze
-
-ÅledÅē @fastapi na **Twitterze** aby byÄ na bieÅŧÄ
co z najnowszymi wiadomoÅciami o **FastAPI**. đĻ
-
-## Dodaj gwiazdkÄ **FastAPI** na GitHubie
-
-MoÅŧesz "dodaÄ gwiazdkÄ" FastAPI na GitHubie (klikajÄ
c przycisk gwiazdki w prawym gÃŗrnym rogu): https://github.com/fastapi/fastapi. âī¸
-
-DodajÄ
c gwiazdkÄ, inni uÅŧytkownicy bÄdÄ
mogli Åatwiej znaleÅēÄ projekt i zobaczyÄ, Åŧe byÅ juÅŧ przydatny dla innych.
-
-## Obserwuj repozytorium GitHub w poszukiwaniu nowych wydaÅ
-
-MoÅŧesz "obserwowaÄ" FastAPI na GitHubie (klikajÄ
c przycisk "obserwuj" w prawym gÃŗrnym rogu): https://github.com/fastapi/fastapi. đ
-
-Wybierz opcjÄ "Tylko wydania".
-
-DziÄki temu bÄdziesz otrzymywaÄ powiadomienia (na swÃŗj adres e-mail) za kaÅŧdym razem, gdy pojawi siÄ nowe wydanie (nowa wersja) **FastAPI** z poprawkami bÅÄdÃŗw i nowymi funkcjami.
-
-## Skontaktuj siÄ z autorem
-
-MoÅŧesz skontaktowaÄ siÄ ze mnÄ
(SebastiÃĄn RamÃrez / `tiangolo`), autorem.
-
-MoÅŧesz:
-
-* ÅledziÄ mnie na **GitHubie**.
- * Zobacz inne projekty open source, ktÃŗre stworzyÅem, a mogÄ
byÄ dla Ciebie pomocne.
- * ÅledÅē mnie, aby dostaÄ powiadomienie, gdy utworzÄ nowy projekt open source.
-* ÅledziÄ mnie na **Twitterze** lub na Mastodonie.
- * Napisz mi, w jaki sposÃŗb korzystasz z FastAPI (uwielbiam o tym czytaÄ).
- * Dowiedz siÄ, gdy ogÅoszÄ coÅ nowego lub wypuszczÄ nowe narzÄdzia.
- * MoÅŧesz takÅŧe ÅledziÄ @fastapi na Twitterze (to oddzielne konto).
-* NawiÄ
Åŧ ze mnÄ
kontakt na **Linkedinie**.
- * Dowiedz siÄ, gdy ogÅoszÄ coÅ nowego lub wypuszczÄ nowe narzÄdzia (chociaÅŧ czÄÅciej korzystam z Twittera đ¤ˇââ).
-* Czytaj moje posty (lub ÅledÅē mnie) na **Dev.to** lub na **Medium**.
- * Czytaj o innych pomysÅach, artykuÅach i dowiedz siÄ o narzÄdziach, ktÃŗre stworzyÅem.
- * ÅledÅē mnie, by wiedzieÄ gdy opublikujÄ coÅ nowego.
-
-## Napisz tweeta o **FastAPI**
-
-Napisz tweeta o **FastAPI** i powiedz czemu Ci siÄ podoba. đ
-
-Uwielbiam czytaÄ w jaki sposÃŗb **FastAPI** jest uÅŧywane, co Ci siÄ w nim podobaÅo, w jakim projekcie/firmie go uÅŧywasz itp.
-
-## GÅosuj na FastAPI
-
-* GÅosuj na **FastAPI** w Slant.
-* GÅosuj na **FastAPI** w AlternativeTo.
-* Powiedz, Åŧe uÅŧywasz **FastAPI** na StackShare.
-
-## Pomagaj innym, odpowiadajÄ
c na ich pytania na GitHubie
-
-MoÅŧesz sprÃŗbowaÄ pomÃŗc innym, odpowiadajÄ
c w:
-
-* Dyskusjach na GitHubie
-* Problemach na GitHubie
-
-W wielu przypadkach moÅŧesz juÅŧ znaÄ odpowiedÅē na te pytania. đ¤
-
-JeÅli pomoÅŧesz wielu ludziom, moÅŧesz zostaÄ oficjalnym [Ekspertem FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank}. đ
-
-PamiÄtaj tylko o najwaÅŧniejszym: bÄ
dÅē Åŧyczliwy. Ludzie przychodzÄ
sfrustrowani i w wielu przypadkach nie zadajÄ
pytaÅ w najlepszy sposÃŗb, ale mimo to postaraj siÄ byÄ dla nich jak najbardziej Åŧyczliwy. đ¤
-
-ChciaÅbym, by spoÅecznoÅÄ **FastAPI** byÅa Åŧyczliwa i przyjazna. Nie akceptuj przeÅladowania ani braku szacunku wobec innych. Dbajmy o siebie nawzajem.
-
----
-
-Oto, jak pomÃŗc innym z pytaniami (w dyskusjach lub problemach):
-
-### Zrozum pytanie
-
-* Upewnij siÄ, czy rozumiesz **cel** i przypadek uÅŧycia osoby pytajÄ
cej.
-
-* NastÄpnie sprawdÅē, czy pytanie (wiÄkszoÅÄ to pytania) jest **jasne**.
-
-* W wielu przypadkach zadane pytanie dotyczy rozwiÄ
zania wymyÅlonego przez uÅŧytkownika, ale moÅŧe istnieÄ **lepsze** rozwiÄ
zanie. JeÅli dokÅadnie zrozumiesz problem i przypadek uÅŧycia, byÄ moÅŧe bÄdziesz mÃŗgÅ zaproponowaÄ lepsze **alternatywne rozwiÄ
zanie**.
-
-* JeÅli nie rozumiesz pytania, poproÅ o wiÄcej **szczegÃŗÅÃŗw**.
-
-### OdtwÃŗrz problem
-
-W wiÄkszoÅci przypadkÃŗw problem wynika z **autorskiego kodu** osoby pytajÄ
cej.
-
-CzÄsto pytajÄ
cy umieszczajÄ
tylko fragment kodu, niewystarczajÄ
cy do **odtworzenia problemu**.
-
-* MoÅŧesz poprosiÄ ich o dostarczenie minimalnego, odtwarzalnego przykÅadu, ktÃŗry moÅŧesz **skopiowaÄ i wkleiÄ** i uruchomiÄ lokalnie, aby zobaczyÄ ten sam bÅÄ
d lub zachowanie, ktÃŗre widzÄ
, lub lepiej zrozumieÄ ich przypadki uÅŧycia.
-
-* JeÅli jesteÅ wyjÄ
tkowo pomocny, moÅŧesz sprÃŗbowaÄ **stworzyÄ taki przykÅad** samodzielnie, opierajÄ
c siÄ tylko na opisie problemu. Miej na uwadze, Åŧe moÅŧe to zajÄ
Ä duÅŧo czasu i lepiej moÅŧe byÄ najpierw poprosiÄ ich o wyjaÅnienie problemu.
-
-### Proponuj rozwiÄ
zania
-
-* Po zrozumieniu pytania moÅŧesz podaÄ im moÅŧliwÄ
**odpowiedÅē**.
-
-* W wielu przypadkach lepiej zrozumieÄ ich **podstawowy problem lub przypadek uÅŧycia**, poniewaÅŧ moÅŧe istnieÄ lepszy sposÃŗb rozwiÄ
zania niÅŧ to, co prÃŗbujÄ
zrobiÄ.
-
-### PoproÅ o zamkniÄcie
-
-JeÅli odpowiedzÄ
, jest duÅŧa szansa, Åŧe rozwiÄ
zaÅeÅ ich problem, gratulacje, **jesteÅ bohaterem**! đϏ
-
-* JeÅli Twoja odpowiedÅē rozwiÄ
zaÅa problem, moÅŧesz poprosiÄ o:
-
- * W Dyskusjach na GitHubie: oznaczenie komentarza jako **odpowiedÅē**.
- * W Problemach na GitHubie: **zamkniÄcie** problemu.
-
-## Obserwuj repozytorium na GitHubie
-
-MoÅŧesz "obserwowaÄ" FastAPI na GitHubie (klikajÄ
c przycisk "obserwuj" w prawym gÃŗrnym rogu): https://github.com/fastapi/fastapi. đ
-
-JeÅli wybierzesz "Obserwuj" zamiast "Tylko wydania", otrzymasz powiadomienia, gdy ktoÅ utworzy nowy problem lub pytanie. MoÅŧesz rÃŗwnieÅŧ okreÅliÄ, Åŧe chcesz byÄ powiadamiany tylko o nowych problemach, dyskusjach, PR-ach itp.
-
-NastÄpnie moÅŧesz sprÃŗbowaÄ pomÃŗc rozwiÄ
zaÄ te problemy.
-
-## Zadawaj pytania
-
-MoÅŧesz utworzyÄ nowe pytanie w repozytorium na GitHubie, na przykÅad aby:
-
-* ZadaÄ **pytanie** lub zapytaÄ o **problem**.
-* ZaproponowaÄ nowÄ
**funkcjÄ**.
-
-**Uwaga**: jeÅli to zrobisz, poproszÄ CiÄ rÃŗwnieÅŧ o pomoc innym. đ
-
-## PrzeglÄ
daj Pull Requesty
-
-MoÅŧesz pomÃŗc mi w przeglÄ
daniu pull requestÃŗw autorstwa innych osÃŗb.
-
-Jak wczeÅniej wspomniaÅem, postaraj siÄ byÄ jak najbardziej Åŧyczliwy. đ¤
-
----
-
-Oto, co warto mieÄ na uwadze podczas oceny pull requestu:
-
-### Zrozum problem
-
-* Najpierw upewnij siÄ, Åŧe **rozumiesz problem**, ktÃŗry prÃŗbuje rozwiÄ
zaÄ pull request. MoÅŧe byÄ osadzony w wiÄkszym kontekÅcie w GitHubowej dyskusji lub problemie.
-
-* Jest teÅŧ duÅŧa szansa, Åŧe pull request nie jest konieczny, poniewaÅŧ problem moÅŧna rozwiÄ
zaÄ w **inny sposÃŗb**. Wtedy moÅŧesz to zasugerowaÄ lub o to zapytaÄ.
-
-### Nie martw siÄ stylem
-
-* Nie przejmuj siÄ zbytnio rzeczami takimi jak style wiadomoÅci commitÃŗw, przy wcielaniu pull requesta ÅÄ
czÄ commity i modyfikujÄ opis sumarycznego commita rÄcznie.
-
-* Nie przejmuj siÄ rÃŗwnieÅŧ stylem kodu, automatyczne narzÄdzia w repozytorium sprawdzajÄ
to samodzielnie.
-
-A jeÅli istnieje jakaÅ konkretna potrzeba dotyczÄ
ca stylu lub spÃŗjnoÅci, sam poproszÄ o zmiany lub dodam commity z takimi zmianami.
-
-### SprawdÅē kod
-
-* Przeczytaj kod, zastanÃŗw siÄ czy ma sens, **uruchom go lokalnie** i potwierdÅē czy faktycznie rozwiÄ
zuje problem.
-
-* NastÄpnie dodaj **komentarz** z informacjÄ
o tym, Åŧe sprawdziÅeÅ kod, dziÄki temu bÄdÄ miaÅ pewnoÅÄ, Åŧe faktycznie go sprawdziÅeÅ.
-
-/// info
-
-Niestety, nie mogÄ Ålepo ufaÄ PR-om, nawet jeÅli majÄ
kilka zatwierdzeÅ.
-
-Kilka razy zdarzyÅo siÄ, Åŧe PR-y miaÅy 3, 5 lub wiÄcej zatwierdzeÅ (prawdopodobnie dlatego, Åŧe opis obiecuje rozwiÄ
zanie waÅŧnego problemu), ale gdy sam sprawdziÅem danego PR-a, okazaÅ siÄ byÄ zbugowany lub nie rozwiÄ
zywaÅ problemu, ktÃŗry rzekomo miaÅ rozwiÄ
zywaÄ. đ
-
-Dlatego tak waÅŧne jest, abyÅ faktycznie przeczytaÅ i uruchomiÅ kod oraz napisaÅ w komentarzu, Åŧe to zrobiÅeÅ. đ¤
-
-///
-
-* JeÅli PR moÅŧna uproÅciÄ w jakiÅ sposÃŗb, moÅŧesz o to poprosiÄ, ale nie ma potrzeby byÄ zbyt wybrednym, moÅŧe byÄ wiele subiektywnych punktÃŗw widzenia (a ja teÅŧ bÄdÄ miaÅ swÃŗj đ), wiÄc lepiej ÅŧebyÅ skupiÅ siÄ na kluczowych rzeczach.
-
-### Testy
-
-* PomÃŗÅŧ mi sprawdziÄ, czy PR ma **testy**.
-
-* SprawdÅē, czy testy **nie przechodzÄ
** przed PR. đ¨
-
-* NastÄpnie sprawdÅē, czy testy **przechodzÄ
** po PR. â
-
-* Wiele PR-Ãŗw nie ma testÃŗw, moÅŧesz **przypomnieÄ** im o dodaniu testÃŗw, a nawet **zaproponowaÄ** samemu jakieÅ testy. To jedna z rzeczy, ktÃŗre pochÅaniajÄ
najwiÄcej czasu i moÅŧesz w tym bardzo pomÃŗc.
-
-* NastÄpnie skomentuj rÃŗwnieÅŧ to, czego sprÃŗbowaÅeÅ, wtedy bÄdÄ wiedziaÅ, Åŧe to sprawdziÅeÅ. đ¤
-
-## UtwÃŗrz Pull Request
-
-MoÅŧesz [wnieÅÄ wkÅad](contributing.md){.internal-link target=_blank} do kodu ÅērÃŗdÅowego za pomocÄ
Pull Requestu, na przykÅad:
-
-* NaprawiÄ literÃŗwkÄ, ktÃŗrÄ
znalazÅeÅ w dokumentacji.
-* PodzieliÄ siÄ artykuÅem, filmem lub podcastem, ktÃŗry stworzyÅeÅ lub znalazÅeÅ na temat FastAPI, edytujÄ
c ten plik.
- * Upewnij siÄ, Åŧe dodajesz swÃŗj link na poczÄ
tku odpowiedniej sekcji.
-* PomÃŗc w [tÅumaczeniu dokumentacji](contributing.md#translations){.internal-link target=_blank} na TwÃŗj jÄzyk.
- * MoÅŧesz rÃŗwnieÅŧ pomÃŗc w weryfikacji tÅumaczeÅ stworzonych przez innych.
-* ZaproponowaÄ nowe sekcje dokumentacji.
-* NaprawiÄ istniejÄ
cy problem/bÅÄ
d.
- * Upewnij siÄ, Åŧe dodajesz testy.
-* DodaÄ nowÄ
funkcjÄ.
- * Upewnij siÄ, Åŧe dodajesz testy.
- * Upewnij siÄ, Åŧe dodajesz dokumentacjÄ, jeÅli jest to istotne.
-
-## PomÃŗÅŧ w utrzymaniu FastAPI
-
-PomÃŗÅŧ mi utrzymaÄ **FastAPI**! đ¤
-
-Jest wiele pracy do zrobienia, a w wiÄkszoÅci przypadkÃŗw **TY** moÅŧesz to zrobiÄ.
-
-GÅÃŗwne zadania, ktÃŗre moÅŧesz wykonaÄ teraz to:
-
-* [PomÃŗc innym z pytaniami na GitHubie](#pomagaj-innym-odpowiadajac-na-ich-pytania-na-githubie){.internal-link target=_blank} (zobacz sekcjÄ powyÅŧej).
-* [OceniaÄ Pull Requesty](#przegladaj-pull-requesty){.internal-link target=_blank} (zobacz sekcjÄ powyÅŧej).
-
-Te dwie czynnoÅci **zajmujÄ
najwiÄcej czasu**. To gÅÃŗwna praca zwiÄ
zana z utrzymaniem FastAPI.
-
-JeÅli moÅŧesz mi w tym pomÃŗc, **pomoÅŧesz mi utrzymaÄ FastAPI** i zapewnisz Åŧe bÄdzie **rozwijaÄ siÄ szybciej i lepiej**. đ
-
-## DoÅÄ
cz do czatu
-
-DoÅÄ
cz do đĨ serwera czatu na Discordzie đĨ i spÄdzaj czas z innymi w spoÅecznoÅci FastAPI.
-
-/// tip | WskazÃŗwka
-
-JeÅli masz pytania, zadaj je w Dyskusjach na GitHubie, jest duÅŧo wiÄksza szansa, Åŧe otrzymasz pomoc od [EkspertÃŗw FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank}.
-
-UÅŧywaj czatu tylko do innych ogÃŗlnych rozmÃŗw.
-
-///
-
-### Nie zadawaj pytaÅ na czacie
-
-Miej na uwadze, Åŧe poniewaÅŧ czaty pozwalajÄ
na bardziej "swobodnÄ
rozmowÄ", Åatwo jest zadawaÄ pytania, ktÃŗre sÄ
zbyt ogÃŗlne i trudniejsze do odpowiedzi, wiÄc moÅŧesz nie otrzymaÄ odpowiedzi.
-
-Na GitHubie szablon poprowadzi CiÄ do napisania odpowiedniego pytania, dziÄki czemu Åatwiej uzyskasz dobrÄ
odpowiedÅē, a nawet rozwiÄ
Åŧesz problem samodzielnie, zanim zapytasz. Ponadto na GitHubie mogÄ siÄ upewniÄ, Åŧe zawsze odpowiadam na wszystko, nawet jeÅli zajmuje to trochÄ czasu. OsobiÅcie nie mogÄ tego zrobiÄ z systemami czatu. đ
-
-RozmÃŗw w systemach czatu nie moÅŧna tak Åatwo przeszukiwaÄ, jak na GitHubie, wiÄc pytania i odpowiedzi mogÄ
zaginÄ
Ä w rozmowie. A tylko te na GitHubie liczÄ
siÄ do zostania [Ekspertem FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank}, wiÄc najprawdopodobniej otrzymasz wiÄcej uwagi na GitHubie.
-
-Z drugiej strony w systemach czatu sÄ
tysiÄ
ce uÅŧytkownikÃŗw, wiÄc jest duÅŧa szansa, Åŧe znajdziesz tam kogoÅ do rozmowy, prawie w kaÅŧdej chwili. đ
-
-## Wspieraj autora
-
-MoÅŧesz rÃŗwnieÅŧ finansowo wesprzeÄ autora (mnie) poprzez sponsoring na GitHubie.
-
-Tam moÅŧesz postawiÄ mi kawÄ âī¸ aby podziÄkowaÄ. đ
-
-MoÅŧesz takÅŧe zostaÄ srebrnym lub zÅotym sponsorem FastAPI. đ
đ
-
-## Wspieraj narzÄdzia, ktÃŗre napÄdzajÄ
FastAPI
-
-Jak widziaÅeÅ w dokumentacji, FastAPI stoi na ramionach gigantÃŗw, Starlette i Pydantic.
-
-MoÅŧesz rÃŗwnieÅŧ wesprzeÄ:
-
-* Samuel Colvin (Pydantic)
-* Encode (Starlette, Uvicorn)
-
----
-
-DziÄkujÄ! đ
diff --git a/docs/pl/docs/index.md b/docs/pl/docs/index.md
deleted file mode 100644
index 0e13d2631..000000000
--- a/docs/pl/docs/index.md
+++ /dev/null
@@ -1,467 +0,0 @@
-# FastAPI
-
-
-
-
-- FastAPI to szybki, prosty w nauce i gotowy do uÅŧycia w produkcji framework -
- - ---- - -**Dokumentacja**: https://fastapi.tiangolo.com - -**Kod ÅŧrÃŗdÅowy**: https://github.com/fastapi/fastapi - ---- - -FastAPI to nowoczesny, wydajny framework webowy do budowania API z uÅŧyciem Pythona bazujÄ cy na standardowym typowaniu Pythona. - -Kluczowe cechy: - -* **WydajnoÅÄ**: FastAPI jest bardzo wydajny, na rÃŗwni z **NodeJS** oraz **Go** (dziÄki Starlette i Pydantic). [Jeden z najszybszych dostÄpnych frameworkÃŗw Pythonowych](#wydajnosc). -* **SzybkoÅÄ kodowania**: PrzyÅpiesza szybkoÅÄ pisania nowych funkcjonalnoÅci o okoÅo 200% do 300%. * -* **Mniejsza iloÅÄ bÅÄdÃŗw**: Zmniejsza iloÅÄ ludzkich (dewelopera) bÅÄdy o okoÅo 40%. * -* **IntuicyjnoÅÄ**: WspaniaÅe wsparcie dla edytorÃŗw kodu. DostÄpne wszÄdzie automatyczne uzupeÅnianie kodu. KrÃŗtszy czas debugowania. -* **ÅatwoÅÄ**: Zaprojektowany by byÄ prosty i Åatwy do nauczenia. Mniej czasu spÄdzonego na czytanie dokumentacji. -* **KompaktowoÅÄ**: Minimalizacja powtarzajÄ cego siÄ kodu. Wiele funkcjonalnoÅci dla kaÅŧdej deklaracji parametru. Mniej bÅÄdÃŗw. -* **SolidnoÅÄ**: Kod gotowy dla Årodowiska produkcyjnego. Wraz z automatycznÄ interaktywnÄ dokumentacjÄ . -* **BazujÄ cy na standardach**: Oparty na (i w peÅni kompatybilny z) otwartych standardach API: OpenAPI (wczeÅniej znane jako Swagger) oraz JSON Schema. - -* oszacowania bazowane na testach wykonanych przez wewnÄtrzny zespÃŗÅ deweloperÃŗw, budujÄ cych aplikacie uÅŧywane na Årodowisku produkcyjnym. - -## Sponsorzy - - - -{% if sponsors %} -{% for sponsor in sponsors.gold -%} -async def...uvicorn main:app --reload...email-validator - dla walidacji adresÃŗw email.
-
-UÅŧywane przez Starlette:
-
-* httpx - Wymagane jeÅŧeli chcesz korzystaÄ z `TestClient`.
-* aiofiles - Wymagane jeÅŧeli chcesz korzystaÄ z `FileResponse` albo `StaticFiles`.
-* jinja2 - Wymagane jeÅŧeli chcesz uÅŧywaÄ domyÅlnej konfiguracji szablonÃŗw.
-* python-multipart - Wymagane jeÅŧelich chcesz wsparcie "parsowania" formularzy, uÅŧywajÄ
c `request.form()`.
-* itsdangerous - Wymagany dla wsparcia `SessionMiddleware`.
-* pyyaml - Wymagane dla wsparcia `SchemaGenerator` z Starlette (z FastAPI prawdopodobnie tego nie potrzebujesz).
-* graphene - Wymagane dla wsparcia `GraphQLApp`.
-
-UÅŧywane przez FastAPI / Starlette:
-
-* uvicorn - jako serwer, ktÃŗry Åaduje i obsÅuguje TwojÄ
aplikacjÄ.
-* orjson - Wymagane jeÅŧeli chcesz uÅŧywaÄ `ORJSONResponse`.
-* ujson - Wymagane jeÅŧeli chcesz korzystaÄ z `UJSONResponse`.
-
-MoÅŧesz zainstalowaÄ wszystkie te aplikacje przy pomocy `pip install fastapi[all]`.
-
-## Licencja
-
-Ten projekt jest na licencji MIT.
diff --git a/docs/pl/docs/tutorial/first-steps.md b/docs/pl/docs/tutorial/first-steps.md
deleted file mode 100644
index 8fa4c75ad..000000000
--- a/docs/pl/docs/tutorial/first-steps.md
+++ /dev/null
@@ -1,335 +0,0 @@
-# Pierwsze kroki
-
-Najprostszy plik FastAPI moÅŧe wyglÄ
daÄ tak:
-
-{* ../../docs_src/first_steps/tutorial001.py *}
-
-Skopiuj to do pliku `main.py`.
-
-Uruchom serwer:
-
-get
-
-/// info | `@decorator` Info
-
-SkÅadnia `@something` jest w Pythonie nazywana "dekoratorem".
-
-Umieszczasz to na szczycie funkcji. Jak ÅadnÄ
ozdobnÄ
czapkÄ (chyba stÄ
d wziÄÅa siÄ nazwa).
-
-"Dekorator" przyjmuje funkcjÄ znajdujÄ
cÄ
siÄ poniÅŧej jego i coÅ z niÄ
robi.
-
-W naszym przypadku dekorator mÃŗwi **FastAPI**, Åŧe poniÅŧsza funkcja odpowiada **ÅcieÅŧce** `/` z **operacjÄ
** `get`.
-
-Jest to "**dekorator operacji na ÅcieÅŧce**".
-
-///
-
-MoÅŧesz rÃŗwnieÅŧ uÅŧyÄ innej operacji:
-
-* `@app.post()`
-* `@app.put()`
-* `@app.delete()`
-
-Oraz tych bardziej egzotycznych:
-
-* `@app.options()`
-* `@app.head()`
-* `@app.patch()`
-* `@app.trace()`
-
-/// tip
-
-MoÅŧesz dowolnie uÅŧywaÄ kaÅŧdej operacji (metody HTTP).
-
-**FastAPI** nie narzuca Åŧadnego konkretnego znaczenia.
-
-Informacje tutaj sÄ
przedstawione jako wskazÃŗwka, a nie wymÃŗg.
-
-Na przykÅad, uÅŧywajÄ
c GraphQL, normalnie wykonujesz wszystkie akcje uÅŧywajÄ
c tylko operacji `POST`.
-
-///
-
-### Krok 4: zdefiniuj **funkcjÄ obsÅugujÄ
cÄ
ÅcieÅŧkÄ**
-
-To jest nasza "**funkcja obsÅugujÄ
ca ÅcieÅŧkÄ**":
-
-* **ÅcieÅŧka**: to `/`.
-* **operacja**: to `get`.
-* **funkcja**: to funkcja poniÅŧej "dekoratora" (poniÅŧej `@app.get("/")`).
-
-{* ../../docs_src/first_steps/tutorial001.py hl[7] *}
-
-Jest to funkcja Python.
-
-Zostanie ona wywoÅana przez **FastAPI** za kaÅŧdym razem, gdy otrzyma ÅŧÄ
danie do adresu URL "`/`" przy uÅŧyciu operacji `GET`.
-
-W tym przypadku jest to funkcja "asynchroniczna".
-
----
-
-MoÅŧesz rÃŗwnieÅŧ zdefiniowaÄ to jako normalnÄ
funkcjÄ zamiast `async def`:
-
-{* ../../docs_src/first_steps/tutorial003.py hl[7] *}
-
-/// note
-
-JeÅli nie znasz rÃŗÅŧnicy, sprawdÅē [Async: *"In a hurry?"*](../async.md#in-a-hurry){.internal-link target=_blank}.
-
-///
-
-### Krok 5: zwrÃŗÄ zawartoÅÄ
-
-{* ../../docs_src/first_steps/tutorial001.py hl[8] *}
-
-MoÅŧesz zwrÃŗciÄ `dict`, `list`, pojedynczÄ
wartoÅÄ jako `str`, `int`, itp.
-
-MoÅŧesz rÃŗwnieÅŧ zwrÃŗciÄ modele Pydantic (wiÄcej o tym pÃŗÅēniej).
-
-Istnieje wiele innych obiektÃŗw i modeli, ktÃŗre zostanÄ
automatycznie skonwertowane do formatu JSON (w tym ORM itp.). SprÃŗbuj uÅŧyÄ swoich ulubionych, jest bardzo prawdopodobne, Åŧe sÄ
juÅŧ obsÅugiwane.
-
-## Podsumowanie
-
-* Zaimportuj `FastAPI`.
-* StwÃŗrz instancjÄ `app`.
-* Dodaj **dekorator operacji na ÅcieÅŧce** (taki jak `@app.get("/")`).
-* Napisz **funkcjÄ obsÅugujÄ
cÄ
ÅcieÅŧkÄ** (takÄ
jak `def root(): ...` powyÅŧej).
-* Uruchom serwer deweloperski (`uvicorn main:app --reload`).
diff --git a/docs/pl/docs/tutorial/index.md b/docs/pl/docs/tutorial/index.md
deleted file mode 100644
index 66f7c6d62..000000000
--- a/docs/pl/docs/tutorial/index.md
+++ /dev/null
@@ -1,83 +0,0 @@
-# Samouczek
-
-Ten samouczek pokaÅŧe Ci, krok po kroku, jak uÅŧywaÄ wiÄkszoÅci funkcji **FastAPI**.
-
-KaÅŧda czÄÅÄ korzysta z poprzednich, ale jest jednoczeÅnie osobnym tematem. MoÅŧesz przejÅÄ bezpoÅrednio do kaÅŧdego rozdziaÅu, jeÅli szukasz rozwiÄ
zania konkretnego problemu.
-
-Samouczek jest tak zbudowany, Åŧeby sÅuÅŧyÅ jako punkt odniesienia w przyszÅoÅci.
-
-MoÅŧesz wracaÄ i sprawdzaÄ dokÅadnie to czego potrzebujesz.
-
-## Wykonywanie kodu
-
-Wszystkie fragmenty kodu mogÄ
byÄ skopiowane bezpoÅrednio i uÅŧyte (sÄ
poprawnymi i przetestowanymi plikami).
-
-Åģeby wykonaÄ kaÅŧdy przykÅad skopiuj kod to pliku `main.py` i uruchom `uvicorn` za pomocÄ
:
-
-lt
+* XWT
+* PSGI
+
+### abbr даŅŅ ĐžĐąŅŅŅĐŊĐĩĐŊиĐĩ { #the-abbr-gives-an-explanation }
+
+* ĐēĐģаŅŅĐĩŅ
+* ĐĐģŅйОĐēĐžĐĩ ОйŅŅĐĩĐŊиĐĩ
+
+### abbr даŅŅ ĐŋĐžĐģĐŊŅŅ ŅаŅŅиŅŅОвĐēŅ Đ¸ ОйŅŅŅĐŊĐĩĐŊиĐĩ { #the-abbr-gives-a-full-phrase-and-an-explanation }
+
+* MDN
+* I/O.
+
+////
+
+//// tab | ĐĐŊŅĐžŅĐŧаŅиŅ
+
+ĐŅŅийŅŅŅ "title" ŅĐģĐĩĐŧĐĩĐŊŅОв "abbr" ĐŋĐĩŅĐĩвОдŅŅŅŅ ĐŋĐž ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐŊŅĐŧ ĐŋŅавиĐģаĐŧ.
+
+ĐĐĩŅĐĩĐ˛ĐžĐ´Ņ ĐŧĐžĐŗŅŅ Đ´ĐžĐąĐ°Đ˛ĐģŅŅŅ ŅвОи ŅОйŅŅвĐĩĐŊĐŊŅĐĩ ŅĐģĐĩĐŧĐĩĐŊŅŅ "abbr", ĐēĐžŅĐžŅŅĐĩ LLM ĐŊĐĩ Đ´ĐžĐģĐļĐŊа ŅдаĐģŅŅŅ. ĐаĐŋŅиĐŧĐĩŅ, ŅŅĐžĐąŅ ĐžĐąŅŅŅĐŊиŅŅ Đ°ĐŊĐŗĐģиКŅĐēиĐĩ ŅĐģОва.
+
+ĐĄĐŧ. ŅаСдĐĩĐģ `### HTML abbr elements` в ОйŅĐĩĐŧ ĐŋŅĐžĐŧĐŋŅĐĩ в `scripts/translate.py`.
+
+////
+
+## ĐĐ°ĐŗĐžĐģОвĐēи { #headings }
+
+//// tab | ĐĸĐĩŅŅ
+
+### РаСŅайОŅĐēа вĐĩĐąâĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ â ŅŅĐēОвОдŅŅвО { #develop-a-webapp-a-tutorial }
+
+ĐŅивĐĩŅ.
+
+### ĐĐŊĐŊĐžŅаŅии ŅиĐŋОв и -аĐŊĐŊĐžŅаŅии { #type-hints-and-annotations }
+
+ĐĄĐŊОва ĐŋŅивĐĩŅ.
+
+### ĐĄŅĐŋĐĩŅ- и ĐŋОдĐēĐģаŅŅŅ { #super-and-subclasses }
+
+ĐĄĐŊОва ĐŋŅивĐĩŅ.
+
+////
+
+//// tab | ĐĐŊŅĐžŅĐŧаŅиŅ
+
+ĐдиĐŊŅŅвĐĩĐŊĐŊĐžĐĩ ĐļŅŅŅĐēĐžĐĩ ĐŋŅавиĐģĐž Đ´ĐģŅ ĐˇĐ°ĐŗĐžĐģОвĐēОв â LLM Đ´ĐžĐģĐļĐŊа ĐžŅŅавиŅŅ ŅаŅŅŅ Ņ
ĐĩŅа в ŅĐ¸ĐŗŅŅĐŊŅŅ
ŅĐēОйĐēаŅ
ĐąĐĩС иСĐŧĐĩĐŊĐĩĐŊиК, ŅŅĐžĐąŅ ŅŅŅĐģĐēи ĐŊĐĩ ĐģĐžĐŧаĐģиŅŅ.
+
+ĐĄĐŧ. ŅаСдĐĩĐģ `### Headings` в ОйŅĐĩĐŧ ĐŋŅĐžĐŧĐŋŅĐĩ в `scripts/translate.py`.
+
+ĐĐģŅ ĐŊĐĩĐēĐžŅĐžŅŅŅ
ŅСŅĐēОвŅŅ
иĐŊŅŅŅŅĐēŅиК ŅĐŧ., ĐŊаĐŋŅиĐŧĐĩŅ, ŅаСдĐĩĐģ `### Headings` в `docs/de/llm-prompt.md`.
+
+////
+
+## ĐĸĐĩŅĐŧиĐŊŅ, иŅĐŋĐžĐģŅСŅĐĩĐŧŅĐĩ в Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии { #terms-used-in-the-docs }
+
+//// tab | ĐĸĐĩŅŅ
+
+* вŅ
+* ваŅ
+
+* ĐŊаĐŋŅиĐŧĐĩŅ
+* и Ņ.Đ´.
+
+* `foo` ĐēаĐē `int`
+* `bar` ĐēаĐē `str`
+* `baz` ĐēаĐē `list`
+
+* ĐŖŅĐĩĐąĐŊиĐē â Đ ŅĐēОвОдŅŅвО ĐŋĐžĐģŅСОваŅĐĩĐģŅ
+* РаŅŅиŅĐĩĐŊĐŊĐžĐĩ ŅŅĐēОвОдŅŅвО ĐŋĐžĐģŅСОваŅĐĩĐģŅ
+* ĐĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ ĐŋĐž SQLModel
+* ĐĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ API
+* ĐвŅĐžĐŧаŅиŅĐĩŅĐēĐ°Ņ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиŅ
+
+* ĐаŅĐēа Đž даĐŊĐŊŅŅ
+* ĐĐģŅйОĐēĐžĐĩ ОйŅŅĐĩĐŊиĐĩ
+* ĐаŅиĐŊĐŊĐžĐĩ ОйŅŅĐĩĐŊиĐĩ
+* ĐĐŊĐĩĐ´ŅĐĩĐŊиĐĩ СавиŅиĐŧĐžŅŅĐĩĐš
+* ĐŅŅĐĩĐŊŅиŅиĐēаŅĐ¸Ņ HTTP Basic
+* HTTP Digest
+* ŅĐžŅĐŧĐ°Ņ ISO
+* ŅŅаĐŊдаŅŅ JSON Schema
+* JSON-ŅŅ
ĐĩĐŧа
+* ĐžĐŋŅĐĩĐ´ĐĩĐģĐĩĐŊиĐĩ ŅŅ
ĐĩĐŧŅ
+* password flow
+* ĐОйиĐģŅĐŊŅĐš
+
+* ŅŅŅаŅĐĩвŅиК
+* ŅĐŋŅĐžĐĩĐēŅиŅОваĐŊĐŊŅĐš
+* ĐŊĐĩĐēĐžŅŅĐĩĐēŅĐŊŅĐš
+* ĐŊа ĐģĐĩŅŅ
+* ŅŅаĐŊдаŅŅ
+* ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ
+* ŅŅвŅŅвиŅĐĩĐģŅĐŊŅĐš Đē ŅĐĩĐŗĐ¸ŅŅŅŅ
+* ĐŊĐĩŅŅвŅŅвиŅĐĩĐģŅĐŊŅĐš Đē ŅĐĩĐŗĐ¸ŅŅŅŅ
+
+* ОйŅĐģŅĐļиваŅŅ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ
+* ĐžŅдаваŅŅ ŅŅŅаĐŊиŅŅ
+
+* ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ
+* ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ
+
+* HTTP-СаĐŋŅĐžŅ
+* HTTP-ĐžŅвĐĩŅ
+* ĐžŅвĐĩŅ Ņ ĐžŅийĐēОК
+
+* ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи
+* Đ´ĐĩĐēĐžŅаŅĐžŅ ĐžĐŋĐĩŅаŅии ĐŋŅŅи
+* ŅŅĐŊĐēŅиŅ-ОйŅайОŅŅиĐē ĐŋŅŅи
+
+* ŅĐĩĐģĐž
+* ŅĐĩĐģĐž СаĐŋŅĐžŅа
+* ŅĐĩĐģĐž ĐžŅвĐĩŅа
+* JSON-ŅĐĩĐģĐž
+* ŅĐĩĐģĐž ŅĐžŅĐŧŅ
+* ŅĐĩĐģĐž ŅаКĐģа
+* ŅĐĩĐģĐž ŅŅĐŊĐēŅии
+
+* ĐŋаŅаĐŧĐĩŅŅ
+* body-ĐŋаŅаĐŧĐĩŅŅ
+* path-ĐŋаŅаĐŧĐĩŅŅ
+* query-ĐŋаŅаĐŧĐĩŅŅ
+* cookie-ĐŋаŅаĐŧĐĩŅŅ
+* ĐŋаŅаĐŧĐĩŅŅ ĐˇĐ°ĐŗĐžĐģОвĐēа
+* ĐŋаŅаĐŧĐĩŅŅ ŅĐžŅĐŧŅ
+* ĐŋаŅаĐŧĐĩŅŅ ŅŅĐŊĐēŅии
+
+* ŅОйŅŅиĐĩ
+* ŅОйŅŅиĐĩ СаĐŋŅŅĐēа
+* СаĐŋŅŅĐē ŅĐĩŅвĐĩŅа
+* ŅОйŅŅиĐĩ ĐžŅŅаĐŊОвĐēи
+* ŅОйŅŅиĐĩ lifespan
+
+* ОйŅайОŅŅиĐē
+* ОйŅайОŅŅиĐē ŅОйŅŅиŅ
+* ОйŅайОŅŅиĐē иŅĐēĐģŅŅĐĩĐŊиК
+* ОйŅайаŅŅваŅŅ
+
+* ĐŧОдĐĩĐģŅ
+* Pydantic-ĐŧОдĐĩĐģŅ
+* ĐŧОдĐĩĐģŅ Đ´Đ°ĐŊĐŊŅŅ
+* ĐŧОдĐĩĐģŅ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊĐŊŅŅ
+* ĐŧОдĐĩĐģŅ ŅĐžŅĐŧŅ
+* ОйŅĐĩĐēŅ ĐŧОдĐĩĐģи
+
+* ĐēĐģаŅŅ
+* йаСОвŅĐš ĐēĐģаŅŅ
+* ŅОдиŅĐĩĐģŅŅĐēиК ĐēĐģаŅŅ
+* ĐŋОдĐēĐģаŅŅ
+* Đ´ĐžŅĐĩŅĐŊиК ĐēĐģаŅŅ
+* ŅОдŅŅвĐĩĐŊĐŊŅĐš ĐēĐģаŅŅ
+* ĐŧĐĩŅОд ĐēĐģаŅŅа
+
+* ĐˇĐ°ĐŗĐžĐģОвОĐē
+* HTTP-ĐˇĐ°ĐŗĐžĐģОвĐēи
+* ĐˇĐ°ĐŗĐžĐģОвОĐē авŅĐžŅиСаŅии
+* ĐˇĐ°ĐŗĐžĐģОвОĐē `Authorization`
+* ĐˇĐ°ĐŗĐžĐģОвОĐē `Forwarded`
+
+* ŅиŅŅĐĩĐŧа вĐŊĐĩĐ´ŅĐĩĐŊĐ¸Ņ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅĐĩĐš
+* СавиŅиĐŧĐžŅŅŅ
+* СавиŅиĐŧŅĐš ОйŅĐĩĐēŅ
+* СавиŅиĐŧŅĐš
+
+* ĐžĐŗŅаĐŊиŅĐĩĐŊĐŊŅĐš ввОдОĐŧ/вŅвОдОĐŧ
+* ĐžĐŗŅаĐŊиŅĐĩĐŊĐŊŅĐš ĐŋŅĐžŅĐĩŅŅĐžŅĐžĐŧ
+* ĐēĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅŅ
+* ĐŋаŅаĐģĐģĐĩĐģиСĐŧ
+* ĐŧĐŊĐžĐŗĐžĐŋŅĐžŅĐĩŅŅĐŊĐžŅŅŅ
+
+* ĐŋĐĩŅĐĩĐŧĐĩĐŊĐŊĐ°Ņ ĐžĐēŅŅĐļĐĩĐŊиŅ
+* ĐŋĐĩŅĐĩĐŧĐĩĐŊĐŊĐ°Ņ ĐžĐēŅŅĐļĐĩĐŊиŅ
+* `PATH`
+* ĐŋĐĩŅĐĩĐŧĐĩĐŊĐŊĐ°Ņ `PATH`
+
+* аŅŅĐĩĐŊŅиŅиĐēаŅиŅ
+* ĐŋŅОваКдĐĩŅ Đ°ŅŅĐĩĐŊŅиŅиĐēаŅии
+* авŅĐžŅиСаŅиŅ
+* ŅĐžŅĐŧа авŅĐžŅиСаŅии
+* ĐŋŅОваКдĐĩŅ Đ°Đ˛ŅĐžŅиСаŅии
+* ĐŋĐžĐģŅСОваŅĐĩĐģŅ Đ°ŅŅĐĩĐŊŅиŅиŅиŅŅĐĩŅŅŅ
+* ŅиŅŅĐĩĐŧа аŅŅĐĩĐŊŅиŅиŅиŅŅĐĩŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅ
+
+* CLI
+* иĐŊŅĐĩŅŅĐĩĐšŅ ĐēĐžĐŧаĐŊĐ´ĐŊОК ŅŅŅĐžĐēи
+
+* ŅĐĩŅвĐĩŅ
+* ĐēĐģиĐĩĐŊŅ
+
+* ОйĐģаŅĐŊŅĐš ĐŋŅОваКдĐĩŅ
+* ОйĐģаŅĐŊŅĐš ŅĐĩŅвиŅ
+
+* ŅаСŅайОŅĐēа
+* ŅŅаĐŋŅ ŅаСŅайОŅĐēи
+
+* dict
+* ŅĐģОваŅŅ
+* ĐŋĐĩŅĐĩŅиŅĐģĐĩĐŊиĐĩ
+* enum
+* ŅĐģĐĩĐŊ ĐŋĐĩŅĐĩŅиŅĐģĐĩĐŊиŅ
+
+* ĐēОдиŅОвŅиĐē
+* Đ´ĐĩĐēОдиŅОвŅиĐē
+* ĐēОдиŅОваŅŅ
+* Đ´ĐĩĐēОдиŅОваŅŅ
+
+* иŅĐēĐģŅŅĐĩĐŊиĐĩ
+* вŅСваŅŅ
+
+* вŅŅаĐļĐĩĐŊиĐĩ
+* ĐžĐŋĐĩŅаŅĐžŅ
+
+* ŅŅĐžĐŊŅĐĩĐŊĐ´
+* ĐąŅĐēĐĩĐŊĐ´
+
+* ОйŅŅĐļĐ´ĐĩĐŊиĐĩ ĐŊа GitHub
+* Issue ĐŊа GitHub (ŅиĐēĐĩŅ/ОйŅаŅĐĩĐŊиĐĩ)
+
+* ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅŅ
+* ĐžĐŋŅиĐŧиСаŅĐ¸Ņ ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅи
+
+* ŅиĐŋ вОСвŅаŅаĐĩĐŧĐžĐŗĐž СĐŊаŅĐĩĐŊиŅ
+* вОСвŅаŅаĐĩĐŧĐžĐĩ СĐŊаŅĐĩĐŊиĐĩ
+
+* ĐąĐĩСОĐŋаŅĐŊĐžŅŅŅ
+* ŅŅ
ĐĩĐŧа ĐąĐĩСОĐŋаŅĐŊĐžŅŅи
+
+* СадаŅа
+* ŅĐžĐŊĐžĐ˛Đ°Ņ ĐˇĐ°Đ´Đ°Ņа
+* ŅŅĐŊĐēŅĐ¸Ņ ĐˇĐ°Đ´Đ°Ņи
+
+* ŅайĐģĐžĐŊ
+* ŅайĐģĐžĐŊиСаŅĐžŅ
+
+* аĐŊĐŊĐžŅаŅĐ¸Ņ ŅиĐŋОв
+* аĐŊĐŊĐžŅаŅĐ¸Ņ ŅиĐŋОв
+
+* вОŅĐēĐĩŅ ŅĐĩŅвĐĩŅа
+* вОŅĐēĐĩŅ Uvicorn
+* вОŅĐēĐĩŅ Gunicorn
+* вОŅĐēĐĩŅ-ĐŋŅĐžŅĐĩŅŅ
+* ĐēĐģаŅŅ Đ˛ĐžŅĐēĐĩŅа
+* ŅайОŅĐ°Ņ ĐŊĐ°ĐŗŅŅСĐēа
+
+* Đ´ĐĩĐŋĐģОК
+* ŅаСвĐĩŅĐŊŅŅŅ
+
+* SDK
+* ĐŊĐ°ĐąĐžŅ ŅŅĐĩĐ´ŅŅв ŅаСŅайОŅĐēи ĐĐ
+
+* `APIRouter`
+* `requirements.txt`
+* ŅĐžĐēĐĩĐŊ Bearer
+* ĐŊĐĩŅОвĐŧĐĩŅŅиĐŧĐžĐĩ иСĐŧĐĩĐŊĐĩĐŊиĐĩ
+* ĐąĐ°Đŗ
+* ĐēĐŊĐžĐŋĐēа
+* вŅСŅваĐĩĐŧŅĐš ОйŅĐĩĐēŅ
+* ĐēОд
+* ĐēĐžĐŧĐŧиŅ
+* ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ ĐēĐžĐŊŅĐĩĐēŅŅа
+* ĐēĐžŅŅŅиĐŊа
+* ŅĐĩŅŅĐ¸Ņ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊĐŊŅŅ
+* диŅĐē
+* Đ´ĐžĐŧĐĩĐŊ
+* двиĐļĐžĐē
+* ŅиĐēŅивĐŊŅĐš X
+* ĐŧĐĩŅОд HTTP GET
+* ŅĐģĐĩĐŧĐĩĐŊŅ
+* йийĐģиОŅĐĩĐēа
+* lifespan
+* ĐąĐģĐžĐēиŅОвĐēа
+* middleware (ĐŅĐžĐŧĐĩĐļŅŅĐžŅĐŊŅĐš ŅĐģОК)
+* ĐŧОйиĐģŅĐŊĐžĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ
+* ĐŧОдŅĐģŅ
+* ĐŧĐžĐŊŅиŅОваĐŊиĐĩ
+* ŅĐĩŅŅ
+* origin (иŅŅĐžŅĐŊиĐē)
+* ĐŋĐĩŅĐĩĐžĐŋŅĐĩĐ´ĐĩĐģĐĩĐŊиĐĩ
+* ĐŋĐžĐģĐĩСĐŊĐ°Ņ ĐŊĐ°ĐŗŅŅСĐēа
+* ĐŋŅĐžŅĐĩŅŅĐžŅ
+* ŅвОКŅŅвО
+* ĐŋŅĐžĐēŅи
+* ĐŋŅĐģĐģ-ŅĐĩĐēвĐĩŅŅ (СаĐŋŅĐžŅ ĐŊа иСĐŧĐĩĐŊĐĩĐŊиĐĩ)
+* СаĐŋŅĐžŅ
+* ĐĐĐŖ
+* ŅдаĐģŅĐŊĐŊĐ°Ņ ĐŧаŅиĐŊа
+* ŅŅаŅŅŅ-ĐēОд
+* ŅŅŅĐžĐēа
+* ŅĐĩĐŗ
+* вĐĩĐąâŅŅĐĩĐšĐŧвОŅĐē
+* ĐŋОдŅŅаĐŊОвОŅĐŊŅĐš СĐŊаĐē
+* вĐĩŅĐŊŅŅŅ
+* ваĐģидиŅОваŅŅ
+
+////
+
+//// tab | ĐĐŊŅĐžŅĐŧаŅиŅ
+
+ĐŅĐž ĐŊĐĩĐŋĐžĐģĐŊŅĐš и ĐŊĐĩĐŊĐžŅĐŧаŅивĐŊŅĐš ŅĐŋиŅĐžĐē (в ĐžŅĐŊОвĐŊĐžĐŧ) ŅĐĩŅ
ĐŊиŅĐĩŅĐēиŅ
ŅĐĩŅĐŧиĐŊОв, вŅŅŅĐĩŅаŅŅиŅ
ŅŅ Đ˛ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии. ĐĐŊ ĐŧĐžĐļĐĩŅ ĐŋĐžĐŧĐžŅŅ Đ°Đ˛ŅĐžŅŅ ĐŋŅĐžĐŧĐŋŅа ĐŋĐžĐŊŅŅŅ, ĐŋĐž ĐēаĐēиĐŧ ŅĐĩŅĐŧиĐŊаĐŧ LLM ĐŊŅĐļĐŊа ĐŋОдŅĐēаСĐēа. ĐаĐŋŅиĐŧĐĩŅ, ĐēĐžĐŗĐ´Đ° ĐžĐŊа ĐŋŅОдОĐģĐļаĐĩŅ Đ˛ĐžĐˇĐ˛ŅаŅаŅŅ Đ´ĐĩĐšŅŅвиŅĐĩĐģŅĐŊĐž Ņ
ĐžŅĐžŅиК ĐŋĐĩŅĐĩвОд Đē ĐŊĐĩĐžĐŋŅиĐŧаĐģŅĐŊĐžĐŧŅ. ĐĐģи ĐēĐžĐŗĐ´Đ° Ņ ĐŊĐĩŅ Đ˛ĐžĐˇĐŊиĐēаŅŅ ĐŋŅОйĐģĐĩĐŧŅ ŅĐž ŅĐēĐģĐžĐŊĐĩĐŊиĐĩĐŧ/ŅĐŋŅŅĐļĐĩĐŊиĐĩĐŧ ŅĐĩŅĐŧиĐŊа ĐŊа ваŅĐĩĐŧ ŅСŅĐēĐĩ.
+
+ĐĄĐŧ., ĐŊаĐŋŅиĐŧĐĩŅ, ŅаСдĐĩĐģ `### List of English terms and their preferred German translations` в `docs/de/llm-prompt.md`.
+
+////
diff --git a/docs/ru/docs/about/index.md b/docs/ru/docs/about/index.md
index 1015b667a..4f48266a7 100644
--- a/docs/ru/docs/about/index.md
+++ b/docs/ru/docs/about/index.md
@@ -1,3 +1,3 @@
-# Đ ĐŋŅĐžĐĩĐēŅĐĩ
+# Đ ĐŋŅĐžĐĩĐēŅĐĩ { #about }
-FastAPI: вĐŊŅŅŅĐĩĐŊĐŊĐĩĐĩ ŅŅŅŅОКŅŅвО, ĐŋОвĐģиŅвŅиĐĩ ŅĐĩŅ
ĐŊĐžĐģĐžĐŗĐ¸Đ¸ и вŅŅ ŅаĐēĐžĐĩ ĐŋŅĐžŅĐĩĐĩ. đ¤
+Đ FastAPI, ĐĩĐŗĐž диСаКĐŊĐĩ, иŅŅĐžŅĐŊиĐēаŅ
вдОŅ
ĐŊОвĐĩĐŊĐ¸Ņ Đ¸ ĐŧĐŊĐžĐŗĐžĐŧ Đ´ŅŅĐŗĐžĐŧ. đ¤
diff --git a/docs/ru/docs/advanced/additional-responses.md b/docs/ru/docs/advanced/additional-responses.md
new file mode 100644
index 000000000..c63c0c08b
--- /dev/null
+++ b/docs/ru/docs/advanced/additional-responses.md
@@ -0,0 +1,247 @@
+# ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ĐžŅвĐĩŅŅ Đ˛ OpenAPI { #additional-responses-in-openapi }
+
+/// warning | ĐŅĐĩĐ´ŅĐŋŅĐĩĐļĐ´ĐĩĐŊиĐĩ
+
+ĐŅĐž дОвОĐģŅĐŊĐž ĐŋŅОдвиĐŊŅŅĐ°Ņ ŅĐĩĐŧа.
+
+ĐŅĐģи Đ˛Ņ ŅĐžĐģŅĐēĐž ĐŊаŅиĐŊаĐĩŅĐĩ ŅайОŅаŅŅ Ņ **FastAPI**, вОСĐŧĐžĐļĐŊĐž, ваĐŧ ŅŅĐž ĐŋĐžĐēа ĐŊĐĩ ĐŊŅĐļĐŊĐž.
+
+///
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ОйŅŅвĐģŅŅŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ĐžŅвĐĩŅŅ Ņ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐŧи ŅŅаŅŅŅ-ĐēОдаĐŧи, ŅиĐŋаĐŧи ŅОдĐĩŅĐļиĐŧĐžĐŗĐž, ĐžĐŋиŅаĐŊиŅĐŧи и Ņ.Đ´.
+
+ĐŅи Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ĐžŅвĐĩŅŅ ĐąŅĐ´ŅŅ Đ˛ĐēĐģŅŅĐĩĐŊŅ Đ˛ ŅŅ
ĐĩĐŧŅ OpenAPI, и ĐŋĐžŅŅĐžĐŧŅ ĐŋĐžŅвŅŅŅŅ Đ˛ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии API.
+
+ĐĐž Đ´ĐģŅ ŅаĐēиŅ
Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅŅ
ĐžŅвĐĩŅОв ŅĐąĐĩдиŅĐĩŅŅ, ŅŅĐž Đ˛Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅĐĩ `Response`, ĐŊаĐŋŅиĐŧĐĩŅ `JSONResponse`, ĐŊаĐŋŅŅĐŧŅŅ, ŅĐž ŅвОиĐŧ ŅŅаŅŅŅ-ĐēОдОĐŧ и ŅОдĐĩŅĐļиĐŧŅĐŧ.
+
+## ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐš ĐžŅвĐĩŅ Ņ `model` { #additional-response-with-model }
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ĐŋĐĩŅĐĩдаŅŅ Đ˛Đ°ŅиĐŧ Đ´ĐĩĐēĐžŅаŅĐžŅаĐŧ ĐžĐŋĐĩŅаŅии ĐŋŅŅи ĐŋаŅаĐŧĐĩŅŅ `responses`.
+
+ĐĐŊ ĐŋŅиĐŊиĐŧаĐĩŅ `dict`: ĐēĐģŅŅи â ŅŅĐž ŅŅаŅŅŅ-ĐēĐžĐ´Ņ Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž ĐžŅвĐĩŅа (ĐŊаĐŋŅиĐŧĐĩŅ, `200`), а СĐŊаŅĐĩĐŊĐ¸Ņ â Đ´ŅŅĐŗĐ¸Đĩ `dict` Ņ Đ¸ĐŊŅĐžŅĐŧаŅиĐĩĐš Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž иС ĐŊиŅ
.
+
+ĐаĐļĐ´ŅĐš иС ŅŅиŅ
`dict` Đ´ĐģŅ ĐžŅвĐĩŅа ĐŧĐžĐļĐĩŅ Đ¸ĐŧĐĩŅŅ ĐēĐģŅŅ `model`, ŅОдĐĩŅĐļаŅиК Pydantic-ĐŧОдĐĩĐģŅ, аĐŊаĐģĐžĐŗĐ¸ŅĐŊĐž `response_model`.
+
+**FastAPI** вОСŅĐŧŅŅ ŅŅŅ ĐŧОдĐĩĐģŅ, ŅĐŗĐĩĐŊĐĩŅиŅŅĐĩŅ Đ´ĐģŅ ĐŊĐĩŅ JSONâŅŅ
ĐĩĐŧŅ Đ¸ вĐēĐģŅŅĐ¸Ņ ĐĩŅ Đ˛ ĐŊŅĐļĐŊĐžĐĩ ĐŧĐĩŅŅĐž в OpenAPI.
+
+ĐаĐŋŅиĐŧĐĩŅ, ŅŅĐžĐąŅ ĐžĐąŅŅвиŅŅ ĐĩŅŅ ĐžĐ´Đ¸ĐŊ ĐžŅвĐĩŅ ŅĐž ŅŅаŅŅŅ-ĐēОдОĐŧ `404` и Pydantic-ĐŧОдĐĩĐģŅŅ `Message`, ĐŧĐžĐļĐŊĐž ĐŊаĐŋиŅаŅŅ:
+
+{* ../../docs_src/additional_responses/tutorial001.py hl[18,22] *}
+
+/// note | ĐŅиĐŧĐĩŅаĐŊиĐĩ
+
+ĐĐŧĐĩĐšŅĐĩ в видŅ, ŅŅĐž ĐŊĐĩОйŅ
ОдиĐŧĐž вОСвŅаŅаŅŅ `JSONResponse` ĐŊаĐŋŅŅĐŧŅŅ.
+
+///
+
+/// info | ĐĐŊŅĐžŅĐŧаŅиŅ
+
+ĐĐģŅŅ `model` ĐŊĐĩ ŅвĐģŅĐĩŅŅŅ ŅаŅŅŅŅ OpenAPI.
+
+**FastAPI** вОСŅĐŧŅŅ Pydantic-ĐŧОдĐĩĐģŅ ĐžŅŅŅда, ŅĐŗĐĩĐŊĐĩŅиŅŅĐĩŅ JSONâŅŅ
ĐĩĐŧŅ Đ¸ ĐŋĐžĐŧĐĩŅŅĐ¸Ņ ĐĩŅ Đ˛ ĐŊŅĐļĐŊĐžĐĩ ĐŧĐĩŅŅĐž.
+
+ĐŅĐļĐŊĐžĐĩ ĐŧĐĩŅŅĐž:
+
+* Đ ĐēĐģŅŅĐĩ `content`, СĐŊаŅĐĩĐŊиĐĩĐŧ ĐēĐžŅĐžŅĐžĐŗĐž ŅвĐģŅĐĩŅŅŅ Đ´ŅŅĐŗĐžĐš JSONâОйŅĐĩĐēŅ (`dict`), ŅОдĐĩŅĐļаŅиК:
+ * ĐĐģŅŅ Ņ ŅиĐŋĐžĐŧ ŅОдĐĩŅĐļиĐŧĐžĐŗĐž, ĐŊаĐŋŅиĐŧĐĩŅ `application/json`, СĐŊаŅĐĩĐŊиĐĩĐŧ ĐēĐžŅĐžŅĐžĐŗĐž ŅвĐģŅĐĩŅŅŅ Đ´ŅŅĐŗĐžĐš JSONâОйŅĐĩĐēŅ, ŅОдĐĩŅĐļаŅиК:
+ * ĐĐģŅŅ `schema`, СĐŊаŅĐĩĐŊиĐĩĐŧ ĐēĐžŅĐžŅĐžĐŗĐž ŅвĐģŅĐĩŅŅŅ JSONâŅŅ
ĐĩĐŧа иС ĐŧОдĐĩĐģи â Đ˛ĐžŅ ĐŊŅĐļĐŊĐžĐĩ ĐŧĐĩŅŅĐž.
+ * **FastAPI** дОйавĐģŅĐĩŅ ĐˇĐ´ĐĩŅŅ ŅŅŅĐģĐēŅ ĐŊа ĐŗĐģОйаĐģŅĐŊŅĐĩ JSONâŅŅ
ĐĩĐŧŅ Đ˛ Đ´ŅŅĐŗĐžĐŧ ĐŧĐĩŅŅĐĩ ваŅĐĩĐŗĐž OpenAPI вĐŧĐĩŅŅĐž ŅĐžĐŗĐž, ŅŅĐžĐąŅ Đ˛ĐēĐģŅŅаŅŅ ŅŅ
ĐĩĐŧŅ ĐŊаĐŋŅŅĐŧŅŅ. ĐĸаĐē Đ´ŅŅĐŗĐ¸Đĩ ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ Đ¸ ĐēĐģиĐĩĐŊŅŅ ŅĐŧĐžĐŗŅŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ ŅŅи JSONâŅŅ
ĐĩĐŧŅ ĐŊаĐŋŅŅĐŧŅŅ, ĐŋŅĐĩĐ´ĐžŅŅавĐģŅŅŅ ĐģŅŅŅиĐĩ иĐŊŅŅŅŅĐŧĐĩĐŊŅŅ ĐŗĐĩĐŊĐĩŅаŅии ĐēОда и Ņ.Đ´.
+
+///
+
+ĐĄĐŗĐĩĐŊĐĩŅиŅОваĐŊĐŊŅĐĩ в OpenAPI ĐžŅвĐĩŅŅ Đ´ĐģŅ ŅŅОК ĐžĐŋĐĩŅаŅии ĐŋŅŅи ĐąŅĐ´ŅŅ ŅаĐēиĐŧи:
+
+```JSON hl_lines="3-12"
+{
+ "responses": {
+ "404": {
+ "description": "Additional Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Message"
+ }
+ }
+ }
+ },
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Item"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+ĐĄŅ
ĐĩĐŧŅ Đ´Đ°ĐŊŅ ĐēаĐē ŅŅŅĐģĐēи ĐŊа Đ´ŅŅĐŗĐžĐĩ ĐŧĐĩŅŅĐž вĐŊŅŅŅи ŅŅ
ĐĩĐŧŅ OpenAPI:
+
+```JSON hl_lines="4-16"
+{
+ "components": {
+ "schemas": {
+ "Message": {
+ "title": "Message",
+ "required": [
+ "message"
+ ],
+ "type": "object",
+ "properties": {
+ "message": {
+ "title": "Message",
+ "type": "string"
+ }
+ }
+ },
+ "Item": {
+ "title": "Item",
+ "required": [
+ "id",
+ "value"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "title": "Id",
+ "type": "string"
+ },
+ "value": {
+ "title": "Value",
+ "type": "string"
+ }
+ }
+ },
+ "ValidationError": {
+ "title": "ValidationError",
+ "required": [
+ "loc",
+ "msg",
+ "type"
+ ],
+ "type": "object",
+ "properties": {
+ "loc": {
+ "title": "Location",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "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"
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+## ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ŅиĐŋŅ ŅОдĐĩŅĐļиĐŧĐžĐŗĐž Đ´ĐģŅ ĐžŅĐŊОвĐŊĐžĐŗĐž ĐžŅвĐĩŅа { #additional-media-types-for-the-main-response }
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ ŅŅĐžŅ ĐļĐĩ ĐŋаŅаĐŧĐĩŅŅ `responses`, ŅŅĐžĐąŅ Đ´ĐžĐąĐ°Đ˛Đ¸ŅŅ ŅаСĐŊŅĐĩ ŅиĐŋŅ ŅОдĐĩŅĐļиĐŧĐžĐŗĐž Đ´ĐģŅ ŅĐžĐŗĐž ĐļĐĩ ĐžŅĐŊОвĐŊĐžĐŗĐž ĐžŅвĐĩŅа.
+
+ĐаĐŋŅиĐŧĐĩŅ, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ дОйавиŅŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐš ŅиĐŋ ŅОдĐĩŅĐļиĐŧĐžĐŗĐž `image/png`, ОйŅŅвив, ŅŅĐž ваŅа ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи ĐŧĐžĐļĐĩŅ Đ˛ĐžĐˇĐ˛ŅаŅаŅŅ JSONâОйŅĐĩĐēŅ (Ņ ŅиĐŋĐžĐŧ ŅОдĐĩŅĐļиĐŧĐžĐŗĐž `application/json`) иĐģи PNGâиСОйŅаĐļĐĩĐŊиĐĩ:
+
+{* ../../docs_src/additional_responses/tutorial002.py hl[19:24,28] *}
+
+/// note | ĐŅиĐŧĐĩŅаĐŊиĐĩ
+
+ĐŖŅŅиŅĐĩ, ŅŅĐž иСОйŅаĐļĐĩĐŊиĐĩ ĐŊŅĐļĐŊĐž вОСвŅаŅаŅŅ ĐŊаĐŋŅŅĐŧŅŅ, иŅĐŋĐžĐģŅСŅŅ `FileResponse`.
+
+///
+
+/// info | ĐĐŊŅĐžŅĐŧаŅиŅ
+
+ĐŅĐģи Đ˛Ņ ŅвĐŊĐž ĐŊĐĩ ŅĐēаĐļĐĩŅĐĩ Đ´ŅŅĐŗĐžĐš ŅиĐŋ ŅОдĐĩŅĐļиĐŧĐžĐŗĐž в ĐŋаŅаĐŧĐĩŅŅĐĩ `responses`, FastAPI ĐąŅĐ´ĐĩŅ ŅŅиŅаŅŅ, ŅŅĐž ĐžŅвĐĩŅ Đ¸ĐŧĐĩĐĩŅ ŅĐžŅ ĐļĐĩ ŅиĐŋ ŅОдĐĩŅĐļиĐŧĐžĐŗĐž, ŅŅĐž и ĐžŅĐŊОвĐŊОК ĐēĐģаŅŅ ĐžŅвĐĩŅа (ĐŋĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ `application/json`).
+
+ĐĐž ĐĩŅĐģи Đ˛Ņ ŅĐēаСаĐģи ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиК ĐēĐģаŅŅ ĐžŅвĐĩŅа Ņ `None` в ĐēаŅĐĩŅŅвĐĩ ĐĩĐŗĐž ŅиĐŋа ŅОдĐĩŅĐļиĐŧĐžĐŗĐž, FastAPI иŅĐŋĐžĐģŅСŅĐĩŅ `application/json` Đ´ĐģŅ ĐģŅĐąĐžĐŗĐž Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊĐžĐŗĐž ĐžŅвĐĩŅа, Ņ ĐēĐžŅĐžŅĐžĐŗĐž ĐĩŅŅŅ ŅвŅСаĐŊĐŊĐ°Ņ ĐŧОдĐĩĐģŅ.
+
+///
+
+## ĐĐžĐŧйиĐŊиŅОваĐŊиĐĩ иĐŊŅĐžŅĐŧаŅии { #combining-information }
+
+ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ ĐēĐžĐŧйиĐŊиŅОваŅŅ Đ¸ĐŊŅĐžŅĐŧаŅĐ¸Ņ ĐžĐą ĐžŅвĐĩŅаŅ
иС ĐŊĐĩŅĐēĐžĐģŅĐēиŅ
ĐŧĐĩŅŅ, вĐēĐģŅŅĐ°Ņ ĐŋаŅаĐŧĐĩŅŅŅ `response_model`, `status_code` и `responses`.
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ОйŅŅвиŅŅ `response_model`, иŅĐŋĐžĐģŅСŅŅ ŅŅаŅŅŅ-ĐēОд ĐŋĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ `200` (иĐģи ŅвОК, ĐĩŅĐģи ĐŊŅĐļĐŊĐž), а СаŅĐĩĐŧ ОйŅŅвиŅŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅŅ Đ¸ĐŊŅĐžŅĐŧаŅĐ¸Ņ Đ´ĐģŅ ŅŅĐžĐŗĐž ĐļĐĩ ĐžŅвĐĩŅа в `responses`, ĐŊаĐŋŅŅĐŧŅŅ Đ˛ ŅŅ
ĐĩĐŧĐĩ OpenAPI.
+
+**FastAPI** ŅĐžŅ
ŅаĐŊĐ¸Ņ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅŅ Đ¸ĐŊŅĐžŅĐŧаŅĐ¸Ņ Đ¸Đˇ `responses` и ОйŅĐĩдиĐŊĐ¸Ņ ĐĩŅ Ņ JSONâŅŅ
ĐĩĐŧОК иС ваŅĐĩĐš ĐŧОдĐĩĐģи.
+
+ĐаĐŋŅиĐŧĐĩŅ, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ОйŅŅвиŅŅ ĐžŅвĐĩŅ ŅĐž ŅŅаŅŅŅ-ĐēОдОĐŧ `404`, ĐēĐžŅĐžŅŅĐš иŅĐŋĐžĐģŅСŅĐĩŅ Pydantic-ĐŧОдĐĩĐģŅ Đ¸ иĐŧĐĩĐĩŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēĐžĐĩ `description`.
+
+Đ ŅаĐēĐļĐĩ ĐžŅвĐĩŅ ŅĐž ŅŅаŅŅŅ-ĐēОдОĐŧ `200`, ĐēĐžŅĐžŅŅĐš иŅĐŋĐžĐģŅСŅĐĩŅ Đ˛Đ°Ņ `response_model`, ĐŊĐž вĐēĐģŅŅаĐĩŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиК `example`:
+
+{* ../../docs_src/additional_responses/tutorial003.py hl[20:31] *}
+
+ĐŅŅ ŅŅĐž ĐąŅĐ´ĐĩŅ ĐžĐąŅĐĩдиĐŊĐĩĐŊĐž и вĐēĐģŅŅĐĩĐŊĐž в Đ˛Đ°Ņ OpenAPI и ĐžŅОйŅаĐļĐĩĐŊĐž в Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии API:
+
+
+
+## ĐĐžĐŧйиĐŊиŅОваĐŊиĐĩ ĐŋŅĐĩĐ´ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐŊŅŅ
и ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиŅ
ĐžŅвĐĩŅОв { #combine-predefined-responses-and-custom-ones }
+
+ĐОСĐŧĐžĐļĐŊĐž, Đ˛Ņ Ņ
ĐžŅиŅĐĩ иĐŧĐĩŅŅ ĐŊĐĩĐēĐžŅĐžŅŅĐĩ ĐŋŅĐĩĐ´ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐŊŅĐĩ ĐžŅвĐĩŅŅ, ĐŋŅиĐŧĐĩĐŊиĐŧŅĐĩ ĐēĐž ĐŧĐŊĐžĐŗĐ¸Đŧ ĐžĐŋĐĩŅаŅиŅĐŧ ĐŋŅŅи, ĐŊĐž ĐŋŅи ŅŅĐžĐŧ ĐēĐžĐŧйиĐŊиŅОваŅŅ Đ¸Ņ
Ņ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиĐŧи ĐžŅвĐĩŅаĐŧи, ĐŊĐĩОйŅ
ОдиĐŧŅĐŧи Đ´ĐģŅ ĐēаĐļдОК ĐēĐžĐŊĐēŅĐĩŅĐŊОК ĐžĐŋĐĩŅаŅии ĐŋŅŅи.
+
+Đ ŅаĐēиŅ
ŅĐģŅŅаŅŅ
Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ ĐŋŅиŅĐŧ Python ÂĢŅаŅĐŋаĐēОвĐēиÂģ `dict` Ņ ĐŋĐžĐŧĐžŅŅŅ `**dict_to_unpack`:
+
+```Python
+old_dict = {
+ "old key": "old value",
+ "second old key": "second old value",
+}
+new_dict = {**old_dict, "new key": "new value"}
+```
+
+ĐĐ´ĐĩŅŅ `new_dict` ĐąŅĐ´ĐĩŅ ŅОдĐĩŅĐļаŅŅ Đ˛ŅĐĩ ĐŋаŅŅ ĐēĐģŅŅ-СĐŊаŅĐĩĐŊиĐĩ иС `old_dict` ĐŋĐģŅŅ ĐŊОвŅŅ ĐŋаŅŅ ĐēĐģŅŅ-СĐŊаŅĐĩĐŊиĐĩ:
+
+```Python
+{
+ "old key": "old value",
+ "second old key": "second old value",
+ "new key": "new value",
+}
+```
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ ŅŅĐžŅ ĐŋŅиŅĐŧ, ŅŅĐžĐąŅ ĐŋĐĩŅĐĩиŅĐŋĐžĐģŅСОваŅŅ ĐŊĐĩĐēĐžŅĐžŅŅĐĩ ĐŋŅĐĩĐ´ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐŊŅĐĩ ĐžŅвĐĩŅŅ Đ˛ ваŅиŅ
ĐžĐŋĐĩŅаŅиŅŅ
ĐŋŅŅи и ĐēĐžĐŧйиĐŊиŅОваŅŅ Đ¸Ņ
Ņ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐŧи ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиĐŧи.
+
+ĐаĐŋŅиĐŧĐĩŅ:
+
+{* ../../docs_src/additional_responses/tutorial004.py hl[13:17,26] *}
+
+## ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊĐ°Ņ Đ¸ĐŊŅĐžŅĐŧаŅĐ¸Ņ ĐžĐą ĐžŅвĐĩŅаŅ
OpenAPI { #more-information-about-openapi-responses }
+
+ЧŅĐžĐąŅ ŅвидĐĩŅŅ, ŅŅĐž иĐŧĐĩĐŊĐŊĐž ĐŧĐžĐļĐŊĐž вĐēĐģŅŅаŅŅ Đ˛ ĐžŅвĐĩŅŅ, ĐŋĐžŅĐŧĐžŅŅиŅĐĩ ŅŅи ŅаСдĐĩĐģŅ ŅĐŋĐĩŅиŅиĐēаŅии OpenAPI:
+
+* ĐĐąŅĐĩĐēŅ Responses OpenAPI, ĐžĐŊ вĐēĐģŅŅаĐĩŅ `Response Object`.
+* ĐĐąŅĐĩĐēŅ Response OpenAPI, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ вĐēĐģŅŅиŅŅ Đ˛ŅŅ Đ¸Đˇ ŅŅĐžĐŗĐž ОйŅĐĩĐēŅа ĐŊаĐŋŅŅĐŧŅŅ Đ˛ ĐēаĐļĐ´ŅĐš ĐžŅвĐĩŅ Đ˛ĐŊŅŅŅи ваŅĐĩĐŗĐž ĐŋаŅаĐŧĐĩŅŅа `responses`. ĐĐēĐģŅŅĐ°Ņ `description`, `headers`, `content` (вĐŊŅŅŅи ĐŊĐĩĐŗĐž Đ˛Ņ ĐžĐąŅŅвĐģŅĐĩŅĐĩ ŅаСĐŊŅĐĩ ŅиĐŋŅ ŅОдĐĩŅĐļиĐŧĐžĐŗĐž и JSONâŅŅ
ĐĩĐŧŅ) и `links`.
diff --git a/docs/ru/docs/advanced/additional-status-codes.md b/docs/ru/docs/advanced/additional-status-codes.md
index aab1f8ee3..7c73cf5d5 100644
--- a/docs/ru/docs/advanced/additional-status-codes.md
+++ b/docs/ru/docs/advanced/additional-status-codes.md
@@ -1,28 +1,28 @@
-# ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ŅŅаŅŅŅ ĐēОдŅ
+# ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ŅŅаŅŅŅ-ĐēĐžĐ´Ņ { #additional-status-codes }
-ĐĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ **FastAPI** вОСвŅаŅаĐĩŅ ĐžŅвĐĩŅŅ, иŅĐŋĐžĐģŅСŅŅ `JSONResponse`, ĐŋĐžĐŧĐĩŅĐ°Ņ ŅОдĐĩŅĐļиĐŧĐžĐĩ, ĐēĐžŅĐžŅĐžĐĩ Đ˛Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅĐĩ иС ваŅĐĩĐš *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*, вĐŊŅŅŅŅ ŅŅĐžĐŗĐž `JSONResponse`.
+ĐĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ **FastAPI** ĐąŅĐ´ĐĩŅ Đ˛ĐžĐˇĐ˛ŅаŅаŅŅ ĐžŅвĐĩŅŅ, иŅĐŋĐžĐģŅСŅŅ `JSONResponse`, ĐŋĐžĐŧĐĩŅĐ°Ņ ŅОдĐĩŅĐļиĐŧĐžĐĩ, ĐēĐžŅĐžŅĐžĐĩ Đ˛Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅĐĩ иС ваŅĐĩĐš *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*, вĐŊŅŅŅŅ ŅŅĐžĐŗĐž `JSONResponse`.
-ĐĐŊ ĐąŅĐ´ĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ ĐēОд ŅŅаŅŅŅа ĐŋĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ Đ¸Đģи ŅĐžŅ, ĐēĐžŅĐžŅŅĐš Đ˛Ņ ŅĐēаĐļĐĩŅĐĩ в ваŅĐĩĐš *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*.
+ĐĐŊ ĐąŅĐ´ĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ ŅŅаŅŅŅ-ĐēОд ĐŋĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ Đ¸Đģи ŅĐžŅ, ĐēĐžŅĐžŅŅĐš Đ˛Ņ ŅĐēаĐļĐĩŅĐĩ в ваŅĐĩĐš *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*.
-## ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ŅŅаŅŅŅ ĐēОдŅ
+## ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ŅŅаŅŅŅ-ĐēĐžĐ´Ņ { #additional-status-codes_1 }
-ĐŅĐģи Đ˛Ņ Ņ
ĐžŅиŅĐĩ вОСвŅаŅаŅŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐš ŅŅаŅŅŅ ĐēОд ĐŋĐžĐŧиĐŧĐž ĐžŅĐŊОвĐŊĐžĐŗĐž, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅĐ´ĐĩĐģаŅŅ ŅŅĐž, вОСвŅаŅĐ°Ņ ĐžĐąŅĐĩĐēŅ `Response` ĐŊаĐŋŅŅĐŧŅŅ, ĐēаĐē `JSONResponse`, и ŅŅŅаĐŊавĐģĐ¸Đ˛Đ°Ņ ĐŊŅĐļĐŊŅĐš ŅŅаŅŅŅ ĐēОд ĐŊаĐŋŅŅĐŧŅŅ.
+ĐŅĐģи Đ˛Ņ Ņ
ĐžŅиŅĐĩ вОСвŅаŅаŅŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ŅŅаŅŅŅ-ĐēĐžĐ´Ņ ĐŋĐžĐŧиĐŧĐž ĐžŅĐŊОвĐŊĐžĐŗĐž, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅĐ´ĐĩĐģаŅŅ ŅŅĐž, вОСвŅаŅĐ°Ņ `Response` ĐŊаĐŋŅŅĐŧŅŅ, ĐŊаĐŋŅиĐŧĐĩŅ `JSONResponse`, и ŅŅŅаĐŊавĐģĐ¸Đ˛Đ°Ņ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐš ŅŅаŅŅŅ-ĐēОд ĐŊаĐŋŅŅĐŧŅŅ.
-ĐаĐŋŅиĐŧĐĩŅ, ŅĐēаĐļĐĩĐŧ, Đ˛Ņ Ņ
ĐžŅиŅĐĩ ŅОСдаŅŅ *ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи*, ĐēĐžŅĐžŅĐ°Ņ ĐŋОСвОĐģŅĐĩŅ ĐžĐąĐŊОвĐģŅŅŅ ŅĐģĐĩĐŧĐĩĐŊŅŅ Đ¸ вОСвŅаŅаĐĩŅ HTTP-ĐēОд 200 "OK" ĐŋŅи ŅŅĐŋĐĩŅĐŊĐžĐŧ вŅĐŋĐžĐģĐŊĐĩĐŊии.
+ĐаĐŋŅиĐŧĐĩŅ, ĐŋŅĐĩĐ´ĐŋĐžĐģĐžĐļиĐŧ, ŅŅĐž Đ˛Ņ Ņ
ĐžŅиŅĐĩ иĐŧĐĩŅŅ *ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи*, ĐēĐžŅĐžŅĐ°Ņ ĐŋОСвОĐģŅĐĩŅ ĐžĐąĐŊОвĐģŅŅŅ ŅĐģĐĩĐŧĐĩĐŊŅŅ Đ¸ вОСвŅаŅаĐĩŅ HTTP ŅŅаŅŅŅ-ĐēОд 200 ÂĢOKÂģ ĐŋŅи ŅŅĐŋĐĩŅĐŊĐžĐŧ вŅĐŋĐžĐģĐŊĐĩĐŊии.
-ĐĐž Đ˛Ņ ŅаĐēĐļĐĩ Ņ
ĐžŅиŅĐĩ, ŅŅĐžĐąŅ ĐžĐŊа ĐŋŅиĐŊиĐŧаĐģа ĐŊОвŅĐĩ ŅĐģĐĩĐŧĐĩĐŊŅŅ. Đ ĐĩŅĐģи ŅĐģĐĩĐŧĐĩĐŊŅ ŅаĐŊĐĩĐĩ ĐŊĐĩ ŅŅŅĐĩŅŅвОваĐģ, ĐžĐŊ ŅОСдаŅŅŅŅ, и вОСвŅаŅаĐģŅŅ HTTP-ĐēОд 201 "Created".
+ĐĐž Đ˛Ņ ŅаĐēĐļĐĩ Ņ
ĐžŅиŅĐĩ, ŅŅĐžĐąŅ ĐžĐŊа ĐŋŅиĐŊиĐŧаĐģа ĐŊОвŅĐĩ ŅĐģĐĩĐŧĐĩĐŊŅŅ. Đ ĐĩŅĐģи ŅĐģĐĩĐŧĐĩĐŊŅŅ ŅаĐŊĐĩĐĩ ĐŊĐĩ ŅŅŅĐĩŅŅвОваĐģи, ĐžĐŊа ŅОСдаŅŅ Đ¸Ņ
и вОСвŅаŅаĐĩŅ HTTP ŅŅаŅŅŅ-ĐēОд 201 ÂĢCreatedÂģ.
-ЧŅĐžĐąŅ ŅĐĩаĐģиСОваŅŅ ŅŅĐž, иĐŧĐŋĐžŅŅиŅŅĐšŅĐĩ `JSONResponse` и вОСвŅаŅаКŅĐĩ Đ˛Đ°Ņ ĐēĐžĐŊŅĐĩĐŊŅ ĐŊаĐŋŅŅĐŧŅŅ, ŅŅŅаĐŊавĐģĐ¸Đ˛Đ°Ņ ĐŊŅĐļĐŊŅĐš `status_code`:
+ЧŅĐžĐąŅ Đ´ĐžĐąĐ¸ŅŅŅŅ ŅŅĐžĐŗĐž, иĐŧĐŋĐžŅŅиŅŅĐšŅĐĩ `JSONResponse` и вĐĩŅĐŊиŅĐĩ ŅŅда ŅвОК ĐēĐžĐŊŅĐĩĐŊŅ ĐŊаĐŋŅŅĐŧŅŅ, ŅŅŅаĐŊОвив ĐŊŅĐļĐŊŅĐš ваĐŧ `status_code`:
{* ../../docs_src/additional_status_codes/tutorial001_an_py310.py hl[4,25] *}
/// warning | ĐĐŊиĐŧаĐŊиĐĩ
-ĐĐžĐŗĐ´Đ° Đ˛Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅĐĩ ОйŅĐĩĐēŅ `Response` ĐŊаĐŋŅŅĐŧŅŅ, ĐēаĐē в ĐŋŅиĐŧĐĩŅĐĩ вŅŅĐĩ, ĐžĐŊ ĐąŅĐ´ĐĩŅ Đ˛ĐžĐˇĐ˛ŅаŅŅĐŊ ĐēаĐē ĐĩŅŅŅ.
+ĐĐžĐŗĐ´Đ° Đ˛Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅĐĩ `Response` ĐŊаĐŋŅŅĐŧŅŅ, ĐēаĐē в ĐŋŅиĐŧĐĩŅĐĩ вŅŅĐĩ, ĐžĐŊ ĐąŅĐ´ĐĩŅ Đ˛ĐžĐˇĐ˛ŅаŅŅĐŊ ĐēаĐē ĐĩŅŅŅ.
-ĐĐŊ ĐŊĐĩ ĐąŅĐ´ĐĩŅ ŅĐĩŅиаĐģиСОваĐŊ ĐŋŅи ĐŋĐžĐŧĐžŅи ĐŧОдĐĩĐģи и Ņ.Đ´.
+ĐĐŊ ĐŊĐĩ ĐąŅĐ´ĐĩŅ ŅĐĩŅиаĐģиСОваĐŊ Ņ ĐŋĐžĐŧĐžŅŅŅ ĐŧОдĐĩĐģи и Ņ.Đŋ.
-ĐŖĐąĐĩдиŅĐĩŅŅ, ŅŅĐž в ĐŊŅĐŧ ŅОдĐĩŅĐļаŅŅŅ Đ¸ĐŧĐĩĐŊĐŊĐž ŅĐĩ даĐŊĐŊŅĐĩ, ĐēĐžŅĐžŅŅĐĩ Đ˛Ņ Ņ
ĐžŅиŅĐĩ, и ŅŅĐž СĐŊаŅĐĩĐŊĐ¸Ņ ŅвĐģŅŅŅŅŅ Đ˛Đ°ĐģидĐŊŅĐŧ JSON (ĐĩŅĐģи Đ˛Ņ Đ¸ŅĐŋĐžĐģŅСŅĐĩŅĐĩ `JSONResponse`).
+ĐŖĐąĐĩдиŅĐĩŅŅ, ŅŅĐž в ĐŊŅĐŧ иĐŧĐĩĐŊĐŊĐž ŅĐĩ даĐŊĐŊŅĐĩ, ĐēĐžŅĐžŅŅĐĩ Đ˛Ņ Ņ
ĐžŅиŅĐĩ, и ŅŅĐž СĐŊаŅĐĩĐŊĐ¸Ņ ŅвĐģŅŅŅŅŅ Đ˛Đ°ĐģидĐŊŅĐŧ JSON (ĐĩŅĐģи Đ˛Ņ Đ¸ŅĐŋĐžĐģŅСŅĐĩŅĐĩ `JSONResponse`).
///
@@ -30,12 +30,12 @@
ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ `from starlette.responses import JSONResponse`.
-**FastAPI** ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ ŅĐžŅ ĐļĐĩ `starlette.responses` ŅĐĩŅĐĩС `fastapi.responses` ĐŋŅĐžŅŅĐž Đ´ĐģŅ Đ˛Đ°ŅĐĩĐŗĐž ŅдОйŅŅва, ĐēаĐē ŅаСŅайОŅŅиĐēа. ĐĐž йОĐģŅŅиĐŊŅŅвО Đ´ĐžŅŅŅĐŋĐŊŅŅ
Response-ĐēĐģаŅŅОв ĐŋĐžŅŅŅĐŋаŅŅ ĐŊаĐŋŅŅĐŧŅŅ Đ¸Đˇ Starlette. ĐĸĐž ĐļĐĩ ŅаĐŧĐžĐĩ ĐēаŅаĐĩŅŅŅ Đ¸ `status`.
+**FastAPI** ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ ŅĐžŅ ĐļĐĩ `starlette.responses` ŅĐĩŅĐĩС `fastapi.responses` ĐŋŅĐžŅŅĐž Đ´ĐģŅ Đ˛Đ°ŅĐĩĐŗĐž ŅдОйŅŅва ĐēаĐē ŅаСŅайОŅŅиĐēа. ĐĐž йОĐģŅŅиĐŊŅŅвО Đ´ĐžŅŅŅĐŋĐŊŅŅ
Response-ĐēĐģаŅŅОв ĐŋŅиŅ
ОдŅŅ ĐŊаĐŋŅŅĐŧŅŅ Đ¸Đˇ Starlette. ĐĸĐž ĐļĐĩ ŅаĐŧĐžĐĩ ŅĐž `status`.
///
-## OpenAPI и Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ API
+## OpenAPI и Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ API { #openapi-and-api-docs }
-ĐŅĐģи Đ˛Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅĐĩ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ĐēĐžĐ´Ņ ŅŅаŅŅŅОв и ĐžŅвĐĩŅŅ ĐŊаĐŋŅŅĐŧŅŅ, ĐžĐŊи ĐŊĐĩ ĐąŅĐ´ŅŅ Đ˛ĐēĐģŅŅĐĩĐŊŅ Đ˛ ŅŅ
ĐĩĐŧŅ OpenAPI (Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ API), ĐŋĐžŅĐžĐŧŅ ŅŅĐž FastAPI ĐŊĐĩ ĐŧĐžĐļĐĩŅ ĐˇĐ°ŅаĐŊĐĩĐĩ СĐŊаŅŅ, ŅŅĐž Đ˛Ņ ŅОйиŅаĐĩŅĐĩŅŅ Đ˛ĐĩŅĐŊŅŅŅ.
+ĐŅĐģи Đ˛Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅĐĩ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ŅŅаŅŅŅ-ĐēĐžĐ´Ņ Đ¸ ĐžŅвĐĩŅŅ ĐŊаĐŋŅŅĐŧŅŅ, ĐžĐŊи ĐŊĐĩ ĐąŅĐ´ŅŅ Đ˛ĐēĐģŅŅĐĩĐŊŅ Đ˛ ŅŅ
ĐĩĐŧŅ OpenAPI (Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ API), ĐŋĐžŅĐžĐŧŅ ŅŅĐž Ņ FastAPI ĐŊĐĩŅ ŅĐŋĐžŅОйа СаŅаĐŊĐĩĐĩ СĐŊаŅŅ, ŅŅĐž Đ˛Ņ ŅОйиŅаĐĩŅĐĩŅŅ Đ˛ĐĩŅĐŊŅŅŅ.
-ĐĐž Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ СадОĐēŅĐŧĐĩĐŊŅиŅОваŅŅ ŅŅĐž в ваŅĐĩĐŧ ĐēОдĐĩ, иŅĐŋĐžĐģŅСŅŅ: [ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ĐžŅвĐĩŅŅ Đ˛ OpenAPI](additional-responses.md){.internal-link target=_blank}.
+ĐĐž Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ СадОĐēŅĐŧĐĩĐŊŅиŅОваŅŅ ŅŅĐž в ŅвОŅĐŧ ĐēОдĐĩ, иŅĐŋĐžĐģŅСŅŅ: [ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ĐžŅвĐĩŅŅ](additional-responses.md){.internal-link target=_blank}.
diff --git a/docs/ru/docs/advanced/advanced-dependencies.md b/docs/ru/docs/advanced/advanced-dependencies.md
new file mode 100644
index 000000000..75a6f0d1f
--- /dev/null
+++ b/docs/ru/docs/advanced/advanced-dependencies.md
@@ -0,0 +1,153 @@
+# ĐŅОдвиĐŊŅŅŅĐĩ СавиŅиĐŧĐžŅŅи { #advanced-dependencies }
+
+## ĐаŅаĐŧĐĩŅŅиСОваĐŊĐŊŅĐĩ СавиŅиĐŧĐžŅŅи { #parameterized-dependencies }
+
+ĐŅĐĩ СавиŅиĐŧĐžŅŅи, ĐēĐžŅĐžŅŅĐĩ ĐŧŅ Đ˛Đ¸Đ´ĐĩĐģи, â ŅŅĐž ĐēĐžĐŊĐēŅĐĩŅĐŊĐ°Ņ ŅŅĐŊĐēŅĐ¸Ņ Đ¸Đģи ĐēĐģаŅŅ.
+
+ĐĐž ĐąŅваŅŅ ŅĐģŅŅаи, ĐēĐžĐŗĐ´Đ° ĐŊŅĐļĐŊĐž СадаваŅŅ ĐŋаŅаĐŧĐĩŅŅŅ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅи, ĐŊĐĩ ОйŅŅвĐģŅŅ ĐŧĐŊĐžĐŗĐž ŅаСĐŊŅŅ
ŅŅĐŊĐēŅиК иĐģи ĐēĐģаŅŅОв.
+
+ĐŅĐĩĐ´ŅŅавиĐŧ, ŅŅĐž ĐŊаĐŧ ĐŊŅĐļĐŊа СавиŅиĐŧĐžŅŅŅ, ĐēĐžŅĐžŅĐ°Ņ ĐŋŅОвĐĩŅŅĐĩŅ, ŅОдĐĩŅĐļĐ¸Ņ Đģи query-ĐŋаŅаĐŧĐĩŅŅ `q` ĐŊĐĩĐēĐžŅĐžŅĐžĐĩ ŅиĐēŅиŅОваĐŊĐŊĐžĐĩ ŅОдĐĩŅĐļиĐŧĐžĐĩ.
+
+ĐĐž ĐŋŅи ŅŅĐžĐŧ ĐŧŅ Ņ
ĐžŅиĐŧ иĐŧĐĩŅŅ Đ˛ĐžĐˇĐŧĐžĐļĐŊĐžŅŅŅ ĐŋаŅаĐŧĐĩŅŅиСОваŅŅ ŅŅĐž ŅиĐēŅиŅОваĐŊĐŊĐžĐĩ ŅОдĐĩŅĐļиĐŧĐžĐĩ.
+
+## ÂĢĐŅСŅваĐĩĐŧŅĐšÂģ ŅĐēСĐĩĐŧĐŋĐģŅŅ { #a-callable-instance }
+
+Đ Python ĐĩŅŅŅ ŅĐŋĐžŅОй ŅĐ´ĐĩĐģаŅŅ ŅĐēСĐĩĐŧĐŋĐģŅŅ ĐēĐģаŅŅа ÂĢвŅСŅваĐĩĐŧŅĐŧÂģ ОйŅĐĩĐēŅĐžĐŧ.
+
+ĐĐĩ ŅаĐŧ ĐēĐģаŅŅ (ĐžĐŊ ŅĐļĐĩ ŅвĐģŅĐĩŅŅŅ Đ˛ŅСŅваĐĩĐŧŅĐŧ), а ŅĐēСĐĩĐŧĐŋĐģŅŅ ŅŅĐžĐŗĐž ĐēĐģаŅŅа.
+
+ĐĐģŅ ŅŅĐžĐŗĐž ОйŅŅвĐģŅĐĩĐŧ ĐŧĐĩŅОд `__call__`:
+
+{* ../../docs_src/dependencies/tutorial011_an_py39.py hl[12] *}
+
+Đ ŅŅĐžĐŧ ŅĐģŅŅаĐĩ иĐŧĐĩĐŊĐŊĐž `__call__` **FastAPI** иŅĐŋĐžĐģŅСŅĐĩŅ Đ´ĐģŅ ĐŋŅОвĐĩŅĐēи Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅŅ
ĐŋаŅаĐŧĐĩŅŅОв и ĐŋОдСавиŅиĐŧĐžŅŅĐĩĐš, и иĐŧĐĩĐŊĐŊĐž ĐžĐŊ ĐąŅĐ´ĐĩŅ Đ˛ŅСваĐŊ, ŅŅĐžĐąŅ ĐŋОСĐļĐĩ ĐŋĐĩŅĐĩдаŅŅ ĐˇĐŊаŅĐĩĐŊиĐĩ ĐŋаŅаĐŧĐĩŅŅŅ Đ˛ ваŅĐĩĐš *ŅŅĐŊĐēŅии-ОйŅайОŅŅиĐēĐĩ ĐŋŅŅи*.
+
+## ĐаŅаĐŧĐĩŅŅиСŅĐĩĐŧ ŅĐēСĐĩĐŧĐŋĐģŅŅ { #parameterize-the-instance }
+
+ĐĸĐĩĐŋĐĩŅŅ ĐŧŅ ĐŧĐžĐļĐĩĐŧ иŅĐŋĐžĐģŅСОваŅŅ `__init__`, ŅŅĐžĐąŅ ĐžĐąŅŅвиŅŅ ĐŋаŅаĐŧĐĩŅŅŅ ŅĐēСĐĩĐŧĐŋĐģŅŅа, Ņ ĐŋĐžĐŧĐžŅŅŅ ĐēĐžŅĐžŅŅŅ
ĐąŅĐ´ĐĩĐŧ ÂĢĐŋаŅаĐŧĐĩŅŅиСОваŅŅÂģ СавиŅиĐŧĐžŅŅŅ:
+
+{* ../../docs_src/dependencies/tutorial011_an_py39.py hl[9] *}
+
+Đ ŅŅĐžĐŧ ŅĐģŅŅаĐĩ **FastAPI** вОвŅĐĩ ĐŊĐĩ ŅŅĐžĐŗĐ°ĐĩŅ `__init__` и ĐŊĐĩ СавиŅĐ¸Ņ ĐžŅ ĐŊĐĩĐŗĐž â ĐŧŅ Đ¸ŅĐŋĐžĐģŅСŅĐĩĐŧ ĐĩĐŗĐž ĐŊаĐŋŅŅĐŧŅŅ Đ˛ ĐŊаŅĐĩĐŧ ĐēОдĐĩ.
+
+## ХОСдаŅĐŧ ŅĐēСĐĩĐŧĐŋĐģŅŅ { #create-an-instance }
+
+ĐŅ ĐŧĐžĐļĐĩĐŧ ŅОСдаŅŅ ŅĐēСĐĩĐŧĐŋĐģŅŅ ŅŅĐžĐŗĐž ĐēĐģаŅŅа ŅаĐē:
+
+{* ../../docs_src/dependencies/tutorial011_an_py39.py hl[18] *}
+
+ĐĸаĐē ĐŧŅ ÂĢĐŋаŅаĐŧĐĩŅŅиСŅĐĩĐŧÂģ ĐŊаŅŅ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅŅ: ŅĐĩĐŋĐĩŅŅ Đ˛ĐŊŅŅŅи ĐŊĐĩŅ Ņ
ŅаĐŊиŅŅŅ "bar" в аŅŅийŅŅĐĩ `checker.fixed_content`.
+
+## ĐŅĐŋĐžĐģŅСŅĐĩĐŧ ŅĐēСĐĩĐŧĐŋĐģŅŅ ĐēаĐē СавиŅиĐŧĐžŅŅŅ { #use-the-instance-as-a-dependency }
+
+ĐаŅĐĩĐŧ ĐŧŅ ĐŧĐžĐļĐĩĐŧ иŅĐŋĐžĐģŅСОваŅŅ ŅŅĐžŅ `checker` в `Depends(checker)` вĐŧĐĩŅŅĐž `Depends(FixedContentQueryChecker)`, ĐŋĐžŅĐžĐŧŅ ŅŅĐž СавиŅиĐŧĐžŅŅŅŅ ŅвĐģŅĐĩŅŅŅ ŅĐēСĐĩĐŧĐŋĐģŅŅ `checker`, а ĐŊĐĩ ŅаĐŧ ĐēĐģаŅŅ.
+
+Đ ĐŋŅи ŅаСŅĐĩŅĐĩĐŊии СавиŅиĐŧĐžŅŅи **FastAPI** вŅСОвĐĩŅ `checker` ĐŋŅиĐŧĐĩŅĐŊĐž ŅаĐē:
+
+```Python
+checker(q="somequery")
+```
+
+âĻи ĐŋĐĩŅĐĩдаŅŅ Đ˛ĐžĐˇĐ˛ŅаŅŅĐŊĐŊĐžĐĩ СĐŊаŅĐĩĐŊиĐĩ ĐēаĐē СĐŊаŅĐĩĐŊиĐĩ СавиŅиĐŧĐžŅŅи в ĐŊаŅŅ *ŅŅĐŊĐēŅиŅ-ОйŅайОŅŅиĐēĐĩ ĐŋŅŅи* в ĐŋаŅаĐŧĐĩŅŅ `fixed_content_included`:
+
+{* ../../docs_src/dependencies/tutorial011_an_py39.py hl[22] *}
+
+/// tip | ХОвĐĩŅ
+
+ĐŅĐĩ ŅŅĐž ĐŧĐžĐļĐĩŅ ĐŋĐžĐēаСаŅŅŅŅ ĐŋŅиŅŅĐŊŅŅŅĐŧ Са ŅŅи. Đ ĐŋĐžĐēа ĐŧĐžĐļĐĩŅ ĐąŅŅŅ ĐŊĐĩ ŅОвŅĐĩĐŧ ĐŋĐžĐŊŅŅĐŊĐž, ŅĐĩĐŧ ŅŅĐž ĐŋĐžĐģĐĩСĐŊĐž.
+
+ĐŅи ĐŋŅиĐŧĐĩŅŅ ĐŊаĐŧĐĩŅĐĩĐŊĐŊĐž ĐŋŅĐžŅŅŅĐĩ, ĐŊĐž ĐžĐŊи ĐŋĐžĐēаСŅваŅŅ, ĐēаĐē вŅŅ ŅŅŅŅĐžĐĩĐŊĐž.
+
+Đ ĐŗĐģаваŅ
ĐŋŅĐž ĐąĐĩСОĐŋаŅĐŊĐžŅŅŅ ĐĩŅŅŅ Đ˛ŅĐŋĐžĐŧĐžĐŗĐ°ŅĐĩĐģŅĐŊŅĐĩ ŅŅĐŊĐēŅии, ŅĐĩаĐģиСОваĐŊĐŊŅĐĩ ŅĐĩĐŧ ĐļĐĩ ŅĐŋĐžŅОйОĐŧ.
+
+ĐŅĐģи Đ˛Ņ ĐŋĐžĐŊŅĐģи вŅŅ Đ˛ŅŅĐĩ, Đ˛Ņ ŅĐļĐĩ СĐŊаĐĩŅĐĩ, ĐēаĐē ÂĢĐŋОд ĐēаĐŋĐžŅĐžĐŧÂģ ŅайОŅаŅŅ ŅŅи ŅŅиĐģиŅŅ Đ´ĐģŅ ĐąĐĩСОĐŋаŅĐŊĐžŅŅи.
+
+///
+
+## ĐавиŅиĐŧĐžŅŅи Ņ `yield`, `HTTPException`, `except` и ŅĐžĐŊОвŅĐŧи СадаŅаĐŧи { #dependencies-with-yield-httpexception-except-and-background-tasks }
+
+/// warning | ĐŅĐĩĐ´ŅĐŋŅĐĩĐļĐ´ĐĩĐŊиĐĩ
+
+ĐĄĐēĐžŅĐĩĐĩ вŅĐĩĐŗĐž, ваĐŧ ĐŊĐĩ ĐŋĐžĐŊадОйŅŅŅŅ ŅŅи ŅĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ Đ´ĐĩŅаĐģи.
+
+ĐĐŊи ĐŋĐžĐģĐĩСĐŊŅ ĐŗĐģавĐŊŅĐŧ ОйŅаСОĐŧ, ĐĩŅĐģи Ņ Đ˛Đ°Ņ ĐąŅĐģĐž ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ FastAPI вĐĩŅŅии ĐŊиĐļĐĩ 0.118.0 и Đ˛Ņ ŅŅĐžĐģĐēĐŊŅĐģиŅŅ Ņ ĐŋŅОйĐģĐĩĐŧаĐŧи СавиŅиĐŧĐžŅŅĐĩĐš Ņ `yield`.
+
+///
+
+ĐавиŅиĐŧĐžŅŅи Ņ `yield` ŅĐž вŅĐĩĐŧĐĩĐŊĐĩĐŧ иСĐŧĐĩĐŊŅĐģиŅŅ, ŅŅĐžĐąŅ ŅŅиŅŅваŅŅ ŅаСĐŊŅĐĩ ŅĐģŅŅаи ĐŋŅиĐŧĐĩĐŊĐĩĐŊĐ¸Ņ Đ¸ иŅĐŋŅавĐģŅŅŅ ĐŋŅОйĐģĐĩĐŧŅ. ĐиĐļĐĩ â ĐēŅаŅĐēĐžĐĩ ŅĐĩСŅĐŧĐĩ иСĐŧĐĩĐŊĐĩĐŊиК.
+
+### ĐавиŅиĐŧĐžŅŅи Ņ `yield` и `StreamingResponse`, ŅĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ Đ´ĐĩŅаĐģи { #dependencies-with-yield-and-streamingresponse-technical-details }
+
+ĐĐž FastAPI 0.118.0, ĐĩŅĐģи Đ˛Ņ Đ¸ŅĐŋĐžĐģŅСОваĐģи СавиŅиĐŧĐžŅŅŅ Ņ `yield`, ĐēОд ĐŋĐžŅĐģĐĩ `yield` вŅĐŋĐžĐģĐŊŅĐģŅŅ ĐŋĐžŅĐģĐĩ вОСвŅаŅа иС *ŅŅĐŊĐēŅии-ОйŅайОŅŅиĐēа ĐŋŅŅи*, ĐŊĐž ĐŋŅŅĐŧĐž ĐŋĐĩŅĐĩĐ´ ĐžŅĐŋŅавĐēОК ĐžŅвĐĩŅа.
+
+ĐĐ´ĐĩŅ ŅĐžŅŅĐžŅĐģа в ŅĐžĐŧ, ŅŅĐžĐąŅ ĐŊĐĩ ŅĐ´ĐĩŅĐļиваŅŅ ŅĐĩŅŅŅŅŅ Đ´ĐžĐģŅŅĐĩ ĐŊĐĩОйŅ
ОдиĐŧĐžĐŗĐž, ĐŋĐžĐēа ĐžŅвĐĩŅ ÂĢĐŋŅŅĐĩŅĐĩŅŅвŅĐĩŅÂģ ĐŋĐž ŅĐĩŅи.
+
+ĐŅĐž иСĐŧĐĩĐŊĐĩĐŊиĐĩ ŅаĐēĐļĐĩ ОСĐŊаŅаĐģĐž, ŅŅĐž ĐĩŅĐģи Đ˛Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐģи `StreamingResponse`, ĐēОд ĐŋĐžŅĐģĐĩ `yield` в СавиŅиĐŧĐžŅŅи ŅĐļĐĩ ŅŅĐŋĐĩваĐģ вŅĐŋĐžĐģĐŊиŅŅŅŅ.
+
+ĐаĐŋŅиĐŧĐĩŅ, ĐĩŅĐģи Ņ Đ˛Đ°Ņ ĐąŅĐģа ŅĐĩŅŅĐ¸Ņ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊĐŊŅŅ
в СавиŅиĐŧĐžŅŅи Ņ `yield`, `StreamingResponse` ĐŊĐĩ ŅĐŧĐžĐŗ ĐąŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ ŅŅŅ ŅĐĩŅŅĐ¸Ņ Đ˛Đž вŅĐĩĐŧŅ ŅŅŅиĐŧиĐŊĐŗĐ° даĐŊĐŊŅŅ
, ĐŋĐžŅĐžĐŧŅ ŅŅĐž ŅĐĩŅŅĐ¸Ņ ŅĐļĐĩ ĐąŅĐģа СаĐēŅŅŅа в ĐēОдĐĩ ĐŋĐžŅĐģĐĩ `yield`.
+
+РвĐĩŅŅии 0.118.0 ŅŅĐž ĐŋОвĐĩĐ´ĐĩĐŊиĐĩ ĐąŅĐģĐž вОСвŅаŅĐĩĐŊĐž Đē ŅĐžĐŧŅ, ŅŅĐž ĐēОд ĐŋĐžŅĐģĐĩ `yield` вŅĐŋĐžĐģĐŊŅĐĩŅŅŅ ĐŋĐžŅĐģĐĩ ĐžŅĐŋŅавĐēи ĐžŅвĐĩŅа.
+
+/// info | ĐĐŊŅĐžŅĐŧаŅиŅ
+
+ĐаĐē Đ˛Ņ ŅвидиŅĐĩ ĐŊиĐļĐĩ, ŅŅĐž ĐžŅĐĩĐŊŅ ĐŋĐžŅ
ĐžĐļĐĩ ĐŊа ĐŋОвĐĩĐ´ĐĩĐŊиĐĩ Đ´Đž вĐĩŅŅии 0.106.0, ĐŊĐž Ņ ĐŊĐĩŅĐēĐžĐģŅĐēиĐŧи ŅĐģŅŅŅĐĩĐŊиŅĐŧи и иŅĐŋŅавĐģĐĩĐŊиŅĐŧи ĐēŅаĐĩвŅŅ
ŅĐģŅŅаĐĩв.
+
+///
+
+#### ĐĄŅĐĩĐŊаŅии Ņ ŅаĐŊĐŊиĐŧ вŅĐŋĐžĐģĐŊĐĩĐŊиĐĩĐŧ ĐēОда ĐŋĐžŅĐģĐĩ `yield` { #use-cases-with-early-exit-code }
+
+ĐŅŅŅ ĐŊĐĩĐēĐžŅĐžŅŅĐĩ ŅŅĐĩĐŊаŅии ŅĐž ŅĐŋĐĩŅиŅиŅĐĩŅĐēиĐŧи ŅŅĐģОвиŅĐŧи, ĐēĐžŅĐžŅŅĐŧ ĐŧĐžĐŗĐģĐž ĐąŅ ĐŋĐžĐŧĐžŅŅ ŅŅаŅĐžĐĩ ĐŋОвĐĩĐ´ĐĩĐŊиĐĩ â вŅĐŋĐžĐģĐŊĐĩĐŊиĐĩ ĐēОда ĐŋĐžŅĐģĐĩ `yield` ĐŋĐĩŅĐĩĐ´ ĐžŅĐŋŅавĐēОК ĐžŅвĐĩŅа.
+
+ĐаĐŋŅиĐŧĐĩŅ, ĐŋŅĐĩĐ´ŅŅавŅŅĐĩ, ŅŅĐž Đ˛Ņ Đ¸ŅĐŋĐžĐģŅСŅĐĩŅĐĩ ŅĐĩŅŅĐ¸Ņ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊĐŊŅŅ
в СавиŅиĐŧĐžŅŅи Ņ `yield` ŅĐžĐģŅĐēĐž Đ´ĐģŅ ĐŋŅОвĐĩŅĐēи ĐŋĐžĐģŅСОваŅĐĩĐģŅ, а в ŅаĐŧОК *ŅŅĐŊĐēŅии-ОйŅайОŅŅиĐēĐĩ ĐŋŅŅи* ŅŅа ŅĐĩŅŅĐ¸Ņ ĐąĐžĐģŅŅĐĩ ĐŊĐĩ иŅĐŋĐžĐģŅСŅĐĩŅŅŅ, и ĐŋŅи ŅŅĐžĐŧ ĐžŅвĐĩŅ ĐžŅĐŋŅавĐģŅĐĩŅŅŅ Đ´ĐžĐģĐŗĐž, ĐŊаĐŋŅиĐŧĐĩŅ, ŅŅĐž `StreamingResponse`, ĐēĐžŅĐžŅŅĐš ĐŧĐĩĐ´ĐģĐĩĐŊĐŊĐž ĐžŅĐŋŅавĐģŅĐĩŅ Đ´Đ°ĐŊĐŊŅĐĩ и ĐŋĐž ĐēаĐēОК-ŅĐž ĐŋŅиŅиĐŊĐĩ ĐŊĐĩ иŅĐŋĐžĐģŅСŅĐĩŅ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊĐŊŅŅ
.
+
+Đ ŅаĐēĐžĐŧ ŅĐģŅŅаĐĩ ŅĐĩŅŅĐ¸Ņ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊĐŊŅŅ
ĐąŅĐ´ĐĩŅ ŅĐ´ĐĩŅĐļиваŅŅŅŅ Đ´Đž СавĐĩŅŅĐĩĐŊĐ¸Ņ ĐžŅĐŋŅавĐēи ĐžŅвĐĩŅа, Ņ
ĐžŅŅ ĐĩŅĐģи Đ˛Ņ ĐĩŅ ĐŊĐĩ иŅĐŋĐžĐģŅСŅĐĩŅĐĩ, ŅĐ´ĐĩŅĐļиваŅŅ ĐĩŅ ĐŊĐĩ ŅŅĐĩĐąŅĐĩŅŅŅ.
+
+ĐŅĐž ĐŧĐžĐŗĐģĐž ĐąŅ Đ˛ŅĐŗĐģŅĐ´ĐĩŅŅ ŅаĐē:
+
+{* ../../docs_src/dependencies/tutorial013_an_py310.py *}
+
+ĐОд ĐŋĐžŅĐģĐĩ `yield`, авŅĐžĐŧаŅиŅĐĩŅĐēĐžĐĩ СаĐēŅŅŅиĐĩ `Session` в:
+
+{* ../../docs_src/dependencies/tutorial013_an_py310.py ln[19:21] *}
+
+âĻĐąŅĐ´ĐĩŅ Đ˛ŅĐŋĐžĐģĐŊĐĩĐŊ ĐŋĐžŅĐģĐĩ ŅĐžĐŗĐž, ĐēаĐē ĐžŅвĐĩŅ ĐˇĐ°ĐēĐžĐŊŅĐ¸Ņ ĐžŅĐŋŅавĐēŅ ĐŧĐĩĐ´ĐģĐĩĐŊĐŊŅŅ
даĐŊĐŊŅŅ
:
+
+{* ../../docs_src/dependencies/tutorial013_an_py310.py ln[30:38] hl[31:33] *}
+
+ĐĐž ĐŋĐžŅĐēĐžĐģŅĐēŅ `generate_stream()` ĐŊĐĩ иŅĐŋĐžĐģŅСŅĐĩŅ ŅĐĩŅŅĐ¸Ņ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊĐŊŅŅ
, ĐŊĐĩŅ ŅĐĩаĐģŅĐŊОК ĐŊĐĩОйŅ
ОдиĐŧĐžŅŅи Đ´ĐĩŅĐļаŅŅ ŅĐĩŅŅĐ¸Ņ ĐžŅĐēŅŅŅОК вО вŅĐĩĐŧŅ ĐžŅĐŋŅавĐēи ĐžŅвĐĩŅа.
+
+ĐŅĐģи Ņ Đ˛Đ°Ņ Đ¸ĐŧĐĩĐŊĐŊĐž ŅаĐēОК ŅŅĐĩĐŊаŅиК Ņ SQLModel (иĐģи SQLAlchemy), Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅвĐŊĐž СаĐēŅŅŅŅ ŅĐĩŅŅиŅ, ĐēĐžĐŗĐ´Đ° ĐžĐŊа йОĐģŅŅĐĩ ĐŊĐĩ ĐŊŅĐļĐŊа:
+
+{* ../../docs_src/dependencies/tutorial014_an_py310.py ln[24:28] hl[28] *}
+
+ĐĸаĐē ŅĐĩŅŅĐ¸Ņ ĐžŅĐ˛ĐžĐąĐžĐ´Đ¸Ņ ĐŋОдĐēĐģŅŅĐĩĐŊиĐĩ Đē йаСĐĩ даĐŊĐŊŅŅ
, и Đ´ŅŅĐŗĐ¸Đĩ СаĐŋŅĐžŅŅ ŅĐŧĐžĐŗŅŅ ĐĩĐŗĐž иŅĐŋĐžĐģŅСОваŅŅ.
+
+ĐŅĐģи Ņ Đ˛Đ°Ņ ĐĩŅŅŅ Đ´ŅŅĐŗĐžĐš ŅŅĐĩĐŊаŅиК, ĐŗĐ´Đĩ ĐŊŅĐļĐŊĐž ŅаĐŊĐŊĐĩĐĩ СавĐĩŅŅĐĩĐŊиĐĩ СавиŅиĐŧĐžŅŅи Ņ `yield`, ĐŋĐžĐļаĐģŅĐšŅŅа, ŅОСдаКŅĐĩ вОĐŋŅĐžŅ Đ˛ GitHub Discussions Ņ ĐžĐŋиŅаĐŊиĐĩĐŧ ĐēĐžĐŊĐēŅĐĩŅĐŊĐžĐŗĐž ĐēĐĩĐšŅа и ĐŋĐžŅĐĩĐŧŅ Đ˛Đ°Đŧ ĐąŅĐģĐž ĐąŅ ĐŋĐžĐģĐĩСĐŊĐž иĐŧĐĩŅŅ ŅаĐŊĐŊĐĩĐĩ СаĐēŅŅŅиĐĩ Đ´ĐģŅ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅĐĩĐš Ņ `yield`.
+
+ĐŅĐģи ĐŋĐžŅвŅŅŅŅ Đ˛ĐĩŅĐēиĐĩ ĐŋŅиŅиĐŊŅ Đ´ĐģŅ ŅаĐŊĐŊĐĩĐŗĐž СаĐēŅŅŅĐ¸Ņ Đ˛ СавиŅиĐŧĐžŅŅŅŅ
Ņ `yield`, Ņ ŅаŅŅĐŧĐžŅŅŅ Đ´ĐžĐąĐ°Đ˛ĐģĐĩĐŊиĐĩ ĐŊĐžĐ˛ĐžĐŗĐž ŅĐŋĐžŅОйа ĐžĐŋŅиОĐŊаĐģŅĐŊĐž вĐēĐģŅŅаŅŅ ŅаĐŊĐŊĐĩĐĩ СаĐēŅŅŅиĐĩ.
+
+### ĐавиŅиĐŧĐžŅŅи Ņ `yield` и `except`, ŅĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ Đ´ĐĩŅаĐģи { #dependencies-with-yield-and-except-technical-details }
+
+ĐĐž FastAPI 0.110.0, ĐĩŅĐģи Đ˛Ņ Đ¸ŅĐŋĐžĐģŅСОваĐģи СавиŅиĐŧĐžŅŅŅ Ņ `yield`, СаŅĐĩĐŧ ĐŋĐĩŅĐĩŅ
ваŅŅваĐģи иŅĐēĐģŅŅĐĩĐŊиĐĩ Ņ `except` в ŅŅОК СавиŅиĐŧĐžŅŅи и ĐŊĐĩ ĐŋŅОйŅаŅŅваĐģи иŅĐēĐģŅŅĐĩĐŊиĐĩ ŅĐŊОва, иŅĐēĐģŅŅĐĩĐŊиĐĩ авŅĐžĐŧаŅиŅĐĩŅĐēи ĐŋŅОйŅаŅŅваĐģĐžŅŅ Đ´Đ°ĐģŅŅĐĩ Đē ОйŅайОŅŅиĐēаĐŧ иŅĐēĐģŅŅĐĩĐŊиК иĐģи Đē ОйŅайОŅŅиĐēŅ Đ˛ĐŊŅŅŅĐĩĐŊĐŊĐĩĐš ĐžŅийĐēи ŅĐĩŅвĐĩŅа.
+
+РвĐĩŅŅии 0.110.0 ŅŅĐž ĐąŅĐģĐž иСĐŧĐĩĐŊĐĩĐŊĐž, ŅŅĐžĐąŅ Đ¸ŅĐŋŅавиŅŅ ĐŊĐĩĐēĐžĐŊŅŅĐžĐģиŅŅĐĩĐŧĐžĐĩ ĐŋĐžŅŅĐĩĐąĐģĐĩĐŊиĐĩ ĐŋаĐŧŅŅи иСâСа ĐŋŅОйŅĐžŅĐĩĐŊĐŊŅŅ
иŅĐēĐģŅŅĐĩĐŊиК ĐąĐĩС ОйŅайОŅŅиĐēа (вĐŊŅŅŅĐĩĐŊĐŊиĐĩ ĐžŅийĐēи ŅĐĩŅвĐĩŅа) и ĐŋŅивĐĩŅŅи ĐŋОвĐĩĐ´ĐĩĐŊиĐĩ в ŅООŅвĐĩŅŅŅвиĐĩ Ņ ĐžĐąŅŅĐŊŅĐŧ ĐŋОвĐĩĐ´ĐĩĐŊиĐĩĐŧ Python-ĐēОда.
+
+### ФОĐŊОвŅĐĩ СадаŅи и СавиŅиĐŧĐžŅŅи Ņ `yield`, ŅĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ Đ´ĐĩŅаĐģи { #background-tasks-and-dependencies-with-yield-technical-details }
+
+ĐĐž FastAPI 0.106.0 вŅСŅваŅŅ Đ¸ŅĐēĐģŅŅĐĩĐŊĐ¸Ņ ĐŋĐžŅĐģĐĩ `yield` ĐąŅĐģĐž ĐŊĐĩвОСĐŧĐžĐļĐŊĐž: ĐēОд ĐŋĐžŅĐģĐĩ `yield` в СавиŅиĐŧĐžŅŅŅŅ
вŅĐŋĐžĐģĐŊŅĐģŅŅ ŅĐļĐĩ ĐŋĐžŅĐģĐĩ ĐžŅĐŋŅавĐēи ĐžŅвĐĩŅа, ĐŋĐžŅŅĐžĐŧŅ [ĐĐąŅайОŅŅиĐēи иŅĐēĐģŅŅĐĩĐŊиК](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank} Đē ŅĐžĐŧŅ ĐŧĐžĐŧĐĩĐŊŅŅ ŅĐļĐĩ ĐžŅŅайОŅаĐģи.
+
+ĐĸаĐē ĐąŅĐģĐž ŅĐ´ĐĩĐģаĐŊĐž в ĐžŅĐŊОвĐŊĐžĐŧ Đ´ĐģŅ ŅĐžĐŗĐž, ŅŅĐžĐąŅ ĐŧĐžĐļĐŊĐž ĐąŅĐģĐž иŅĐŋĐžĐģŅСОваŅŅ ŅĐĩ ĐļĐĩ ОйŅĐĩĐēŅŅ, ÂĢĐžŅдаĐŊĐŊŅĐĩÂģ СавиŅиĐŧĐžŅŅŅĐŧи ŅĐĩŅĐĩС `yield`, вĐŊŅŅŅи ŅĐžĐŊОвŅŅ
СадаŅ, ĐŋĐžŅĐžĐŧŅ ŅŅĐž ĐēОд ĐŋĐžŅĐģĐĩ `yield` вŅĐŋĐžĐģĐŊŅĐģŅŅ ĐŋĐžŅĐģĐĩ СавĐĩŅŅĐĩĐŊĐ¸Ņ ŅĐžĐŊОвŅŅ
СадаŅ.
+
+Đ FastAPI 0.106.0 ŅŅĐž иСĐŧĐĩĐŊиĐģи, ŅŅĐžĐąŅ ĐŊĐĩ ŅĐ´ĐĩŅĐļиваŅŅ ŅĐĩŅŅŅŅŅ, ĐŋĐžĐēа ĐžŅвĐĩŅ ĐŋĐĩŅĐĩдаŅŅŅŅ ĐŋĐž ŅĐĩŅи.
+
+/// tip | ХОвĐĩŅ
+
+ĐŅĐžĐŧĐĩ ŅĐžĐŗĐž, ŅĐžĐŊĐžĐ˛Đ°Ņ ĐˇĐ°Đ´Đ°Ņа ОйŅŅĐŊĐž â ŅŅĐž ŅаĐŧĐžŅŅĐžŅŅĐĩĐģŅĐŊŅĐš ŅŅĐ°ĐŗĐŧĐĩĐŊŅ ĐģĐžĐŗĐ¸Đēи, ĐēĐžŅĐžŅŅĐš ŅĐģĐĩĐ´ŅĐĩŅ ĐžĐąŅайаŅŅваŅŅ ĐžŅĐ´ĐĩĐģŅĐŊĐž, ŅĐž ŅвОиĐŧи ŅĐĩŅŅŅŅаĐŧи (ĐŊаĐŋŅиĐŧĐĩŅ, ŅĐž ŅвОиĐŧ ĐŋОдĐēĐģŅŅĐĩĐŊиĐĩĐŧ Đē йаСĐĩ даĐŊĐŊŅŅ
).
+
+ĐĸаĐē ĐēОд, ŅĐēĐžŅĐĩĐĩ вŅĐĩĐŗĐž, ĐąŅĐ´ĐĩŅ ŅиŅĐĩ.
+
+///
+
+ĐŅĐģи Đ˛Ņ ĐŋĐžĐģĐ°ĐŗĐ°ĐģиŅŅ ĐŊа ĐŋŅĐĩĐļĐŊĐĩĐĩ ĐŋОвĐĩĐ´ĐĩĐŊиĐĩ, ŅĐĩĐŋĐĩŅŅ ŅĐĩŅŅŅŅŅ Đ´ĐģŅ ŅĐžĐŊОвŅŅ
ĐˇĐ°Đ´Đ°Ņ ŅĐģĐĩĐ´ŅĐĩŅ ŅОСдаваŅŅ Đ˛ĐŊŅŅŅи ŅаĐŧОК ŅĐžĐŊОвОК СадаŅи и иŅĐŋĐžĐģŅСОваŅŅ Đ˛ĐŊŅŅŅи ĐŊĐĩŅ ŅĐžĐģŅĐēĐž даĐŊĐŊŅĐĩ, ĐēĐžŅĐžŅŅĐĩ ĐŊĐĩ СавиŅŅŅ ĐžŅ ŅĐĩŅŅŅŅОв СавиŅиĐŧĐžŅŅĐĩĐš Ņ `yield`.
+
+ĐаĐŋŅиĐŧĐĩŅ, вĐŧĐĩŅŅĐž иŅĐŋĐžĐģŅСОваĐŊĐ¸Ņ ŅОК ĐļĐĩ ŅĐĩŅŅии ĐąĐ°ĐˇŅ Đ´Đ°ĐŊĐŊŅŅ
, ŅОСдаКŅĐĩ ĐŊОвŅŅ ŅĐĩŅŅĐ¸Ņ Đ˛ ŅĐžĐŊОвОК СадаŅĐĩ и ĐŋĐžĐģŅŅиŅĐĩ ОйŅĐĩĐēŅŅ Đ¸Đˇ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊĐŊŅŅ
Ņ ĐŋĐžĐŧĐžŅŅŅ ŅŅОК ĐŊОвОК ŅĐĩŅŅии. РСаŅĐĩĐŧ, вĐŧĐĩŅŅĐž ĐŋĐĩŅĐĩдаŅи ОйŅĐĩĐēŅа иС ĐąĐ°ĐˇŅ Đ´Đ°ĐŊĐŊŅŅ
ĐŋаŅаĐŧĐĩŅŅĐžĐŧ в ŅŅĐŊĐēŅĐ¸Ņ ŅĐžĐŊОвОК СадаŅи, ĐŋĐĩŅĐĩдаваКŅĐĩ идĐĩĐŊŅиŅиĐēаŅĐžŅ ŅŅĐžĐŗĐž ОйŅĐĩĐēŅа и СаĐŊОвО ĐŋĐžĐģŅŅаКŅĐĩ ОйŅĐĩĐēŅ Đ˛ĐŊŅŅŅи ŅŅĐŊĐēŅии ŅĐžĐŊОвОК СадаŅи.
diff --git a/docs/ru/docs/advanced/async-tests.md b/docs/ru/docs/advanced/async-tests.md
index 7849ad109..5062bc52e 100644
--- a/docs/ru/docs/advanced/async-tests.md
+++ b/docs/ru/docs/advanced/async-tests.md
@@ -1,4 +1,4 @@
-# ĐŅиĐŊŅ
ŅĐžĐŊĐŊĐžĐĩ ŅĐĩŅŅиŅОваĐŊиĐĩ
+# ĐŅиĐŊŅ
ŅĐžĐŊĐŊĐžĐĩ ŅĐĩŅŅиŅОваĐŊиĐĩ { #async-tests }
ĐŅ ŅĐļĐĩ видĐĩĐģи ĐēаĐē ŅĐĩŅŅиŅОваŅŅ **FastAPI** ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ, иŅĐŋĐžĐģŅСŅŅ Đ¸ĐŧĐĩŅŅиКŅŅ ĐēĐģаŅŅ `TestClient`. Đ ŅŅĐžĐŧŅ ĐŧĐžĐŧĐĩĐŊŅŅ Đ˛Ņ Đ˛Đ¸Đ´ĐĩĐģи ŅĐžĐģŅĐēĐž ĐēаĐē ĐŋиŅаŅŅ ŅĐĩŅŅŅ Đ˛ ŅиĐŊŅ
ŅĐžĐŊĐŊĐžĐŧ ŅŅиĐģĐĩ ĐąĐĩС иŅĐŋĐžĐģŅСОваĐŊĐ¸Ņ `async` ŅŅĐŊĐēŅиК.
@@ -6,11 +6,11 @@
ĐаваКŅĐĩ ŅаŅŅĐŧĐžŅŅиĐŧ, ĐēаĐē ĐŧŅ ĐŧĐžĐļĐĩĐŧ ŅŅĐž ŅĐĩаĐģиСОваŅŅ.
-## pytest.mark.anyio
+## pytest.mark.anyio { #pytest-mark-anyio }
ĐŅĐģи ĐŧŅ Ņ
ĐžŅиĐŧ вŅСŅваŅŅ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊŅĐĩ ŅŅĐŊĐēŅии в ĐŊаŅиŅ
ŅĐĩŅŅаŅ
, ŅĐž ĐŊаŅи ŅĐĩŅŅОвŅĐĩ ŅŅĐŊĐēŅии Đ´ĐžĐģĐļĐŊŅ ĐąŅŅŅ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊŅĐŧи. AnyIO ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ Đ´ĐģŅ ŅŅĐžĐŗĐž ĐžŅĐģиŅĐŊŅĐš ĐŋĐģĐ°ĐŗĐ¸ĐŊ, ĐēĐžŅĐžŅŅĐš ĐŋОСвОĐģŅĐĩŅ ĐŊаĐŧ ŅĐēаСŅваŅŅ, ĐēаĐēиĐĩ ŅĐĩŅŅОвŅĐĩ ŅŅĐŊĐēŅии Đ´ĐžĐģĐļĐŊŅ Đ˛ŅСŅваŅŅŅŅ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊĐž.
-## HTTPX
+## HTTPX { #httpx }
ĐаĐļĐĩ ĐĩŅĐģи **FastAPI** ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ иŅĐŋĐžĐģŅСŅĐĩŅ ĐžĐąŅŅĐŊŅĐĩ ŅŅĐŊĐēŅии `def` вĐŧĐĩŅŅĐž `async def`, ŅŅĐž вŅĐĩ ŅавĐŊĐž `async` ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ 'ĐŋОд ĐēаĐŋĐžŅĐžĐŧ'.
@@ -18,7 +18,7 @@
`TestClient` ĐžŅĐŊОваĐŊ ĐŊа HTTPX, и, Đē ŅŅаŅŅŅŅ, ĐŧŅ ĐŧĐžĐļĐĩĐŧ иŅĐŋĐžĐģŅСОваŅŅ ĐĩĐŗĐž (`HTTPX`) ĐŊаĐŋŅŅĐŧŅŅ Đ´ĐģŅ ŅĐĩŅŅиŅОваĐŊĐ¸Ņ API.
-## ĐŅиĐŧĐĩŅ
+## ĐŅиĐŧĐĩŅ { #example }
Đ ĐēаŅĐĩŅŅвĐĩ ĐŋŅĐžŅŅĐžĐŗĐž ĐŋŅиĐŧĐĩŅа, даваКŅĐĩ ŅаŅŅĐŧĐžŅŅиĐŧ ŅаКĐģОвŅŅ ŅŅŅŅĐēŅŅŅŅ, ŅŅ
ĐžĐļŅŅ Ņ ĐžĐŋиŅаĐŊĐŊОК в [ĐĐžĐģŅŅиĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиŅ](../tutorial/bigger-applications.md){.internal-link target=_blank} и [ĐĸĐĩŅŅиŅОваĐŊиĐĩ](../tutorial/testing.md){.internal-link target=_blank}:
@@ -38,7 +38,7 @@
{* ../../docs_src/async_tests/test_main.py *}
-## ĐаĐŋŅŅĐē ŅĐĩŅŅОв
+## ĐаĐŋŅŅĐē ŅĐĩŅŅОв { #run-it }
ĐŅ ĐŧĐžĐļĐĩŅĐĩ СаĐŋŅŅŅиŅŅ ŅвОи ŅĐĩŅŅŅ ĐēаĐē ОйŅŅĐŊĐž:
@@ -52,7 +52,7 @@ $ pytest
-## ĐОдŅОйĐŊĐĩĐĩ
+## ĐОдŅОйĐŊĐĩĐĩ { #in-detail }
ĐаŅĐēĐĩŅ `@pytest.mark.anyio` ĐŗĐžĐ˛ĐžŅĐ¸Ņ pytest, ŅŅĐž ŅĐĩŅŅĐžĐ˛Đ°Ņ ŅŅĐŊĐēŅĐ¸Ņ Đ´ĐžĐģĐļĐŊа ĐąŅŅŅ Đ˛ŅСваĐŊа аŅиĐŊŅ
ŅĐžĐŊĐŊĐž:
@@ -88,7 +88,7 @@ response = client.get('/')
///
-## ĐŅСОв Đ´ŅŅĐŗĐ¸Ņ
аŅиĐŊŅ
ŅĐžĐŊĐŊŅŅ
ŅŅĐŊĐēŅиК
+## ĐŅСОв Đ´ŅŅĐŗĐ¸Ņ
аŅиĐŊŅ
ŅĐžĐŊĐŊŅŅ
ŅŅĐŊĐēŅиК { #other-asynchronous-function-calls }
ĐĸĐĩĐŋĐĩŅŅ ŅĐĩŅŅĐžĐ˛Đ°Ņ ŅŅĐŊĐēŅĐ¸Ņ ŅŅаĐģа аŅиĐŊŅ
ŅĐžĐŊĐŊОК, ĐŋĐžŅŅĐžĐŧŅ Đ˛ĐŊŅŅŅи ĐŊĐĩĐĩ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ вŅСŅваŅŅ ŅаĐēĐļĐĩ и Đ´ŅŅĐŗĐ¸Đĩ `async` ŅŅĐŊĐēŅии, ĐŊĐĩ ŅвŅСаĐŊĐŊŅĐĩ Ņ ĐžŅĐŋŅавĐģĐĩĐŊиĐĩĐŧ СаĐŋŅĐžŅОв в ваŅĐĩ FastAPI ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ. ĐаĐē ĐĩŅĐģи ĐąŅ Đ˛Ņ Đ˛ŅСŅваĐģи иŅ
в ĐģŅйОĐŧ Đ´ŅŅĐŗĐžĐŧ ĐŧĐĩŅŅĐĩ ваŅĐĩĐŗĐž ĐēОда.
diff --git a/docs/ru/docs/advanced/behind-a-proxy.md b/docs/ru/docs/advanced/behind-a-proxy.md
new file mode 100644
index 000000000..281cb7f73
--- /dev/null
+++ b/docs/ru/docs/advanced/behind-a-proxy.md
@@ -0,0 +1,458 @@
+# Đа ĐŋŅĐžĐēŅиâŅĐĩŅвĐĩŅĐžĐŧ { #behind-a-proxy }
+
+ĐĐž ĐŧĐŊĐžĐŗĐ¸Ņ
ŅĐģŅŅаŅŅ
ĐŋĐĩŅĐĩĐ´ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩĐŧ FastAPI иŅĐŋĐžĐģŅСŅĐĩŅŅŅ ĐŋŅĐžĐēŅиâŅĐĩŅвĐĩŅ, ĐŊаĐŋŅиĐŧĐĩŅ Traefik иĐģи Nginx.
+
+ĐĸаĐēиĐĩ ĐŋŅĐžĐēŅи ĐŧĐžĐŗŅŅ ĐžĐąŅайаŅŅваŅŅ HTTPSâŅĐĩŅŅиŅиĐēаŅŅ Đ¸ ĐŧĐŊĐžĐŗĐžĐĩ Đ´ŅŅĐŗĐžĐĩ.
+
+## ĐĐĩŅĐĩŅŅĐģаĐĩĐŧŅĐĩ ĐˇĐ°ĐŗĐžĐģОвĐēи ĐŋŅĐžĐēŅи { #proxy-forwarded-headers }
+
+ĐŅĐžĐēŅи ĐŋĐĩŅĐĩĐ´ ваŅиĐŧ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩĐŧ ОйŅŅĐŊĐž ĐŊа ĐģĐĩŅŅ Đ´ĐžĐąĐ°Đ˛ĐģŅĐĩŅ ĐŊĐĩĐēĐžŅĐžŅŅĐĩ HTTPâĐˇĐ°ĐŗĐžĐģОвĐēи ĐŋĐĩŅĐĩĐ´ ĐžŅĐŋŅавĐēОК СаĐŋŅĐžŅа ĐŊа Đ˛Đ°Ņ ŅĐĩŅвĐĩŅ, ŅŅĐžĐąŅ ŅООйŅиŅŅ ĐĩĐŧŅ, ŅŅĐž СаĐŋŅĐžŅ ĐąŅĐģ ĐŋĐĩŅĐĩŅĐģаĐŊ ĐŋŅĐžĐēŅи, а ŅаĐēĐļĐĩ ĐŋĐĩŅĐĩдаŅŅ Đ¸ŅŅ
ОдĐŊŅĐš (ĐŋŅĐąĐģиŅĐŊŅĐš) URL (вĐēĐģŅŅĐ°Ņ Đ´ĐžĐŧĐĩĐŊ), иĐŊŅĐžŅĐŧаŅĐ¸Ņ ĐžĐą иŅĐŋĐžĐģŅСОваĐŊии HTTPS и Ņ.Đ´.
+
+ĐŅĐžĐŗŅаĐŧĐŧа ŅĐĩŅвĐĩŅа (ĐŊаĐŋŅиĐŧĐĩŅ, Uvicorn, СаĐŋŅŅĐĩĐŊĐŊŅĐš ŅĐĩŅĐĩС FastAPI CLI) ŅĐŧĐĩĐĩŅ Đ¸ĐŊŅĐĩŅĐŋŅĐĩŅиŅОваŅŅ ŅŅи ĐˇĐ°ĐŗĐžĐģОвĐēи и ĐŋĐĩŅĐĩдаваŅŅ ŅООŅвĐĩŅŅŅвŅŅŅŅŅ Đ¸ĐŊŅĐžŅĐŧаŅĐ¸Ņ Đ˛Đ°ŅĐĩĐŧŅ ĐŋŅиĐģĐžĐļĐĩĐŊиŅ.
+
+ĐĐž иС ŅООйŅаĐļĐĩĐŊиК ĐąĐĩСОĐŋаŅĐŊĐžŅŅи, ĐŋĐžĐēа ŅĐĩŅвĐĩŅ ĐŊĐĩ ŅвĐĩŅĐĩĐŊ, ŅŅĐž ĐŊаŅ
ОдиŅŅŅ ĐˇĐ° дОвĐĩŅĐĩĐŊĐŊŅĐŧ ĐŋŅĐžĐēŅи, ĐžĐŊ ĐŊĐĩ ĐąŅĐ´ĐĩŅ Đ¸ĐŊŅĐĩŅĐŋŅĐĩŅиŅОваŅŅ ŅŅи ĐˇĐ°ĐŗĐžĐģОвĐēи.
+
+/// note | ĐĸĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ Đ´ĐĩŅаĐģи
+
+ĐĐ°ĐŗĐžĐģОвĐēи ĐŋŅĐžĐēŅи:
+
+* X-Forwarded-For
+* X-Forwarded-Proto
+* X-Forwarded-Host
+
+///
+
+### ĐĐēĐģŅŅиŅŅ ĐŋĐĩŅĐĩŅŅĐģаĐĩĐŧŅĐĩ ĐˇĐ°ĐŗĐžĐģОвĐēи ĐŋŅĐžĐēŅи { #enable-proxy-forwarded-headers }
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ СаĐŋŅŅŅиŅŅ FastAPI CLI Ņ ĐžĐŋŅиĐĩĐš ĐēĐžĐŧаĐŊĐ´ĐŊОК ŅŅŅĐžĐēи `--forwarded-allow-ips` и ĐŋĐĩŅĐĩдаŅŅ IPâадŅĐĩŅа, ĐēĐžŅĐžŅŅĐŧ ŅĐģĐĩĐ´ŅĐĩŅ Đ´ĐžĐ˛ĐĩŅŅŅŅ ĐŋŅи ŅŅĐĩĐŊии ŅŅиŅ
ĐŋĐĩŅĐĩŅŅĐģаĐĩĐŧŅŅ
ĐˇĐ°ĐŗĐžĐģОвĐēОв.
+
+ĐŅĐģи ŅĐēаСаŅŅ `--forwarded-allow-ips="*"`, ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐąŅĐ´ĐĩŅ Đ´ĐžĐ˛ĐĩŅŅŅŅ Đ˛ŅĐĩĐŧ вŅ
ОдŅŅиĐŧ IP.
+
+ĐŅĐģи Đ˛Đ°Ņ ŅĐĩŅвĐĩŅ ĐŊаŅ
ОдиŅŅŅ ĐˇĐ° дОвĐĩŅĐĩĐŊĐŊŅĐŧ ĐŋŅĐžĐēŅи и ŅĐžĐģŅĐēĐž ĐŋŅĐžĐēŅи ОйŅаŅаĐĩŅŅŅ Đē ĐŊĐĩĐŧŅ, ŅŅĐžĐŗĐž Đ´ĐžŅŅаŅĐžŅĐŊĐž, ŅŅĐžĐąŅ ĐžĐŊ ĐŋŅиĐŊиĐŧаĐģ IP ŅŅĐžĐŗĐž ĐŋŅĐžĐēŅи.
+
+
+
+Đ Đ˛ĐžŅ ĐĩŅĐģи ĐžŅĐēŅŅŅŅ Đ¸ĐŊŅĐĩŅŅĐĩĐšŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии ĐŋĐž ÂĢĐžŅиŅиаĐģŅĐŊĐžĐŧŅÂģ URL ŅĐĩŅĐĩС ĐŋŅĐžĐēŅи ĐŊа ĐŋĐžŅŅŅ `9999`, ĐŋĐž `/api/v1/docs`, вŅŅ ŅайОŅаĐĩŅ ĐēĐžŅŅĐĩĐēŅĐŊĐž! đ
+
+ĐŅОвĐĩŅŅŅĐĩ ĐŋĐž адŅĐĩŅŅ http://127.0.0.1:9999/api/v1/docs:
+
+
+
+ĐĐŧĐĩĐŊĐŊĐž ĐēаĐē и Ņ
ĐžŅĐĩĐģĐžŅŅ. âī¸
+
+ĐŅĐž ĐŋĐžŅĐžĐŧŅ, ŅŅĐž FastAPI иŅĐŋĐžĐģŅСŅĐĩŅ `root_path`, ŅŅĐžĐąŅ ŅОСдаŅŅ Đ˛ OpenAPI ŅĐĩŅвĐĩŅ ĐŋĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ Ņ URL иС `root_path`.
+
+## ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ŅĐĩŅвĐĩŅŅ { #additional-servers }
+
+/// warning | ĐŅĐĩĐ´ŅĐŋŅĐĩĐļĐ´ĐĩĐŊиĐĩ
+
+ĐŅĐž йОĐģĐĩĐĩ ĐŋŅОдвиĐŊŅŅŅĐš ŅŅĐĩĐŊаŅиК. ĐĐžĐļĐŊĐž ĐŋŅĐžĐŋŅŅŅиŅŅ.
+
+///
+
+ĐĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ FastAPI ŅОСдаŅŅ Đ˛ ŅŅ
ĐĩĐŧĐĩ OpenAPI `server` Ņ URL иС `root_path`.
+
+ĐĐž Đ˛Ņ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ ŅĐēаСаŅŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ `servers`, ĐŊаĐŋŅиĐŧĐĩŅ, ĐĩŅĐģи Ņ
ĐžŅиŅĐĩ, ŅŅĐžĐąŅ ĐžĐ´Đ¸ĐŊ и ŅĐžŅ ĐļĐĩ иĐŊŅĐĩŅŅĐĩĐšŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии ŅайОŅаĐģ и ŅĐž ŅŅĐĩКдĐļиĐŊĐŗĐžĐŧ, и Ņ ĐŋŅОдаĐēŅĐŊ.
+
+ĐŅĐģи Đ˛Ņ ĐŋĐĩŅĐĩдадиŅĐĩ ŅвОК ŅĐŋиŅĐžĐē `servers` и ĐŋŅи ŅŅĐžĐŧ СадаĐŊ `root_path` (ĐŋĐžŅĐžĐŧŅ ŅŅĐž Đ˛Đ°Ņ API ŅайОŅаĐĩŅ ĐˇĐ° ĐŋŅĐžĐēŅи), FastAPI вŅŅĐ°Đ˛Đ¸Ņ ÂĢserverÂģ Ņ ŅŅиĐŧ `root_path` в ĐŊаŅаĐģĐž ŅĐŋиŅĐēа.
+
+ĐаĐŋŅиĐŧĐĩŅ:
+
+{* ../../docs_src/behind_a_proxy/tutorial003.py hl[4:7] *}
+
+ĐŅĐ´ĐĩŅ ŅĐŗĐĩĐŊĐĩŅиŅОваĐŊа ŅŅ
ĐĩĐŧа OpenAPI ĐŋŅиĐŧĐĩŅĐŊĐž ŅаĐēаŅ:
+
+```JSON hl_lines="5-7"
+{
+ "openapi": "3.1.0",
+ // ĐĐ´ĐĩŅŅ ĐĩŅŅ ŅŅĐž-ŅĐž
+ "servers": [
+ {
+ "url": "/api/v1"
+ },
+ {
+ "url": "https://stag.example.com",
+ "description": "Staging environment"
+ },
+ {
+ "url": "https://prod.example.com",
+ "description": "Production environment"
+ }
+ ],
+ "paths": {
+ // ĐĐ´ĐĩŅŅ ĐĩŅŅ ŅŅĐž-ŅĐž
+ }
+}
+```
+
+/// tip | ХОвĐĩŅ
+
+ĐĐąŅаŅиŅĐĩ вĐŊиĐŧаĐŊиĐĩ ĐŊа авŅĐžĐŧаŅиŅĐĩŅĐēи дОйавĐģĐĩĐŊĐŊŅĐš ŅĐĩŅвĐĩŅ Ņ `url` ŅавĐŊŅĐŧ `/api/v1`, вСŅŅŅĐŧ иС `root_path`.
+
+///
+
+РиĐŊŅĐĩŅŅĐĩĐšŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии ĐŋĐž адŅĐĩŅŅ http://127.0.0.1:9999/api/v1/docs ŅŅĐž ĐąŅĐ´ĐĩŅ Đ˛ŅĐŗĐģŅĐ´ĐĩŅŅ ŅаĐē:
+
+
+
+/// tip | ХОвĐĩŅ
+
+ĐĐŊŅĐĩŅŅĐĩĐšŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии ĐąŅĐ´ĐĩŅ Đ˛ĐˇĐ°Đ¸ĐŧОдĐĩĐšŅŅвОваŅŅ Ņ ŅĐĩŅвĐĩŅĐžĐŧ, ĐēĐžŅĐžŅŅĐš Đ˛Ņ Đ˛ŅĐąĐĩŅĐĩŅĐĩ.
+
+///
+
+### ĐŅĐēĐģŅŅиŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēĐžĐĩ дОйавĐģĐĩĐŊиĐĩ ŅĐĩŅвĐĩŅа иС `root_path` { #disable-automatic-server-from-root-path }
+
+ĐŅĐģи Đ˛Ņ ĐŊĐĩ Ņ
ĐžŅиŅĐĩ, ŅŅĐžĐąŅ FastAPI дОйавĐģŅĐģ авŅĐžĐŧаŅиŅĐĩŅĐēиК ŅĐĩŅвĐĩŅ, иŅĐŋĐžĐģŅСŅŅ `root_path`, ŅĐēаĐļиŅĐĩ ĐŋаŅаĐŧĐĩŅŅ `root_path_in_servers=False`:
+
+{* ../../docs_src/behind_a_proxy/tutorial004.py hl[9] *}
+
+и ŅĐžĐŗĐ´Đ° ŅŅĐžŅ ŅĐĩŅвĐĩŅ ĐŊĐĩ ĐąŅĐ´ĐĩŅ Đ´ĐžĐąĐ°Đ˛ĐģĐĩĐŊ в ŅŅ
ĐĩĐŧŅ OpenAPI.
+
+## ĐĐžĐŊŅиŅОваĐŊиĐĩ вĐģĐžĐļĐĩĐŊĐŊĐžĐŗĐž ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ { #mounting-a-sub-application }
+
+ĐŅĐģи ваĐŧ ĐŊŅĐļĐŊĐž ŅĐŧĐžĐŊŅиŅОваŅŅ Đ˛ĐģĐžĐļĐĩĐŊĐŊĐžĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ (ĐēаĐē ĐžĐŋиŅаĐŊĐž в [ĐĐģĐžĐļĐĩĐŊĐŊŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ â ĐŧĐžĐŊŅиŅОваĐŊиĐĩ](sub-applications.md){.internal-link target=_blank}), и ĐŋŅи ŅŅĐžĐŧ Đ˛Ņ Đ¸ŅĐŋĐžĐģŅСŅĐĩŅĐĩ ĐŋŅĐžĐēŅи Ņ `root_path`, Đ´ĐĩĐģаКŅĐĩ ŅŅĐž ОйŅŅĐŊŅĐŧ ОйŅаСОĐŧ â вŅŅ ĐąŅĐ´ĐĩŅ ŅайОŅаŅŅ, ĐēаĐē ĐžĐļидаĐĩŅŅŅ.
+
+FastAPI ŅĐŧĐŊĐž иŅĐŋĐžĐģŅСŅĐĩŅ `root_path` вĐŊŅŅŅи, ŅаĐē ŅŅĐž вŅŅ ĐŋŅĐžŅŅĐž ŅайОŅаĐĩŅ. â¨
diff --git a/docs/ru/docs/advanced/custom-response.md b/docs/ru/docs/advanced/custom-response.md
new file mode 100644
index 000000000..2c238bd95
--- /dev/null
+++ b/docs/ru/docs/advanced/custom-response.md
@@ -0,0 +1,312 @@
+# ĐаŅŅĐžĐŧĐŊŅĐĩ ĐžŅвĐĩŅŅ â HTML, ĐŋĐžŅĐžĐē, ŅаКĐģ и Đ´ŅŅĐŗĐ¸Đĩ { #custom-response-html-stream-file-others }
+
+ĐĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ **FastAPI** вОСвŅаŅаĐĩŅ ĐžŅвĐĩŅŅ Ņ ĐŋĐžĐŧĐžŅŅŅ `JSONResponse`.
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ĐŋĐĩŅĐĩĐžĐŋŅĐĩĐ´ĐĩĐģиŅŅ ŅŅĐž, вĐĩŅĐŊŅв `Response` ĐŊаĐŋŅŅĐŧŅŅ, ĐēаĐē ĐŋĐžĐēаСаĐŊĐž в ŅаСдĐĩĐģĐĩ [ĐĐĩŅĐŊŅŅŅ Response ĐŊаĐŋŅŅĐŧŅŅ](response-directly.md){.internal-link target=_blank}.
+
+ĐĐž ĐĩŅĐģи Đ˛Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅĐĩ `Response` ĐŊаĐŋŅŅĐŧŅŅ (иĐģи ĐģŅйОК ĐĩĐŗĐž ĐŋОдĐēĐģаŅŅ, ĐŊаĐŋŅиĐŧĐĩŅ `JSONResponse`), даĐŊĐŊŅĐĩ ĐŊĐĩ ĐąŅĐ´ŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēи ĐŋŅĐĩОйŅаСОваĐŊŅ (даĐļĐĩ ĐĩŅĐģи Đ˛Ņ ĐžĐąŅŅвиĐģи `response_model`), и Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ ĐŊĐĩ ĐąŅĐ´ĐĩŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēи ŅĐŗĐĩĐŊĐĩŅиŅОваĐŊа (ĐŊаĐŋŅиĐŧĐĩŅ, ŅĐž ŅĐŋĐĩŅиŅиŅĐŊŅĐŧ ÂĢŅиĐŋĐžĐŧ ŅОдĐĩŅĐļиĐŧĐžĐŗĐžÂģ в HTTP-ĐˇĐ°ĐŗĐžĐģОвĐēĐĩ `Content-Type` ĐēаĐē ŅаŅŅŅŅ ŅĐŗĐĩĐŊĐĩŅиŅОваĐŊĐŊĐžĐŗĐž OpenAPI).
+
+ĐĐž Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅаĐēĐļĐĩ ОйŅŅвиŅŅ `Response`, ĐēĐžŅĐžŅŅĐš Ņ
ĐžŅиŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ (ĐŊаĐŋŅиĐŧĐĩŅ, ĐģŅйОК ĐŋОдĐēĐģаŅŅ `Response`), в Đ´ĐĩĐēĐžŅаŅĐžŅĐĩ ĐžĐŋĐĩŅаŅии ĐŋŅŅи, иŅĐŋĐžĐģŅСŅŅ ĐŋаŅаĐŧĐĩŅŅ `response_class`.
+
+ХОдĐĩŅĐļиĐŧĐžĐĩ, ĐēĐžŅĐžŅĐžĐĩ Đ˛Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅĐĩ иС ŅвОĐĩĐš ŅŅĐŊĐēŅии-ОйŅайОŅŅиĐēа ĐŋŅŅи, ĐąŅĐ´ĐĩŅ ĐŋĐžĐŧĐĩŅĐĩĐŊĐž вĐŊŅŅŅŅ ŅŅĐžĐŗĐž `Response`.
+
+Đ ĐĩŅĐģи Ņ ŅŅĐžĐŗĐž `Response` ŅиĐŋ ŅОдĐĩŅĐļиĐŧĐžĐŗĐž JSON (`application/json`), ĐēаĐē в ŅĐģŅŅаĐĩ Ņ `JSONResponse` и `UJSONResponse`, даĐŊĐŊŅĐĩ, ĐēĐžŅĐžŅŅĐĩ Đ˛Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅĐĩ, ĐąŅĐ´ŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēи ĐŋŅĐĩОйŅаСОваĐŊŅ (и ĐžŅŅиĐģŅŅŅОваĐŊŅ) ĐģŅĐąŅĐŧ ОйŅŅвĐģĐĩĐŊĐŊŅĐŧ ваĐŧи в Đ´ĐĩĐēĐžŅаŅĐžŅĐĩ ĐžĐŋĐĩŅаŅии ĐŋŅŅи Pydantic `response_model`.
+
+/// note | ĐŅиĐŧĐĩŅаĐŊиĐĩ
+
+ĐŅĐģи Đ˛Ņ Đ¸ŅĐŋĐžĐģŅСŅĐĩŅĐĩ ĐēĐģаŅŅ ĐžŅвĐĩŅа ĐąĐĩС ŅиĐŋа ŅОдĐĩŅĐļиĐŧĐžĐŗĐž, FastAPI ĐąŅĐ´ĐĩŅ ĐžĐļидаŅŅ, ŅŅĐž Ņ Đ˛Đ°ŅĐĩĐŗĐž ĐžŅвĐĩŅа ĐŊĐĩŅ ŅОдĐĩŅĐļиĐŧĐžĐŗĐž, ĐŋĐžŅŅĐžĐŧŅ ĐžĐŊ ĐŊĐĩ ĐąŅĐ´ĐĩŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅиŅОваŅŅ ŅĐžŅĐŧĐ°Ņ ĐžŅвĐĩŅа в ŅĐŗĐĩĐŊĐĩŅиŅОваĐŊĐŊОК Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии OpenAPI.
+
+///
+
+## ĐŅĐŋĐžĐģŅСŅĐšŅĐĩ `ORJSONResponse` { #use-orjsonresponse }
+
+ĐаĐŋŅиĐŧĐĩŅ, ĐĩŅĐģи Đ˛Ņ Đ˛ŅĐļиĐŧаĐĩŅĐĩ ĐŧаĐēŅиĐŧŅĐŧ ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅи, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅŅŅаĐŊОвиŅŅ Đ¸ иŅĐŋĐžĐģŅСОваŅŅ `orjson` и СадаŅŅ ĐžŅвĐĩŅ ĐēаĐē `ORJSONResponse`.
+
+ĐĐŧĐŋĐžŅŅиŅŅĐšŅĐĩ ĐēĐģаŅŅ (ĐŋОдĐēĐģаŅŅ) `Response`, ĐēĐžŅĐžŅŅĐš Đ˛Ņ Ņ
ĐžŅиŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ, и ОйŅŅвиŅĐĩ ĐĩĐŗĐž в Đ´ĐĩĐēĐžŅаŅĐžŅĐĩ ĐžĐŋĐĩŅаŅии ĐŋŅŅи.
+
+ĐĐģŅ ĐąĐžĐģŅŅиŅ
ĐžŅвĐĩŅОв вОСвŅаŅаŅŅ `Response` ĐŊаĐŋŅŅĐŧŅŅ ĐˇĐŊаŅиŅĐĩĐģŅĐŊĐž ĐąŅŅŅŅĐĩĐĩ, ŅĐĩĐŧ вОСвŅаŅаŅŅ ŅĐģОваŅŅ.
+
+ĐŅĐž ĐŋĐžŅĐžĐŧŅ, ŅŅĐž ĐŋĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ FastAPI ĐŋŅОвĐĩŅŅĐĩŅ ĐēаĐļĐ´ŅĐš ŅĐģĐĩĐŧĐĩĐŊŅ Đ˛ĐŊŅŅŅи и ŅĐąĐĩĐļдаĐĩŅŅŅ, ŅŅĐž ĐžĐŊ ŅĐĩŅиаĐģиСŅĐĩĐŧ в JSON, иŅĐŋĐžĐģŅСŅŅ ŅĐžŅ ĐļĐĩ [JSON Compatible Encoder](../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-ĐžŅвĐĩŅ { #html-response }
+
+ЧŅĐžĐąŅ Đ˛ĐĩŅĐŊŅŅŅ ĐžŅвĐĩŅ Ņ HTML ĐŊаĐŋŅŅĐŧŅŅ Đ¸Đˇ **FastAPI**, иŅĐŋĐžĐģŅСŅĐšŅĐĩ `HTMLResponse`.
+
+- ĐĐŧĐŋĐžŅŅиŅŅĐšŅĐĩ `HTMLResponse`.
+- ĐĐĩŅĐĩдаКŅĐĩ `HTMLResponse` в ĐŋаŅаĐŧĐĩŅŅ `response_class` ваŅĐĩĐŗĐž Đ´ĐĩĐēĐžŅаŅĐžŅа ĐžĐŋĐĩŅаŅии ĐŋŅŅи.
+
+{* ../../docs_src/custom_response/tutorial002.py hl[2,7] *}
+
+/// info | ĐĐŊŅĐžŅĐŧаŅиŅ
+
+ĐаŅаĐŧĐĩŅŅ `response_class` ŅаĐēĐļĐĩ иŅĐŋĐžĐģŅСŅĐĩŅŅŅ Đ´ĐģŅ ŅĐēаСаĐŊĐ¸Ņ ÂĢŅиĐŋа ŅОдĐĩŅĐļиĐŧĐžĐŗĐžÂģ ĐžŅвĐĩŅа.
+
+Đ ŅŅĐžĐŧ ŅĐģŅŅаĐĩ HTTP-ĐˇĐ°ĐŗĐžĐģОвОĐē `Content-Type` ĐąŅĐ´ĐĩŅ ŅŅŅаĐŊОвĐģĐĩĐŊ в `text/html`.
+
+Đ ŅŅĐž ĐąŅĐ´ĐĩŅ ĐˇĐ°Đ´ĐžĐēŅĐŧĐĩĐŊŅиŅОваĐŊĐž ĐēаĐē ŅаĐēОвОĐĩ в OpenAPI.
+
+///
+
+### ĐĐĩŅĐŊŅŅŅ `Response` { #return-a-response }
+
+ĐаĐē ĐŋĐžĐēаСаĐŊĐž в ŅаСдĐĩĐģĐĩ [ĐĐĩŅĐŊŅŅŅ 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` { #document-in-openapi-and-override-response }
+
+ĐŅĐģи Đ˛Ņ Ņ
ĐžŅиŅĐĩ ĐŋĐĩŅĐĩĐžĐŋŅĐĩĐ´ĐĩĐģиŅŅ ĐžŅвĐĩŅ Đ˛ĐŊŅŅŅи ŅŅĐŊĐēŅии, ĐŊĐž ĐŋŅи ŅŅĐžĐŧ СадОĐēŅĐŧĐĩĐŊŅиŅОваŅŅ ÂĢŅиĐŋ ŅОдĐĩŅĐļиĐŧĐžĐŗĐžÂģ в OpenAPI, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ ĐŋаŅаĐŧĐĩŅŅ `response_class` РвĐĩŅĐŊŅŅŅ ĐžĐąŅĐĩĐēŅ `Response`.
+
+ĐĸĐžĐŗĐ´Đ° `response_class` ĐąŅĐ´ĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅŅŅ ŅĐžĐģŅĐēĐž Đ´ĐģŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅиŅОваĐŊĐ¸Ņ *ĐžĐŋĐĩŅаŅии ĐŋŅŅи* в OpenAPI, а Đ˛Đ°Ņ `Response` ĐąŅĐ´ĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваĐŊ ĐēаĐē ĐĩŅŅŅ.
+
+#### ĐĐĩŅĐŊŅŅŅ `HTMLResponse` ĐŊаĐŋŅŅĐŧŅŅ { #return-an-htmlresponse-directly }
+
+ĐаĐŋŅиĐŧĐĩŅ, ŅŅĐž ĐŧĐžĐļĐĩŅ ĐąŅŅŅ ŅŅĐž-ŅĐž вŅОдĐĩ:
+
+{* ../../docs_src/custom_response/tutorial004.py hl[7,21,23] *}
+
+Đ ŅŅĐžĐŧ ĐŋŅиĐŧĐĩŅĐĩ ŅŅĐŊĐēŅĐ¸Ņ `generate_html_response()` ŅĐļĐĩ ĐŗĐĩĐŊĐĩŅиŅŅĐĩŅ Đ¸ вОСвŅаŅаĐĩŅ `Response` вĐŧĐĩŅŅĐž вОСвŅаŅа HTML в `str`.
+
+ĐОСвŅаŅĐ°Ņ ŅĐĩСŅĐģŅŅĐ°Ņ Đ˛ŅСОва `generate_html_response()`, Đ˛Ņ ŅĐļĐĩ вОСвŅаŅаĐĩŅĐĩ `Response`, ĐēĐžŅĐžŅŅĐš ĐŋĐĩŅĐĩĐžĐŋŅĐĩĐ´ĐĩĐģĐ¸Ņ ĐŋОвĐĩĐ´ĐĩĐŊиĐĩ **FastAPI** ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ.
+
+ĐĐž ĐŋĐžŅĐēĐžĐģŅĐēŅ Đ˛Ņ ŅаĐēĐļĐĩ ĐŋĐĩŅĐĩдаĐģи `HTMLResponse` в `response_class`, **FastAPI** ĐąŅĐ´ĐĩŅ ĐˇĐŊаŅŅ, ĐēаĐē СадОĐēŅĐŧĐĩĐŊŅиŅОваŅŅ ŅŅĐž в OpenAPI и иĐŊŅĐĩŅаĐēŅивĐŊОК Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии ĐēаĐē HTML Ņ `text/html`:
+
+
+
+## ĐĐžŅŅŅĐŋĐŊŅĐĩ ĐžŅвĐĩŅŅ { #available-responses }
+
+ĐиĐļĐĩ ĐŋĐĩŅĐĩŅиŅĐģĐĩĐŊŅ ĐŊĐĩĐēĐžŅĐžŅŅĐĩ Đ´ĐžŅŅŅĐŋĐŊŅĐĩ ĐēĐģаŅŅŅ ĐžŅвĐĩŅОв.
+
+ĐŖŅŅиŅĐĩ, ŅŅĐž Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ `Response`, ŅŅĐžĐąŅ Đ˛ĐĩŅĐŊŅŅŅ ŅŅĐž ŅĐŗĐžĐ´ĐŊĐž ĐĩŅŅ, иĐģи даĐļĐĩ ŅОСдаŅŅ ŅОйŅŅвĐĩĐŊĐŊŅĐš ĐŋОдĐēĐģаŅŅ.
+
+/// note | ĐĸĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ Đ´ĐĩŅаĐģи
+
+ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐŗĐģи ĐąŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ `from starlette.responses import HTMLResponse`.
+
+**FastAPI** ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ ŅĐĩ ĐļĐĩ `starlette.responses` ĐēаĐē `fastapi.responses` Đ´ĐģŅ Đ˛Đ°ŅĐĩĐŗĐž ŅдОйŅŅва ĐēаĐē ŅаСŅайОŅŅиĐēа. ĐĐž йОĐģŅŅиĐŊŅŅвО Đ´ĐžŅŅŅĐŋĐŊŅŅ
ĐēĐģаŅŅОв ĐžŅвĐĩŅОв ĐŋŅиŅ
ОдŅŅ ĐŊĐĩĐŋĐžŅŅĐĩĐ´ŅŅвĐĩĐŊĐŊĐž иС Starlette.
+
+///
+
+### `Response` { #response }
+
+ĐаСОвŅĐš ĐēĐģаŅŅ `Response`, ĐžŅ ĐŊĐĩĐŗĐž ĐŊаŅĐģĐĩĐ´ŅŅŅŅŅ Đ˛ŅĐĩ ĐžŅŅаĐģŅĐŊŅĐĩ ĐžŅвĐĩŅŅ.
+
+ĐĐŗĐž ĐŧĐžĐļĐŊĐž вОСвŅаŅаŅŅ ĐŊаĐŋŅŅĐŧŅŅ.
+
+ĐĐŊ ĐŋŅиĐŊиĐŧаĐĩŅ ŅĐģĐĩĐ´ŅŅŅиĐĩ ĐŋаŅаĐŧĐĩŅŅŅ:
+
+- `content` â `str` иĐģи `bytes`.
+- `status_code` â ŅĐĩĐģĐžĐĩ ŅиŅĐģĐž, HTTP ŅŅаŅŅŅ-ĐēОд.
+- `headers` â ŅĐģОваŅŅ ŅŅŅĐžĐē.
+- `media_type` â ŅŅŅĐžĐēа, СадаŅŅĐ°Ņ ŅиĐŋ ŅОдĐĩŅĐļиĐŧĐžĐŗĐž. ĐаĐŋŅиĐŧĐĩŅ, `"text/html"`.
+
+FastAPI (ŅаĐēŅиŅĐĩŅĐēи Starlette) авŅĐžĐŧаŅиŅĐĩŅĐēи Đ´ĐžĐąĐ°Đ˛Đ¸Ņ ĐˇĐ°ĐŗĐžĐģОвОĐē Content-Length. ĐĸаĐēĐļĐĩ ĐąŅĐ´ĐĩŅ Đ´ĐžĐąĐ°Đ˛ĐģĐĩĐŊ ĐˇĐ°ĐŗĐžĐģОвОĐē Content-Type, ĐžŅĐŊОваĐŊĐŊŅĐš ĐŊа `media_type` и Ņ Đ´ĐžĐąĐ°Đ˛ĐģĐĩĐŊиĐĩĐŧ charset Đ´ĐģŅ ŅĐĩĐēŅŅОвŅŅ
ŅиĐŋОв.
+
+{* ../../docs_src/response_directly/tutorial002.py hl[1,18] *}
+
+### `HTMLResponse` { #htmlresponse }
+
+ĐŅиĐŊиĐŧаĐĩŅ ŅĐĩĐēŅŅ Đ¸Đģи йаКŅŅ Đ¸ вОСвŅаŅаĐĩŅ HTML-ĐžŅвĐĩŅ, ĐēаĐē ĐžĐŋиŅаĐŊĐž вŅŅĐĩ.
+
+### `PlainTextResponse` { #plaintextresponse }
+
+ĐŅиĐŊиĐŧаĐĩŅ ŅĐĩĐēŅŅ Đ¸Đģи йаКŅŅ Đ¸ вОСвŅаŅаĐĩŅ ĐžŅвĐĩŅ Đ˛ видĐĩ ĐŋŅĐžŅŅĐžĐŗĐž ŅĐĩĐēŅŅа.
+
+{* ../../docs_src/custom_response/tutorial005.py hl[2,7,9] *}
+
+### `JSONResponse` { #jsonresponse }
+
+ĐŅиĐŊиĐŧаĐĩŅ Đ´Đ°ĐŊĐŊŅĐĩ и вОСвŅаŅаĐĩŅ ĐžŅвĐĩŅ, ĐēОдиŅОваĐŊĐŊŅĐš ĐēаĐē `application/json`.
+
+ĐŅĐž ĐžŅвĐĩŅ ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ, иŅĐŋĐžĐģŅСŅĐĩĐŧŅĐš в **FastAPI**, ĐēаĐē ĐąŅĐģĐž ŅĐēаСаĐŊĐž вŅŅĐĩ.
+
+### `ORJSONResponse` { #orjsonresponse }
+
+ĐŅŅŅŅĐ°Ņ Đ°ĐģŅŅĐĩŅĐŊаŅивĐŊĐ°Ņ ŅĐĩаĐģиСаŅĐ¸Ņ JSON-ĐžŅвĐĩŅа Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩĐŧ `orjson`, ĐēаĐē ĐąŅĐģĐž ŅĐēаСаĐŊĐž вŅŅĐĩ.
+
+/// info | ĐĐŊŅĐžŅĐŧаŅиŅ
+
+ĐĸŅĐĩĐąŅĐĩŅŅŅ ŅŅŅаĐŊОвĐēа `orjson`, ĐŊаĐŋŅиĐŧĐĩŅ ĐēĐžĐŧаĐŊдОК `pip install orjson`.
+
+///
+
+### `UJSONResponse` { #ujsonresponse }
+
+ĐĐģŅŅĐĩŅĐŊаŅивĐŊĐ°Ņ ŅĐĩаĐģиСаŅĐ¸Ņ JSON-ĐžŅвĐĩŅа Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩĐŧ `ujson`.
+
+/// info | ĐĐŊŅĐžŅĐŧаŅиŅ
+
+ĐĸŅĐĩĐąŅĐĩŅŅŅ ŅŅŅаĐŊОвĐēа `ujson`, ĐŊаĐŋŅиĐŧĐĩŅ ĐēĐžĐŧаĐŊдОК `pip install ujson`.
+
+///
+
+/// warning | ĐŅĐĩĐ´ŅĐŋŅĐĩĐļĐ´ĐĩĐŊиĐĩ
+
+`ujson` ĐŧĐĩĐŊĐĩĐĩ аĐēĐēŅŅаŅĐĩĐŊ, ŅĐĩĐŧ вŅŅŅĐžĐĩĐŊĐŊĐ°Ņ ŅĐĩаĐģиСаŅĐ¸Ņ Python, в ОйŅайОŅĐēĐĩ ĐŊĐĩĐēĐžŅĐžŅŅŅ
ĐēŅаКĐŊиŅ
ŅĐģŅŅаĐĩв.
+
+///
+
+{* ../../docs_src/custom_response/tutorial001.py hl[2,7] *}
+
+/// tip | ХОвĐĩŅ
+
+ĐОСĐŧĐžĐļĐŊĐž, `ORJSONResponse` ĐžĐēаĐļĐĩŅŅŅ ĐąĐžĐģĐĩĐĩ ĐąŅŅŅŅŅĐŧ ваŅиаĐŊŅĐžĐŧ.
+
+///
+
+### `RedirectResponse` { #redirectresponse }
+
+ĐОСвŅаŅаĐĩŅ HTTP-ŅĐĩдиŅĐĩĐēŅ. ĐĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ Đ¸ŅĐŋĐžĐģŅСŅĐĩŅ ŅŅаŅŅŅ-ĐēОд 307 (Temporary Redirect â вŅĐĩĐŧĐĩĐŊĐŊĐžĐĩ ĐŋĐĩŅĐĩĐŊаĐŋŅавĐģĐĩĐŊиĐĩ).
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ вĐĩŅĐŊŅŅŅ `RedirectResponse` ĐŊаĐŋŅŅĐŧŅŅ:
+
+{* ../../docs_src/custom_response/tutorial006.py hl[2,9] *}
+
+---
+
+ĐĐģи ĐŧĐžĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ ĐĩĐŗĐž в ĐŋаŅаĐŧĐĩŅŅĐĩ `response_class`:
+
+{* ../../docs_src/custom_response/tutorial006b.py hl[2,7,9] *}
+
+ĐŅĐģи Đ˛Ņ ŅĐ´ĐĩĐģаĐĩŅĐĩ ŅаĐē, ŅĐž ŅĐŧĐžĐļĐĩŅĐĩ вОСвŅаŅаŅŅ URL ĐŊаĐŋŅŅĐŧŅŅ Đ¸Đˇ ŅвОĐĩĐš ŅŅĐŊĐēŅии-ОйŅайОŅŅиĐēа ĐŋŅŅи.
+
+Đ ŅŅĐžĐŧ ŅĐģŅŅаĐĩ ĐąŅĐ´ĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваĐŊ ŅŅаŅŅŅ-ĐēОд ĐŋĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ Đ´ĐģŅ `RedirectResponse`, ŅĐž ĐĩŅŅŅ `307`.
+
+---
+
+ĐĸаĐēĐļĐĩ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ ĐŋаŅаĐŧĐĩŅŅ `status_code` в ŅĐžŅĐĩŅаĐŊии Ņ ĐŋаŅаĐŧĐĩŅŅĐžĐŧ `response_class`:
+
+{* ../../docs_src/custom_response/tutorial006c.py hl[2,7,9] *}
+
+### `StreamingResponse` { #streamingresponse }
+
+ĐŅиĐŊиĐŧаĐĩŅ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš ĐŗĐĩĐŊĐĩŅаŅĐžŅ Đ¸Đģи ОйŅŅĐŊŅĐš ĐŗĐĩĐŊĐĩŅаŅĐžŅ/иŅĐĩŅаŅĐžŅ Đ¸ ĐžŅĐŋŅавĐģŅĐĩŅ ŅĐĩĐģĐž ĐžŅвĐĩŅа ĐŋĐžŅĐžĐēОвО.
+
+{* ../../docs_src/custom_response/tutorial007.py hl[2,14] *}
+
+#### ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ `StreamingResponse` Ņ ŅаКĐģĐžĐŋОдОйĐŊŅĐŧи ОйŅĐĩĐēŅаĐŧи { #using-streamingresponse-with-file-like-objects }
+
+ĐŅĐģи Ņ Đ˛Đ°Ņ ĐĩŅŅŅ ŅаКĐģĐžĐŋОдОйĐŊŅĐš ОйŅĐĩĐēŅ (ĐŊаĐŋŅиĐŧĐĩŅ, ОйŅĐĩĐēŅ, вОСвŅаŅаĐĩĐŧŅĐš `open()`), Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅОСдаŅŅ ŅŅĐŊĐēŅиŅ-ĐŗĐĩĐŊĐĩŅаŅĐžŅ Đ´ĐģŅ Đ¸ŅĐĩŅаŅии ĐŋĐž ŅŅĐžĐŧŅ ŅаКĐģĐžĐŋОдОйĐŊĐžĐŧŅ ĐžĐąŅĐĩĐēŅŅ.
+
+ĐĸаĐēиĐŧ ОйŅаСОĐŧ, ваĐŧ ĐŊĐĩ ĐŊŅĐļĐŊĐž ŅĐŊаŅаĐģа ŅиŅаŅŅ Đ˛ŅŅ Đ˛ ĐŋаĐŧŅŅŅ, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐŋĐĩŅĐĩдаŅŅ ŅŅŅ ŅŅĐŊĐēŅиŅ-ĐŗĐĩĐŊĐĩŅаŅĐžŅ Đ˛ `StreamingResponse` и вĐĩŅĐŊŅŅŅ ĐĩĐŗĐž.
+
+ĐŅĐž вĐēĐģŅŅаĐĩŅ ĐŧĐŊĐžĐŗĐ¸Đĩ йийĐģиОŅĐĩĐēи Đ´ĐģŅ ŅайОŅŅ Ņ ĐžĐąĐģаŅĐŊŅĐŧ Ņ
ŅаĐŊиĐģиŅĐĩĐŧ, ОйŅайОŅĐēи видĐĩĐž и Ņ.Đ´.
+
+{* ../../docs_src/custom_response/tutorial008.py hl[2,10:12,14] *}
+
+1. ĐŅĐž ŅŅĐŊĐēŅиŅ-ĐŗĐĩĐŊĐĩŅаŅĐžŅ. ĐĐŊа ŅвĐģŅĐĩŅŅŅ ÂĢŅŅĐŊĐēŅиĐĩĐš-ĐŗĐĩĐŊĐĩŅаŅĐžŅĐžĐŧÂģ, ĐŋĐžŅĐžĐŧŅ ŅŅĐž ŅОдĐĩŅĐļĐ¸Ņ ĐžĐŋĐĩŅаŅĐžŅ(Ņ) `yield` вĐŊŅŅŅи.
+2. ĐŅĐŋĐžĐģŅСŅŅ ĐąĐģĐžĐē `with`, ĐŧŅ ĐŗĐ°ŅаĐŊŅиŅŅĐĩĐŧ, ŅŅĐž ŅаКĐģĐžĐŋОдОйĐŊŅĐš ОйŅĐĩĐēŅ ĐąŅĐ´ĐĩŅ ĐˇĐ°ĐēŅŅŅ ĐŋĐžŅĐģĐĩ СавĐĩŅŅĐĩĐŊĐ¸Ņ ŅайОŅŅ ŅŅĐŊĐēŅии-ĐŗĐĩĐŊĐĩŅаŅĐžŅа. ĐĸĐž ĐĩŅŅŅ ĐŋĐžŅĐģĐĩ ŅĐžĐŗĐž, ĐēаĐē ĐžĐŊа СаĐēĐžĐŊŅĐ¸Ņ ĐžŅĐŋŅавĐēŅ ĐžŅвĐĩŅа.
+3. ĐŅĐžŅ `yield from` ĐŗĐžĐ˛ĐžŅĐ¸Ņ ŅŅĐŊĐēŅии иŅĐĩŅиŅОваŅŅŅŅ ĐŋĐž ОйŅĐĩĐēŅŅ Ņ Đ¸ĐŧĐĩĐŊĐĩĐŧ `file_like`. РСаŅĐĩĐŧ, Đ´ĐģŅ ĐēаĐļдОК иŅĐĩŅаŅии, ĐžŅдаваŅŅ ŅŅŅ ŅаŅŅŅ ĐēаĐē иŅŅ
ОдŅŅŅŅ Đ¸Đˇ ŅŅОК ŅŅĐŊĐēŅии-ĐŗĐĩĐŊĐĩŅаŅĐžŅа (`iterfile`).
+
+ ĐĸаĐēиĐŧ ОйŅаСОĐŧ, ŅŅĐž ŅŅĐŊĐēŅиŅ-ĐŗĐĩĐŊĐĩŅаŅĐžŅ, ĐēĐžŅĐžŅĐ°Ņ Đ˛ĐŊŅŅŅĐĩĐŊĐŊĐĩ ĐŋĐĩŅĐĩдаŅŅ ŅайОŅŅ ĐŋĐž ÂĢĐŗĐĩĐŊĐĩŅаŅииÂģ ŅĐĩĐŧŅ-ŅĐž Đ´ŅŅĐŗĐžĐŧŅ.
+
+ ĐĐĩĐģĐ°Ņ ŅŅĐž ŅаĐēиĐŧ ОйŅаСОĐŧ, ĐŧŅ ĐŧĐžĐļĐĩĐŧ ĐŋĐžĐŧĐĩŅŅиŅŅ ĐĩŅ Đ˛ ĐąĐģĐžĐē `with` и ŅĐĩĐŧ ŅаĐŧŅĐŧ ĐŗĐ°ŅаĐŊŅиŅОваŅŅ, ŅŅĐž ŅаКĐģĐžĐŋОдОйĐŊŅĐš ОйŅĐĩĐēŅ ĐąŅĐ´ĐĩŅ ĐˇĐ°ĐēŅŅŅ ĐŋĐžŅĐģĐĩ СавĐĩŅŅĐĩĐŊиŅ.
+
+/// tip | ХОвĐĩŅ
+
+ĐаĐŧĐĩŅŅŅĐĩ, ŅŅĐž СдĐĩŅŅ ĐŧŅ Đ¸ŅĐŋĐžĐģŅСŅĐĩĐŧ ŅŅаĐŊдаŅŅĐŊŅĐš `open()`, ĐēĐžŅĐžŅŅĐš ĐŊĐĩ ĐŋОддĐĩŅĐļиваĐĩŅ `async` и `await`, ĐŋĐžŅŅĐžĐŧŅ ĐžĐąŅŅвĐģŅĐĩĐŧ ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи ОйŅŅĐŊОК `def`.
+
+///
+
+### `FileResponse` { #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] *}
+
+Đ ŅŅĐžĐŧ ŅĐģŅŅаĐĩ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ вОСвŅаŅаŅŅ ĐŋŅŅŅ Đē ŅаКĐģŅ ĐŊаĐŋŅŅĐŧŅŅ Đ¸Đˇ ŅвОĐĩĐš ŅŅĐŊĐēŅии-ОйŅайОŅŅиĐēа ĐŋŅŅи.
+
+## ĐĐžĐģŅСОваŅĐĩĐģŅŅĐēиК ĐēĐģаŅŅ ĐžŅвĐĩŅа { #custom-response-class }
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ŅОСдаŅŅ ŅОйŅŅвĐĩĐŊĐŊŅĐš ĐēĐģаŅŅ ĐžŅвĐĩŅа, ŅĐŊаŅĐģĐĩдОвавŅиŅŅ ĐžŅ `Response`, и иŅĐŋĐžĐģŅСОваŅŅ ĐĩĐŗĐž.
+
+ĐаĐŋŅиĐŧĐĩŅ, ĐŋŅĐĩĐ´ĐŋĐžĐģĐžĐļиĐŧ, ŅŅĐž Đ˛Ņ Ņ
ĐžŅиŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ `orjson`, ĐŊĐž Ņ ĐŊĐĩĐēĐžŅĐžŅŅĐŧи ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиĐŧи ĐŊаŅŅŅОКĐēаĐŧи, ĐēĐžŅĐžŅŅĐĩ ĐŊĐĩ иŅĐŋĐžĐģŅСŅŅŅŅŅ Đ˛Đž вŅŅŅĐžĐĩĐŊĐŊĐžĐŧ ĐēĐģаŅŅĐĩ `ORJSONResponse`.
+
+ĐĄĐēаĐļĐĩĐŧ, Đ˛Ņ Ņ
ĐžŅиŅĐĩ, ŅŅĐžĐąŅ Đ˛ĐžĐˇĐ˛ŅаŅаĐģŅŅ ĐžŅŅĐžŅĐŧаŅиŅОваĐŊĐŊŅĐš JSON Ņ ĐžŅŅŅŅĐŋаĐŧи, ŅĐž ĐĩŅŅŅ Ņ
ĐžŅиŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ ĐžĐŋŅĐ¸Ņ orjson `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. đ
+
+## ĐĐģаŅŅ ĐžŅвĐĩŅа ĐŋĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ { #default-response-class }
+
+ĐŅи ŅОСдаĐŊии ŅĐēСĐĩĐŧĐŋĐģŅŅа ĐēĐģаŅŅа **FastAPI** иĐģи `APIRouter` Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅĐēаСаŅŅ, ĐēаĐēОК ĐēĐģаŅŅ ĐžŅвĐĩŅа иŅĐŋĐžĐģŅСОваŅŅ ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ.
+
+ĐаŅаĐŧĐĩŅŅ, ĐēĐžŅĐžŅŅĐš ŅŅĐž ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐĩŅ, â `default_response_class`.
+
+Đ ĐŋŅиĐŧĐĩŅĐĩ ĐŊиĐļĐĩ **FastAPI** ĐąŅĐ´ĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ `ORJSONResponse` ĐŋĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ Đ˛Đž вŅĐĩŅ
ĐžĐŋĐĩŅаŅиŅŅ
ĐŋŅŅи вĐŧĐĩŅŅĐž `JSONResponse`.
+
+{* ../../docs_src/custom_response/tutorial010.py hl[2,4] *}
+
+/// tip | ХОвĐĩŅ
+
+ĐŅ ĐŋĐž-ĐŋŅĐĩĐļĐŊĐĩĐŧŅ ĐŧĐžĐļĐĩŅĐĩ ĐŋĐĩŅĐĩĐžĐŋŅĐĩĐ´ĐĩĐģŅŅŅ `response_class` в ĐžĐŋĐĩŅаŅиŅŅ
ĐŋŅŅи, ĐēаĐē и ŅаĐŊŅŅĐĩ.
+
+///
+
+## ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊĐ°Ņ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ { #additional-documentation }
+
+ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ ОйŅŅвиŅŅ ŅиĐŋ ŅОдĐĩŅĐļиĐŧĐžĐŗĐž и ĐŧĐŊĐžĐŗĐ¸Đĩ Đ´ŅŅĐŗĐ¸Đĩ Đ´ĐĩŅаĐģи в OpenAPI Ņ ĐŋĐžĐŧĐžŅŅŅ `responses`: [ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ĐžŅвĐĩŅŅ Đ˛ OpenAPI](additional-responses.md){.internal-link target=_blank}.
diff --git a/docs/ru/docs/advanced/dataclasses.md b/docs/ru/docs/advanced/dataclasses.md
new file mode 100644
index 000000000..816f74404
--- /dev/null
+++ b/docs/ru/docs/advanced/dataclasses.md
@@ -0,0 +1,95 @@
+# ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ dataclasses { #using-dataclasses }
+
+FastAPI ĐŋĐžŅŅŅĐžĐĩĐŊ ĐŋОвĐĩŅŅ
**Pydantic**, и Ņ ĐŋĐžĐēаСŅваĐģ ваĐŧ, ĐēаĐē иŅĐŋĐžĐģŅСОваŅŅ Pydantic-ĐŧОдĐĩĐģи Đ´ĐģŅ ĐžĐąŅŅвĐģĐĩĐŊĐ¸Ņ HTTP-СаĐŋŅĐžŅОв и HTTP-ĐžŅвĐĩŅОв.
+
+ĐĐž FastAPI ŅаĐēĐļĐĩ ĐŋОддĐĩŅĐļиваĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩ `dataclasses` ŅĐĩĐŧ ĐļĐĩ ŅĐŋĐžŅОйОĐŧ:
+
+{* ../../docs_src/dataclasses/tutorial001.py hl[1,7:12,19:20] *}
+
+ĐŅĐž ĐŋĐž-ĐŋŅĐĩĐļĐŊĐĩĐŧŅ ĐŋОддĐĩŅĐļиваĐĩŅŅŅ ĐąĐģĐ°ĐŗĐžĐ´Đ°ŅŅ **Pydantic**, ŅаĐē ĐēаĐē в ĐŊŅĐŧ ĐĩŅŅŅ Đ˛ŅŅŅĐžĐĩĐŊĐŊĐ°Ņ ĐŋОддĐĩŅĐļĐēа `dataclasses`.
+
+ĐĸаĐē ŅŅĐž даĐļĐĩ ĐĩŅĐģи в ĐēОдĐĩ вŅŅĐĩ Pydantic ĐŊĐĩ иŅĐŋĐžĐģŅСŅĐĩŅŅŅ ŅвĐŊĐž, FastAPI иŅĐŋĐžĐģŅСŅĐĩŅ Pydantic, ŅŅĐžĐąŅ ĐēĐžĐŊвĐĩŅŅиŅОваŅŅ ŅŅаĐŊдаŅŅĐŊŅĐĩ dataclasses в ŅОйŅŅвĐĩĐŊĐŊŅĐš ваŅиаĐŊŅ dataclasses ĐžŅ Pydantic.
+
+Đ, ĐēĐžĐŊĐĩŅĐŊĐž, ĐŋОддĐĩŅĐļиваŅŅŅŅ ŅĐĩ ĐļĐĩ вОСĐŧĐžĐļĐŊĐžŅŅи:
+
+- ваĐģидаŅĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
+- ŅĐĩŅиаĐģиСаŅĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
+- Đ´ĐžĐēŅĐŧĐĩĐŊŅиŅОваĐŊиĐĩ даĐŊĐŊŅŅ
и Ņ.Đ´.
+
+ĐŅĐž ŅайОŅаĐĩŅ ŅаĐē ĐļĐĩ, ĐēаĐē Ņ Pydantic-ĐŧОдĐĩĐģŅĐŧи. Đ ĐŊа ŅаĐŧĐžĐŧ Đ´ĐĩĐģĐĩ ĐŋОд ĐēаĐŋĐžŅĐžĐŧ ŅŅĐž Đ´ĐžŅŅĐ¸ĐŗĐ°ĐĩŅŅŅ ŅĐĩĐŧ ĐļĐĩ ОйŅаСОĐŧ, Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩĐŧ Pydantic.
+
+/// info | ĐĐŊŅĐžŅĐŧаŅиŅ
+
+ĐĐžĐŧĐŊиŅĐĩ, ŅŅĐž dataclasses ĐŊĐĩ ŅĐŧĐĩŅŅ Đ˛ŅĐĩĐŗĐž ŅĐžĐŗĐž, ŅŅĐž ŅĐŧĐĩŅŅ Pydantic-ĐŧОдĐĩĐģи.
+
+ĐĐžŅŅĐžĐŧŅ Đ˛Đ°Đŧ вŅŅ ĐĩŅŅ ĐŧĐžĐļĐĩŅ ĐŋĐžŅŅĐĩйОваŅŅŅŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ Pydantic-ĐŧОдĐĩĐģи.
+
+ĐĐž ĐĩŅĐģи Ņ Đ˛Đ°Ņ ŅĐļĐĩ ĐĩŅŅŅ ĐŊĐ°ĐąĐžŅ dataclasses, ŅŅĐž ĐŋĐžĐģĐĩСĐŊŅĐš ĐŋŅиŅĐŧ â СадĐĩĐšŅŅвОваŅŅ Đ¸Ņ
Đ´ĐģŅ Đ˛ĐĩĐą-API ĐŊа FastAPI. đ¤
+
+///
+
+## Dataclasses в `response_model` { #dataclasses-in-response-model }
+
+ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ `dataclasses` в ĐŋаŅаĐŧĐĩŅŅĐĩ `response_model`:
+
+{* ../../docs_src/dataclasses/tutorial002.py hl[1,7:13,19] *}
+
+ĐŅĐžŅ dataclass ĐąŅĐ´ĐĩŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēи ĐŋŅĐĩОйŅаСОваĐŊ в Pydantic dataclass.
+
+ĐĸаĐēиĐŧ ОйŅаСОĐŧ, ĐĩĐŗĐž ŅŅ
ĐĩĐŧа ĐŋĐžŅвиŅŅŅ Đ˛ иĐŊŅĐĩŅŅĐĩĐšŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии API:
+
+
+
+## Dataclasses вО вĐģĐžĐļĐĩĐŊĐŊŅŅ
ŅŅŅŅĐēŅŅŅаŅ
даĐŊĐŊŅŅ
{ #dataclasses-in-nested-data-structures }
+
+ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ ĐēĐžĐŧйиĐŊиŅОваŅŅ `dataclasses` Ņ Đ´ŅŅĐŗĐ¸Đŧи аĐŊĐŊĐžŅаŅиŅĐŧи ŅиĐŋОв, ŅŅĐžĐąŅ ŅОСдаваŅŅ Đ˛ĐģĐžĐļĐĩĐŊĐŊŅĐĩ ŅŅŅŅĐēŅŅŅŅ Đ´Đ°ĐŊĐŊŅŅ
.
+
+Đ ĐŊĐĩĐēĐžŅĐžŅŅŅ
ŅĐģŅŅаŅŅ
ваĐŧ вŅŅ ĐļĐĩ ĐŧĐžĐļĐĩŅ ĐŋĐžĐŊадОйиŅŅŅŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ Đ˛ĐĩŅŅĐ¸Ņ `dataclasses` иС Pydantic. ĐаĐŋŅиĐŧĐĩŅ, ĐĩŅĐģи Ņ Đ˛Đ°Ņ Đ˛ĐžĐˇĐŊиĐēаŅŅ ĐžŅийĐēи Ņ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēи ĐŗĐĩĐŊĐĩŅиŅŅĐĩĐŧОК Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиĐĩĐš API.
+
+Đ ŅаĐēĐžĐŧ ŅĐģŅŅаĐĩ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐŋŅĐžŅŅĐž СаĐŧĐĩĐŊиŅŅ ŅŅаĐŊдаŅŅĐŊŅĐĩ `dataclasses` ĐŊа `pydantic.dataclasses`, ĐēĐžŅĐžŅĐ°Ņ ŅвĐģŅĐĩŅŅŅ ĐŋĐžĐģĐŊĐžŅŅŅŅ ŅОвĐŧĐĩŅŅиĐŧОК СаĐŧĐĩĐŊОК (drop-in replacement):
+
+{* ../../docs_src/dataclasses/tutorial003.py hl[1,5,8:11,14:17,23:25,28] *}
+
+1. ĐŅ ĐŋĐž-ĐŋŅĐĩĐļĐŊĐĩĐŧŅ Đ¸ĐŧĐŋĐžŅŅиŅŅĐĩĐŧ `field` иС ŅŅаĐŊдаŅŅĐŊŅŅ
`dataclasses`.
+
+2. `pydantic.dataclasses` â ĐŋĐžĐģĐŊĐžŅŅŅŅ ŅОвĐŧĐĩŅŅиĐŧĐ°Ņ ĐˇĐ°ĐŧĐĩĐŊа (drop-in replacement) Đ´ĐģŅ `dataclasses`.
+
+3. Dataclass `Author` ŅОдĐĩŅĐļĐ¸Ņ ŅĐŋиŅĐžĐē dataclass `Item`.
+
+4. Dataclass `Author` иŅĐŋĐžĐģŅСŅĐĩŅŅŅ Đ˛ ĐŋаŅаĐŧĐĩŅŅĐĩ `response_model`.
+
+5. ĐŅ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ Đ¸ Đ´ŅŅĐŗĐ¸Đĩ ŅŅаĐŊдаŅŅĐŊŅĐĩ аĐŊĐŊĐžŅаŅии ŅиĐŋОв вĐŧĐĩŅŅĐĩ Ņ dataclasses в ĐēаŅĐĩŅŅвĐĩ ŅĐĩĐģа СаĐŋŅĐžŅа.
+
+ Đ ŅŅĐžĐŧ ŅĐģŅŅаĐĩ ŅŅĐž ŅĐŋиŅĐžĐē dataclass `Item`.
+
+6. ĐĐ´ĐĩŅŅ ĐŧŅ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩĐŧ ŅĐģОваŅŅ, ŅОдĐĩŅĐļаŅиК `items`, ĐēĐžŅĐžŅŅĐš ŅвĐģŅĐĩŅŅŅ ŅĐŋиŅĐēĐžĐŧ dataclass.
+
+ FastAPI ĐŋĐž-ĐŋŅĐĩĐļĐŊĐĩĐŧŅ ŅĐŋĐžŅОйĐĩĐŊ ŅĐĩŅиаĐģиСОваŅŅ Đ´Đ°ĐŊĐŊŅĐĩ в JSON.
+
+7. ĐĐ´ĐĩŅŅ `response_model` иŅĐŋĐžĐģŅСŅĐĩŅ Đ°ĐŊĐŊĐžŅаŅĐ¸Ņ ŅиĐŋа â ŅĐŋиŅĐžĐē dataclass `Author`.
+
+ ĐĄĐŊОва, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐēĐžĐŧйиĐŊиŅОваŅŅ `dataclasses` ŅĐž ŅŅаĐŊдаŅŅĐŊŅĐŧи аĐŊĐŊĐžŅаŅиŅĐŧи ŅиĐŋОв.
+
+8. ĐĐąŅаŅиŅĐĩ вĐŊиĐŧаĐŊиĐĩ, ŅŅĐž ŅŅа *ŅŅĐŊĐēŅиŅ-ОйŅайОŅŅиĐē ĐŋŅŅи* иŅĐŋĐžĐģŅСŅĐĩŅ ĐžĐąŅŅĐŊŅĐš `def` вĐŧĐĩŅŅĐž `async def`.
+
+ ĐаĐē и вŅĐĩĐŗĐ´Đ° в FastAPI, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅĐžŅĐĩŅаŅŅ `def` и `async def` ĐŋĐž ĐŊĐĩОйŅ
ОдиĐŧĐžŅŅи.
+
+ ĐŅĐģи Ņ
ĐžŅиŅĐĩ ĐžŅвĐĩĐļиŅŅ Đ˛ ĐŋаĐŧŅŅи, ĐēĐžĐŗĐ´Đ° ŅŅĐž иŅĐŋĐžĐģŅСОваŅŅ, ĐŋĐžŅĐŧĐžŅŅиŅĐĩ ŅаСдĐĩĐģ _"ĐĐĩŅ Đ˛ŅĐĩĐŧĐĩĐŊи?"_ в Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии ĐŋŅĐž [`async` и `await`](../async.md#in-a-hurry){.internal-link target=_blank}.
+
+9. ĐŅа *ŅŅĐŊĐēŅиŅ-ОйŅайОŅŅиĐē ĐŋŅŅи* вОСвŅаŅаĐĩŅ ĐŊĐĩ dataclasses (Ņ
ĐžŅŅ ĐŧĐžĐŗĐģа ĐąŅ), а ŅĐŋиŅĐžĐē ŅĐģОваŅĐĩĐš Ņ Đ˛ĐŊŅŅŅĐĩĐŊĐŊиĐŧи даĐŊĐŊŅĐŧи.
+
+ FastAPI иŅĐŋĐžĐģŅСŅĐĩŅ ĐŋаŅаĐŧĐĩŅŅ `response_model` (в ĐēĐžŅĐžŅĐžĐŧ СадаĐŊŅ dataclasses), ŅŅĐžĐąŅ ĐŋŅĐĩОйŅаСОваŅŅ HTTP-ĐžŅвĐĩŅ.
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ĐēĐžĐŧйиĐŊиŅОваŅŅ `dataclasses` Ņ Đ´ŅŅĐŗĐ¸Đŧи аĐŊĐŊĐžŅаŅиŅĐŧи ŅиĐŋОв ĐŧĐŊĐžĐļĐĩŅŅвОĐŧ ŅĐŋĐžŅОйОв, ŅŅĐžĐąŅ ŅĐžŅĐŧиŅОваŅŅ ŅĐģĐžĐļĐŊŅĐĩ ŅŅŅŅĐēŅŅŅŅ Đ´Đ°ĐŊĐŊŅŅ
.
+
+ĐĄĐŧĐžŅŅиŅĐĩ ĐŋОдŅĐēаСĐēи в ĐēОдĐĩ вŅŅĐĩ, ŅŅĐžĐąŅ ŅвидĐĩŅŅ ĐąĐžĐģĐĩĐĩ ĐēĐžĐŊĐēŅĐĩŅĐŊŅĐĩ Đ´ĐĩŅаĐģи.
+
+## ĐŖĐˇĐŊаŅŅ ĐąĐžĐģŅŅĐĩ { #learn-more }
+
+ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ ĐēĐžĐŧйиĐŊиŅОваŅŅ `dataclasses` Ņ Đ´ŅŅĐŗĐ¸Đŧи Pydantic-ĐŧОдĐĩĐģŅĐŧи, ĐŊаŅĐģĐĩдОваŅŅŅŅ ĐžŅ ĐŊиŅ
, вĐēĐģŅŅаŅŅ Đ¸Ņ
в ŅвОи ĐŧОдĐĩĐģи и Ņ.Đ´.
+
+ЧŅĐžĐąŅ ŅСĐŊаŅŅ ĐąĐžĐģŅŅĐĩ, ĐŋĐžŅĐŧĐžŅŅиŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ Pydantic Đž dataclasses.
+
+## ĐĐĩŅŅĐ¸Ņ { #version }
+
+ĐĐžŅŅŅĐŋĐŊĐž ĐŊаŅиĐŊĐ°Ņ Ņ Đ˛ĐĩŅŅии FastAPI `0.67.0`. đ
diff --git a/docs/ru/docs/advanced/events.md b/docs/ru/docs/advanced/events.md
new file mode 100644
index 000000000..6e1b49035
--- /dev/null
+++ b/docs/ru/docs/advanced/events.md
@@ -0,0 +1,165 @@
+# ХОйŅŅĐ¸Ņ lifespan { #lifespan-events }
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ĐžĐŋŅĐĩĐ´ĐĩĐģиŅŅ ĐģĐžĐŗĐ¸ĐēŅ (ĐēОд), ĐēĐžŅĐžŅŅŅ ĐŊŅĐļĐŊĐž вŅĐŋĐžĐģĐŊиŅŅ ĐŋĐĩŅĐĩĐ´ ŅĐĩĐŧ, ĐēаĐē ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐŊаŅĐŊĐĩŅ ĐˇĐ°ĐŋŅŅĐēаŅŅŅŅ. ĐŅĐž ОСĐŊаŅаĐĩŅ, ŅŅĐž ŅŅĐžŅ ĐēОд ĐąŅĐ´ĐĩŅ Đ˛ŅĐŋĐžĐģĐŊĐĩĐŊ ОдиĐŊ ŅаС, ĐŋĐĩŅĐĩĐ´ ŅĐĩĐŧ ĐēаĐē ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐŊаŅĐŊĐĩŅ ĐŋĐžĐģŅŅаŅŅ HTTP-СаĐŋŅĐžŅŅ.
+
+ĐĐŊаĐģĐžĐŗĐ¸ŅĐŊĐž, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐžĐŋŅĐĩĐ´ĐĩĐģиŅŅ ĐģĐžĐŗĐ¸ĐēŅ (ĐēОд), ĐēĐžŅĐžŅŅŅ ĐŊŅĐļĐŊĐž вŅĐŋĐžĐģĐŊиŅŅ, ĐēĐžĐŗĐ´Đ° ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ СавĐĩŅŅаĐĩŅ ŅайОŅŅ. Đ ŅŅĐžĐŧ ŅĐģŅŅаĐĩ ĐēОд ĐąŅĐ´ĐĩŅ Đ˛ŅĐŋĐžĐģĐŊĐĩĐŊ ОдиĐŊ ŅаС, ĐŋĐžŅĐģĐĩ ОйŅайОŅĐēи, вОСĐŧĐžĐļĐŊĐž, ĐŧĐŊĐžĐŗĐ¸Ņ
СаĐŋŅĐžŅОв.
+
+ĐĐžŅĐēĐžĐģŅĐēŅ ŅŅĐžŅ ĐēОд вŅĐŋĐžĐģĐŊŅĐĩŅŅŅ Đ´Đž ŅĐžĐŗĐž, ĐēаĐē ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐŊаŅиĐŊаĐĩŅ ĐŋŅиĐŊиĐŧаŅŅ ĐˇĐ°ĐŋŅĐžŅŅ, и ŅŅĐ°ĐˇŅ ĐŋĐžŅĐģĐĩ ŅĐžĐŗĐž, ĐēаĐē ĐžĐŊĐž СаĐēаĐŊŅиваĐĩŅ Đ¸Ņ
ОйŅайаŅŅваŅŅ, ĐžĐŊ ĐžŅ
ваŅŅваĐĩŅ Đ˛ĐĩŅŅ lifespan (ĐļиСĐŊĐĩĐŊĐŊŅĐš ŅиĐēĐģ) ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ (ŅĐģОвО ÂĢlifespanÂģ ŅŅаĐŊĐĩŅ Đ˛Đ°ĐļĐŊŅĐŧ ŅĐĩŅĐĩС ŅĐĩĐēŅĐŊĐ´Ņ đ).
+
+ĐŅĐž ĐŧĐžĐļĐĩŅ ĐąŅŅŅ ĐžŅĐĩĐŊŅ ĐŋĐžĐģĐĩСĐŊĐž Đ´ĐģŅ ĐŊаŅŅŅОКĐēи ŅĐĩŅŅŅŅОв, ĐēĐžŅĐžŅŅĐĩ ĐŊŅĐļĐŊŅ Đ´ĐģŅ Đ˛ŅĐĩĐŗĐž ĐŋŅиĐģĐžĐļĐĩĐŊиŅ, ĐēĐžŅĐžŅŅĐĩ ŅаСдĐĩĐģŅŅŅŅŅ ĐŧĐĩĐļĐ´Ņ ĐˇĐ°ĐŋŅĐžŅаĐŧи и/иĐģи ĐēĐžŅĐžŅŅĐĩ ĐŊŅĐļĐŊĐž СаŅĐĩĐŧ ĐžŅиŅŅиŅŅ. ĐаĐŋŅиĐŧĐĩŅ, ĐŋŅĐģ ĐŋОдĐēĐģŅŅĐĩĐŊиК Đē йаСĐĩ даĐŊĐŊŅŅ
иĐģи ĐˇĐ°ĐŗŅŅСĐēа ОйŅĐĩĐš ĐŧОдĐĩĐģи ĐаŅиĐŊĐŊĐžĐŗĐž ОйŅŅĐĩĐŊиŅ.
+
+## ĐаŅиаĐŊŅ Đ¸ŅĐŋĐžĐģŅСОваĐŊĐ¸Ņ { #use-case }
+
+ĐаŅĐŊĐĩĐŧ Ņ ĐŋŅиĐŧĐĩŅа ваŅиаĐŊŅа иŅĐŋĐžĐģŅСОваĐŊиŅ, а СаŅĐĩĐŧ ĐŋĐžŅĐŧĐžŅŅиĐŧ, ĐēаĐē ŅŅĐž ŅĐĩŅиŅŅ.
+
+ĐŅĐĩĐ´ŅŅавиĐŧ, ŅŅĐž Ņ Đ˛Đ°Ņ ĐĩŅŅŅ ĐŊĐĩŅĐēĐžĐģŅĐēĐž ĐŧОдĐĩĐģĐĩĐš ĐаŅиĐŊĐŊĐžĐŗĐž ОйŅŅĐĩĐŊиŅ, ĐēĐžŅĐžŅŅĐĩ Đ˛Ņ Ņ
ĐžŅиŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ Đ´ĐģŅ ĐžĐąŅайОŅĐēи СаĐŋŅĐžŅОв. đ¤
+
+ĐŅи ĐļĐĩ ĐŧОдĐĩĐģи ŅаСдĐĩĐģŅŅŅŅŅ ĐŧĐĩĐļĐ´Ņ ĐˇĐ°ĐŋŅĐžŅаĐŧи, ŅĐž ĐĩŅŅŅ ŅŅĐž ĐŊĐĩ ОдĐŊа ĐŧОдĐĩĐģŅ ĐŊа СаĐŋŅĐžŅ, ĐŊĐĩ ОдĐŊа ĐŊа ĐŋĐžĐģŅСОваŅĐĩĐģŅ Đ¸ Ņ.Đŋ.
+
+ĐŅĐĩĐ´ŅŅавиĐŧ, ŅŅĐž ĐˇĐ°ĐŗŅŅСĐēа ĐŧОдĐĩĐģи ĐŧĐžĐļĐĩŅ ĐˇĐ°ĐŊиĐŧаŅŅ Đ´ĐžĐ˛ĐžĐģŅĐŊĐž ĐŧĐŊĐžĐŗĐž вŅĐĩĐŧĐĩĐŊи, ĐŋĐžŅĐžĐŧŅ ŅŅĐž ĐĩĐš ĐŊŅĐļĐŊĐž ĐŋŅĐžŅиŅаŅŅ ĐŧĐŊĐžĐŗĐž даĐŊĐŊŅŅ
Ņ Đ´Đ¸ŅĐēа. ĐĐžŅŅĐžĐŧŅ Đ˛Ņ ĐŊĐĩ Ņ
ĐžŅиŅĐĩ Đ´ĐĩĐģаŅŅ ŅŅĐž Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž СаĐŋŅĐžŅа.
+
+ĐŅ ĐŧĐžĐŗĐģи ĐąŅ ĐˇĐ°ĐŗŅŅСиŅŅ ĐĩŅ ĐŊа вĐĩŅŅ
ĐŊĐĩĐŧ ŅŅОвĐŊĐĩ ĐŧОдŅĐģŅ/ŅаКĐģа, ĐŊĐž ŅŅĐž ОСĐŊаŅаĐģĐž ĐąŅ, ŅŅĐž ĐŧОдĐĩĐģŅ ĐˇĐ°ĐŗŅŅĐļаĐĩŅŅŅ Đ´Đ°ĐļĐĩ ĐĩŅĐģи Đ˛Ņ ĐŋŅĐžŅŅĐž СаĐŋŅŅĐēаĐĩŅĐĩ ĐŋŅĐžŅŅОК авŅĐžĐŧаŅиŅĐĩŅĐēиК ŅĐĩŅŅ; ŅĐžĐŗĐ´Đ° ŅŅĐžŅ ŅĐĩŅŅ ĐąŅĐ´ĐĩŅ ĐŧĐĩĐ´ĐģĐĩĐŊĐŊŅĐŧ, ŅаĐē ĐēаĐē ĐĩĐŧŅ ĐŋŅидĐĩŅŅŅ ĐļдаŅŅ ĐˇĐ°ĐŗŅŅСĐēи ĐŧОдĐĩĐģи ĐŋĐĩŅĐĩĐ´ СаĐŋŅŅĐēĐžĐŧ ĐŊĐĩСавиŅиĐŧОК ŅаŅŅи ĐēОда.
+
+ĐĐŧĐĩĐŊĐŊĐž ŅŅĐž ĐŧŅ Đ¸ ŅĐĩŅиĐŧ: даваКŅĐĩ ĐˇĐ°ĐŗŅŅĐļаŅŅ ĐŧОдĐĩĐģŅ ĐŋĐĩŅĐĩĐ´ ŅĐĩĐŧ, ĐēаĐē ĐŊаŅĐŊŅŅŅŅ ĐžĐąŅайОŅĐēа СаĐŋŅĐžŅОв, ĐŊĐž ŅĐžĐģŅĐēĐž ĐŊĐĩĐŋĐžŅŅĐĩĐ´ŅŅвĐĩĐŊĐŊĐž ĐŋĐĩŅĐĩĐ´ ŅĐĩĐŧ, ĐēаĐē ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐŊаŅĐŊĐĩŅ ĐŋŅиĐŊиĐŧаŅŅ ĐˇĐ°ĐŋŅĐžŅŅ, а ĐŊĐĩ вО вŅĐĩĐŧŅ ĐˇĐ°ĐŗŅŅСĐēи ĐēОда.
+
+## Lifespan { #lifespan }
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ĐžĐŋŅĐĩĐ´ĐĩĐģиŅŅ ĐģĐžĐŗĐ¸ĐēŅ Đ´ĐģŅ startup и shutdown, иŅĐŋĐžĐģŅСŅŅ ĐŋаŅаĐŧĐĩŅŅ `lifespan` ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ `FastAPI` и ÂĢĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ ĐēĐžĐŊŅĐĩĐēŅŅаÂģ (ŅĐĩŅĐĩС ŅĐĩĐēŅĐŊĐ´Ņ ĐŋĐžĐēаĐļŅ ŅŅĐž ŅŅĐž).
+
+ĐаŅĐŊĐĩĐŧ Ņ ĐŋŅиĐŧĐĩŅа, а СаŅĐĩĐŧ ŅаСйĐĩŅŅĐŧ ĐĩĐŗĐž ĐŋОдŅОйĐŊĐĩĐĩ.
+
+ĐŅ ŅОСдаŅĐŧ аŅиĐŊŅ
ŅĐžĐŊĐŊŅŅ ŅŅĐŊĐēŅĐ¸Ņ `lifespan()` Ņ `yield` ĐŋŅиĐŧĐĩŅĐŊĐž ŅаĐē:
+
+{* ../../docs_src/events/tutorial003.py hl[16,19] *}
+
+ĐĐ´ĐĩŅŅ ĐŧŅ ŅиĐŧŅĐģиŅŅĐĩĐŧ Đ´ĐžŅĐžĐŗŅŅ ĐžĐŋĐĩŅаŅĐ¸Ņ startup ĐŋĐž ĐˇĐ°ĐŗŅŅСĐēĐĩ ĐŧОдĐĩĐģи, ĐŋĐžĐŧĐĩŅĐ°Ņ (ŅиĐēŅивĐŊŅŅ) ŅŅĐŊĐēŅĐ¸Ņ ĐŧОдĐĩĐģи в ŅĐģОваŅŅ Ņ ĐŧОдĐĩĐģŅĐŧи ĐаŅиĐŊĐŊĐžĐŗĐž ОйŅŅĐĩĐŊĐ¸Ņ Đ´Đž `yield`. ĐŅĐžŅ ĐēОд ĐąŅĐ´ĐĩŅ Đ˛ŅĐŋĐžĐģĐŊĐĩĐŊ Đ´Đž ŅĐžĐŗĐž, ĐēаĐē ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐŊаŅĐŊĐĩŅ ĐŋŅиĐŊиĐŧаŅŅ ĐˇĐ°ĐŋŅĐžŅŅ, вО вŅĐĩĐŧŅ startup.
+
+РСаŅĐĩĐŧ ŅŅĐ°ĐˇŅ ĐŋĐžŅĐģĐĩ `yield` ĐŧŅ Đ˛ŅĐŗŅŅĐļаĐĩĐŧ ĐŧОдĐĩĐģŅ. ĐŅĐžŅ ĐēОд ĐąŅĐ´ĐĩŅ Đ˛ŅĐŋĐžĐģĐŊĐĩĐŊ ĐŋĐžŅĐģĐĩ ŅĐžĐŗĐž, ĐēаĐē ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ СаĐēĐžĐŊŅĐ¸Ņ ĐžĐąŅайаŅŅваŅŅ ĐˇĐ°ĐŋŅĐžŅŅ, ĐŊĐĩĐŋĐžŅŅĐĩĐ´ŅŅвĐĩĐŊĐŊĐž ĐŋĐĩŅĐĩĐ´ shutdown. ĐŅĐž ĐŧĐžĐļĐĩŅ, ĐŊаĐŋŅиĐŧĐĩŅ, ĐžŅвОйОдиŅŅ ŅĐĩŅŅŅŅŅ, ŅаĐēиĐĩ ĐēаĐē ĐŋаĐŧŅŅŅ Đ¸Đģи GPU.
+
+/// tip | ХОвĐĩŅ
+
+`shutdown` ĐŋŅОиСОКдŅŅ, ĐēĐžĐŗĐ´Đ° Đ˛Ņ ĐžŅŅаĐŊавĐģиваĐĩŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ.
+
+ĐОСĐŧĐžĐļĐŊĐž, ваĐŧ ĐŊŅĐļĐŊĐž СаĐŋŅŅŅиŅŅ ĐŊОвŅŅ Đ˛ĐĩŅŅиŅ, иĐģи Đ˛Ņ ĐŋŅĐžŅŅĐž ŅŅŅаĐģи ĐžŅ ĐŊĐĩĐŗĐž. đ¤ˇ
+
+///
+
+### ФŅĐŊĐēŅĐ¸Ņ lifespan { #lifespan-function }
+
+ĐĐĩŅвОĐĩ, ĐŊа ŅŅĐž ŅŅĐžĐ¸Ņ ĐžĐąŅаŅиŅŅ Đ˛ĐŊиĐŧаĐŊиĐĩ, â ĐŧŅ ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐĩĐŧ аŅиĐŊŅ
ŅĐžĐŊĐŊŅŅ ŅŅĐŊĐēŅĐ¸Ņ Ņ `yield`. ĐŅĐž ĐžŅĐĩĐŊŅ ĐŋĐžŅ
ĐžĐļĐĩ ĐŊа ĐавиŅиĐŧĐžŅŅи Ņ `yield`.
+
+{* ../../docs_src/events/tutorial003.py hl[14:19] *}
+
+ĐĐĩŅĐ˛Đ°Ņ ŅаŅŅŅ ŅŅĐŊĐēŅии, Đ´Đž `yield`, ĐąŅĐ´ĐĩŅ Đ˛ŅĐŋĐžĐģĐŊĐĩĐŊа Đ´Đž СаĐŋŅŅĐēа ĐŋŅиĐģĐžĐļĐĩĐŊиŅ.
+
+Đ ŅаŅŅŅ ĐŋĐžŅĐģĐĩ `yield` ĐąŅĐ´ĐĩŅ Đ˛ŅĐŋĐžĐģĐŊĐĩĐŊа ĐŋĐžŅĐģĐĩ СавĐĩŅŅĐĩĐŊĐ¸Ņ ŅайОŅŅ ĐŋŅиĐģĐžĐļĐĩĐŊиŅ.
+
+### ĐŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ ĐēĐžĐŊŅĐĩĐēŅŅа { #async-context-manager }
+
+ĐŅĐģи ĐŋŅиŅĐŧĐžŅŅĐĩŅŅŅŅ, ŅŅĐŊĐēŅĐ¸Ņ Đ´ĐĩĐēĐžŅиŅОваĐŊа `@asynccontextmanager`.
+
+ĐŅĐž ĐŋŅĐĩвŅаŅаĐĩŅ ŅŅĐŊĐēŅĐ¸Ņ Đ˛ ÂĢаŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ ĐēĐžĐŊŅĐĩĐēŅŅаÂģ.
+
+{* ../../docs_src/events/tutorial003.py hl[1,13] *}
+
+ĐĐĩĐŊĐĩĐ´ĐļĐĩŅ ĐēĐžĐŊŅĐĩĐēŅŅа в Python â ŅŅĐž ŅĐž, ŅŅĐž ĐŧĐžĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ Đ˛ ĐžĐŋĐĩŅаŅĐžŅĐĩ `with`. ĐаĐŋŅиĐŧĐĩŅ, `open()` ĐŧĐžĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ ĐēаĐē ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ ĐēĐžĐŊŅĐĩĐēŅŅа:
+
+```Python
+with open("file.txt") as file:
+ file.read()
+```
+
+Đ ĐŋĐžŅĐģĐĩĐ´ĐŊиŅ
вĐĩŅŅиŅŅ
Python ĐĩŅŅŅ ŅаĐēĐļĐĩ аŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ ĐēĐžĐŊŅĐĩĐēŅŅа. ĐĐŗĐž иŅĐŋĐžĐģŅСŅŅŅ Ņ `async with`:
+
+```Python
+async with lifespan(app):
+ await do_stuff()
+```
+
+ĐĐžĐŗĐ´Đ° Đ˛Ņ ŅОСдаŅŅĐĩ ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ ĐēĐžĐŊŅĐĩĐēŅŅа иĐģи аŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ ĐēĐžĐŊŅĐĩĐēŅŅа, ĐēаĐē вŅŅĐĩ, ĐžĐŊ ĐŋĐĩŅĐĩĐ´ вŅ
ОдОĐŧ в ĐąĐģĐžĐē `with` вŅĐŋĐžĐģĐŊĐ¸Ņ ĐēОд Đ´Đž `yield`, а ĐŋĐžŅĐģĐĩ вŅŅ
Ода иС ĐąĐģĐžĐēа `with` вŅĐŋĐžĐģĐŊĐ¸Ņ ĐēОд ĐŋĐžŅĐģĐĩ `yield`.
+
+Đ ĐŊаŅĐĩĐŧ ĐŋŅиĐŧĐĩŅĐĩ вŅŅĐĩ ĐŧŅ ĐŊĐĩ иŅĐŋĐžĐģŅСŅĐĩĐŧ ĐĩĐŗĐž ĐŊаĐŋŅŅĐŧŅŅ, а ĐŋĐĩŅĐĩдаŅĐŧ ĐĩĐŗĐž в FastAPI, ŅŅĐžĐąŅ ĐžĐŊ иŅĐŋĐžĐģŅСОваĐģ ĐĩĐŗĐž ŅаĐŧ.
+
+ĐаŅаĐŧĐĩŅŅ `lifespan` ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ `FastAPI` ĐŋŅиĐŊиĐŧаĐĩŅ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ ĐēĐžĐŊŅĐĩĐēŅŅа, ĐŋĐžŅŅĐžĐŧŅ ĐŧŅ ĐŧĐžĐļĐĩĐŧ ĐŋĐĩŅĐĩдаŅŅ ĐĩĐŧŅ ĐŊĐ°Ņ ĐŊОвŅĐš аŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ ĐēĐžĐŊŅĐĩĐēŅŅа `lifespan`.
+
+{* ../../docs_src/events/tutorial003.py hl[22] *}
+
+## ĐĐģŅŅĐĩŅĐŊаŅивĐŊŅĐĩ ŅОйŅŅĐ¸Ņ (ŅŅŅаŅĐĩвŅиĐĩ) { #alternative-events-deprecated }
+
+/// warning | ĐŅĐĩĐ´ŅĐŋŅĐĩĐļĐ´ĐĩĐŊиĐĩ
+
+Đ ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅĐĩĐŧŅĐš ŅĐŋĐžŅОй ОйŅайаŅŅваŅŅ startup и shutdown â иŅĐŋĐžĐģŅСОваŅŅ ĐŋаŅаĐŧĐĩŅŅ `lifespan` ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ `FastAPI`, ĐēаĐē ĐžĐŋиŅаĐŊĐž вŅŅĐĩ. ĐŅĐģи Đ˛Ņ ŅĐēаĐļĐĩŅĐĩ ĐŋаŅаĐŧĐĩŅŅ `lifespan`, ОйŅайОŅŅиĐēи ŅОйŅŅиК `startup` и `shutdown` йОĐģŅŅĐĩ вŅСŅваŅŅŅŅ ĐŊĐĩ ĐąŅĐ´ŅŅ. ĐийО вŅŅ ŅĐĩŅĐĩС `lifespan`, ĐģийО вŅŅ ŅĐĩŅĐĩС ŅОйŅŅĐ¸Ņ â ĐŊĐĩ ОдĐŊОвŅĐĩĐŧĐĩĐŊĐŊĐž.
+
+ĐŅŅ ŅаŅŅŅ, ŅĐēĐžŅĐĩĐĩ вŅĐĩĐŗĐž, ĐŧĐžĐļĐŊĐž ĐŋŅĐžĐŋŅŅŅиŅŅ.
+
+///
+
+ĐŅŅŅ Đ°ĐģŅŅĐĩŅĐŊаŅивĐŊŅĐš ŅĐŋĐžŅОй ĐžĐŋŅĐĩĐ´ĐĩĐģиŅŅ ĐģĐžĐŗĐ¸ĐēŅ, ĐēĐžŅĐžŅŅŅ ĐŊŅĐļĐŊĐž вŅĐŋĐžĐģĐŊиŅŅ Đ˛Đž вŅĐĩĐŧŅ startup и вО вŅĐĩĐŧŅ shutdown.
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ĐžĐŋŅĐĩĐ´ĐĩĐģиŅŅ ĐžĐąŅайОŅŅиĐēи ŅОйŅŅиК (ŅŅĐŊĐēŅии), ĐēĐžŅĐžŅŅĐĩ ĐŊŅĐļĐŊĐž вŅĐŋĐžĐģĐŊиŅŅ Đ´Đž ŅŅаŅŅа ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ Đ¸Đģи ĐŋŅи ĐĩĐŗĐž СавĐĩŅŅĐĩĐŊии.
+
+ĐŅи ŅŅĐŊĐēŅии ĐŧĐžĐļĐŊĐž ОйŅŅвиŅŅ Ņ `async def` иĐģи ОйŅŅĐŊŅĐŧ `def`.
+
+### ХОйŅŅиĐĩ `startup` { #startup-event }
+
+ЧŅĐžĐąŅ Đ´ĐžĐąĐ°Đ˛Đ¸ŅŅ ŅŅĐŊĐēŅиŅ, ĐēĐžŅĐžŅŅŅ ĐŊŅĐļĐŊĐž СаĐŋŅŅŅиŅŅ Đ´Đž ŅŅаŅŅа ĐŋŅиĐģĐžĐļĐĩĐŊиŅ, ОйŅŅвиŅĐĩ ĐĩŅ ĐēаĐē ОйŅайОŅŅиĐē ŅОйŅŅĐ¸Ņ `"startup"`:
+
+{* ../../docs_src/events/tutorial001.py hl[8] *}
+
+Đ ŅŅĐžĐŧ ŅĐģŅŅаĐĩ ŅŅĐŊĐēŅиŅ-ОйŅайОŅŅиĐē ŅОйŅŅĐ¸Ņ `startup` иĐŊиŅиаĐģиСиŅŅĐĩŅ ÂĢĐąĐ°ĐˇŅ Đ´Đ°ĐŊĐŊŅŅ
Âģ items (ŅŅĐž ĐŋŅĐžŅŅĐž `dict`) ĐŊĐĩĐēĐžŅĐžŅŅĐŧи СĐŊаŅĐĩĐŊиŅĐŧи.
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ дОйавиŅŅ ĐąĐžĐģĐĩĐĩ ОдĐŊĐžĐŗĐž ОйŅайОŅŅиĐēа ŅОйŅŅиŅ.
+
+РваŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐŊĐĩ ĐŊаŅĐŊĐĩŅ ĐŋŅиĐŊиĐŧаŅŅ ĐˇĐ°ĐŋŅĐžŅŅ, ĐŋĐžĐēа вŅĐĩ ОйŅайОŅŅиĐēи ŅОйŅŅĐ¸Ņ `startup` ĐŊĐĩ СавĐĩŅŅаŅŅŅ.
+
+### ХОйŅŅиĐĩ `shutdown` { #shutdown-event }
+
+ЧŅĐžĐąŅ Đ´ĐžĐąĐ°Đ˛Đ¸ŅŅ ŅŅĐŊĐēŅиŅ, ĐēĐžŅĐžŅŅŅ ĐŊŅĐļĐŊĐž СаĐŋŅŅŅиŅŅ ĐŋŅи СавĐĩŅŅĐĩĐŊии ŅайОŅŅ ĐŋŅиĐģĐžĐļĐĩĐŊиŅ, ОйŅŅвиŅĐĩ ĐĩŅ ĐēаĐē ОйŅайОŅŅиĐē ŅОйŅŅĐ¸Ņ `"shutdown"`:
+
+{* ../../docs_src/events/tutorial002.py hl[6] *}
+
+ĐĐ´ĐĩŅŅ ŅŅĐŊĐēŅиŅ-ОйŅайОŅŅиĐē ŅОйŅŅĐ¸Ņ `shutdown` СаĐŋиŅĐĩŅ ŅŅŅĐžĐēŅ ŅĐĩĐēŅŅа `"Application shutdown"` в ŅаКĐģ `log.txt`.
+
+/// info | ĐĐŊŅĐžŅĐŧаŅиŅ
+
+Đ ŅŅĐŊĐēŅии `open()` ĐŋаŅаĐŧĐĩŅŅ `mode="a"` ОСĐŊаŅаĐĩŅ ÂĢдОйавĐģĐĩĐŊиĐĩÂģ (append), ŅĐž ĐĩŅŅŅ ŅŅŅĐžĐēа ĐąŅĐ´ĐĩŅ Đ´ĐžĐąĐ°Đ˛ĐģĐĩĐŊа в ĐēĐžĐŊĐĩŅ ŅаКĐģа, ĐąĐĩС ĐŋĐĩŅĐĩСаĐŋиŅи ĐŋŅĐĩĐ´ŅĐ´ŅŅĐĩĐŗĐž ŅОдĐĩŅĐļиĐŧĐžĐŗĐž.
+
+///
+
+/// tip | ХОвĐĩŅ
+
+ĐĐąŅаŅиŅĐĩ вĐŊиĐŧаĐŊиĐĩ, ŅŅĐž в ŅŅĐžĐŧ ŅĐģŅŅаĐĩ ĐŧŅ Đ¸ŅĐŋĐžĐģŅСŅĐĩĐŧ ŅŅаĐŊдаŅŅĐŊŅŅ Python-ŅŅĐŊĐēŅĐ¸Ņ `open()`, ĐēĐžŅĐžŅĐ°Ņ Đ˛ĐˇĐ°Đ¸ĐŧОдĐĩĐšŅŅвŅĐĩŅ Ņ ŅаКĐģĐžĐŧ.
+
+ĐĸĐž ĐĩŅŅŅ ŅŅĐž I/O (ввОд/вŅвОд), ŅŅĐĩĐąŅŅŅиК ÂĢĐžĐļидаĐŊиŅÂģ СаĐŋиŅи ĐŊа диŅĐē.
+
+ĐĐž `open()` ĐŊĐĩ иŅĐŋĐžĐģŅСŅĐĩŅ `async` и `await`.
+
+ĐĐžŅŅĐžĐŧŅ ĐŧŅ ĐžĐąŅŅвĐģŅĐĩĐŧ ОйŅайОŅŅиĐē ŅОйŅŅĐ¸Ņ ĐžĐąŅŅĐŊŅĐŧ `def` вĐŧĐĩŅŅĐž `async def`.
+
+///
+
+### `startup` и `shutdown` вĐŧĐĩŅŅĐĩ { #startup-and-shutdown-together }
+
+ĐĄ вŅŅĐžĐēОК вĐĩŅĐžŅŅĐŊĐžŅŅŅŅ ĐģĐžĐŗĐ¸Đēа Đ´ĐģŅ Đ˛Đ°ŅĐĩĐŗĐž startup и shutdown ŅвŅСаĐŊа: Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ Ņ
ĐžŅĐĩŅŅ ŅŅĐž-ŅĐž СаĐŋŅŅŅиŅŅ, а СаŅĐĩĐŧ СавĐĩŅŅиŅŅ, ĐŋĐžĐģŅŅиŅŅ ŅĐĩŅŅŅŅ, а СаŅĐĩĐŧ ĐžŅвОйОдиŅŅ ĐĩĐŗĐž и Ņ.Đ´.
+
+ĐĐĩĐģаŅŅ ŅŅĐž в ĐžŅĐ´ĐĩĐģŅĐŊŅŅ
ŅŅĐŊĐēŅиŅŅ
, ĐēĐžŅĐžŅŅĐĩ ĐŊĐĩ ŅаСдĐĩĐģŅŅŅ ĐžĐąŅŅŅ ĐģĐžĐŗĐ¸ĐēŅ Đ¸Đģи ĐŋĐĩŅĐĩĐŧĐĩĐŊĐŊŅĐĩ, ŅĐģĐžĐļĐŊĐĩĐĩ, ŅаĐē ĐēаĐē ĐŋŅидŅŅŅŅ Ņ
ŅаĐŊиŅŅ ĐˇĐŊаŅĐĩĐŊĐ¸Ņ Đ˛ ĐŗĐģОйаĐģŅĐŊŅŅ
ĐŋĐĩŅĐĩĐŧĐĩĐŊĐŊŅŅ
иĐģи иŅĐŋĐžĐģŅСОваŅŅ ĐŋĐžŅ
ĐžĐļиĐĩ ĐŋŅиŅĐŧŅ.
+
+ĐĐžŅŅĐžĐŧŅ ŅĐĩĐŋĐĩŅŅ ŅĐĩĐēĐžĐŧĐĩĐŊĐ´ŅĐĩŅŅŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ `lifespan`, ĐēаĐē ĐžĐŋиŅаĐŊĐž вŅŅĐĩ.
+
+## ĐĸĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ Đ´ĐĩŅаĐģи { #technical-details }
+
+ĐĐĩĐŧĐŊĐžĐŗĐž ŅĐĩŅ
ĐŊиŅĐĩŅĐēиŅ
ĐŋОдŅОйĐŊĐžŅŅĐĩĐš Đ´ĐģŅ ĐģŅйОĐŋŅŅĐŊŅŅ
ŅĐŧĐŊиĐēОв. đ¤
+
+ĐОд ĐēаĐŋĐžŅĐžĐŧ, в ASGI-ŅĐĩŅ
ĐŊиŅĐĩŅĐēОК ŅĐŋĐĩŅиŅиĐēаŅии, ŅŅĐž ŅаŅŅŅ ĐŅĐžŅĐžĐēĐžĐģа Lifespan, и ĐžĐŊ ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐĩŅ ŅОйŅŅĐ¸Ņ `startup` и `shutdown`.
+
+/// info | ĐĐŊŅĐžŅĐŧаŅиŅ
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ĐŋŅĐžŅиŅаŅŅ ĐąĐžĐģŅŅĐĩ ĐŋŅĐž ОйŅайОŅŅиĐēи `lifespan` в Starlette в Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии Starlette ĐŋĐž Lifespan.
+
+ĐĐēĐģŅŅĐ°Ņ ŅĐž, ĐēаĐē ŅайОŅаŅŅ Ņ ŅĐžŅŅĐžŅĐŊиĐĩĐŧ lifespan, ĐēĐžŅĐžŅĐžĐĩ ĐŧĐžĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ Đ˛ Đ´ŅŅĐŗĐ¸Ņ
ŅаŅŅŅŅ
ваŅĐĩĐŗĐž ĐēОда.
+
+///
+
+## ĐОдĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ { #sub-applications }
+
+đ¨ ĐĐŧĐĩĐšŅĐĩ в видŅ, ŅŅĐž ŅŅи ŅОйŅŅĐ¸Ņ lifespan (startup и shutdown) ĐąŅĐ´ŅŅ Đ˛ŅĐŋĐžĐģĐŊĐĩĐŊŅ ŅĐžĐģŅĐēĐž Đ´ĐģŅ ĐžŅĐŊОвĐŊĐžĐŗĐž ĐŋŅиĐģĐžĐļĐĩĐŊиŅ, а ĐŊĐĩ Đ´ĐģŅ [ĐОдĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ â Mounts](sub-applications.md){.internal-link target=_blank}.
diff --git a/docs/ru/docs/advanced/generate-clients.md b/docs/ru/docs/advanced/generate-clients.md
new file mode 100644
index 000000000..ee52412c6
--- /dev/null
+++ b/docs/ru/docs/advanced/generate-clients.md
@@ -0,0 +1,208 @@
+# ĐĐĩĐŊĐĩŅаŅĐ¸Ņ SDK { #generating-sdks }
+
+ĐĐžŅĐēĐžĐģŅĐēŅ **FastAPI** ĐžŅĐŊОваĐŊ ĐŊа ŅĐŋĐĩŅиŅиĐēаŅии **OpenAPI**, ĐĩĐŗĐž API ĐŧĐžĐļĐŊĐž ĐžĐŋиŅаŅŅ Đ˛ ŅŅаĐŊдаŅŅĐŊĐžĐŧ ŅĐžŅĐŧаŅĐĩ, ĐŋĐžĐŊŅŅĐŊĐžĐŧ ĐŧĐŊĐžĐļĐĩŅŅĐ˛Ņ Đ¸ĐŊŅŅŅŅĐŧĐĩĐŊŅОв.
+
+ĐŅĐž ŅĐŋŅĐžŅаĐĩŅ ĐŗĐĩĐŊĐĩŅаŅĐ¸Ņ Đ°ĐēŅŅаĐģŅĐŊОК **Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии**, ĐēĐģиĐĩĐŊŅŅĐēиŅ
йийĐģиОŅĐĩĐē (**SDKs**) ĐŊа ŅаСĐŊŅŅ
ŅСŅĐēаŅ
, а ŅаĐēĐļĐĩ **ŅĐĩŅŅиŅОваĐŊиŅ** иĐģи **вОŅĐēŅĐģĐžŅ Đ°Đ˛ŅĐžĐŧаŅиСаŅии**, ĐēĐžŅĐžŅŅĐĩ ĐžŅŅаŅŅŅŅ ŅиĐŊŅ
ŅĐžĐŊиСиŅОваĐŊĐŊŅĐŧи Ņ Đ˛Đ°ŅиĐŧ ĐēОдОĐŧ.
+
+Đ ŅŅĐžĐŧ ŅŅĐēОвОдŅŅвĐĩ Đ˛Ņ ŅСĐŊаĐĩŅĐĩ, ĐēаĐē ŅĐŗĐĩĐŊĐĩŅиŅОваŅŅ **TypeScript SDK** Đ´ĐģŅ Đ˛Đ°ŅĐĩĐŗĐž ĐąŅĐēĐĩĐŊда ĐŊа FastAPI.
+
+## ĐĐĩĐŊĐĩŅаŅĐžŅŅ SDK Ņ ĐžŅĐēŅŅŅŅĐŧ иŅŅ
ОдĐŊŅĐŧ ĐēОдОĐŧ { #open-source-sdk-generators }
+
+ĐийĐēиК ваŅиаĐŊŅ â OpenAPI Generator, ĐēĐžŅĐžŅŅĐš ĐŋОддĐĩŅĐļиваĐĩŅ **ĐŧĐŊĐžĐŗĐ¸Đĩ ŅСŅĐēи ĐŋŅĐžĐŗŅаĐŧĐŧиŅОваĐŊиŅ** и ŅĐŧĐĩĐĩŅ ĐŗĐĩĐŊĐĩŅиŅОваŅŅ SDK иС ваŅĐĩĐš ŅĐŋĐĩŅиŅиĐēаŅии OpenAPI.
+
+ĐĐģŅ **TypeScriptâĐēĐģиĐĩĐŊŅОв** Hey API â ŅĐŋĐĩŅиаĐģиСиŅОваĐŊĐŊĐžĐĩ ŅĐĩŅĐĩĐŊиĐĩ, ОйĐĩŅĐŋĐĩŅиваŅŅĐĩĐĩ ĐžĐŋŅиĐŧаĐģŅĐŊŅĐš ĐžĐŋŅŅ Đ´ĐģŅ ŅĐēĐžŅиŅŅĐĩĐŧŅ TypeScript.
+
+ĐĐžĐģŅŅĐĩ ĐŗĐĩĐŊĐĩŅаŅĐžŅОв SDK ĐŧĐžĐļĐŊĐž ĐŊаКŅи ĐŊа OpenAPI.Tools.
+
+/// tip | ХОвĐĩŅ
+
+FastAPI авŅĐžĐŧаŅиŅĐĩŅĐēи ĐŗĐĩĐŊĐĩŅиŅŅĐĩŅ ŅĐŋĐĩŅиŅиĐēаŅии **OpenAPI 3.1**, ĐŋĐžŅŅĐžĐŧŅ ĐģŅйОК иŅĐŋĐžĐģŅСŅĐĩĐŧŅĐš иĐŊŅŅŅŅĐŧĐĩĐŊŅ Đ´ĐžĐģĐļĐĩĐŊ ĐŋОддĐĩŅĐļиваŅŅ ŅŅŅ Đ˛ĐĩŅŅиŅ.
+
+///
+
+## ĐĐĩĐŊĐĩŅаŅĐžŅŅ SDK ĐžŅ ŅĐŋĐžĐŊŅĐžŅОв FastAPI { #sdk-generators-from-fastapi-sponsors }
+
+Đ ŅŅĐžĐŧ ŅаСдĐĩĐģĐĩ ĐŋŅĐĩĐ´ŅŅавĐģĐĩĐŊŅ ŅĐĩŅĐĩĐŊĐ¸Ņ Ņ **вĐĩĐŊŅŅŅĐŊОК ĐŋОддĐĩŅĐļĐēОК** и **ĐŋОддĐĩŅĐļĐēОК ĐēĐžĐŧĐŋаĐŊиК** ĐžŅ ĐēĐžĐŧĐŋаĐŊиК, ĐēĐžŅĐžŅŅĐĩ ŅĐŋĐžĐŊŅиŅŅŅŅ FastAPI. ĐŅи ĐŋŅОдŅĐēŅŅ ĐŋŅĐĩĐ´ĐžŅŅавĐģŅŅŅ **Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ вОСĐŧĐžĐļĐŊĐžŅŅи** и **иĐŊŅĐĩĐŗŅаŅии** ŅвĐĩŅŅ
вŅŅĐžĐēĐžĐēаŅĐĩŅŅвĐĩĐŊĐŊĐž ĐŗĐĩĐŊĐĩŅиŅŅĐĩĐŧŅŅ
SDK.
+
+ĐĐģĐ°ĐŗĐžĐ´Đ°ŅŅ â¨ [**ŅĐŋĐžĐŊŅĐžŅŅŅĐ˛Ņ FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ⨠ŅŅи ĐēĐžĐŧĐŋаĐŊии ĐŋĐžĐŧĐžĐŗĐ°ŅŅ ĐžĐąĐĩŅĐŋĐĩŅиваŅŅ, ŅŅĐžĐąŅ ŅŅĐĩĐšĐŧвОŅĐē и ĐĩĐŗĐž **ŅĐēĐžŅиŅŅĐĩĐŧа** ĐžŅŅаваĐģиŅŅ ĐˇĐ´ĐžŅОвŅĐŧи и **ŅŅŅОКŅивŅĐŧи**.
+
+ĐŅ
ŅĐŋĐžĐŊŅĐžŅŅŅвО ŅаĐēĐļĐĩ Đ´ĐĩĐŧĐžĐŊŅŅŅиŅŅĐĩŅ ŅĐĩŅŅŅСĐŊŅŅ ĐŋŅивĐĩŅĐļĐĩĐŊĐŊĐžŅŅŅ **ŅООйŅĐĩŅŅвŅ** FastAPI (ваĐŧ), ĐŋĐžĐēаСŅваŅ, ŅŅĐž иĐŧ ваĐļĐŊĐž ĐŊĐĩ ŅĐžĐģŅĐēĐž ĐŋŅĐĩĐ´ĐžŅŅавĐģŅŅŅ **ĐžŅĐģиŅĐŊŅĐš ŅĐĩŅвиŅ**, ĐŊĐž и ĐŋОддĐĩŅĐļиваŅŅ **ĐŊадŅĐļĐŊŅĐš и ĐŋŅĐžŅвĐĩŅаŅŅиК ŅŅĐĩĐšĐŧвОŅĐē** FastAPI. đ
+
+ĐаĐŋŅиĐŧĐĩŅ, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐŋĐžĐŋŅОйОваŅŅ:
+
+* Speakeasy
+* Stainless
+* liblab
+
+ĐĐĩĐēĐžŅĐžŅŅĐĩ иС ŅŅиŅ
ŅĐĩŅĐĩĐŊиК ŅаĐēĐļĐĩ ĐŧĐžĐŗŅŅ ĐąŅŅŅ open source иĐģи иĐŧĐĩŅŅ ĐąĐĩŅĐŋĐģаŅĐŊŅĐĩ ŅаŅиŅŅ, ŅаĐē ŅŅĐž Đ˛Ņ ŅĐŧĐžĐļĐĩŅĐĩ ĐŋĐžĐŋŅОйОваŅŅ Đ¸Ņ
ĐąĐĩС ŅиĐŊаĐŊŅОвŅŅ
СаŅŅаŅ. ĐŅŅĐŗĐ¸Đĩ ĐēĐžĐŧĐŧĐĩŅŅĐĩŅĐēиĐĩ ĐŗĐĩĐŊĐĩŅаŅĐžŅŅ SDK Đ´ĐžŅŅŅĐŋĐŊŅ Đ¸ иŅ
ĐŧĐžĐļĐŊĐž ĐŊаКŅи ĐžĐŊĐģаКĐŊ. đ¤
+
+## ХОСдаŅŅ TypeScript SDK { #create-a-typescript-sdk }
+
+ĐаŅĐŊŅĐŧ Ņ ĐŋŅĐžŅŅĐžĐŗĐž ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ FastAPI:
+
+{* ../../docs_src/generate_clients/tutorial001_py39.py hl[7:9,12:13,16:17,21] *}
+
+ĐĐąŅаŅиŅĐĩ вĐŊиĐŧаĐŊиĐĩ, ŅŅĐž *ĐžĐŋĐĩŅаŅии ĐŋŅŅи (ОйŅайОŅŅиĐēи ĐŋŅŅи)* ĐžĐŋŅĐĩĐ´ĐĩĐģŅŅŅ ĐŧОдĐĩĐģи, ĐēĐžŅĐžŅŅĐĩ ĐžĐŊи иŅĐŋĐžĐģŅСŅŅŅ Đ´ĐģŅ ĐŋĐžĐģĐĩСĐŊОК ĐŊĐ°ĐŗŅŅСĐēи СаĐŋŅĐžŅа и ĐŋĐžĐģĐĩСĐŊОК ĐŊĐ°ĐŗŅŅСĐēи ĐžŅвĐĩŅа, Ņ ĐŋĐžĐŧĐžŅŅŅ ĐŧОдĐĩĐģĐĩĐš `Item` и `ResponseMessage`.
+
+### ĐĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ API { #api-docs }
+
+ĐŅĐģи ĐŋĐĩŅĐĩĐšŅи ĐŊа `/docs`, Đ˛Ņ ŅвидиŅĐĩ **ŅŅ
ĐĩĐŧŅ** даĐŊĐŊŅŅ
, ĐžŅĐŋŅавĐģŅĐĩĐŧŅŅ
в СаĐŋŅĐžŅаŅ
и ĐŋŅиĐŊиĐŧаĐĩĐŧŅŅ
в ĐžŅвĐĩŅаŅ
:
+
+
+
+ĐŅ Đ˛Đ¸Đ´Đ¸ŅĐĩ ŅŅи ŅŅ
ĐĩĐŧŅ, ĐŋĐžŅĐžĐŧŅ ŅŅĐž ĐžĐŊи ĐąŅĐģи ОйŅŅвĐģĐĩĐŊŅ Ņ ĐŧОдĐĩĐģŅĐŧи в ĐŋŅиĐģĐžĐļĐĩĐŊии.
+
+ĐŅа иĐŊŅĐžŅĐŧаŅĐ¸Ņ Đ´ĐžŅŅŅĐŋĐŊа в **ŅŅ
ĐĩĐŧĐĩ OpenAPI** ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ Đ¸ СаŅĐĩĐŧ ĐžŅОйŅаĐļаĐĩŅŅŅ Đ˛ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии API.
+
+Đĸа ĐļĐĩ иĐŊŅĐžŅĐŧаŅĐ¸Ņ Đ¸Đˇ ĐŧОдĐĩĐģĐĩĐš, вĐēĐģŅŅŅĐŊĐŊĐ°Ņ Đ˛ OpenAPI, ĐŧĐžĐļĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅŅŅ Đ´ĐģŅ **ĐŗĐĩĐŊĐĩŅаŅии ĐēĐģиĐĩĐŊŅŅĐēĐžĐŗĐž ĐēОда**.
+
+### Hey API { #hey-api }
+
+ĐаĐē ŅĐžĐģŅĐēĐž Ņ ĐŊĐ°Ņ ĐĩŅŅŅ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ FastAPI Ņ ĐŧОдĐĩĐģŅĐŧи, ĐŧŅ ĐŧĐžĐļĐĩĐŧ иŅĐŋĐžĐģŅСОваŅŅ Hey API Đ´ĐģŅ ĐŗĐĩĐŊĐĩŅаŅии TypeScriptâĐēĐģиĐĩĐŊŅа. ХаĐŧŅĐš ĐąŅŅŅŅŅĐš ŅĐŋĐžŅОй ŅĐ´ĐĩĐģаŅŅ ŅŅĐž â ŅĐĩŅĐĩС npx.
+
+```sh
+npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client
+```
+
+ĐŅĐž ŅĐŗĐĩĐŊĐĩŅиŅŅĐĩŅ TypeScript SDK в `./src/client`.
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ŅСĐŊаŅŅ, ĐēаĐē ŅŅŅаĐŊОвиŅŅ `@hey-api/openapi-ts` и ĐŋĐžŅиŅаŅŅ Đž ŅĐŗĐĩĐŊĐĩŅиŅОваĐŊĐŊĐžĐŧ ŅĐĩСŅĐģŅŅаŅĐĩ ĐŊа иŅ
ŅаКŅĐĩ.
+
+### ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ SDK { #using-the-sdk }
+
+ĐĸĐĩĐŋĐĩŅŅ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ иĐŧĐŋĐžŅŅиŅОваŅŅ Đ¸ иŅĐŋĐžĐģŅСОваŅŅ ĐēĐģиĐĩĐŊŅŅĐēиК ĐēОд. ĐŅĐž ĐŧĐžĐļĐĩŅ Đ˛ŅĐŗĐģŅĐ´ĐĩŅŅ ŅаĐē, ОйŅаŅиŅĐĩ вĐŊиĐŧаĐŊиĐĩ, ŅŅĐž Đ˛Ņ ĐŋĐžĐģŅŅаĐĩŅĐĩ авŅОСавĐĩŅŅĐĩĐŊиĐĩ Đ´ĐģŅ ĐŧĐĩŅОдoв:
+
+
+
+ĐŅ ŅаĐēĐļĐĩ ĐŋĐžĐģŅŅиŅĐĩ авŅОСавĐĩŅŅĐĩĐŊиĐĩ Đ´ĐģŅ ĐžŅĐŋŅавĐģŅĐĩĐŧОК ĐŋĐžĐģĐĩСĐŊОК ĐŊĐ°ĐŗŅŅСĐēи:
+
+
+
+/// tip | ХОвĐĩŅ
+
+ĐĐąŅаŅиŅĐĩ вĐŊиĐŧаĐŊиĐĩ ĐŊа авŅОСавĐĩŅŅĐĩĐŊиĐĩ Đ´ĐģŅ `name` и `price`, ŅŅĐž ĐąŅĐģĐž ĐžĐŋŅĐĩĐ´ĐĩĐģĐĩĐŊĐž в ĐŋŅиĐģĐžĐļĐĩĐŊии FastAPI, в ĐŧОдĐĩĐģи `Item`.
+
+///
+
+ĐŅ ĐŋĐžĐģŅŅиŅĐĩ ĐžŅийĐēи ĐŋŅŅĐŧĐž в ŅĐĩдаĐēŅĐžŅĐĩ Đ´ĐģŅ ĐžŅĐŋŅавĐģŅĐĩĐŧŅŅ
даĐŊĐŊŅŅ
:
+
+
+
+ĐĐąŅĐĩĐēŅ ĐžŅвĐĩŅа ŅаĐēĐļĐĩ ĐąŅĐ´ĐĩŅ Đ¸ĐŧĐĩŅŅ Đ°Đ˛ŅОСавĐĩŅŅĐĩĐŊиĐĩ:
+
+
+
+## ĐŅиĐģĐžĐļĐĩĐŊиĐĩ FastAPI Ņ ŅĐĩĐŗĐ°Đŧи { #fastapi-app-with-tags }
+
+ĐĐž ĐŧĐŊĐžĐŗĐ¸Ņ
ŅĐģŅŅаŅŅ
ваŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ FastAPI ĐąŅĐ´ĐĩŅ ĐąĐžĐģŅŅĐĩ, и вŅ, вĐĩŅĐžŅŅĐŊĐž, ĐąŅĐ´ĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ ŅĐĩĐŗĐ¸, ŅŅĐžĐąŅ ŅаСдĐĩĐģŅŅŅ ŅаСĐŊŅĐĩ ĐŗŅŅĐŋĐŋŅ *ĐžĐŋĐĩŅаŅиК ĐŋŅŅи*.
+
+ĐаĐŋŅиĐŧĐĩŅ, Ņ Đ˛Đ°Ņ ĐŧĐžĐļĐĩŅ ĐąŅŅŅ ŅаСдĐĩĐģ Đ´ĐģŅ **items** и Đ´ŅŅĐŗĐžĐš ŅаСдĐĩĐģ Đ´ĐģŅ **users**, и ĐžĐŊи ĐŧĐžĐŗŅŅ ĐąŅŅŅ ŅаСдĐĩĐģĐĩĐŊŅ ŅĐĩĐŗĐ°Đŧи:
+
+{* ../../docs_src/generate_clients/tutorial002_py39.py hl[21,26,34] *}
+
+### ĐĐĩĐŊĐĩŅаŅĐ¸Ņ TypeScriptâĐēĐģиĐĩĐŊŅа Ņ ŅĐĩĐŗĐ°Đŧи { #generate-a-typescript-client-with-tags }
+
+ĐŅĐģи Đ˛Ņ ĐŗĐĩĐŊĐĩŅиŅŅĐĩŅĐĩ ĐēĐģиĐĩĐŊŅ Đ´ĐģŅ ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ FastAPI Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩĐŧ ŅĐĩĐŗĐžĐ˛, ОйŅŅĐŊĐž ĐēĐģиĐĩĐŊŅŅĐēиК ĐēОд ŅаĐēĐļĐĩ ĐąŅĐ´ĐĩŅ ŅаСдĐĩĐģŅĐŊ ĐŋĐž ŅĐĩĐŗĐ°Đŧ.
+
+ĐĸаĐēиĐŧ ОйŅаСОĐŧ Đ˛Ņ ŅĐŧĐžĐļĐĩŅĐĩ иĐŧĐĩŅŅ Đ˛ŅŅ ĐŋŅавиĐģŅĐŊĐž ŅĐŋĐžŅŅĐ´ĐžŅĐĩĐŊĐŊŅĐŧ и ŅĐŗŅŅĐŋĐŋиŅОваĐŊĐŊŅĐŧ в ĐēĐģиĐĩĐŊŅŅĐēĐžĐŧ ĐēОдĐĩ:
+
+
+
+Đ ŅŅĐžĐŧ ŅĐģŅŅаĐĩ Ņ Đ˛Đ°Ņ ĐĩŅŅŅ:
+
+* `ItemsService`
+* `UsersService`
+
+### ĐĐŧĐĩĐŊа ĐŧĐĩŅОдОв ĐēĐģиĐĩĐŊŅа { #client-method-names }
+
+ĐĄĐĩĐšŅĐ°Ņ ŅĐŗĐĩĐŊĐĩŅиŅОваĐŊĐŊŅĐĩ иĐŧĐĩĐŊа ĐŧĐĩŅОдОв вŅОдĐĩ `createItemItemsPost` вŅĐŗĐģŅĐ´ŅŅ ĐŊĐĩ ĐžŅĐĩĐŊŅ Đ°ĐēĐēŅŅаŅĐŊĐž:
+
+```TypeScript
+ItemsService.createItemItemsPost({name: "Plumbus", price: 5})
+```
+
+...ŅŅĐž ĐŋĐžŅĐžĐŧŅ, ŅŅĐž ĐŗĐĩĐŊĐĩŅаŅĐžŅ ĐēĐģиĐĩĐŊŅа иŅĐŋĐžĐģŅСŅĐĩŅ Đ˛ĐŊŅŅŅĐĩĐŊĐŊиК **ID ĐžĐŋĐĩŅаŅии** OpenAPI Đ´ĐģŅ ĐēаĐļдОК *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*.
+
+OpenAPI ŅŅĐĩĐąŅĐĩŅ, ŅŅĐžĐąŅ ĐēаĐļĐ´ŅĐš ID ĐžĐŋĐĩŅаŅии ĐąŅĐģ ŅĐŊиĐēаĐģĐĩĐŊ ŅŅĐĩди вŅĐĩŅ
*ĐžĐŋĐĩŅаŅиК ĐŋŅŅи*, ĐŋĐžŅŅĐžĐŧŅ FastAPI иŅĐŋĐžĐģŅСŅĐĩŅ **иĐŧŅ ŅŅĐŊĐēŅии**, **ĐŋŅŅŅ** и **HTTPâĐŧĐĩŅОд/ĐžĐŋĐĩŅаŅиŅ** Đ´ĐģŅ ĐŗĐĩĐŊĐĩŅаŅии ŅŅĐžĐŗĐž ID ĐžĐŋĐĩŅаŅии, ŅаĐē ĐēаĐē ŅаĐēиĐŧ ОйŅаСОĐŧ ĐŧĐžĐļĐŊĐž ĐŗĐ°ŅаĐŊŅиŅОваŅŅ ŅĐŊиĐēаĐģŅĐŊĐžŅŅŅ ID ĐžĐŋĐĩŅаŅиК.
+
+ĐĐž даĐģĐĩĐĩ Ņ ĐŋĐžĐēаĐļŅ, ĐēаĐē ŅŅĐž ŅĐģŅŅŅиŅŅ. đ¤
+
+## ĐĐžĐģŅСОваŅĐĩĐģŅŅĐēиĐĩ ID ĐžĐŋĐĩŅаŅиК и ĐģŅŅŅиĐĩ иĐŧĐĩĐŊа ĐŧĐĩŅОдОв { #custom-operation-ids-and-better-method-names }
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ **иСĐŧĐĩĐŊиŅŅ** ŅĐŋĐžŅОй **ĐŗĐĩĐŊĐĩŅаŅии** ŅŅиŅ
ID ĐžĐŋĐĩŅаŅиК, ŅŅĐžĐąŅ ŅĐ´ĐĩĐģаŅŅ Đ¸Ņ
ĐŋŅĐžŅĐĩ, а иĐŧĐĩĐŊа ĐŧĐĩŅОдОв в ĐēĐģиĐĩĐŊŅаŅ
â **йОĐģĐĩĐĩ ĐŋŅĐžŅŅŅĐŧи**.
+
+Đ ŅŅĐžĐŧ ŅĐģŅŅаĐĩ ваĐŧ ĐŊŅĐļĐŊĐž ĐąŅĐ´ĐĩŅ ĐžĐąĐĩŅĐŋĐĩŅиŅŅ, ŅŅĐžĐąŅ ĐēаĐļĐ´ŅĐš ID ĐžĐŋĐĩŅаŅии ĐąŅĐģ **ŅĐŊиĐēаĐģŅĐŊŅĐŧ** Đ´ŅŅĐŗĐ¸Đŧ ŅĐŋĐžŅОйОĐŧ.
+
+ĐаĐŋŅиĐŧĐĩŅ, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐŗĐ°ŅаĐŊŅиŅОваŅŅ, ŅŅĐž Ņ ĐēаĐļдОК *ĐžĐŋĐĩŅаŅии ĐŋŅŅи* ĐĩŅŅŅ ŅĐĩĐŗ, и СаŅĐĩĐŧ ĐŗĐĩĐŊĐĩŅиŅОваŅŅ ID ĐžĐŋĐĩŅаŅии ĐŊа ĐžŅĐŊОвĐĩ **ŅĐĩĐŗĐ°** и **иĐŧĐĩĐŊи** *ĐžĐŋĐĩŅаŅии ĐŋŅŅи* (иĐŧĐĩĐŊи ŅŅĐŊĐēŅии).
+
+### ĐĐžĐģŅСОваŅĐĩĐģŅŅĐēĐ°Ņ ŅŅĐŊĐēŅĐ¸Ņ ĐŗĐĩĐŊĐĩŅаŅии ŅĐŊиĐēаĐģŅĐŊĐžĐŗĐž ID { #custom-generate-unique-id-function }
+
+FastAPI иŅĐŋĐžĐģŅСŅĐĩŅ **ŅĐŊиĐēаĐģŅĐŊŅĐš ID** Đ´ĐģŅ ĐēаĐļдОК *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*, ĐēĐžŅĐžŅŅĐš ĐŋŅиĐŧĐĩĐŊŅĐĩŅŅŅ Đ´ĐģŅ **ID ĐžĐŋĐĩŅаŅии**, а ŅаĐēĐļĐĩ Đ´ĐģŅ Đ¸ĐŧŅĐŊ ĐģŅĐąŅŅ
ĐŊĐĩОйŅ
ОдиĐŧŅŅ
ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиŅ
ĐŧОдĐĩĐģĐĩĐš СаĐŋŅĐžŅОв иĐģи ĐžŅвĐĩŅОв.
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ĐēаŅŅĐžĐŧиСиŅОваŅŅ ŅŅŅ ŅŅĐŊĐēŅиŅ. ĐĐŊа ĐŋŅиĐŊиĐŧаĐĩŅ `APIRoute` и вОСвŅаŅаĐĩŅ ŅŅŅĐžĐēŅ.
+
+ĐаĐŋŅиĐŧĐĩŅ, СдĐĩŅŅ ĐąĐĩŅŅŅŅŅ ĐŋĐĩŅвŅĐš ŅĐĩĐŗ (ŅĐēĐžŅĐĩĐĩ вŅĐĩĐŗĐž Ņ Đ˛Đ°Ņ ĐžĐ´Đ¸ĐŊ ŅĐĩĐŗ) и иĐŧŅ *ĐžĐŋĐĩŅаŅии ĐŋŅŅи* (иĐŧŅ ŅŅĐŊĐēŅии).
+
+ĐаŅĐĩĐŧ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐŋĐĩŅĐĩдаŅŅ ŅŅŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēŅŅ ŅŅĐŊĐēŅĐ¸Ņ Đ˛ **FastAPI** ŅĐĩŅĐĩС ĐŋаŅаĐŧĐĩŅŅ `generate_unique_id_function`:
+
+{* ../../docs_src/generate_clients/tutorial003_py39.py hl[6:7,10] *}
+
+### ĐĐĩĐŊĐĩŅаŅĐ¸Ņ TypeScriptâĐēĐģиĐĩĐŊŅа Ņ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиĐŧи ID ĐžĐŋĐĩŅаŅиК { #generate-a-typescript-client-with-custom-operation-ids }
+
+ĐĸĐĩĐŋĐĩŅŅ, ĐĩŅĐģи ŅĐŊОва ŅĐŗĐĩĐŊĐĩŅиŅОваŅŅ ĐēĐģиĐĩĐŊŅ, Đ˛Ņ ŅвидиŅĐĩ, ŅŅĐž иĐŧĐĩĐŊа ĐŧĐĩŅОдОв ŅĐģŅŅŅиĐģиŅŅ:
+
+
+
+ĐаĐē видиŅĐĩ, ŅĐĩĐŋĐĩŅŅ Đ¸ĐŧĐĩĐŊа ĐŧĐĩŅОдОв ŅОдĐĩŅĐļĐ°Ņ ŅĐĩĐŗ, а СаŅĐĩĐŧ иĐŧŅ ŅŅĐŊĐēŅии; йОĐģŅŅĐĩ ĐžĐŊи ĐŊĐĩ вĐēĐģŅŅаŅŅ Đ¸ĐŊŅĐžŅĐŧаŅĐ¸Ņ Đ¸Đˇ URLâĐŋŅŅи и HTTPâĐžĐŋĐĩŅаŅии.
+
+### ĐŅĐĩдОйŅайОŅĐēа ŅĐŋĐĩŅиŅиĐēаŅии OpenAPI Đ´ĐģŅ ĐŗĐĩĐŊĐĩŅаŅĐžŅа ĐēĐģиĐĩĐŊŅа { #preprocess-the-openapi-specification-for-the-client-generator }
+
+ĐĄĐŗĐĩĐŊĐĩŅиŅОваĐŊĐŊĐžĐŧ ĐēОдĐĩ вŅŅ ĐĩŅŅ ĐĩŅŅŅ **Đ´ŅĐąĐģиŅŅŅŅаŅŅŅ Đ¸ĐŊŅĐžŅĐŧаŅиŅ**.
+
+ĐŅ ŅĐļĐĩ СĐŊаĐĩĐŧ, ŅŅĐž ŅŅĐžŅ ĐŧĐĩŅОд ĐžŅĐŊĐžŅиŅŅŅ Đē **items**, ĐŋĐžŅĐžĐŧŅ ŅŅĐž ŅŅĐž ŅĐģОвО ĐĩŅŅŅ Đ˛ `ItemsService` (вСŅŅĐž иС ŅĐĩĐŗĐ°), ĐŊĐž ĐŋŅи ŅŅĐžĐŧ иĐŧŅ ŅĐĩĐŗĐ° вŅŅ ĐĩŅŅ Đ´ĐžĐąĐ°Đ˛ĐģĐĩĐŊĐž ĐŋŅĐĩŅиĐēŅĐžĐŧ Đē иĐŧĐĩĐŊи ĐŧĐĩŅОда. đ
+
+ĐĄĐēĐžŅĐĩĐĩ вŅĐĩĐŗĐž ĐŧŅ ĐˇĐ°Ņ
ĐžŅиĐŧ ĐžŅŅавиŅŅ ŅŅĐž в OpenAPI в ŅĐĩĐģĐžĐŧ, ŅаĐē ĐēаĐē ŅŅĐž ĐŗĐ°ŅаĐŊŅиŅŅĐĩŅ, ŅŅĐž ID ĐžĐŋĐĩŅаŅиК ĐąŅĐ´ŅŅ **ŅĐŊиĐēаĐģŅĐŊŅ**.
+
+ĐĐž Đ´ĐģŅ ŅĐŗĐĩĐŊĐĩŅиŅОваĐŊĐŊĐžĐŗĐž ĐēĐģиĐĩĐŊŅа ĐŧŅ ĐŧĐžĐļĐĩĐŧ **ĐŧОдиŅиŅиŅОваŅŅ** ID ĐžĐŋĐĩŅаŅиК OpenAPI ĐŊĐĩĐŋĐžŅŅĐĩĐ´ŅŅвĐĩĐŊĐŊĐž ĐŋĐĩŅĐĩĐ´ ĐŗĐĩĐŊĐĩŅаŅиĐĩĐš ĐēĐģиĐĩĐŊŅОв, ŅŅĐžĐąŅ ŅĐ´ĐĩĐģаŅŅ Đ¸ĐŧĐĩĐŊа ĐŧĐĩŅОдОв йОĐģĐĩĐĩ ĐŋŅиŅŅĐŊŅĐŧи и **ŅиŅŅŅĐŧи**.
+
+ĐŅ ĐŧĐžĐļĐĩĐŧ ŅĐēаŅаŅŅ OpenAPI JSON в ŅаКĐģ `openapi.json`, а СаŅĐĩĐŧ **ŅĐąŅаŅŅ ŅŅĐžŅ ĐŋŅĐĩŅиĐēŅâŅĐĩĐŗ** ŅаĐēиĐŧ ŅĐēŅиĐŋŅĐžĐŧ:
+
+{* ../../docs_src/generate_clients/tutorial004.py *}
+
+//// tab | Node.js
+
+```Javascript
+{!> ../../docs_src/generate_clients/tutorial004.js!}
+```
+
+////
+
+ĐĐžŅĐģĐĩ ŅŅĐžĐŗĐž ID ĐžĐŋĐĩŅаŅиК ĐąŅĐ´ŅŅ ĐŋĐĩŅĐĩиĐŧĐĩĐŊОваĐŊŅ Ņ ŅĐĩĐŗĐžâŅĐž вŅОдĐĩ `items-get_items` ĐŋŅĐžŅŅĐž в `get_items`, и ĐŗĐĩĐŊĐĩŅаŅĐžŅ ĐēĐģиĐĩĐŊŅа ŅĐŧĐžĐļĐĩŅ ŅОСдаваŅŅ ĐąĐžĐģĐĩĐĩ ĐŋŅĐžŅŅŅĐĩ иĐŧĐĩĐŊа ĐŧĐĩŅОдОв.
+
+### ĐĐĩĐŊĐĩŅаŅĐ¸Ņ TypeScriptâĐēĐģиĐĩĐŊŅа Ņ ĐŋŅĐĩдОйŅайОŅаĐŊĐŊŅĐŧ OpenAPI { #generate-a-typescript-client-with-the-preprocessed-openapi }
+
+ĐĸаĐē ĐēаĐē ĐēĐžĐŊĐĩŅĐŊŅĐš ŅĐĩСŅĐģŅŅĐ°Ņ ŅĐĩĐŋĐĩŅŅ Đ˛ ŅаКĐģĐĩ `openapi.json`, ĐŊŅĐļĐŊĐž ОйĐŊОвиŅŅ Đ˛Ņ
ОдĐŊĐžĐĩ ŅаŅĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ:
+
+```sh
+npx @hey-api/openapi-ts -i ./openapi.json -o src/client
+```
+
+ĐĐžŅĐģĐĩ ĐŗĐĩĐŊĐĩŅаŅии ĐŊĐžĐ˛ĐžĐŗĐž ĐēĐģиĐĩĐŊŅа Ņ Đ˛Đ°Ņ ĐąŅĐ´ŅŅ **ŅиŅŅŅĐĩ иĐŧĐĩĐŊа ĐŧĐĩŅОдОв**, ŅĐž вŅĐĩĐŧ **авŅОСавĐĩŅŅĐĩĐŊиĐĩĐŧ**, **ĐžŅийĐēаĐŧи ĐŋŅŅĐŧĐž в ŅĐĩдаĐēŅĐžŅĐĩ** и Ņ.Đ´.:
+
+
+
+## ĐŅĐĩиĐŧŅŅĐĩŅŅва { #benefits }
+
+ĐŅи иŅĐŋĐžĐģŅСОваĐŊии авŅĐžĐŧаŅиŅĐĩŅĐēи ŅĐŗĐĩĐŊĐĩŅиŅОваĐŊĐŊŅŅ
ĐēĐģиĐĩĐŊŅОв Đ˛Ņ ĐŋĐžĐģŅŅиŅĐĩ **авŅОСавĐĩŅŅĐĩĐŊиĐĩ** Đ´ĐģŅ:
+
+* ĐĐĩŅОдОв.
+* ĐаĐŊĐŊŅŅ
СаĐŋŅĐžŅа â в ŅĐĩĐģĐĩ СаĐŋŅĐžŅа, queryâĐŋаŅаĐŧĐĩŅŅаŅ
и Ņ.Đ´.
+* ĐаĐŊĐŊŅŅ
ĐžŅвĐĩŅа.
+
+ĐŖ Đ˛Đ°Ņ ŅаĐēĐļĐĩ ĐąŅĐ´ŅŅ **ĐžŅийĐēи ĐŋŅŅĐŧĐž в ŅĐĩдаĐēŅĐžŅĐĩ** Đ´ĐģŅ Đ˛ŅĐĩĐŗĐž.
+
+Đ ĐēаĐļĐ´ŅĐš ŅаС, ĐēĐžĐŗĐ´Đ° Đ˛Ņ ĐžĐąĐŊОвĐģŅĐĩŅĐĩ ĐēОд ĐąŅĐēĐĩĐŊда и **ĐŋĐĩŅĐĩĐŗĐĩĐŊĐĩŅиŅŅĐĩŅĐĩ** ŅŅĐžĐŊŅĐĩĐŊĐ´, в ĐŊŅĐŧ ĐŋĐžŅвŅŅŅŅ ĐŊОвŅĐĩ *ĐžĐŋĐĩŅаŅии ĐŋŅŅи* ĐēаĐē ĐŧĐĩŅОдŅ, ŅŅаŅŅĐĩ ĐąŅĐ´ŅŅ ŅдаĐģĐĩĐŊŅ, а ĐģŅĐąŅĐĩ Đ´ŅŅĐŗĐ¸Đĩ иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ ĐžŅŅаСŅŅŅŅ Đ˛ ŅĐŗĐĩĐŊĐĩŅиŅОваĐŊĐŊĐžĐŧ ĐēОдĐĩ. đ¤
+
+ĐŅĐž ŅаĐēĐļĐĩ ОСĐŊаŅаĐĩŅ, ŅŅĐž ĐĩŅĐģи ŅŅĐžâŅĐž иСĐŧĐĩĐŊиĐģĐžŅŅ, ŅŅĐž ĐąŅĐ´ĐĩŅ **ĐžŅŅаĐļĐĩĐŊĐž** в ĐēĐģиĐĩĐŊŅŅĐēĐžĐŧ ĐēОдĐĩ авŅĐžĐŧаŅиŅĐĩŅĐēи. Đ ĐĩŅĐģи Đ˛Ņ **ŅОйĐĩŅŅŅĐĩ** ĐēĐģиĐĩĐŊŅ, ĐžĐŊ СавĐĩŅŅиŅŅŅ Ņ ĐžŅийĐēОК, ĐĩŅĐģи ĐŗĐ´ĐĩâŅĐž ĐĩŅŅŅ **ĐŊĐĩŅООŅвĐĩŅŅŅвиĐĩ** в иŅĐŋĐžĐģŅСŅĐĩĐŧŅŅ
даĐŊĐŊŅŅ
.
+
+ĐĸаĐēиĐŧ ОйŅаСОĐŧ, Đ˛Ņ **ОйĐŊаŅŅĐļиŅĐĩ ĐŧĐŊĐžĐŗĐ¸Đĩ ĐžŅийĐēи** ĐžŅĐĩĐŊŅ ŅаĐŊĐž в ŅиĐēĐģĐĩ ŅаСŅайОŅĐēи, вĐŧĐĩŅŅĐž ŅĐžĐŗĐž ŅŅĐžĐąŅ ĐļдаŅŅ, ĐēĐžĐŗĐ´Đ° ĐžŅийĐēи ĐŋŅĐžŅвŅŅŅŅ Ņ ĐēĐžĐŊĐĩŅĐŊŅŅ
ĐŋĐžĐģŅСОваŅĐĩĐģĐĩĐš в ĐŋŅОдаĐēŅĐŊ, и СаŅĐĩĐŧ ĐŋŅŅаŅŅŅŅ ĐžŅĐģадиŅŅ, в ŅŅĐŧ ĐŋŅОйĐģĐĩĐŧа. â¨
diff --git a/docs/ru/docs/advanced/index.md b/docs/ru/docs/advanced/index.md
index b5cb733e7..c0a52c6c1 100644
--- a/docs/ru/docs/advanced/index.md
+++ b/docs/ru/docs/advanced/index.md
@@ -1,12 +1,12 @@
-# РаŅŅиŅĐĩĐŊĐŊĐžĐĩ ŅŅĐēОвОдŅŅвО ĐŋĐžĐģŅСОваŅĐĩĐģŅ
+# РаŅŅиŅĐĩĐŊĐŊĐžĐĩ ŅŅĐēОвОдŅŅвО ĐŋĐžĐģŅСОваŅĐĩĐģŅ { #advanced-user-guide }
-## ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ вОСĐŧĐžĐļĐŊĐžŅŅи
+## ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ вОСĐŧĐžĐļĐŊĐžŅŅи { #additional-features }
ĐŅĐŊОвĐŊĐžĐĩ [ĐŖŅĐĩĐąĐŊиĐē - Đ ŅĐēОвОдŅŅвО ĐŋĐžĐģŅСОваŅĐĩĐģŅ](../tutorial/index.md){.internal-link target=_blank} Đ´ĐžĐģĐļĐŊĐž ĐąŅŅŅ Đ´ĐžŅŅаŅĐžŅĐŊĐž, ŅŅĐžĐąŅ ĐŋОСĐŊаĐēĐžĐŧиŅŅ Đ˛Đ°Ņ ŅĐž вŅĐĩĐŧи ĐžŅĐŊОвĐŊŅĐŧи ŅŅĐŊĐēŅиŅĐŧи **FastAPI**.
Đ ŅĐģĐĩĐ´ŅŅŅиŅ
ŅаСдĐĩĐģаŅ
Đ˛Ņ ŅвидиŅĐĩ Đ´ŅŅĐŗĐ¸Đĩ ваŅиаĐŊŅŅ, ĐēĐžĐŊŅĐ¸ĐŗŅŅаŅии и Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ вОСĐŧĐžĐļĐŊĐžŅŅи.
-/// tip
+/// tip | ХОвĐĩŅ
ĐĄĐģĐĩĐ´ŅŅŅиĐĩ ŅаСдĐĩĐģŅ **ĐŊĐĩ ОйŅСаŅĐĩĐģŅĐŊĐž ŅвĐģŅŅŅŅŅ "ĐŋŅОдвиĐŊŅŅŅĐŧи"**.
@@ -14,7 +14,7 @@
///
-## ĐĄĐŊаŅаĐģа ĐŋŅĐžŅиŅаКŅĐĩ ĐŖŅĐĩĐąĐŊиĐē - Đ ŅĐēОвОдŅŅвО ĐŋĐžĐģŅСОваŅĐĩĐģŅ
+## ĐĄĐŊаŅаĐģа ĐŋŅĐžŅиŅаКŅĐĩ ĐŖŅĐĩĐąĐŊиĐē - Đ ŅĐēОвОдŅŅвО ĐŋĐžĐģŅСОваŅĐĩĐģŅ { #read-the-tutorial-first }
ĐŅ Đ˛ŅĐĩ ĐĩŅĐĩ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ ĐąĐžĐģŅŅиĐŊŅŅвО ŅŅĐŊĐēŅиК **FastAPI** ŅĐž СĐŊаĐŊиŅĐŧи иС [ĐŖŅĐĩĐąĐŊиĐē - Đ ŅĐēОвОдŅŅвО ĐŋĐžĐģŅСОваŅĐĩĐģŅ](../tutorial/index.md){.internal-link target=_blank}.
diff --git a/docs/ru/docs/advanced/middleware.md b/docs/ru/docs/advanced/middleware.md
new file mode 100644
index 000000000..28802fd57
--- /dev/null
+++ b/docs/ru/docs/advanced/middleware.md
@@ -0,0 +1,97 @@
+# РаŅŅиŅĐĩĐŊĐŊĐžĐĩ иŅĐŋĐžĐģŅСОваĐŊиĐĩ middleware { #advanced-middleware }
+
+Đ ĐžŅĐŊОвĐŊĐžĐŧ ŅŅĐēОвОдŅŅвĐĩ Đ˛Ņ ŅиŅаĐģи, ĐēаĐē дОйавиŅŅ [ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēĐžĐĩ middleware](../tutorial/middleware.md){.internal-link target=_blank} в ваŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ.
+
+РСаŅĐĩĐŧ â ĐēаĐē ŅайОŅаŅŅ Ņ [CORS Ņ ĐŋĐžĐŧĐžŅŅŅ `CORSMiddleware`](../tutorial/cors.md){.internal-link target=_blank}.
+
+Đ ŅŅĐžĐŧ ŅаСдĐĩĐģĐĩ ĐŋĐžŅĐŧĐžŅŅиĐŧ, ĐēаĐē иŅĐŋĐžĐģŅСОваŅŅ Đ´ŅŅĐŗĐ¸Đĩ middleware.
+
+## ĐОйавĐģĐĩĐŊиĐĩ ASGI middleware { #adding-asgi-middlewares }
+
+ĐĸаĐē ĐēаĐē **FastAPI** ĐžŅĐŊОваĐŊ ĐŊа Starlette и ŅĐĩаĐģиСŅĐĩŅ ŅĐŋĐĩŅиŅиĐēаŅĐ¸Ņ ASGI, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ ĐģŅйОĐĩ ASGI middleware.
+
+Middleware ĐŊĐĩ ОйŅСаŅĐĩĐģŅĐŊĐž Đ´ĐžĐģĐļĐŊĐž ĐąŅŅŅ ŅĐ´ĐĩĐģаĐŊĐž ŅĐŋĐĩŅиаĐģŅĐŊĐž Đ´ĐģŅ FastAPI иĐģи Starlette â Đ´ĐžŅŅаŅĐžŅĐŊĐž, ŅŅĐžĐąŅ ĐžĐŊĐž ŅООŅвĐĩŅŅŅвОваĐģĐž ŅĐŋĐĩŅиŅиĐēаŅии ASGI.
+
+РОйŅĐĩĐŧ ŅĐģŅŅаĐĩ ASGI middleware â ŅŅĐž ĐēĐģаŅŅŅ, ĐēĐžŅĐžŅŅĐĩ ĐžĐļидаŅŅ ĐŋĐžĐģŅŅиŅŅ ASGIâĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐŋĐĩŅвŅĐŧ аŅĐŗŅĐŧĐĩĐŊŅĐžĐŧ.
+
+ĐĐžŅŅĐžĐŧŅ Đ˛ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии Đē ŅŅĐžŅĐžĐŊĐŊиĐŧ ASGI middleware, ŅĐēĐžŅĐĩĐĩ вŅĐĩĐŗĐž, Đ˛Ņ ŅвидиŅĐĩ ŅŅĐžâŅĐž вŅОдĐĩ:
+
+```Python
+from unicorn import UnicornMiddleware
+
+app = SomeASGIApp()
+
+new_app = UnicornMiddleware(app, some_config="rainbow")
+```
+
+ĐĐž FastAPI (ŅĐžŅĐŊĐĩĐĩ, Starlette) ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ ĐąĐžĐģĐĩĐĩ ĐŋŅĐžŅŅОК ŅĐŋĐžŅОй, ĐēĐžŅĐžŅŅĐš ĐŗĐ°ŅаĐŊŅиŅŅĐĩŅ ĐēĐžŅŅĐĩĐēŅĐŊŅŅ ĐžĐąŅайОŅĐēŅ Đ˛ĐŊŅŅŅĐĩĐŊĐŊиŅ
ĐžŅийОĐē ŅĐĩŅвĐĩŅа и ĐēĐžŅŅĐĩĐēŅĐŊŅŅ ŅайОŅŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиŅ
ОйŅайОŅŅиĐēОв иŅĐēĐģŅŅĐĩĐŊиК.
+
+ĐĐģŅ ŅŅĐžĐŗĐž иŅĐŋĐžĐģŅСŅĐšŅĐĩ `app.add_middleware()` (ĐēаĐē в ĐŋŅиĐŧĐĩŅĐĩ Ņ CORS).
+
+```Python
+from fastapi import FastAPI
+from unicorn import UnicornMiddleware
+
+app = FastAPI()
+
+app.add_middleware(UnicornMiddleware, some_config="rainbow")
+```
+
+`app.add_middleware()` ĐŋŅиĐŊиĐŧаĐĩŅ ĐēĐģаŅŅ middleware в ĐēаŅĐĩŅŅвĐĩ ĐŋĐĩŅĐ˛ĐžĐŗĐž аŅĐŗŅĐŧĐĩĐŊŅа и ĐģŅĐąŅĐĩ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ аŅĐŗŅĐŧĐĩĐŊŅŅ, ĐēĐžŅĐžŅŅĐĩ ĐąŅĐ´ŅŅ ĐŋĐĩŅĐĩдаĐŊŅ ŅŅĐžĐŧŅ middleware.
+
+## ĐŅŅŅĐžĐĩĐŊĐŊŅĐĩ middleware { #integrated-middlewares }
+
+**FastAPI** вĐēĐģŅŅаĐĩŅ ĐŊĐĩŅĐēĐžĐģŅĐēĐž middleware Đ´ĐģŅ ŅаŅĐŋŅĐžŅŅŅаĐŊŅĐŊĐŊŅŅ
ŅŅĐĩĐŊаŅиĐĩв. ĐиĐļĐĩ ŅаŅŅĐŧĐžŅŅиĐŧ, ĐēаĐē иŅ
иŅĐŋĐžĐģŅСОваŅŅ.
+
+/// note | ĐĸĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ Đ´ĐĩŅаĐģи
+
+Đ ŅĐģĐĩĐ´ŅŅŅиŅ
ĐŋŅиĐŧĐĩŅаŅ
Đ˛Ņ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ `from starlette.middleware.something import SomethingMiddleware`.
+
+**FastAPI** ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ ĐŊĐĩŅĐēĐžĐģŅĐēĐž middleware в `fastapi.middleware` Đ´ĐģŅ ŅдОйŅŅва ŅаСŅайОŅŅиĐēа. ĐĐž йОĐģŅŅиĐŊŅŅвО Đ´ĐžŅŅŅĐŋĐŊŅŅ
middleware ĐŋŅиŅ
ĐžĐ´Đ¸Ņ ĐŊаĐŋŅŅĐŧŅŅ Đ¸Đˇ Starlette.
+
+///
+
+## `HTTPSRedirectMiddleware` { #httpsredirectmiddleware }
+
+ĐаŅаĐŊŅиŅŅĐĩŅ, ŅŅĐž вŅĐĩ вŅ
ОдŅŅиĐĩ СаĐŋŅĐžŅŅ Đ´ĐžĐģĐļĐŊŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ ĐģийО `https`, ĐģийО `wss`.
+
+ĐŅйОК вŅ
ОдŅŅиК СаĐŋŅĐžŅ ĐŋĐž `http` иĐģи `ws` ĐąŅĐ´ĐĩŅ ĐŋĐĩŅĐĩĐŊаĐŋŅавĐģĐĩĐŊ ĐŊа ĐąĐĩСОĐŋаŅĐŊŅŅ ŅŅ
ĐĩĐŧŅ.
+
+{* ../../docs_src/advanced_middleware/tutorial001.py hl[2,6] *}
+
+## `TrustedHostMiddleware` { #trustedhostmiddleware }
+
+ĐаŅаĐŊŅиŅŅĐĩŅ, ŅŅĐž вО вŅĐĩŅ
вŅ
ОдŅŅиŅ
СаĐŋŅĐžŅаŅ
ĐēĐžŅŅĐĩĐēŅĐŊĐž ŅŅŅаĐŊОвĐģĐĩĐŊ `Host`âĐˇĐ°ĐŗĐžĐģОвОĐē, ŅŅĐžĐąŅ ĐˇĐ°ŅиŅиŅŅŅŅ ĐžŅ Đ°ŅаĐē ĐŊа HTTPâĐˇĐ°ĐŗĐžĐģОвОĐē Host.
+
+{* ../../docs_src/advanced_middleware/tutorial002.py hl[2,6:8] *}
+
+ĐОддĐĩŅĐļиваŅŅŅŅ ŅĐģĐĩĐ´ŅŅŅиĐĩ аŅĐŗŅĐŧĐĩĐŊŅŅ:
+
+- `allowed_hosts` â ŅĐŋиŅĐžĐē Đ´ĐžĐŧĐĩĐŊĐŊŅŅ
иĐŧŅĐŊ, ĐēĐžŅĐžŅŅĐĩ ŅĐģĐĩĐ´ŅĐĩŅ ŅаСŅĐĩŅиŅŅ ĐēаĐē иĐŧĐĩĐŊа Ņ
ĐžŅŅОв. ĐОдŅŅаĐŊОвĐēи вида `*.example.com` ĐŋОддĐĩŅĐļиваŅŅŅŅ Đ´ĐģŅ ŅĐžĐŋĐžŅŅавĐģĐĩĐŊĐ¸Ņ ĐŋОддОĐŧĐĩĐŊОв. ЧŅĐžĐąŅ ŅаСŅĐĩŅиŅŅ ĐģŅйОК Ņ
ĐžŅŅ, иŅĐŋĐžĐģŅСŅĐšŅĐĩ ĐģийО `allowed_hosts=["*"]`, ĐģийО ĐŊĐĩ дОйавĐģŅĐšŅĐĩ ŅŅĐž middleware.
+- `www_redirect` â ĐĩŅĐģи ŅŅŅаĐŊОвĐģĐĩĐŊĐž в True, СаĐŋŅĐžŅŅ Đē ĐŊĐĩâwww вĐĩŅŅиŅĐŧ ŅаСŅĐĩŅŅĐŊĐŊŅŅ
Ņ
ĐžŅŅОв ĐąŅĐ´ŅŅ ĐŋĐĩŅĐĩĐŊаĐŋŅавĐģŅŅŅŅŅ ĐŊа иŅ
wwwâаĐŊаĐģĐžĐŗĐ¸. ĐĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ â `True`.
+
+ĐŅĐģи вŅ
ОдŅŅиК СаĐŋŅĐžŅ ĐŊĐĩ ĐŋŅĐžŅ
ĐžĐ´Đ¸Ņ Đ˛Đ°ĐģидаŅиŅ, ĐąŅĐ´ĐĩŅ ĐžŅĐŋŅавĐģĐĩĐŊ ĐžŅвĐĩŅ `400`.
+
+## `GZipMiddleware` { #gzipmiddleware }
+
+ĐĐąŅайаŅŅваĐĩŅ GZipâĐžŅвĐĩŅŅ Đ´ĐģŅ ĐģŅĐąŅŅ
СаĐŋŅĐžŅОв, ĐēĐžŅĐžŅŅĐĩ вĐēĐģŅŅаŅŅ `"gzip"` в ĐˇĐ°ĐŗĐžĐģОвĐēĐĩ `Accept-Encoding`.
+
+ĐŅĐž middleware ОйŅайаŅŅваĐĩŅ ĐēаĐē ОйŅŅĐŊŅĐĩ, ŅаĐē и ĐŋĐžŅĐžĐēОвŅĐĩ ĐžŅвĐĩŅŅ.
+
+{* ../../docs_src/advanced_middleware/tutorial003.py hl[2,6] *}
+
+ĐОддĐĩŅĐļиваŅŅŅŅ ŅĐģĐĩĐ´ŅŅŅиĐĩ аŅĐŗŅĐŧĐĩĐŊŅŅ:
+
+- `minimum_size` â ĐŊĐĩ ŅĐļиĐŧаŅŅ GZipâĐžĐŧ ĐžŅвĐĩŅŅ, ŅаСĐŧĐĩŅ ĐēĐžŅĐžŅŅŅ
ĐŧĐĩĐŊŅŅĐĩ ŅŅĐžĐŗĐž ĐŧиĐŊиĐŧаĐģŅĐŊĐžĐŗĐž СĐŊаŅĐĩĐŊĐ¸Ņ Đ˛ йаКŅаŅ
. ĐĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ â `500`.
+- `compresslevel` â ŅŅОвĐĩĐŊŅ GZipâŅĐļаŅиŅ. ĐĻĐĩĐģĐžĐĩ ŅиŅĐģĐž ĐžŅ 1 Đ´Đž 9. ĐĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ â `9`. ĐĐžĐģĐĩĐĩ ĐŊиСĐēĐžĐĩ СĐŊаŅĐĩĐŊиĐĩ â ĐąŅŅŅŅĐĩĐĩĐĩ ŅĐļаŅиĐĩ, ĐŊĐž йОĐģŅŅиК ŅаСĐŧĐĩŅ ŅаКĐģа; йОĐģĐĩĐĩ вŅŅĐžĐēĐžĐĩ СĐŊаŅĐĩĐŊиĐĩ â йОĐģĐĩĐĩ ĐŧĐĩĐ´ĐģĐĩĐŊĐŊĐžĐĩ ŅĐļаŅиĐĩ, ĐŊĐž ĐŧĐĩĐŊŅŅиК ŅаСĐŧĐĩŅ ŅаКĐģа.
+
+## ĐŅŅĐŗĐ¸Đĩ middleware { #other-middlewares }
+
+ĐĄŅŅĐĩŅŅвŅĐĩŅ ĐŧĐŊĐžĐŗĐž Đ´ŅŅĐŗĐ¸Ņ
ASGI middleware.
+
+ĐаĐŋŅиĐŧĐĩŅ:
+
+- `ProxyHeadersMiddleware` ĐžŅ Uvicorn
+- MessagePack
+
+ЧŅĐžĐąŅ ŅвидĐĩŅŅ Đ´ŅŅĐŗĐ¸Đĩ Đ´ĐžŅŅŅĐŋĐŊŅĐĩ middleware, ĐŋĐžŅĐŧĐžŅŅиŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ ĐŋĐž middleware в Starlette и ŅĐŋиŅĐžĐē ASGI Awesome.
diff --git a/docs/ru/docs/advanced/openapi-callbacks.md b/docs/ru/docs/advanced/openapi-callbacks.md
new file mode 100644
index 000000000..faf58370b
--- /dev/null
+++ b/docs/ru/docs/advanced/openapi-callbacks.md
@@ -0,0 +1,186 @@
+# ĐĐąŅаŅĐŊŅĐĩ вŅĐˇĐžĐ˛Ņ Đ˛ OpenAPI { #openapi-callbacks }
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ŅОСдаŅŅ API Ņ *ĐžĐŋĐĩŅаŅиĐĩĐš ĐŋŅŅи* (ОйŅайОŅŅиĐēĐžĐŧ ĐŋŅŅи), ĐēĐžŅĐžŅĐ°Ņ ĐąŅĐ´ĐĩŅ Đ¸ĐŊиŅииŅОваŅŅ HTTP-СаĐŋŅĐžŅ Đē *вĐŊĐĩŅĐŊĐĩĐŧŅ API*, ŅОСдаĐŊĐŊĐžĐŧŅ ĐēĐĩĐŧ-ŅĐž Đ´ŅŅĐŗĐ¸Đŧ (ŅĐēĐžŅĐĩĐĩ вŅĐĩĐŗĐž ŅĐĩĐŧ ĐļĐĩ ŅаСŅайОŅŅиĐēĐžĐŧ, ĐēĐžŅĐžŅŅĐš ĐąŅĐ´ĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ Đ˛Đ°Ņ API).
+
+ĐŅĐžŅĐĩŅŅ, ĐŋŅОиŅŅ
ОдŅŅиК, ĐēĐžĐŗĐ´Đ° ваŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ API ОйŅаŅаĐĩŅŅŅ Đē *вĐŊĐĩŅĐŊĐĩĐŧŅ API*, ĐŊаСŅваĐĩŅŅŅ ÂĢcallbackÂģ (ОйŅаŅĐŊŅĐš вŅСОв). ĐŅĐžĐŗŅаĐŧĐŧĐŊĐžĐĩ ОйĐĩŅĐŋĐĩŅĐĩĐŊиĐĩ, ĐŊаĐŋиŅаĐŊĐŊĐžĐĩ вĐŊĐĩŅĐŊиĐŧ ŅаСŅайОŅŅиĐēĐžĐŧ, ĐžŅĐŋŅавĐģŅĐĩŅ HTTP-СаĐŋŅĐžŅ Đ˛Đ°ŅĐĩĐŧŅ API, а СаŅĐĩĐŧ Đ˛Đ°Ņ API вŅĐŋĐžĐģĐŊŅĐĩŅ ĐžĐąŅаŅĐŊŅĐš вŅСОв, ĐžŅĐŋŅавĐģŅŅ HTTP-СаĐŋŅĐžŅ Đ˛Đž *вĐŊĐĩŅĐŊиК API* (ĐēĐžŅĐžŅŅĐš, вĐĩŅĐžŅŅĐŊĐž, ŅĐžĐļĐĩ ŅОСдаĐģ ŅĐžŅ ĐļĐĩ ŅаСŅайОŅŅиĐē).
+
+Đ ŅŅĐžĐŧ ŅĐģŅŅаĐĩ ваĐŧ ĐŧĐžĐļĐĩŅ ĐŋĐžĐŊадОйиŅŅŅŅ ĐˇĐ°Đ´ĐžĐēŅĐŧĐĩĐŊŅиŅОваŅŅ, ĐēаĐē Đ´ĐžĐģĐļĐŊĐž вŅĐŗĐģŅĐ´ĐĩŅŅ ŅŅĐž вĐŊĐĩŅĐŊĐĩĐĩ API: ĐēаĐēŅŅ *ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи* ĐžĐŊĐž Đ´ĐžĐģĐļĐŊĐž иĐŧĐĩŅŅ, ĐēаĐēĐžĐĩ ŅĐĩĐģĐž СаĐŋŅĐžŅа ĐžĐļидаŅŅ, ĐēаĐēОК ĐžŅвĐĩŅ Đ˛ĐžĐˇĐ˛ŅаŅаŅŅ Đ¸ Ņ.Đ´.
+
+## ĐŅиĐģĐžĐļĐĩĐŊиĐĩ Ņ ĐžĐąŅаŅĐŊŅĐŧи вŅСОваĐŧи { #an-app-with-callbacks }
+
+ĐаваКŅĐĩ ŅаŅŅĐŧĐžŅŅиĐŧ ŅŅĐž ĐŊа ĐŋŅиĐŧĐĩŅĐĩ.
+
+ĐŅĐĩĐ´ŅŅавŅŅĐĩ, ŅŅĐž Đ˛Ņ ŅаСŅайаŅŅваĐĩŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ, ĐŋОСвОĐģŅŅŅĐĩĐĩ ŅОСдаваŅŅ ŅŅĐĩŅа.
+
+ĐŅи ŅŅĐĩŅа ĐąŅĐ´ŅŅ Đ¸ĐŧĐĩŅŅ `id`, `title` (ĐŊĐĩОйŅСаŅĐĩĐģŅĐŊŅĐš), `customer` и `total`.
+
+ĐĐžĐģŅСОваŅĐĩĐģŅ Đ˛Đ°ŅĐĩĐŗĐž API (вĐŊĐĩŅĐŊиК ŅаСŅайОŅŅиĐē) ŅОСдаŅŅ ŅŅĐĩŅ Đ˛ ваŅĐĩĐŧ API Ņ ĐŋĐžĐŧĐžŅŅŅ POST-СаĐŋŅĐžŅа.
+
+ĐаŅĐĩĐŧ Đ˛Đ°Ņ API (ĐŋŅĐĩĐ´ĐŋĐžĐģĐžĐļиĐŧ) ŅĐ´ĐĩĐģаĐĩŅ ŅĐģĐĩĐ´ŅŅŅĐĩĐĩ:
+
+* ĐŅĐŋŅĐ°Đ˛Đ¸Ņ ŅŅĐĩŅ ĐēĐģиĐĩĐŊŅŅ Đ˛ĐŊĐĩŅĐŊĐĩĐŗĐž ŅаСŅайОŅŅиĐēа.
+* ĐĐžĐģŅŅĐ¸Ņ ĐžĐŋĐģаŅŅ.
+* ĐŅĐŋŅĐ°Đ˛Đ¸Ņ ŅвĐĩĐ´ĐžĐŧĐģĐĩĐŊиĐĩ ОйŅаŅĐŊĐž ĐŋĐžĐģŅСОваŅĐĩĐģŅ API (вĐŊĐĩŅĐŊĐĩĐŧŅ ŅаСŅайОŅŅиĐēŅ).
+ * ĐŅĐž ĐąŅĐ´ĐĩŅ ŅĐ´ĐĩĐģаĐŊĐž ĐžŅĐŋŅавĐēОК POST-СаĐŋŅĐžŅа (иС *ваŅĐĩĐŗĐž API*) в *вĐŊĐĩŅĐŊиК API*, ĐŋŅĐĩĐ´ĐžŅŅавĐģĐĩĐŊĐŊŅĐš ŅŅиĐŧ вĐŊĐĩŅĐŊиĐŧ ŅаСŅайОŅŅиĐēĐžĐŧ (ŅŅĐž и ĐĩŅŅŅ ÂĢcallbackÂģ).
+
+## ĐĐąŅŅĐŊĐžĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ **FastAPI** { #the-normal-fastapi-app }
+
+ĐĄĐŊаŅаĐģа ĐŋĐžŅĐŧĐžŅŅиĐŧ, ĐēаĐē ĐąŅĐ´ĐĩŅ Đ˛ŅĐŗĐģŅĐ´ĐĩŅŅ ĐžĐąŅŅĐŊĐžĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ API Đ´Đž дОйавĐģĐĩĐŊĐ¸Ņ ĐžĐąŅаŅĐŊĐžĐŗĐž вŅСОва.
+
+Đ ĐŊŅĐŧ ĐąŅĐ´ĐĩŅ *ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи*, ĐēĐžŅĐžŅĐ°Ņ ĐŋĐžĐģŅŅĐ¸Ņ ŅĐĩĐģĐž СаĐŋŅĐžŅа `Invoice`, и query-ĐŋаŅаĐŧĐĩŅŅ `callback_url`, ŅОдĐĩŅĐļаŅиК URL Đ´ĐģŅ ĐžĐąŅаŅĐŊĐžĐŗĐž вŅСОва.
+
+ĐŅа ŅаŅŅŅ Đ˛ĐŋĐžĐģĐŊĐĩ ОйŅŅĐŊа, йОĐģŅŅĐ°Ņ ŅаŅŅŅ ĐēОда ваĐŧ ŅĐļĐĩ СĐŊаĐēĐžĐŧа:
+
+{* ../../docs_src/openapi_callbacks/tutorial001.py hl[9:13,36:53] *}
+
+/// tip | ХОвĐĩŅ
+
+Query-ĐŋаŅаĐŧĐĩŅŅ `callback_url` иŅĐŋĐžĐģŅСŅĐĩŅ ŅиĐŋ Pydantic Url.
+
+///
+
+ĐдиĐŊŅŅвĐĩĐŊĐŊĐžĐĩ ĐŊОвОĐĩ â ŅŅĐž `callbacks=invoices_callback_router.routes` в ĐēаŅĐĩŅŅвĐĩ аŅĐŗŅĐŧĐĩĐŊŅа *Đ´ĐĩĐēĐžŅаŅĐžŅа ĐžĐŋĐĩŅаŅии ĐŋŅŅи*. ĐаĐģĐĩĐĩ ŅаСйĐĩŅŅĐŧŅŅ, ŅŅĐž ŅŅĐž ŅаĐēĐžĐĩ.
+
+## ĐĐžĐēŅĐŧĐĩĐŊŅиŅОваĐŊиĐĩ ОйŅаŅĐŊĐžĐŗĐž вŅСОва { #documenting-the-callback }
+
+Đ ĐĩаĐģŅĐŊŅĐš ĐēОд ОйŅаŅĐŊĐžĐŗĐž вŅСОва ĐąŅĐ´ĐĩŅ ŅиĐģŅĐŊĐž СавиŅĐĩŅŅ ĐžŅ Đ˛Đ°ŅĐĩĐŗĐž ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ API.
+
+Đ, вĐĩŅĐžŅŅĐŊĐž, ĐžĐŊ ĐąŅĐ´ĐĩŅ ĐˇĐ°ĐŧĐĩŅĐŊĐž ĐžŅĐģиŅаŅŅŅŅ ĐžŅ ĐžĐ´ĐŊĐžĐŗĐž ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ Đē Đ´ŅŅĐŗĐžĐŧŅ.
+
+ĐŅĐž ĐŧĐžĐŗŅŅ ĐąŅŅŅ ĐąŅĐēваĐģŅĐŊĐž ОдĐŊа-двĐĩ ŅŅŅĐžĐēи ĐēОда, ĐŊаĐŋŅиĐŧĐĩŅ:
+
+```Python
+callback_url = "https://example.com/api/v1/invoices/events/"
+httpx.post(callback_url, json={"description": "Invoice paid", "paid": True})
+```
+
+ĐĐž, вОСĐŧĐžĐļĐŊĐž, ŅаĐŧĐ°Ņ Đ˛Đ°ĐļĐŊĐ°Ņ ŅаŅŅŅ ĐžĐąŅаŅĐŊĐžĐŗĐž вŅСОва â ŅŅĐž ŅĐąĐĩдиŅŅŅŅ, ŅŅĐž ĐŋĐžĐģŅСОваŅĐĩĐģŅ Đ˛Đ°ŅĐĩĐŗĐž API (вĐŊĐĩŅĐŊиК ŅаСŅайОŅŅиĐē) ĐŋŅавиĐģŅĐŊĐž ŅĐĩаĐģиСŅĐĩŅ *вĐŊĐĩŅĐŊиК API* в ŅООŅвĐĩŅŅŅвии Ņ Đ´Đ°ĐŊĐŊŅĐŧи, ĐēĐžŅĐžŅŅĐĩ *Đ˛Đ°Ņ API* ĐąŅĐ´ĐĩŅ ĐžŅĐŋŅавĐģŅŅŅ Đ˛ ŅĐĩĐģĐĩ СаĐŋŅĐžŅа ОйŅаŅĐŊĐžĐŗĐž вŅСОва и Ņ.Đŋ.
+
+ĐĐžŅŅĐžĐŧŅ Đ´Đ°ĐģĐĩĐĩ ĐŧŅ Đ´ĐžĐąĐ°Đ˛Đ¸Đŧ ĐēОд, Đ´ĐžĐēŅĐŧĐĩĐŊŅиŅŅŅŅиК, ĐēаĐē Đ´ĐžĐģĐļĐĩĐŊ вŅĐŗĐģŅĐ´ĐĩŅŅ ŅŅĐžŅ *вĐŊĐĩŅĐŊиК API*, ŅŅĐžĐąŅ ĐŋĐžĐģŅŅаŅŅ ĐžĐąŅаŅĐŊŅĐš вŅСОв ĐžŅ *ваŅĐĩĐŗĐž API*.
+
+ĐŅа Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ ĐžŅОйŅаСиŅŅŅ Đ˛ Swagger UI ĐŋĐž адŅĐĩŅŅ `/docs` в ваŅĐĩĐŧ API и ĐŋОСвОĐģĐ¸Ņ Đ˛ĐŊĐĩŅĐŊиĐŧ ŅаСŅайОŅŅиĐēаĐŧ ĐŋĐžĐŊŅŅŅ, ĐēаĐē ĐŋĐžŅŅŅОиŅŅ *вĐŊĐĩŅĐŊиК API*.
+
+Đ ŅŅĐžĐŧ ĐŋŅиĐŧĐĩŅĐĩ ŅаĐŧ ОйŅаŅĐŊŅĐš вŅСОв ĐŊĐĩ ŅĐĩаĐģиСŅĐĩŅŅŅ (ŅŅĐž ĐŧĐžĐļĐĩŅ ĐąŅŅŅ Đ˛ŅĐĩĐŗĐž ОдĐŊа ŅŅŅĐžĐēа ĐēОда), ŅĐĩаĐģиСŅĐĩŅŅŅ ŅĐžĐģŅĐēĐž ŅаŅŅŅ Ņ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиĐĩĐš.
+
+/// tip | ХОвĐĩŅ
+
+ХаĐŧ ОйŅаŅĐŊŅĐš вŅСОв â ŅŅĐž вŅĐĩĐŗĐž ĐģиŅŅ HTTP-СаĐŋŅĐžŅ.
+
+Đ ĐĩаĐģиСŅŅ ĐžĐąŅаŅĐŊŅĐš вŅСОв, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ, ĐŊаĐŋŅиĐŧĐĩŅ, HTTPX иĐģи Requests.
+
+///
+
+## ĐаĐŋиŅиŅĐĩ ĐēОд Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии ОйŅаŅĐŊĐžĐŗĐž вŅСОва { #write-the-callback-documentation-code }
+
+ĐŅĐžŅ ĐēОд ĐŊĐĩ ĐąŅĐ´ĐĩŅ Đ˛ŅĐŋĐžĐģĐŊŅŅŅŅŅ Đ˛ ваŅĐĩĐŧ ĐŋŅиĐģĐžĐļĐĩĐŊии, ĐžĐŊ ĐŊŅĐļĐĩĐŊ ŅĐžĐģŅĐēĐž Đ´ĐģŅ *Đ´ĐžĐēŅĐŧĐĩĐŊŅиŅОваĐŊиŅ* ŅĐžĐŗĐž, ĐēаĐē Đ´ĐžĐģĐļĐĩĐŊ вŅĐŗĐģŅĐ´ĐĩŅŅ *вĐŊĐĩŅĐŊиК API*.
+
+ĐĐž Đ˛Ņ ŅĐļĐĩ СĐŊаĐĩŅĐĩ, ĐēаĐē ĐģĐĩĐŗĐēĐž ĐŋĐžĐģŅŅиŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ Đ´ĐģŅ API Ņ **FastAPI**.
+
+ĐŅ Đ¸ŅĐŋĐžĐģŅСŅĐĩĐŧ ŅĐĩ ĐļĐĩ СĐŊаĐŊиŅ, ŅŅĐžĐąŅ ĐˇĐ°Đ´ĐžĐēŅĐŧĐĩĐŊŅиŅОваŅŅ, ĐēаĐē Đ´ĐžĐģĐļĐĩĐŊ вŅĐŗĐģŅĐ´ĐĩŅŅ *вĐŊĐĩŅĐŊиК API*... ŅОСдав *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*, ĐēĐžŅĐžŅŅĐĩ вĐŊĐĩŅĐŊиК API Đ´ĐžĐģĐļĐĩĐŊ ŅĐĩаĐģиСОваŅŅ (ŅĐĩ, ĐēĐžŅĐžŅŅĐĩ Đ˛Đ°Ņ API ĐąŅĐ´ĐĩŅ Đ˛ŅСŅваŅŅ).
+
+/// tip | ХОвĐĩŅ
+
+ĐĐžĐŗĐ´Đ° Đ˛Ņ ĐŋиŅĐĩŅĐĩ ĐēОд Đ´ĐģŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅиŅОваĐŊĐ¸Ņ ĐžĐąŅаŅĐŊĐžĐŗĐž вŅСОва, ĐŋĐžĐģĐĩСĐŊĐž ĐŋŅĐĩĐ´ŅŅавиŅŅ, ŅŅĐž Đ˛Ņ â ŅĐžŅ ŅаĐŧŅĐš *вĐŊĐĩŅĐŊиК ŅаСŅайОŅŅиĐē*. Đ ŅŅĐž Đ˛Ņ ŅĐĩĐšŅĐ°Ņ ŅĐĩаĐģиСŅĐĩŅĐĩ *вĐŊĐĩŅĐŊиК API*, а ĐŊĐĩ *ŅвОК API*.
+
+ĐŅĐĩĐŧĐĩĐŊĐŊĐžĐĩ ĐŋŅиĐŊŅŅиĐĩ ŅŅОК ŅĐžŅĐēи СŅĐĩĐŊĐ¸Ņ (вĐŊĐĩŅĐŊĐĩĐŗĐž ŅаСŅайОŅŅиĐēа) ĐŋĐžĐŧĐžĐļĐĩŅ Đ¸ĐŊŅŅиŅивĐŊĐž ĐŋĐžĐŊŅŅŅ, ĐēŅда ĐŋĐžĐŧĐĩŅŅиŅŅ ĐŋаŅаĐŧĐĩŅŅŅ, ĐēаĐēŅŅ Pydantic-ĐŧОдĐĩĐģŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ Đ´ĐģŅ ŅĐĩĐģа СаĐŋŅĐžŅа, Đ´ĐģŅ ĐžŅвĐĩŅа и Ņ.Đ´. вО *вĐŊĐĩŅĐŊĐĩĐŧ API*.
+
+///
+
+### ХОСдаКŅĐĩ `APIRouter` Đ´ĐģŅ ĐžĐąŅаŅĐŊĐžĐŗĐž вŅСОва { #create-a-callback-apirouter }
+
+ĐĄĐŊаŅаĐģа ŅОСдаКŅĐĩ ĐŊОвŅĐš `APIRouter`, ĐēĐžŅĐžŅŅĐš ĐąŅĐ´ĐĩŅ ŅОдĐĩŅĐļаŅŅ ĐžĐ´Đ¸ĐŊ иĐģи ĐŊĐĩŅĐēĐžĐģŅĐēĐž ОйŅаŅĐŊŅŅ
вŅСОвОв.
+
+{* ../../docs_src/openapi_callbacks/tutorial001.py hl[3,25] *}
+
+### ХОСдаКŅĐĩ *ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи* Đ´ĐģŅ ĐžĐąŅаŅĐŊĐžĐŗĐž вŅСОва { #create-the-callback-path-operation }
+
+ЧŅĐžĐąŅ ŅОСдаŅŅ *ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи* Đ´ĐģŅ ĐžĐąŅаŅĐŊĐžĐŗĐž вŅСОва, иŅĐŋĐžĐģŅСŅĐšŅĐĩ ŅĐžŅ ĐļĐĩ `APIRouter`, ĐēĐžŅĐžŅŅĐš Đ˛Ņ ŅОСдаĐģи вŅŅĐĩ.
+
+ĐĐŊа Đ´ĐžĐģĐļĐŊа вŅĐŗĐģŅĐ´ĐĩŅŅ ĐēаĐē ОйŅŅĐŊĐ°Ņ *ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи* FastAPI:
+
+* ĐĐĩŅĐžŅŅĐŊĐž, в ĐŊĐĩĐš Đ´ĐžĐģĐļĐŊĐž ĐąŅŅŅ ĐžĐąŅŅвĐģĐĩĐŊиĐĩ ŅĐĩĐģа СаĐŋŅĐžŅа, ĐŊаĐŋŅиĐŧĐĩŅ `body: InvoiceEvent`.
+* Đ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅ ĐąŅŅŅ ĐžĐąŅŅвĐģĐĩĐŊиĐĩ ĐŧОдĐĩĐģи ĐžŅвĐĩŅа, ĐŊаĐŋŅиĐŧĐĩŅ `response_model=InvoiceEventReceived`.
+
+{* ../../docs_src/openapi_callbacks/tutorial001.py hl[16:18,21:22,28:32] *}
+
+ĐŅŅŅ 2 ĐžŅĐŊОвĐŊŅŅ
ĐžŅĐģиŅĐ¸Ņ ĐžŅ ĐžĐąŅŅĐŊОК *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*:
+
+* ĐĐš ĐŊĐĩ ĐŊŅĐļĐĩĐŊ ŅĐĩаĐģŅĐŊŅĐš ĐēОд, ĐŋĐžŅĐžĐŧŅ ŅŅĐž ваŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐŊиĐēĐžĐŗĐ´Đ° ĐŊĐĩ ĐąŅĐ´ĐĩŅ Đ˛ŅСŅваŅŅ ŅŅŅ ŅŅĐŊĐēŅиŅ. ĐĐŊа иŅĐŋĐžĐģŅСŅĐĩŅŅŅ ŅĐžĐģŅĐēĐž Đ´ĐģŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅиŅОваĐŊĐ¸Ņ *вĐŊĐĩŅĐŊĐĩĐŗĐž API*. ĐĐžŅŅĐžĐŧŅ Đ˛ ŅŅĐŊĐēŅии ĐŧĐžĐļĐĩŅ ĐąŅŅŅ ĐŋŅĐžŅŅĐž `pass`.
+* *ĐŅŅŅ* ĐŧĐžĐļĐĩŅ ŅОдĐĩŅĐļаŅŅ Đ˛ŅŅаĐļĐĩĐŊиĐĩ OpenAPI 3 (ĐŋОдŅОйĐŊĐĩĐĩ ĐŊиĐļĐĩ), ĐŗĐ´Đĩ ĐŧĐžĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ ĐŋĐĩŅĐĩĐŧĐĩĐŊĐŊŅĐĩ Ņ ĐŋаŅаĐŧĐĩŅŅаĐŧи и ŅаŅŅи иŅŅ
ОдĐŊĐžĐŗĐž HTTP-СаĐŋŅĐžŅа, ĐžŅĐŋŅавĐģĐĩĐŊĐŊĐžĐŗĐž *ваŅĐĩĐŧŅ API*.
+
+### ĐŅŅаĐļĐĩĐŊиĐĩ ĐŋŅŅи Đ´ĐģŅ ĐžĐąŅаŅĐŊĐžĐŗĐž вŅСОва { #the-callback-path-expression }
+
+*ĐŅŅŅ* ОйŅаŅĐŊĐžĐŗĐž вŅСОва ĐŧĐžĐļĐĩŅ ŅОдĐĩŅĐļаŅŅ Đ˛ŅŅаĐļĐĩĐŊиĐĩ OpenAPI 3, ĐēĐžŅĐžŅĐžĐĩ ĐŧĐžĐļĐĩŅ Đ˛ĐēĐģŅŅаŅŅ ŅаŅŅи иŅŅ
ОдĐŊĐžĐŗĐž СаĐŋŅĐžŅа, ĐžŅĐŋŅавĐģĐĩĐŊĐŊĐžĐŗĐž *ваŅĐĩĐŧŅ API*.
+
+Đ ĐŊаŅĐĩĐŧ ŅĐģŅŅаĐĩ ŅŅĐž `str`:
+
+```Python
+"{$callback_url}/invoices/{$request.body.id}"
+```
+
+ĐŅаĐē, ĐĩŅĐģи ĐŋĐžĐģŅСОваŅĐĩĐģŅ Đ˛Đ°ŅĐĩĐŗĐž API (вĐŊĐĩŅĐŊиК ŅаСŅайОŅŅиĐē) ĐžŅĐŋŅавĐģŅĐĩŅ HTTP-СаĐŋŅĐžŅ Đ˛Đ°ŅĐĩĐŧŅ API ĐŋĐž адŅĐĩŅŅ:
+
+```
+https://yourapi.com/invoices/?callback_url=https://www.external.org/events
+```
+
+Ņ ŅĐĩĐģĐžĐŧ JSON:
+
+```JSON
+{
+ "id": "2expen51ve",
+ "customer": "Mr. Richie Rich",
+ "total": "9999"
+}
+```
+
+ŅĐž *Đ˛Đ°Ņ API* ОйŅайОŅаĐĩŅ ŅŅŅŅ Đ¸, в ĐēаĐēОК-ŅĐž ĐŧĐžĐŧĐĩĐŊŅ ĐŋОСĐļĐĩ, ĐžŅĐŋŅĐ°Đ˛Đ¸Ņ ĐˇĐ°ĐŋŅĐžŅ ĐžĐąŅаŅĐŊĐžĐŗĐž вŅСОва ĐŊа `callback_url` (*вĐŊĐĩŅĐŊиК API*):
+
+```
+https://www.external.org/events/invoices/2expen51ve
+```
+
+Ņ ŅĐĩĐģĐžĐŧ JSON ĐŋŅиĐŧĐĩŅĐŊĐž ŅаĐēĐžĐŗĐž вида:
+
+```JSON
+{
+ "description": "Payment celebration",
+ "paid": true
+}
+```
+
+и ĐąŅĐ´ĐĩŅ ĐžĐļидаŅŅ ĐžŅ *вĐŊĐĩŅĐŊĐĩĐŗĐž API* ĐžŅвĐĩŅ Ņ ŅĐĩĐģĐžĐŧ JSON вида:
+
+```JSON
+{
+ "ok": true
+}
+```
+
+/// tip | ХОвĐĩŅ
+
+ĐĐąŅаŅиŅĐĩ вĐŊиĐŧаĐŊиĐĩ, ŅŅĐž иŅĐŋĐžĐģŅСŅĐĩĐŧŅĐš URL ОйŅаŅĐŊĐžĐŗĐž вŅСОва ŅОдĐĩŅĐļĐ¸Ņ URL, ĐŋĐžĐģŅŅĐĩĐŊĐŊŅĐš ĐēаĐē query-ĐŋаŅаĐŧĐĩŅŅ Đ˛ `callback_url` (`https://www.external.org/events`), а ŅаĐēĐļĐĩ `id` ŅŅŅŅа иС ŅĐĩĐģа JSON (`2expen51ve`).
+
+///
+
+### ĐОдĐēĐģŅŅиŅĐĩ ĐŧаŅŅŅŅŅиСаŅĐžŅ ĐžĐąŅаŅĐŊĐžĐŗĐž вŅСОва { #add-the-callback-router }
+
+Đ ŅŅĐžĐŧŅ ĐŧĐžĐŧĐĩĐŊŅŅ Ņ Đ˛Đ°Ņ ĐĩŅŅŅ ĐŊĐĩОйŅ
ОдиĐŧŅĐĩ *ĐžĐŋĐĩŅаŅии ĐŋŅŅи* ОйŅаŅĐŊĐžĐŗĐž вŅСОва (ŅĐĩ, ĐēĐžŅĐžŅŅĐĩ *вĐŊĐĩŅĐŊиК ŅаСŅайОŅŅиĐē* Đ´ĐžĐģĐļĐĩĐŊ ŅĐĩаĐģиСОваŅŅ Đ˛Đž *вĐŊĐĩŅĐŊĐĩĐŧ API*) в ŅОСдаĐŊĐŊĐžĐŧ вŅŅĐĩ ĐŧаŅŅŅŅŅиСаŅĐžŅĐĩ ОйŅаŅĐŊŅŅ
вŅСОвОв.
+
+ĐĸĐĩĐŋĐĩŅŅ Đ¸ŅĐŋĐžĐģŅСŅĐšŅĐĩ ĐŋаŅаĐŧĐĩŅŅ `callbacks` в *Đ´ĐĩĐēĐžŅаŅĐžŅĐĩ ĐžĐŋĐĩŅаŅии ĐŋŅŅи ваŅĐĩĐŗĐž API*, ŅŅĐžĐąŅ ĐŋĐĩŅĐĩдаŅŅ Đ°ŅŅийŅŅ `.routes` (ŅŅĐž, ĐŋĐž ŅŅŅи, ĐŋŅĐžŅŅĐž `list` ĐŧаŅŅŅŅŅОв/*ĐžĐŋĐĩŅаŅиК ĐŋŅŅи*) иС ŅŅĐžĐŗĐž ĐŧаŅŅŅŅŅиСаŅĐžŅа ОйŅаŅĐŊŅŅ
вŅСОвОв:
+
+{* ../../docs_src/openapi_callbacks/tutorial001.py hl[35] *}
+
+/// tip | ХОвĐĩŅ
+
+ĐĐąŅаŅиŅĐĩ вĐŊиĐŧаĐŊиĐĩ, ŅŅĐž Đ˛Ņ ĐŋĐĩŅĐĩдаŅŅĐĩ ĐŊĐĩ ŅаĐŧ ĐŧаŅŅŅŅŅиСаŅĐžŅ (`invoices_callback_router`) в `callback=`, а ĐĩĐŗĐž аŅŅийŅŅ `.routes`, ŅĐž ĐĩŅŅŅ `invoices_callback_router.routes`.
+
+///
+
+### ĐŅОвĐĩŅŅŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ { #check-the-docs }
+
+ĐĸĐĩĐŋĐĩŅŅ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ СаĐŋŅŅŅиŅŅ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ и ĐŋĐĩŅĐĩĐšŅи ĐŋĐž адŅĐĩŅŅ http://127.0.0.1:8000/docs.
+
+ĐŅ ŅвидиŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиŅ, вĐēĐģŅŅаŅŅŅŅ ŅаСдĐĩĐģ ÂĢCallbacksÂģ Đ´ĐģŅ Đ˛Đ°ŅĐĩĐš *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*, ĐēĐžŅĐžŅŅĐš ĐŋĐžĐēаСŅваĐĩŅ, ĐēаĐē Đ´ĐžĐģĐļĐĩĐŊ вŅĐŗĐģŅĐ´ĐĩŅŅ *вĐŊĐĩŅĐŊиК API*:
+
+
diff --git a/docs/ru/docs/advanced/openapi-webhooks.md b/docs/ru/docs/advanced/openapi-webhooks.md
new file mode 100644
index 000000000..d38cf315f
--- /dev/null
+++ b/docs/ru/docs/advanced/openapi-webhooks.md
@@ -0,0 +1,55 @@
+# ĐĐĩĐąŅ
ŅĐēи OpenAPI { #openapi-webhooks }
+
+ĐŅваŅŅ ŅĐģŅŅаи, ĐēĐžĐŗĐ´Đ° Đ˛Ņ Ņ
ĐžŅиŅĐĩ ŅООйŅиŅŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅĐŧ ваŅĐĩĐŗĐž API, ŅŅĐž ваŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐŧĐžĐļĐĩŅ Đ˛ŅСваŅŅ Đ¸Ņ
ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ (ĐžŅĐŋŅавив HTTP-СаĐŋŅĐžŅ) Ņ ĐŊĐĩĐēĐžŅĐžŅŅĐŧи даĐŊĐŊŅĐŧи, ОйŅŅĐŊĐž ŅŅĐžĐąŅ ŅвĐĩĐ´ĐžĐŧиŅŅ Đž ĐēаĐēĐžĐŧ-ŅĐž ŅОйŅŅии.
+
+ĐŅĐž ОСĐŊаŅаĐĩŅ, ŅŅĐž вĐŧĐĩŅŅĐž ОйŅŅĐŊĐžĐŗĐž ĐŋŅĐžŅĐĩŅŅа, ĐēĐžĐŗĐ´Đ° ĐŋĐžĐģŅСОваŅĐĩĐģи ĐžŅĐŋŅавĐģŅŅŅ ĐˇĐ°ĐŋŅĐžŅŅ Đ˛Đ°ŅĐĩĐŧŅ API, Đ˛Đ°Ņ API (иĐģи ваŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ) ĐŧĐžĐļĐĩŅ ĐžŅĐŋŅавĐģŅŅŅ ĐˇĐ°ĐŋŅĐžŅŅ Đ˛ иŅ
ŅиŅŅĐĩĐŧŅ (в иŅ
API, иŅ
ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ).
+
+ĐĐąŅŅĐŊĐž ŅŅĐž ĐŊаСŅваĐĩŅŅŅ Đ˛ĐĩĐąŅ
ŅĐēĐžĐŧ.
+
+## Đ¨Đ°ĐŗĐ¸ вĐĩĐąŅ
ŅĐēОв { #webhooks-steps }
+
+ĐĐąŅŅĐŊĐž ĐŋŅĐžŅĐĩŅŅ ŅаĐēОв: Đ˛Ņ ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐĩŅĐĩ в ŅвОĐĩĐŧ ĐēОдĐĩ, ĐēаĐēĐžĐĩ ŅООйŅĐĩĐŊиĐĩ Đ˛Ņ ĐąŅĐ´ĐĩŅĐĩ ĐžŅĐŋŅавĐģŅŅŅ, ŅĐž ĐĩŅŅŅ ŅĐĩĐģĐž СаĐŋŅĐžŅа.
+
+ĐŅ ŅаĐēĐļĐĩ ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐĩŅĐĩ, в ĐēаĐēиĐĩ ĐŧĐžĐŧĐĩĐŊŅŅ (ĐŋŅи ĐēаĐēиŅ
ŅОйŅŅиŅŅ
) ваŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐąŅĐ´ĐĩŅ ĐžŅĐŋŅавĐģŅŅŅ ŅŅи СаĐŋŅĐžŅŅ.
+
+РваŅи ĐŋĐžĐģŅСОваŅĐĩĐģи ĐēаĐēиĐŧ-ŅĐž ОйŅаСОĐŧ (ĐŊаĐŋŅиĐŧĐĩŅ, в вĐĩĐąâĐŋаĐŊĐĩĐģи) ŅĐēаСŅваŅŅ URL-адŅĐĩŅ, ĐŊа ĐēĐžŅĐžŅŅĐš ваŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ Đ´ĐžĐģĐļĐŊĐž ĐžŅĐŋŅавĐģŅŅŅ ŅŅи СаĐŋŅĐžŅŅ.
+
+ĐŅŅ ĐģĐžĐŗĐ¸Đēа ŅĐĩĐŗĐ¸ŅŅŅаŅии URL-адŅĐĩŅОв Đ´ĐģŅ Đ˛ĐĩĐąŅ
ŅĐēОв и ĐēОд, ĐēĐžŅĐžŅŅĐš ŅĐĩаĐģŅĐŊĐž ĐžŅĐŋŅавĐģŅĐĩŅ ŅŅи СаĐŋŅĐžŅŅ, ŅĐĩĐģиĐēĐžĐŧ ĐŊа ваŅĐĩĐš ŅŅĐžŅĐžĐŊĐĩ. ĐŅ ĐŋиŅĐĩŅĐĩ ŅŅĐž ŅаĐē, ĐēаĐē ваĐŧ ĐŊŅĐļĐŊĐž, в ŅвОĐĩĐŧ ŅОйŅŅвĐĩĐŊĐŊĐžĐŧ ĐēОдĐĩ.
+
+## ĐĐžĐēŅĐŧĐĩĐŊŅиŅОваĐŊиĐĩ вĐĩĐąŅ
ŅĐēОв Ņ ĐŋĐžĐŧĐžŅŅŅ FastAPI и OpenAPI { #documenting-webhooks-with-fastapi-and-openapi }
+
+ĐĄ FastAPI, иŅĐŋĐžĐģŅСŅŅ OpenAPI, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐžĐŋŅĐĩĐ´ĐĩĐģиŅŅ Đ¸ĐŧĐĩĐŊа ŅŅиŅ
вĐĩĐąŅ
ŅĐēОв, ŅиĐŋŅ HTTP-ĐžĐŋĐĩŅаŅиК, ĐēĐžŅĐžŅŅĐĩ ваŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐŧĐžĐļĐĩŅ ĐžŅĐŋŅавĐģŅŅŅ (ĐŊаĐŋŅиĐŧĐĩŅ, `POST`, `PUT` и Ņ.Đ´.), а ŅаĐēĐļĐĩ ŅĐĩĐģа СаĐŋŅĐžŅОв, ĐēĐžŅĐžŅŅĐĩ ваŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐąŅĐ´ĐĩŅ ĐžŅĐŋŅавĐģŅŅŅ.
+
+ĐŅĐž СĐŊаŅиŅĐĩĐģŅĐŊĐž ŅĐŋŅĐžŅŅĐ¸Ņ Đ˛Đ°ŅиĐŧ ĐŋĐžĐģŅСОваŅĐĩĐģŅĐŧ ŅĐĩаĐģиСаŅĐ¸Ņ Đ¸Ņ
API Đ´ĐģŅ ĐŋŅиĐĩĐŧа ваŅиŅ
вĐĩĐąŅ
ŅĐē-СаĐŋŅĐžŅОв; вОСĐŧĐžĐļĐŊĐž, ĐžĐŊи даĐļĐĩ ŅĐŧĐžĐŗŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēи ŅĐŗĐĩĐŊĐĩŅиŅОваŅŅ ŅаŅŅŅ ĐēОда ŅвОĐĩĐŗĐž API.
+
+/// info | ĐĐŊŅĐžŅĐŧаŅиŅ
+
+ĐĐĩĐąŅ
ŅĐēи Đ´ĐžŅŅŅĐŋĐŊŅ Đ˛ OpenAPI 3.1.0 и вŅŅĐĩ, ĐŋОддĐĩŅĐļиваŅŅŅŅ Đ˛ FastAPI `0.99.0` и ĐŊОвĐĩĐĩ.
+
+///
+
+## ĐŅиĐģĐžĐļĐĩĐŊиĐĩ Ņ Đ˛ĐĩĐąŅ
ŅĐēаĐŧи { #an-app-with-webhooks }
+
+ĐŅи ŅОСдаĐŊии ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ ĐŊа **FastAPI** ĐĩŅŅŅ Đ°ŅŅийŅŅ `webhooks`, Ņ ĐŋĐžĐŧĐžŅŅŅ ĐēĐžŅĐžŅĐžĐŗĐž ĐŧĐžĐļĐŊĐž ОйŅŅвĐģŅŅŅ Đ˛ĐĩĐąŅ
ŅĐēи ŅаĐē ĐļĐĩ, ĐēаĐē Đ˛Ņ ĐžĐąŅŅвĐģŅĐĩŅĐĩ ĐžĐŋĐĩŅаŅии ĐŋŅŅи (ОйŅайОŅŅиĐēи ĐŋŅŅи), ĐŊаĐŋŅиĐŧĐĩŅ Ņ `@app.webhooks.post()`.
+
+{* ../../docs_src/openapi_webhooks/tutorial001.py hl[9:13,36:53] *}
+
+ĐĐŋŅĐĩĐ´ĐĩĐģĐĩĐŊĐŊŅĐĩ ваĐŧи вĐĩĐąŅ
ŅĐēи ĐŋĐžĐŋадŅŅ Đ˛ ŅŅ
ĐĩĐŧŅ **OpenAPI** и в авŅĐžĐŧаŅиŅĐĩŅĐēиК **иĐŊŅĐĩŅŅĐĩĐšŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии**.
+
+/// info | ĐĐŊŅĐžŅĐŧаŅиŅ
+
+ĐĐąŅĐĩĐēŅ `app.webhooks` ĐŊа ŅаĐŧĐžĐŧ Đ´ĐĩĐģĐĩ â ŅŅĐž ОйŅŅĐŊŅĐš `APIRouter`, ŅĐžŅ ĐļĐĩ ŅиĐŋ, ĐēĐžŅĐžŅŅĐš Đ˛Ņ Đ¸ŅĐŋĐžĐģŅСŅĐĩŅĐĩ ĐŋŅи ŅŅŅŅĐēŅŅŅиŅОваĐŊии ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ ĐŋĐž ĐŊĐĩŅĐēĐžĐģŅĐēиĐŧ ŅаКĐģаĐŧ.
+
+///
+
+ĐĐąŅаŅиŅĐĩ вĐŊиĐŧаĐŊиĐĩ: в ŅĐģŅŅаĐĩ Ņ Đ˛ĐĩĐąŅ
ŅĐēаĐŧи Đ˛Ņ ĐŊа ŅаĐŧĐžĐŧ Đ´ĐĩĐģĐĩ ĐŊĐĩ ОйŅŅвĐģŅĐĩŅĐĩ ĐŋŅŅŅ (ĐŊаĐŋŅиĐŧĐĩŅ, `/items/`), ĐŋĐĩŅĐĩдаваĐĩĐŧŅĐš ŅŅда ŅĐĩĐēŅŅ â ŅŅĐž ĐģиŅŅ Đ¸Đ´ĐĩĐŊŅиŅиĐēаŅĐžŅ Đ˛ĐĩĐąŅ
ŅĐēа (иĐŧŅ ŅОйŅŅиŅ). ĐаĐŋŅиĐŧĐĩŅ, в `@app.webhooks.post("new-subscription")` иĐŧŅ Đ˛ĐĩĐąŅ
ŅĐēа â `new-subscription`.
+
+ĐŅĐž ŅвŅСаĐŊĐž Ņ ŅĐĩĐŧ, ŅŅĐž ĐŋŅĐĩĐ´ĐŋĐžĐģĐ°ĐŗĐ°ĐĩŅŅŅ: ŅаĐēŅиŅĐĩŅĐēиК URLâĐŋŅŅŅ, ĐŋĐž ĐēĐžŅĐžŅĐžĐŧŅ ĐžĐŊи Ņ
ĐžŅŅŅ ĐŋĐžĐģŅŅаŅŅ ĐˇĐ°ĐŋŅĐžŅ Đ˛ĐĩĐąŅ
ŅĐēа, ваŅи ĐŋĐžĐģŅСОваŅĐĩĐģи ŅĐēаĐļŅŅ ĐēаĐēиĐŧ-ŅĐž Đ´ŅŅĐŗĐ¸Đŧ ОйŅаСОĐŧ (ĐŊаĐŋŅиĐŧĐĩŅ, в вĐĩĐąâĐŋаĐŊĐĩĐģи).
+
+### ĐĐžŅĐŧĐžŅŅиŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ { #check-the-docs }
+
+ĐĸĐĩĐŋĐĩŅŅ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ СаĐŋŅŅŅиŅŅ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ и ĐŋĐĩŅĐĩĐšŅи ĐŋĐž ŅŅŅĐģĐēĐĩ http://127.0.0.1:8000/docs.
+
+ĐŅ ŅвидиŅĐĩ, ŅŅĐž в Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии ĐĩŅŅŅ ĐžĐąŅŅĐŊŅĐĩ ĐžĐŋĐĩŅаŅии ĐŋŅŅи, а ŅаĐēĐļĐĩ ĐŋĐžŅвиĐģиŅŅ Đ˛ĐĩĐąŅ
ŅĐēи:
+
+
diff --git a/docs/ru/docs/advanced/path-operation-advanced-configuration.md b/docs/ru/docs/advanced/path-operation-advanced-configuration.md
new file mode 100644
index 000000000..fcb3cd47f
--- /dev/null
+++ b/docs/ru/docs/advanced/path-operation-advanced-configuration.md
@@ -0,0 +1,204 @@
+# РаŅŅиŅĐĩĐŊĐŊĐ°Ņ ĐēĐžĐŊŅĐ¸ĐŗŅŅаŅĐ¸Ņ ĐžĐŋĐĩŅаŅиК ĐŋŅŅи { #path-operation-advanced-configuration }
+
+## OpenAPI operationId { #openapi-operationid }
+
+/// warning | ĐŅĐĩĐ´ŅĐŋŅĐĩĐļĐ´ĐĩĐŊиĐĩ
+
+ĐŅĐģи Đ˛Ņ ĐŊĐĩ ÂĢŅĐēŅĐŋĐĩŅŅÂģ ĐŋĐž OpenAPI, ŅĐēĐžŅĐĩĐĩ вŅĐĩĐŗĐž, ŅŅĐž ваĐŧ ĐŊĐĩ ĐŊŅĐļĐŊĐž.
+
+///
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ СадаŅŅ OpenAPI `operationId`, ĐēĐžŅĐžŅŅĐš ĐąŅĐ´ĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅŅŅ Đ˛ ваŅĐĩĐš *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*, Ņ ĐŋĐžĐŧĐžŅŅŅ ĐŋаŅаĐŧĐĩŅŅа `operation_id`.
+
+ĐŅĐļĐŊĐž ŅĐąĐĩдиŅŅŅŅ, ŅŅĐž ĐžĐŊ ŅĐŊиĐēаĐģĐĩĐŊ Đ´ĐģŅ ĐēаĐļдОК ĐžĐŋĐĩŅаŅии.
+
+{* ../../docs_src/path_operation_advanced_configuration/tutorial001.py hl[6] *}
+
+### ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ иĐŧĐĩĐŊи ŅŅĐŊĐēŅии-ОйŅайОŅŅиĐēа ĐŋŅŅи ĐēаĐē operationId { #using-the-path-operation-function-name-as-the-operationid }
+
+ĐŅĐģи Đ˛Ņ Ņ
ĐžŅиŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ Đ¸ĐŧĐĩĐŊа ŅŅĐŊĐēŅиК ваŅиŅ
API в ĐēаŅĐĩŅŅвĐĩ `operationId`, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐŋŅОКŅи ĐŋĐž вŅĐĩĐŧ иС ĐŊиŅ
и ĐŋĐĩŅĐĩĐžĐŋŅĐĩĐ´ĐĩĐģиŅŅ `operation_id` ĐēаĐļдОК *ĐžĐŋĐĩŅаŅии ĐŋŅŅи* Ņ ĐŋĐžĐŧĐžŅŅŅ Đ¸Ņ
`APIRoute.name`.
+
+ĐĐĩĐģаŅŅ ŅŅĐž ŅĐģĐĩĐ´ŅĐĩŅ ĐŋĐžŅĐģĐĩ дОйавĐģĐĩĐŊĐ¸Ņ Đ˛ŅĐĩŅ
*ĐžĐŋĐĩŅаŅиК ĐŋŅŅи*.
+
+{* ../../docs_src/path_operation_advanced_configuration/tutorial002.py hl[2, 12:21, 24] *}
+
+/// tip | ХОвĐĩŅ
+
+ĐŅĐģи Đ˛Ņ Đ˛ŅСŅваĐĩŅĐĩ `app.openapi()` вŅŅŅĐŊŅŅ, ОйĐŊОвиŅĐĩ `operationId` Đ´Đž ŅŅĐžĐŗĐž.
+
+///
+
+/// warning | ĐŅĐĩĐ´ŅĐŋŅĐĩĐļĐ´ĐĩĐŊиĐĩ
+
+ĐŅĐģи Đ˛Ņ Đ´ĐĩĐģаĐĩŅĐĩ ŅŅĐž, ŅĐąĐĩдиŅĐĩŅŅ, ŅŅĐž ĐēаĐļĐ´Đ°Ņ Đ¸Đˇ ваŅиŅ
*ŅŅĐŊĐēŅиК-ОйŅайОŅŅиĐēОв ĐŋŅŅи* иĐŧĐĩĐĩŅ ŅĐŊиĐēаĐģŅĐŊĐžĐĩ иĐŧŅ.
+
+ĐаĐļĐĩ ĐĩŅĐģи ĐžĐŊи ĐŊаŅ
ОдŅŅŅŅ Đ˛ ŅаСĐŊŅŅ
ĐŧОдŅĐģŅŅ
(ŅаКĐģаŅ
Python).
+
+///
+
+## ĐŅĐēĐģŅŅиŅŅ Đ¸Đˇ OpenAPI { #exclude-from-openapi }
+
+ЧŅĐžĐąŅ Đ¸ŅĐēĐģŅŅиŅŅ *ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи* иС ĐŗĐĩĐŊĐĩŅиŅŅĐĩĐŧОК ŅŅ
ĐĩĐŧŅ OpenAPI (а СĐŊаŅиŅ, и иС авŅĐžĐŧаŅиŅĐĩŅĐēОК Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии), иŅĐŋĐžĐģŅСŅĐšŅĐĩ ĐŋаŅаĐŧĐĩŅŅ `include_in_schema` и ŅŅŅаĐŊОвиŅĐĩ ĐĩĐŗĐž в `False`:
+
+{* ../../docs_src/path_operation_advanced_configuration/tutorial003.py hl[6] *}
+
+## РаŅŅиŅĐĩĐŊĐŊĐžĐĩ ĐžĐŋиŅаĐŊиĐĩ иС docstring { #advanced-description-from-docstring }
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ĐžĐŗŅаĐŊиŅиŅŅ ĐēĐžĐģиŅĐĩŅŅвО ŅŅŅĐžĐē иС docstring *ŅŅĐŊĐēŅии-ОйŅайОŅŅиĐēа ĐŋŅŅи*, иŅĐŋĐžĐģŅСŅĐĩĐŧŅŅ
Đ´ĐģŅ OpenAPI.
+
+ĐОйавĐģĐĩĐŊиĐĩ `\f` (ŅĐēŅаĐŊиŅОваĐŊĐŊĐžĐŗĐž ŅиĐŧвОĐģа ÂĢform feedÂģ) СаŅŅĐ°Đ˛Đ¸Ņ **FastAPI** ОйŅĐĩСаŅŅ ŅĐĩĐēŅŅ, иŅĐŋĐžĐģŅСŅĐĩĐŧŅĐš Đ´ĐģŅ OpenAPI, в ŅŅОК ŅĐžŅĐēĐĩ.
+
+ĐŅа ŅаŅŅŅ ĐŊĐĩ ĐŋĐžĐŋадŅŅ Đ˛ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиŅ, ĐŊĐž Đ´ŅŅĐŗĐ¸Đĩ иĐŊŅŅŅŅĐŧĐĩĐŊŅŅ (ĐŊаĐŋŅиĐŧĐĩŅ, Sphinx) ŅĐŧĐžĐŗŅŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ ĐžŅŅаĐģŅĐŊĐžĐĩ.
+
+{* ../../docs_src/path_operation_advanced_configuration/tutorial004.py hl[19:29] *}
+
+## ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ĐžŅвĐĩŅŅ { #additional-responses }
+
+ĐŅ, вĐĩŅĐžŅŅĐŊĐž, ŅĐļĐĩ видĐĩĐģи, ĐēаĐē ОйŅŅвĐģŅŅŅ `response_model` и `status_code` Đ´ĐģŅ *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*.
+
+ĐŅĐž ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐĩŅ ĐŧĐĩŅадаĐŊĐŊŅĐĩ Ой ĐžŅĐŊОвĐŊĐžĐŧ ĐžŅвĐĩŅĐĩ *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*.
+
+ĐĸаĐēĐļĐĩ ĐŧĐžĐļĐŊĐž ОйŅŅвĐģŅŅŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ĐžŅвĐĩŅŅ Ņ Đ¸Ņ
ĐŧОдĐĩĐģŅĐŧи, ŅŅаŅŅŅ-ĐēОдаĐŧи и Ņ.Đ´.
+
+Đ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии ĐĩŅŅŅ ŅĐĩĐģĐ°Ņ ĐŗĐģава Ой ŅŅĐžĐŧ â [ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ĐžŅвĐĩŅŅ Đ˛ OpenAPI](additional-responses.md){.internal-link target=_blank}.
+
+## ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ даĐŊĐŊŅĐĩ OpenAPI { #openapi-extra }
+
+ĐĐžĐŗĐ´Đ° Đ˛Ņ ĐžĐąŅŅвĐģŅĐĩŅĐĩ *ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи* в ŅвОŅĐŧ ĐŋŅиĐģĐžĐļĐĩĐŊии, **FastAPI** авŅĐžĐŧаŅиŅĐĩŅĐēи ĐŗĐĩĐŊĐĩŅиŅŅĐĩŅ ŅООŅвĐĩŅŅŅвŅŅŅиĐĩ ĐŧĐĩŅадаĐŊĐŊŅĐĩ Ой ŅŅОК *ĐžĐŋĐĩŅаŅии ĐŋŅŅи* Đ´ĐģŅ Đ˛ĐēĐģŅŅĐĩĐŊĐ¸Ņ Đ˛ ŅŅ
ĐĩĐŧŅ OpenAPI.
+
+/// note | ĐĸĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ Đ´ĐĩŅаĐģи
+
+Đ ŅĐŋĐĩŅиŅиĐēаŅии OpenAPI ŅŅĐž ĐŊаСŅваĐĩŅŅŅ ĐĐąŅĐĩĐēŅ ĐžĐŋĐĩŅаŅии.
+
+///
+
+ĐĐŊ ŅОдĐĩŅĐļĐ¸Ņ Đ˛ŅŅ Đ¸ĐŊŅĐžŅĐŧаŅĐ¸Ņ ĐžĐą *ĐžĐŋĐĩŅаŅии ĐŋŅŅи* и иŅĐŋĐžĐģŅСŅĐĩŅŅŅ Đ´ĐģŅ ĐŗĐĩĐŊĐĩŅаŅии авŅĐžĐŧаŅиŅĐĩŅĐēОК Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии.
+
+ĐĸаĐŧ ĐĩŅŅŅ `tags`, `parameters`, `requestBody`, `responses` и Ņ.Đ´.
+
+ĐŅа ŅĐŋĐĩŅиŅиĐēаŅĐ¸Ņ OpenAPI, ŅĐŋĐĩŅиŅиŅĐŊĐ°Ņ Đ´ĐģŅ *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*, ОйŅŅĐŊĐž ĐŗĐĩĐŊĐĩŅиŅŅĐĩŅŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēи **FastAPI**, ĐŊĐž Đ˛Ņ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ ĐĩŅ ŅаŅŅиŅиŅŅ.
+
+/// tip | ХОвĐĩŅ
+
+ĐŅĐž ĐŊиСĐēĐžŅŅОвĐŊĐĩĐ˛Đ°Ņ Đ˛ĐžĐˇĐŧĐžĐļĐŊĐžŅŅŅ ŅаŅŅиŅĐĩĐŊиŅ.
+
+ĐŅĐģи ваĐŧ ĐŊŅĐļĐŊĐž ĐģиŅŅ ĐžĐąŅŅвиŅŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ĐžŅвĐĩŅŅ, ŅдОйĐŊĐĩĐĩ ŅĐ´ĐĩĐģаŅŅ ŅŅĐž ŅĐĩŅĐĩС [ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ĐžŅвĐĩŅŅ Đ˛ OpenAPI](additional-responses.md){.internal-link target=_blank}.
+
+///
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ŅаŅŅиŅиŅŅ ŅŅ
ĐĩĐŧŅ OpenAPI Đ´ĐģŅ *ĐžĐŋĐĩŅаŅии ĐŋŅŅи* Ņ ĐŋĐžĐŧĐžŅŅŅ ĐŋаŅаĐŧĐĩŅŅа `openapi_extra`.
+
+### РаŅŅиŅĐĩĐŊĐ¸Ņ OpenAPI { #openapi-extensions }
+
+`openapi_extra` ĐŧĐžĐļĐĩŅ ĐŋŅĐ¸ĐŗĐžĐ´Đ¸ŅŅŅŅ, ĐŊаĐŋŅиĐŧĐĩŅ, ŅŅĐžĐąŅ ĐžĐąŅŅвиŅŅ [РаŅŅиŅĐĩĐŊĐ¸Ņ OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#specificationExtensions):
+
+{* ../../docs_src/path_operation_advanced_configuration/tutorial005.py hl[6] *}
+
+ĐŅĐģи Đ˛Ņ ĐžŅĐēŅĐžĐĩŅĐĩ авŅĐžĐŧаŅиŅĐĩŅĐēŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ API, ваŅĐĩ ŅаŅŅиŅĐĩĐŊиĐĩ ĐŋĐžŅвиŅŅŅ Đ˛ĐŊĐ¸ĐˇŅ ŅŅŅаĐŊиŅŅ ĐēĐžĐŊĐēŅĐĩŅĐŊОК *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*.
+
+
+
+Đ ĐĩŅĐģи Đ˛Ņ ĐŋĐžŅĐŧĐžŅŅиŅĐĩ ĐŊа иŅĐžĐŗĐžĐ˛ŅĐš OpenAPI (ĐŋĐž адŅĐĩŅŅ `/openapi.json` ваŅĐĩĐŗĐž API), Đ˛Ņ ŅаĐēĐļĐĩ ŅвидиŅĐĩ ŅĐ˛ĐžŅ ŅаŅŅиŅĐĩĐŊиĐĩ в ŅĐžŅŅавĐĩ ĐžĐŋиŅаĐŊĐ¸Ņ ŅООŅвĐĩŅŅŅвŅŅŅĐĩĐš *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*:
+
+```JSON hl_lines="22"
+{
+ "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": {}
+ }
+ }
+ }
+ },
+ "x-aperture-labs-portal": "blue"
+ }
+ }
+ }
+}
+```
+
+### ĐĐžĐģŅСОваŅĐĩĐģŅŅĐēĐ°Ņ ŅŅ
ĐĩĐŧа OpenAPI Đ´ĐģŅ ĐžĐŋĐĩŅаŅии ĐŋŅŅи { #custom-openapi-path-operation-schema }
+
+ĐĄĐģОваŅŅ Đ˛ `openapi_extra` ĐąŅĐ´ĐĩŅ ĐžĐąŅĐĩдиĐŊŅĐŊ Ņ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēи ŅĐŗĐĩĐŊĐĩŅиŅОваĐŊĐŊОК ŅŅ
ĐĩĐŧОК OpenAPI Đ´ĐģŅ *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*.
+
+ĐĸаĐēиĐŧ ОйŅаСОĐŧ, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ дОйавиŅŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ даĐŊĐŊŅĐĩ Đē авŅĐžĐŧаŅиŅĐĩŅĐēи ŅĐŗĐĩĐŊĐĩŅиŅОваĐŊĐŊОК ŅŅ
ĐĩĐŧĐĩ.
+
+ĐаĐŋŅиĐŧĐĩŅ, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅĐĩŅиŅŅ ŅиŅаŅŅ Đ¸ ваĐģидиŅОваŅŅ ĐˇĐ°ĐŋŅĐžŅ ŅвОиĐŧ ĐēОдОĐŧ, ĐŊĐĩ иŅĐŋĐžĐģŅСŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēиĐĩ вОСĐŧĐžĐļĐŊĐžŅŅи FastAPI и Pydantic, ĐŊĐž ĐŋŅи ŅŅĐžĐŧ СаŅ
ĐžŅиŅĐĩ ĐžĐŋиŅаŅŅ ĐˇĐ°ĐŋŅĐžŅ Đ˛ ŅŅ
ĐĩĐŧĐĩ OpenAPI.
+
+ĐŅĐž ĐŧĐžĐļĐŊĐž ŅĐ´ĐĩĐģаŅŅ Ņ ĐŋĐžĐŧĐžŅŅŅ `openapi_extra`:
+
+{* ../../docs_src/path_operation_advanced_configuration/tutorial006.py hl[19:36, 39:40] *}
+
+Đ ŅŅĐžĐŧ ĐŋŅиĐŧĐĩŅĐĩ ĐŧŅ ĐŊĐĩ ОйŅŅвĐģŅĐģи ĐŊиĐēаĐēŅŅ Pydantic-ĐŧОдĐĩĐģŅ. ФаĐēŅиŅĐĩŅĐēи ŅĐĩĐģĐž СаĐŋŅĐžŅа даĐļĐĩ ĐŊĐĩ ŅаŅĐŋаŅŅĐĩĐŊĐž ĐēаĐē JSON, ĐžĐŊĐž ŅиŅаĐĩŅŅŅ ĐŊаĐŋŅŅĐŧŅŅ ĐēаĐē `bytes`, а ŅŅĐŊĐēŅĐ¸Ņ `magic_data_reader()` ĐąŅĐ´ĐĩŅ ĐžŅвĐĩŅаŅŅ ĐˇĐ° ĐĩĐŗĐž ĐŋаŅŅиĐŊĐŗ ĐēаĐēиĐŧ-ŅĐž ŅĐŋĐžŅОйОĐŧ.
+
+ĐĸĐĩĐŧ ĐŊĐĩ ĐŧĐĩĐŊĐĩĐĩ, ĐŧŅ ĐŧĐžĐļĐĩĐŧ ОйŅŅвиŅŅ ĐžĐļидаĐĩĐŧŅŅ ŅŅ
ĐĩĐŧŅ Đ´ĐģŅ ŅĐĩĐģа СаĐŋŅĐžŅа.
+
+### ĐĐžĐģŅСОваŅĐĩĐģŅŅĐēиК ŅиĐŋ ŅОдĐĩŅĐļиĐŧĐžĐŗĐž в OpenAPI { #custom-openapi-content-type }
+
+ĐŅĐŋĐžĐģŅСŅŅ ŅĐžŅ ĐļĐĩ ĐŋŅиŅĐŧ, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ вОŅĐŋĐžĐģŅСОваŅŅŅŅ Pydantic-ĐŧОдĐĩĐģŅŅ, ŅŅĐžĐąŅ ĐžĐŋŅĐĩĐ´ĐĩĐģиŅŅ JSON Schema, ĐēĐžŅĐžŅĐ°Ņ ĐˇĐ°ŅĐĩĐŧ ĐąŅĐ´ĐĩŅ Đ˛ĐēĐģŅŅĐĩĐŊа в ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиК ŅаСдĐĩĐģ ŅŅ
ĐĩĐŧŅ OpenAPI Đ´ĐģŅ *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*.
+
+Đ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅĐ´ĐĩĐģаŅŅ ŅŅĐž, даĐļĐĩ ĐĩŅĐģи ŅиĐŋ даĐŊĐŊŅŅ
в СаĐŋŅĐžŅĐĩ â ĐŊĐĩ JSON.
+
+ĐаĐŋŅиĐŧĐĩŅ, в ŅŅĐžĐŧ ĐŋŅиĐģĐžĐļĐĩĐŊии ĐŧŅ ĐŊĐĩ иŅĐŋĐžĐģŅСŅĐĩĐŧ вŅŅŅĐžĐĩĐŊĐŊŅŅ ŅŅĐŊĐēŅиОĐŊаĐģŅĐŊĐžŅŅŅ FastAPI Đ´ĐģŅ Đ¸ĐˇĐ˛ĐģĐĩŅĐĩĐŊĐ¸Ņ JSON Schema иС ĐŧОдĐĩĐģĐĩĐš Pydantic, ŅавĐŊĐž ĐēаĐē и авŅĐžĐŧаŅиŅĐĩŅĐēŅŅ Đ˛Đ°ĐģидаŅĐ¸Ņ JSON. ĐŅ ĐžĐąŅŅвĐģŅĐĩĐŧ ŅиĐŋ ŅОдĐĩŅĐļиĐŧĐžĐŗĐž СаĐŋŅĐžŅа ĐēаĐē YAML, а ĐŊĐĩ JSON:
+
+//// tab | Pydantic v2
+
+{* ../../docs_src/path_operation_advanced_configuration/tutorial007.py hl[17:22, 24] *}
+
+////
+
+//// tab | Pydantic v1
+
+{* ../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py hl[17:22, 24] *}
+
+////
+
+/// info | ĐĐŊŅĐžŅĐŧаŅиŅ
+
+Đ Pydantic вĐĩŅŅии 1 ĐŧĐĩŅОд Đ´ĐģŅ ĐŋĐžĐģŅŅĐĩĐŊĐ¸Ņ JSON Schema ĐŧОдĐĩĐģи ĐŊаСŅваĐģŅŅ `Item.schema()`, в Pydantic вĐĩŅŅии 2 ĐŧĐĩŅОд ĐŊаСŅваĐĩŅŅŅ `Item.model_json_schema()`.
+
+///
+
+ĐĸĐĩĐŧ ĐŊĐĩ ĐŧĐĩĐŊĐĩĐĩ, Ņ
ĐžŅŅ ĐŧŅ ĐŊĐĩ иŅĐŋĐžĐģŅСŅĐĩĐŧ вŅŅŅĐžĐĩĐŊĐŊŅŅ ŅŅĐŊĐēŅиОĐŊаĐģŅĐŊĐžŅŅŅ ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ, ĐŧŅ Đ˛ŅŅ ŅавĐŊĐž иŅĐŋĐžĐģŅСŅĐĩĐŧ Pydantic-ĐŧОдĐĩĐģŅ, ŅŅĐžĐąŅ Đ˛ŅŅŅĐŊŅŅ ŅĐŗĐĩĐŊĐĩŅиŅОваŅŅ JSON Schema Đ´ĐģŅ Đ´Đ°ĐŊĐŊŅŅ
, ĐēĐžŅĐžŅŅĐĩ ĐŧŅ Ņ
ĐžŅиĐŧ ĐŋĐžĐģŅŅиŅŅ Đ˛ YAML.
+
+ĐаŅĐĩĐŧ ĐŧŅ ŅайОŅаĐĩĐŧ Ņ ĐˇĐ°ĐŋŅĐžŅĐžĐŧ ĐŊаĐŋŅŅĐŧŅŅ Đ¸ иСвĐģĐĩĐēаĐĩĐŧ ŅĐĩĐģĐž ĐēаĐē `bytes`. ĐŅĐž ОСĐŊаŅаĐĩŅ, ŅŅĐž FastAPI даĐļĐĩ ĐŊĐĩ ĐŋĐžĐŋŅŅаĐĩŅŅŅ ŅаŅĐŋаŅŅиŅŅ ĐŋĐžĐģĐĩСĐŊŅŅ ĐŊĐ°ĐŗŅŅСĐēŅ ĐˇĐ°ĐŋŅĐžŅа ĐēаĐē JSON.
+
+РСаŅĐĩĐŧ в ĐŊаŅĐĩĐŧ ĐēОдĐĩ ĐŧŅ ĐŊаĐŋŅŅĐŧŅŅ ĐŋаŅŅиĐŧ ŅŅĐžŅ YAML и ŅĐŊОва иŅĐŋĐžĐģŅСŅĐĩĐŧ ŅŅ ĐļĐĩ Pydantic-ĐŧОдĐĩĐģŅ Đ´ĐģŅ Đ˛Đ°ĐģидаŅии YAML-ŅОдĐĩŅĐļиĐŧĐžĐŗĐž:
+
+//// tab | Pydantic v2
+
+{* ../../docs_src/path_operation_advanced_configuration/tutorial007.py hl[26:33] *}
+
+////
+
+//// tab | Pydantic v1
+
+{* ../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py hl[26:33] *}
+
+////
+
+/// info | ĐĐŊŅĐžŅĐŧаŅиŅ
+
+Đ Pydantic вĐĩŅŅии 1 ĐŧĐĩŅОд Đ´ĐģŅ ĐŋаŅŅиĐŊĐŗĐ° и ваĐģидаŅии ОйŅĐĩĐēŅа ĐŊаСŅваĐģŅŅ `Item.parse_obj()`, в Pydantic вĐĩŅŅии 2 ĐŧĐĩŅОд ĐŊаСŅваĐĩŅŅŅ `Item.model_validate()`.
+
+///
+
+/// tip | ХОвĐĩŅ
+
+ĐĐ´ĐĩŅŅ ĐŧŅ ĐŋĐĩŅĐĩиŅĐŋĐžĐģŅСŅĐĩĐŧ ŅŅ ĐļĐĩ Pydantic-ĐŧОдĐĩĐģŅ.
+
+ĐĐž аĐŊаĐģĐžĐŗĐ¸ŅĐŊĐž ĐŧŅ ĐŧĐžĐŗĐģи ĐąŅ Đ˛Đ°ĐģидиŅОваŅŅ Đ´Đ°ĐŊĐŊŅĐĩ и ĐēаĐēиĐŧ-ŅĐž Đ´ŅŅĐŗĐ¸Đŧ ŅĐŋĐžŅОйОĐŧ.
+
+///
diff --git a/docs/ru/docs/advanced/response-change-status-code.md b/docs/ru/docs/advanced/response-change-status-code.md
index 37dade99f..e9e1c9470 100644
--- a/docs/ru/docs/advanced/response-change-status-code.md
+++ b/docs/ru/docs/advanced/response-change-status-code.md
@@ -1,22 +1,22 @@
-# Response - ĐСĐŧĐĩĐŊĐĩĐŊиĐĩ cŅаŅŅŅ ĐēОда
+# Response - ĐСĐŧĐĩĐŊĐĩĐŊиĐĩ ŅŅаŅŅŅ-ĐēОда { #response-change-status-code }
-ĐŅ, вĐĩŅĐžŅŅĐŊĐž, ŅĐļĐĩ ŅиŅаĐģи Đž ŅĐžĐŧ, ŅŅĐž ĐŧĐžĐļĐŊĐž ŅŅŅаĐŊОвиŅŅ [ĐĄĐžŅŅĐžŅĐŊиĐĩ ĐžŅвĐĩŅа ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ](../tutorial/response-status-code.md){.internal-link target=_blank}.
+ĐŅ, вĐĩŅĐžŅŅĐŊĐž, ŅĐļĐĩ ŅиŅаĐģи Đž ŅĐžĐŧ, ŅŅĐž ĐŧĐžĐļĐŊĐž ŅŅŅаĐŊОвиŅŅ [ŅŅаŅŅŅ-ĐēОд ĐžŅвĐĩŅа ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ](../tutorial/response-status-code.md){.internal-link target=_blank}.
-ĐĐž в ĐŊĐĩĐēĐžŅĐžŅŅŅ
ŅĐģŅŅаŅŅ
ваĐŧ ĐŊŅĐļĐŊĐž вĐĩŅĐŊŅŅŅ ĐēОд ŅĐžŅŅĐžŅĐŊиŅ, ĐžŅĐģиŅĐŊŅĐš ĐžŅ ŅŅŅаĐŊОвĐģĐĩĐŊĐŊĐžĐŗĐž ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ.
+ĐĐž в ĐŊĐĩĐēĐžŅĐžŅŅŅ
ŅĐģŅŅаŅŅ
ĐŊŅĐļĐŊĐž вĐĩŅĐŊŅŅŅ Đ´ŅŅĐŗĐžĐš ŅŅаŅŅŅ-ĐēОд, ĐžŅĐģиŅĐŊŅĐš ĐžŅ ĐˇĐŊаŅĐĩĐŊĐ¸Ņ ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ.
-## ĐŅиĐŧĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваĐŊиŅ
+## ĐŅиĐŧĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваĐŊĐ¸Ņ { #use-case }
-ĐаĐŋŅиĐŧĐĩŅ, ĐŋŅĐĩĐ´ŅŅавŅŅĐĩ, ŅŅĐž Đ˛Ņ Ņ
ĐžŅиŅĐĩ вОСвŅаŅаŅŅ HTTP ĐēОд ŅĐžŅŅĐžŅĐŊĐ¸Ņ "OK" `200` ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ.
+ĐаĐŋŅиĐŧĐĩŅ, ĐŋŅĐĩĐ´ŅŅавŅŅĐĩ, ŅŅĐž Đ˛Ņ Ņ
ĐžŅиŅĐĩ ĐŋĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ Đ˛ĐžĐˇĐ˛ŅаŅаŅŅ HTTP ŅŅаŅŅŅ-ĐēОд ÂĢOKÂģ `200`.
-ĐĐž ĐĩŅĐģи даĐŊĐŊŅĐĩ ĐŊĐĩ ŅŅŅĐĩŅŅвОваĐģи, Đ˛Ņ Ņ
ĐžŅиŅĐĩ ŅОСдаŅŅ Đ¸Ņ
и вĐĩŅĐŊŅŅŅ HTTP ĐēОд ŅĐžŅŅĐžŅĐŊĐ¸Ņ "CREATED" `201`.
+ĐĐž ĐĩŅĐģи даĐŊĐŊŅĐĩ ĐŊĐĩ ŅŅŅĐĩŅŅвОваĐģи, Đ˛Ņ Ņ
ĐžŅиŅĐĩ ŅОСдаŅŅ Đ¸Ņ
и вĐĩŅĐŊŅŅŅ HTTP ŅŅаŅŅŅ-ĐēОд ÂĢCREATEDÂģ `201`.
ĐŅи ŅŅĐžĐŧ Đ˛Ņ Đ˛ŅŅ ĐĩŅŅ Ņ
ĐžŅиŅĐĩ иĐŧĐĩŅŅ Đ˛ĐžĐˇĐŧĐžĐļĐŊĐžŅŅŅ ŅиĐģŅŅŅОваŅŅ Đ¸ ĐŋŅĐĩОйŅаСОвŅваŅŅ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩĐŧŅĐĩ даĐŊĐŊŅĐĩ Ņ ĐŋĐžĐŧĐžŅŅŅ `response_model`.
ĐĐģŅ ŅаĐēиŅ
ŅĐģŅŅаĐĩв Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ ĐŋаŅаĐŧĐĩŅŅ `Response`.
-## ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ ĐŋаŅаĐŧĐĩŅŅа `Response`
+## ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ ĐŋаŅаĐŧĐĩŅŅа `Response` { #use-a-response-parameter }
-ĐŅ ĐŧĐžĐļĐĩŅĐĩ ОйŅŅвиŅŅ ĐŋаŅаĐŧĐĩŅŅ ŅиĐŋа `Response` в ваŅĐĩĐš *ŅŅĐŊĐēŅии ОйŅайОŅĐēи ĐŋŅŅи* (ŅаĐē ĐļĐĩ ĐēаĐē Đ´ĐģŅ cookies и headers).
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ОйŅŅвиŅŅ ĐŋаŅаĐŧĐĩŅŅ ŅиĐŋа `Response` в ваŅĐĩĐš *ŅŅĐŊĐēŅии ОйŅайОŅĐēи ĐŋŅŅи* (ĐēаĐē и Đ´ĐģŅ cookies и HTTP-ĐˇĐ°ĐŗĐžĐģОвĐēОв).
РСаŅĐĩĐŧ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅŅŅаĐŊОвиŅŅ `status_code` в ŅŅĐžĐŧ *вŅĐĩĐŧĐĩĐŊĐŊĐžĐŧ* ОйŅĐĩĐēŅĐĩ ĐžŅвĐĩŅа.
@@ -26,6 +26,6 @@
Đ ĐĩŅĐģи Đ˛Ņ ĐžĐąŅŅвиĐģи `response_model`, ĐžĐŊ вŅŅ ŅавĐŊĐž ĐąŅĐ´ĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅŅŅ Đ´ĐģŅ ŅиĐģŅŅŅаŅии и ĐŋŅĐĩОйŅаСОваĐŊĐ¸Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩĐŧĐžĐŗĐž ОйŅĐĩĐēŅа.
-**FastAPI** ĐąŅĐ´ĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ ŅŅĐžŅ *вŅĐĩĐŧĐĩĐŊĐŊŅĐš* ĐžŅвĐĩŅ Đ´ĐģŅ Đ¸ĐˇĐ˛ĐģĐĩŅĐĩĐŊĐ¸Ņ ĐēОда ŅĐžŅŅĐžŅĐŊĐ¸Ņ (а ŅаĐēĐļĐĩ cookies и headers) и ĐŋĐžĐŧĐĩŅŅĐ¸Ņ Đ¸Ņ
в ŅиĐŊаĐģŅĐŊŅĐš ĐžŅвĐĩŅ, ĐēĐžŅĐžŅŅĐš ŅОдĐĩŅĐļĐ¸Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩĐŧĐžĐĩ ваĐŧи СĐŊаŅĐĩĐŊиĐĩ, ĐžŅŅиĐģŅŅŅОваĐŊĐŊĐžĐĩ ĐģŅĐąŅĐŧ `response_model`.
+**FastAPI** ĐąŅĐ´ĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ ŅŅĐžŅ *вŅĐĩĐŧĐĩĐŊĐŊŅĐš* ĐžŅвĐĩŅ Đ´ĐģŅ Đ¸ĐˇĐ˛ĐģĐĩŅĐĩĐŊĐ¸Ņ ŅŅаŅŅŅ-ĐēОда (а ŅаĐēĐļĐĩ cookies и HTTP-ĐˇĐ°ĐŗĐžĐģОвĐēОв) и ĐŋĐžĐŧĐĩŅŅĐ¸Ņ Đ¸Ņ
в ŅиĐŊаĐģŅĐŊŅĐš ĐžŅвĐĩŅ, ĐēĐžŅĐžŅŅĐš ŅОдĐĩŅĐļĐ¸Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩĐŧĐžĐĩ ваĐŧи СĐŊаŅĐĩĐŊиĐĩ, ĐžŅŅиĐģŅŅŅОваĐŊĐŊĐžĐĩ ĐģŅĐąŅĐŧ `response_model`.
-ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ ОйŅŅвиŅŅ ĐŋаŅаĐŧĐĩŅŅ `Response` в СавиŅиĐŧĐžŅŅŅŅ
и ŅŅŅаĐŊОвиŅŅ ĐēОд ŅĐžŅŅĐžŅĐŊĐ¸Ņ Đ˛ ĐŊиŅ
. ĐĐž ĐŋĐžĐŧĐŊиŅĐĩ, ŅŅĐž ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐĩ ŅŅŅаĐŊОвĐģĐĩĐŊĐŊĐžĐĩ СĐŊаŅĐĩĐŊиĐĩ ĐąŅĐ´ĐĩŅ Đ¸ĐŧĐĩŅŅ ĐŋŅиОŅиŅĐĩŅ.
+ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ ОйŅŅвиŅŅ ĐŋаŅаĐŧĐĩŅŅ `Response` в СавиŅиĐŧĐžŅŅŅŅ
и ŅŅŅаĐŊОвиŅŅ Đ˛ ĐŊиŅ
ŅŅаŅŅŅ-ĐēОд. ĐĐž ĐŋĐžĐŧĐŊиŅĐĩ, ŅŅĐž ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐĩ ŅŅŅаĐŊОвĐģĐĩĐŊĐŊĐžĐĩ СĐŊаŅĐĩĐŊиĐĩ ĐąŅĐ´ĐĩŅ Đ¸ĐŧĐĩŅŅ ĐŋŅиОŅиŅĐĩŅ.
diff --git a/docs/ru/docs/advanced/response-cookies.md b/docs/ru/docs/advanced/response-cookies.md
index e04ff577c..3aa32b9bb 100644
--- a/docs/ru/docs/advanced/response-cookies.md
+++ b/docs/ru/docs/advanced/response-cookies.md
@@ -1,9 +1,8 @@
+# Cookies в ĐžŅвĐĩŅĐĩ { #response-cookies }
-# Cookies в ĐžŅвĐĩŅĐĩ
+## ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ ĐŋаŅаĐŧĐĩŅŅа `Response` { #use-a-response-parameter }
-## ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ ĐŋаŅаĐŧĐĩŅŅа `Response`
-
-ĐŅ ĐŧĐžĐļĐĩŅĐĩ ОйŅŅвиŅŅ ĐŋаŅаĐŧĐĩŅŅ ŅиĐŋа `Response` в ваŅĐĩĐš ŅŅĐŊĐēŅии ŅĐŊĐ´ĐŋОиĐŊŅа.
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ОйŅŅвиŅŅ ĐŋаŅаĐŧĐĩŅŅ ŅиĐŋа `Response` в ваŅĐĩĐš ŅŅĐŊĐēŅии-ОйŅайОŅŅиĐēĐĩ ĐŋŅŅи.
ĐаŅĐĩĐŧ ŅŅŅаĐŊОвиŅŅ cookies в ŅŅĐžĐŧ вŅĐĩĐŧĐĩĐŊĐŊĐžĐŧ ОйŅĐĩĐēŅĐĩ ĐžŅвĐĩŅа.
@@ -13,36 +12,40 @@
ĐŅĐģи Đ˛Ņ ŅĐēаСаĐģи `response_model`, ĐžĐŊ вŅŅ ŅавĐŊĐž ĐąŅĐ´ĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅŅŅ Đ´ĐģŅ ŅиĐģŅŅŅаŅии и ĐŋŅĐĩОйŅаСОваĐŊĐ¸Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩĐŧĐžĐŗĐž ОйŅĐĩĐēŅа.
-**FastAPI** иСвĐģĐĩŅĐĩŅ cookies (а ŅаĐēĐļĐĩ ĐˇĐ°ĐŗĐžĐģОвĐēи и ĐēĐžĐ´Ņ ŅĐžŅŅĐžŅĐŊиŅ) иС вŅĐĩĐŧĐĩĐŊĐŊĐžĐŗĐž ĐžŅвĐĩŅа и вĐēĐģŅŅĐ¸Ņ Đ¸Ņ
в ĐžĐēĐžĐŊŅаŅĐĩĐģŅĐŊŅĐš ĐžŅвĐĩŅ, ŅОдĐĩŅĐļаŅиК ваŅĐĩ вОСвŅаŅаĐĩĐŧĐžĐĩ СĐŊаŅĐĩĐŊиĐĩ, ĐžŅŅиĐģŅŅŅОваĐŊĐŊĐžĐĩ ŅĐĩŅĐĩС `response_model`.
+**FastAPI** иСвĐģĐĩŅĐĩŅ cookies (а ŅаĐēĐļĐĩ HTTP-ĐˇĐ°ĐŗĐžĐģОвĐēи и ŅŅаŅŅŅ-ĐēОд) иС вŅĐĩĐŧĐĩĐŊĐŊĐžĐŗĐž ĐžŅвĐĩŅа и вĐēĐģŅŅĐ¸Ņ Đ¸Ņ
в ĐžĐēĐžĐŊŅаŅĐĩĐģŅĐŊŅĐš ĐžŅвĐĩŅ, ŅОдĐĩŅĐļаŅиК ваŅĐĩ вОСвŅаŅаĐĩĐŧĐžĐĩ СĐŊаŅĐĩĐŊиĐĩ, ĐžŅŅиĐģŅŅŅОваĐŊĐŊĐžĐĩ ŅĐĩŅĐĩС `response_model`.
-ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ ОйŅŅвиŅŅ ĐŋаŅаĐŧĐĩŅŅ ŅиĐŋа Response в СавиŅиĐŧĐžŅŅŅŅ
и ŅŅŅаĐŊавĐģиваŅŅ cookies (и ĐˇĐ°ĐŗĐžĐģОвĐēи) ŅаĐŧ.
+ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ ОйŅŅвиŅŅ ĐŋаŅаĐŧĐĩŅŅ ŅиĐŋа `Response` в СавиŅиĐŧĐžŅŅŅŅ
и ŅŅŅаĐŊавĐģиваŅŅ cookies (и HTTP-ĐˇĐ°ĐŗĐžĐģОвĐēи) ŅаĐŧ.
-## ĐОСвŅаŅĐĩĐŊиĐĩ `Response` ĐŊаĐŋŅŅĐŧŅŅ
+## ĐОСвŅаŅĐĩĐŊиĐĩ `Response` ĐŊаĐŋŅŅĐŧŅŅ { #return-a-response-directly }
-ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ ŅŅŅаĐŊОвиŅŅ cookies, ĐĩŅĐģи вОСвŅаŅаĐĩŅĐĩ `Response` ĐŊаĐŋŅŅĐŧŅŅ Đ˛ ваŅĐĩĐŧ ĐēОдĐĩ.
+ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ ŅŅŅаĐŊОвиŅŅ Cookies, ĐĩŅĐģи вОСвŅаŅаĐĩŅĐĩ `Response` ĐŊаĐŋŅŅĐŧŅŅ Đ˛ ваŅĐĩĐŧ ĐēОдĐĩ.
-ĐĐģŅ ŅŅĐžĐŗĐž ŅОСдаКŅĐĩ ОйŅĐĩĐēŅ `Response`, ĐēаĐē ĐžĐŋиŅаĐŊĐž в ŅаСдĐĩĐģĐĩ [ĐОСвŅаŅĐĩĐŊиĐĩ ĐžŅвĐĩŅа ĐŊаĐŋŅŅĐŧŅŅ](response-directly.md){.target=_blank}.
+ĐĐģŅ ŅŅĐžĐŗĐž ŅОСдаКŅĐĩ ОйŅĐĩĐēŅ `Response`, ĐēаĐē ĐžĐŋиŅаĐŊĐž в ŅаСдĐĩĐģĐĩ [ĐОСвŅаŅĐĩĐŊиĐĩ ĐžŅвĐĩŅа ĐŊаĐŋŅŅĐŧŅŅ](response-directly.md){.internal-link target=_blank}.
ĐаŅĐĩĐŧ ŅŅŅаĐŊОвиŅĐĩ cookies и вĐĩŅĐŊиŅĐĩ ŅŅĐžŅ ĐžĐąŅĐĩĐēŅ:
{* ../../docs_src/response_cookies/tutorial001.py hl[10:12] *}
-/// tip | ĐŅиĐŧĐĩŅаĐŊиĐĩ
-ĐĐŧĐĩĐšŅĐĩ в видŅ, ŅŅĐž ĐĩŅĐģи Đ˛Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅĐĩ ĐžŅвĐĩŅ ĐŊаĐŋŅŅĐŧŅŅ, вĐŧĐĩŅŅĐž иŅĐŋĐžĐģŅСОваĐŊĐ¸Ņ ĐŋаŅаĐŧĐĩŅŅа `Response`, **FastAPI** ĐžŅĐŋŅĐ°Đ˛Đ¸Ņ ĐĩĐŗĐž ĐąĐĩС Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊОК ОйŅайОŅĐēи.
+/// tip | ХОвĐĩŅ
-ĐŖĐąĐĩдиŅĐĩŅŅ, ŅŅĐž ваŅи даĐŊĐŊŅĐĩ иĐŧĐĩŅŅ ĐēĐžŅŅĐĩĐēŅĐŊŅĐš ŅиĐŋ. ĐаĐŋŅиĐŧĐĩŅ, ĐžĐŊи Đ´ĐžĐģĐļĐŊŅ ĐąŅŅŅ ŅОвĐŧĐĩŅŅиĐŧŅ Ņ JSON, ĐĩŅĐģи Đ˛Ņ Đ¸ŅĐŋĐžĐģŅСŅĐĩŅĐĩ `JSONResponse`.
+ĐĐŧĐĩĐšŅĐĩ в видŅ, ŅŅĐž ĐĩŅĐģи Đ˛Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅĐĩ ĐžŅвĐĩŅ ĐŊаĐŋŅŅĐŧŅŅ, вĐŧĐĩŅŅĐž иŅĐŋĐžĐģŅСОваĐŊĐ¸Ņ ĐŋаŅаĐŧĐĩŅŅа `Response`, FastAPI вĐĩŅĐŊŅŅ ĐĩĐŗĐž ĐŊаĐŋŅŅĐŧŅŅ.
+
+ĐŖĐąĐĩдиŅĐĩŅŅ, ŅŅĐž ваŅи даĐŊĐŊŅĐĩ иĐŧĐĩŅŅ ĐēĐžŅŅĐĩĐēŅĐŊŅĐš ŅиĐŋ. ĐаĐŋŅиĐŧĐĩŅ, ĐžĐŊи Đ´ĐžĐģĐļĐŊŅ ĐąŅŅŅ ŅОвĐŧĐĩŅŅиĐŧŅ Ņ JSON, ĐĩŅĐģи Đ˛Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅĐĩ `JSONResponse`.
ĐĸаĐēĐļĐĩ ŅĐąĐĩдиŅĐĩŅŅ, ŅŅĐž Đ˛Ņ ĐŊĐĩ ĐžŅĐŋŅавĐģŅĐĩŅĐĩ даĐŊĐŊŅĐĩ, ĐēĐžŅĐžŅŅĐĩ Đ´ĐžĐģĐļĐŊŅ ĐąŅĐģи ĐąŅŅŅ ĐžŅŅиĐģŅŅŅОваĐŊŅ ŅĐĩŅĐĩС `response_model`.
+
///
-### ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊĐ°Ņ Đ¸ĐŊŅĐžŅĐŧаŅиŅ
+### ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊĐ°Ņ Đ¸ĐŊŅĐžŅĐŧаŅĐ¸Ņ { #more-info }
/// note | ĐĸĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ Đ´ĐĩŅаĐģи
+
ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ `from starlette.responses import Response` иĐģи `from starlette.responses import JSONResponse`.
**FastAPI** ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ `fastapi.responses`, ĐēĐžŅĐžŅŅĐĩ ŅвĐģŅŅŅŅŅ ŅĐĩĐŧи ĐļĐĩ ОйŅĐĩĐēŅаĐŧи, ŅŅĐž и `starlette.responses`, ĐŋŅĐžŅŅĐž Đ´ĐģŅ ŅдОйŅŅва. ĐĐ´ĐŊаĐēĐž йОĐģŅŅиĐŊŅŅвО Đ´ĐžŅŅŅĐŋĐŊŅŅ
ŅиĐŋОв ĐžŅвĐĩŅОв ĐŋĐžŅŅŅĐŋаĐĩŅ ĐŊĐĩĐŋĐžŅŅĐĩĐ´ŅŅвĐĩĐŊĐŊĐž иС **Starlette**.
-ĐĐģŅ ŅŅŅаĐŊОвĐēи ĐˇĐ°ĐŗĐžĐģОвĐēОв и cookies `Response` иŅĐŋĐžĐģŅСŅĐĩŅŅŅ ŅаŅŅĐž, ĐŋĐžŅŅĐžĐŧŅ **FastAPI** ŅаĐēĐļĐĩ ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ ĐĩĐŗĐž ŅĐĩŅĐĩС `fastapi.responses`.
+Đ ŅаĐē ĐēаĐē `Response` ŅаŅŅĐž иŅĐŋĐžĐģŅСŅĐĩŅŅŅ Đ´ĐģŅ ŅŅŅаĐŊОвĐēи HTTP-ĐˇĐ°ĐŗĐžĐģОвĐēОв и cookies, **FastAPI** ŅаĐēĐļĐĩ ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ ĐĩĐŗĐž ĐēаĐē `fastapi.Response`.
+
///
ЧŅĐžĐąŅ ŅвидĐĩŅŅ Đ˛ŅĐĩ Đ´ĐžŅŅŅĐŋĐŊŅĐĩ ĐŋаŅаĐŧĐĩŅŅŅ Đ¸ ĐŊаŅŅŅОКĐēи, ОСĐŊаĐēĐžĐŧŅŅĐĩŅŅ Ņ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиĐĩĐš Starlette.
diff --git a/docs/ru/docs/advanced/response-directly.md b/docs/ru/docs/advanced/response-directly.md
index ee83d22b1..febd40ed4 100644
--- a/docs/ru/docs/advanced/response-directly.md
+++ b/docs/ru/docs/advanced/response-directly.md
@@ -1,4 +1,4 @@
-# ĐОСвŅĐ°Ņ ĐžŅвĐĩŅа ĐŊаĐŋŅŅĐŧŅŅ
+# ĐОСвŅĐ°Ņ ĐžŅвĐĩŅа ĐŊаĐŋŅŅĐŧŅŅ { #return-a-response-directly }
ĐĐžĐŗĐ´Đ° Đ˛Ņ ŅОСдаŅŅĐĩ **FastAPI** *ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи*, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ вОСвŅаŅаŅŅ Đ¸Đˇ ĐŊĐĩŅ ĐģŅĐąŅĐĩ даĐŊĐŊŅĐĩ: `dict`, `list`, Pydantic-ĐŧОдĐĩĐģŅ, ĐŧОдĐĩĐģŅ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊĐŊŅŅ
и Ņ.Đ´.
@@ -8,9 +8,9 @@
ĐĐž Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ вОСвŅаŅаŅŅ `JSONResponse` ĐŊаĐŋŅŅĐŧŅŅ Đ¸Đˇ ваŅиŅ
*ĐžĐŋĐĩŅаŅиК ĐŋŅŅи*.
-ĐŅĐž ĐŧĐžĐļĐĩŅ ĐąŅŅŅ ĐŋĐžĐģĐĩСĐŊĐž, ĐŊаĐŋŅиĐŧĐĩŅ, ĐĩŅĐģи ĐŊŅĐļĐŊĐž вĐĩŅĐŊŅŅŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиĐĩ ĐˇĐ°ĐŗĐžĐģОвĐēи иĐģи ĐēŅĐēи.
+ĐŅĐž ĐŧĐžĐļĐĩŅ ĐąŅŅŅ ĐŋĐžĐģĐĩСĐŊĐž, ĐŊаĐŋŅиĐŧĐĩŅ, ĐĩŅĐģи ĐŊŅĐļĐŊĐž вĐĩŅĐŊŅŅŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиĐĩ HTTP-ĐˇĐ°ĐŗĐžĐģОвĐēи иĐģи cookie.
-## ĐОСвŅĐ°Ņ `Response`
+## ĐОСвŅĐ°Ņ `Response` { #return-a-response }
Đа ŅаĐŧĐžĐŧ Đ´ĐĩĐģĐĩ, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ вОСвŅаŅаŅŅ ĐģŅйОК ОйŅĐĩĐēŅ `Response` иĐģи ĐĩĐŗĐž ĐŋОдĐēĐģаŅŅ.
@@ -26,7 +26,7 @@
ĐŅĐž даŅŅ Đ˛Đ°Đŧ йОĐģŅŅŅŅ ĐŗĐ¸ĐąĐēĐžŅŅŅ. ĐŅ ĐŧĐžĐļĐĩŅĐĩ вОСвŅаŅаŅŅ ĐģŅĐąŅĐĩ ŅиĐŋŅ Đ´Đ°ĐŊĐŊŅŅ
, ĐŋĐĩŅĐĩĐžĐŋŅĐĩĐ´ĐĩĐģŅŅŅ ĐģŅĐąŅĐĩ ОйŅŅвĐģĐĩĐŊĐ¸Ņ Đ¸Đģи ваĐģидаŅĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
и Ņ.Đ´.
-## ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ `jsonable_encoder` в `Response`
+## ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ `jsonable_encoder` в `Response` { #using-the-jsonable-encoder-in-a-response }
ĐĐžŅĐēĐžĐģŅĐēŅ **FastAPI** ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ ĐžĐąŅĐĩĐēŅ `Response`, ĐēĐžŅĐžŅŅĐš Đ˛Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅĐĩ, Đ˛Ņ Đ´ĐžĐģĐļĐŊŅ ŅĐąĐĩдиŅŅŅŅ, ŅŅĐž ĐĩĐŗĐž ŅОдĐĩŅĐļиĐŧĐžĐĩ ĐŗĐžŅОвО Đē ĐžŅĐŋŅавĐēĐĩ.
@@ -44,7 +44,7 @@
///
-## ĐОСвŅĐ°Ņ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēĐžĐŗĐž `Response`
+## ĐОСвŅĐ°Ņ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēĐžĐŗĐž `Response` { #returning-a-custom-response }
ĐŅиĐŧĐĩŅ Đ˛ŅŅĐĩ ĐŋĐžĐēаСŅваĐĩŅ Đ˛ŅĐĩ ĐŊĐĩОйŅ
ОдиĐŧŅĐĩ ŅаŅŅи, ĐŊĐž ĐžĐŊ ĐŋĐžĐēа ĐŊĐĩ ĐžŅĐĩĐŊŅ ĐŋĐžĐģĐĩСĐĩĐŊ, ŅаĐē ĐēаĐē Đ˛Ņ ĐŧĐžĐŗĐģи ĐąŅ ĐŋŅĐžŅŅĐž вĐĩŅĐŊŅŅŅ `item` ĐŊаĐŋŅŅĐŧŅŅ, и **FastAPI** ĐŋĐžĐŧĐĩŅŅиĐģ ĐąŅ ĐĩĐŗĐž в `JSONResponse`, ĐŋŅĐĩОйŅаСОвав в `dict` и Ņ.Đ´. ĐŅŅ ŅŅĐž ĐŋŅОиŅŅ
ĐžĐ´Đ¸Ņ ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ.
@@ -56,7 +56,7 @@
{* ../../docs_src/response_directly/tutorial002.py hl[1,18] *}
-## ĐŅиĐŧĐĩŅаĐŊиŅ
+## ĐŅиĐŧĐĩŅаĐŊĐ¸Ņ { #notes }
ĐĐžĐŗĐ´Đ° Đ˛Ņ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅĐĩ ОйŅĐĩĐēŅ `Response` ĐŊаĐŋŅŅĐŧŅŅ, ĐĩĐŗĐž даĐŊĐŊŅĐĩ ĐŊĐĩ ваĐģидиŅŅŅŅŅŅ, ĐŊĐĩ ĐŋŅĐĩОйŅаСŅŅŅŅŅ (ĐŊĐĩ ŅĐĩŅиаĐģиСŅŅŅŅŅ) и ĐŊĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅиŅŅŅŅŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēи.
diff --git a/docs/ru/docs/advanced/response-headers.md b/docs/ru/docs/advanced/response-headers.md
new file mode 100644
index 000000000..81e52cb69
--- /dev/null
+++ b/docs/ru/docs/advanced/response-headers.md
@@ -0,0 +1,41 @@
+# HTTP-ĐˇĐ°ĐŗĐžĐģОвĐēи ĐžŅвĐĩŅа { #response-headers }
+
+## ĐŅĐŋĐžĐģŅСОваŅŅ ĐŋаŅаĐŧĐĩŅŅ `Response` { #use-a-response-parameter }
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ОйŅŅвиŅŅ ĐŋаŅаĐŧĐĩŅŅ ŅиĐŋа `Response` в ваŅĐĩĐš ŅŅĐŊĐēŅии-ОйŅайОŅŅиĐēĐĩ ĐŋŅŅи (ĐēаĐē ĐŧĐžĐļĐŊĐž ŅĐ´ĐĩĐģаŅŅ Đ¸ Đ´ĐģŅ cookie).
+
+РСаŅĐĩĐŧ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅŅŅаĐŊавĐģиваŅŅ HTTP-ĐˇĐ°ĐŗĐžĐģОвĐēи в ŅŅĐžĐŧ *вŅĐĩĐŧĐĩĐŊĐŊĐžĐŧ* ОйŅĐĩĐēŅĐĩ ĐžŅвĐĩŅа.
+
+{* ../../docs_src/response_headers/tutorial002.py hl[1, 7:8] *}
+
+ĐĐžŅĐģĐĩ ŅŅĐžĐŗĐž Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ вĐĩŅĐŊŅŅŅ ĐģŅйОК ĐŊŅĐļĐŊŅĐš ОйŅĐĩĐēŅ, ĐēаĐē ОйŅŅĐŊĐž (ĐŊаĐŋŅиĐŧĐĩŅ, `dict`, ĐŧОдĐĩĐģŅ Đ¸Đˇ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊĐŊŅŅ
и Ņ.Đ´.).
+
+Đ, ĐĩŅĐģи Đ˛Ņ ĐžĐąŅŅвиĐģи `response_model`, ĐžĐŊ вŅŅ ŅавĐŊĐž ĐąŅĐ´ĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваĐŊ Đ´ĐģŅ ŅиĐģŅŅŅаŅии и ĐŋŅĐĩОйŅаСОваĐŊĐ¸Ņ Đ˛ĐžĐˇĐ˛ŅаŅŅĐŊĐŊĐžĐŗĐž ОйŅĐĩĐēŅа.
+
+**FastAPI** иŅĐŋĐžĐģŅСŅĐĩŅ ŅŅĐžŅ *вŅĐĩĐŧĐĩĐŊĐŊŅĐš* ĐžŅвĐĩŅ, ŅŅĐžĐąŅ Đ¸ĐˇĐ˛ĐģĐĩŅŅ HTTP-ĐˇĐ°ĐŗĐžĐģОвĐēи (а ŅаĐēĐļĐĩ cookie и ŅŅаŅŅŅ-ĐēОд) и ĐŋĐžĐŧĐĩŅŅĐ¸Ņ Đ¸Ņ
в ŅиĐŊаĐģŅĐŊŅĐš HTTP-ĐžŅвĐĩŅ, ĐēĐžŅĐžŅŅĐš ŅОдĐĩŅĐļĐ¸Ņ Đ˛ĐžĐˇĐ˛ŅаŅŅĐŊĐŊĐžĐĩ ваĐŧи СĐŊаŅĐĩĐŊиĐĩ, ĐžŅŅиĐģŅŅŅОваĐŊĐŊĐžĐĩ ŅĐžĐŗĐģаŅĐŊĐž `response_model`.
+
+ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ ОйŅŅвĐģŅŅŅ ĐŋаŅаĐŧĐĩŅŅ `Response` в СавиŅиĐŧĐžŅŅŅŅ
и ŅŅŅаĐŊавĐģиваŅŅ Đ˛ ĐŊиŅ
ĐˇĐ°ĐŗĐžĐģОвĐēи (и cookie).
+
+## ĐĐĩŅĐŊŅŅŅ `Response` ĐŊаĐŋŅŅĐŧŅŅ { #return-a-response-directly }
+
+ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ дОйавиŅŅ HTTP-ĐˇĐ°ĐŗĐžĐģОвĐēи, ĐēĐžĐŗĐ´Đ° вОСвŅаŅаĐĩŅĐĩ `Response` ĐŊаĐŋŅŅĐŧŅŅ.
+
+ХОСдаКŅĐĩ ĐžŅвĐĩŅ, ĐēаĐē ĐžĐŋиŅаĐŊĐž в [ĐĐĩŅĐŊŅŅŅ Response ĐŊаĐŋŅŅĐŧŅŅ](response-directly.md){.internal-link target=_blank}, и ĐŋĐĩŅĐĩдаКŅĐĩ ĐˇĐ°ĐŗĐžĐģОвĐēи ĐēаĐē Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐš ĐŋаŅаĐŧĐĩŅŅ:
+
+{* ../../docs_src/response_headers/tutorial001.py hl[10:12] *}
+
+/// note | ĐĸĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ Đ´ĐĩŅаĐģи
+
+ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ `from starlette.responses import Response` иĐģи `from starlette.responses import JSONResponse`.
+
+**FastAPI** ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ ŅĐĩ ĐļĐĩ ŅаĐŧŅĐĩ `starlette.responses` ĐēаĐē `fastapi.responses` â Đ´ĐģŅ Đ˛Đ°ŅĐĩĐŗĐž ŅдОйŅŅва ĐēаĐē ŅаСŅайОŅŅиĐēа. ĐĐž йОĐģŅŅиĐŊŅŅвО Đ´ĐžŅŅŅĐŋĐŊŅŅ
ĐēĐģаŅŅОв ĐžŅвĐĩŅОв ĐŋĐžŅŅŅĐŋаŅŅ ĐŊаĐŋŅŅĐŧŅŅ Đ¸Đˇ Starlette.
+
+Đ ĐŋĐžŅĐēĐžĐģŅĐēŅ `Response` ŅаŅŅĐž иŅĐŋĐžĐģŅСŅĐĩŅŅŅ Đ´ĐģŅ ŅŅŅаĐŊОвĐēи ĐˇĐ°ĐŗĐžĐģОвĐēОв и cookie, **FastAPI** ŅаĐēĐļĐĩ ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ ĐĩĐŗĐž ĐēаĐē `fastapi.Response`.
+
+///
+
+## ĐĐžĐģŅСОваŅĐĩĐģŅŅĐēиĐĩ HTTP-ĐˇĐ°ĐŗĐžĐģОвĐēи { #custom-headers }
+
+ĐĐžĐŧĐŊиŅĐĩ, ŅŅĐž ŅОйŅŅвĐĩĐŊĐŊŅĐĩ ĐŋŅĐžĐŋŅиĐĩŅаŅĐŊŅĐĩ ĐˇĐ°ĐŗĐžĐģОвĐēи ĐŧĐžĐļĐŊĐž дОйавĐģŅŅŅ, иŅĐŋĐžĐģŅСŅŅ ĐŋŅĐĩŅиĐēŅ `X-`.
+
+ĐĐž ĐĩŅĐģи Ņ Đ˛Đ°Ņ ĐĩŅŅŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиĐĩ ĐˇĐ°ĐŗĐžĐģОвĐēи, ĐēĐžŅĐžŅŅĐĩ Đ˛Ņ Ņ
ĐžŅиŅĐĩ ĐŋĐžĐēаСŅваŅŅ ĐēĐģиĐĩĐŊŅŅ Đ˛ ĐąŅаŅСĐĩŅĐĩ, ваĐŧ ĐŊŅĐļĐŊĐž дОйавиŅŅ Đ¸Ņ
в ĐŊаŅŅŅОКĐēи CORS (ĐŋОдŅОйĐŊĐĩĐĩ ŅĐŧ. в [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md){.internal-link target=_blank}), иŅĐŋĐžĐģŅСŅŅ ĐŋаŅаĐŧĐĩŅŅ `expose_headers`, ĐžĐŋиŅаĐŊĐŊŅĐš в Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии Starlette ĐŋĐž CORS.
diff --git a/docs/ru/docs/advanced/security/http-basic-auth.md b/docs/ru/docs/advanced/security/http-basic-auth.md
new file mode 100644
index 000000000..41e62d4bf
--- /dev/null
+++ b/docs/ru/docs/advanced/security/http-basic-auth.md
@@ -0,0 +1,107 @@
+# HTTP Basic Auth { #http-basic-auth }
+
+ĐĐģŅ ŅаĐŧŅŅ
ĐŋŅĐžŅŅŅŅ
ŅĐģŅŅаĐĩв ĐŧĐžĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ HTTP Basic Auth.
+
+ĐŅи HTTP Basic Auth ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐžĐļидаĐĩŅ HTTP-ĐˇĐ°ĐŗĐžĐģОвОĐē, ĐēĐžŅĐžŅŅĐš ŅОдĐĩŅĐļĐ¸Ņ Đ¸ĐŧŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅ Đ¸ ĐŋаŅĐžĐģŅ.
+
+ĐŅĐģи ĐĩĐŗĐž ĐŊĐĩŅ, вОСвŅаŅаĐĩŅŅŅ ĐžŅийĐēа HTTP 401 ÂĢUnauthorizedÂģ.
+
+ĐĸаĐēĐļĐĩ вОСвŅаŅаĐĩŅŅŅ ĐˇĐ°ĐŗĐžĐģОвОĐē `WWW-Authenticate` ŅĐž СĐŊаŅĐĩĐŊиĐĩĐŧ `Basic` и ĐŊĐĩОйŅСаŅĐĩĐģŅĐŊŅĐŧ ĐŋаŅаĐŧĐĩŅŅĐžĐŧ `realm`.
+
+ĐŅĐž ĐŗĐžĐ˛ĐžŅĐ¸Ņ ĐąŅаŅСĐĩŅŅ ĐŋĐžĐēаСаŅŅ Đ˛ŅŅŅĐžĐĩĐŊĐŊĐžĐĩ ĐžĐēĐŊĐž СаĐŋŅĐžŅа иĐŧĐĩĐŊи ĐŋĐžĐģŅСОваŅĐĩĐģŅ Đ¸ ĐŋаŅĐžĐģŅ.
+
+ĐаŅĐĩĐŧ, ĐēĐžĐŗĐ´Đ° Đ˛Ņ Đ˛Đ˛ĐžĐ´Đ¸ŅĐĩ ŅŅи даĐŊĐŊŅĐĩ, ĐąŅаŅСĐĩŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēи ĐžŅĐŋŅавĐģŅĐĩŅ Đ¸Ņ
в ĐˇĐ°ĐŗĐžĐģОвĐēĐĩ.
+
+## ĐŅĐžŅŅОК HTTP Basic Auth { #simple-http-basic-auth }
+
+* ĐĐŧĐŋĐžŅŅиŅŅĐšŅĐĩ `HTTPBasic` и `HTTPBasicCredentials`.
+* ХОСдаКŅĐĩ ÂĢŅŅ
ĐĩĐŧŅÂģ `security` Ņ ĐŋĐžĐŧĐžŅŅŅ `HTTPBasic`.
+* ĐŅĐŋĐžĐģŅСŅĐšŅĐĩ ŅŅŅ `security` ĐēаĐē СавиŅиĐŧĐžŅŅŅ Đ˛ ваŅĐĩĐš *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*.
+* ĐĐŊа вОСвŅаŅаĐĩŅ ĐžĐąŅĐĩĐēŅ ŅиĐŋа `HTTPBasicCredentials`:
+ * ĐĐŊ ŅОдĐĩŅĐļĐ¸Ņ ĐžŅĐŋŅавĐģĐĩĐŊĐŊŅĐĩ `username` и `password`.
+
+{* ../../docs_src/security/tutorial006_an_py39.py hl[4,8,12] *}
+
+ĐĐžĐŗĐ´Đ° Đ˛Ņ Đ˛ĐŋĐĩŅвŅĐĩ ĐžŅĐēŅĐžĐĩŅĐĩ URL (иĐģи ĐŊаĐļĐŧŅŅĐĩ ĐēĐŊĐžĐŋĐēŅ ÂĢExecuteÂģ в Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии), ĐąŅаŅСĐĩŅ ĐŋĐžĐŋŅĐžŅĐ¸Ņ Đ˛Đ˛ĐĩŅŅи иĐŧŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅ Đ¸ ĐŋаŅĐžĐģŅ:
+
+
+
+## ĐŅОвĐĩŅĐēа иĐŧĐĩĐŊи ĐŋĐžĐģŅСОваŅĐĩĐģŅ { #check-the-username }
+
+ĐĐžŅ ĐąĐžĐģĐĩĐĩ ĐŋĐžĐģĐŊŅĐš ĐŋŅиĐŧĐĩŅ.
+
+ĐŅĐŋĐžĐģŅСŅĐšŅĐĩ СавиŅиĐŧĐžŅŅŅ, ŅŅĐžĐąŅ ĐŋŅОвĐĩŅиŅŅ, ĐēĐžŅŅĐĩĐēŅĐŊŅ Đģи иĐŧŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅ Đ¸ ĐŋаŅĐžĐģŅ.
+
+ĐĐģŅ ŅŅĐžĐŗĐž иŅĐŋĐžĐģŅСŅĐšŅĐĩ ŅŅаĐŊдаŅŅĐŊŅĐš ĐŧОдŅĐģŅ Python `secrets` Đ´ĐģŅ ĐŋŅОвĐĩŅĐēи иĐŧĐĩĐŊи ĐŋĐžĐģŅСОваŅĐĩĐģŅ Đ¸ ĐŋаŅĐžĐģŅ.
+
+`secrets.compare_digest()` Đ´ĐžĐģĐļĐĩĐŊ ĐŋĐžĐģŅŅаŅŅ `bytes` иĐģи `str`, ĐēĐžŅĐžŅŅĐš ŅОдĐĩŅĐļĐ¸Ņ ŅĐžĐģŅĐēĐž ŅиĐŧвОĐģŅ ASCII (аĐŊĐŗĐģиКŅĐēиĐĩ ŅиĐŧвОĐģŅ). ĐŅĐž СĐŊаŅиŅ, ŅŅĐž ĐžĐŊ ĐŊĐĩ ĐąŅĐ´ĐĩŅ ŅайОŅаŅŅ Ņ ŅиĐŧвОĐģаĐŧи вŅОдĐĩ `ÃĄ`, ĐēаĐē в `SebastiÃĄn`.
+
+ЧŅĐžĐąŅ ŅŅĐž ОйŅайОŅаŅŅ, ŅĐŊаŅаĐģа ĐŋŅĐĩОйŅаСŅĐĩĐŧ `username` и `password` в `bytes`, СаĐēОдиŅОвав иŅ
в UTF-8.
+
+ĐаŅĐĩĐŧ ĐŧĐžĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ `secrets.compare_digest()`, ŅŅĐžĐąŅ ŅĐąĐĩдиŅŅŅŅ, ŅŅĐž `credentials.username` ŅавĐĩĐŊ `"stanleyjobson"`, а `credentials.password` â `"swordfish"`.
+
+{* ../../docs_src/security/tutorial007_an_py39.py hl[1,12:24] *}
+
+ĐŅĐž ĐąŅĐģĐž ĐąŅ ĐŋĐžŅ
ĐžĐļĐĩ ĐŊа:
+
+```Python
+if not (credentials.username == "stanleyjobson") or not (credentials.password == "swordfish"):
+ # ĐĐĩŅĐŊŅŅŅ ĐžŅийĐēŅ
+ ...
+```
+
+ĐĐž иŅĐŋĐžĐģŅСŅŅ `secrets.compare_digest()`, Đ˛Ņ ĐˇĐ°ŅиŅиŅĐĩ ĐēОд ĐžŅ Đ°ŅаĐē ŅиĐŋа ÂĢŅаКĐŧиĐŊĐŗĐžĐ˛Đ°Ņ Đ°ŅаĐēаÂģ (аŅаĐēа ĐŋĐž вŅĐĩĐŧĐĩĐŊи).
+
+### ĐĸаКĐŧиĐŊĐŗĐžĐ˛ŅĐĩ аŅаĐēи { #timing-attacks }
+
+ЧŅĐž ŅаĐēĐžĐĩ ÂĢŅаКĐŧиĐŊĐŗĐžĐ˛Đ°Ņ Đ°ŅаĐēаÂģ?
+
+ĐŅĐĩĐ´ŅŅавиĐŧ, ŅŅĐž СĐģĐžŅĐŧŅŅĐģĐĩĐŊĐŊиĐēи ĐŋŅŅаŅŅŅŅ ŅĐŗĐ°Đ´Đ°ŅŅ Đ¸ĐŧŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅ Đ¸ ĐŋаŅĐžĐģŅ.
+
+Đ ĐžĐŊи ĐžŅĐŋŅавĐģŅŅŅ ĐˇĐ°ĐŋŅĐžŅ Ņ Đ¸ĐŧĐĩĐŊĐĩĐŧ ĐŋĐžĐģŅСОваŅĐĩĐģŅ `johndoe` и ĐŋаŅĐžĐģĐĩĐŧ `love123`.
+
+ĐĸĐžĐŗĐ´Đ° Python-ĐēОд в ваŅĐĩĐŧ ĐŋŅиĐģĐžĐļĐĩĐŊии ĐąŅĐ´ĐĩŅ ŅĐēвиваĐģĐĩĐŊŅĐĩĐŊ ŅĐĩĐŧŅ-ŅĐž вŅОдĐĩ:
+
+```Python
+if "johndoe" == "stanleyjobson" and "love123" == "swordfish":
+ ...
+```
+
+ĐĐž в ĐŧĐžĐŧĐĩĐŊŅ, ĐēĐžĐŗĐ´Đ° Python ŅŅавĐŊĐ¸Ņ ĐŋĐĩŅвŅŅ `j` в `johndoe` Ņ ĐŋĐĩŅвОК `s` в `stanleyjobson`, ĐžĐŊ вĐĩŅĐŊŅŅ `False`, ĐŋĐžŅĐžĐŧŅ ŅŅĐž ŅĐļĐĩ ŅŅĐŊĐž, ŅŅĐž ŅŅŅĐžĐēи ĐŊĐĩ ŅОвĐŋадаŅŅ, ŅĐĩŅив, ŅŅĐž ÂĢĐŊĐĩŅ ŅĐŧŅŅĐģа ŅŅаŅиŅŅ ŅĐĩŅŅŅŅŅ ĐŊа ŅŅавĐŊĐĩĐŊиĐĩ ĐžŅŅаĐģŅĐŊŅŅ
ĐąŅĐēвÂģ. РваŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐžŅвĐĩŅĐ¸Ņ ÂĢĐĐĩвĐĩŅĐŊĐžĐĩ иĐŧŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅ Đ¸Đģи ĐŋаŅĐžĐģŅÂģ.
+
+ĐаŅĐĩĐŧ СĐģĐžŅĐŧŅŅĐģĐĩĐŊĐŊиĐēи ĐŋĐžĐŋŅОйŅŅŅ Đ¸ĐŧŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅ `stanleyjobsox` и ĐŋаŅĐžĐģŅ `love123`.
+
+Đ Đ˛Đ°Ņ ĐēОд ŅĐ´ĐĩĐģаĐĩŅ ŅŅĐž-ŅĐž вŅОдĐĩ:
+
+```Python
+if "stanleyjobsox" == "stanleyjobson" and "love123" == "swordfish":
+ ...
+```
+
+PythonŅ ĐŋŅидŅŅŅŅ ŅŅавĐŊиŅŅ Đ˛ĐĩŅŅ ĐžĐąŅиК ĐŋŅĐĩŅиĐēŅ `stanleyjobso` в `stanleyjobsox` и `stanleyjobson`, ĐŋŅĐĩĐļĐ´Đĩ ŅĐĩĐŧ ĐŋĐžĐŊŅŅŅ, ŅŅĐž ŅŅŅĐžĐēи ĐžŅĐģиŅаŅŅŅŅ. ĐĐžŅŅĐžĐŧŅ ĐŊа ĐžŅвĐĩŅ ÂĢĐĐĩвĐĩŅĐŊĐžĐĩ иĐŧŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅ Đ¸Đģи ĐŋаŅĐžĐģŅÂģ ŅКдŅŅ ĐŊа ĐŊĐĩŅĐēĐžĐģŅĐēĐž ĐŧиĐēŅĐžŅĐĩĐēŅĐŊĐ´ йОĐģŅŅĐĩ.
+
+#### ĐŅĐĩĐŧŅ ĐžŅвĐĩŅа ĐŋĐžĐŧĐžĐŗĐ°ĐĩŅ ĐˇĐģĐžŅĐŧŅŅĐģĐĩĐŊĐŊиĐēаĐŧ { #the-time-to-answer-helps-the-attackers }
+
+ĐаĐŧĐĩŅаŅ, ŅŅĐž ŅĐĩŅвĐĩŅ ĐŋŅиŅĐģаĐģ ÂĢĐĐĩвĐĩŅĐŊĐžĐĩ иĐŧŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅ Đ¸Đģи ĐŋаŅĐžĐģŅÂģ ĐŊа ĐŊĐĩŅĐēĐžĐģŅĐēĐž ĐŧиĐēŅĐžŅĐĩĐēŅĐŊĐ´ ĐŋОСĐļĐĩ, СĐģĐžŅĐŧŅŅĐģĐĩĐŊĐŊиĐēи ĐŋОКĐŧŅŅ, ŅŅĐž ĐēаĐēаŅ-ŅĐž ŅаŅŅŅ ĐąŅĐģа ŅĐŗĐ°Đ´Đ°ĐŊа â ĐŊаŅаĐģŅĐŊŅĐĩ ĐąŅĐēĐ˛Ņ Đ˛ĐĩŅĐŊŅ.
+
+ĐĸĐžĐŗĐ´Đ° ĐžĐŊи ĐŧĐžĐŗŅŅ ĐŋĐžĐŋŅОйОваŅŅ ŅĐŊОва, СĐŊаŅ, ŅŅĐž ĐŋŅавиĐģŅĐŊĐĩĐĩ ŅŅĐž-ŅĐž ĐąĐģиĐļĐĩ Đē `stanleyjobsox`, ŅĐĩĐŧ Đē `johndoe`.
+
+#### ÂĢĐŅĐžŅĐĩŅŅиОĐŊаĐģŅĐŊаŅÂģ аŅаĐēа { #a-professional-attack }
+
+ĐĐžĐŊĐĩŅĐŊĐž, СĐģĐžŅĐŧŅŅĐģĐĩĐŊĐŊиĐēи ĐŊĐĩ ĐąŅĐ´ŅŅ Đ´ĐĩĐģаŅŅ Đ˛ŅŅ ŅŅĐž вŅŅŅĐŊŅŅ â ĐžĐŊи ĐŊаĐŋиŅŅŅ ĐŋŅĐžĐŗŅаĐŧĐŧŅ, вОСĐŧĐžĐļĐŊĐž, Ņ ŅŅŅŅŅаĐŧи иĐģи ĐŧиĐģĐģиОĐŊаĐŧи ĐŋĐžĐŋŅŅĐžĐē в ŅĐĩĐēŅĐŊĐ´Ņ. Đ ĐąŅĐ´ŅŅ ĐŋОдйиŅаŅŅ ĐŋĐž ОдĐŊОК Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊОК вĐĩŅĐŊОК ĐąŅĐēвĐĩ Са ŅаС.
+
+ĐĸаĐē Са ĐŧиĐŊŅŅŅ Đ¸Đģи ŅаŅŅ ĐžĐŊи ŅĐŧĐžĐŗŅŅ ŅĐŗĐ°Đ´Đ°ŅŅ ĐŋŅавиĐģŅĐŊŅĐĩ иĐŧŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅ Đ¸ ĐŋаŅĐžĐģŅ â Ņ ÂĢĐŋĐžĐŧĐžŅŅŅÂģ ĐŊаŅĐĩĐŗĐž ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ â иŅĐŋĐžĐģŅСŅŅ ĐģиŅŅ Đ˛ŅĐĩĐŧŅ, СаŅŅаŅĐĩĐŊĐŊĐžĐĩ ĐŊа ĐžŅвĐĩŅ.
+
+#### ĐŅĐŋŅавĐģĐĩĐŊиĐĩ Ņ ĐŋĐžĐŧĐžŅŅŅ `secrets.compare_digest()` { #fix-it-with-secrets-compare-digest }
+
+ĐĐž в ĐŊаŅĐĩĐŧ ĐēОдĐĩ ĐŧŅ Đ¸ŅĐŋĐžĐģŅСŅĐĩĐŧ `secrets.compare_digest()`.
+
+ĐĐēŅаŅŅĐĩ: ŅŅавĐŊĐĩĐŊиĐĩ `stanleyjobsox` Ņ `stanleyjobson` СаКĐŧŅŅ ŅŅĐžĐģŅĐēĐž ĐļĐĩ вŅĐĩĐŧĐĩĐŊи, ŅĐēĐžĐģŅĐēĐž и ŅŅавĐŊĐĩĐŊиĐĩ `johndoe` Ņ `stanleyjobson`. ĐĸĐž ĐļĐĩ ĐžŅĐŊĐžŅиŅŅŅ Đ¸ Đē ĐŋаŅĐžĐģŅ.
+
+ĐĸаĐēиĐŧ ОйŅаСОĐŧ, иŅĐŋĐžĐģŅСŅŅ `secrets.compare_digest()` в ĐēОдĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиŅ, Đ˛Ņ ĐˇĐ°ŅиŅиŅĐĩ ĐĩĐŗĐž ĐžŅ Đ˛ŅĐĩĐŗĐž ŅŅĐžĐŗĐž ĐēĐģаŅŅа аŅаĐē ĐŊа ĐąĐĩСОĐŋаŅĐŊĐžŅŅŅ.
+
+### ĐОСвŅĐ°Ņ ĐžŅийĐēи { #return-the-error }
+
+ĐĐžŅĐģĐĩ ŅĐžĐŗĐž ĐēаĐē ОйĐŊаŅŅĐļĐĩĐŊĐž, ŅŅĐž ŅŅŅŅĐŊŅĐĩ даĐŊĐŊŅĐĩ ĐŊĐĩĐēĐžŅŅĐĩĐēŅĐŊŅ, вĐĩŅĐŊиŅĐĩ `HTTPException` ŅĐž ŅŅаŅŅŅ-ĐēОдОĐŧ ĐžŅвĐĩŅа 401 (ŅĐĩĐŧ ĐļĐĩ, ŅŅĐž и ĐŋŅи ĐžŅŅŅŅŅŅвии ŅŅŅŅĐŊŅŅ
даĐŊĐŊŅŅ
) и дОйавŅŅĐĩ HTTP-ĐˇĐ°ĐŗĐžĐģОвОĐē `WWW-Authenticate`, ŅŅĐžĐąŅ ĐąŅаŅСĐĩŅ ŅĐŊОва ĐŋĐžĐēаСаĐģ ĐžĐēĐŊĐž вŅ
Ода:
+
+{* ../../docs_src/security/tutorial007_an_py39.py hl[26:30] *}
diff --git a/docs/ru/docs/advanced/security/index.md b/docs/ru/docs/advanced/security/index.md
new file mode 100644
index 000000000..912e4812a
--- /dev/null
+++ b/docs/ru/docs/advanced/security/index.md
@@ -0,0 +1,19 @@
+# РаŅŅиŅĐĩĐŊĐŊĐ°Ņ ĐąĐĩСОĐŋаŅĐŊĐžŅŅŅ { #advanced-security }
+
+## ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ вОСĐŧĐžĐļĐŊĐžŅŅи { #additional-features }
+
+ĐŅŅŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ вОСĐŧĐžĐļĐŊĐžŅŅи Đ´ĐģŅ ŅайОŅŅ Ņ ĐąĐĩСОĐŋаŅĐŊĐžŅŅŅŅ ĐŋĐžĐŧиĐŧĐž ŅĐĩŅ
, ŅŅĐž ĐžĐŋиŅаĐŊŅ Đ˛ [ĐŖŅĐĩĐąĐŊиĐē â Đ ŅĐēОвОдŅŅвО ĐŋĐžĐģŅСОваŅĐĩĐģŅ: ĐĐĩСОĐŋаŅĐŊĐžŅŅŅ](../../tutorial/security/index.md){.internal-link target=_blank}.
+
+/// tip | ХОвĐĩŅ
+
+ĐĄĐģĐĩĐ´ŅŅŅиĐĩ ŅаСдĐĩĐģŅ **ĐŊĐĩ ОйŅСаŅĐĩĐģŅĐŊĐž ŅвĐģŅŅŅŅŅ ÂĢĐŋŅОдвиĐŊŅŅŅĐŧиÂģ**.
+
+РвОСĐŧĐžĐļĐŊĐž, ŅŅĐž ŅĐĩŅĐĩĐŊиĐĩ Đ´ĐģŅ Đ˛Đ°ŅĐĩĐŗĐž ваŅиаĐŊŅа иŅĐŋĐžĐģŅСОваĐŊĐ¸Ņ ĐŊаŅ
ОдиŅŅŅ Đ˛ ОдĐŊĐžĐŧ иС ĐŊиŅ
.
+
+///
+
+## ĐĄĐŊаŅаĐģа ĐŋŅĐžŅиŅаКŅĐĩ ŅŅĐēОвОдŅŅвО { #read-the-tutorial-first }
+
+Đ ŅĐģĐĩĐ´ŅŅŅиŅ
ŅаСдĐĩĐģаŅ
ĐŋŅĐĩĐ´ĐŋĐžĐģĐ°ĐŗĐ°ĐĩŅŅŅ, ŅŅĐž Đ˛Ņ ŅĐļĐĩ ĐŋŅĐžŅиŅаĐģи ĐžŅĐŊОвĐŊОК [ĐŖŅĐĩĐąĐŊиĐē â Đ ŅĐēОвОдŅŅвО ĐŋĐžĐģŅСОваŅĐĩĐģŅ: ĐĐĩСОĐŋаŅĐŊĐžŅŅŅ](../../tutorial/security/index.md){.internal-link target=_blank}.
+
+ĐŅĐĩ ĐžĐŊи ĐžŅĐŊОваĐŊŅ ĐŊа ŅĐĩŅ
ĐļĐĩ ĐēĐžĐŊŅĐĩĐŋŅиŅŅ
, ĐŊĐž ĐŋŅĐĩĐ´ĐžŅŅавĐģŅŅŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ вОСĐŧĐžĐļĐŊĐžŅŅи.
diff --git a/docs/ru/docs/advanced/security/oauth2-scopes.md b/docs/ru/docs/advanced/security/oauth2-scopes.md
new file mode 100644
index 000000000..8788df199
--- /dev/null
+++ b/docs/ru/docs/advanced/security/oauth2-scopes.md
@@ -0,0 +1,274 @@
+# OAuth2 scopes { #oauth2-scopes }
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ OAuth2 scopes (scope - ОйĐģаŅŅŅ, ŅаĐŧĐēи) ĐŊаĐŋŅŅĐŧŅŅ Ņ **FastAPI** â ĐžĐŊи иĐŊŅĐĩĐŗŅиŅОваĐŊŅ Đ¸ ŅайОŅаŅŅ ĐąĐĩŅŅОвĐŊĐž.
+
+ĐŅĐž ĐŋОСвОĐģĐ¸Ņ Đ˛Đ°Đŧ иĐŧĐĩŅŅ ĐąĐžĐģĐĩĐĩ Đ´ĐĩŅаĐģŅĐŊŅŅ ŅиŅŅĐĩĐŧŅ ŅаСŅĐĩŅĐĩĐŊиК ĐŋĐž ŅŅаĐŊдаŅŅŅ OAuth2, иĐŊŅĐĩĐŗŅиŅОваĐŊĐŊŅŅ Đ˛ ваŅĐĩ OpenAPIâĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ (и Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ API).
+
+OAuth2 ŅĐž scopes â ŅŅĐž ĐŧĐĩŅ
аĐŊиСĐŧ, ĐēĐžŅĐžŅŅĐš иŅĐŋĐžĐģŅСŅŅŅ ĐŧĐŊĐžĐŗĐ¸Đĩ ĐēŅŅĐŋĐŊŅĐĩ ĐŋŅОваКдĐĩŅŅ Đ°ŅŅĐĩĐŊŅиŅиĐēаŅии: Facebook, Google, GitHub, Microsoft, X (Twitter) и Ņ.Đ´. ĐĐŊи ĐŋŅиĐŧĐĩĐŊŅŅŅ ĐĩĐŗĐž, ŅŅĐžĐąŅ ĐŋŅĐĩĐ´ĐžŅŅавĐģŅŅŅ ĐēĐžĐŊĐēŅĐĩŅĐŊŅĐĩ ŅаСŅĐĩŅĐĩĐŊĐ¸Ņ ĐŋĐžĐģŅСОваŅĐĩĐģŅĐŧ и ĐŋŅиĐģĐžĐļĐĩĐŊиŅĐŧ.
+
+ĐаĐļĐ´ŅĐš ŅаС, ĐēĐžĐŗĐ´Đ° Đ˛Ņ ÂĢвŅ
ОдиŅĐĩ ŅĐĩŅĐĩСÂģ Facebook, Google, GitHub, Microsoft, X (Twitter), ŅŅĐž ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ иŅĐŋĐžĐģŅСŅĐĩŅ OAuth2 ŅĐž scopes.
+
+Đ ŅŅĐžĐŧ ŅаСдĐĩĐģĐĩ Đ˛Ņ ŅвидиŅĐĩ, ĐēаĐē ŅĐŋŅавĐģŅŅŅ Đ°ŅŅĐĩĐŊŅиŅиĐēаŅиĐĩĐš и авŅĐžŅиСаŅиĐĩĐš Ņ ŅĐĩĐŧи ĐļĐĩ OAuth2 scopes в ваŅĐĩĐŧ ĐŋŅиĐģĐžĐļĐĩĐŊии ĐŊа **FastAPI**.
+
+/// warning | ĐŅĐĩĐ´ŅĐŋŅĐĩĐļĐ´ĐĩĐŊиĐĩ
+
+ĐŅĐž йОĐģĐĩĐĩ-ĐŧĐĩĐŊĐĩĐĩ ĐŋŅОдвиĐŊŅŅŅĐš ŅаСдĐĩĐģ. ĐŅĐģи Đ˛Ņ ŅĐžĐģŅĐēĐž ĐŊаŅиĐŊаĐĩŅĐĩ, ĐŧĐžĐļĐĩŅĐĩ ĐŋŅĐžĐŋŅŅŅиŅŅ ĐĩĐŗĐž.
+
+ĐаĐŧ ĐŊĐĩ ОйŅСаŅĐĩĐģŅĐŊĐž ĐŊŅĐļĐŊŅ OAuth2 scopes â аŅŅĐĩĐŊŅиŅиĐēаŅĐ¸Ņ Đ¸ авŅĐžŅиСаŅĐ¸Ņ ĐŧĐžĐļĐŊĐž ŅĐĩаĐģиСОваŅŅ ĐģŅĐąŅĐŧ ĐŊŅĐļĐŊŅĐŧ ваĐŧ ŅĐŋĐžŅОйОĐŧ.
+
+ĐĐž OAuth2 ŅĐž scopes ĐŧĐžĐļĐŊĐž ĐēŅаŅивО иĐŊŅĐĩĐŗŅиŅОваŅŅ Đ˛ Đ˛Đ°Ņ API (ŅĐĩŅĐĩС OpenAPI) и Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ API.
+
+ĐĸаĐē иĐģи иĐŊаŅĐĩ, Đ˛Ņ Đ˛ŅĐĩ ŅавĐŊĐž ĐąŅĐ´ĐĩŅĐĩ ĐŋŅиĐŧĐĩĐŊŅŅŅ ŅŅи scopes иĐģи ĐēаĐēиĐĩ-ŅĐž Đ´ŅŅĐŗĐ¸Đĩ ŅŅĐĩйОваĐŊĐ¸Ņ ĐąĐĩСОĐŋаŅĐŊĐžŅŅи/авŅĐžŅиСаŅии, ĐēаĐē ваĐŧ ĐŊŅĐļĐŊĐž, в ваŅĐĩĐŧ ĐēОдĐĩ.
+
+ĐĐž ĐŧĐŊĐžĐŗĐ¸Ņ
ŅĐģŅŅаŅŅ
OAuth2 ŅĐž scopes ĐŧĐžĐļĐĩŅ ĐąŅŅŅ Đ¸ĐˇĐąŅŅĐžŅĐŊŅĐŧ.
+
+ĐĐž ĐĩŅĐģи Đ˛Ņ ĐˇĐŊаĐĩŅĐĩ, ŅŅĐž ŅŅĐž ĐŊŅĐļĐŊĐž, иĐģи ваĐŧ ĐŋŅĐžŅŅĐž иĐŊŅĐĩŅĐĩŅĐŊĐž â ĐŋŅОдОĐģĐļаКŅĐĩ ŅŅĐĩĐŊиĐĩ.
+
+///
+
+## OAuth2 scopes и OpenAPI { #oauth2-scopes-and-openapi }
+
+ĐĄĐŋĐĩŅиŅиĐēаŅĐ¸Ņ OAuth2 ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐĩŅ ÂĢscopesÂģ ĐēаĐē ŅĐŋиŅĐžĐē ŅŅŅĐžĐē, ŅаСдĐĩĐģŅĐŊĐŊŅŅ
ĐŋŅОйĐĩĐģаĐŧи.
+
+ХОдĐĩŅĐļиĐŧĐžĐĩ ĐēаĐļдОК ŅаĐēОК ŅŅŅĐžĐēи ĐŧĐžĐļĐĩŅ Đ¸ĐŧĐĩŅŅ ĐģŅйОК ŅĐžŅĐŧаŅ, ĐŊĐž ĐŊĐĩ Đ´ĐžĐģĐļĐŊĐž ŅОдĐĩŅĐļаŅŅ ĐŋŅОйĐĩĐģОв.
+
+ĐŅи scopes ĐŋŅĐĩĐ´ŅŅавĐģŅŅŅ ÂĢŅаСŅĐĩŅĐĩĐŊиŅÂģ.
+
+Đ OpenAPI (ĐŊаĐŋŅиĐŧĐĩŅ, в Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии API) ĐŧĐžĐļĐŊĐž ĐžĐŋŅĐĩĐ´ĐĩĐģиŅŅ ÂĢŅŅ
ĐĩĐŧŅ ĐąĐĩСОĐŋаŅĐŊĐžŅŅиÂģ (security schemes).
+
+ĐĐžĐŗĐ´Đ° ОдĐŊа иС ŅаĐēиŅ
ŅŅ
ĐĩĐŧ ĐąĐĩСОĐŋаŅĐŊĐžŅŅи иŅĐŋĐžĐģŅСŅĐĩŅ OAuth2, Đ˛Ņ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ ОйŅŅвĐģŅŅŅ Đ¸ иŅĐŋĐžĐģŅСОваŅŅ scopes.
+
+ĐаĐļĐ´ŅĐš ÂĢscopeÂģ â ŅŅĐž ĐŋŅĐžŅŅĐž ŅŅŅĐžĐēа (ĐąĐĩС ĐŋŅОйĐĩĐģОв).
+
+ĐĐąŅŅĐŊĐž ĐžĐŊи иŅĐŋĐžĐģŅСŅŅŅŅŅ Đ´ĐģŅ ĐžĐąŅŅвĐģĐĩĐŊĐ¸Ņ ĐēĐžĐŊĐēŅĐĩŅĐŊŅŅ
ŅаСŅĐĩŅĐĩĐŊиК ĐąĐĩСОĐŋаŅĐŊĐžŅŅи, ĐŊаĐŋŅиĐŧĐĩŅ:
+
+- `users:read` иĐģи `users:write` â ŅаŅĐŋŅĐžŅŅŅаĐŊŅĐŊĐŊŅĐĩ ĐŋŅиĐŧĐĩŅŅ.
+- `instagram_basic` иŅĐŋĐžĐģŅСŅĐĩŅŅŅ Facebook / Instagram.
+- `https://www.googleapis.com/auth/drive` иŅĐŋĐžĐģŅСŅĐĩŅŅŅ Google.
+
+/// info | ĐĐŊŅĐžŅĐŧаŅиŅ
+
+Đ OAuth2 ÂĢscopeÂģ â ŅŅĐž ĐŋŅĐžŅŅĐž ŅŅŅĐžĐēа, ОйŅŅвĐģŅŅŅĐ°Ņ ŅŅĐĩĐąŅĐĩĐŧĐžĐĩ ĐēĐžĐŊĐēŅĐĩŅĐŊĐžĐĩ ŅаСŅĐĩŅĐĩĐŊиĐĩ.
+
+ĐĐĩваĐļĐŊĐž, ĐĩŅŅŅ Đģи ŅаĐŧ Đ´ŅŅĐŗĐ¸Đĩ ŅиĐŧвОĐģŅ, ŅаĐēиĐĩ ĐēаĐē `:`, иĐģи ŅŅĐž URL.
+
+ĐŅи Đ´ĐĩŅаĐģи СавиŅŅŅ ĐžŅ ŅĐĩаĐģиСаŅии.
+
+ĐĐģŅ OAuth2 ŅŅĐž ĐŋŅĐžŅŅĐž ŅŅŅĐžĐēи.
+
+///
+
+## ĐĐˇĐŗĐģŅĐ´ иСдаĐģĐĩĐēа { #global-view }
+
+ĐĄĐŊаŅаĐģа ĐąŅŅŅŅĐž ĐŋĐžŅĐŧĐžŅŅиĐŧ, ŅŅĐž иСĐŧĐĩĐŊиĐģĐžŅŅ ĐŋĐž ŅŅавĐŊĐĩĐŊĐ¸Ņ Ņ ĐŋŅиĐŧĐĩŅаĐŧи иС ĐžŅĐŊОвĐŊĐžĐŗĐž ŅаСдĐĩĐģа **ĐŖŅĐĩĐąĐŊиĐē - Đ ŅĐēОвОдŅŅвО ĐŋĐžĐģŅСОваŅĐĩĐģŅ** â [OAuth2 Ņ ĐŋаŅĐžĐģĐĩĐŧ (и Ņ
ĐĩŅиŅОваĐŊиĐĩĐŧ), Bearer Ņ JWT-ŅĐžĐēĐĩĐŊаĐŧи](../../tutorial/security/oauth2-jwt.md){.internal-link target=_blank}. ĐĸĐĩĐŋĐĩŅŅ â Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩĐŧ OAuth2 scopes:
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[5,9,13,47,65,106,108:116,122:126,130:136,141,157] *}
+
+ĐĸĐĩĐŋĐĩŅŅ ŅаŅŅĐŧĐžŅŅиĐŧ ŅŅи иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ ŅĐ°Đŗ Са ŅĐ°ĐŗĐžĐŧ.
+
+## OAuth2 ŅŅ
ĐĩĐŧа ĐąĐĩСОĐŋаŅĐŊĐžŅŅи { #oauth2-security-scheme }
+
+ĐĐĩŅвОĐĩ иСĐŧĐĩĐŊĐĩĐŊиĐĩ â ĐŧŅ ĐžĐąŅŅвĐģŅĐĩĐŧ ŅŅ
ĐĩĐŧŅ ĐąĐĩСОĐŋаŅĐŊĐžŅŅи OAuth2 Ņ Đ´Đ˛ŅĐŧŅ Đ´ĐžŅŅŅĐŋĐŊŅĐŧи scopes: `me` и `items`.
+
+ĐаŅаĐŧĐĩŅŅ `scopes` ĐŋĐžĐģŅŅаĐĩŅ `dict`, ĐŗĐ´Đĩ ĐēаĐļĐ´ŅĐš scope â ŅŅĐž ĐēĐģŅŅ, а ĐžĐŋиŅаĐŊиĐĩ â СĐŊаŅĐĩĐŊиĐĩ:
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[63:66] *}
+
+ĐĸаĐē ĐēаĐē ŅĐĩĐŋĐĩŅŅ ĐŧŅ ĐžĐąŅŅвĐģŅĐĩĐŧ ŅŅи scopes, ĐžĐŊи ĐŋĐžŅвŅŅŅŅ Đ˛ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии API ĐŋŅи вŅ
ОдĐĩ/авŅĐžŅиСаŅии.
+
+Đ Đ˛Ņ ŅĐŧĐžĐļĐĩŅĐĩ вŅĐąŅаŅŅ, ĐēаĐēиĐĩ scopes Đ˛Ņ Ņ
ĐžŅиŅĐĩ вŅдаŅŅ Đ´ĐžŅŅŅĐŋ: `me` и `items`.
+
+ĐŅĐž ŅĐžŅ ĐļĐĩ ĐŧĐĩŅ
аĐŊиСĐŧ, ĐēĐžĐŗĐ´Đ° Đ˛Ņ Đ´Đ°ŅŅĐĩ ŅаСŅĐĩŅĐĩĐŊĐ¸Ņ ĐŋŅи вŅ
ОдĐĩ ŅĐĩŅĐĩС Facebook, Google, GitHub и Ņ.Đ´.:
+
+
+
+## JWT-ŅĐžĐēĐĩĐŊŅ ŅĐž scopes { #jwt-token-with-scopes }
+
+ĐĸĐĩĐŋĐĩŅŅ Đ¸ĐˇĐŧĐĩĐŊиŅĐĩ ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи, вŅдаŅŅŅŅ ŅĐžĐēĐĩĐŊ, ŅŅĐžĐąŅ Đ˛ĐžĐˇĐ˛ŅаŅаŅŅ ĐˇĐ°ĐŋŅĐžŅĐĩĐŊĐŊŅĐĩ scopes.
+
+ĐŅ Đ˛ŅŅ ĐĩŅŅ Đ¸ŅĐŋĐžĐģŅСŅĐĩĐŧ ŅĐžŅ ĐļĐĩ `OAuth2PasswordRequestForm`. ĐĐŊ вĐēĐģŅŅаĐĩŅ ŅвОКŅŅвО `scopes` Ņ `list` иС `str` â ĐēаĐļĐ´ŅĐš scope, ĐŋĐžĐģŅŅĐĩĐŊĐŊŅĐš в СаĐŋŅĐžŅĐĩ.
+
+Đ ĐŧŅ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩĐŧ scopes ĐēаĐē ŅаŅŅŅ JWTâŅĐžĐēĐĩĐŊа.
+
+/// danger | ĐĐŋаŅĐŊĐžŅŅŅ
+
+ĐĐģŅ ĐŋŅĐžŅŅĐžŅŅ ĐˇĐ´ĐĩŅŅ ĐŧŅ ĐŋŅĐžŅŅĐž дОйавĐģŅĐĩĐŧ ĐŋĐžĐģŅŅĐĩĐŊĐŊŅĐĩ scopes ĐŋŅŅĐŧĐž в ŅĐžĐēĐĩĐŊ.
+
+ĐĐž в ваŅĐĩĐŧ ĐŋŅиĐģĐžĐļĐĩĐŊии, в ŅĐĩĐģŅŅ
ĐąĐĩСОĐŋаŅĐŊĐžŅŅи, ŅĐģĐĩĐ´ŅĐĩŅ ŅĐąĐĩдиŅŅŅŅ, ŅŅĐž Đ˛Ņ Đ´ĐžĐąĐ°Đ˛ĐģŅĐĩŅĐĩ ŅĐžĐģŅĐēĐž ŅĐĩ scopes, ĐēĐžŅĐžŅŅĐĩ ĐŋĐžĐģŅСОваŅĐĩĐģŅ Đ´ĐĩĐšŅŅвиŅĐĩĐģŅĐŊĐž ĐŧĐžĐļĐĩŅ Đ¸ĐŧĐĩŅŅ, иĐģи ŅĐĩ, ĐēĐžŅĐžŅŅĐĩ Đ˛Ņ ĐˇĐ°ŅаĐŊĐĩĐĩ ĐžĐŋŅĐĩĐ´ĐĩĐģиĐģи.
+
+///
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[157] *}
+
+## ĐĐąŅŅвĐģĐĩĐŊиĐĩ scopes в *ОйŅайОŅŅиĐēаŅ
ĐŋŅŅĐĩĐš* и СавиŅиĐŧĐžŅŅŅŅ
{ #declare-scopes-in-path-operations-and-dependencies }
+
+ĐĸĐĩĐŋĐĩŅŅ ĐžĐąŅŅвиĐŧ, ŅŅĐž ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи Đ´ĐģŅ `/users/me/items/` ŅŅĐĩĐąŅĐĩŅ scope `items`.
+
+ĐĐģŅ ŅŅĐžĐŗĐž иĐŧĐŋĐžŅŅиŅŅĐĩĐŧ и иŅĐŋĐžĐģŅСŅĐĩĐŧ `Security` иС `fastapi`.
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ `Security` Đ´ĐģŅ ĐžĐąŅŅвĐģĐĩĐŊĐ¸Ņ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅĐĩĐš (ĐēаĐē `Depends`), ĐŊĐž `Security` ŅаĐēĐļĐĩ ĐŋŅиĐŊиĐŧаĐĩŅ ĐŋаŅаĐŧĐĩŅŅ `scopes` ŅĐž ŅĐŋиŅĐēĐžĐŧ scopes (ŅŅŅĐžĐē).
+
+Đ ŅŅĐžĐŧ ŅĐģŅŅаĐĩ ĐŧŅ ĐŋĐĩŅĐĩдаŅĐŧ ŅŅĐŊĐēŅиŅâСавиŅиĐŧĐžŅŅŅ `get_current_active_user` в `Security` (ŅĐžŅĐŊĐž ŅаĐē ĐļĐĩ, ĐēаĐē ŅĐ´ĐĩĐģаĐģи ĐąŅ Ņ `Depends`).
+
+ĐĐž ĐŧŅ ŅаĐēĐļĐĩ ĐŋĐĩŅĐĩдаŅĐŧ `list` scopes â в даĐŊĐŊĐžĐŧ ŅĐģŅŅаĐĩ ŅĐžĐģŅĐēĐž ОдиĐŊ scope: `items` (иŅ
ĐŧĐžĐŗĐģĐž ĐąŅŅŅ ĐąĐžĐģŅŅĐĩ).
+
+Đ ŅŅĐŊĐēŅиŅâСавиŅиĐŧĐžŅŅŅ `get_current_active_user` ŅĐžĐļĐĩ ĐŧĐžĐļĐĩŅ ĐžĐąŅŅвĐģŅŅŅ ĐŋОдСавиŅиĐŧĐžŅŅи ĐŊĐĩ ŅĐžĐģŅĐēĐž ŅĐĩŅĐĩС `Depends`, ĐŊĐž и ŅĐĩŅĐĩС `Security`, ОйŅŅвĐģŅŅ ŅĐ˛ĐžŅ ĐŋОдСавиŅиĐŧĐžŅŅŅ (`get_current_user`) и Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ŅŅĐĩйОваĐŊĐ¸Ņ ĐŋĐž scopes.
+
+РдаĐŊĐŊĐžĐŧ ŅĐģŅŅаĐĩ ŅŅĐĩĐąŅĐĩŅŅŅ scope `me` (иŅ
ŅаĐēĐļĐĩ ĐŧĐžĐŗĐģĐž ĐąŅŅŅ ĐąĐžĐģŅŅĐĩ ОдĐŊĐžĐŗĐž).
+
+/// note | ĐŅиĐŧĐĩŅаĐŊиĐĩ
+
+ĐаĐŧ ĐŊĐĩ ОйŅСаŅĐĩĐģŅĐŊĐž дОйавĐģŅŅŅ ŅаСĐŊŅĐĩ scopes в ŅаСĐŊŅŅ
ĐŧĐĩŅŅаŅ
.
+
+ĐŅ Đ´ĐĩĐģаĐĩĐŧ ŅŅĐž СдĐĩŅŅ, ŅŅĐžĐąŅ ĐŋĐžĐēаСаŅŅ, ĐēаĐē **FastAPI** ОйŅайаŅŅваĐĩŅ scopes, ОйŅŅвĐģĐĩĐŊĐŊŅĐĩ ĐŊа ŅаСĐŊŅŅ
ŅŅОвĐŊŅŅ
.
+
+///
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *}
+
+/// info | ĐĸĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ Đ´ĐĩŅаĐģи
+
+`Security` ĐŊа ŅаĐŧĐžĐŧ Đ´ĐĩĐģĐĩ ŅвĐģŅĐĩŅŅŅ ĐŋОдĐēĐģаŅŅĐžĐŧ `Depends` и иĐŧĐĩĐĩŅ Đ˛ŅĐĩĐŗĐž ОдиĐŊ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐš ĐŋаŅаĐŧĐĩŅŅ, ĐēĐžŅĐžŅŅĐš ĐŧŅ ŅаŅŅĐŧĐžŅŅиĐŧ ĐŋОСĐļĐĩ.
+
+ĐĐž иŅĐŋĐžĐģŅСŅŅ `Security` вĐŧĐĩŅŅĐž `Depends`, **FastAPI** ĐąŅĐ´ĐĩŅ ĐˇĐŊаŅŅ, ŅŅĐž ĐŧĐžĐļĐŊĐž ОйŅŅвĐģŅŅŅ security scopes, иŅĐŋĐžĐģŅСОваŅŅ Đ¸Ņ
вĐŊŅŅŅи и Đ´ĐžĐēŅĐŧĐĩĐŊŅиŅОваŅŅ API в OpenAPI.
+
+ĐĐ´ĐŊаĐēĐž ĐēĐžĐŗĐ´Đ° Đ˛Ņ Đ¸ĐŧĐŋĐžŅŅиŅŅĐĩŅĐĩ `Query`, `Path`, `Depends`, `Security` и Đ´ŅŅĐŗĐ¸Đĩ иС `fastapi`, ŅŅĐž ĐŊа ŅаĐŧĐžĐŧ Đ´ĐĩĐģĐĩ ŅŅĐŊĐēŅии, вОСвŅаŅаŅŅиĐĩ ŅĐŋĐĩŅиаĐģŅĐŊŅĐĩ ĐēĐģаŅŅŅ.
+
+///
+
+## ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ `SecurityScopes` { #use-securityscopes }
+
+ĐĸĐĩĐŋĐĩŅŅ ĐžĐąĐŊОвиĐŧ СавиŅиĐŧĐžŅŅŅ `get_current_user`.
+
+ĐĐŧĐĩĐŊĐŊĐž ĐĩŅ Đ¸ŅĐŋĐžĐģŅСŅŅŅ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅи вŅŅĐĩ.
+
+ĐĐ´ĐĩŅŅ ĐŧŅ Đ¸ŅĐŋĐžĐģŅСŅĐĩĐŧ ŅŅ ĐļĐĩ ŅŅ
ĐĩĐŧŅ OAuth2, ŅОСдаĐŊĐŊŅŅ ŅаĐŊĐĩĐĩ, ОйŅŅвĐģŅŅ ĐĩŅ ĐēаĐē СавиŅиĐŧĐžŅŅŅ: `oauth2_scheme`.
+
+ĐĐžŅĐēĐžĐģŅĐēŅ Ņ ŅŅОК ŅŅĐŊĐēŅииâСавиŅиĐŧĐžŅŅи ĐŊĐĩŅ ŅОйŅŅвĐĩĐŊĐŊŅŅ
ŅŅĐĩйОваĐŊиК ĐŋĐž scopes, ĐŧŅ ĐŧĐžĐļĐĩĐŧ иŅĐŋĐžĐģŅСОваŅŅ `Depends` Ņ `oauth2_scheme` â ĐŊаĐŧ ĐŊĐĩ ĐŊŅĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ `Security`, ĐĩŅĐģи ĐŊĐĩ ŅŅĐĩĐąŅĐĩŅŅŅ ŅĐēаСŅваŅŅ security scopes.
+
+ĐŅ ŅаĐēĐļĐĩ ОйŅŅвĐģŅĐĩĐŧ ŅĐŋĐĩŅиаĐģŅĐŊŅĐš ĐŋаŅаĐŧĐĩŅŅ ŅиĐŋа `SecurityScopes`, иĐŧĐŋĐžŅŅиŅОваĐŊĐŊŅĐš иС `fastapi.security`.
+
+ĐĐģаŅŅ `SecurityScopes` ĐŋĐžŅ
ĐžĐļ ĐŊа `Request` (ŅĐĩŅĐĩС `Request` ĐŧŅ ĐŋĐžĐģŅŅаĐģи ŅаĐŧ ОйŅĐĩĐēŅ ĐˇĐ°ĐŋŅĐžŅа).
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[9,106] *}
+
+## ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ `scopes` { #use-the-scopes }
+
+ĐаŅаĐŧĐĩŅŅ `security_scopes` ĐąŅĐ´ĐĩŅ ŅиĐŋа `SecurityScopes`.
+
+ĐŖ ĐŊĐĩĐŗĐž ĐĩŅŅŅ ŅвОКŅŅвО `scopes` ŅĐž ŅĐŋиŅĐēĐžĐŧ, ŅОдĐĩŅĐļаŅиĐŧ вŅĐĩ scopes, ŅŅĐĩĐąŅĐĩĐŧŅĐĩ иĐŧ ŅаĐŧиĐŧ и вŅĐĩĐŧи СавиŅиĐŧĐžŅŅŅĐŧи, иŅĐŋĐžĐģŅСŅŅŅиĐŧи ĐĩĐŗĐž ĐēаĐē ĐŋОдСавиŅиĐŧĐžŅŅŅ. ĐĸĐž ĐĩŅŅŅ Đ˛ŅĐĩĐŧи ÂĢСавиŅŅŅиĐŧиÂģâĻ ŅŅĐž ĐŧĐžĐļĐĩŅ ĐˇĐ˛ŅŅаŅŅ ĐˇĐ°ĐŋŅŅаĐŊĐŊĐž, ĐŊиĐļĐĩ ĐĩŅŅŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊĐžĐĩ ОйŅŅŅĐŊĐĩĐŊиĐĩ.
+
+ĐĐąŅĐĩĐēŅ `security_scopes` (ĐēĐģаŅŅ `SecurityScopes`) ŅаĐēĐļĐĩ ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ Đ°ŅŅийŅŅ `scope_str` â ŅŅĐž ОдĐŊа ŅŅŅĐžĐēа Ņ ŅŅиĐŧи scopes, ŅаСдĐĩĐģŅĐŊĐŊŅĐŧи ĐŋŅОйĐĩĐģаĐŧи (ĐŧŅ ĐąŅĐ´ĐĩĐŧ ĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ).
+
+ĐŅ ŅОСдаŅĐŧ `HTTPException`, ĐēĐžŅĐžŅŅĐš ĐŧĐžĐļĐĩĐŧ ĐŋĐĩŅĐĩиŅĐŋĐžĐģŅСОваŅŅ (`raise`) в ĐŊĐĩŅĐēĐžĐģŅĐēиŅ
ĐŧĐĩŅŅаŅ
.
+
+Đ ŅŅĐžĐŧ иŅĐēĐģŅŅĐĩĐŊии ĐŧŅ Đ˛ĐēĐģŅŅаĐĩĐŧ ŅŅĐĩĐąŅĐĩĐŧŅĐĩ scopes (ĐĩŅĐģи ĐĩŅŅŅ) в видĐĩ ŅŅŅĐžĐēи, ŅаСдĐĩĐģŅĐŊĐŊОК ĐŋŅОйĐĩĐģаĐŧи (иŅĐŋĐžĐģŅСŅŅ `scope_str`). ĐŅŅ ŅŅŅĐžĐēŅ ŅĐž scopes ĐŧŅ ĐŋĐžĐŧĐĩŅаĐĩĐŧ в HTTPâĐˇĐ°ĐŗĐžĐģОвОĐē `WWW-Authenticate` (ŅŅĐž ŅаŅŅŅ ŅĐŋĐĩŅиŅиĐēаŅии).
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[106,108:116] *}
+
+## ĐŅОвĐĩŅĐēа `username` и ŅĐžŅĐŧаŅа даĐŊĐŊŅŅ
{ #verify-the-username-and-data-shape }
+
+ĐŅ ĐŋŅОвĐĩŅŅĐĩĐŧ, ŅŅĐž ĐŋĐžĐģŅŅиĐģи `username`, и иСвĐģĐĩĐēаĐĩĐŧ scopes.
+
+ĐаŅĐĩĐŧ ваĐģидиŅŅĐĩĐŧ ŅŅи даĐŊĐŊŅĐĩ Ņ ĐŋĐžĐŧĐžŅŅŅ PydanticâĐŧОдĐĩĐģи (ĐŋĐĩŅĐĩŅ
ваŅŅĐ˛Đ°Ņ Đ¸ŅĐēĐģŅŅĐĩĐŊиĐĩ `ValidationError`), и ĐĩŅĐģи вОСĐŊиĐēаĐĩŅ ĐžŅийĐēа ĐŋŅи ŅŅĐĩĐŊии JWTâŅĐžĐēĐĩĐŊа иĐģи ĐŋŅи ваĐģидаŅии даĐŊĐŊŅŅ
Ņ Pydantic, ĐŧŅ Đ˛ŅСŅваĐĩĐŧ `HTTPException`, ŅОСдаĐŊĐŊĐžĐĩ ŅаĐŊĐĩĐĩ.
+
+ĐĐģŅ ŅŅĐžĐŗĐž ĐŧŅ ĐžĐąĐŊОвĐģŅĐĩĐŧ PydanticâĐŧОдĐĩĐģŅ `TokenData`, дОйавĐģŅŅ ĐŊОвОĐĩ ŅвОКŅŅвО `scopes`.
+
+ĐаĐģидиŅŅŅ Đ´Đ°ĐŊĐŊŅĐĩ Ņ ĐŋĐžĐŧĐžŅŅŅ Pydantic, ĐŧŅ ĐŧĐžĐļĐĩĐŧ ŅĐ´ĐžŅŅОвĐĩŅиŅŅŅŅ, ŅŅĐž Ņ ĐŊаŅ, ĐŊаĐŋŅиĐŧĐĩŅ, иĐŧĐĩĐŊĐŊĐž `list` иС `str` ŅĐž scopes и `str` Ņ `username`.
+
+Đ ĐŊĐĩ, ŅĐēаĐļĐĩĐŧ, `dict` иĐģи ŅŅĐžâŅĐž ĐĩŅŅ â вĐĩĐ´Ņ ŅŅĐž ĐŧĐžĐŗĐģĐž ĐąŅ ĐŗĐ´ĐĩâŅĐž ĐŋОСĐļĐĩ ŅĐģĐžĐŧаŅŅ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ и ŅОСдаŅŅ ŅиŅĐē Đ´ĐģŅ ĐąĐĩСОĐŋаŅĐŊĐžŅŅи.
+
+ĐŅ ŅаĐēĐļĐĩ ĐŋŅОвĐĩŅŅĐĩĐŧ, ŅŅĐž ŅŅŅĐĩŅŅвŅĐĩŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅ Ņ ŅаĐēиĐŧ иĐŧĐĩĐŊĐĩĐŧ, и ĐĩŅĐģи ĐŊĐĩŅ â вŅСŅваĐĩĐŧ ŅĐž ĐļĐĩ иŅĐēĐģŅŅĐĩĐŊиĐĩ, ŅОСдаĐŊĐŊĐžĐĩ ŅаĐŊĐĩĐĩ.
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[47,117:129] *}
+
+## ĐŅОвĐĩŅĐēа `scopes` { #verify-the-scopes }
+
+ĐĸĐĩĐŋĐĩŅŅ ĐŋŅОвĐĩŅŅĐĩĐŧ, ŅŅĐž вŅĐĩ ŅŅĐĩĐąŅĐĩĐŧŅĐĩ scopes â ŅŅОК СавиŅиĐŧĐžŅŅŅŅ Đ¸ вŅĐĩĐŧи СавиŅŅŅиĐŧи (вĐēĐģŅŅĐ°Ņ ĐžĐŋĐĩŅаŅии ĐŋŅŅи) â ĐŋŅиŅŅŅŅŅвŅŅŅ ŅŅĐĩди scopes, ĐŋŅĐĩĐ´ĐžŅŅавĐģĐĩĐŊĐŊŅŅ
в ĐŋĐžĐģŅŅĐĩĐŊĐŊĐžĐŧ ŅĐžĐēĐĩĐŊĐĩ, иĐŊаŅĐĩ вŅСŅваĐĩĐŧ `HTTPException`.
+
+ĐĐģŅ ŅŅĐžĐŗĐž иŅĐŋĐžĐģŅСŅĐĩĐŧ `security_scopes.scopes`, ŅОдĐĩŅĐļаŅиК `list` ŅĐž вŅĐĩĐŧи ŅŅиĐŧи scopes ĐēаĐē `str`.
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[130:136] *}
+
+## ĐĐĩŅĐĩвО СавиŅиĐŧĐžŅŅĐĩĐš и scopes { #dependency-tree-and-scopes }
+
+ĐŅŅ ŅаС ŅаŅŅĐŧĐžŅŅиĐŧ Đ´ĐĩŅĐĩвО СавиŅиĐŧĐžŅŅĐĩĐš и scopes.
+
+ĐĸаĐē ĐēаĐē Ņ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅи `get_current_active_user` ĐĩŅŅŅ ĐŋОдСавиŅиĐŧĐžŅŅŅ `get_current_user`, scope `"me"`, ОйŅŅвĐģĐĩĐŊĐŊŅĐš в `get_current_active_user`, ĐąŅĐ´ĐĩŅ Đ˛ĐēĐģŅŅŅĐŊ в ŅĐŋиŅĐžĐē ŅŅĐĩĐąŅĐĩĐŧŅŅ
scopes в `security_scopes.scopes`, ĐŋĐĩŅĐĩдаваĐĩĐŧŅĐš в `get_current_user`.
+
+ХаĐŧа ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи ŅĐžĐļĐĩ ОйŅŅвĐģŅĐĩŅ scope â `"items"`, ĐŋĐžŅŅĐžĐŧŅ ĐžĐŊ ŅаĐēĐļĐĩ ĐąŅĐ´ĐĩŅ Đ˛ ŅĐŋиŅĐēĐĩ `security_scopes.scopes`, ĐŋĐĩŅĐĩдаваĐĩĐŧĐžĐŧ в `get_current_user`.
+
+ĐĐĩŅаŅŅ
Đ¸Ņ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅĐĩĐš и scopes вŅĐŗĐģŅĐ´Đ¸Ņ ŅаĐē:
+
+- ĐĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи `read_own_items`:
+ - ĐаĐŋŅаŅиваĐĩŅ scopes `["items"]` Ņ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅŅŅ:
+ - `get_current_active_user`:
+ - ФŅĐŊĐēŅиŅâСавиŅиĐŧĐžŅŅŅ `get_current_active_user`:
+ - ĐаĐŋŅаŅиваĐĩŅ scopes `["me"]` Ņ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅŅŅ:
+ - `get_current_user`:
+ - ФŅĐŊĐēŅиŅâСавиŅиĐŧĐžŅŅŅ `get_current_user`:
+ - ХОйŅŅвĐĩĐŊĐŊŅŅ
scopes ĐŊĐĩ СаĐŋŅаŅиваĐĩŅ.
+ - ĐĐŧĐĩĐĩŅ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅŅ, иŅĐŋĐžĐģŅСŅŅŅŅŅ `oauth2_scheme`.
+ - ĐĐŧĐĩĐĩŅ ĐŋаŅаĐŧĐĩŅŅ `security_scopes` ŅиĐŋа `SecurityScopes`:
+ - ĐŅĐžŅ ĐŋаŅаĐŧĐĩŅŅ `security_scopes` иĐŧĐĩĐĩŅ ŅвОКŅŅвО `scopes` Ņ `list`, ŅОдĐĩŅĐļаŅиĐŧ вŅĐĩ ОйŅŅвĐģĐĩĐŊĐŊŅĐĩ вŅŅĐĩ scopes, ŅĐž ĐĩŅŅŅ:
+ - `security_scopes.scopes` ĐąŅĐ´ĐĩŅ ŅОдĐĩŅĐļаŅŅ `["me", "items"]` Đ´ĐģŅ ĐžĐŋĐĩŅаŅии ĐŋŅŅи `read_own_items`.
+ - `security_scopes.scopes` ĐąŅĐ´ĐĩŅ ŅОдĐĩŅĐļаŅŅ `["me"]` Đ´ĐģŅ ĐžĐŋĐĩŅаŅии ĐŋŅŅи `read_users_me`, ĐŋĐžŅĐžĐŧŅ ŅŅĐž ĐžĐŊ ОйŅŅвĐģĐĩĐŊ в СавиŅиĐŧĐžŅŅи `get_current_active_user`.
+ - `security_scopes.scopes` ĐąŅĐ´ĐĩŅ ŅОдĐĩŅĐļаŅŅ `[]` (ĐŊиŅĐĩĐŗĐž) Đ´ĐģŅ ĐžĐŋĐĩŅаŅии ĐŋŅŅи `read_system_status`, ĐŋĐžŅĐžĐŧŅ ŅŅĐž ŅаĐŧ ĐŊĐĩ ОйŅŅвĐģŅĐģŅŅ `Security` ŅĐž `scopes`, и ĐĩĐŗĐž СавиŅиĐŧĐžŅŅŅ `get_current_user` ŅĐžĐļĐĩ ĐŊĐĩ ОйŅŅвĐģŅĐĩŅ `scopes`.
+
+/// tip | ХОвĐĩŅ
+
+ĐаĐļĐŊŅĐš и ÂĢĐŧĐ°ĐŗĐ¸ŅĐĩŅĐēиКÂģ ĐŧĐžĐŧĐĩĐŊŅ ĐˇĐ´ĐĩŅŅ Đ˛ ŅĐžĐŧ, ŅŅĐž `get_current_user` ĐąŅĐ´ĐĩŅ Đ¸ĐŧĐĩŅŅ ŅаСĐŊŅĐš ŅĐŋиŅĐžĐē `scopes` Đ´ĐģŅ ĐŋŅОвĐĩŅĐēи Đ´ĐģŅ ĐēаĐļдОК ĐžĐŋĐĩŅаŅии ĐŋŅŅи.
+
+ĐŅŅ ŅŅĐž СавиŅĐ¸Ņ ĐžŅ `scopes`, ОйŅŅвĐģĐĩĐŊĐŊŅŅ
в ĐēаĐļдОК ĐžĐŋĐĩŅаŅии ĐŋŅŅи и в ĐēаĐļдОК СавиŅиĐŧĐžŅŅи в Đ´ĐĩŅĐĩвĐĩ СавиŅиĐŧĐžŅŅĐĩĐš ĐēĐžĐŊĐēŅĐĩŅĐŊОК ĐžĐŋĐĩŅаŅии ĐŋŅŅи.
+
+///
+
+## ĐĐžĐģŅŅĐĩ Đ´ĐĩŅаĐģĐĩĐš Đž `SecurityScopes` { #more-details-about-securityscopes }
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ `SecurityScopes` в ĐģŅйОК ŅĐžŅĐēĐĩ и в ĐŊĐĩŅĐēĐžĐģŅĐēиŅ
ĐŧĐĩŅŅаŅ
â ĐŊĐĩОйŅСаŅĐĩĐģŅĐŊĐž в ÂĢĐēĐžŅĐŊĐĩвОКÂģ СавиŅиĐŧĐžŅŅи.
+
+ĐĐŊ вŅĐĩĐŗĐ´Đ° ĐąŅĐ´ĐĩŅ ŅОдĐĩŅĐļаŅŅ security scopes, ОйŅŅвĐģĐĩĐŊĐŊŅĐĩ в ŅĐĩĐēŅŅиŅ
СавиŅиĐŧĐžŅŅŅŅ
`Security`, и вŅĐĩĐŧи СавиŅŅŅиĐŧи â Đ´ĐģŅ ŅŅОК ĐēĐžĐŊĐēŅĐĩŅĐŊОК ĐžĐŋĐĩŅаŅии ĐŋŅŅи и ŅŅĐžĐŗĐž ĐēĐžĐŊĐēŅĐĩŅĐŊĐžĐŗĐž Đ´ĐĩŅĐĩва СавиŅиĐŧĐžŅŅĐĩĐš.
+
+ĐĐžŅĐēĐžĐģŅĐēŅ `SecurityScopes` ĐąŅĐ´ĐĩŅ ŅОдĐĩŅĐļаŅŅ Đ˛ŅĐĩ scopes, ОйŅŅвĐģĐĩĐŊĐŊŅĐĩ СавиŅŅŅиĐŧи, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ ĐĩĐŗĐž, ŅŅĐžĐąŅ ŅĐĩĐŊŅŅаĐģиСОваĐŊĐŊĐž ĐŋŅОвĐĩŅŅŅŅ ĐŊаĐģиŅиĐĩ ŅŅĐĩĐąŅĐĩĐŧŅŅ
scopes в ŅĐžĐēĐĩĐŊĐĩ в ОдĐŊОК ŅŅĐŊĐēŅииâСавиŅиĐŧĐžŅŅи, а СаŅĐĩĐŧ ОйŅŅвĐģŅŅŅ ŅаСĐŊŅĐĩ ŅŅĐĩйОваĐŊĐ¸Ņ ĐŋĐž scopes в ŅаСĐŊŅŅ
ĐžĐŋĐĩŅаŅиŅŅ
ĐŋŅŅи.
+
+ĐĐŊи ĐąŅĐ´ŅŅ ĐŋŅОвĐĩŅŅŅŅŅŅ ĐŊĐĩСавиŅиĐŧĐž Đ´ĐģŅ ĐēаĐļдОК ĐžĐŋĐĩŅаŅии ĐŋŅŅи.
+
+## ĐŅОвĐĩŅиĐŧ ŅŅĐž { #check-it }
+
+ĐŅĐēŅОКŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ API â Đ˛Ņ ŅĐŧĐžĐļĐĩŅĐĩ аŅŅĐĩĐŊŅиŅиŅиŅОваŅŅŅŅ Đ¸ ŅĐēаСаŅŅ, ĐēаĐēиĐĩ scopes Đ˛Ņ Ņ
ĐžŅиŅĐĩ авŅĐžŅиСОваŅŅ.
+
+
+
+ĐŅĐģи Đ˛Ņ ĐŊĐĩ вŅĐąĐĩŅĐĩŅĐĩ ĐŊи ОдиĐŊ scope, Đ˛Ņ ĐąŅĐ´ĐĩŅĐĩ ÂĢаŅŅĐĩĐŊŅиŅиŅиŅОваĐŊŅÂģ, ĐŊĐž ĐŋŅи ĐŋĐžĐŋŅŅĐēĐĩ Đ´ĐžŅŅŅĐŋа Đē `/users/me/` иĐģи `/users/me/items/` ĐŋĐžĐģŅŅиŅĐĩ ĐžŅийĐēŅ Đž ĐŊĐĩĐ´ĐžŅŅаŅĐžŅĐŊŅŅ
ŅаСŅĐĩŅĐĩĐŊиŅŅ
. ĐŅи ŅŅĐžĐŧ Đ´ĐžŅŅŅĐŋ Đē `/status/` ĐąŅĐ´ĐĩŅ Đ˛ĐžĐˇĐŧĐžĐļĐĩĐŊ.
+
+ĐŅĐģи Đ˛Ņ Đ˛ŅĐąĐĩŅĐĩŅĐĩ scope `me`, ĐŊĐž ĐŊĐĩ `items`, Đ˛Ņ ŅĐŧĐžĐļĐĩŅĐĩ ĐŋĐžĐģŅŅиŅŅ Đ´ĐžŅŅŅĐŋ Đē `/users/me/`, ĐŊĐž ĐŊĐĩ Đē `/users/me/items/`.
+
+ĐĸаĐē и ĐąŅĐ´ĐĩŅ ĐŋŅОиŅŅ
ОдиŅŅ ŅĐž ŅŅĐžŅĐžĐŊĐŊиĐŧ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩĐŧ, ĐēĐžŅĐžŅĐžĐĩ ĐŋĐžĐŋŅŅаĐĩŅŅŅ ĐžĐąŅаŅиŅŅŅŅ Đē ОдĐŊОК иС ŅŅиŅ
ĐžĐŋĐĩŅаŅиК ĐŋŅŅи Ņ ŅĐžĐēĐĩĐŊĐžĐŧ, ĐŋŅĐĩĐ´ĐžŅŅавĐģĐĩĐŊĐŊŅĐŧ ĐŋĐžĐģŅСОваŅĐĩĐģĐĩĐŧ, â в СавиŅиĐŧĐžŅŅи ĐžŅ ŅĐžĐŗĐž, ŅĐēĐžĐģŅĐēĐž ŅаСŅĐĩŅĐĩĐŊиК ĐŋĐžĐģŅСОваŅĐĩĐģŅ Đ´Đ°Đģ ĐŋŅиĐģĐžĐļĐĩĐŊиŅ.
+
+## Đ ŅŅĐžŅĐžĐŊĐŊиŅ
иĐŊŅĐĩĐŗŅаŅиŅŅ
{ #about-third-party-integrations }
+
+Đ ŅŅĐžĐŧ ĐŋŅиĐŧĐĩŅĐĩ ĐŧŅ Đ¸ŅĐŋĐžĐģŅСŅĐĩĐŧ OAuth2 ÂĢpassword flowÂģ (аŅŅĐĩĐŊŅиŅиĐēаŅĐ¸Ņ ĐŋĐž ĐŋаŅĐžĐģŅ).
+
+ĐŅĐž ŅĐŧĐĩŅŅĐŊĐž, ĐēĐžĐŗĐ´Đ° ĐŧŅ Đ˛Ņ
ОдиĐŧ в ĐŊаŅĐĩ ŅОйŅŅвĐĩĐŊĐŊĐžĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ, вĐĩŅĐžŅŅĐŊĐž, Ņ ĐŊаŅиĐŧ ŅОйŅŅвĐĩĐŊĐŊŅĐŧ ŅŅĐžĐŊŅĐĩĐŊĐ´ĐžĐŧ.
+
+ĐŅ ĐŧĐžĐļĐĩĐŧ ĐĩĐŧŅ Đ´ĐžĐ˛ĐĩŅŅŅŅ ĐŋŅи ĐŋĐžĐģŅŅĐĩĐŊии `username` и `password`, ĐŋĐžŅĐžĐŧŅ ŅŅĐž ĐžĐŊ ĐŋОд ĐŊаŅиĐŧ ĐēĐžĐŊŅŅĐžĐģĐĩĐŧ.
+
+ĐĐž ĐĩŅĐģи Đ˛Ņ ŅОСдаŅŅĐĩ OAuth2âĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ, Đē ĐēĐžŅĐžŅĐžĐŧŅ ĐąŅĐ´ŅŅ ĐŋОдĐēĐģŅŅаŅŅŅŅ Đ´ŅŅĐŗĐ¸Đĩ (Ņ.Đĩ. Đ˛Ņ ŅŅŅОиŅĐĩ ĐŋŅОваКдĐĩŅа аŅŅĐĩĐŊŅиŅиĐēаŅии ĐŊаĐŋОдОйиĐĩ Facebook, Google, GitHub и Ņ.Đŋ.), ваĐŧ ŅĐģĐĩĐ´ŅĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ ĐžĐ´Đ¸ĐŊ иС Đ´ŅŅĐŗĐ¸Ņ
ÂĢflowsÂģ.
+
+ХаĐŧŅĐš ŅаŅĐŋŅĐžŅŅŅаĐŊŅĐŊĐŊŅĐš â ÂĢimplicit flowÂģ.
+
+ХаĐŧŅĐš ĐąĐĩСОĐŋаŅĐŊŅĐš â ÂĢcode flowÂģ, ĐŊĐž ĐžĐŊ ŅĐģĐžĐļĐŊĐĩĐĩ в ŅĐĩаĐģиСаŅии, ŅаĐē ĐēаĐē ŅŅĐĩĐąŅĐĩŅ ĐąĐžĐģŅŅĐĩ ŅĐ°ĐŗĐžĐ˛. ĐСâСа ŅĐģĐžĐļĐŊĐžŅŅи ĐŧĐŊĐžĐŗĐ¸Đĩ ĐŋŅОваКдĐĩŅŅ Đ˛ иŅĐžĐŗĐĩ ŅĐĩĐēĐžĐŧĐĩĐŊĐ´ŅŅŅ ÂĢimplicit flowÂģ.
+
+/// note | ĐŅиĐŧĐĩŅаĐŊиĐĩ
+
+ЧаŅŅĐž ĐēаĐļĐ´ŅĐš ĐŋŅОваКдĐĩŅ Đ°ŅŅĐĩĐŊŅиŅиĐēаŅии ĐŊаСŅваĐĩŅ ŅвОи ÂĢflowsÂģ ĐŋĐžâŅаСĐŊĐžĐŧŅ â ĐēаĐē ŅаŅŅŅ ĐąŅĐĩĐŊда.
+
+ĐĐž в иŅĐžĐŗĐĩ ĐžĐŊи ŅĐĩаĐģиСŅŅŅ ĐžĐ´Đ¸ĐŊ и ŅĐžŅ ĐļĐĩ ŅŅаĐŊдаŅŅ OAuth2.
+
+///
+
+FastAPI вĐēĐģŅŅаĐĩŅ ŅŅиĐģиŅŅ Đ´ĐģŅ Đ˛ŅĐĩŅ
ŅŅиŅ
OAuth2âflows в `fastapi.security.oauth2`.
+
+## `Security` в ĐŋаŅаĐŧĐĩŅŅĐĩ `dependencies` Đ´ĐĩĐēĐžŅаŅĐžŅа { #security-in-decorator-dependencies }
+
+ĐĸĐžŅĐŊĐž ŅаĐē ĐļĐĩ, ĐēаĐē Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐžĐŋŅĐĩĐ´ĐĩĐģиŅŅ `list` иС `Depends` в ĐŋаŅаĐŧĐĩŅŅĐĩ `dependencies` Đ´ĐĩĐēĐžŅаŅĐžŅа (ŅĐŧ. [ĐавиŅиĐŧĐžŅŅи в Đ´ĐĩĐēĐžŅаŅĐžŅаŅ
ĐžĐŋĐĩŅаŅии ĐŋŅŅи](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}), Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ ŅаĐŧ и `Security` ŅĐž `scopes`.
diff --git a/docs/ru/docs/advanced/settings.md b/docs/ru/docs/advanced/settings.md
new file mode 100644
index 000000000..a335548c3
--- /dev/null
+++ b/docs/ru/docs/advanced/settings.md
@@ -0,0 +1,346 @@
+# ĐаŅŅŅОКĐēи и ĐŋĐĩŅĐĩĐŧĐĩĐŊĐŊŅĐĩ ĐžĐēŅŅĐļĐĩĐŊĐ¸Ņ { #settings-and-environment-variables }
+
+ĐĐž ĐŧĐŊĐžĐŗĐ¸Ņ
ŅĐģŅŅаŅŅ
ваŅĐĩĐŧŅ ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ ĐŧĐžĐŗŅŅ ĐŋĐžĐŊадОйиŅŅŅŅ Đ˛ĐŊĐĩŅĐŊиĐĩ ĐŊаŅŅŅОКĐēи иĐģи ĐēĐžĐŊŅĐ¸ĐŗŅŅаŅии, ĐŊаĐŋŅиĐŧĐĩŅ ŅĐĩĐēŅĐĩŅĐŊŅĐĩ ĐēĐģŅŅи, ŅŅĐĩŅĐŊŅĐĩ даĐŊĐŊŅĐĩ Đ´ĐģŅ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊĐŊŅŅ
, ŅŅĐĩŅĐŊŅĐĩ даĐŊĐŊŅĐĩ Đ´ĐģŅ emailâŅĐĩŅвиŅОв и Ņ.Đ´.
+
+ĐĐžĐģŅŅиĐŊŅŅвО ŅаĐēиŅ
ĐŊаŅŅŅĐžĐĩĐē ŅвĐģŅŅŅŅŅ Đ¸ĐˇĐŧĐĩĐŊŅĐĩĐŧŅĐŧи (ĐŧĐžĐŗŅŅ ĐŧĐĩĐŊŅŅŅŅŅ), ĐŊаĐŋŅиĐŧĐĩŅ URL ĐąĐ°ĐˇŅ Đ´Đ°ĐŊĐŊŅŅ
. Đ ĐŧĐŊĐžĐŗĐ¸Đĩ иС ĐŊиŅ
ĐŧĐžĐŗŅŅ ĐąŅŅŅ ÂĢŅŅвŅŅвиŅĐĩĐģŅĐŊŅĐŧиÂģ, ĐŊаĐŋŅиĐŧĐĩŅ ŅĐĩĐēŅĐĩŅŅ.
+
+ĐĐž ŅŅОК ĐŋŅиŅиĐŊĐĩ ОйŅŅĐŊĐž иŅ
ĐŋĐĩŅĐĩдаŅŅ ŅĐĩŅĐĩС ĐŋĐĩŅĐĩĐŧĐĩĐŊĐŊŅĐĩ ĐžĐēŅŅĐļĐĩĐŊиŅ, ĐēĐžŅĐžŅŅĐĩ ŅŅиŅŅваŅŅŅŅ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩĐŧ.
+
+/// tip | ХОвĐĩŅ
+
+ЧŅĐžĐąŅ ĐŋĐžĐŊŅŅŅ, ŅŅĐž ŅаĐēĐžĐĩ ĐŋĐĩŅĐĩĐŧĐĩĐŊĐŊŅĐĩ ĐžĐēŅŅĐļĐĩĐŊиŅ, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐŋŅĐžŅиŅаŅŅ [ĐĐĩŅĐĩĐŧĐĩĐŊĐŊŅĐĩ ĐžĐēŅŅĐļĐĩĐŊиŅ](../environment-variables.md){.internal-link target=_blank}.
+
+///
+
+## ĐĸиĐŋŅ Đ¸ ваĐģидаŅĐ¸Ņ { #types-and-validation }
+
+ĐĐĩŅĐĩĐŧĐĩĐŊĐŊŅĐĩ ĐžĐēŅŅĐļĐĩĐŊĐ¸Ņ ĐŧĐžĐŗŅŅ ŅОдĐĩŅĐļаŅŅ ŅĐžĐģŅĐēĐž ŅĐĩĐēŅŅОвŅĐĩ ŅŅŅĐžĐēи, ŅаĐē ĐēаĐē ĐžĐŊи вĐŊĐĩŅĐŊиĐĩ ĐŋĐž ĐžŅĐŊĐžŅĐĩĐŊĐ¸Ņ Đē Python и Đ´ĐžĐģĐļĐŊŅ ĐąŅŅŅ ŅОвĐŧĐĩŅŅиĐŧŅ Ņ Đ´ŅŅĐŗĐ¸Đŧи ĐŋŅĐžĐŗŅаĐŧĐŧаĐŧи и ĐžŅŅаĐģŅĐŊОК ŅиŅŅĐĩĐŧОК (и даĐļĐĩ Ņ ŅаСĐŊŅĐŧи ĐžĐŋĐĩŅаŅиОĐŊĐŊŅĐŧи ŅиŅŅĐĩĐŧаĐŧи, ŅаĐēиĐŧи ĐēаĐē Linux, Windows, macOS).
+
+ĐŅĐž ОСĐŊаŅаĐĩŅ, ŅŅĐž ĐģŅйОĐĩ СĐŊаŅĐĩĐŊиĐĩ, ĐŋŅĐžŅиŅаĐŊĐŊĐžĐĩ в Python иС ĐŋĐĩŅĐĩĐŧĐĩĐŊĐŊОК ĐžĐēŅŅĐļĐĩĐŊиŅ, ĐąŅĐ´ĐĩŅ `str`, а ĐģŅĐąŅĐĩ ĐŋŅĐĩОйŅаСОваĐŊĐ¸Ņ Đē Đ´ŅŅĐŗĐ¸Đŧ ŅиĐŋаĐŧ иĐģи ĐģŅĐąĐ°Ņ Đ˛Đ°ĐģидаŅĐ¸Ņ Đ´ĐžĐģĐļĐŊŅ Đ˛ŅĐŋĐžĐģĐŊŅŅŅŅŅ Đ˛ ĐēОдĐĩ.
+
+## Pydantic `Settings` { #pydantic-settings }
+
+Đ ŅŅаŅŅŅŅ, Pydantic ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ ĐžŅĐģиŅĐŊŅŅ ŅŅиĐģиŅŅ Đ´ĐģŅ ŅайОŅŅ Ņ ŅŅиĐŧи ĐŊаŅŅŅОКĐēаĐŧи, ĐŋĐžŅŅŅĐŋаŅŅиĐŧи иС ĐŋĐĩŅĐĩĐŧĐĩĐŊĐŊŅŅ
ĐžĐēŅŅĐļĐĩĐŊиŅ, â Pydantic: ŅĐŋŅавĐģĐĩĐŊиĐĩ ĐŊаŅŅŅОКĐēаĐŧи.
+
+### ĐŖŅŅаĐŊОвĐēа `pydantic-settings` { #install-pydantic-settings }
+
+ĐĄĐŊаŅаĐģа ŅĐąĐĩдиŅĐĩŅŅ, ŅŅĐž Đ˛Ņ ŅОСдаĐģи [виŅŅŅаĐģŅĐŊĐžĐĩ ĐžĐēŅŅĐļĐĩĐŊиĐĩ](../virtual-environments.md){.internal-link target=_blank}, аĐēŅивиŅОваĐģи ĐĩĐŗĐž, а СаŅĐĩĐŧ ŅŅŅаĐŊОвиĐģи ĐŋаĐēĐĩŅ `pydantic-settings`:
+
+
+
+ĐаŅĐĩĐŧ ĐžŅĐēŅОКŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ Đ´ĐģŅ ĐŋОдĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ ĐŋĐž адŅĐĩŅŅ http://127.0.0.1:8000/subapi/docs.
+
+ĐŅ ŅвидиŅĐĩ авŅĐžĐŧаŅиŅĐĩŅĐēŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ API Đ´ĐģŅ ĐŋОдĐŋŅиĐģĐžĐļĐĩĐŊиŅ, вĐēĐģŅŅаŅŅŅŅ ŅĐžĐģŅĐēĐž ĐĩĐŗĐž ŅОйŅŅвĐĩĐŊĐŊŅĐĩ _ĐžĐŋĐĩŅаŅии ĐŋŅŅи_, вŅĐĩ ĐŋОд ĐēĐžŅŅĐĩĐēŅĐŊŅĐŧ ĐŋŅĐĩŅиĐēŅĐžĐŧ ĐŋОдĐŋŅŅи `/subapi`:
+
+
+
+ĐŅĐģи Đ˛Ņ ĐŋĐžĐŋŅОйŅĐĩŅĐĩ вСаиĐŧОдĐĩĐšŅŅвОваŅŅ Ņ ĐģŅĐąŅĐŧ иС двŅŅ
иĐŊŅĐĩŅŅĐĩĐšŅОв, вŅŅ ĐąŅĐ´ĐĩŅ ŅайОŅаŅŅ ĐēĐžŅŅĐĩĐēŅĐŊĐž, ĐŋĐžŅĐžĐŧŅ ŅŅĐž ĐąŅаŅСĐĩŅ ŅĐŧĐžĐļĐĩŅ ĐžĐąŅаŅаŅŅŅŅ Đē ĐēаĐļĐ´ĐžĐŧŅ ĐēĐžĐŊĐēŅĐĩŅĐŊĐžĐŧŅ ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ Đ¸ ĐŋОдĐŋŅиĐģĐžĐļĐĩĐŊиŅ.
+
+### ĐĸĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ ĐŋОдŅОйĐŊĐžŅŅи: `root_path` { #technical-details-root-path }
+
+ĐĐžĐŗĐ´Đ° Đ˛Ņ ĐŧĐžĐŊŅиŅŅĐĩŅĐĩ ĐŋОдĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ, ĐēаĐē ĐžĐŋиŅаĐŊĐž вŅŅĐĩ, FastAPI ĐŋОСайОŅиŅŅŅ Đž ĐŋĐĩŅĐĩдаŅĐĩ ĐŋŅŅи ĐŧĐžĐŊŅиŅОваĐŊĐ¸Ņ Đ´ĐģŅ ĐŋОдĐŋŅиĐģĐžĐļĐĩĐŊиŅ, иŅĐŋĐžĐģŅСŅŅ ĐŧĐĩŅ
аĐŊиСĐŧ иС ŅĐŋĐĩŅиŅиĐēаŅии ASGI ĐŋОд ĐŊаСваĐŊиĐĩĐŧ `root_path`.
+
+ĐĸаĐēиĐŧ ОйŅаСОĐŧ ĐŋОдĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐąŅĐ´ĐĩŅ ĐˇĐŊаŅŅ, ŅŅĐž Đ´ĐģŅ Đ¸ĐŊŅĐĩŅŅĐĩĐšŅа Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии ĐŊŅĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ ŅŅĐžŅ ĐŋŅĐĩŅиĐēŅ ĐŋŅŅи.
+
+ĐŖ ĐŋОдĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ ŅаĐēĐļĐĩ ĐŧĐžĐŗŅŅ ĐąŅŅŅ ŅвОи ŅОйŅŅвĐĩĐŊĐŊŅĐĩ ŅĐŧĐžĐŊŅиŅОваĐŊĐŊŅĐĩ ĐŋОдĐŋŅиĐģĐžĐļĐĩĐŊиŅ, и вŅŅ ĐąŅĐ´ĐĩŅ ŅайОŅаŅŅ ĐēĐžŅŅĐĩĐēŅĐŊĐž, ĐŋĐžŅĐžĐŧŅ ŅŅĐž FastAPI авŅĐžĐŧаŅиŅĐĩŅĐēи ОйŅайаŅŅваĐĩŅ Đ˛ŅĐĩ ŅŅи `root_path`.
+
+ĐŅ ŅСĐŊаĐĩŅĐĩ йОĐģŅŅĐĩ Đž `root_path` и Đž ŅĐžĐŧ, ĐēаĐē иŅĐŋĐžĐģŅСОваŅŅ ĐĩĐŗĐž ŅвĐŊĐž, в ŅаСдĐĩĐģĐĩ [Đа ĐŋŅĐžĐēŅи](behind-a-proxy.md){.internal-link target=_blank}.
diff --git a/docs/ru/docs/advanced/templates.md b/docs/ru/docs/advanced/templates.md
new file mode 100644
index 000000000..5675ff48a
--- /dev/null
+++ b/docs/ru/docs/advanced/templates.md
@@ -0,0 +1,126 @@
+# ШайĐģĐžĐŊŅ { #templates }
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ ĐģŅйОК ŅайĐģĐžĐŊиСаŅĐžŅ Đ˛ĐŧĐĩŅŅĐĩ Ņ **FastAPI**.
+
+ЧаŅŅĐž вŅйиŅаŅŅ Jinja2 â ŅĐžŅ ĐļĐĩ, ŅŅĐž иŅĐŋĐžĐģŅСŅĐĩŅŅŅ Đ˛Đž Flask и Đ´ŅŅĐŗĐ¸Ņ
иĐŊŅŅŅŅĐŧĐĩĐŊŅаŅ
.
+
+ĐŅŅŅ ŅŅиĐģиŅŅ Đ´ĐģŅ ĐŋŅĐžŅŅОК ĐŊаŅŅŅОКĐēи, ĐēĐžŅĐžŅŅĐĩ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ ĐŋŅŅĐŧĐž в ŅвОĐĩĐŧ ĐŋŅиĐģĐžĐļĐĩĐŊии **FastAPI** (ĐŋŅĐĩĐ´ĐžŅŅавĐģŅŅŅŅŅ Starlette).
+
+## ĐŖŅŅаĐŊОвĐēа СавиŅиĐŧĐžŅŅĐĩĐš { #install-dependencies }
+
+ĐŖĐąĐĩдиŅĐĩŅŅ, ŅŅĐž Đ˛Ņ ŅОСдаĐģи [виŅŅŅаĐģŅĐŊĐžĐĩ ĐžĐēŅŅĐļĐĩĐŊиĐĩ](../virtual-environments.md){.internal-link target=_blank}, аĐēŅивиŅОваĐģи ĐĩĐŗĐž и ŅŅŅаĐŊОвиĐģи `jinja2`:
+
+
-## ĐĐąŅайОŅĐēа ĐžŅĐēĐģŅŅĐĩĐŊиК и ŅайОŅа Ņ ĐŊĐĩŅĐēĐžĐģŅĐēиĐŧи ĐēĐģиĐĩĐŊŅаĐŧи
+## ĐĐąŅайОŅĐēа ĐžŅĐēĐģŅŅĐĩĐŊиК и ŅайОŅа Ņ ĐŊĐĩŅĐēĐžĐģŅĐēиĐŧи ĐēĐģиĐĩĐŊŅаĐŧи { #handling-disconnections-and-multiple-clients }
ĐŅĐģи вĐĩĐą-ŅĐžĐēĐĩŅ ŅĐžĐĩдиĐŊĐĩĐŊиĐĩ СаĐēŅŅŅĐž, ŅĐž `await websocket.receive_text()` вŅСОвĐĩŅ Đ¸ŅĐēĐģŅŅĐĩĐŊиĐĩ `WebSocketDisconnect`, ĐēĐžŅĐžŅĐžĐĩ ĐŧĐžĐļĐŊĐž ĐŋОКĐŧаŅŅ Đ¸ ОйŅайОŅаŅŅ ĐēаĐē в ŅŅĐžĐŧ ĐŋŅиĐŧĐĩŅĐĩ:
@@ -168,7 +168,7 @@ $ fastapi dev main.py
Client #1596980209979 left the chat
```
-/// tip | ĐŅиĐŧĐĩŅаĐŊиĐĩ
+/// tip | ĐОдŅĐēаСĐēа
ĐŅиĐģĐžĐļĐĩĐŊиĐĩ вŅŅĐĩ - ŅŅĐž вŅĐĩĐŗĐž ĐģиŅŅ ĐŋŅĐžŅŅОК ĐŧиĐŊиĐŧаĐģŅĐŊŅĐš ĐŋŅиĐŧĐĩŅ, Đ´ĐĩĐŧĐžĐŊŅŅŅиŅŅŅŅиК ОйŅайОŅĐēŅ Đ¸ ĐŋĐĩŅĐĩдаŅŅ ŅООйŅĐĩĐŊиК ĐŊĐĩŅĐēĐžĐģŅĐēиĐŧ вĐĩĐą-ŅĐžĐēĐĩŅ ŅĐžĐĩдиĐŊĐĩĐŊиŅĐŧ.
@@ -178,7 +178,7 @@ Client #1596980209979 left the chat
///
-## ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊĐ°Ņ Đ¸ĐŊŅĐžŅĐŧаŅиŅ
+## ĐĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊĐ°Ņ Đ¸ĐŊŅĐžŅĐŧаŅĐ¸Ņ { #more-info }
ĐĐģŅ ĐąĐžĐģĐĩĐĩ ĐŗĐģŅйОĐēĐžĐŗĐž иСŅŅĐĩĐŊĐ¸Ņ ŅĐĩĐŧŅ Đ˛ĐžŅĐŋĐžĐģŅСŅĐšŅĐĩŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиĐĩĐš Starlette:
diff --git a/docs/ru/docs/advanced/wsgi.md b/docs/ru/docs/advanced/wsgi.md
new file mode 100644
index 000000000..1c5bf0a62
--- /dev/null
+++ b/docs/ru/docs/advanced/wsgi.md
@@ -0,0 +1,35 @@
+# ĐОдĐēĐģŅŅĐĩĐŊиĐĩ WSGI â Flask, Django и Đ´ŅŅĐŗĐ¸Đĩ { #including-wsgi-flask-django-others }
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ĐŧĐžĐŊŅиŅОваŅŅ WSGIâĐŋŅиĐģĐžĐļĐĩĐŊиŅ, ĐēаĐē Đ˛Ņ Đ˛Đ¸Đ´ĐĩĐģи в [ĐОдĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ â Mounts](sub-applications.md){.internal-link target=_blank}, [Đа ĐŋŅĐžĐēŅиâŅĐĩŅвĐĩŅĐžĐŧ](behind-a-proxy.md){.internal-link target=_blank}.
+
+ĐĐģŅ ŅŅĐžĐŗĐž Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ `WSGIMiddleware` и ОйĐĩŅĐŊŅŅŅ Đ¸Đŧ ваŅĐĩ WSGIâĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ, ĐŊаĐŋŅиĐŧĐĩŅ Flask, Django и Ņ.Đ´.
+
+## ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ `WSGIMiddleware` { #using-wsgimiddleware }
+
+ĐŅĐļĐŊĐž иĐŧĐŋĐžŅŅиŅОваŅŅ `WSGIMiddleware`.
+
+ĐаŅĐĩĐŧ ОйĐĩŅĐŊиŅĐĩ WSGIâĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ (ĐŊаĐŋŅиĐŧĐĩŅ, Flask) в middleware (ĐŅĐžĐŧĐĩĐļŅŅĐžŅĐŊŅĐš ŅĐģОК).
+
+ĐĐžŅĐģĐĩ ŅŅĐžĐŗĐž ŅĐŧĐžĐŊŅиŅŅĐšŅĐĩ ĐĩĐŗĐž ĐŊа ĐŋŅŅŅ.
+
+{* ../../docs_src/wsgi/tutorial001.py hl[2:3,3] *}
+
+## ĐŅОвĐĩŅŅŅĐĩ { #check-it }
+
+ĐĸĐĩĐŋĐĩŅŅ ĐēаĐļĐ´ŅĐš HTTPâСаĐŋŅĐžŅ ĐŋĐž ĐŋŅŅи `/v1/` ĐąŅĐ´ĐĩŅ ĐžĐąŅайаŅŅваŅŅŅŅ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩĐŧ Flask.
+
+РвŅŅ ĐžŅŅаĐģŅĐŊĐžĐĩ ĐąŅĐ´ĐĩŅ ĐžĐąŅайаŅŅваŅŅŅŅ **FastAPI**.
+
+ĐŅĐģи Đ˛Ņ ĐˇĐ°ĐŋŅŅŅиŅĐĩ ŅŅĐž и ĐŋĐĩŅĐĩКдŅŅĐĩ ĐŋĐž http://localhost:8000/v1/, Đ˛Ņ ŅвидиŅĐĩ HTTPâĐžŅвĐĩŅ ĐžŅ Flask:
+
+```txt
+Hello, World from Flask!
+```
+
+Đ ĐĩŅĐģи Đ˛Ņ ĐŋĐĩŅĐĩКдŅŅĐĩ ĐŋĐž http://localhost:8000/v2, Đ˛Ņ ŅвидиŅĐĩ HTTPâĐžŅвĐĩŅ ĐžŅ FastAPI:
+
+```JSON
+{
+ "message": "Hello World"
+}
+```
diff --git a/docs/ru/docs/alternatives.md b/docs/ru/docs/alternatives.md
index 3c5147e79..6380bcc45 100644
--- a/docs/ru/docs/alternatives.md
+++ b/docs/ru/docs/alternatives.md
@@ -1,104 +1,94 @@
-# ĐĐģŅŅĐĩŅĐŊаŅивŅ, иŅŅĐžŅĐŊиĐēи вдОŅ
ĐŊОвĐĩĐŊĐ¸Ņ Đ¸ ŅŅавĐŊĐĩĐŊиŅ
+# ĐĐģŅŅĐĩŅĐŊаŅивŅ, иŅŅĐžŅĐŊиĐēи вдОŅ
ĐŊОвĐĩĐŊĐ¸Ņ Đ¸ ŅŅавĐŊĐĩĐŊĐ¸Ņ { #alternatives-inspiration-and-comparisons }
-ЧŅĐž вдОŅ
ĐŊОвиĐģĐž ĐŊа ŅОСдаĐŊиĐĩ **FastAPI**, ŅŅавĐŊĐĩĐŊиĐĩ ĐĩĐŗĐž Ņ Đ°ĐģŅŅĐĩŅĐŊаŅиваĐŧи и ŅĐĩĐŧŅ ĐžĐŊ ĐŊаŅŅиĐģŅŅ Ņ ĐŊиŅ
.
+ЧŅĐž вдОŅ
ĐŊОвиĐģĐž **FastAPI**, ŅŅавĐŊĐĩĐŊиĐĩ Ņ Đ°ĐģŅŅĐĩŅĐŊаŅиваĐŧи и ŅĐĩĐŧŅ ĐžĐŊ Ņ ĐŊиŅ
ĐŊаŅŅиĐģŅŅ.
-## ĐвĐĩĐ´ĐĩĐŊиĐĩ
+## ĐвĐĩĐ´ĐĩĐŊиĐĩ { #intro }
-**FastAPI** ĐŊĐĩ ŅŅŅĐĩŅŅвОваĐģ ĐąŅ, ĐĩŅĐģи Đą ĐŊĐĩ ĐąŅĐģĐž йОĐģĐĩĐĩ ŅаĐŊĐŊиŅ
ŅĐ°ĐąĐžŅ Đ´ŅŅĐŗĐ¸Ņ
ĐģŅĐ´ĐĩĐš.
+**FastAPI** ĐŊĐĩ ŅŅŅĐĩŅŅвОваĐģ ĐąŅ ĐąĐĩС ĐŋŅĐĩĐ´ŅĐ´ŅŅиŅ
ŅĐ°ĐąĐžŅ Đ´ŅŅĐŗĐ¸Ņ
ĐģŅĐ´ĐĩĐš.
-ĐĐŊи ŅОСдаĐģи йОĐģŅŅĐžĐĩ ĐēĐžĐģиŅĐĩŅŅвО иĐŊŅŅŅŅĐŧĐĩĐŊŅОв, ĐēĐžŅĐžŅŅĐĩ вдОŅ
ĐŊОвиĐģи ĐŧĐĩĐŊŅ ĐŊа ŅОСдаĐŊиĐĩ **FastAPI**.
+ĐŅĐģĐž ŅОСдаĐŊĐž ĐŧĐŊĐžĐļĐĩŅŅвО иĐŊŅŅŅŅĐŧĐĩĐŊŅОв, ĐēĐžŅĐžŅŅĐĩ вдОŅ
ĐŊОвиĐģи ĐŊа ĐĩĐŗĐž ĐŋĐžŅвĐģĐĩĐŊиĐĩ.
-Đ¯ вŅŅŅĐĩŅĐēи иСйĐĩĐŗĐ°Đģ ŅОСдаĐŊĐ¸Ņ ĐŊĐžĐ˛ĐžĐŗĐž ŅŅĐĩĐšĐŧвОŅĐēа в ŅĐĩŅĐĩĐŊиĐĩ ĐŊĐĩŅĐēĐžĐģŅĐēиŅ
ĐģĐĩŅ.
-ĐĄĐŊаŅаĐģа Ņ ĐŋŅŅаĐģŅŅ ŅОйŅаŅŅ Đ˛ŅĐĩ ĐŊŅĐļĐŊŅĐĩ ŅŅĐŊĐēŅии, ĐēĐžŅĐžŅŅĐĩ ĐŊŅĐŊĐĩ ĐĩŅŅŅ Đ˛ **FastAPI**, иŅĐŋĐžĐģŅСŅŅ ĐŧĐŊĐžĐļĐĩŅŅвО ŅаСĐģиŅĐŊŅŅ
ŅŅĐĩĐšĐŧвОŅĐēОв, ĐŋĐģĐ°ĐŗĐ¸ĐŊОв и иĐŊŅŅŅŅĐŧĐĩĐŊŅОв.
+Đ¯ ĐŊĐĩŅĐēĐžĐģŅĐēĐž ĐģĐĩŅ Đ¸ĐˇĐąĐĩĐŗĐ°Đģ ŅОСдаĐŊĐ¸Ņ ĐŊĐžĐ˛ĐžĐŗĐž ŅŅĐĩĐšĐŧвОŅĐēа. ĐĄĐŊаŅаĐģа ĐŋŅŅаĐģŅŅ ĐˇĐ°ĐēŅŅŅŅ Đ˛ŅĐĩ вОСĐŧĐžĐļĐŊĐžŅŅи, ĐēĐžŅĐžŅŅĐĩ ŅĐĩĐšŅĐ°Ņ ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ **FastAPI**, Ņ ĐŋĐžĐŧĐžŅŅŅ ĐŧĐŊĐžĐļĐĩŅŅва ŅаСĐŊŅŅ
ŅŅĐĩĐšĐŧвОŅĐēОв, ĐŋĐģĐ°ĐŗĐ¸ĐŊОв и иĐŊŅŅŅŅĐŧĐĩĐŊŅОв.
-ĐĐž в ĐēаĐēОК-ŅĐž ĐŧĐžĐŧĐĩĐŊŅ ĐŊĐĩ ĐžŅŅаĐģĐžŅŅ Đ´ŅŅĐŗĐžĐŗĐž вŅйОŅа, ĐēŅĐžĐŧĐĩ ĐēаĐē ŅОСдаŅŅ ŅŅĐž-ŅĐž, ŅŅĐž ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐģĐž ĐąŅ Đ˛ŅĐĩ ŅŅи ŅŅĐŊĐēŅии ŅŅаСŅ.
-ĐСŅŅŅ ŅаĐŧŅĐĩ ĐģŅŅŅиĐĩ идĐĩи иС ĐŋŅĐĩĐ´ŅĐ´ŅŅиŅ
иĐŊŅŅŅŅĐŧĐĩĐŊŅОв и, иŅĐŋĐžĐģŅСŅŅ ĐŊОвŅĐĩ вОСĐŧĐžĐļĐŊĐžŅŅи Python (ĐēĐžŅĐžŅŅŅ
ĐŊĐĩ ĐąŅĐģĐž Đ´Đž вĐĩŅŅии 3.6, ŅĐž ĐĩŅŅŅ ĐŋОдŅĐēаСĐēи ŅиĐŋОв), ОйŅĐĩдиĐŊиŅŅ Đ¸Ņ
.
+ĐĐž в ĐēаĐēОК-ŅĐž ĐŧĐžĐŧĐĩĐŊŅ ĐŊĐĩ ĐžŅŅаĐģĐžŅŅ Đ´ŅŅĐŗĐžĐŗĐž ваŅиаĐŊŅа, ĐēŅĐžĐŧĐĩ ĐēаĐē ŅОСдаŅŅ ŅŅĐž-ŅĐž, ŅŅĐž вĐēĐģŅŅаĐĩŅ Đ˛ŅĐĩ ŅŅи вОСĐŧĐžĐļĐŊĐžŅŅи, вСŅв ĐģŅŅŅиĐĩ идĐĩи иС ĐŋŅĐĩĐļĐŊиŅ
иĐŊŅŅŅŅĐŧĐĩĐŊŅОв и ŅОвĐŧĐĩŅŅив иŅ
ĐŧаĐēŅиĐŧаĐģŅĐŊĐž ŅдаŅĐŊŅĐŧ ОйŅаСОĐŧ, иŅĐŋĐžĐģŅСŅŅ Đ˛ĐžĐˇĐŧĐžĐļĐŊĐžŅŅи ŅСŅĐēа, ĐēĐžŅĐžŅŅŅ
ĐŋŅĐĩĐļĐ´Đĩ ĐŊĐĩ ĐąŅĐģĐž (аĐŊĐŊĐžŅаŅии ŅиĐŋОв в Python 3.6+).
-## ĐŅĐĩĐ´ŅĐĩŅŅвŅŅŅиĐĩ иĐŊŅŅŅŅĐŧĐĩĐŊŅŅ
+## ĐŅĐĩĐ´ŅĐĩŅŅвŅŅŅиĐĩ иĐŊŅŅŅŅĐŧĐĩĐŊŅŅ { #previous-tools }
-### Django
+### Django { #django }
-ĐŅĐž ŅаĐŧŅĐš ĐŋĐžĐŋŅĐģŅŅĐŊŅĐš Python-ŅŅĐĩĐšĐŧвОŅĐē, и ĐžĐŊ ĐŋĐžĐģŅСŅĐĩŅŅŅ Đ´ĐžĐ˛ĐĩŅиĐĩĐŧ.
-ĐĐŊ иŅĐŋĐžĐģŅСŅĐĩŅŅŅ Đ´ĐģŅ ŅОСдаĐŊĐ¸Ņ ĐŋŅĐžĐĩĐēŅОв ŅиĐŋа Instagram.
+ĐŅĐž ŅаĐŧŅĐš ĐŋĐžĐŋŅĐģŅŅĐŊŅĐš Python-ŅŅĐĩĐšĐŧвОŅĐē, ĐĩĐŧŅ ŅиŅĐžĐēĐž дОвĐĩŅŅŅŅ. ĐĐŊ иŅĐŋĐžĐģŅСŅĐĩŅŅŅ Đ´ĐģŅ ĐŋĐžŅŅŅĐžĐĩĐŊĐ¸Ņ ŅиŅŅĐĩĐŧ вŅОдĐĩ Instagram.
-Django дОвОĐģŅĐŊĐž ŅĐĩŅĐŊĐž ŅвŅСаĐŊ Ņ ŅĐĩĐģŅŅиОĐŊĐŊŅĐŧи йаСаĐŧи даĐŊĐŊŅŅ
(ŅаĐēиĐŧи ĐēаĐē MySQL иĐģи PostgreSQL), ĐŋĐžŅĐžĐŧŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ NoSQL ĐąĐ°ĐˇŅ Đ´Đ°ĐŊĐŊŅŅ
(ĐŊаĐŋŅиĐŧĐĩŅ, Couchbase, MongoDB, Cassandra и Ņ.Đŋ.) в ĐēаŅĐĩŅŅвĐĩ ĐžŅĐŊОвĐŊĐžĐŗĐž Ņ
ŅаĐŊиĐģиŅа даĐŊĐŊŅŅ
- ĐŊĐĩĐŋŅĐžŅŅĐž.
+ĐĐŊ ĐžŅĐŊĐžŅиŅĐĩĐģŅĐŊĐž ŅĐĩŅĐŊĐž ŅвŅСаĐŊ Ņ ŅĐĩĐģŅŅиОĐŊĐŊŅĐŧи йаСаĐŧи даĐŊĐŊŅŅ
(ĐŊаĐŋŅиĐŧĐĩŅ, MySQL иĐģи PostgreSQL), ĐŋĐžŅŅĐžĐŧŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ NoSQL-ĐąĐ°ĐˇŅ Đ´Đ°ĐŊĐŊŅŅ
(ĐŊаĐŋŅиĐŧĐĩŅ, Couchbase, MongoDB, Cassandra и Ņ. Đŋ.) в ĐēаŅĐĩŅŅвĐĩ ĐžŅĐŊОвĐŊĐžĐŗĐž Ņ
ŅаĐŊиĐģиŅа ĐŊĐĩ ĐžŅĐĩĐŊŅ ĐŋŅĐžŅŅĐž.
-ĐĐŊ ĐąŅĐģ ŅОСдаĐŊ Đ´ĐģŅ ĐŗĐĩĐŊĐĩŅаŅии HTML-ŅŅŅаĐŊĐ¸Ņ ĐŊа ŅĐĩŅвĐĩŅĐĩ, а ĐŊĐĩ Đ´ĐģŅ ŅОСдаĐŊĐ¸Ņ API, иŅĐŋĐžĐģŅСŅĐĩĐŧŅŅ
ŅОвŅĐĩĐŧĐĩĐŊĐŊŅĐŧи вĐĩĐą-иĐŊŅĐĩŅŅĐĩĐšŅаĐŧи (React, Vue.js, Angular и Ņ.Đŋ.) иĐģи Đ´ŅŅĐŗĐ¸Đŧи ŅиŅŅĐĩĐŧаĐŧи (ĐŊаĐŋŅиĐŧĐĩŅ, IoT) вСаиĐŧОдĐĩĐšŅŅвŅŅŅиĐŧи Ņ ŅĐĩŅвĐĩŅĐžĐŧ.
+ĐĐŊ ĐąŅĐģ ŅОСдаĐŊ Đ´ĐģŅ ĐŗĐĩĐŊĐĩŅаŅии HTML ĐŊа ĐąŅĐēĐĩĐŊĐ´Đĩ, а ĐŊĐĩ Đ´ĐģŅ ŅОСдаĐŊĐ¸Ņ API, иŅĐŋĐžĐģŅСŅĐĩĐŧŅŅ
ŅОвŅĐĩĐŧĐĩĐŊĐŊŅĐŧ ŅŅĐžĐŊŅĐĩĐŊĐ´ĐžĐŧ (ĐŊаĐŋŅиĐŧĐĩŅ, React, Vue.js и Angular) иĐģи Đ´ŅŅĐŗĐ¸Đŧи ŅиŅŅĐĩĐŧаĐŧи (ĐŊаĐŋŅиĐŧĐĩŅ, ŅŅŅŅОКŅŅваĐŧи IoT), ĐēĐžŅĐžŅŅĐĩ Ņ ĐŊиĐŧ ОйŅаŅŅŅŅ.
-### Django REST Framework
+### Django REST Framework { #django-rest-framework }
-ФŅĐĩĐšĐŧвОŅĐē Django REST ĐąŅĐģ ŅОСдаĐŊ, ĐēаĐē ĐŗĐ¸ĐąĐēиК иĐŊŅŅŅŅĐŧĐĩĐŊŅаŅиК Đ´ĐģŅ ŅОСдаĐŊĐ¸Ņ Đ˛ĐĩĐą-API ĐŊа ĐžŅĐŊОвĐĩ Django.
+Django REST Framework ĐąŅĐģ ŅОСдаĐŊ ĐēаĐē ĐŗĐ¸ĐąĐēиК ĐŊĐ°ĐąĐžŅ Đ¸ĐŊŅŅŅŅĐŧĐĩĐŊŅОв Đ´ĐģŅ ĐŋĐžŅŅŅĐžĐĩĐŊĐ¸Ņ Đ˛ĐĩĐą-API ĐŋОвĐĩŅŅ
Django, ŅŅĐžĐąŅ ŅĐģŅŅŅиŅŅ ĐĩĐŗĐž вОСĐŧĐžĐļĐŊĐžŅŅи в ŅаŅŅи API.
-DRF иŅĐŋĐžĐģŅСОваĐģŅŅ ĐŧĐŊĐžĐŗĐ¸Đŧи ĐēĐžĐŧĐŋаĐŊиŅĐŧи, вĐēĐģŅŅĐ°Ņ Mozilla, Red Hat и Eventbrite.
+ĐĐŊ иŅĐŋĐžĐģŅСŅĐĩŅŅŅ ĐŧĐŊĐžĐŗĐ¸Đŧи ĐēĐžĐŧĐŋаĐŊиŅĐŧи, вĐēĐģŅŅĐ°Ņ Mozilla, Red Hat и Eventbrite.
-ĐŅĐž ĐąŅĐģ ОдиĐŊ иС ĐŋĐĩŅвŅŅ
ĐŋŅиĐŧĐĩŅОв **авŅĐžĐŧаŅиŅĐĩŅĐēĐžĐŗĐž Đ´ĐžĐēŅĐŧĐĩĐŊŅиŅОваĐŊĐ¸Ņ API** и ŅŅĐž ĐąŅĐģа ОдĐŊа иС ĐŋĐĩŅвŅŅ
идĐĩĐš, вдОŅ
ĐŊОвивŅиŅ
ĐŊа ŅОСдаĐŊиĐĩ **FastAPI**.
+ĐŅĐž ĐąŅĐģ ОдиĐŊ иС ĐŋĐĩŅвŅŅ
ĐŋŅиĐŧĐĩŅОв **авŅĐžĐŧаŅиŅĐĩŅĐēОК Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии API**, и иĐŧĐĩĐŊĐŊĐž ŅŅа идĐĩŅ ĐžĐ´ĐŊОК иС ĐŋĐĩŅвŅŅ
вдОŅ
ĐŊОвиĐģа ĐŊа ÂĢĐŋОиŅĐēÂģ **FastAPI**.
/// note | ĐаĐŧĐĩŅĐēа
-Django REST Framework ĐąŅĐģ ŅОСдаĐŊ Tom Christie.
-ĐĐŊ ĐļĐĩ ŅОСдаĐģ Starlette и Uvicorn, ĐŊа ĐēĐžŅĐžŅŅŅ
ĐžŅĐŊОваĐŊ **FastAPI**.
+Django REST Framework ĐąŅĐģ ŅОСдаĐŊ ĐĸĐžĐŧĐžĐŧ ĐŅиŅŅи. ĐĐŊ ĐļĐĩ ŅОСдаĐģ Starlette и Uvicorn, ĐŊа ĐēĐžŅĐžŅŅŅ
ĐžŅĐŊОваĐŊ **FastAPI**.
///
-/// check | ĐĐ´ĐĩŅ Đ´ĐģŅ **FastAPI**
+/// check | ĐĐ´ĐžŅ
ĐŊОвиĐģĐž **FastAPI** ĐŊа
-ĐĐžĐģĐļĐŊĐž ĐąŅŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēĐžĐĩ ŅОСдаĐŊиĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии API Ņ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиĐŧ вĐĩĐą-иĐŊŅĐĩŅŅĐĩĐšŅĐžĐŧ.
+ĐаĐģиŅиĐĩ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēĐžĐŗĐž вĐĩĐą-иĐŊŅĐĩŅŅĐĩĐšŅа Ņ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēОК Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиĐĩĐš API.
///
-### Flask
+### Flask { #flask }
-Flask - ŅŅĐž "ĐŧиĐēŅĐžŅŅĐĩĐšĐŧвОŅĐē", в ĐŊŅĐŧ ĐŊĐĩŅ Đ¸ĐŊŅĐĩĐŗŅаŅии Ņ ĐąĐ°ĐˇĐ°Đŧи даĐŊĐŊŅŅ
и ĐŧĐŊĐžĐŗĐ¸Ņ
Đ´ŅŅĐŗĐ¸Ņ
вĐĩŅĐĩĐš, ĐēĐžŅĐžŅŅĐĩ ĐŋŅĐĩĐ´ŅŅŅаĐŊОвĐģĐĩĐŊŅ Đ˛ Django.
+Flask â ŅŅĐž ÂĢĐŧиĐēŅĐžŅŅĐĩĐšĐŧвОŅĐēÂģ, ĐžĐŊ ĐŊĐĩ вĐēĐģŅŅаĐĩŅ Đ¸ĐŊŅĐĩĐŗŅаŅии Ņ ĐąĐ°ĐˇĐ°Đŧи даĐŊĐŊŅŅ
и ĐŧĐŊĐžĐŗĐ¸Đĩ Đ´ŅŅĐŗĐ¸Đĩ вĐĩŅи, ĐēĐžŅĐžŅŅĐĩ в Django идŅŅ ÂĢиС ĐēĐžŅОйĐēиÂģ.
-ĐĐŗĐž ĐŋŅĐžŅŅĐžŅа и ĐŗĐ¸ĐąĐēĐžŅŅŅ Đ´Đ°ŅŅ ŅиŅĐžĐēиĐĩ вОСĐŧĐžĐļĐŊĐžŅŅи, ŅаĐēиĐĩ ĐēаĐē иŅĐŋĐžĐģŅСОваĐŊиĐĩ йаС даĐŊĐŊŅŅ
NoSQL в ĐēаŅĐĩŅŅвĐĩ ĐžŅĐŊОвĐŊОК ŅиŅŅĐĩĐŧŅ Ņ
ŅаĐŊĐĩĐŊĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
.
+ĐŅа ĐŋŅĐžŅŅĐžŅа и ĐŗĐ¸ĐąĐēĐžŅŅŅ ĐŋОСвОĐģŅĐĩŅ, ĐŊаĐŋŅиĐŧĐĩŅ, иŅĐŋĐžĐģŅСОваŅŅ NoSQL-ĐąĐ°ĐˇŅ Đ˛ ĐēаŅĐĩŅŅвĐĩ ĐžŅĐŊОвĐŊОК ŅиŅŅĐĩĐŧŅ Ņ
ŅаĐŊĐĩĐŊĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
.
-ĐĐŊ ĐžŅĐĩĐŊŅ ĐŋŅĐžŅŅ, ĐĩĐŗĐž иСŅŅĐĩĐŊиĐĩ иĐŊŅŅиŅивĐŊĐž ĐŋĐžĐŊŅŅĐŊĐž, Ņ
ĐžŅŅ Đ˛ ĐŊĐĩĐēĐžŅĐžŅŅŅ
ĐŧĐĩŅŅаŅ
Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ Đ´ĐžĐ˛ĐžĐģŅĐŊĐž ŅĐĩŅ
ĐŊиŅĐĩŅĐēаŅ.
+ĐĐŊ ĐžŅĐĩĐŊŅ ĐŋŅĐžŅŅ, ĐĩĐŗĐž ĐžŅĐŊĐžŅиŅĐĩĐģŅĐŊĐž ĐģĐĩĐŗĐēĐž иĐŊŅŅиŅивĐŊĐž ĐžŅвОиŅŅ, Ņ
ĐžŅŅ ĐŧĐĩŅŅаĐŧи Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ Đ´ĐžĐ˛ĐžĐģŅĐŊĐž ŅĐĩŅ
ĐŊиŅĐĩŅĐēаŅ.
-Flask ŅаŅŅĐž иŅĐŋĐžĐģŅСŅĐĩŅŅŅ Đ¸ Đ´ĐģŅ ĐŋŅиĐģĐžĐļĐĩĐŊиК, ĐēĐžŅĐžŅŅĐŧ ĐŊĐĩ ĐŊŅĐļĐŊа йаСа даĐŊĐŊŅŅ
, ĐŊаŅŅŅОКĐēи ĐŋŅав Đ´ĐžŅŅŅĐŋа Đ´ĐģŅ ĐŋĐžĐģŅСОваŅĐĩĐģĐĩĐš и ĐŋŅĐžŅиĐĩ иС ĐŧĐŊĐžĐļĐĩŅŅва ŅŅĐŊĐēŅиК, ĐŋŅĐĩдваŅиŅĐĩĐģŅĐŊĐž вŅŅŅĐžĐĩĐŊĐŊŅŅ
в Django.
-ĐĨĐžŅŅ ĐŧĐŊĐžĐŗĐ¸Đĩ иС ŅŅиŅ
ŅŅĐŊĐēŅиК ĐŧĐžĐŗŅŅ ĐąŅŅŅ Đ´ĐžĐąĐ°Đ˛ĐģĐĩĐŊŅ Ņ ĐŋĐžĐŧĐžŅŅŅ ĐŋĐģĐ°ĐŗĐ¸ĐŊОв.
+ĐĐŗĐž ŅаĐēĐļĐĩ ŅаŅŅĐž иŅĐŋĐžĐģŅСŅŅŅ Đ´ĐģŅ ĐŋŅиĐģĐžĐļĐĩĐŊиК, ĐēĐžŅĐžŅŅĐŧ ĐŊĐĩ ĐŊŅĐļĐŊа йаСа даĐŊĐŊŅŅ
, ŅĐŋŅавĐģĐĩĐŊиĐĩ ĐŋĐžĐģŅСОваŅĐĩĐģŅĐŧи иĐģи ĐŧĐŊĐžĐŗĐ¸Đĩ Đ´ŅŅĐŗĐ¸Đĩ ŅŅĐŊĐēŅии, ĐŋŅĐĩдваŅиŅĐĩĐģŅĐŊĐž вŅŅŅĐžĐĩĐŊĐŊŅĐĩ в Django. ĐĨĐžŅŅ ĐŧĐŊĐžĐŗĐ¸Đĩ иС ŅŅиŅ
вОСĐŧĐžĐļĐŊĐžŅŅĐĩĐš ĐŧĐžĐļĐŊĐž дОйавиŅŅ ĐŋĐģĐ°ĐŗĐ¸ĐŊаĐŧи.
-ĐĸаĐēĐžĐĩ ŅаСдĐĩĐģĐĩĐŊиĐĩ ĐŊа ŅаŅŅи и ŅĐž, ŅŅĐž ŅŅĐž "ĐŧиĐēŅĐžŅŅĐĩĐšĐŧвОŅĐē", ĐēĐžŅĐžŅŅĐš ĐŧĐžĐļĐŊĐž ŅаŅŅиŅиŅŅ, дОйавĐģŅŅ ĐŊĐĩОйŅ
ОдиĐŧŅĐĩ вОСĐŧĐžĐļĐŊĐžŅŅи, ĐąŅĐģĐž ĐēĐģŅŅĐĩвОК ĐžŅОйĐĩĐŊĐŊĐžŅŅŅŅ, ĐēĐžŅĐžŅŅŅ Ņ Ņ
ĐžŅĐĩĐģ ŅĐžŅ
ŅаĐŊиŅŅ.
+ĐĸаĐēĐžĐĩ ŅаСйиĐĩĐŊиĐĩ ĐŊа ŅаŅŅи и ŅĐž, ŅŅĐž ŅŅĐž ÂĢĐŧиĐēŅĐžŅŅĐĩĐšĐŧвОŅĐēÂģ, ĐēĐžŅĐžŅŅĐš ĐŧĐžĐļĐŊĐž ŅаŅŅиŅŅŅŅ ŅОвĐŊĐž ĐŋОд ĐŊŅĐļĐ´Ņ, â ĐēĐģŅŅĐĩĐ˛Đ°Ņ ĐžŅОйĐĩĐŊĐŊĐžŅŅŅ, ĐēĐžŅĐžŅŅŅ Ņ
ĐžŅĐĩĐģĐžŅŅ ŅĐžŅ
ŅаĐŊиŅŅ.
-ĐŅĐžŅŅĐžŅа Flask, ĐŋĐžĐēаСаĐģаŅŅ ĐŧĐŊĐĩ ĐŋОдŅ
ОдŅŅĐĩĐš Đ´ĐģŅ ŅОСдаĐŊĐ¸Ņ API.
-ĐĐž ĐĩŅŅ ĐŊŅĐļĐŊĐž ĐąŅĐģĐž ĐŊаКŅи "Django REST Framework" Đ´ĐģŅ Flask.
+ĐĄ ŅŅŅŅĐžĐŧ ĐŋŅĐžŅŅĐžŅŅ Flask ĐžĐŊ ĐēаСаĐģŅŅ Ņ
ĐžŅĐžŅиĐŧ ваŅиаĐŊŅĐžĐŧ Đ´ĐģŅ ŅОСдаĐŊĐ¸Ņ API. ĐĄĐģĐĩĐ´ŅŅŅиĐŧ ĐąŅĐģĐž ĐŊаКŅи ÂĢDjango REST FrameworkÂģ Đ´ĐģŅ Flask.
-/// check | ĐĐ´Đĩи Đ´ĐģŅ **FastAPI**
+/// check | ĐĐ´ĐžŅ
ĐŊОвиĐģĐž **FastAPI** ĐŊа
-ĐŅĐž ĐąŅĐ´ĐĩŅ ĐŧиĐēŅĐžŅŅĐĩĐšĐŧвОŅĐē. Đ ĐŊĐĩĐŧŅ ĐģĐĩĐŗĐēĐž ĐąŅĐ´ĐĩŅ Đ´ĐžĐąĐ°Đ˛Đ¸ŅŅ ĐŊĐĩОйŅ
ОдиĐŧŅĐĩ иĐŊŅŅŅŅĐŧĐĩĐŊŅŅ Đ¸ ŅаŅŅи.
+ĐŅŅŅ ĐŧиĐēŅĐž-ŅŅĐĩĐšĐŧвОŅĐēĐžĐŧ. ĐĐąĐģĐĩĐŗŅиŅŅ ĐēĐžĐŧйиĐŊиŅОваĐŊиĐĩ ĐŊĐĩОйŅ
ОдиĐŧŅŅ
иĐŊŅŅŅŅĐŧĐĩĐŊŅОв и ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅОв.
-ĐĐžĐģĐļĐŊа ĐąŅŅŅ ĐŋŅĐžŅŅĐ°Ņ Đ¸ ĐģŅĐŗĐēĐ°Ņ Đ˛ иŅĐŋĐžĐģŅСОваĐŊии ŅиŅŅĐĩĐŧа ĐŧаŅŅŅŅŅиСаŅии СаĐŋŅĐžŅОв.
+ĐĐŧĐĩŅŅ ĐŋŅĐžŅŅŅŅ Đ¸ ŅдОйĐŊŅŅ ŅиŅŅĐĩĐŧŅ ĐŧаŅŅŅŅŅиСаŅии.
///
-### Requests
+### Requests { #requests }
-Đа ŅаĐŧĐžĐŧ Đ´ĐĩĐģĐĩ **FastAPI** ĐŊĐĩ ŅвĐģŅĐĩŅŅŅ Đ°ĐģŅŅĐĩŅĐŊаŅивОК **Requests**.
-ĐŅ
ОйĐģаŅŅŅ ĐŋŅиĐŧĐĩĐŊĐĩĐŊĐ¸Ņ ĐžŅĐĩĐŊŅ ŅаСĐŊаŅ.
+**FastAPI** ĐŊа ŅаĐŧĐžĐŧ Đ´ĐĩĐģĐĩ ĐŊĐĩ аĐģŅŅĐĩŅĐŊаŅива **Requests**. ĐŅ
ОйĐģаŅŅи ĐŋŅиĐŧĐĩĐŊĐĩĐŊĐ¸Ņ ĐžŅĐĩĐŊŅ ŅаСĐģиŅĐŊŅ.
-Đ ĐŋŅиĐŊŅиĐŋĐĩ, ĐŧĐžĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ Requests *вĐŊŅŅŅи* ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ FastAPI.
+ĐĐąŅŅĐŊĐž Requests иŅĐŋĐžĐģŅСŅŅŅ Đ´Đ°ĐļĐĩ вĐŊŅŅŅи ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ FastAPI.
-ĐĐž вŅŅ ĐļĐĩ Ņ Đ¸ŅĐŋĐžĐģŅСОваĐģ в FastAPI ĐŊĐĩĐēĐžŅĐžŅŅĐĩ идĐĩи иС Requests.
+РвŅŅ ĐļĐĩ **FastAPI** вО ĐŧĐŊĐžĐŗĐžĐŧ вдОŅ
ĐŊОвĐģŅĐģŅŅ Requests.
-**Requests** - ŅŅĐž йийĐģиОŅĐĩĐēа Đ´ĐģŅ Đ˛ĐˇĐ°Đ¸ĐŧОдĐĩĐšŅŅĐ˛Đ¸Ņ Ņ API в ĐēаŅĐĩŅŅвĐĩ ĐēĐģиĐĩĐŊŅа,
-в ŅĐž вŅĐĩĐŧŅ ĐēаĐē **FastAPI** - ŅŅĐž йийĐģиОŅĐĩĐēа Đ´ĐģŅ *ŅОСдаĐŊиŅ* API (ŅĐž ĐĩŅŅŅ ŅĐĩŅвĐĩŅа).
+**Requests** â ŅŅĐž йийĐģиОŅĐĩĐēа Đ´ĐģŅ Đ˛ĐˇĐ°Đ¸ĐŧОдĐĩĐšŅŅĐ˛Đ¸Ņ Ņ API (ĐēаĐē ĐēĐģиĐĩĐŊŅ), а **FastAPI** â йийĐģиОŅĐĩĐēа Đ´ĐģŅ ŅОСдаĐŊĐ¸Ņ API (ĐēаĐē ŅĐĩŅвĐĩŅ).
-ĐĐŊи, ŅаĐē иĐģи иĐŊаŅĐĩ, диаĐŧĐĩŅŅаĐģŅĐŊĐž ĐŋŅĐžŅивОĐŋĐžĐģĐžĐļĐŊŅ Đ¸ Đ´ĐžĐŋĐžĐģĐŊŅŅŅ Đ´ŅŅĐŗ Đ´ŅŅĐŗĐ°.
+ĐĐŊи, в ĐēаĐēĐžĐŧ-ŅĐž ŅĐŧŅŅĐģĐĩ, ĐŊаŅ
ОдŅŅŅŅ ĐŊа ĐŋŅĐžŅивОĐŋĐžĐģĐžĐļĐŊŅŅ
ĐēĐžĐŊŅаŅ
и Đ´ĐžĐŋĐžĐģĐŊŅŅŅ Đ´ŅŅĐŗ Đ´ŅŅĐŗĐ°.
-Requests иĐŧĐĩĐĩŅ ĐžŅĐĩĐŊŅ ĐŋŅĐžŅŅОК и ĐŋĐžĐŊŅŅĐŊŅĐš диСаКĐŊ, ĐžŅĐĩĐŊŅ ĐŋŅĐžŅŅ Đ˛ иŅĐŋĐžĐģŅСОваĐŊии и иĐŧĐĩĐĩŅ ŅаСŅĐŧĐŊŅĐĩ СĐŊаŅĐĩĐŊĐ¸Ņ ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ.
-Рв ŅĐž ĐļĐĩ вŅĐĩĐŧŅ ĐžĐŊ ĐžŅĐĩĐŊŅ ĐŧĐžŅĐŊŅĐš и ĐŊаŅŅŅаиваĐĩĐŧŅĐš.
+Requests иĐŧĐĩĐĩŅ ĐžŅĐĩĐŊŅ ĐŋŅĐžŅŅОК и ĐŋĐžĐŊŅŅĐŊŅĐš диСаКĐŊ, иĐŧ ĐžŅĐĩĐŊŅ ĐģĐĩĐŗĐēĐž ĐŋĐžĐģŅСОваŅŅŅŅ, ĐĩŅŅŅ ŅаСŅĐŧĐŊŅĐĩ СĐŊаŅĐĩĐŊĐ¸Ņ ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ. Đ ĐŋŅи ŅŅĐžĐŧ ĐžĐŊ ĐžŅĐĩĐŊŅ ĐŧĐžŅĐŊŅĐš и ĐŊаŅŅŅаиваĐĩĐŧŅĐš.
-ĐĐžŅ ĐŋĐžŅĐĩĐŧŅ ĐŊа ĐžŅиŅиаĐģŅĐŊĐžĐŧ ŅаКŅĐĩ ĐŊаĐŋиŅаĐŊĐž:
+ĐĐŧĐĩĐŊĐŊĐž ĐŋĐžŅŅĐžĐŧŅ ĐŊа ĐžŅиŅиаĐģŅĐŊĐžĐŧ ŅаКŅĐĩ ŅĐēаСаĐŊĐž:
-> Requests - ОдиĐŊ иС ŅаĐŧŅŅ
ĐˇĐ°ĐŗŅŅĐļаĐĩĐŧŅŅ
ĐŋаĐēĐĩŅОв Python вŅĐĩŅ
вŅĐĩĐŧĐĩĐŊ
+> Requests â ОдиĐŊ иС ŅаĐŧŅŅ
ĐˇĐ°ĐŗŅŅĐļаĐĩĐŧŅŅ
Python-ĐŋаĐēĐĩŅОв вŅĐĩŅ
вŅĐĩĐŧŅĐŊ
-
-ĐŅĐŋĐžĐģŅСОваŅŅ ĐĩĐŗĐž ĐžŅĐĩĐŊŅ ĐŋŅĐžŅŅĐž. ĐаĐŋŅиĐŧĐĩŅ, ŅŅĐžĐąŅ Đ˛ŅĐŋĐžĐģĐŊиŅŅ ĐˇĐ°ĐŋŅĐžŅ `GET`, ĐŅ ĐąŅ ĐŊаĐŋиŅаĐģи:
+ĐĐžĐģŅСОваŅŅŅŅ Đ¸Đŧ ĐžŅĐĩĐŊŅ ĐŋŅĐžŅŅĐž. ĐаĐŋŅиĐŧĐĩŅ, ŅŅĐžĐąŅ ŅĐ´ĐĩĐģаŅŅ ĐˇĐ°ĐŋŅĐžŅ `GET`, Đ˛Ņ ĐąŅ ĐŊаĐŋиŅаĐģи:
```Python
response = requests.get("http://example.com/some/url")
```
-ĐŅĐžŅивОĐŋĐžĐģĐžĐļĐŊĐ°Ņ *ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи* в FastAPI ĐŧĐžĐļĐĩŅ Đ˛ŅĐŗĐģŅĐ´ĐĩŅŅ ŅĐģĐĩĐ´ŅŅŅиĐŧ ОйŅаСОĐŧ:
+ХООŅвĐĩŅŅŅвŅŅŅĐ°Ņ Đ˛ FastAPI API-ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи ĐŧĐžĐŗĐģа ĐąŅ Đ˛ŅĐŗĐģŅĐ´ĐĩŅŅ ŅаĐē:
```Python hl_lines="1"
@app.get("/some/url")
@@ -106,428 +96,390 @@ def read_url():
return {"message": "Hello World"}
```
-ĐĐģŅдиŅĐĩ, ĐēаĐē ĐŋĐžŅ
ĐžĐļĐĩ `requests.get(...)` и `@app.get(...)`.
+ĐĐžŅĐŧĐžŅŅиŅĐĩ, ĐŊаŅĐēĐžĐģŅĐēĐž ĐŋĐžŅ
ĐžĐļи `requests.get(...)` и `@app.get(...)`.
-/// check | ĐĐ´Đĩи Đ´ĐģŅ **FastAPI**
+/// check | ĐĐ´ĐžŅ
ĐŊОвиĐģĐž **FastAPI** ĐŊа
-* ĐĐžĐģĐļĐĩĐŊ ĐąŅŅŅ ĐŋŅĐžŅŅОК и ĐŋĐžĐŊŅŅĐŊŅĐš API.
-* ĐŅĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ ĐŊаСваĐŊĐ¸Ņ HTTP-ĐŧĐĩŅОдОв (ĐžĐŋĐĩŅаŅиК) Đ´ĐģŅ ŅĐŋŅĐžŅĐĩĐŊĐ¸Ņ ĐŋĐžĐŊиĐŧаĐŊĐ¸Ņ ĐŋŅОиŅŅ
ОдŅŅĐĩĐŗĐž.
-* ĐĐžĐģĐļĐŊŅ ĐąŅŅŅ ŅаСŅĐŧĐŊŅĐĩ ĐŊаŅŅŅОКĐēи ĐŋĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ Đ¸ ŅиŅĐžĐēиĐĩ вОСĐŧĐžĐļĐŊĐžŅŅи иŅ
ĐēаŅŅĐžĐŧиСаŅии.
+* ĐĐŧĐĩŅŅ ĐŋŅĐžŅŅОК и ĐŋĐžĐŊŅŅĐŊŅĐš API.
+* ĐŅĐŋĐžĐģŅСОваŅŅ ĐŊаСваĐŊĐ¸Ņ HTTP-ĐŧĐĩŅОдОв (ĐžĐŋĐĩŅаŅиК) ĐŊаĐŋŅŅĐŧŅŅ, ĐŋŅĐžŅŅŅĐŧ и иĐŊŅŅиŅивĐŊŅĐŧ ОйŅаСОĐŧ.
+* ĐĐŧĐĩŅŅ ŅаСŅĐŧĐŊŅĐĩ СĐŊаŅĐĩĐŊĐ¸Ņ ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ, ĐŊĐž и ĐŧĐžŅĐŊŅĐĩ ĐŊаŅŅŅОКĐēи.
///
-### Swagger / OpenAPI
+### Swagger / OpenAPI { #swagger-openapi }
-ĐĐģавĐŊОК ŅŅĐŊĐēŅиĐĩĐš, ĐēĐžŅĐžŅŅŅ Ņ Ņ
ĐžŅĐĩĐģ ŅĐŊаŅĐģĐĩдОваŅŅ ĐžŅ Django REST Framework, ĐąŅĐģа авŅĐžĐŧаŅиŅĐĩŅĐēĐ°Ņ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ API.
+ĐĐģавĐŊОК вОСĐŧĐžĐļĐŊĐžŅŅŅŅ, ĐēĐžŅĐžŅŅŅ Ņ
ĐžŅĐĩĐģĐžŅŅ Đ˛ĐˇŅŅŅ Đ¸Đˇ Django REST Framework, ĐąŅĐģа авŅĐžĐŧаŅиŅĐĩŅĐēĐ°Ņ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ API.
-ĐĐž ĐŋĐžŅĐžĐŧ Ņ ĐžĐąĐŊаŅŅĐļиĐģ, ŅŅĐž ŅŅŅĐĩŅŅвŅĐĩŅ ŅŅаĐŊдаŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅиŅОваĐŊĐ¸Ņ API, иŅĐŋĐžĐģŅСŅŅŅиК JSON (иĐģи YAML, ŅаŅŅиŅĐĩĐŊиĐĩ JSON) ĐŋОд ĐŊаСваĐŊиĐĩĐŧ Swagger.
+ĐаŅĐĩĐŧ Ņ ĐžĐąĐŊаŅŅĐļиĐģ, ŅŅĐž ĐĩŅŅŅ ŅŅаĐŊдаŅŅ Đ´ĐģŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅиŅОваĐŊĐ¸Ņ API Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩĐŧ JSON (иĐģи YAML â ŅаŅŅиŅĐĩĐŊĐ¸Ņ JSON), ĐŋОд ĐŊаСваĐŊиĐĩĐŧ Swagger.
-Đ Đē ĐŊĐĩĐŧŅ ŅĐļĐĩ ĐąŅĐģ ŅОСдаĐŊ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиК вĐĩĐą-иĐŊŅĐĩŅŅĐĩĐšŅ.
-ĐĸаĐēиĐŧ ОйŅаСОĐŧ, вОСĐŧĐžĐļĐŊĐžŅŅŅ ĐŗĐĩĐŊĐĩŅиŅОваŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ Swagger Đ´ĐģŅ API ĐŋОСвОĐģиĐģа ĐąŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ ŅŅĐžŅ Đ¸ĐŊŅĐĩŅŅĐĩĐšŅ.
+Đ ŅĐļĐĩ ŅŅŅĐĩŅŅвОваĐģ вĐĩĐą-иĐŊŅĐĩŅŅĐĩĐšŅ Đ´ĐģŅ Swagger API. ĐĐžŅŅĐžĐŧŅ Đ˛ĐžĐˇĐŧĐžĐļĐŊĐžŅŅŅ ĐŗĐĩĐŊĐĩŅиŅОваŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ Swagger Đ´ĐģŅ API ĐŋОСвОĐģиĐģа ĐąŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēи иŅĐŋĐžĐģŅСОваŅŅ ŅŅĐžŅ Đ˛ĐĩĐą-иĐŊŅĐĩŅŅĐĩĐšŅ.
Đ ĐēаĐēОК-ŅĐž ĐŧĐžĐŧĐĩĐŊŅ Swagger ĐąŅĐģ ĐŋĐĩŅĐĩдаĐŊ Linux Foundation и ĐŋĐĩŅĐĩиĐŧĐĩĐŊОваĐŊ в OpenAPI.
-ĐĐžŅ ĐŋĐžŅĐĩĐŧŅ, ĐēĐžĐŗĐ´Đ° ĐŗĐžĐ˛ĐžŅŅŅ Đž вĐĩŅŅии 2.0, ОйŅŅĐŊĐž ĐŗĐžĐ˛ĐžŅŅŅ "Swagger", а Đ´ĐģŅ Đ˛ĐĩŅŅии 3+ "OpenAPI".
+ĐĐžŅ ĐŋĐžŅĐĩĐŧŅ, ĐŗĐžĐ˛ĐžŅŅ Đž вĐĩŅŅии 2.0, ОйŅŅĐŊĐž ĐŗĐžĐ˛ĐžŅŅŅ ÂĢSwaggerÂģ, а Đž вĐĩŅŅии 3+ â ÂĢOpenAPIÂģ.
-/// check | ĐĐ´Đĩи Đ´ĐģŅ **FastAPI**
+/// check | ĐĐ´ĐžŅ
ĐŊОвиĐģĐž **FastAPI** ĐŊа
-ĐŅĐŋĐžĐģŅСОваŅŅ ĐžŅĐēŅŅŅŅĐĩ ŅŅаĐŊдаŅŅŅ Đ´ĐģŅ ŅĐŋĐĩŅиŅиĐēаŅиК API вĐŧĐĩŅŅĐž ŅаĐŧОдĐĩĐģŅĐŊŅŅ
ŅŅ
ĐĩĐŧ.
+ĐŅĐŋĐžĐģŅСОваŅŅ ĐžŅĐēŅŅŅŅĐš ŅŅаĐŊдаŅŅ Đ´ĐģŅ ŅĐŋĐĩŅиŅиĐēаŅиК API вĐŧĐĩŅŅĐž ŅаĐŧОдĐĩĐģŅĐŊОК ŅŅ
ĐĩĐŧŅ.
-ХОвĐŧĐĩŅŅиĐŧĐžŅŅŅ Ņ ĐžŅĐŊОваĐŊĐŊŅĐŧи ĐŊа ŅŅаĐŊдаŅŅаŅ
ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиĐŧи иĐŊŅĐĩŅŅĐĩĐšŅаĐŧи:
+РиĐŊŅĐĩĐŗŅиŅОваŅŅ ĐžŅĐŊОваĐŊĐŊŅĐĩ ĐŊа ŅŅаĐŊдаŅŅаŅ
иĐŊŅŅŅŅĐŧĐĩĐŊŅŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēĐžĐŗĐž иĐŊŅĐĩŅŅĐĩĐšŅа:
* Swagger UI
* ReDoc
-ĐĐŊи ĐąŅĐģи вŅĐąŅаĐŊŅ ĐˇĐ° ĐŋĐžĐŋŅĐģŅŅĐŊĐžŅŅŅ Đ¸ ŅŅайиĐģŅĐŊĐžŅŅŅ.
-ĐĐž ŅĐ´ĐĩĐģав ĐąĐĩĐŗĐģŅĐš ĐŋОиŅĐē, ĐŅ ĐŧĐžĐļĐĩŅĐĩ ĐŊаКŅи Đ´ĐĩŅŅŅĐēи аĐģŅŅĐĩŅĐŊаŅивĐŊŅŅ
ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиŅ
иĐŊŅĐĩŅŅĐĩĐšŅОв Đ´ĐģŅ OpenAPI, ĐēĐžŅĐžŅŅĐĩ ĐŅ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ Ņ **FastAPI**.
+ĐŅи два иĐŊŅŅŅŅĐŧĐĩĐŊŅа вŅĐąŅаĐŊŅ ĐˇĐ° ĐŋĐžĐŋŅĐģŅŅĐŊĐžŅŅŅ Đ¸ ŅŅайиĐģŅĐŊĐžŅŅŅ, ĐŊĐž даĐļĐĩ ĐŋŅи ĐąĐĩĐŗĐģĐžĐŧ ĐŋОиŅĐēĐĩ ĐŧĐžĐļĐŊĐž ĐŊаКŅи Đ´ĐĩŅŅŅĐēи аĐģŅŅĐĩŅĐŊаŅивĐŊŅŅ
иĐŊŅĐĩŅŅĐĩĐšŅОв Đ´ĐģŅ OpenAPI (ĐēĐžŅĐžŅŅĐĩ ĐŧĐžĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ Ņ **FastAPI**).
///
-### REST ŅŅĐĩĐšĐŧвОŅĐēи Đ´ĐģŅ Flask
+### REST-ŅŅĐĩĐšĐŧвОŅĐēи Đ´ĐģŅ Flask { #flask-rest-frameworks }
-ĐĄŅŅĐĩŅŅвŅĐĩŅ ĐŊĐĩŅĐēĐžĐģŅĐēĐž REST ŅŅĐĩĐšĐŧвОŅĐēОв Đ´ĐģŅ Flask, ĐŊĐž ĐŋĐžŅŅаŅив вŅĐĩĐŧŅ Đ¸ ŅŅиĐģĐ¸Ņ ĐŊа иŅ
иСŅŅĐĩĐŊиĐĩ, Ņ ĐžĐąĐŊаŅŅĐļиĐģ, ŅŅĐž ĐŧĐŊĐžĐŗĐ¸Đĩ иС ĐŊиŅ
ĐŊĐĩ ОйĐŊОвĐģŅŅŅŅŅ Đ¸Đģи СайŅĐžŅĐĩĐŊŅ Đ¸ иĐŧĐĩŅŅ ĐŊĐĩŅĐĩŅŅĐŊĐŊŅĐĩ ĐŋŅОйĐģĐĩĐŧŅ Đ¸Đˇ-Са ĐēĐžŅĐžŅŅŅ
ĐžĐŊи ĐŊĐĩĐŋŅĐ¸ĐŗĐžĐ´ĐŊŅ Đē иŅĐŋĐžĐģŅСОваĐŊиŅ.
+ĐĄŅŅĐĩŅŅвŅĐĩŅ ĐŊĐĩŅĐēĐžĐģŅĐēĐž REST-ŅŅĐĩĐšĐŧвОŅĐēОв Đ´ĐģŅ Flask, ĐŊĐž, вĐģĐžĐļив вŅĐĩĐŧŅ Đ¸ ŅŅиĐģĐ¸Ņ Đ˛ иŅŅĐģĐĩдОваĐŊиĐĩ, Ņ ĐžĐąĐŊаŅŅĐļиĐģ, ŅŅĐž ĐŧĐŊĐžĐŗĐ¸Đĩ иС ĐŊиŅ
ĐŋŅĐĩĐēŅаŅĐĩĐŊŅ Đ¸Đģи СайŅĐžŅĐĩĐŊŅ, Ņ ĐŊĐĩŅĐēĐžĐģŅĐēиĐŧи ĐŊĐĩŅĐĩŅŅĐŊĐŊŅĐŧи Issue (ŅиĐēĐĩŅ\ОйŅаŅĐĩĐŊиĐĩ), иС-Са ĐēĐžŅĐžŅŅŅ
ĐžĐŊи ĐŊĐĩĐŋŅĐ¸ĐŗĐžĐ´ĐŊŅ.
-### Marshmallow
+### Marshmallow { #marshmallow }
-ĐĐ´ĐŊОК иС ĐžŅĐŊОвĐŊŅŅ
ŅŅĐŊĐēŅиК, ĐŊĐĩОйŅ
ОдиĐŧŅŅ
ŅиŅŅĐĩĐŧаĐŧ API, ŅвĐģŅĐĩŅŅŅ "ŅĐĩŅиаĐģиСаŅиŅ" даĐŊĐŊŅŅ
, ŅĐž ĐĩŅŅŅ ĐŋŅĐĩОйŅаСОваĐŊиĐĩ даĐŊĐŊŅŅ
иС ĐēОда (Python) вО ŅŅĐž-ŅĐž, ŅŅĐž ĐŧĐžĐļĐĩŅ ĐąŅŅŅ ĐžŅĐŋŅавĐģĐĩĐŊĐž ĐŋĐž ŅĐĩŅи.
-ĐаĐŋŅиĐŧĐĩŅ, ĐŋŅĐĩвŅаŅĐĩĐŊиĐĩ ОйŅĐĩĐēŅа ŅОдĐĩŅĐļаŅĐĩĐŗĐž даĐŊĐŊŅĐĩ иС ĐąĐ°ĐˇŅ Đ´Đ°ĐŊĐŊŅŅ
в ОйŅĐĩĐēŅ JSON, ĐēĐžĐŊвĐĩŅŅаŅĐ¸Ņ ĐžĐąŅĐĩĐēŅа `datetime` в ŅŅŅĐžĐēŅ Đ¸ Ņ.Đŋ.
+ĐĐ´ĐŊа иС ĐžŅĐŊОвĐŊŅŅ
вОСĐŧĐžĐļĐŊĐžŅŅĐĩĐš, ĐŊŅĐļĐŊŅŅ
ŅиŅŅĐĩĐŧаĐŧ API, â ÂĢŅĐĩŅиаĐģиСаŅиŅÂģ даĐŊĐŊŅŅ
, ŅĐž ĐĩŅŅŅ ĐŋŅĐĩОйŅаСОваĐŊиĐĩ даĐŊĐŊŅŅ
иС ĐēОда (Python) вО ŅŅĐž-ŅĐž, ŅŅĐž ĐŧĐžĐļĐŊĐž ĐžŅĐŋŅавиŅŅ ĐŋĐž ŅĐĩŅи. ĐаĐŋŅиĐŧĐĩŅ, ĐŋŅĐĩОйŅаСОваĐŊиĐĩ ОйŅĐĩĐēŅа Ņ Đ´Đ°ĐŊĐŊŅĐŧи иС ĐąĐ°ĐˇŅ Đ˛ JSON-ОйŅĐĩĐēŅ. ĐŅĐĩОйŅаСОваĐŊиĐĩ ОйŅĐĩĐēŅОв `datetime` в ŅŅŅĐžĐēи и Ņ. Đŋ.
-ĐŅĐĩ ОдĐŊа ваĐļĐŊĐ°Ņ ŅŅĐŊĐēŅиŅ, ĐŊĐĩОйŅ
ОдиĐŧĐ°Ņ API â ĐŋŅОвĐĩŅĐēа даĐŊĐŊŅŅ
, ĐŋОСвОĐģŅŅŅĐ°Ņ ŅĐąĐĩдиŅŅŅŅ, ŅŅĐž даĐŊĐŊŅĐĩ Đ´ĐĩĐšŅŅвиŅĐĩĐģŅĐŊŅ Đ¸ ŅООŅвĐĩŅŅŅвŅŅŅ ĐˇĐ°Đ´Đ°ĐŊĐŊŅĐŧ ĐŋаŅаĐŧĐĩŅŅаĐŧ.
-ĐаĐē ĐŋŅиĐŧĐĩŅ, ĐŧĐžĐļĐŊĐž ŅĐēаСаŅŅ, ŅŅĐž ĐžĐļидаŅŅŅŅ Đ´Đ°ĐŊĐŊŅĐĩ ŅиĐŋа `int`, а ĐŊĐĩ ĐēаĐēаŅ-ŅĐž ĐŋŅОиСвОĐģŅĐŊĐ°Ņ ŅŅŅĐžĐēа.
-ĐŅĐž ĐžŅОйĐĩĐŊĐŊĐž ĐŋĐžĐģĐĩСĐŊĐž Đ´ĐģŅ Đ˛Ņ
ОдŅŅиŅ
даĐŊĐŊŅŅ
.
+ĐŅŅ ĐžĐ´ĐŊа ваĐļĐŊĐ°Ņ Đ˛ĐžĐˇĐŧĐžĐļĐŊĐžŅŅŅ, вОŅŅŅĐĩйОваĐŊĐŊĐ°Ņ API, â ваĐģидаŅĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
: ŅĐąĐĩĐļдаŅŅŅŅ, ŅŅĐž даĐŊĐŊŅĐĩ ваĐģидĐŊŅ Ņ ŅŅŅŅĐžĐŧ СадаĐŊĐŊŅŅ
ĐŋаŅаĐŧĐĩŅŅОв. ĐаĐŋŅиĐŧĐĩŅ, ŅŅĐž ĐēаĐēĐžĐĩ-ŅĐž ĐŋĐžĐģĐĩ â `int`, а ĐŊĐĩ ĐŋŅОиСвОĐģŅĐŊĐ°Ņ ŅŅŅĐžĐēа. ĐŅĐž ĐžŅОйĐĩĐŊĐŊĐž ĐŋĐžĐģĐĩСĐŊĐž Đ´ĐģŅ Đ˛Ņ
ОдŅŅиŅ
даĐŊĐŊŅŅ
.
-ĐĐĩС ŅиŅŅĐĩĐŧŅ ĐŋŅОвĐĩŅĐēи даĐŊĐŊŅŅ
ĐаĐŧ ĐŋŅиŅĐģĐžŅŅ ĐąŅ ĐŋŅĐžĐŋиŅŅваŅŅ Đ˛ŅĐĩ ĐŋŅОвĐĩŅĐēи вŅŅŅĐŊŅŅ.
+ĐĐĩС ŅиŅŅĐĩĐŧŅ Đ˛Đ°ĐģидаŅии даĐŊĐŊŅŅ
ваĐŧ ĐŋŅиŅĐģĐžŅŅ ĐąŅ Đ˛ŅĐŋĐžĐģĐŊŅŅŅ Đ˛ŅĐĩ ĐŋŅОвĐĩŅĐēи вŅŅŅĐŊŅŅ Đ˛ ĐēОдĐĩ.
-ĐĐŧĐĩĐŊĐŊĐž Đ´ĐģŅ ĐžĐąĐĩŅĐŋĐĩŅĐĩĐŊĐ¸Ņ ŅŅиŅ
ŅŅĐŊĐēŅиК и ĐąŅĐģа ŅОСдаĐŊа Marshmallow.
-ĐŅĐž ĐžŅĐģиŅĐŊĐ°Ņ ĐąĐ¸ĐąĐģиОŅĐĩĐēа и Ņ ĐŧĐŊĐžĐŗĐž ŅаС ĐŋĐžĐģŅСОваĐģŅŅ ĐĩŅ ŅаĐŊŅŅĐĩ.
+ĐĐŧĐĩĐŊĐŊĐž Đ´ĐģŅ ŅŅиŅ
вОСĐŧĐžĐļĐŊĐžŅŅĐĩĐš и ĐąŅĐģ ŅОСдаĐŊ Marshmallow. ĐŅĐž ĐžŅĐģиŅĐŊĐ°Ņ ĐąĐ¸ĐąĐģиОŅĐĩĐēа, Ņ ĐŧĐŊĐžĐŗĐž ĐĩĐš ĐŋĐžĐģŅСОваĐģŅŅ ŅаĐŊŅŅĐĩ.
-ĐĐž ĐžĐŊа ĐąŅĐģа ŅОСдаĐŊа Đ´Đž ŅĐžĐŗĐž, ĐēаĐē ĐŋĐžŅвиĐģиŅŅ ĐŋОдŅĐēаСĐēи ŅиĐŋОв Python.
-ĐŅаĐē, ŅŅĐžĐąŅ ĐžĐŋŅĐĩĐ´ĐĩĐģиŅŅ ĐēаĐļĐ´ŅŅ ŅŅ
ĐĩĐŧŅ,
-ĐаĐŧ ĐŊŅĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ ĐžĐŋŅĐĩĐ´ĐĩĐģĐĩĐŊĐŊŅĐĩ ŅŅиĐģиŅŅ Đ¸ ĐēĐģаŅŅŅ, ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩĐŧŅĐĩ Marshmallow.
+ĐĐž ĐžĐŊа ĐŋĐžŅвиĐģаŅŅ Đ´Đž ŅĐžĐŗĐž, ĐēаĐē в Python ĐŋĐžŅвиĐģиŅŅ Đ°ĐŊĐŊĐžŅаŅии ŅиĐŋОв. ĐĐžŅŅĐžĐŧŅ Đ´ĐģŅ ĐžĐŋŅĐĩĐ´ĐĩĐģĐĩĐŊĐ¸Ņ ĐēаĐļдОК ŅŅ
ĐĩĐŧŅ ĐŊŅĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ ŅĐŋĐĩŅиаĐģŅĐŊŅĐĩ ŅŅиĐģиŅŅ Đ¸ ĐēĐģаŅŅŅ, ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩĐŧŅĐĩ Marshmallow.
-/// check | ĐĐ´ĐĩŅ Đ´ĐģŅ **FastAPI**
+/// check | ĐĐ´ĐžŅ
ĐŊОвиĐģĐž **FastAPI** ĐŊа
-ĐŅĐŋĐžĐģŅСОваŅŅ ĐēОд ĐŋŅĐžĐŗŅаĐŧĐŧŅ Đ´ĐģŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēĐžĐŗĐž ŅОСдаĐŊĐ¸Ņ "ŅŅ
ĐĩĐŧ", ĐžĐŋŅĐĩĐ´ĐĩĐģŅŅŅиŅ
ŅиĐŋŅ Đ´Đ°ĐŊĐŊŅŅ
и иŅ
ĐŋŅОвĐĩŅĐēŅ.
+ĐŅĐŋĐžĐģŅСОваŅŅ ĐēОд Đ´ĐģŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēĐžĐŗĐž ĐžĐŋŅĐĩĐ´ĐĩĐģĐĩĐŊĐ¸Ņ ÂĢŅŅ
ĐĩĐŧÂģ, СадаŅŅиŅ
ŅиĐŋŅ Đ´Đ°ĐŊĐŊŅŅ
и иŅ
ваĐģидаŅиŅ.
///
-### Webargs
+### Webargs { #webargs }
-ĐŅŅĐŗĐ°Ņ ĐŊĐĩĐŧаĐģОваĐļĐŊĐ°Ņ ŅŅĐŊĐēŅĐ¸Ņ API - ĐŋаŅŅиĐŊĐŗ даĐŊĐŊŅŅ
иС вŅ
ОдŅŅиŅ
СаĐŋŅĐžŅОв.
+ĐŅŅ ĐžĐ´ĐŊа ваĐļĐŊĐ°Ņ Đ˛ĐžĐˇĐŧĐžĐļĐŊĐžŅŅŅ Đ´ĐģŅ API â ĐŋаŅŅиĐŊĐŗ даĐŊĐŊŅŅ
иС вŅ
ОдŅŅиŅ
HTTP-СаĐŋŅĐžŅОв.
-Webargs - ŅŅĐž иĐŊŅŅŅŅĐŧĐĩĐŊŅ, ĐēĐžŅĐžŅŅĐš ĐąŅĐģ ŅОСдаĐŊ Đ´ĐģŅ ŅŅĐžĐŗĐž и ĐŋОддĐĩŅĐļиваĐĩŅ ĐŊĐĩŅĐēĐžĐģŅĐēĐž ŅŅĐĩĐšĐŧвОŅĐēОв, вĐēĐģŅŅĐ°Ņ Flask.
+Webargs â ŅŅĐž иĐŊŅŅŅŅĐŧĐĩĐŊŅ, ŅОСдаĐŊĐŊŅĐš Đ´ĐģŅ ŅŅĐžĐŗĐž ĐŋОвĐĩŅŅ
ĐŊĐĩŅĐēĐžĐģŅĐēиŅ
ŅŅĐĩĐšĐŧвОŅĐēОв, вĐēĐģŅŅĐ°Ņ Flask.
-ĐĐģŅ ĐŋŅОвĐĩŅĐēи даĐŊĐŊŅŅ
ĐžĐŊ иŅĐŋĐžĐģŅСŅĐĩŅ Marshmallow и ŅОСдаĐŊ ŅĐĩĐŧи ĐļĐĩ авŅĐžŅаĐŧи.
+ĐĐŊ иŅĐŋĐžĐģŅСŅĐĩŅ Marshmallow Đ´ĐģŅ Đ˛Đ°ĐģидаŅии даĐŊĐŊŅŅ
. Đ ŅОСдаĐŊ ŅĐĩĐŧи ĐļĐĩ ŅаСŅайОŅŅиĐēаĐŧи.
-ĐŅĐž ĐŋŅĐĩвОŅŅ
ОдĐŊŅĐš иĐŊŅŅŅŅĐŧĐĩĐŊŅ Đ¸ Ņ ŅĐžĐļĐĩ ŅаŅŅĐž ĐŋĐžĐģŅСОваĐģŅŅ Đ¸Đŧ Đ´Đž **FastAPI**.
+ĐŅĐž ĐžŅĐģиŅĐŊŅĐš иĐŊŅŅŅŅĐŧĐĩĐŊŅ, и Ņ ŅĐžĐļĐĩ ĐŧĐŊĐžĐŗĐž иĐŧ ĐŋĐžĐģŅСОваĐģŅŅ Đ´Đž ĐŋĐžŅвĐģĐĩĐŊĐ¸Ņ **FastAPI**.
/// info | ĐĐŊŅĐžŅĐŧаŅиŅ
-Webargs ĐąŅ ŅОСдаĐŊ ŅаСŅайОŅŅиĐēаĐŧи Marshmallow.
+Webargs ĐąŅĐģ ŅОСдаĐŊ ŅĐĩĐŧи ĐļĐĩ ŅаСŅайОŅŅиĐēаĐŧи, ŅŅĐž и Marshmallow.
///
-/// check | ĐĐ´ĐĩŅ Đ´ĐģŅ **FastAPI**
+/// check | ĐĐ´ĐžŅ
ĐŊОвиĐģĐž **FastAPI** ĐŊа
-ĐĐžĐģĐļĐŊа ĐąŅŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēĐ°Ņ ĐŋŅОвĐĩŅĐēа вŅ
ОдĐŊŅŅ
даĐŊĐŊŅŅ
.
+ĐвŅĐžĐŧаŅиŅĐĩŅĐēŅŅ Đ˛Đ°ĐģидаŅĐ¸Ņ Đ˛Ņ
ОдŅŅиŅ
даĐŊĐŊŅŅ
HTTP-СаĐŋŅĐžŅа.
///
-### APISpec
+### APISpec { #apispec }
-Marshmallow и Webargs ĐžŅŅŅĐĩŅŅвĐģŅŅŅ ĐŋŅОвĐĩŅĐēŅ, аĐŊаĐģиС и ŅĐĩŅиаĐģиСаŅĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
ĐēаĐē ĐŋĐģĐ°ĐŗĐ¸ĐŊŅ.
+Marshmallow и Webargs ĐŋŅĐĩĐ´ĐžŅŅавĐģŅŅŅ Đ˛Đ°ĐģидаŅиŅ, ĐŋаŅŅиĐŊĐŗ и ŅĐĩŅиаĐģиСаŅĐ¸Ņ ĐēаĐē ĐŋĐģĐ°ĐŗĐ¸ĐŊŅ.
-ĐĐž Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии API вŅŅ ĐĩŅŅ ĐŊĐĩ ĐąŅĐģĐž. ĐĸĐžĐŗĐ´Đ° ĐąŅĐģ ŅОСдаĐŊ APISpec.
+ĐĐž Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии вŅŅ ĐĩŅŅ ĐŊĐĩ ĐąŅĐģĐž. ĐĸĐžĐŗĐ´Đ° ĐŋĐžŅвиĐģŅŅ APISpec.
-ĐŅĐž ĐŋĐģĐ°ĐŗĐ¸ĐŊ Đ´ĐģŅ ĐŧĐŊĐžĐļĐĩŅŅва ŅŅĐĩĐšĐŧвОŅĐēОв, в ŅĐžĐŧ ŅиŅĐģĐĩ и Đ´ĐģŅ Starlette.
+ĐŅĐž ĐŋĐģĐ°ĐŗĐ¸ĐŊ Đ´ĐģŅ ĐŧĐŊĐžĐŗĐ¸Ņ
ŅŅĐĩĐšĐŧвОŅĐēОв (ĐĩŅŅŅ ĐŋĐģĐ°ĐŗĐ¸ĐŊ и Đ´ĐģŅ Starlette).
-ĐĐŊ ŅайОŅаĐĩŅ ŅаĐē - ĐŅ ĐˇĐ°ĐŋиŅŅваĐĩŅĐĩ ĐžĐŋŅĐĩĐ´ĐĩĐģĐĩĐŊиĐĩ ŅŅ
ĐĩĐŧ, иŅĐŋĐžĐģŅСŅŅ ŅĐžŅĐŧĐ°Ņ YAML, вĐŊŅŅŅи Đ´ĐžĐēŅŅŅиĐŊĐŗĐ° ĐēаĐļдОК ŅŅĐŊĐēŅии, ОйŅайаŅŅваŅŅĐĩĐš ĐŧаŅŅŅŅŅ.
+ĐĐŊ ŅайОŅаĐĩŅ ŅаĐē: Đ˛Ņ ĐŋиŅĐĩŅĐĩ ĐžĐŋŅĐĩĐ´ĐĩĐģĐĩĐŊиĐĩ ŅŅ
ĐĩĐŧŅ Đ˛ ŅĐžŅĐŧаŅĐĩ YAML вĐŊŅŅŅи Đ´ĐžĐēŅŅŅиĐŊĐŗĐ° ĐēаĐļдОК ŅŅĐŊĐēŅии, ОйŅайаŅŅваŅŅĐĩĐš ĐŧаŅŅŅŅŅ.
-ĐŅĐŋĐžĐģŅСŅŅ ŅŅи Đ´ĐžĐēŅŅŅиĐŊĐŗĐ¸, ĐžĐŊ ĐŗĐĩĐŊĐĩŅиŅŅĐĩŅ ŅŅ
ĐĩĐŧŅ OpenAPI.
+Đ ĐžĐŊ ĐŗĐĩĐŊĐĩŅиŅŅĐĩŅ ŅŅ
ĐĩĐŧŅ OpenAPI.
-ĐĸаĐē ŅŅĐž ŅайОŅаĐĩŅ Đ´ĐģŅ Flask, Starlette, Responder и Ņ.Đŋ.
+ĐĸаĐē ŅŅĐž ŅайОŅаĐĩŅ Đ˛Đž Flask, Starlette, Responder и Ņ. Đ´.
-ĐĐž ŅĐĩĐŋĐĩŅŅ Ņ ĐŊĐ°Ņ Đ˛ĐžĐˇĐŊиĐēаĐĩŅ ĐŊĐžĐ˛Đ°Ņ ĐŋŅОйĐģĐĩĐŧа - ĐŊаĐģиŅиĐĩ ĐŋĐžŅŅĐžŅĐžĐŊĐŊĐĩĐŗĐž ĐŧиĐēŅĐž-ŅиĐŊŅаĐēŅиŅа вĐŊŅŅŅи ĐēОда Python (йОĐģŅŅиĐĩ YAML).
+ĐĐž Ņ ĐŊĐ°Ņ ŅĐŊОва вОСĐŊиĐēаĐĩŅ ĐŋŅОйĐģĐĩĐŧа: ĐŋĐžŅвĐģŅĐĩŅŅŅ ĐŧиĐēŅĐž-ŅиĐŊŅаĐēŅĐ¸Ņ Đ˛ĐŊŅŅŅи ŅŅŅĐžĐēи Python (йОĐģŅŅОК YAML).
-Đ ĐĩдаĐēŅĐžŅ ĐēОда ĐŊĐĩ ĐžŅОйО ĐŧĐžĐļĐĩŅ ĐŋĐžĐŧĐžŅŅ Đ˛ ŅаĐēОК ĐŋаŅĐ°Đ´Đ¸ĐŗĐŧĐĩ.
-РиСĐŧĐĩĐŊив ĐēаĐēиĐĩ-ŅĐž ĐŋаŅаĐŧĐĩŅŅŅ Đ¸Đģи ŅŅ
ĐĩĐŧŅ Đ´ĐģŅ Marshmallow ĐŧĐžĐļĐŊĐž СайŅŅŅ ĐžŅŅĐĩдаĐēŅиŅОваŅŅ Đ´ĐžĐēŅŅŅиĐŊĐŗ Ņ YAML и ŅĐŗĐĩĐŊĐĩŅиŅОваĐŊĐŊĐ°Ņ ŅŅ
ĐĩĐŧа ŅŅаĐŊОвиŅŅŅ ĐŊĐĩĐ´ĐĩĐšŅŅвиŅĐĩĐģŅĐŊОК.
+Đ ĐĩдаĐēŅĐžŅ ĐēОда ĐŧаĐģĐž ŅĐĩĐŧ ĐŧĐžĐļĐĩŅ ĐŋĐžĐŧĐžŅŅ. Đ ĐĩŅĐģи ĐŧŅ Đ¸ĐˇĐŧĐĩĐŊиĐŧ ĐŋаŅаĐŧĐĩŅŅŅ Đ¸Đģи ŅŅ
ĐĩĐŧŅ Marshmallow и СайŅĐ´ĐĩĐŧ ŅаĐēĐļĐĩ иСĐŧĐĩĐŊиŅŅ YAML в Đ´ĐžĐēŅŅŅиĐŊĐŗĐĩ, ŅĐŗĐĩĐŊĐĩŅиŅОваĐŊĐŊĐ°Ņ ŅŅ
ĐĩĐŧа ŅŅŅаŅĐĩĐĩŅ.
/// info | ĐĐŊŅĐžŅĐŧаŅиŅ
-APISpec ŅĐžĐļĐĩ ĐąŅĐģ ŅОСдаĐŊ авŅĐžŅаĐŧи Marshmallow.
+APISpec ĐąŅĐģ ŅОСдаĐŊ ŅĐĩĐŧи ĐļĐĩ ŅаСŅайОŅŅиĐēаĐŧи, ŅŅĐž и Marshmallow.
///
-/// check | ĐĐ´ĐĩŅ Đ´ĐģŅ **FastAPI**
+/// check | ĐĐ´ĐžŅ
ĐŊОвиĐģĐž **FastAPI** ĐŊа
-ĐĐĩОйŅ
ОдиĐŧа ĐŋОддĐĩŅĐļĐēа ĐžŅĐēŅŅŅĐžĐŗĐž ŅŅаĐŊдаŅŅа Đ´ĐģŅ API - OpenAPI.
+ĐОддĐĩŅĐļĐēŅ ĐžŅĐēŅŅŅĐžĐŗĐž ŅŅаĐŊдаŅŅа Đ´ĐģŅ API â OpenAPI.
///
-### Flask-apispec
+### Flask-apispec { #flask-apispec }
-ĐŅĐž ĐŋĐģĐ°ĐŗĐ¸ĐŊ Đ´ĐģŅ Flask, ĐēĐžŅĐžŅŅĐš ŅвŅСаĐŊ Ņ Webargs, Marshmallow и APISpec.
+ĐŅĐž ĐŋĐģĐ°ĐŗĐ¸ĐŊ Đ´ĐģŅ Flask, ĐēĐžŅĐžŅŅĐš ŅвŅСŅваĐĩŅ Webargs, Marshmallow и APISpec.
-ĐĐŊ ĐŋĐžĐģŅŅаĐĩŅ Đ¸ĐŊŅĐžŅĐŧаŅĐ¸Ņ ĐžŅ Webargs и Marshmallow, а СаŅĐĩĐŧ иŅĐŋĐžĐģŅСŅĐĩŅ APISpec Đ´ĐģŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēĐžĐŗĐž ŅОСдаĐŊĐ¸Ņ ŅŅ
ĐĩĐŧŅ OpenAPI.
+ĐĐŊ иŅĐŋĐžĐģŅСŅĐĩŅ Đ¸ĐŊŅĐžŅĐŧаŅĐ¸Ņ Đ¸Đˇ Webargs и Marshmallow, ŅŅĐžĐąŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēи ĐŗĐĩĐŊĐĩŅиŅОваŅŅ ŅŅ
ĐĩĐŧŅ OpenAPI Ņ ĐŋĐžĐŧĐžŅŅŅ APISpec.
-ĐŅĐž ĐžŅĐģиŅĐŊŅĐš, ĐŊĐž ĐēŅаКĐŊĐĩ ĐŊĐĩдООŅĐĩĐŊŅĐŊĐŊŅĐš иĐŊŅŅŅŅĐŧĐĩĐŊŅ.
-ĐĐŊ Đ´ĐžĐģĐļĐĩĐŊ ĐąŅŅŅ ĐąĐžĐģĐĩĐĩ ĐŋĐžĐŋŅĐģŅŅĐĩĐŊ, ŅĐĩĐŧ ĐŧĐŊĐžĐŗĐ¸Đĩ ĐŋĐģĐ°ĐŗĐ¸ĐŊŅ Đ´ĐģŅ Flask.
-ĐОСĐŧĐžĐļĐŊĐž, ŅŅĐž ŅвŅСаĐŊĐž Ņ ŅĐĩĐŧ, ŅŅĐž ĐĩĐŗĐž Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ ŅĐģиŅĐēĐžĐŧ ŅĐēŅĐ´ĐŊа и айŅŅŅаĐēŅĐŊа.
+ĐŅĐģиŅĐŊŅĐš и ĐŊĐĩдООŅĐĩĐŊŅĐŊĐŊŅĐš иĐŊŅŅŅŅĐŧĐĩĐŊŅ. ĐĐŊ СаŅĐģŅĐļиваĐĩŅ ĐąĐžĐģŅŅĐĩĐš ĐŋĐžĐŋŅĐģŅŅĐŊĐžŅŅи, ŅĐĩĐŧ ĐŧĐŊĐžĐŗĐ¸Đĩ ĐŋĐģĐ°ĐŗĐ¸ĐŊŅ Đ´ĐģŅ Flask. ĐОСĐŧĐžĐļĐŊĐž, иС-Са ŅĐģиŅĐēĐžĐŧ ĐēŅаŅĐēОК и айŅŅŅаĐēŅĐŊОК Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии.
-ĐĐŊ иСйавиĐģ ĐžŅ ĐŊĐĩОйŅ
ОдиĐŧĐžŅŅи ĐŋиŅаŅŅ ŅŅĐļĐĩŅОдĐŊŅĐš ŅиĐŊŅаĐēŅĐ¸Ņ YAML вĐŊŅŅŅи Đ´ĐžĐēŅŅŅиĐŊĐŗĐžĐ˛.
+ĐŅĐž ŅĐĩŅиĐģĐž ĐŋŅОйĐģĐĩĐŧŅ ĐŊĐĩОйŅ
ОдиĐŧĐžŅŅи ĐŋиŅаŅŅ YAML (ĐĩŅŅ ĐžĐ´Đ¸ĐŊ ŅиĐŊŅаĐēŅиŅ) в Đ´ĐžĐēŅŅŅиĐŊĐŗĐ°Ņ
Python.
-ĐĸаĐēĐžĐĩ ŅĐžŅĐĩŅаĐŊиĐĩ Flask, Flask-apispec, Marshmallow и Webargs ĐąŅĐģĐž ĐŧОиĐŧ ĐģŅйиĐŧŅĐŧ ŅŅĐĩĐēĐžĐŧ ĐŋŅи ĐŋĐžŅŅŅĐžĐĩĐŊии ĐąŅĐēĐĩĐŊда Đ´Đž ĐŋĐžŅвĐģĐĩĐŊĐ¸Ņ **FastAPI**.
+ĐĐžĐŧйиĐŊаŅĐ¸Ņ Flask, Flask-apispec Ņ Marshmallow и Webargs ĐąŅĐģа ĐŧОиĐŧ ĐģŅйиĐŧŅĐŧ ĐąŅĐēĐĩĐŊĐ´-ŅŅĐĩĐēĐžĐŧ Đ´Đž ŅОСдаĐŊĐ¸Ņ **FastAPI**.
-ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ ŅŅĐžĐŗĐž ŅŅĐĩĐēа ĐŋŅивĐĩĐģĐž Đē ŅОСдаĐŊĐ¸Ņ ĐŊĐĩŅĐēĐžĐģŅĐēиŅ
ĐŗĐĩĐŊĐĩŅаŅĐžŅОв ĐŋŅĐžĐĩĐēŅОв. Đ¯ и ĐŊĐĩĐēĐžŅĐžŅŅĐĩ Đ´ŅŅĐŗĐ¸Đĩ ĐēĐžĐŧаĐŊĐ´Ņ Đ´Đž ŅиŅ
ĐŋĐžŅ Đ¸ŅĐŋĐžĐģŅСŅĐĩĐŧ иŅ
:
+ĐĐŗĐž иŅĐŋĐžĐģŅСОваĐŊиĐĩ ĐŋŅивĐĩĐģĐž Đē ŅОСдаĐŊĐ¸Ņ ĐŊĐĩŅĐēĐžĐģŅĐēиŅ
full-stack ĐŗĐĩĐŊĐĩŅаŅĐžŅОв ĐŊа Flask. ĐŅĐž ĐžŅĐŊОвĐŊŅĐĩ ŅŅĐĩĐēи, ĐēĐžŅĐžŅŅĐĩ Ņ (и ĐŊĐĩŅĐēĐžĐģŅĐēĐž вĐŊĐĩŅĐŊиŅ
ĐēĐžĐŧаĐŊĐ´) иŅĐŋĐžĐģŅСОваĐģи Đ´Đž ŅиŅ
ĐŋĐžŅ:
* https://github.com/tiangolo/full-stack
* https://github.com/tiangolo/full-stack-flask-couchbase
* https://github.com/tiangolo/full-stack-flask-couchdb
-ĐŅи ĐŗĐĩĐŊĐĩŅаŅĐžŅŅ ĐŋŅĐžĐĩĐēŅОв ŅаĐēĐļĐĩ ŅŅаĐģи ĐžŅĐŊОвОК Đ´ĐģŅ [ĐĐĩĐŊĐĩŅаŅĐžŅОв ĐŋŅĐžĐĩĐēŅОв Ņ **FastAPI**](project-generation.md){.internal-link target=_blank}.
+Đ ŅŅи ĐļĐĩ full-stack ĐŗĐĩĐŊĐĩŅаŅĐžŅŅ ŅŅаĐģи ĐžŅĐŊОвОК Đ´ĐģŅ [ĐĐĩĐŊĐĩŅаŅĐžŅОв ĐŋŅĐžĐĩĐēŅОв **FastAPI**](project-generation.md){.internal-link target=_blank}.
/// info | ĐĐŊŅĐžŅĐŧаŅиŅ
-ĐаĐē ĐŊи ŅŅŅаĐŊĐŊĐž, ĐŊĐž Flask-apispec ŅĐžĐļĐĩ ŅОСдаĐŊ авŅĐžŅаĐŧи Marshmallow.
+Flask-apispec ĐąŅĐģ ŅОСдаĐŊ ŅĐĩĐŧи ĐļĐĩ ŅаСŅайОŅŅиĐēаĐŧи, ŅŅĐž и Marshmallow.
///
-/// check | ĐĐ´ĐĩŅ Đ´ĐģŅ **FastAPI**
+/// check | ĐĐ´ĐžŅ
ĐŊОвиĐģĐž **FastAPI** ĐŊа
-ĐĄŅ
ĐĩĐŧа OpenAPI Đ´ĐžĐģĐļĐŊа ŅОСдаваŅŅŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēи и иŅĐŋĐžĐģŅСОваŅŅ ŅĐžŅ ĐļĐĩ ĐēОд, ĐēĐžŅĐžŅŅĐš ĐžŅŅŅĐĩŅŅвĐģŅĐĩŅ ŅĐĩŅиаĐģиСаŅĐ¸Ņ Đ¸ ĐŋŅОвĐĩŅĐēŅ Đ´Đ°ĐŊĐŊŅŅ
.
+ĐвŅĐžĐŧаŅиŅĐĩŅĐēŅŅ ĐŗĐĩĐŊĐĩŅаŅĐ¸Ņ ŅŅ
ĐĩĐŧŅ OpenAPI иС ŅĐžĐŗĐž ĐļĐĩ ĐēОда, ĐēĐžŅĐžŅŅĐš ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐĩŅ ŅĐĩŅиаĐģиСаŅĐ¸Ņ Đ¸ ваĐģидаŅиŅ.
///
-### NestJS (и Angular)
+### NestJS (и Angular) { #nestjs-and-angular }
-ĐĐ´ĐĩŅŅ Đ´Đ°ĐļĐĩ ĐŊĐĩ иŅĐŋĐžĐģŅСŅĐĩŅŅŅ Python. NestJS - ŅŅĐžŅ ŅŅĐĩĐšĐŧвОŅĐē ĐŊаĐŋиŅаĐŊĐŊŅĐš ĐŊа JavaScript (TypeScript), ĐžŅĐŊОваĐŊĐŊŅĐš ĐŊа NodeJS и вдОŅ
ĐŊОвĐģŅĐŊĐŊŅĐš Angular.
+ĐŅĐž даĐļĐĩ ĐŊĐĩ Python. NestJS â ŅŅĐž JavaScript/TypeScript-ŅŅĐĩĐšĐŧвОŅĐē ĐŊа NodeJS, вдОŅ
ĐŊОвĐģŅĐŊĐŊŅĐš Angular.
-ĐĐŊ ĐŋОСвОĐģŅĐĩŅ ĐŋĐžĐģŅŅиŅŅ ĐŊĐĩŅŅĐž ĐŋĐžŅ
ĐžĐļĐĩĐĩ ĐŊа ŅĐž, ŅŅĐž ĐŧĐžĐļĐŊĐž ŅĐ´ĐĩĐģаŅŅ Ņ ĐŋĐžĐŧĐžŅŅŅ Flask-apispec.
+ĐĐŊ Đ´ĐžŅŅĐ¸ĐŗĐ°ĐĩŅ ŅĐĩĐŗĐž-ŅĐž ĐžŅŅаŅŅи ĐŋĐžŅ
ĐžĐļĐĩĐŗĐž ĐŊа ŅĐž, ŅŅĐž ĐŧĐžĐļĐŊĐž ŅĐ´ĐĩĐģаŅŅ Ņ Flask-apispec.
-Đ ĐŊĐĩĐŗĐž вŅŅŅĐžĐĩĐŊа ŅиŅŅĐĩĐŧа вĐŊĐĩĐ´ŅĐĩĐŊĐ¸Ņ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅĐĩĐš, ĐĩŅŅ ĐžĐ´ĐŊа идĐĩŅ Đ˛ĐˇŅŅĐ°Ņ ĐžŅ Angular.
-ĐĐ´ĐŊаĐēĐž ŅŅĐĩĐąŅĐĩŅŅŅ ĐŋŅĐĩдваŅиŅĐĩĐģŅĐŊĐ°Ņ ŅĐĩĐŗĐ¸ŅŅŅаŅĐ¸Ņ "вĐŊĐĩĐ´ŅĐĩĐŊиК" (ĐēаĐē и вО вŅĐĩŅ
Đ´ŅŅĐŗĐ¸Ņ
иСвĐĩŅŅĐŊŅŅ
ĐŧĐŊĐĩ ŅиŅŅĐĩĐŧаŅ
вĐŊĐĩĐ´ŅĐĩĐŊĐ¸Ņ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅĐĩĐš), ŅŅĐž ŅвĐĩĐģиŅиваĐĩŅ ĐēĐžĐģиŅĐĩŅŅвО и ĐŋОвŅĐžŅŅĐĩĐŧĐžŅŅŅ ĐēОда.
+Đ ĐŊŅĐŧ вŅŅŅĐžĐĩĐŊа ŅиŅŅĐĩĐŧа вĐŊĐĩĐ´ŅĐĩĐŊĐ¸Ņ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅĐĩĐš, вдОŅ
ĐŊОвĐģŅĐŊĐŊĐ°Ņ Angular 2. ĐĸŅĐĩĐąŅĐĩŅŅŅ ĐŋŅĐĩдваŅиŅĐĩĐģŅĐŊĐ°Ņ ŅĐĩĐŗĐ¸ŅŅŅаŅĐ¸Ņ ÂĢиĐŊĐļĐĩĐēŅиŅŅĐĩĐŧŅŅ
Âģ ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅОв (ĐēаĐē и вО вŅĐĩŅ
иСвĐĩŅŅĐŊŅŅ
ĐŧĐŊĐĩ ŅиŅŅĐĩĐŧаŅ
вĐŊĐĩĐ´ŅĐĩĐŊĐ¸Ņ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅĐĩĐš), ŅŅĐž дОйавĐģŅĐĩŅ ĐŧĐŊĐžĐŗĐžŅĐģОвĐŊĐžŅŅи и ĐŋОвŅĐžŅŅĐĩĐŧĐžŅŅи ĐēОда.
-ĐĸаĐē ĐēаĐē ĐŋаŅаĐŧĐĩŅŅŅ Đ˛ ĐŊŅĐŧ ĐžĐŋиŅŅваŅŅŅŅ Ņ ĐŋĐžĐŧĐžŅŅŅ ŅиĐŋОв TypeScript (аĐŊаĐģĐžĐŗĐ¸ŅĐŊĐž ĐŋОдŅĐēаСĐēаĐŧ ŅиĐŋОв в Python), ĐŋОддĐĩŅĐļĐēа ŅĐĩдаĐēŅĐžŅа ŅайОŅаĐĩŅ Đ´ĐžĐ˛ĐžĐģŅĐŊĐž Ņ
ĐžŅĐžŅĐž.
+ĐĐžŅĐēĐžĐģŅĐēŅ ĐŋаŅаĐŧĐĩŅŅŅ ĐžĐŋиŅŅваŅŅŅŅ Ņ ĐŋĐžĐŧĐžŅŅŅ ŅиĐŋОв TypeScript (аĐŊаĐģĐžĐŗ аĐŊĐŊĐžŅаŅиК ŅиĐŋОв в Python), ĐŋОддĐĩŅĐļĐēа ŅĐĩдаĐēŅĐžŅа вĐĩŅŅĐŧа Ņ
ĐžŅĐžŅа.
-ĐĐž ĐŋĐžŅĐēĐžĐģŅĐēŅ Đ´Đ°ĐŊĐŊŅĐĩ иС TypeScript ĐŊĐĩ ŅĐžŅ
ŅаĐŊŅŅŅŅŅ ĐŋĐžŅĐģĐĩ ĐēĐžĐŧĐŋиĐģŅŅии в JavaScript, ĐžĐŊ ĐŊĐĩ ĐŧĐžĐļĐĩŅ ĐŋĐžĐģĐ°ĐŗĐ°ŅŅŅŅ ĐŊа ĐŋОдŅĐēаСĐēи ŅиĐŋОв Đ´ĐģŅ ĐžĐŋŅĐĩĐ´ĐĩĐģĐĩĐŊĐ¸Ņ ĐŋŅОвĐĩŅĐēи даĐŊĐŊŅŅ
, ŅĐĩŅиаĐģиСаŅии и Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии.
-ĐС-Са ŅŅĐžĐŗĐž и ĐŊĐĩĐēĐžŅĐžŅŅŅ
диСаКĐŊĐĩŅŅĐēиŅ
ŅĐĩŅĐĩĐŊиК, Đ´ĐģŅ Đ˛Đ°ĐģидаŅии, ŅĐĩŅиаĐģиСаŅии и авŅĐžĐŧаŅиŅĐĩŅĐēОК ĐŗĐĩĐŊĐĩŅаŅии ŅŅ
ĐĩĐŧ, ĐŋŅиŅ
ОдиŅŅŅ Đ˛Đž ĐŧĐŊĐžĐŗĐ¸Ņ
ĐŧĐĩŅŅаŅ
дОйавĐģŅŅŅ Đ´ĐĩĐēĐžŅаŅĐžŅŅ.
-ĐĸаĐēиĐŧ ОйŅаСОĐŧ, ŅŅĐž ŅŅаĐŊОвиŅŅŅ Đ´ĐžĐ˛ĐžĐģŅĐŊĐž ĐŧĐŊĐžĐŗĐžŅĐģОвĐŊŅĐŧ.
+ĐĐž ŅаĐē ĐēаĐē даĐŊĐŊŅĐĩ Đž ŅиĐŋаŅ
TypeScript ĐŊĐĩ ŅĐžŅ
ŅаĐŊŅŅŅŅŅ ĐŋĐžŅĐģĐĩ ĐēĐžĐŧĐŋиĐģŅŅии в JavaScript, ĐžĐŊ ĐŊĐĩ ĐŧĐžĐļĐĩŅ ĐŋĐžĐģĐ°ĐŗĐ°ŅŅŅŅ ĐŊа ŅиĐŋŅ Đ´ĐģŅ ĐžĐ´ĐŊОвŅĐĩĐŧĐĩĐŊĐŊĐžĐŗĐž ĐžĐŋŅĐĩĐ´ĐĩĐģĐĩĐŊĐ¸Ņ Đ˛Đ°ĐģидаŅии, ŅĐĩŅиаĐģиСаŅии и Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии. ĐСâСа ŅŅĐžĐŗĐž и ĐŊĐĩĐēĐžŅĐžŅŅŅ
ĐŋŅĐžĐĩĐēŅĐŊŅŅ
ŅĐĩŅĐĩĐŊиК Đ´ĐģŅ ĐŋĐžĐģŅŅĐĩĐŊĐ¸Ņ Đ˛Đ°ĐģидаŅии, ŅĐĩŅиаĐģиСаŅии и авŅĐžĐŧаŅиŅĐĩŅĐēОК ĐŗĐĩĐŊĐĩŅаŅии ŅŅ
ĐĩĐŧ ĐŋŅиŅ
ОдиŅŅŅ Đ´ĐžĐąĐ°Đ˛ĐģŅŅŅ Đ´ĐĩĐēĐžŅаŅĐžŅŅ Đ˛Đž ĐŧĐŊĐžĐŗĐ¸Ņ
ĐŧĐĩŅŅаŅ
. РиŅĐžĐŗĐĩ ŅŅĐž ŅŅаĐŊОвиŅŅŅ Đ´ĐžĐ˛ĐžĐģŅĐŊĐž ĐŧĐŊĐžĐŗĐžŅĐģОвĐŊŅĐŧ.
-ĐŅĐžĐŧĐĩ ŅĐžĐŗĐž, ĐžĐŊ ĐŊĐĩ ĐžŅĐĩĐŊŅ Ņ
ĐžŅĐžŅĐž ŅĐŋŅавĐģŅĐĩŅŅŅ Ņ Đ˛ĐģĐžĐļĐĩĐŊĐŊŅĐŧи ĐŧОдĐĩĐģŅĐŧи.
-ĐŅĐģи в СаĐŋŅĐžŅĐĩ иĐŧĐĩĐĩŅŅŅ ĐžĐąŅĐĩĐēŅ JSON, вĐŊŅŅŅĐĩĐŊĐŊиĐĩ ĐŋĐžĐģŅ ĐēĐžŅĐžŅĐžĐŗĐž, в ŅĐ˛ĐžŅ ĐžŅĐĩŅĐĩĐ´Ņ, ŅвĐģŅŅŅŅŅ Đ˛ĐģĐžĐļĐĩĐŊĐŊŅĐŧи ОйŅĐĩĐēŅаĐŧи JSON, ŅŅĐž ĐŊĐĩ ĐŧĐžĐļĐĩŅ ĐąŅŅŅ Đ´ĐžĐģĐļĐŊŅĐŧ ОйŅаСОĐŧ СадОĐēŅĐŧĐĩĐŊŅиŅОваĐŊĐž и ĐŋŅОвĐĩŅĐĩĐŊĐž.
+ĐĐŊ ĐŋĐģĐžŅ
Đž ŅĐŋŅавĐģŅĐĩŅŅŅ Ņ Đ˛ĐģĐžĐļĐĩĐŊĐŊŅĐŧи ĐŧОдĐĩĐģŅĐŧи. ĐŅĐģи JSON-ŅĐĩĐģĐž СаĐŋŅĐžŅа â ŅŅĐž ОйŅĐĩĐēŅ JSON, ŅОдĐĩŅĐļаŅиК вĐŊŅŅŅĐĩĐŊĐŊиĐĩ ĐŋĐžĐģŅ, ĐēĐžŅĐžŅŅĐĩ ŅаĐŧи ŅвĐģŅŅŅŅŅ Đ˛ĐģĐžĐļĐĩĐŊĐŊŅĐŧи ОйŅĐĩĐēŅаĐŧи JSON, ŅŅĐž ĐŊĐĩĐģŅĐˇŅ ĐēаĐē ŅĐģĐĩĐ´ŅĐĩŅ ĐˇĐ°Đ´ĐžĐēŅĐŧĐĩĐŊŅиŅОваŅŅ Đ¸ ĐŋŅОваĐģидиŅОваŅŅ.
-/// check | ĐĐ´Đĩи Đ´ĐģŅ **FastAPI**
+/// check | ĐĐ´ĐžŅ
ĐŊОвиĐģĐž **FastAPI** ĐŊа
-ĐŅĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ ĐŋОдŅĐēаСĐēи ŅиĐŋОв, ŅŅОй вОŅĐŋĐžĐģŅСОваŅŅŅŅ ĐŋОддĐĩŅĐļĐēОК ŅĐĩдаĐēŅĐžŅа ĐēОда.
+ĐŅĐŋĐžĐģŅСОваŅŅ ŅиĐŋŅ Python Đ´ĐģŅ ĐžŅĐģиŅĐŊОК ĐŋОддĐĩŅĐļĐēи в ŅĐĩдаĐēŅĐžŅĐĩ ĐēОда.
-ĐŅĐļĐŊа ĐŧĐžŅĐŊĐ°Ņ ŅиŅŅĐĩĐŧа вĐŊĐĩĐ´ŅĐĩĐŊĐ¸Ņ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅĐĩĐš. ĐĐĩОйŅ
ОдиĐŧ ŅĐŋĐžŅОй Đ´ĐģŅ ŅĐŧĐĩĐŊŅŅĐĩĐŊĐ¸Ņ ĐŋОвŅĐžŅОв ĐēОда.
+ĐĐŧĐĩŅŅ ĐŧĐžŅĐŊŅŅ ŅиŅŅĐĩĐŧŅ Đ˛ĐŊĐĩĐ´ŅĐĩĐŊĐ¸Ņ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅĐĩĐš. ĐаКŅи ŅĐŋĐžŅОй ĐŧиĐŊиĐŧиСиŅОваŅŅ ĐŋОвŅĐžŅĐĩĐŊиĐĩ ĐēОда.
///
-### Sanic
+### Sanic { #sanic }
-Sanic ĐąŅĐģ ОдĐŊиĐŧ иС ĐŋĐĩŅвŅŅ
ŅŅĐĩСвŅŅаКĐŊĐž ĐąŅŅŅŅŅŅ
Python-ŅŅĐĩĐšĐŧвОŅĐēОв ĐžŅĐŊОваĐŊĐŊŅŅ
ĐŊа `asyncio`.
-ĐĐŊ ĐąŅĐģ ŅĐ´ĐĩĐģаĐŊ ĐžŅĐĩĐŊŅ ĐŋĐžŅ
ĐžĐļиĐŧ ĐŊа Flask.
+ĐŅĐž ĐąŅĐģ ОдиĐŊ иС ĐŋĐĩŅвŅŅ
ŅŅĐĩСвŅŅаКĐŊĐž ĐąŅŅŅŅŅŅ
Python-ŅŅĐĩĐšĐŧвОŅĐēОв ĐŊа ĐžŅĐŊОвĐĩ `asyncio`. ĐĐŊ ĐąŅĐģ ŅĐ´ĐĩĐģаĐŊ ĐžŅĐĩĐŊŅ ĐŋĐžŅ
ĐžĐļиĐŧ ĐŊа Flask.
/// note | ĐĸĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ Đ´ĐĩŅаĐģи
-Đ ĐŊŅĐŧ иŅĐŋĐžĐģŅСОваĐŊ `uvloop` вĐŧĐĩŅŅĐž ŅŅаĐŊдаŅŅĐŊĐžĐŗĐž ŅиĐēĐģа ŅОйŅŅиК `asyncio`, ŅŅĐž и ŅĐ´ĐĩĐģаĐģĐž ĐĩĐŗĐž ŅаĐēиĐŧ ĐąŅŅŅŅŅĐŧ.
+ĐĐŊ иŅĐŋĐžĐģŅСОваĐģ `uvloop` вĐŧĐĩŅŅĐž ŅŅаĐŊдаŅŅĐŊĐžĐŗĐž ŅиĐēĐģа `asyncio` в Python. ĐŅĐž и ŅĐ´ĐĩĐģаĐģĐž ĐĩĐŗĐž ŅаĐēиĐŧ ĐąŅŅŅŅŅĐŧ.
-ĐĐŊ ŅвĐŊĐž вдОŅ
ĐŊОвиĐģ ŅОСдаŅĐĩĐģĐĩĐš Uvicorn и Starlette, ĐēĐžŅĐžŅŅĐĩ в ĐŊаŅŅĐžŅŅĐĩĐĩ вŅĐĩĐŧŅ ĐąŅŅŅŅĐĩĐĩ Sanic в ĐžŅĐēŅŅŅŅŅ
ĐąĐĩĐŊŅĐŧаŅĐēаŅ
.
+ĐĐŊ ŅвĐŊĐž вдОŅ
ĐŊОвиĐģ Uvicorn и Starlette, ĐēĐžŅĐžŅŅĐĩ ŅĐĩĐšŅĐ°Ņ ĐąŅŅŅŅĐĩĐĩ Sanic в ĐžŅĐēŅŅŅŅŅ
ĐąĐĩĐŊŅĐŧаŅĐēаŅ
.
///
-/// check | ĐĐ´Đĩи Đ´ĐģŅ **FastAPI**
+/// check | ĐĐ´ĐžŅ
ĐŊОвиĐģĐž **FastAPI** ĐŊа
-ĐĐžĐģĐļĐŊа ĐąŅŅŅ ŅŅĐŧаŅŅĐĩĐ´ŅĐ°Ņ ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅŅ.
+ĐОиŅĐē ŅĐŋĐžŅОйа Đ´ĐžŅŅиŅŅ ŅŅĐŧаŅŅĐĩĐ´ŅĐĩĐš ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅи.
-ĐĐģŅ ŅŅĐžĐŗĐž **FastAPI** ĐžŅĐŊОваĐŊ ĐŊа Starlette, ŅаĐŧĐžĐŧ ĐąŅŅŅŅĐžĐŧ иС Đ´ĐžŅŅŅĐŋĐŊŅŅ
ŅŅĐĩĐšĐŧвОŅĐēОв (ĐŋĐž СаĐŧĐĩŅаĐŧ ĐŊĐĩСаиĐŊŅĐĩŅĐĩŅОваĐŊĐŊŅŅ
ĐģиŅ).
+ĐĐŧĐĩĐŊĐŊĐž ĐŋĐžŅŅĐžĐŧŅ **FastAPI** ĐžŅĐŊОваĐŊ ĐŊа Starlette, ŅаĐē ĐēаĐē ŅŅĐž ŅаĐŧŅĐš ĐąŅŅŅŅŅĐš Đ´ĐžŅŅŅĐŋĐŊŅĐš ŅŅĐĩĐšĐŧвОŅĐē (ĐŋĐž даĐŊĐŊŅĐŧ ŅŅĐžŅĐžĐŊĐŊиŅ
ĐąĐĩĐŊŅĐŧаŅĐēОв).
///
-### Falcon
+### Falcon { #falcon }
-Falcon - ĐĩŅŅ ĐžĐ´Đ¸ĐŊ вŅŅĐžĐēĐžĐŋŅОиСвОдиŅĐĩĐģŅĐŊŅĐš Python-ŅŅĐĩĐšĐŧвОŅĐē.
-Đ ĐŊŅĐŧ ĐŧиĐŊиĐŧŅĐŧ ŅŅĐŊĐēŅиК и ĐžĐŊ ŅОСдаĐŊ, ŅŅОй ĐąŅŅŅ ĐžŅĐŊОвОК Đ´ĐģŅ Đ´ŅŅĐŗĐ¸Ņ
ŅŅĐĩĐšĐŧвОŅĐēОв, ĐŊаĐŋŅиĐŧĐĩŅ, Hug.
+Falcon â ĐĩŅŅ ĐžĐ´Đ¸ĐŊ вŅŅĐžĐēĐžĐŋŅОиСвОдиŅĐĩĐģŅĐŊŅĐš Python-ŅŅĐĩĐšĐŧвОŅĐē, ĐžĐŊ ĐŧиĐŊиĐŧаĐģиŅŅиŅĐĩĐŊ и ŅĐģŅĐļĐ¸Ņ ĐžŅĐŊОвОК Đ´ĐģŅ Đ´ŅŅĐŗĐ¸Ņ
ŅŅĐĩĐšĐŧвОŅĐēОв, ŅаĐēиŅ
ĐēаĐē Hug.
-ФŅĐŊĐēŅии в ĐŊŅĐŧ ĐŋĐžĐģŅŅаŅŅ Đ´Đ˛Đ° ĐŋаŅаĐŧĐĩŅŅа - "СаĐŋŅĐžŅ Đē ŅĐĩŅвĐĩŅŅ" и "ĐžŅвĐĩŅ ŅĐĩŅвĐĩŅа".
-ĐаŅĐĩĐŧ ĐŅ "ŅиŅаĐĩŅĐĩ" ŅаŅŅŅ ĐˇĐ°ĐŋŅĐžŅа и "ĐŋиŅиŅĐĩ" ŅаŅŅŅ ĐžŅвĐĩŅа.
-ĐС-Са ŅаĐēОК ĐēĐžĐŊŅŅŅŅĐēŅии ĐŊĐĩвОСĐŧĐžĐļĐŊĐž ОйŅŅвиŅŅ ĐŋаŅаĐŧĐĩŅŅŅ ĐˇĐ°ĐŋŅĐžŅа и ŅĐĩĐģа ŅООйŅĐĩĐŊĐ¸Ņ ŅĐž ŅŅаĐŊдаŅŅĐŊŅĐŧи ĐŋОдŅĐēаСĐēаĐŧи ŅиĐŋОв Python в ĐēаŅĐĩŅŅвĐĩ ĐŋаŅаĐŧĐĩŅŅОв ŅŅĐŊĐēŅии.
+ĐĐŊ ŅĐŋŅĐžĐĩĐēŅиŅОваĐŊ ŅаĐē, ŅŅĐž ŅŅĐŊĐēŅии ĐŋĐžĐģŅŅаŅŅ Đ´Đ˛Đ° ĐŋаŅаĐŧĐĩŅŅа: ÂĢrequestÂģ и ÂĢresponseÂģ. ĐаŅĐĩĐŧ Đ˛Ņ ÂĢŅиŅаĐĩŅĐĩÂģ ŅаŅŅи иС СаĐŋŅĐžŅа и ÂĢĐŋиŅĐĩŅĐĩÂģ ŅаŅŅи в ĐžŅвĐĩŅ. ĐСâСа ŅаĐēĐžĐŗĐž диСаКĐŊа ĐŊĐĩвОСĐŧĐžĐļĐŊĐž ОйŅŅвиŅŅ ĐŋаŅаĐŧĐĩŅŅŅ ĐˇĐ°ĐŋŅĐžŅа и ŅĐĩĐģĐž СаĐŋŅĐžŅа ŅŅаĐŊдаŅŅĐŊŅĐŧи аĐŊĐŊĐžŅаŅиŅĐŧи ŅиĐŋОв Python ĐēаĐē ĐŋаŅаĐŧĐĩŅŅŅ ŅŅĐŊĐēŅии.
-ĐĸаĐēиĐŧ ОйŅаСОĐŧ, и ваĐģидаŅĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
, и иŅ
ŅĐĩŅиаĐģиСаŅиŅ, и Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ ĐŊŅĐļĐŊĐž ĐŋŅĐžĐŋиŅŅваŅŅ Đ˛ŅŅŅĐŊŅŅ.
-ĐийО ŅŅи ŅŅĐŊĐēŅии Đ´ĐžĐģĐļĐŊŅ ĐąŅŅŅ Đ˛ŅŅŅĐžĐĩĐŊŅ Đ˛Đž ŅŅĐĩĐšĐŧвОŅĐē, ŅĐēĐžĐŊŅŅŅŅиŅОваĐŊĐŊŅĐš ĐŋОвĐĩŅŅ
Falcon, ĐēаĐē в Hug.
-ĐĸаĐēĐ°Ņ ĐļĐĩ ĐžŅОйĐĩĐŊĐŊĐžŅŅŅ ĐŋŅиŅŅŅŅŅвŅĐĩŅ Đ¸ в Đ´ŅŅĐŗĐ¸Ņ
ŅŅĐĩĐšĐŧвОŅĐēаŅ
, вдОŅ
ĐŊОвĐģŅĐŊĐŊŅŅ
идĐĩĐĩĐš Falcon, иŅĐŋĐžĐģŅСОваŅŅ ŅĐžĐģŅĐēĐž ОдиĐŊ ОйŅĐĩĐēŅ ĐˇĐ°ĐŋŅĐžŅа и ОдиĐŊ ОйŅĐĩĐēŅ ĐžŅвĐĩŅа.
+ĐĐžŅŅĐžĐŧŅ Đ˛Đ°ĐģидаŅĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
, ŅĐĩŅиаĐģиСаŅĐ¸Ņ Đ¸ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ Đ´ĐžĐģĐļĐŊŅ Đ˛ŅĐŋĐžĐģĐŊŅŅŅŅŅ Đ˛ ĐēОдĐĩ вŅŅŅĐŊŅŅ, ĐŊĐĩ авŅĐžĐŧаŅиŅĐĩŅĐēи. ĐийО Đ´ĐžĐģĐļĐŊŅ ĐąŅŅŅ ŅĐĩаĐģиСОваĐŊŅ Đ˛Đž ŅŅĐĩĐšĐŧвОŅĐēĐĩ ĐŋОвĐĩŅŅ
Falcon, ĐēаĐē в Hug. Đĸа ĐļĐĩ ĐžŅОйĐĩĐŊĐŊĐžŅŅŅ ĐĩŅŅŅ Đ¸ в Đ´ŅŅĐŗĐ¸Ņ
ŅŅĐĩĐšĐŧвОŅĐēаŅ
, вдОŅ
ĐŊОвĐģŅĐŊĐŊŅŅ
диСаКĐŊĐžĐŧ Falcon â Ņ ĐžĐ´ĐŊиĐŧ ОйŅĐĩĐēŅĐžĐŧ СаĐŋŅĐžŅа и ОдĐŊиĐŧ ОйŅĐĩĐēŅĐžĐŧ ĐžŅвĐĩŅа в ĐŋаŅаĐŧĐĩŅŅаŅ
.
-/// check | ĐĐ´ĐĩŅ Đ´ĐģŅ **FastAPI**
+/// check | ĐĐ´ĐžŅ
ĐŊОвиĐģĐž **FastAPI** ĐŊа
-ĐаКдиŅĐĩ ŅĐŋĐžŅĐžĐąŅ Đ´ĐžĐąĐ¸ŅŅŅŅ ĐžŅĐģиŅĐŊОК ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅи.
+ĐОиŅĐē ŅĐŋĐžŅОйОв ĐŋĐžĐģŅŅиŅŅ ĐžŅĐģиŅĐŊŅŅ ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅŅ.
-ĐĐąŅŅвĐģŅŅŅ ĐŋаŅаĐŧĐĩŅŅŅ `ĐžŅвĐĩŅа ŅĐĩŅвĐĩŅа` в ŅŅĐŊĐēŅиŅŅ
, ĐēаĐē в Hug.
+ĐĐŧĐĩŅŅĐĩ Ņ Hug (ŅаĐē ĐēаĐē Hug ĐžŅĐŊОваĐŊ ĐŊа Falcon) вдОŅ
ĐŊОвиĐģĐž **FastAPI** ОйŅŅвĐģŅŅŅ ĐŋаŅаĐŧĐĩŅŅ `response` в ŅŅĐŊĐēŅиŅŅ
.
-ĐĨĐžŅŅ Đ˛ FastAPI ŅŅĐž ĐŊĐĩОйŅСаŅĐĩĐģŅĐŊĐž и иŅĐŋĐžĐģŅСŅĐĩŅŅŅ Đ˛ ĐžŅĐŊОвĐŊĐžĐŧ Đ´ĐģŅ ŅŅŅаĐŊОвĐēи ĐˇĐ°ĐŗĐžĐģОвĐēОв, ĐēŅĐēи и аĐģŅŅĐĩŅĐŊаŅивĐŊŅŅ
ĐēОдОв ŅĐžŅŅĐžŅĐŊиŅ.
+ĐĨĐžŅŅ Đ˛ FastAPI ŅŅĐž ĐŊĐĩОйŅСаŅĐĩĐģŅĐŊĐž, и иŅĐŋĐžĐģŅСŅĐĩŅŅŅ Đ˛ ĐžŅĐŊОвĐŊĐžĐŧ Đ´ĐģŅ ŅŅŅаĐŊОвĐēи HTTP-ĐˇĐ°ĐŗĐžĐģОвĐēОв, cookie и аĐģŅŅĐĩŅĐŊаŅивĐŊŅŅ
ŅŅаŅŅŅ-ĐēОдОв.
///
-### Molten
+### Molten { #molten }
-Molten ĐŧĐŊĐĩ ĐŋĐžĐŋаĐģŅŅ ĐŊа ĐŊаŅаĐģŅĐŊОК ŅŅадии ĐŊаĐŋиŅаĐŊĐ¸Ņ **FastAPI**. Đ ĐŊŅĐŧ ĐąŅĐģи ĐŋĐžŅ
ĐžĐļиĐĩ идĐĩи:
+Đ¯ ОйĐŊаŅŅĐļиĐģ Molten ĐŊа ŅаĐŊĐŊиŅ
ŅŅаĐŋаŅ
ŅОСдаĐŊĐ¸Ņ **FastAPI**. Đ Ņ ĐŊĐĩĐŗĐž ĐąŅĐģи ĐžŅĐĩĐŊŅ ĐŋĐžŅ
ĐžĐļиĐĩ идĐĩи:
-* ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ ĐŋОдŅĐēаСОĐē ŅиĐŋОв.
-* ĐаĐģидаŅĐ¸Ņ Đ¸ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ Đ¸ŅŅ
ĐžĐ´Ņ Đ¸Đˇ ŅŅиŅ
ĐŋОдŅĐēаСОĐē.
+* ĐŅĐŊОваĐŊ ĐŊа аĐŊĐŊĐžŅаŅиŅŅ
ŅиĐŋОв Python.
+* ĐаĐģидаŅĐ¸Ņ Đ¸ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ Đ¸Đˇ ŅŅиŅ
ŅиĐŋОв.
* ХиŅŅĐĩĐŧа вĐŊĐĩĐ´ŅĐĩĐŊĐ¸Ņ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅĐĩĐš.
-Đ ĐŊŅĐŧ ĐŊĐĩ иŅĐŋĐžĐģŅСŅŅŅŅŅ ŅŅĐžŅĐžĐŊĐŊиĐĩ йийĐģиОŅĐĩĐēи (ŅаĐēиĐĩ, ĐēаĐē Pydantic) Đ´ĐģŅ Đ˛Đ°ĐģидаŅии, ŅĐĩŅиаĐģиСаŅии и Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии.
-ĐĐžŅŅĐžĐŧŅ ĐŋĐĩŅĐĩиŅĐŋĐžĐģŅСОваŅŅ ŅŅи ĐžĐŋŅĐĩĐ´ĐĩĐģĐĩĐŊĐ¸Ņ ŅиĐŋОв ĐŊĐĩĐŋŅĐžŅŅĐž.
+ĐĐŊ ĐŊĐĩ иŅĐŋĐžĐģŅСŅĐĩŅ ŅŅĐžŅĐžĐŊĐŊŅŅ ĐąĐ¸ĐąĐģиОŅĐĩĐēŅ Đ´ĐģŅ Đ˛Đ°ĐģидаŅии, ŅĐĩŅиаĐģиСаŅии и Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии, ŅаĐēŅŅ ĐēаĐē Pydantic, â Ņ ĐŊĐĩĐŗĐž ŅвОŅ. ĐĐžŅŅĐžĐŧŅ ŅаĐēиĐĩ ĐžĐŋŅĐĩĐ´ĐĩĐģĐĩĐŊĐ¸Ņ ŅиĐŋОв даĐŊĐŊŅŅ
ĐąŅĐ´ĐĩŅ ŅĐģĐžĐļĐŊĐĩĐĩ ĐŋĐĩŅĐĩиŅĐŋĐžĐģŅСОваŅŅ.
-ĐĸаĐēĐļĐĩ ŅŅĐĩĐąŅĐĩŅŅŅ ĐąĐžĐģĐĩĐĩ ĐŋОдŅОйĐŊĐ°Ņ ĐēĐžĐŊŅĐ¸ĐŗŅŅаŅĐ¸Ņ Đ¸ иŅĐŋĐžĐģŅСŅĐĩŅŅŅ ŅŅаĐŊдаŅŅ WSGI, ĐēĐžŅĐžŅŅĐš ĐŊĐĩ ĐŋŅĐĩĐ´ĐŊаСĐŊаŅĐĩĐŊ Đ´ĐģŅ Đ¸ŅĐŋĐžĐģŅСОваĐŊĐ¸Ņ Ņ Đ˛ŅŅĐžĐēĐžĐŋŅОиСвОдиŅĐĩĐģŅĐŊŅĐŧи иĐŊŅŅŅŅĐŧĐĩĐŊŅаĐŧи, ŅаĐēиĐŧи ĐēаĐē Uvicorn, Starlette и Sanic, в ĐžŅĐģиŅиĐĩ ĐžŅ ASGI.
+ĐĸŅĐĩĐąŅŅŅŅŅ ĐąĐžĐģĐĩĐĩ ĐŧĐŊĐžĐŗĐžŅĐģОвĐŊŅĐĩ ĐēĐžĐŊŅĐ¸ĐŗŅŅаŅии. Đ ŅаĐē ĐēаĐē ĐžĐŊ ĐžŅĐŊОваĐŊ ĐŊа WSGI (вĐŧĐĩŅŅĐž ASGI), ĐžĐŊ ĐŊĐĩ ĐŋŅĐĩĐ´ĐŊаСĐŊаŅĐĩĐŊ Đ´ĐģŅ Đ¸ŅĐŋĐžĐģŅСОваĐŊĐ¸Ņ ĐŋŅĐĩиĐŧŅŅĐĩŅŅв вŅŅĐžĐēОК ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅи иĐŊŅŅŅŅĐŧĐĩĐŊŅОв вŅОдĐĩ Uvicorn, Starlette и Sanic.
-ĐĐŗĐž ŅиŅŅĐĩĐŧа вĐŊĐĩĐ´ŅĐĩĐŊĐ¸Ņ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅĐĩĐš ŅŅĐĩĐąŅĐĩŅ ĐŋŅĐĩдваŅиŅĐĩĐģŅĐŊОК ŅĐĩĐŗĐ¸ŅŅŅаŅии, и СавиŅиĐŧĐžŅŅи ĐžĐŋŅĐĩĐ´ĐĩĐģŅŅŅŅŅ, ĐēаĐē ОйŅŅвĐģĐĩĐŊĐ¸Ņ ŅиĐŋОв.
-ĐС-Са ŅŅĐžĐŗĐž ĐŊĐĩвОСĐŧĐžĐļĐŊĐž ОйŅŅвиŅŅ ĐąĐžĐģĐĩĐĩ ОдĐŊĐžĐŗĐž "ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅа" (СавиŅиĐŧĐžŅŅи), ĐēĐžŅĐžŅŅĐš ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ ĐžĐŋŅĐĩĐ´ĐĩĐģĐĩĐŊĐŊŅĐš ŅиĐŋ.
+ХиŅŅĐĩĐŧа вĐŊĐĩĐ´ŅĐĩĐŊĐ¸Ņ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅĐĩĐš ŅŅĐĩĐąŅĐĩŅ ĐŋŅĐĩдваŅиŅĐĩĐģŅĐŊОК ŅĐĩĐŗĐ¸ŅŅŅаŅии СавиŅиĐŧĐžŅŅĐĩĐš, а СавиŅиĐŧĐžŅŅи ŅаСŅĐĩŅаŅŅŅŅ ĐŋĐž ОйŅŅвĐģĐĩĐŊĐŊŅĐŧ ŅиĐŋаĐŧ. ĐĐžŅŅĐžĐŧŅ ĐŊĐĩвОСĐŧĐžĐļĐŊĐž ОйŅŅвиŅŅ ĐąĐžĐģĐĩĐĩ ОдĐŊĐžĐŗĐž ÂĢĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅаÂģ, ĐŋŅĐĩĐ´ĐžŅŅавĐģŅŅŅĐĩĐŗĐž ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐŊŅĐš ŅиĐŋ.
-ĐаŅŅŅŅŅŅ ĐžĐąŅŅвĐģŅŅŅŅŅ Đ˛ ĐĩдиĐŊŅŅвĐĩĐŊĐŊĐžĐŧ ĐŧĐĩŅŅĐĩ Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩĐŧ ŅŅĐŊĐēŅиК, ОйŅŅвĐģĐĩĐŊĐŊŅŅ
в Đ´ŅŅĐŗĐ¸Ņ
ĐŧĐĩŅŅаŅ
(вĐŧĐĩŅŅĐž иŅĐŋĐžĐģŅСОваĐŊĐ¸Ņ Đ´ĐĩĐēĐžŅаŅĐžŅОв, в ĐēĐžŅĐžŅŅĐĩ ĐŧĐžĐŗŅŅ ĐąŅŅŅ ĐžĐąŅŅĐŊŅŅŅ ŅŅĐŊĐēŅии, ОйŅайаŅŅваŅŅиĐĩ ĐēĐžĐŊĐēŅĐĩŅĐŊŅĐĩ ŅĐĩŅŅŅŅŅ).
-ĐŅĐž йОĐģŅŅĐĩ ĐŋĐžŅ
ĐžĐļĐĩ ĐŊа Django, ŅĐĩĐŧ ĐŊа Flask и Starlette.
-ĐĐŊ ŅаСдĐĩĐģŅĐĩŅ Đ˛ ĐēОдĐĩ вĐĩŅи, ĐēĐžŅĐžŅŅĐĩ дОвОĐģŅĐŊĐž ŅĐĩŅĐŊĐž ŅвŅСаĐŊŅ.
+ĐаŅŅŅŅŅŅ ĐžĐąŅŅвĐģŅŅŅŅŅ Đ˛ ОдĐŊĐžĐŧ ĐŧĐĩŅŅĐĩ, иŅĐŋĐžĐģŅСŅŅ ŅŅĐŊĐēŅии, ОйŅŅвĐģĐĩĐŊĐŊŅĐĩ в Đ´ŅŅĐŗĐ¸Ņ
ĐŧĐĩŅŅаŅ
(вĐŧĐĩŅŅĐž Đ´ĐĩĐēĐžŅаŅĐžŅОв, ĐēĐžŅĐžŅŅĐĩ ĐŧĐžĐļĐŊĐž ŅаСĐŧĐĩŅŅиŅŅ ĐŋŅŅĐŧĐž ĐŊад ŅŅĐŊĐēŅиĐĩĐš, ОйŅайаŅŅваŅŅĐĩĐš ŅĐŊĐ´ĐŋОиĐŊŅ). ĐŅĐž ĐąĐģиĐļĐĩ Đē ŅĐžĐŧŅ, ĐēаĐē ŅŅĐž Đ´ĐĩĐģаĐĩŅ Django, ŅĐĩĐŧ Flask (и Starlette). ĐŅĐž ŅаСдĐĩĐģŅĐĩŅ Đ˛ ĐēОдĐĩ вĐĩŅи, ĐēĐžŅĐžŅŅĐĩ дОвОĐģŅĐŊĐž ŅĐĩŅĐŊĐž ŅвŅСаĐŊŅ.
-/// check | ĐĐ´ĐĩŅ Đ´ĐģŅ **FastAPI**
+/// check | ĐĐ´ĐžŅ
ĐŊОвиĐģĐž **FastAPI** ĐŊа
-ĐĐŋŅĐĩĐ´ĐĩĐģиŅŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ĐŋŅОвĐĩŅĐēи ŅиĐŋОв даĐŊĐŊŅŅ
, иŅĐŋĐžĐģŅСŅŅ ĐˇĐŊаŅĐĩĐŊĐ¸Ņ Đ°ŅŅийŅŅОв ĐŧОдĐĩĐģи "ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ".
-ĐŅĐž ŅĐģŅŅŅаĐĩŅ ĐŋĐžĐŧĐžŅŅ ŅĐĩдаĐēŅĐžŅа и ŅаĐŊŅŅĐĩ ŅŅĐž ĐŊĐĩ ĐąŅĐģĐž Đ´ĐžŅŅŅĐŋĐŊĐž в Pydantic.
+ĐĐŋŅĐĩĐ´ĐĩĐģŅŅŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ĐŋŅОвĐĩŅĐēи ŅиĐŋОв даĐŊĐŊŅŅ
, иŅĐŋĐžĐģŅСŅŅ ĐˇĐŊаŅĐĩĐŊиĐĩ ÂĢĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅÂģ аŅŅийŅŅОв ĐŧОдĐĩĐģи. ĐŅĐž ŅĐģŅŅŅаĐĩŅ ĐŋОддĐĩŅĐļĐēŅ Đ˛ ŅĐĩдаĐēŅĐžŅĐĩ ĐēОда, и ŅаĐŊŅŅĐĩ ŅŅĐžĐŗĐž ĐŊĐĩ ĐąŅĐģĐž в Pydantic.
-ФаĐēŅиŅĐĩŅĐēи ŅŅĐž ĐŋОдŅĐžĐģĐēĐŊŅĐģĐž ĐŊа ОйĐŊОвĐģĐĩĐŊиĐĩ Pydantic Đ´ĐģŅ ĐŋОддĐĩŅĐļĐēи ОдиĐŊаĐēĐžĐ˛ĐžĐŗĐž ŅŅиĐģŅ ĐŋŅОвĐĩŅĐžĐē (ŅĐĩĐŋĐĩŅŅ ŅŅĐžŅ ŅŅĐŊĐēŅиОĐŊаĐģ ŅĐļĐĩ Đ´ĐžŅŅŅĐŋĐĩĐŊ в Pydantic).
+ФаĐēŅиŅĐĩŅĐēи ŅŅĐž вдОŅ
ĐŊОвиĐģĐž ĐŊа ОйĐŊОвĐģĐĩĐŊиĐĩ ŅаŅŅĐĩĐš Pydantic, ŅŅĐžĐąŅ ĐŋОддĐĩŅĐļиваŅŅ ŅаĐēОК ĐļĐĩ ŅŅиĐģŅ ĐžĐąŅŅвĐģĐĩĐŊĐ¸Ņ Đ˛Đ°ĐģидаŅии (вŅŅ ŅŅа ŅŅĐŊĐēŅиОĐŊаĐģŅĐŊĐžŅŅŅ ŅĐĩĐŋĐĩŅŅ ŅĐļĐĩ ĐĩŅŅŅ Đ˛ Pydantic).
///
-### Hug
+### Hug { #hug }
-Hug ĐąŅĐģ ОдĐŊиĐŧ иС ĐŋĐĩŅвŅŅ
ŅŅĐĩĐšĐŧвОŅĐēОв, ŅĐĩаĐģиСОвавŅиŅ
ОйŅŅвĐģĐĩĐŊиĐĩ ĐŋаŅаĐŧĐĩŅŅОв API Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩĐŧ ĐŋОдŅĐēаСОĐē ŅиĐŋОв Python.
-ĐŅа ĐžŅĐģиŅĐŊĐ°Ņ Đ¸Đ´ĐĩŅ ĐąŅĐģа иŅĐŋĐžĐģŅСОваĐŊа и Đ´ŅŅĐŗĐ¸Đŧи иĐŊŅŅŅŅĐŧĐĩĐŊŅаĐŧи.
+Hug ĐąŅĐģ ОдĐŊиĐŧ иС ĐŋĐĩŅвŅŅ
ŅŅĐĩĐšĐŧвОŅĐēОв, ŅĐĩаĐģиСОвавŅиŅ
ОйŅŅвĐģĐĩĐŊиĐĩ ŅиĐŋОв ĐŋаŅаĐŧĐĩŅŅОв API Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩĐŧ аĐŊĐŊĐžŅаŅиК ŅиĐŋОв Python. ĐŅĐž ĐąŅĐģа ĐžŅĐģиŅĐŊĐ°Ņ Đ¸Đ´ĐĩŅ, ĐēĐžŅĐžŅĐ°Ņ Đ˛Đ´ĐžŅ
ĐŊОвиĐģа и Đ´ŅŅĐŗĐ¸Đĩ иĐŊŅŅŅŅĐŧĐĩĐŊŅŅ.
-ĐŅи ОйŅŅвĐģĐĩĐŊии ĐŋаŅаĐŧĐĩŅŅОв вĐŧĐĩŅŅĐž ŅŅаĐŊдаŅŅĐŊŅŅ
ŅиĐŋОв Python иŅĐŋĐžĐģŅСОваĐģиŅŅ ŅОйŅŅвĐĩĐŊĐŊŅĐĩ ŅиĐŋŅ, ĐŊĐž вŅŅ ĐļĐĩ ŅŅĐž ĐąŅĐģ ĐžĐŗŅĐžĐŧĐŊŅĐš ŅĐ°Đŗ вĐŋĐĩŅĐĩĐ´.
+ĐĐŊ иŅĐŋĐžĐģŅСОваĐģ ŅОйŅŅвĐĩĐŊĐŊŅĐĩ ŅиĐŋŅ Đ˛ ОйŅŅвĐģĐĩĐŊиŅŅ
вĐŧĐĩŅŅĐž ŅŅаĐŊдаŅŅĐŊŅŅ
ŅиĐŋОв Python, ĐŊĐž ŅŅĐž вŅŅ ŅавĐŊĐž ĐąŅĐģ ĐžĐŗŅĐžĐŧĐŊŅĐš ŅĐ°Đŗ вĐŋĐĩŅŅĐ´.
-ĐŅĐž ŅаĐēĐļĐĩ ĐąŅĐģ ОдиĐŊ иС ĐŋĐĩŅвŅŅ
ŅŅĐĩĐšĐŧвОŅĐēОв, ĐŗĐĩĐŊĐĩŅиŅОвавŅиŅ
ĐŋĐžĐģĐŊŅŅ API-ŅŅ
ĐĩĐŧŅ Đ˛ ŅĐžŅĐŧаŅĐĩ JSON.
+ĐĐŊ ŅаĐēĐļĐĩ ĐąŅĐģ ОдĐŊиĐŧ иС ĐŋĐĩŅвŅŅ
ŅŅĐĩĐšĐŧвОŅĐēОв, ĐŗĐĩĐŊĐĩŅиŅОвавŅиŅ
ŅОйŅŅвĐĩĐŊĐŊŅŅ ŅŅ
ĐĩĐŧŅ, ĐžĐŋиŅŅваŅŅŅŅ Đ˛ĐĩŅŅ API в JSON.
-ĐаĐŊĐŊĐ°Ņ ŅŅ
ĐĩĐŧа ĐŊĐĩ ĐŋŅидĐĩŅĐļиваĐģаŅŅ ŅŅаĐŊдаŅŅОв вŅОдĐĩ OpenAPI и JSON Schema.
-ĐĐžŅŅĐžĐŧŅ ĐąŅĐģĐž ĐąŅ ĐŊĐĩĐŋŅĐžŅŅĐž ŅОвĐŧĐĩŅŅиŅŅ ĐĩŅ Ņ Đ´ŅŅĐŗĐ¸Đŧи иĐŊŅŅŅŅĐŧĐĩĐŊŅаĐŧи, ŅаĐēиĐŧи ĐēаĐē Swagger UI.
-ĐĐž ĐžĐŋŅŅŅ ĐļĐĩ, ŅŅĐž ĐąŅĐģа ĐžŅĐĩĐŊŅ Đ¸ĐŊĐŊОваŅиОĐŊĐŊĐ°Ņ Đ¸Đ´ĐĩŅ.
+ĐĐŊ ĐŊĐĩ ĐąŅĐģ ĐžŅĐŊОваĐŊ ĐŊа ŅŅаĐŊдаŅŅаŅ
вŅОдĐĩ OpenAPI и JSON Schema. ĐĐžŅŅĐžĐŧŅ Đ¸ĐŊŅĐĩĐŗŅиŅОваŅŅ ĐĩĐŗĐž Ņ Đ´ŅŅĐŗĐ¸Đŧи иĐŊŅŅŅŅĐŧĐĩĐŊŅаĐŧи, ŅаĐēиĐŧи ĐēаĐē Swagger UI, ĐąŅĐģĐž ĐąŅ ĐŊĐĩĐŋŅĐžŅŅĐž. ĐĐž, ĐžĐŋŅŅŅ ĐļĐĩ, ŅŅĐž ĐąŅĐģа ĐžŅĐĩĐŊŅ Đ¸ĐŊĐŊОваŅиОĐŊĐŊĐ°Ņ Đ¸Đ´ĐĩŅ.
-ĐŅŅ Ņ ĐŊĐĩĐŗĐž ĐĩŅŅŅ Đ¸ĐŊŅĐĩŅĐĩŅĐŊĐ°Ņ Đ¸ ĐŊĐĩОйŅŅĐŊĐ°Ņ ŅŅĐŊĐēŅиŅ: иŅĐŋĐžĐģŅСŅŅ ĐžĐ´Đ¸ĐŊ и ŅĐžŅ ĐļĐĩ ŅŅĐĩĐšĐŧвОŅĐē ĐŧĐžĐļĐŊĐž ŅОСдаваŅŅ Đ¸ API, и CLI.
+ĐŖ ĐŊĐĩĐŗĐž ĐĩŅŅŅ Đ¸ĐŊŅĐĩŅĐĩŅĐŊĐ°Ņ Đ¸ ĐŊĐĩОйŅŅĐŊĐ°Ņ ĐžŅОйĐĩĐŊĐŊĐžŅŅŅ: Ņ ĐŋĐžĐŧĐžŅŅŅ ĐžĐ´ĐŊĐžĐŗĐž и ŅĐžĐŗĐž ĐļĐĩ ŅŅĐĩĐšĐŧвОŅĐēа ĐŧĐžĐļĐŊĐž ŅОСдаваŅŅ Đ¸ API, и CLI.
-ĐĐžŅĐēĐžĐģŅĐēŅ ĐžĐŊ ĐžŅĐŊОваĐŊ ĐŊа WSGI, ŅŅаŅĐžĐŧ ŅŅаĐŊдаŅŅĐĩ Đ´ĐģŅ ŅиĐŊŅ
ŅĐžĐŊĐŊŅŅ
вĐĩĐą-ŅŅĐĩĐšĐŧвОŅĐēОв, ĐžĐŊ ĐŊĐĩ ĐŧĐžĐļĐĩŅ ŅайОŅаŅŅ Ņ Đ˛ĐĩĐą-ŅĐžĐēĐĩŅаĐŧи и Đ´ŅŅĐŗĐ¸Đŧи ĐŧОдĐŊŅĐŧи ŅŅŅĐēаĐŧи, ĐŊĐž вŅŅ ŅавĐŊĐž ОйĐģадаĐĩŅ Đ˛ŅŅĐžĐēОК ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅŅŅ.
+ĐĸаĐē ĐēаĐē ĐžĐŊ ĐžŅĐŊОваĐŊ ĐŊа ĐŋŅĐĩĐ´ŅĐ´ŅŅĐĩĐŧ ŅŅаĐŊдаŅŅĐĩ Đ´ĐģŅ ŅиĐŊŅ
ŅĐžĐŊĐŊŅŅ
вĐĩĐą-ŅŅĐĩĐšĐŧвОŅĐēОв Python (WSGI), ĐžĐŊ ĐŊĐĩ ĐŧĐžĐļĐĩŅ ŅайОŅаŅŅ Ņ WebSocket и ĐŋŅĐžŅиĐŧ, Ņ
ĐžŅŅ ŅаĐēĐļĐĩ Đ´ĐĩĐŧĐžĐŊŅŅŅиŅŅĐĩŅ Đ˛ŅŅĐžĐēŅŅ ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅŅ.
/// info | ĐĐŊŅĐžŅĐŧаŅиŅ
-Hug ŅОСдаĐŊ Timothy Crosley, авŅĐžŅĐžĐŧ `isort`, ĐžŅĐģиŅĐŊĐžĐŗĐž иĐŊŅŅŅŅĐŧĐĩĐŊŅа Đ´ĐģŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēОК ŅĐžŅŅиŅОвĐēи иĐŧĐŋĐžŅŅОв в Python-ŅаКĐģаŅ
.
+Hug ĐąŅĐģ ŅОСдаĐŊ ĐĸиĐŧĐžŅи ĐŅĐžŅĐģи, ŅĐĩĐŧ ĐļĐĩ авŅĐžŅĐžĐŧ `isort`, ĐžŅĐģиŅĐŊĐžĐŗĐž иĐŊŅŅŅŅĐŧĐĩĐŊŅа Đ´ĐģŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēОК ŅĐžŅŅиŅОвĐēи иĐŧĐŋĐžŅŅОв в ŅаКĐģаŅ
Python.
///
-/// check | ĐĐ´Đĩи Đ´ĐģŅ **FastAPI**
+/// check | ĐĐ´Đĩи, вдОŅ
ĐŊОвивŅиĐĩ **FastAPI**
-Hug ĐŋОвĐģиŅĐģ ĐŊа ŅОСдаĐŊиĐĩ ĐŊĐĩĐēĐžŅĐžŅŅŅ
ŅаŅŅĐĩĐš APIStar и ĐąŅĐģ ОдĐŊиĐŧ иС иĐŊŅŅŅŅĐŧĐĩĐŊŅОв, ĐēĐžŅĐžŅŅĐĩ Ņ ŅŅĐĩĐģ ĐŊаийОĐģĐĩĐĩ ĐŧĐŊĐžĐŗĐžĐžĐąĐĩŅаŅŅиĐŧи, ĐŊаŅŅĐ´Ņ Ņ APIStar.
+Hug вдОŅ
ĐŊОвиĐģ ŅаŅŅи APIStar и ĐąŅĐģ ОдĐŊиĐŧ иС ĐŊаийОĐģĐĩĐĩ ĐŧĐŊĐžĐŗĐžĐžĐąĐĩŅаŅŅиŅ
иĐŊŅŅŅŅĐŧĐĩĐŊŅОв, ĐēĐžŅĐžŅŅĐĩ Ņ ĐŊаŅŅĐģ, ĐŊаŅŅĐ´Ņ Ņ APIStar.
-Hug ĐŊаŅĐžĐģĐēĐŊŅĐģ ĐŊа ĐŧŅŅĐģи иŅĐŋĐžĐģŅСОваŅŅ Đ˛ **FastAPI** ĐŋОдŅĐēаСĐēи ŅиĐŋОв Python Đ´ĐģŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēĐžĐŗĐž ŅОСдаĐŊĐ¸Ņ ŅŅ
ĐĩĐŧŅ, ĐžĐŋŅĐĩĐ´ĐĩĐģŅŅŅĐĩĐš API и ĐĩĐŗĐž ĐŋаŅаĐŧĐĩŅŅŅ.
+Hug ĐŋĐžĐŧĐžĐŗ вдОŅ
ĐŊОвиŅŅ **FastAPI** иŅĐŋĐžĐģŅСОваŅŅ Đ°ĐŊĐŊĐžŅаŅии ŅиĐŋОв Python Đ´ĐģŅ ĐžĐąŅŅвĐģĐĩĐŊĐ¸Ņ ĐŋаŅаĐŧĐĩŅŅОв и авŅĐžĐŧаŅиŅĐĩŅĐēи ĐŗĐĩĐŊĐĩŅиŅОваŅŅ ŅŅ
ĐĩĐŧŅ, ĐžĐŋŅĐĩĐ´ĐĩĐģŅŅŅŅŅ API.
-Hug вдОŅ
ĐŊОвиĐģ **FastAPI** ОйŅŅвиŅŅ ĐŋаŅаĐŧĐĩŅŅ `ĐžŅвĐĩŅа` в ŅŅĐŊĐēŅиŅŅ
Đ´ĐģŅ ŅŅŅаĐŊОвĐēи ĐˇĐ°ĐŗĐžĐģОвĐēОв и ĐēŅĐēи.
+Hug вдОŅ
ĐŊОвиĐģ **FastAPI** ОйŅŅвĐģŅŅŅ ĐŋаŅаĐŧĐĩŅŅ `response` в ŅŅĐŊĐēŅиŅŅ
Đ´ĐģŅ ŅŅŅаĐŊОвĐēи HTTP-ĐˇĐ°ĐŗĐžĐģОвĐēОв и cookie.
///
-### APIStar (<= 0.5)
+### APIStar (<= 0.5) { #apistar-0-5 }
-ĐĐĩĐŋĐžŅŅĐĩĐ´ŅŅвĐĩĐŊĐŊĐž ĐŋĐĩŅĐĩĐ´ ŅĐĩĐŧ, ĐēаĐē ĐŋŅиĐŊŅŅŅ ŅĐĩŅĐĩĐŊиĐĩ Đž ŅОСдаĐŊии **FastAPI**, Ņ ĐžĐąĐŊаŅŅĐļиĐģ **APIStar**.
-Đ ĐŊĐĩĐŧ ĐąŅĐģĐž ĐŋĐžŅŅи вŅĐĩ, ŅŅĐž Ņ Đ¸ŅĐēаĐģ и Ņ ĐŊĐĩĐŗĐž ĐąŅĐģ ĐžŅĐģиŅĐŊŅĐš диСаКĐŊ.
+ĐŅŅĐŧĐž ĐŋĐĩŅĐĩĐ´ ŅĐĩŅĐĩĐŊиĐĩĐŧ ŅŅŅОиŅŅ **FastAPI** Ņ ĐŊаŅŅĐģ ŅĐĩŅвĐĩŅ **APIStar**. Đ ĐŊŅĐŧ ĐąŅĐģĐž ĐŋĐžŅŅи вŅŅ, ŅŅĐž Ņ Đ¸ŅĐēаĐģ, и ĐžŅĐģиŅĐŊŅĐš диСаКĐŊ.
-ĐŅĐž ĐąŅĐģа ОдĐŊа иС ĐŋĐĩŅвŅŅ
ŅĐĩаĐģиСаŅиК ŅŅĐĩĐšĐŧвОŅĐēа, иŅĐŋĐžĐģŅСŅŅŅĐĩĐŗĐž ĐŋОдŅĐēаСĐēи ŅиĐŋОв Đ´ĐģŅ ĐžĐąŅŅвĐģĐĩĐŊĐ¸Ņ ĐŋаŅаĐŧĐĩŅŅОв и СаĐŋŅĐžŅОв, ĐēĐžŅĐžŅŅĐĩ Ņ ĐēĐžĐŗĐ´Đ°-ĐģийО видĐĩĐģ (Đ´Đž NestJS и Molten).
-Đ¯ ĐŊаŅŅĐģ ĐĩĐŗĐž ĐŋŅиĐŧĐĩŅĐŊĐž в ŅĐž ĐļĐĩ вŅĐĩĐŧŅ, ŅŅĐž и Hug, ĐŊĐž APIStar иŅĐŋĐžĐģŅСОваĐģ ŅŅаĐŊдаŅŅ OpenAPI.
+ĐŅĐž ĐąŅĐģа ОдĐŊа иС ĐŋĐĩŅвŅŅ
ŅĐĩаĐģиСаŅиК ŅŅĐĩĐšĐŧвОŅĐēа, иŅĐŋĐžĐģŅСŅŅŅĐĩĐŗĐž аĐŊĐŊĐžŅаŅии ŅиĐŋОв Python Đ´ĐģŅ ĐžĐąŅŅвĐģĐĩĐŊĐ¸Ņ ĐŋаŅаĐŧĐĩŅŅОв и СаĐŋŅĐžŅОв (Đ´Đž NestJS и Molten), ĐēĐžŅĐžŅŅĐĩ Ņ Đ˛Đ¸Đ´ĐĩĐģ. Đ¯ ОйĐŊаŅŅĐļиĐģ ĐĩĐŗĐž ĐŋŅиĐŧĐĩŅĐŊĐž в ŅĐž ĐļĐĩ вŅĐĩĐŧŅ, ŅŅĐž и Hug. ĐĐž APIStar иŅĐŋĐžĐģŅСОваĐģ ŅŅаĐŊдаŅŅ OpenAPI.
-Đ ĐŊŅĐŧ ĐąŅĐģи авŅĐžĐŧаŅиŅĐĩŅĐēиĐĩ ĐŋŅОвĐĩŅĐēа и ŅĐĩŅиаĐģиСаŅĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
и ĐŗĐĩĐŊĐĩŅаŅĐ¸Ņ ŅŅ
ĐĩĐŧŅ OpenAPI ĐžŅĐŊОваĐŊĐŊŅĐĩ ĐŊа ĐŋОдŅĐēаСĐēаŅ
ŅиĐŋОв в ĐŊĐĩŅĐēĐžĐģŅĐēиŅ
ĐŧĐĩŅŅаŅ
.
+Đ ĐŊŅĐŧ ĐąŅĐģи авŅĐžĐŧаŅиŅĐĩŅĐēиĐĩ ваĐģидаŅĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
, ŅĐĩŅиаĐģиСаŅĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
и ĐŗĐĩĐŊĐĩŅаŅĐ¸Ņ ŅŅ
ĐĩĐŧŅ OpenAPI ĐŊа ĐžŅĐŊОвĐĩ ŅĐĩŅ
ĐļĐĩ аĐŊĐŊĐžŅаŅиК ŅиĐŋОв в ĐŊĐĩŅĐēĐžĐģŅĐēиŅ
ĐŧĐĩŅŅаŅ
.
-ĐŅи ĐžĐŋŅĐĩĐ´ĐĩĐģĐĩĐŊии ŅŅ
ĐĩĐŧŅ ŅĐĩĐģа ŅООйŅĐĩĐŊĐ¸Ņ ĐŊĐĩ иŅĐŋĐžĐģŅСОваĐģиŅŅ ĐŋОдŅĐēаСĐēи ŅиĐŋОв, ĐēаĐē в Pydantic, ŅŅĐž йОĐģŅŅĐĩ ĐŋĐžŅ
ĐžĐļĐĩ ĐŊа Marshmallow, ĐŋĐžŅŅĐžĐŧŅ ĐŋĐžĐŧĐžŅŅ ŅĐĩдаĐēŅĐžŅа ĐąŅĐģа ĐŊĐĩĐ´ĐžŅŅаŅĐžŅĐŊĐž Ņ
ĐžŅĐžŅĐĩĐš, ĐŊĐž вŅŅ ĐļĐĩ APIStar ĐąŅĐģ ĐģŅŅŅиĐŧ Đ´ĐžŅŅŅĐŋĐŊŅĐŧ ваŅиаĐŊŅĐžĐŧ.
+ĐĐŋŅĐĩĐ´ĐĩĐģĐĩĐŊиĐĩ ŅŅ
ĐĩĐŧŅ ŅĐĩĐģа СаĐŋŅĐžŅа ĐŊĐĩ иŅĐŋĐžĐģŅСОваĐģĐž ŅĐĩ ĐļĐĩ аĐŊĐŊĐžŅаŅии ŅиĐŋОв Python, ĐēаĐē в Pydantic, â ŅŅĐž ĐąŅĐģĐž ĐąĐģиĐļĐĩ Đē Marshmallow, ĐŋĐžŅŅĐžĐŧŅ ĐŋОддĐĩŅĐļĐēа ŅĐĩдаĐēŅĐžŅа ĐąŅĐģа ĐąŅ Ņ
ŅĐļĐĩ, ĐŊĐž вŅŅ ŅавĐŊĐž APIStar ĐžŅŅаваĐģŅŅ ĐģŅŅŅиĐŧ Đ´ĐžŅŅŅĐŋĐŊŅĐŧ ваŅиаĐŊŅĐžĐŧ.
-Đа ŅĐžŅ ĐŧĐžĐŧĐĩĐŊŅ Ņ ĐŊĐĩĐŗĐž ĐąŅĐģи ĐģŅŅŅиĐĩ ĐŋĐžĐēаСаŅĐĩĐģи ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅи (ĐŋŅĐžĐ¸ĐŗŅŅваŅŅиĐĩ ŅĐžĐģŅĐēĐž Starlette).
+Đа ŅĐžŅ ĐŧĐžĐŧĐĩĐŊŅ Ņ ĐŊĐĩĐŗĐž ĐąŅĐģи ĐģŅŅŅиĐĩ ĐŋĐžĐēаСаŅĐĩĐģи в ĐąĐĩĐŊŅĐŧаŅĐēаŅ
(ĐĩĐŗĐž ĐŋŅĐĩвОŅŅ
ОдиĐģ ŅĐžĐģŅĐēĐž Starlette).
-ĐСĐŊаŅаĐģŅĐŊĐž Ņ ĐŊĐĩĐŗĐž ĐŊĐĩ ĐąŅĐģĐž авŅĐžĐŧаŅиŅĐĩŅĐēОК Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии API Đ´ĐģŅ Đ˛ĐĩĐą-иĐŊŅĐĩŅŅĐĩĐšŅа, ĐŊĐž Ņ ĐˇĐŊаĐģ, ŅŅĐž ĐŧĐžĐŗŅ Đ´ĐžĐąĐ°Đ˛Đ¸ŅŅ Đē ĐŊĐĩĐŧŅ Swagger UI.
+ĐĄĐŊаŅаĐģа Ņ ĐŊĐĩĐŗĐž ĐŊĐĩ ĐąŅĐģĐž вĐĩĐąâUI Đ´ĐģŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēОК Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии API, ĐŊĐž Ņ ĐˇĐŊаĐģ, ŅŅĐž ĐŧĐžĐŗŅ Đ´ĐžĐąĐ°Đ˛Đ¸ŅŅ Đē ĐŊĐĩĐŧŅ Swagger UI.
-Đ APIStar ĐąŅĐģа ŅиŅŅĐĩĐŧа вĐŊĐĩĐ´ŅĐĩĐŊĐ¸Ņ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅĐĩĐš, ĐēĐžŅĐžŅĐ°Ņ ŅĐžĐļĐĩ ŅŅĐĩйОваĐģа ĐŋŅĐĩдваŅиŅĐĩĐģŅĐŊŅŅ ŅĐĩĐŗĐ¸ŅŅŅаŅĐ¸Ņ ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅОв, ĐēаĐē и ŅаĐŊĐĩĐĩ ĐžĐŋиŅаĐŊĐŊŅĐĩ иĐŊŅŅŅŅĐŧĐĩĐŊŅŅ.
-ĐĐž, ŅĐĩĐŧ ĐŊĐĩ ĐŧĐĩĐŊĐĩĐĩ, ŅŅĐž ĐąŅĐģа ĐžŅĐģиŅĐŊĐ°Ņ ŅŅŅĐēа.
+ĐŖ ĐŊĐĩĐŗĐž ĐąŅĐģа ŅиŅŅĐĩĐŧа вĐŊĐĩĐ´ŅĐĩĐŊĐ¸Ņ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅĐĩĐš. ĐĐŊа ŅŅĐĩйОваĐģа ĐŋŅĐĩдваŅиŅĐĩĐģŅĐŊОК ŅĐĩĐŗĐ¸ŅŅŅаŅии ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅОв, ĐēаĐē и Đ´ŅŅĐŗĐ¸Đĩ иĐŊŅŅŅŅĐŧĐĩĐŊŅŅ, ОйŅŅĐļдавŅиĐĩŅŅ Đ˛ŅŅĐĩ. ĐĐž вŅŅ ĐļĐĩ ŅŅĐž ĐąŅĐģа ĐžŅĐģиŅĐŊĐ°Ņ Đ˛ĐžĐˇĐŧĐžĐļĐŊĐžŅŅŅ.
-Đ¯ ĐŊĐĩ ŅĐŧĐžĐŗ иŅĐŋĐžĐģŅСОваŅŅ ĐĩĐŗĐž в ĐŋĐžĐģĐŊĐžŅĐĩĐŊĐŊĐžĐŧ ĐŋŅĐžĐĩĐēŅĐĩ, ŅаĐē ĐēаĐē ĐąŅĐģи ĐŋŅОйĐģĐĩĐŧŅ ŅĐž вŅŅŅаиваĐŊиĐĩĐŧ ŅŅĐŊĐēŅиК ĐąĐĩСОĐŋаŅĐŊĐžŅŅи в ŅŅ
ĐĩĐŧŅ OpenAPI, иС-Са ĐēĐžŅĐžŅŅŅ
ĐŊĐĩвОСĐŧĐžĐļĐŊĐž ĐąŅĐģĐž вŅŅŅОиŅŅ Đ˛ŅĐĩ ŅŅĐŊĐēŅии, ĐŋŅиĐŧĐĩĐŊŅĐĩĐŧŅĐĩ в ĐŗĐĩĐŊĐĩŅаŅĐžŅаŅ
ĐŋŅĐžĐĩĐēŅОв ĐŊа ĐžŅĐŊОвĐĩ Flask-apispec.
-Đ¯ дОйавиĐģ в ŅвОК ŅĐŋиŅĐžĐē ĐˇĐ°Đ´Đ°Ņ ŅОСдаĐŊиĐĩ ĐŋŅĐģ-ŅĐĩĐēвĐĩŅŅа, дОйавĐģŅŅŅĐĩĐŗĐž ŅŅŅ ŅŅĐŊĐēŅиОĐŊаĐģŅĐŊĐžŅŅŅ.
+ĐĐŊĐĩ ŅаĐē и ĐŊĐĩ ŅдаĐģĐžŅŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ ĐĩĐŗĐž в ĐŋĐžĐģĐŊĐžĐŧ ĐŋŅĐžĐĩĐēŅĐĩ, ĐŋĐžŅĐēĐžĐģŅĐēŅ ĐŊĐĩ ĐąŅĐģĐž иĐŊŅĐĩĐŗŅаŅии Ņ ŅиŅŅĐĩĐŧОК ĐąĐĩСОĐŋаŅĐŊĐžŅŅи, ĐŋĐžŅŅĐžĐŧŅ Ņ ĐŊĐĩ ĐŧĐžĐŗ СаĐŧĐĩĐŊиŅŅ Đ˛ŅĐĩ вОСĐŧĐžĐļĐŊĐžŅŅи, ĐēĐžŅĐžŅŅĐĩ иĐŧĐĩĐģ Ņ full-stack ĐŗĐĩĐŊĐĩŅаŅĐžŅаĐŧи ĐŊа ĐžŅĐŊОвĐĩ Flask-apispec. Đ ĐŧĐžŅĐŧ ĐąŅĐēĐģĐžĐŗĐĩ ĐąŅĐģĐž ŅОСдаŅŅ ĐŋŅĐģĐģ-ŅĐĩĐēвĐĩŅŅ (СаĐŋŅĐžŅ ĐŊа иСĐŧĐĩĐŊĐĩĐŊиĐĩ), дОйавĐģŅŅŅиК ŅŅŅ ŅŅĐŊĐēŅиОĐŊаĐģŅĐŊĐžŅŅŅ.
-РдаĐģŅĐŊĐĩĐšŅĐĩĐŧ ŅĐžĐēŅŅ ĐŋŅĐžĐĩĐēŅа ŅĐŧĐĩŅŅиĐģŅŅ.
+ĐаŅĐĩĐŧ ŅĐžĐēŅŅ ĐŋŅĐžĐĩĐēŅа ŅĐŧĐĩŅŅиĐģŅŅ.
-ĐŅĐž йОĐģŅŅĐĩ ĐŊĐĩ ĐąŅĐģ API-ŅŅĐĩĐšĐŧвОŅĐē, ŅаĐē ĐēаĐē авŅĐžŅ ŅĐžŅŅĐĩĐ´ĐžŅĐžŅиĐģŅŅ ĐŊа Starlette.
+ĐŅĐž ĐŋĐĩŅĐĩŅŅаĐģ ĐąŅŅŅ Đ˛ĐĩĐą-ŅŅĐĩĐšĐŧвОŅĐē Đ´ĐģŅ API, ŅаĐē ĐēаĐē авŅĐžŅŅ ĐŊŅĐļĐŊĐž ĐąŅĐģĐž ŅĐžŅŅĐĩĐ´ĐžŅĐžŅиŅŅŅŅ ĐŊа Starlette.
-ĐŅĐŊĐĩ APIStar - ŅŅĐž ĐŊĐ°ĐąĐžŅ Đ¸ĐŊŅŅŅŅĐŧĐĩĐŊŅОв Đ´ĐģŅ ĐŋŅОвĐĩŅĐēи ŅĐŋĐĩŅиŅиĐēаŅиК OpenAPI.
+ĐĄĐĩĐšŅĐ°Ņ APIStar â ŅŅĐž ĐŊĐ°ĐąĐžŅ Đ¸ĐŊŅŅŅŅĐŧĐĩĐŊŅОв Đ´ĐģŅ Đ˛Đ°ĐģидаŅии ŅĐŋĐĩŅиŅиĐēаŅиК OpenAPI, а ĐŊĐĩ вĐĩĐą-ŅŅĐĩĐšĐŧвОŅĐē.
/// info | ĐĐŊŅĐžŅĐŧаŅиŅ
-APIStar ĐąŅĐģ ŅОСдаĐŊ Tom Christie. ĐĸĐžŅ ŅаĐŧŅĐš ĐŋаŅĐĩĐŊŅ, ĐēĐžŅĐžŅŅĐš ŅОСдаĐģ:
+APIStar ĐąŅĐģ ŅОСдаĐŊ ĐĸĐžĐŧĐžĐŧ ĐŅиŅŅи. ĐĸĐĩĐŧ ŅаĐŧŅĐŧ ŅĐĩĐģОвĐĩĐēĐžĐŧ, ĐēĐžŅĐžŅŅĐš ŅОСдаĐģ:
* Django REST Framework
* Starlette (ĐŊа ĐēĐžŅĐžŅĐžĐŧ ĐžŅĐŊОваĐŊ **FastAPI**)
-* Uvicorn (иŅĐŋĐžĐģŅСŅĐĩĐŧŅĐš в Starlette и **FastAPI**)
+* Uvicorn (иŅĐŋĐžĐģŅСŅĐĩŅŅŅ Starlette и **FastAPI**)
///
-/// check | ĐĐ´Đĩи Đ´ĐģŅ **FastAPI**
+/// check | ĐĐ´ĐžŅ
ĐŊОвиĐģĐž **FastAPI** ĐŊа
-ĐĐžĐŋĐģĐžŅĐĩĐŊиĐĩ.
+ĐĄŅŅĐĩŅŅвОваĐŊиĐĩ.
-ĐĐŊĐĩ ĐēаСаĐģĐžŅŅ ĐąĐģĐĩŅŅŅŅĐĩĐš идĐĩĐĩĐš ОйŅŅвĐģŅŅŅ ĐŧĐŊĐžĐļĐĩŅŅвО ŅŅĐŊĐēŅиК (ĐŋŅОвĐĩŅĐēа даĐŊĐŊŅŅ
, ŅĐĩŅиаĐģиСаŅиŅ, Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиŅ) Ņ ĐŋĐžĐŧĐžŅŅŅ ĐžĐ´ĐŊиŅ
и ŅĐĩŅ
ĐļĐĩ ŅиĐŋОв Python, ĐēĐžŅĐžŅŅĐĩ ĐŋŅи ŅŅĐžĐŧ ОйĐĩŅĐŋĐĩŅиваŅŅ ĐĩŅŅ Đ¸ ĐŋĐžĐŧĐžŅŅ ŅĐĩдаĐēŅĐžŅа ĐēОда.
+ĐĐ´ĐĩŅ ĐžĐąŅŅвĐģŅŅŅ ŅŅĐ°ĐˇŅ ĐŊĐĩŅĐēĐžĐģŅĐēĐž вĐĩŅĐĩĐš (ваĐģидаŅĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
, ŅĐĩŅиаĐģиСаŅĐ¸Ņ Đ¸ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиŅ) Ņ ĐŋĐžĐŧĐžŅŅŅ ĐžĐ´ĐŊиŅ
и ŅĐĩŅ
ĐļĐĩ ŅиĐŋОв Python, ĐēĐžŅĐžŅŅĐĩ ОдĐŊОвŅĐĩĐŧĐĩĐŊĐŊĐž ОйĐĩŅĐŋĐĩŅиваŅŅ ĐžŅĐģиŅĐŊŅŅ ĐŋОддĐĩŅĐļĐēŅ Đ˛ ŅĐĩдаĐēŅĐžŅĐĩ ĐēОда, ĐŋĐžĐēаСаĐģаŅŅ ĐŧĐŊĐĩ ĐąĐģĐĩŅŅŅŅĐĩĐš.
-ĐĐžŅĐģĐĩ Đ´ĐžĐģĐŗĐ¸Ņ
ĐŋОиŅĐēОв ŅŅĐĩди ĐŋĐžŅ
ĐžĐļиŅ
Đ´ŅŅĐŗ ĐŊа Đ´ŅŅĐŗĐ° ŅŅĐĩĐšĐŧвОŅĐēОв и ŅŅавĐŊĐĩĐŊĐ¸Ņ Đ¸Ņ
ŅаСĐģиŅиК, APIStar ŅŅаĐģ ŅаĐŧŅĐŧ ĐģŅŅŅиĐŧ вŅйОŅĐžĐŧ.
+ĐĐžŅĐģĐĩ Đ´ĐžĐģĐŗĐ¸Ņ
ĐŋОиŅĐēОв ĐŋĐžŅ
ĐžĐļĐĩĐŗĐž ŅŅĐĩĐšĐŧвОŅĐēа и ŅĐĩŅŅиŅОваĐŊĐ¸Ņ ĐŧĐŊĐžĐļĐĩŅŅва аĐģŅŅĐĩŅĐŊаŅив APIStar ĐąŅĐģ ĐģŅŅŅиĐŧ Đ´ĐžŅŅŅĐŋĐŊŅĐŧ ваŅиаĐŊŅĐžĐŧ.
-ĐĐž APIStar ĐŋĐĩŅĐĩŅŅаĐģ ĐąŅŅŅ ŅŅĐĩĐšĐŧвОŅĐēĐžĐŧ Đ´ĐģŅ ŅОСдаĐŊĐ¸Ņ Đ˛ĐĩĐą-ŅĐĩŅвĐĩŅа, СаŅĐž ĐŋĐžŅвиĐģŅŅ Starlette, ĐŊĐžĐ˛Đ°Ņ Đ¸ ĐģŅŅŅĐ°Ņ ĐžŅĐŊОва Đ´ĐģŅ ĐŋĐžŅŅŅĐžĐĩĐŊĐ¸Ņ ĐŋОдОйĐŊŅŅ
ŅиŅŅĐĩĐŧ.
-ĐŅĐž ĐąŅĐģа ĐŋĐžŅĐģĐĩĐ´ĐŊŅŅ ĐēаĐŋĐģŅ, ŅĐŋĐžĐ´Đ˛Đ¸ĐŗĐŊŅвŅĐ°Ņ ĐŊа ŅОСдаĐŊиĐĩ **FastAPI**.
+ĐаŅĐĩĐŧ APIStar ĐŋĐĩŅĐĩŅŅаĐģ ŅŅŅĐĩŅŅвОваŅŅ ĐēаĐē ŅĐĩŅвĐĩŅ, а ĐąŅĐģ ŅОСдаĐŊ Starlette â ĐŊĐžĐ˛Đ°Ņ Đ¸ ĐģŅŅŅĐ°Ņ ĐžŅĐŊОва Đ´ĐģŅ ŅаĐēОК ŅиŅŅĐĩĐŧŅ. ĐŅĐž ŅŅаĐģĐž ĐžĐēĐžĐŊŅаŅĐĩĐģŅĐŊŅĐŧ вдОŅ
ĐŊОвĐĩĐŊиĐĩĐŧ Đ´ĐģŅ ŅОСдаĐŊĐ¸Ņ **FastAPI**.
-Đ¯ ŅŅиŅĐ°Ņ **FastAPI** "Đ´ŅŅ
ОвĐŊŅĐŧ ĐŋŅĐĩĐĩĐŧĐŊиĐēĐžĐŧ" APIStar, ŅĐģŅŅивŅиĐŧ ĐĩĐŗĐž вОСĐŧĐžĐļĐŊĐžŅŅи ĐąĐģĐ°ĐŗĐžĐ´Đ°ŅŅ ŅŅĐžĐēаĐŧ, иСвĐģĐĩŅŅĐŊĐŊŅĐŧ иС вŅĐĩŅ
ŅĐŋĐžĐŧŅĐŊŅŅŅŅ
вŅŅĐĩ иĐŊŅŅŅŅĐŧĐĩĐŊŅОв.
+Đ¯ ŅŅиŅĐ°Ņ **FastAPI** ÂĢĐ´ŅŅ
ОвĐŊŅĐŧ ĐŋŅĐĩĐĩĐŧĐŊиĐēĐžĐŧÂģ APIStar, ĐēĐžŅĐžŅŅĐš ŅĐģŅŅŅаĐĩŅ Đ¸ ŅаŅŅиŅŅĐĩŅ Đ˛ĐžĐˇĐŧĐžĐļĐŊĐžŅŅи, ŅиŅŅĐĩĐŧŅ ŅиĐŋОв и Đ´ŅŅĐŗĐ¸Đĩ ŅаŅŅи, ĐžĐŋиŅаŅŅŅ ĐŊа ŅŅĐžĐēи ĐžŅ Đ˛ŅĐĩŅ
ŅŅиŅ
ĐŋŅĐĩĐ´ŅĐ´ŅŅиŅ
иĐŊŅŅŅŅĐŧĐĩĐŊŅОв.
///
-## ЧŅĐž иŅĐŋĐžĐģŅСŅĐĩŅŅŅ Đ˛ **FastAPI**
+## ЧŅĐž иŅĐŋĐžĐģŅСŅĐĩŅŅŅ Đ˛ **FastAPI** { #used-by-fastapi }
-### Pydantic
+### Pydantic { #pydantic }
-Pydantic - ŅŅĐž йийĐģиОŅĐĩĐēа Đ´ĐģŅ Đ˛Đ°ĐģидаŅии даĐŊĐŊŅŅ
, ŅĐĩŅиаĐģиСаŅии и Đ´ĐžĐēŅĐŧĐĩĐŊŅиŅОваĐŊĐ¸Ņ (иŅĐŋĐžĐģŅСŅŅ JSON Schema), ĐžŅĐŊОвŅваŅŅŅ ĐŊа ĐŋОдŅĐēаСĐēаŅ
ŅиĐŋОв Python, ŅŅĐž Đ´ĐĩĐģаĐĩŅ ĐĩĐŗĐž ŅŅĐĩСвŅŅаКĐŊĐž иĐŊŅŅиŅивĐŊŅĐŧ.
+Pydantic â ŅŅĐž йийĐģиОŅĐĩĐēа Đ´ĐģŅ ĐžĐŋŅĐĩĐ´ĐĩĐģĐĩĐŊĐ¸Ņ Đ˛Đ°ĐģидаŅии даĐŊĐŊŅŅ
, ŅĐĩŅиаĐģиСаŅии и Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии (Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩĐŧ JSON Schema) ĐŊа ĐžŅĐŊОвĐĩ аĐŊĐŊĐžŅаŅиК ŅиĐŋОв Python.
-ĐĐŗĐž ĐŧĐžĐļĐŊĐž ŅŅавĐŊиŅŅ Ņ Marshmallow, Ņ
ĐžŅŅ Đ˛ ĐąĐĩĐŊŅĐŧаŅĐēаŅ
Pydantic ĐąŅŅŅŅĐĩĐĩ, ŅĐĩĐŧ Marshmallow.
-Đ ĐžĐŊ ĐžŅĐŊОваĐŊ ĐŊа ŅĐĩŅ
ĐļĐĩ ĐŋОдŅĐēаСĐēаŅ
ŅиĐŋОв, ĐēĐžŅĐžŅŅĐĩ ĐžŅĐģиŅĐŊĐž ĐŋОддĐĩŅĐļиваŅŅŅŅ ŅĐĩдаĐēŅĐžŅаĐŧи ĐēОда.
+ĐĐģĐ°ĐŗĐžĐ´Đ°ŅŅ ŅŅĐžĐŧŅ ĐžĐŊ ŅŅĐĩСвŅŅаКĐŊĐž иĐŊŅŅиŅивĐĩĐŊ.
-/// check | **FastAPI** иŅĐŋĐžĐģŅСŅĐĩŅ Pydantic
+ĐĐŗĐž ĐŧĐžĐļĐŊĐž ŅŅавĐŊиŅŅ Ņ Marshmallow. ĐĨĐžŅŅ Đ˛ ĐąĐĩĐŊŅĐŧаŅĐēаŅ
ĐžĐŊ ĐąŅŅŅŅĐĩĐĩ Marshmallow. Đ ĐŋĐžŅĐēĐžĐģŅĐēŅ ĐžĐŊ ĐžŅĐŊОваĐŊ ĐŊа ŅĐĩŅ
ĐļĐĩ аĐŊĐŊĐžŅаŅиŅŅ
ŅиĐŋОв Python, ĐŋОддĐĩŅĐļĐēа в ŅĐĩдаĐēŅĐžŅĐĩ ĐēОда ĐžŅĐģиŅĐŊаŅ.
-ĐĐģŅ ĐŋŅОвĐĩŅĐēи даĐŊĐŊŅŅ
, ŅĐĩŅиаĐģиСаŅии даĐŊĐŊŅŅ
и авŅĐžĐŧаŅиŅĐĩŅĐēОК Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии ĐŧОдĐĩĐģĐĩĐš (ĐŊа ĐžŅĐŊОвĐĩ JSON Schema).
+/// check | **FastAPI** иŅĐŋĐžĐģŅСŅĐĩŅ ĐĩĐŗĐž Đ´ĐģŅ
-ĐаŅĐĩĐŧ **FastAPI** ĐąĐĩŅŅŅ ŅŅи ŅŅ
ĐĩĐŧŅ JSON и ĐŋĐžĐŧĐĩŅаĐĩŅ Đ¸Ņ
в ŅŅ
ĐĩĐŧŅ OpenAPI, ĐŊĐĩ ĐēаŅаŅŅŅ Đ´ŅŅĐŗĐ¸Ņ
вĐĩŅĐĩĐš, ĐēĐžŅĐžŅŅĐĩ ĐžĐŊ Đ´ĐĩĐģаĐĩŅ.
+ĐĐąŅайОŅĐēи вŅĐĩĐš ваĐģидаŅии даĐŊĐŊŅŅ
, ŅĐĩŅиаĐģиСаŅии даĐŊĐŊŅŅ
и авŅĐžĐŧаŅиŅĐĩŅĐēОК Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии ĐŧОдĐĩĐģĐĩĐš (ĐŊа ĐžŅĐŊОвĐĩ JSON Schema).
+
+ĐаŅĐĩĐŧ **FastAPI** ĐąĐĩŅŅŅ ŅŅи даĐŊĐŊŅĐĩ JSON Schema и ĐŋĐžĐŧĐĩŅаĐĩŅ Đ¸Ņ
в OpenAPI, ĐŋĐžĐŧиĐŧĐž вŅĐĩŅ
ĐŋŅĐžŅиŅ
ŅŅĐŊĐēŅиК.
///
-### Starlette
+### Starlette { #starlette }
-Starlette - ŅŅĐž ĐģĐĩĐŗĐēОвĐĩŅĐŊŅĐš ASGI ŅŅĐĩĐšĐŧвОŅĐē/ĐŊĐ°ĐąĐžŅ Đ¸ĐŊŅŅŅŅĐŧĐĩĐŊŅОв, ĐēĐžŅĐžŅŅĐš идĐĩаĐģĐĩĐŊ Đ´ĐģŅ ĐŋĐžŅŅŅĐžĐĩĐŊĐ¸Ņ Đ˛ŅŅĐžĐēĐžĐŋŅОиСвОдиŅĐĩĐģŅĐŊŅŅ
аŅиĐŊŅ
ŅĐžĐŊĐŊŅŅ
ŅĐĩŅвиŅОв.
+Starlette â ŅŅĐž ĐģŅĐŗĐēиК ASGI ŅŅĐĩĐšĐŧвОŅĐē/ĐŊĐ°ĐąĐžŅ Đ¸ĐŊŅŅŅŅĐŧĐĩĐŊŅОв, идĐĩаĐģŅĐŊĐž ĐŋОдŅ
ОдŅŅиК Đ´ĐģŅ ŅОСдаĐŊĐ¸Ņ Đ˛ŅŅĐžĐēĐžĐŋŅОиСвОдиŅĐĩĐģŅĐŊŅŅ
asyncioâŅĐĩŅвиŅОв.
-Starlette ĐžŅĐĩĐŊŅ ĐŋŅĐžŅŅОК и иĐŊŅŅиŅивĐŊŅĐš.
-ĐĐŊ ŅаСŅайОŅаĐŊ ŅаĐēиĐŧ ОйŅаСОĐŧ, ŅŅĐžĐąŅ ĐąŅŅŅ ĐģĐĩĐŗĐēĐž ŅаŅŅиŅŅĐĩĐŧŅĐŧ и иĐŧĐĩŅŅ ĐŧОдŅĐģŅĐŊŅĐĩ ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅŅ.
+ĐĐŊ ĐžŅĐĩĐŊŅ ĐŋŅĐžŅŅОК и иĐŊŅŅиŅивĐŊŅĐš. ĐĄĐŋŅĐžĐĩĐēŅиŅОваĐŊ ŅаĐē, ŅŅĐžĐąŅ ĐĩĐŗĐž ĐąŅĐģĐž ĐģĐĩĐŗĐēĐž ŅаŅŅиŅŅŅŅ, и ŅŅĐžĐąŅ ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅŅ ĐąŅĐģи ĐŧОдŅĐģŅĐŊŅĐŧи.
Đ ĐŊŅĐŧ ĐĩŅŅŅ:
* ĐĐŋĐĩŅаŅĐģŅŅŅĐ°Ņ ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅŅ.
-* ĐОддĐĩŅĐļĐēа вĐĩĐą-ŅĐžĐēĐĩŅОв.
-* ФОĐŊОвŅĐĩ СадаŅи.
-* ĐĐąŅайОŅĐēа ŅОйŅŅиК ĐŋŅи ŅŅаŅŅĐĩ и ŅиĐŊиŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиŅ.
-* ĐĸĐĩŅŅОвŅĐš ĐēĐģиĐĩĐŊŅ ĐŊа ĐžŅĐŊОвĐĩ HTTPX.
-* ĐОддĐĩŅĐļĐēа CORS, ŅĐļаŅиĐĩ GZip, ŅŅаŅиŅĐĩŅĐēиĐĩ ŅаКĐģŅ, ĐŋĐžŅĐžĐēĐžĐ˛Đ°Ņ ĐŋĐĩŅĐĩдаŅа даĐŊĐŊŅŅ
.
-* ĐОддĐĩŅĐļĐēа ŅĐĩŅŅиК и ĐēŅĐēи.
+* ĐОддĐĩŅĐļĐēа WebSocket.
+* ФОĐŊОвŅĐĩ СадаŅи, вŅĐŋĐžĐģĐŊŅĐĩĐŧŅĐĩ в ŅĐžĐŧ ĐļĐĩ ĐŋŅĐžŅĐĩŅŅĐĩ.
+* ХОйŅŅĐ¸Ņ ĐˇĐ°ĐŋŅŅĐēа и СавĐĩŅŅĐĩĐŊиŅ.
+* ĐĸĐĩŅŅОвŅĐš ĐēĐģиĐĩĐŊŅ ĐŊа йаСĐĩ HTTPX.
+* CORS, GZip, ŅŅаŅиŅĐĩŅĐēиĐĩ ŅаКĐģŅ, ĐŋĐžŅĐžĐēОвŅĐĩ ĐžŅвĐĩŅŅ.
+* ĐОддĐĩŅĐļĐēа ŅĐĩŅŅиК и cookie.
* 100% ĐŋĐžĐēŅŅŅиĐĩ ŅĐĩŅŅаĐŧи.
-* 100% аĐŊĐŊĐžŅиŅОваĐŊĐŊŅĐš ĐēОд.
-* ĐĐĩŅĐēĐžĐģŅĐēĐž ĐļŅŅŅĐēиŅ
СавиŅиĐŧĐžŅŅĐĩĐš.
+* 100% ĐēОдОвОК ĐąĐ°ĐˇŅ Ņ Đ°ĐŊĐŊĐžŅаŅиŅĐŧи ŅиĐŋОв.
+* ĐаĐģĐž ĐļŅŅŅĐēиŅ
СавиŅиĐŧĐžŅŅĐĩĐš.
-Đ ĐŊаŅŅĐžŅŅĐĩĐĩ вŅĐĩĐŧŅ Starlette ĐŋĐžĐēаСŅваĐĩŅ ŅаĐŧŅŅ Đ˛ŅŅĐžĐēŅŅ ŅĐēĐžŅĐžŅŅŅ ŅŅĐĩди Python-ŅŅĐĩĐšĐŧвОŅĐēОв в ŅĐĩŅŅОвŅŅ
СаĐŧĐĩŅаŅ
.
-ĐŅŅŅŅĐĩĐĩ ŅĐžĐģŅĐēĐž Uvicorn, ĐēĐžŅĐžŅŅĐš ŅвĐģŅĐĩŅŅŅ ŅĐĩŅвĐĩŅĐžĐŧ, а ĐŊĐĩ ŅŅĐĩĐšĐŧвОŅĐēĐžĐŧ.
+Đ ĐŊаŅŅĐžŅŅĐĩĐĩ вŅĐĩĐŧŅ Starlette â ŅаĐŧŅĐš ĐąŅŅŅŅŅĐš иС ĐŋŅĐžŅĐĩŅŅиŅОваĐŊĐŊŅŅ
Python-ŅŅĐĩĐšĐŧвОŅĐēОв. ĐĐŗĐž ĐŋŅĐĩвОŅŅ
ĐžĐ´Đ¸Ņ ŅĐžĐģŅĐēĐž Uvicorn, ĐēĐžŅĐžŅŅĐš ĐŊĐĩ ŅŅĐĩĐšĐŧвОŅĐē, а ŅĐĩŅвĐĩŅ.
-Starlette ОйĐĩŅĐŋĐĩŅиваĐĩŅ Đ˛ĐĩŅŅ ŅŅĐŊĐēŅиОĐŊаĐģ ĐŧиĐēŅĐžŅŅĐĩĐšĐŧвОŅĐēа, ĐŊĐž ĐŊĐĩ ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēŅŅ Đ˛Đ°ĐģидаŅĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
, ŅĐĩŅиаĐģиСаŅĐ¸Ņ Đ¸ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиŅ.
+Starlette ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ Đ˛ĐĩŅŅ ĐąĐ°ĐˇĐžĐ˛ŅĐš ŅŅĐŊĐēŅиОĐŊаĐģ вĐĩĐą-ĐŧиĐēŅĐžŅŅĐĩĐšĐŧвОŅĐēа.
-**FastAPI** дОйавĐģŅĐĩŅ ŅŅи ŅŅĐŊĐēŅии иŅĐŋĐžĐģŅСŅŅ ĐŋОдŅĐēаСĐēи ŅиĐŋОв Python и Pydantic.
-ĐŅŅ **FastAPI** дОйавĐģŅĐĩŅ ŅиŅŅĐĩĐŧŅ Đ˛ĐŊĐĩĐ´ŅĐĩĐŊĐ¸Ņ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅĐĩĐš, ŅŅиĐģиŅŅ ĐąĐĩСОĐŋаŅĐŊĐžŅŅи, ĐŗĐĩĐŊĐĩŅаŅĐ¸Ņ ŅŅ
ĐĩĐŧŅ OpenAPI и Ņ.Đ´.
+ĐĐž ĐžĐŊ ĐŊĐĩ ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēŅŅ Đ˛Đ°ĐģидаŅĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
, ŅĐĩŅиаĐģиСаŅĐ¸Ņ Đ¸Đģи Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиŅ.
+
+ĐŅĐž ОдĐŊа иС ĐŗĐģавĐŊŅŅ
вĐĩŅĐĩĐš, ĐēĐžŅĐžŅŅĐĩ **FastAPI** дОйавĐģŅĐĩŅ ĐŋОвĐĩŅŅ
, вŅŅ ĐŊа ĐžŅĐŊОвĐĩ аĐŊĐŊĐžŅаŅиК ŅиĐŋОв Python (Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩĐŧ Pydantic). ĐĐģŅŅ ŅиŅŅĐĩĐŧа вĐŊĐĩĐ´ŅĐĩĐŊĐ¸Ņ ĐˇĐ°Đ˛Đ¸ŅиĐŧĐžŅŅĐĩĐš, ŅŅиĐģиŅŅ ĐąĐĩСОĐŋаŅĐŊĐžŅŅи, ĐŗĐĩĐŊĐĩŅаŅĐ¸Ņ ŅŅ
ĐĩĐŧŅ OpenAPI и Ņ. Đ´.
/// note | ĐĸĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ Đ´ĐĩŅаĐģи
-ASGI - ŅŅĐž ĐŊОвŅĐš "ŅŅаĐŊдаŅŅ" ŅаСŅайОŅаĐŊĐŊŅĐš ŅŅаŅŅĐŊиĐēаĐŧи ĐēĐžĐŧаĐŊĐ´Ņ Django.
-ĐĐŊ ĐŋĐžĐēа ŅŅĐž ĐŊĐĩ ŅвĐģŅĐĩŅŅŅ "ŅŅаĐŊдаŅŅĐžĐŧ в Python" (ŅĐž ĐĩŅŅŅ ĐŋŅиĐŊŅŅŅĐŧ PEP), ĐŊĐž ĐŋŅĐžŅĐĩŅŅ ĐŋŅиĐŊŅŅĐ¸Ņ ĐˇĐ°ĐŋŅŅĐĩĐŊ.
+ASGI â ŅŅĐž ĐŊОвŅĐš ÂĢŅŅаĐŊдаŅŅÂģ, ŅаСŅайаŅŅваĐĩĐŧŅĐš ŅŅаŅŅĐŊиĐēаĐŧи core-ĐēĐžĐŧаĐŊĐ´Ņ Django. ĐĐŊ вŅŅ ĐĩŅŅ ĐŊĐĩ ŅвĐģŅĐĩŅŅŅ ÂĢŅŅаĐŊдаŅŅĐžĐŧ PythonÂģ (PEP), Ņ
ĐžŅŅ ĐŋŅĐžŅĐĩŅŅ Đ¸Đ´ŅŅ.
-ĐĸĐĩĐŧ ĐŊĐĩ ĐŧĐĩĐŊĐĩĐĩ ĐžĐŊ ŅĐļĐĩ иŅĐŋĐžĐģŅСŅĐĩŅŅŅ Đ˛ ĐēаŅĐĩŅŅвĐĩ "ŅŅаĐŊдаŅŅа" ĐŊĐĩŅĐēĐžĐģŅĐēиĐŧи иĐŊŅŅŅŅĐŧĐĩĐŊŅаĐŧи.
-ĐŅĐž СĐŊаŅиŅĐĩĐģŅĐŊĐž ŅĐģŅŅŅаĐĩŅ ŅОвĐŧĐĩŅŅиĐŧĐžŅŅŅ, ĐŋĐžŅĐēĐžĐģŅĐēŅ ĐŅ ĐŧĐžĐļĐĩŅĐĩ ĐŋĐĩŅĐĩĐēĐģŅŅиŅŅŅŅ Ņ Uvicorn ĐŊа ĐģŅйОК Đ´ŅŅĐŗĐžĐš ASGI-ŅĐĩŅвĐĩŅ (ĐŊаĐŋŅиĐŧĐĩŅ, Daphne иĐģи Hypercorn) иĐģи ĐŅ ĐŧĐžĐļĐĩŅĐĩ дОйавиŅŅ ASGI-ŅОвĐŧĐĩŅŅиĐŧŅĐĩ иĐŊŅŅŅŅĐŧĐĩĐŊŅŅ, ŅаĐēиĐĩ ĐēаĐē `python-socketio`.
+ĐĸĐĩĐŧ ĐŊĐĩ ĐŧĐĩĐŊĐĩĐĩ ĐĩĐŗĐž ŅĐļĐĩ иŅĐŋĐžĐģŅСŅŅŅ ĐēаĐē ÂĢŅŅаĐŊдаŅŅÂģ ĐŊĐĩŅĐēĐžĐģŅĐēĐž иĐŊŅŅŅŅĐŧĐĩĐŊŅОв. ĐŅĐž ŅиĐģŅĐŊĐž ŅĐģŅŅŅаĐĩŅ ŅОвĐŧĐĩŅŅиĐŧĐžŅŅŅ: Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ СаĐŧĐĩĐŊиŅŅ Uvicorn ĐŊа ĐģŅйОК Đ´ŅŅĐŗĐžĐš ASGI-ŅĐĩŅвĐĩŅ (ĐŊаĐŋŅиĐŧĐĩŅ, Daphne иĐģи Hypercorn) иĐģи дОйавиŅŅ ŅОвĐŧĐĩŅŅиĐŧŅĐĩ Ņ ASGI иĐŊŅŅŅŅĐŧĐĩĐŊŅŅ, ŅаĐēиĐĩ ĐēаĐē `python-socketio`.
///
-/// check | **FastAPI** иŅĐŋĐžĐģŅСŅĐĩŅ Starlette
+/// check | **FastAPI** иŅĐŋĐžĐģŅСŅĐĩŅ ĐĩĐŗĐž Đ´ĐģŅ
-Đ ĐēаŅĐĩŅŅвĐĩ ŅĐ´Ņа вĐĩĐą-ŅĐĩŅвиŅа Đ´ĐģŅ ĐžĐąŅайОŅĐēи СаĐŋŅĐžŅОв, дОйавив ĐŊĐĩĐēĐžŅĐžŅŅĐĩ ŅŅĐŊĐēŅии ŅвĐĩŅŅ
Ņ.
+ĐĐąŅайОŅĐēи вŅĐĩŅ
ĐžŅĐŊОвĐŊŅŅ
вĐĩĐą-ŅаŅŅĐĩĐš. ĐОйавĐģŅŅ Đ˛ĐžĐˇĐŧĐžĐļĐŊĐžŅŅи ĐŋОвĐĩŅŅ
.
-ĐĐģаŅŅ `FastAPI` ĐŊаŅĐģĐĩĐ´ŅĐĩŅŅŅ ĐŊаĐŋŅŅĐŧŅŅ ĐžŅ ĐēĐģаŅŅа `Starlette`.
+ĐĐģаŅŅ `FastAPI` ĐŊаĐŋŅŅĐŧŅŅ ĐŊаŅĐģĐĩĐ´ŅĐĩŅŅŅ ĐžŅ ĐēĐģаŅŅа `Starlette`.
-ĐĸаĐēиĐŧ ОйŅаСОĐŧ, вŅŅ ŅŅĐž ĐŅ ĐŧĐžĐŗĐģи Đ´ĐĩĐģаŅŅ ŅĐž Starlette, ĐŅ ĐŧĐžĐļĐĩŅĐĩ Đ´ĐĩĐģаŅŅ Ņ **FastAPI**, ĐŋĐž ŅŅŅи ŅŅĐž ĐŋŅĐžĐēаŅаĐŊĐŊŅĐš Starlette.
+ĐĸаĐē ŅŅĐž вŅŅ, ŅŅĐž Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅĐ´ĐĩĐģаŅŅ ŅĐž Starlette, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅĐ´ĐĩĐģаŅŅ ĐŊаĐŋŅŅĐŧŅŅ Ņ **FastAPI**, ĐŋĐž ŅŅŅи ŅŅĐž ÂĢStarlette ĐŊа ŅŅĐĩŅОидаŅ
Âģ.
///
-### Uvicorn
+### Uvicorn { #uvicorn }
-Uvicorn - ŅŅĐž ĐŧĐžĐģĐŊиĐĩĐŊĐžŅĐŊŅĐš ASGI-ŅĐĩŅвĐĩŅ, ĐŋĐžŅŅŅĐžĐĩĐŊĐŊŅĐš ĐŊа uvloop и httptools.
+Uvicorn â ĐŧĐžĐģĐŊиĐĩĐŊĐžŅĐŊŅĐš ASGI-ŅĐĩŅвĐĩŅ, ĐŋĐžŅŅŅĐžĐĩĐŊĐŊŅĐš ĐŊа uvloop и httptools.
-Uvicorn ŅвĐģŅĐĩŅŅŅ ŅĐĩŅвĐĩŅĐžĐŧ, а ĐŊĐĩ ŅŅĐĩĐšĐŧвОŅĐēĐžĐŧ.
-ĐаĐŋŅиĐŧĐĩŅ, ĐžĐŊ ĐŊĐĩ ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ Đ¸ĐŊŅŅŅŅĐŧĐĩĐŊŅОв Đ´ĐģŅ ĐŧаŅŅŅŅŅиСаŅии СаĐŋŅĐžŅОв ĐŋĐž ŅĐĩŅŅŅŅаĐŧ.
-ĐĐģŅ ŅŅĐžĐŗĐž ĐŊŅĐļĐŊа ĐŊадŅŅŅОКĐēа, ŅаĐēĐ°Ņ ĐēаĐē Starlette (иĐģи **FastAPI**).
+ĐŅĐž ĐŊĐĩ вĐĩĐą-ŅŅĐĩĐšĐŧвОŅĐē, а ŅĐĩŅвĐĩŅ. ĐаĐŋŅиĐŧĐĩŅ, ĐžĐŊ ĐŊĐĩ ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ Đ¸ĐŊŅŅŅŅĐŧĐĩĐŊŅŅ Đ´ĐģŅ ĐŧаŅŅŅŅŅиСаŅии ĐŋĐž ĐŋŅŅŅĐŧ. ĐŅĐž ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ ŅвĐĩŅŅ
Ņ ŅŅĐĩĐšĐŧвОŅĐē, ŅаĐēОК ĐēаĐē Starlette (иĐģи **FastAPI**).
-ĐĐŊ ŅĐĩĐēĐžĐŧĐĩĐŊĐ´ŅĐĩŅŅŅ Đ˛ ĐēаŅĐĩŅŅвĐĩ ŅĐĩŅвĐĩŅа Đ´ĐģŅ Starlette и **FastAPI**.
+ĐŅĐž ŅĐĩĐēĐžĐŧĐĩĐŊĐ´ŅĐĩĐŧŅĐš ŅĐĩŅвĐĩŅ Đ´ĐģŅ Starlette и **FastAPI**.
-/// check | **FastAPI** ŅĐĩĐēĐžĐŧĐĩĐŊĐ´ŅĐĩŅ ĐĩĐŗĐž
+/// check | **FastAPI** ŅĐĩĐēĐžĐŧĐĩĐŊĐ´ŅĐĩŅ ĐĩĐŗĐž ĐēаĐē
-ĐаĐē ĐžŅĐŊОвĐŊОК ŅĐĩŅвĐĩŅ Đ´ĐģŅ ĐˇĐ°ĐŋŅŅĐēа ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ **FastAPI**.
+ĐŅĐŊОвĐŊОК вĐĩĐą-ŅĐĩŅвĐĩŅ Đ´ĐģŅ ĐˇĐ°ĐŋŅŅĐēа ĐŋŅиĐģĐžĐļĐĩĐŊиК **FastAPI**.
-ĐŅ ĐŧĐžĐļĐĩŅĐĩ ОйŅĐĩдиĐŊиŅŅ ĐĩĐŗĐž Ņ Gunicorn, ŅŅĐžĐąŅ Đ¸ĐŧĐĩŅŅ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš ĐŧĐŊĐžĐŗĐžĐŋŅĐžŅĐĩŅŅĐŊŅĐš ŅĐĩŅвĐĩŅ.
+ĐĸаĐēĐļĐĩ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ ĐžĐŋŅĐ¸Ņ ĐēĐžĐŧаĐŊĐ´ĐŊОК ŅŅŅĐžĐēи `--workers`, ŅŅĐžĐąŅ ĐŋĐžĐģŅŅиŅŅ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš ĐŧĐŊĐžĐŗĐžĐŋŅĐžŅĐĩŅŅĐŊŅĐš ŅĐĩŅвĐĩŅ.
-ĐŖĐˇĐŊаŅŅ ĐąĐžĐģŅŅĐĩ Đ´ĐĩŅаĐģĐĩĐš ĐŧĐžĐļĐŊĐž в ŅаСдĐĩĐģĐĩ [РаСвŅŅŅŅваĐŊиĐĩ](deployment/index.md){.internal-link target=_blank}.
+ĐОдŅОйĐŊĐĩĐĩ ŅĐŧ. ŅаСдĐĩĐģ [РаСвŅŅŅŅваĐŊиĐĩ](deployment/index.md){.internal-link target=_blank}.
///
-## ĐĸĐĩŅŅОвŅĐĩ СаĐŧĐĩŅŅ Đ¸ ŅĐēĐžŅĐžŅŅŅ
+## ĐĐĩĐŊŅĐŧаŅĐēи и ŅĐēĐžŅĐžŅŅŅ { #benchmarks-and-speed }
-ЧŅĐžĐąŅ ĐŋĐžĐŊŅŅŅ, ŅŅавĐŊиŅŅ Đ¸ ŅвидĐĩŅŅ ŅаСĐŊиŅŅ ĐŧĐĩĐļĐ´Ņ Uvicorn, Starlette и FastAPI, ОСĐŊаĐēĐžĐŧŅŅĐĩŅŅ Ņ ŅаСдĐĩĐģĐžĐŧ [ĐĸĐĩŅŅОвŅĐĩ СаĐŧĐĩŅŅ](benchmarks.md){.internal-link target=_blank}.
+ЧŅĐžĐąŅ ĐŋĐžĐŊŅŅŅ, ŅŅавĐŊиŅŅ Đ¸ ŅвидĐĩŅŅ ŅаСĐŊиŅŅ ĐŧĐĩĐļĐ´Ņ Uvicorn, Starlette и FastAPI, ŅĐŧ. ŅаСдĐĩĐģ Đž [ĐĐĩĐŊŅĐŧаŅĐēаŅ
](benchmarks.md){.internal-link target=_blank}.
diff --git a/docs/ru/docs/async.md b/docs/ru/docs/async.md
index 6c5d982df..15d4e108a 100644
--- a/docs/ru/docs/async.md
+++ b/docs/ru/docs/async.md
@@ -1,18 +1,18 @@
-# ĐĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅŅ Đ¸ async / await
+# ĐĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅŅ Đ¸ async / await { #concurrency-and-async-await }
-ĐĐ´ĐĩŅŅ ĐŋŅивĐĩĐ´ĐĩĐŊа ĐŋОдŅОйĐŊĐ°Ņ Đ¸ĐŊŅĐžŅĐŧаŅĐ¸Ņ ĐžĐą иŅĐŋĐžĐģŅСОваĐŊии ŅиĐŊŅаĐēŅиŅа `async def` ĐŋŅи ĐŊаĐŋиŅаĐŊии *ŅŅĐŊĐēŅиК ОйŅайОŅĐēи ĐŋŅŅи*, а ŅаĐēĐļĐĩ ŅаŅŅĐŧĐžŅŅĐĩĐŊŅ ĐžŅĐŊĐžĐ˛Ņ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊĐžĐŗĐž ĐŋŅĐžĐŗŅаĐŧĐŧиŅОваĐŊиŅ, ĐēĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅи и ĐŋаŅаĐģĐģĐĩĐģиСĐŧа.
+ĐОдŅОйĐŊĐžŅŅи Đž ŅиĐŊŅаĐēŅиŅĐĩ `async def` Đ´ĐģŅ *ŅŅĐŊĐēŅиК-ОйŅайОŅŅиĐēОв ĐŋŅŅи* и ĐŊĐĩĐŧĐŊĐžĐŗĐž ŅĐžĐŊа Ой аŅиĐŊŅ
ŅĐžĐŊĐŊĐžĐŧ ĐēОдĐĩ, ĐēĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅи и ĐŋаŅаĐģĐģĐĩĐģиСĐŧĐĩ.
-## ĐĐĩŅ Đ˛ŅĐĩĐŧĐĩĐŊи?
+## ĐĐĩŅ Đ˛ŅĐĩĐŧĐĩĐŊи? { #in-a-hurry }
-TL;DR:
+TL;DR:
-ĐĐžĐŋŅŅŅиĐŧ, Đ˛Ņ Đ¸ŅĐŋĐžĐģŅСŅĐĩŅĐĩ ŅŅĐžŅĐžĐŊŅŅ ĐąĐ¸ĐąĐģиОŅĐĩĐēŅ, ĐēĐžŅĐžŅĐ°Ņ ŅŅĐĩĐąŅĐĩŅ Đ˛ŅСОва Ņ ĐēĐģŅŅĐĩвŅĐŧ ŅĐģОвОĐŧ `await`:
+ĐŅĐģи Đ˛Ņ Đ¸ŅĐŋĐžĐģŅСŅĐĩŅĐĩ ŅŅĐžŅĐžĐŊĐŊиĐĩ йийĐģиОŅĐĩĐēи, ĐēĐžŅĐžŅŅĐĩ ĐŊŅĐļĐŊĐž вŅСŅваŅŅ Ņ `await`, ĐŊаĐŋŅиĐŧĐĩŅ:
```Python
results = await some_library()
```
-Đ ŅŅĐžĐŧ ŅĐģŅŅаĐĩ *ŅŅĐŊĐēŅии ОйŅайОŅĐēи ĐŋŅŅи* ĐŊĐĩОйŅ
ОдиĐŧĐž ОйŅŅвĐģŅŅŅ Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩĐŧ ŅиĐŊŅаĐēŅиŅа `async def`:
+ĐĸĐžĐŗĐ´Đ° ОйŅŅвĐģŅĐšŅĐĩ *ŅŅĐŊĐēŅии-ОйŅайОŅŅиĐēи ĐŋŅŅи* Ņ `async def`, ĐŊаĐŋŅиĐŧĐĩŅ:
```Python hl_lines="2"
@app.get('/')
@@ -21,18 +21,15 @@ async def read_results():
return results
```
-/// note
+/// note | ĐŅиĐŧĐĩŅаĐŊиĐĩ
-`await` ĐŧĐžĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ ŅĐžĐģŅĐēĐž вĐŊŅŅŅи ŅŅĐŊĐēŅиК, ОйŅŅвĐģĐĩĐŊĐŊŅŅ
Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩĐŧ `async def`.
+`await` ĐŧĐžĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ ŅĐžĐģŅĐēĐž вĐŊŅŅŅи ŅŅĐŊĐēŅиК, ОйŅŅвĐģĐĩĐŊĐŊŅŅ
Ņ `async def`.
///
---
-ĐŅĐģи Đ˛Ņ ĐžĐąŅаŅаĐĩŅĐĩŅŅ Đē ŅŅĐžŅĐžĐŊĐŊĐĩĐš йийĐģиОŅĐĩĐēĐĩ, ĐēĐžŅĐžŅĐ°Ņ Ņ ŅĐĩĐŧ-ŅĐž вСаиĐŧОдĐĩĐšŅŅвŅĐĩŅ
-(Ņ ĐąĐ°ĐˇĐžĐš даĐŊĐŊŅŅ
, API, ŅаКĐģОвОК ŅиŅŅĐĩĐŧОК и Ņ. Đ´.), и ĐŊĐĩ иĐŧĐĩĐĩŅ ĐŋОддĐĩŅĐļĐēи ŅиĐŊŅаĐēŅиŅа `await`
-(ŅŅĐž ĐžŅĐŊĐžŅиŅŅŅ ŅĐĩĐšŅĐ°Ņ Đē йОĐģŅŅиĐŊŅŅĐ˛Ņ ĐąĐ¸ĐąĐģиОŅĐĩĐē Đ´ĐģŅ ŅайОŅŅ Ņ ĐąĐ°ĐˇĐ°Đŧи даĐŊĐŊŅŅ
), ŅĐž
-ОйŅŅвĐģŅĐšŅĐĩ *ŅŅĐŊĐēŅии ОйŅайОŅĐēи ĐŋŅŅи* ОйŅŅĐŊŅĐŧ ОйŅаСОĐŧ Ņ ĐŋĐžĐŧĐžŅŅŅ `def`, ĐŊаĐŋŅиĐŧĐĩŅ:
+ĐŅĐģи Đ˛Ņ Đ¸ŅĐŋĐžĐģŅСŅĐĩŅĐĩ ŅŅĐžŅĐžĐŊĐŊŅŅ ĐąĐ¸ĐąĐģиОŅĐĩĐēŅ, ĐēĐžŅĐžŅĐ°Ņ Đ˛ĐˇĐ°Đ¸ĐŧОдĐĩĐšŅŅвŅĐĩŅ Ņ ŅĐĩĐŧ-ŅĐž (йаСа даĐŊĐŊŅŅ
, API, ŅаКĐģĐžĐ˛Đ°Ņ ŅиŅŅĐĩĐŧа и Ņ.Đ´.) и ĐŊĐĩ ĐŋОддĐĩŅĐļиваĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩ `await` (ŅĐĩĐšŅĐ°Ņ ŅŅĐž ĐžŅĐŊĐžŅиŅŅŅ Đē йОĐģŅŅиĐŊŅŅĐ˛Ņ ĐąĐ¸ĐąĐģиОŅĐĩĐē Đ´ĐģŅ ĐĐ), ŅĐžĐŗĐ´Đ° ОйŅŅвĐģŅĐšŅĐĩ *ŅŅĐŊĐēŅии-ОйŅайОŅŅиĐēи ĐŋŅŅи* ĐēаĐē ОйŅŅĐŊĐž, ĐŋŅĐžŅŅĐž Ņ `def`, ĐŊаĐŋŅиĐŧĐĩŅ:
```Python hl_lines="2"
@app.get('/')
@@ -43,310 +40,283 @@ def results():
---
-ĐŅĐģи ваŅĐĩĐŧŅ ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ (ŅŅŅаĐŊĐŊŅĐŧ ОйŅаСОĐŧ) ĐŊĐĩ ĐŊŅĐļĐŊĐž ĐŊи Ņ ŅĐĩĐŧ вСаиĐŧОдĐĩĐšŅŅвОваŅŅ Đ¸, ŅООŅвĐĩŅŅŅвĐĩĐŊĐŊĐž,
-ĐžĐļидаŅŅ ĐžŅвĐĩŅа, иŅĐŋĐžĐģŅСŅĐšŅĐĩ `async def`.
+ĐŅĐģи ваŅĐĩĐŧŅ ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ (ĐŋĐž ĐēаĐēОК-ŅĐž ĐŋŅиŅиĐŊĐĩ) ĐŊĐĩ ĐŊŅĐļĐŊĐž ĐŊи Ņ ŅĐĩĐŧ вСаиĐŧОдĐĩĐšŅŅвОваŅŅ Đ¸ ĐļдаŅŅ ĐžŅвĐĩŅа, иŅĐŋĐžĐģŅСŅĐšŅĐĩ `async def`, даĐļĐĩ ĐĩŅĐģи вĐŊŅŅŅи ĐŊĐĩ ĐŊŅĐļĐĩĐŊ `await`.
---
-ĐŅĐģи Đ˛Ņ ĐŊĐĩ ŅвĐĩŅĐĩĐŊŅ, иŅĐŋĐžĐģŅСŅĐšŅĐĩ ОйŅŅĐŊŅĐš ŅиĐŊŅаĐēŅĐ¸Ņ `def`.
+ĐŅĐģи Đ˛Ņ ĐŋŅĐžŅŅĐž ĐŊĐĩ ŅвĐĩŅĐĩĐŊŅ, иŅĐŋĐžĐģŅСŅĐšŅĐĩ ОйŅŅĐŊŅĐš `def`.
---
-**ĐŅиĐŧĐĩŅаĐŊиĐĩ**: ĐŋŅи ĐŊĐĩОйŅ
ОдиĐŧĐžŅŅи ĐŧĐžĐļĐŊĐž ŅĐŧĐĩŅиваŅŅ `def` и `async def` в *ŅŅĐŊĐēŅиŅŅ
ОйŅайОŅĐēи ĐŋŅŅи*
-и иŅĐŋĐžĐģŅСОваŅŅ Đ˛ ĐēаĐļĐ´ĐžĐŧ ŅĐģŅŅаĐĩ ĐŊаийОĐģĐĩĐĩ ĐŋОдŅ
ОдŅŅиК ŅиĐŊŅаĐēŅиŅ. Đ FastAPI ŅĐ´ĐĩĐģаĐĩŅ Ņ ŅŅиĐŧ вŅŅ, ŅŅĐž ĐŊŅĐļĐŊĐž.
+**ĐŅиĐŧĐĩŅаĐŊиĐĩ**: Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅĐŧĐĩŅиваŅŅ `def` и `async def` в *ŅŅĐŊĐēŅиŅŅ
-ОйŅайОŅŅиĐēаŅ
ĐŋŅŅи* ŅŅĐžĐģŅĐēĐž, ŅĐēĐžĐģŅĐēĐž ĐŊŅĐļĐŊĐž, и ОйŅŅвĐģŅŅŅ ĐēаĐļĐ´ŅŅ ŅаĐē, ĐēаĐē ĐģŅŅŅĐĩ Đ´ĐģŅ Đ˛Đ°ŅĐĩĐŗĐž ŅĐģŅŅаŅ. FastAPI ŅĐ´ĐĩĐģаĐĩŅ Ņ ĐŊиĐŧи вŅŅ ĐēаĐē ĐŊадО.
-Đ ĐģŅйОĐŧ иС ĐžĐŋиŅаĐŊĐŊŅŅ
ŅĐģŅŅаĐĩв FastAPI ŅайОŅаĐĩŅ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊĐž и ĐžŅĐĩĐŊŅ ĐąŅŅŅŅĐž.
+Đ ĐģŅйОĐŧ иС ŅĐģŅŅаĐĩв вŅŅĐĩ FastAPI вŅŅ ŅавĐŊĐž ŅайОŅаĐĩŅ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊĐž и ĐžŅĐĩĐŊŅ ĐąŅŅŅŅĐž.
-ĐĐ´ĐŊаĐēĐž ĐŋŅидĐĩŅĐļиваŅŅŅ ŅĐēаСаĐŊĐŊŅŅ
ŅОвĐĩŅОв, ĐŧĐžĐļĐŊĐž ĐŋĐžĐģŅŅиŅŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅŅ ĐžĐŋŅиĐŧиСаŅĐ¸Ņ ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅи.
+ĐĐž ŅĐģĐĩĐ´ŅŅ ŅŅиĐŧ ŅĐ°ĐŗĐ°Đŧ, ĐžĐŊ ŅĐŧĐžĐļĐĩŅ Đ˛ŅĐŋĐžĐģĐŊиŅŅ ĐŊĐĩĐēĐžŅĐžŅŅĐĩ ĐžĐŋŅиĐŧиСаŅии ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅи.
-## ĐĸĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ ĐŋОдŅОйĐŊĐžŅŅи
+## ĐĸĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ ĐŋОдŅОйĐŊĐžŅŅи { #technical-details }
-ХОвŅĐĩĐŧĐĩĐŊĐŊŅĐĩ вĐĩŅŅии Python ĐŋОддĐĩŅĐļиваŅŅ ŅаСŅайОŅĐēŅ ŅаĐē ĐŊаСŅваĐĩĐŧĐžĐŗĐž **"аŅиĐŊŅ
ŅĐžĐŊĐŊĐžĐŗĐž ĐēОда"** ĐŋĐžŅŅĐĩĐ´ŅŅвОĐŧ ĐŊаĐŋиŅаĐŊĐ¸Ņ **"ŅĐžĐŋŅĐžĐŗŅаĐŧĐŧ"** Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩĐŧ ŅиĐŊŅаĐēŅиŅа **`async` и `await`**.
+ХОвŅĐĩĐŧĐĩĐŊĐŊŅĐĩ вĐĩŅŅии Python ĐŋОддĐĩŅĐļиваŅŅ **ÂĢаŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš ĐēОдÂģ** Ņ ĐŋĐžĐŧĐžŅŅŅ **ÂĢŅĐžĐŋŅĐžĐŗŅаĐŧĐŧÂģ** (coroutines) и ŅиĐŊŅаĐēŅиŅа **`async` и `await`**.
-ĐиĐļĐĩ ŅаСйĐĩŅŅĐŧ ŅŅŅ ŅŅĐ°ĐˇŅ ĐŋĐž ŅаŅŅŅĐŧ:
+РаСйĐĩŅŅĐŧ ŅŅŅ ŅŅĐ°ĐˇŅ ĐŋĐž ŅаŅŅŅĐŧ в ŅаСдĐĩĐģаŅ
ĐŊиĐļĐĩ:
* **ĐŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš ĐēОд**
* **`async` и `await`**
* **ĐĄĐžĐŋŅĐžĐŗŅаĐŧĐŧŅ**
-## ĐŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš ĐēОд
+## ĐŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš ĐēОд { #asynchronous-code }
-ĐŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš ĐēОд ОСĐŊаŅаĐĩŅ, ŅŅĐž в ŅСŅĐēĐĩ đŦ ĐĩŅŅŅ Đ˛ĐžĐˇĐŧĐžĐļĐŊĐžŅŅŅ ŅООйŅиŅŅ ĐŧаŅиĐŊĐĩ / ĐŋŅĐžĐŗŅаĐŧĐŧĐĩ đ¤,
-ŅŅĐž в ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐŊОК ŅĐžŅĐēĐĩ ĐēОда ĐĩĐš đ¤ ĐŊŅĐļĐŊĐž ĐąŅĐ´ĐĩŅ ĐžĐļидаŅŅ ĐˇĐ°Đ˛ĐĩŅŅĐĩĐŊĐ¸Ņ Đ˛ŅĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ *ŅĐĩĐŗĐž-ŅĐž ĐĩŅŅ* в Đ´ŅŅĐŗĐžĐŧ ĐŧĐĩŅŅĐĩ. ĐĐžĐŋŅŅŅиĐŧ ŅŅĐž *ŅŅĐž-ŅĐž ĐĩŅŅ* ĐŊаСŅваĐĩŅŅŅ "ĐŧĐĩĐ´ĐģĐĩĐŊĐŊŅĐš ŅаКĐģ" đ.
+ĐŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš ĐēОд СĐŊаŅиŅ, ŅŅĐž в ŅСŅĐēĐĩ đŦ ĐĩŅŅŅ ŅĐŋĐžŅОй ŅĐēаСаŅŅ ĐēĐžĐŧĐŋŅŅŅĐĩŅŅ/ĐŋŅĐžĐŗŅаĐŧĐŧĐĩ đ¤, ŅŅĐž в ĐŊĐĩĐēĐžŅĐžŅŅĐš ĐŧĐžĐŧĐĩĐŊŅ ĐēОда ĐĩĐŧŅ đ¤ ĐŋŅидŅŅŅŅ ĐŋОдОĐļдаŅŅ, ĐŋĐžĐēа *ŅŅĐž-ŅĐž ĐĩŅŅ* ĐŗĐ´Đĩ-ŅĐž в Đ´ŅŅĐŗĐžĐŧ ĐŧĐĩŅŅĐĩ СавĐĩŅŅиŅŅŅ. ĐаСОвŅĐŧ ŅŅĐž *ŅŅĐž-ŅĐž ĐĩŅŅ* ÂĢĐŧĐĩĐ´ĐģĐĩĐŊĐŊŅĐš ŅаКĐģÂģ đ.
-Đ ĐŋĐžĐēа ĐŧŅ ĐļĐ´ŅĐŧ СавĐĩŅŅĐĩĐŊĐ¸Ņ ŅайОŅŅ Ņ "ĐŧĐĩĐ´ĐģĐĩĐŊĐŊŅĐŧ ŅаКĐģĐžĐŧ" đ, ĐēĐžĐŧĐŋŅŅŅĐĩŅ ĐŧĐžĐļĐĩŅ ĐŋĐĩŅĐĩĐēĐģŅŅиŅŅŅŅ Đ´ĐģŅ Đ˛ŅĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ Đ´ŅŅĐŗĐ¸Ņ
СадаŅ.
+Đ ĐŋĐžĐēа ĐŧŅ ĐļĐ´ŅĐŧ СавĐĩŅŅĐĩĐŊĐ¸Ņ ŅайОŅŅ Ņ ÂĢĐŧĐĩĐ´ĐģĐĩĐŊĐŊŅи ŅаКĐģĐžĐŧÂģ đ, ĐēĐžĐŧĐŋŅŅŅĐĩŅ ĐŧĐžĐļĐĩŅ ĐˇĐ°ĐŊŅŅŅŅŅ Đ´ŅŅĐŗĐžĐš ŅайОŅОК.
-ĐĐž ĐŋŅи ĐēаĐļдОК вОСĐŧĐžĐļĐŊĐžŅŅи ĐēĐžĐŧĐŋŅŅŅĐĩŅ / ĐŋŅĐžĐŗŅаĐŧĐŧа đ¤ ĐąŅĐ´ĐĩŅ Đ˛ĐžĐˇĐ˛ŅаŅаŅŅŅŅ ĐžĐąŅаŅĐŊĐž. ĐаĐŋŅиĐŧĐĩŅ, ĐĩŅĐģи ĐžĐŊ đ¤ ĐžĐŋŅŅŅ ĐžĐēаĐļĐĩŅŅŅ Đ˛ ŅĐĩĐļиĐŧĐĩ ĐžĐļидаĐŊиŅ, иĐģи ĐēĐžĐŗĐ´Đ° СаĐēĐžĐŊŅĐ¸Ņ Đ˛ŅŅ ŅайОŅŅ. Đ ŅŅĐžĐŧ ŅĐģŅŅаĐĩ ĐēĐžĐŧĐŋŅŅŅĐĩŅ đ¤ ĐŋŅОвĐĩŅŅĐĩŅ, ĐŊĐĩ СавĐĩŅŅĐĩĐŊа Đģи ĐēаĐēаŅ-ĐŊийŅĐ´Ņ Đ¸Đˇ ŅĐĩĐēŅŅиŅ
СадаŅ.
+ĐаŅĐĩĐŧ ĐēĐžĐŧĐŋŅŅŅĐĩŅ/ĐŋŅĐžĐŗŅаĐŧĐŧа đ¤ ĐąŅĐ´ĐĩŅ Đ˛ĐžĐˇĐ˛ŅаŅаŅŅŅŅ ĐēаĐļĐ´ŅĐš ŅаС, ĐēĐžĐŗĐ´Đ° ĐŋĐžŅвиŅŅŅ Đ˛ĐžĐˇĐŧĐžĐļĐŊĐžŅŅŅ (ĐŋĐžĐēа ŅĐŊОва ĐŗĐ´Đĩ-ŅĐž идŅŅ ĐžĐļидаĐŊиĐĩ), иĐģи ĐēĐžĐŗĐ´Đ° đ¤ СавĐĩŅŅĐ¸Ņ Đ˛ŅŅ ŅĐĩĐēŅŅŅŅ ŅайОŅŅ. Đ ĐžĐŊ đ¤ ĐŋŅОвĐĩŅиŅ, ĐŊĐĩ СавĐĩŅŅиĐģаŅŅ Đģи ĐēаĐēаŅ-ĐģийО иС СадаŅ, ĐēĐžŅĐžŅŅŅ
ĐžĐŊ ĐļдаĐģ, и ŅĐ´ĐĩĐģаĐĩŅ ŅĐž, ŅŅĐž ĐŊŅĐļĐŊĐž.
-ĐĐžŅĐžĐŧ ĐžĐŊ đ¤ ĐąĐĩŅŅŅ ĐŋĐĩŅвŅŅ Đ˛ŅĐŋĐžĐģĐŊĐĩĐŊĐŊŅŅ ĐˇĐ°Đ´Đ°ŅŅ (Đ´ĐžĐŋŅŅŅиĐŧ, ĐŊĐ°Ņ "ĐŧĐĩĐ´ĐģĐĩĐŊĐŊŅĐš ŅаКĐģ" đ) и ĐŋŅОдОĐģĐļаĐĩŅ ŅайОŅŅ, ĐŋŅĐžĐ¸ĐˇĐ˛ĐžĐ´Ņ Ņ ĐŊĐĩĐš ĐŊĐĩОйŅ
ОдиĐŧŅĐĩ Đ´ĐĩĐšŅŅвиŅ.
+ĐаĐģĐĩĐĩ ĐžĐŊ đ¤ вОСŅĐŧŅŅ ĐŋĐĩŅвŅŅ ĐˇĐ°Đ˛ĐĩŅŅивŅŅŅŅŅ ĐˇĐ°Đ´Đ°ŅŅ (ŅĐēаĐļĐĩĐŧ, ĐŊĐ°Ņ ÂĢĐŧĐĩĐ´ĐģĐĩĐŊĐŊŅĐš ŅаКĐģÂģ đ) и ĐŋŅОдОĐģĐļĐ¸Ņ Đ´ĐĩĐģаŅŅ Ņ ĐŊĐĩĐš ŅĐž, ŅŅĐž ŅŅĐĩĐąŅĐĩŅŅŅ.
-ĐŅŅĐĩŅĐŋĐžĐŧŅĐŊŅŅĐžĐĩ "ŅŅĐž-ŅĐž ĐĩŅŅ", СавĐĩŅŅĐĩĐŊĐ¸Ņ ĐēĐžŅĐžŅĐžĐŗĐž ĐŋŅиŅ
ОдиŅŅŅ ĐžĐļидаŅŅ, ОйŅŅĐŊĐž ĐžŅĐŊĐžŅиŅŅŅ Đē Đ´ĐžŅŅаŅĐžŅĐŊĐž "ĐŧĐĩĐ´ĐģĐĩĐŊĐŊŅĐŧ" ĐžĐŋĐĩŅаŅиŅĐŧ I/O (ĐŋĐž ŅŅавĐŊĐĩĐŊĐ¸Ņ ŅĐž ŅĐēĐžŅĐžŅŅŅŅ ŅайОŅŅ ĐŋŅĐžŅĐĩŅŅĐžŅа и ĐžĐŋĐĩŅаŅивĐŊОК ĐŋаĐŧŅŅи), ĐŊаĐŋŅиĐŧĐĩŅ:
+ĐŅĐž ÂĢĐžĐļидаĐŊиĐĩ ŅĐĩĐŗĐž-ŅĐž ĐĩŅŅÂģ ОйŅŅĐŊĐž ĐžŅĐŊĐžŅиŅŅŅ Đē ĐžĐŋĐĩŅаŅиŅĐŧ I/O, ĐēĐžŅĐžŅŅĐĩ ĐžŅĐŊĐžŅиŅĐĩĐģŅĐŊĐž ÂĢĐŧĐĩĐ´ĐģĐĩĐŊĐŊŅĐĩÂģ (ĐŋĐž ŅŅавĐŊĐĩĐŊĐ¸Ņ ŅĐž ŅĐēĐžŅĐžŅŅŅŅ ĐŋŅĐžŅĐĩŅŅĐžŅа и ĐžĐŋĐĩŅаŅивĐŊОК ĐŋаĐŧŅŅи), ĐŊаĐŋŅиĐŧĐĩŅ ĐžĐļидаĐŊиĐĩ:
-* ĐžŅĐŋŅавĐēа даĐŊĐŊŅŅ
ĐžŅ ĐēĐģиĐĩĐŊŅа ĐŋĐž ŅĐĩŅи
-* ĐŋĐžĐģŅŅĐĩĐŊиĐĩ ĐēĐģиĐĩĐŊŅĐžĐŧ даĐŊĐŊŅŅ
, ĐžŅĐŋŅавĐģĐĩĐŊĐŊŅŅ
ваŅĐĩĐš ĐŋŅĐžĐŗŅаĐŧĐŧОК ĐŋĐž ŅĐĩŅи
-* ŅŅĐĩĐŊиĐĩ ŅиŅŅĐĩĐŧОК ŅОдĐĩŅĐļиĐŧĐžĐŗĐž ŅаКĐģа Ņ Đ´Đ¸ŅĐēа и ĐŋĐĩŅĐĩдаŅа ŅŅиŅ
даĐŊĐŊŅŅ
ĐŋŅĐžĐŗŅаĐŧĐŧĐĩ
-* СаĐŋиŅŅ ĐŊа диŅĐē даĐŊĐŊŅŅ
, ĐēĐžŅĐžŅŅĐĩ ĐŋŅĐžĐŗŅаĐŧĐŧа ĐŋĐĩŅĐĩдаĐģа ŅиŅŅĐĩĐŧĐĩ
-* ОйŅаŅĐĩĐŊиĐĩ Đē ŅдаĐģŅĐŊĐŊĐžĐŧŅ API
-* ĐžĐļидаĐŊиĐĩ СавĐĩŅŅĐĩĐŊĐ¸Ņ ĐžĐŋĐĩŅаŅии Ņ ĐąĐ°ĐˇĐžĐš даĐŊĐŊŅŅ
-* ĐŋĐžĐģŅŅĐĩĐŊиĐĩ ŅĐĩСŅĐģŅŅаŅОв СаĐŋŅĐžŅа Đē йаСĐĩ даĐŊĐŊŅŅ
-* и Ņ. Đ´.
+* ĐžŅĐŋŅавĐēи даĐŊĐŊŅŅ
ĐēĐģиĐĩĐŊŅĐžĐŧ ĐŋĐž ŅĐĩŅи
+* ĐŋĐžĐģŅŅĐĩĐŊĐ¸Ņ ĐēĐģиĐĩĐŊŅĐžĐŧ даĐŊĐŊŅŅ
, ĐžŅĐŋŅавĐģĐĩĐŊĐŊŅŅ
ваŅĐĩĐš ĐŋŅĐžĐŗŅаĐŧĐŧОК ĐŋĐž ŅĐĩŅи
+* ŅŅĐĩĐŊĐ¸Ņ ŅиŅŅĐĩĐŧОК ŅОдĐĩŅĐļиĐŧĐžĐŗĐž ŅаКĐģа ĐŊа диŅĐēĐĩ и ĐŋĐĩŅĐĩдаŅи ŅŅиŅ
даĐŊĐŊŅŅ
ваŅĐĩĐš ĐŋŅĐžĐŗŅаĐŧĐŧĐĩ
+* СаĐŋиŅи ĐŊа диŅĐē ŅОдĐĩŅĐļиĐŧĐžĐŗĐž, ĐēĐžŅĐžŅĐžĐĩ ваŅа ĐŋŅĐžĐŗŅаĐŧĐŧа ĐŋĐĩŅĐĩдаĐģа ŅиŅŅĐĩĐŧĐĩ
+* ĐžĐŋĐĩŅаŅии ŅдаĐģŅĐŊĐŊĐžĐŗĐž API
+* СавĐĩŅŅĐĩĐŊĐ¸Ņ ĐžĐŋĐĩŅаŅии ĐąĐ°ĐˇŅ Đ´Đ°ĐŊĐŊŅŅ
+* вОСвŅаŅа ŅĐĩСŅĐģŅŅаŅОв СаĐŋŅĐžŅа Đē йаСĐĩ даĐŊĐŊŅŅ
+* и Ņ.Đ´.
-ĐĐžŅĐēĐžĐģŅĐēŅ Đ˛ ĐžŅĐŊОвĐŊĐžĐŧ вŅĐĩĐŧŅ ŅŅаŅиŅŅŅ ĐŊа ĐžĐļидаĐŊиĐĩ вŅĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ ĐžĐŋĐĩŅаŅиК I/O,
-иŅ
ОйŅŅĐŊĐž ĐŊаСŅваŅŅ ĐžĐŋĐĩŅаŅиŅĐŧи, ĐžĐŗŅаĐŊиŅĐĩĐŊĐŊŅĐŧи ŅĐēĐžŅĐžŅŅŅŅ Đ˛Đ˛ĐžĐ´Đ°-вŅвОда.
+ĐĐžŅĐēĐžĐģŅĐēŅ ĐžŅĐŊОвĐŊĐžĐĩ вŅĐĩĐŧŅ Đ˛ŅĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ ŅŅ
ĐžĐ´Đ¸Ņ ĐŊа ĐžĐļидаĐŊиĐĩ ĐžĐŋĐĩŅаŅиК I/O, иŅ
ĐŊаСŅваŅŅ ĐžĐŋĐĩŅаŅиŅĐŧи, ÂĢĐžĐŗŅаĐŊиŅĐĩĐŊĐŊŅĐŧи ввОдОĐŧ-вŅвОдОĐŧÂģ (I/O bound).
-ĐОд ĐŊаСŅваŅŅ "аŅиĐŊŅ
ŅĐžĐŊĐŊŅĐŧ", ĐŋĐžŅĐžĐŧŅ ŅŅĐž ĐēĐžĐŧĐŋŅŅŅĐĩŅŅ / ĐŋŅĐžĐŗŅаĐŧĐŧĐĩ ĐŊĐĩ ŅŅĐĩĐąŅĐĩŅŅŅ "ŅиĐŊŅ
ŅĐžĐŊиСиŅОваŅŅŅŅ" Ņ ĐŧĐĩĐ´ĐģĐĩĐŊĐŊОК СадаŅĐĩĐš и,
-ĐąŅĐ´ŅŅи в ĐŋŅĐžŅŅĐžĐĩ, ĐžĐļидаŅŅ ĐŧĐžĐŧĐĩĐŊŅа ĐĩŅ ĐˇĐ°Đ˛ĐĩŅŅĐĩĐŊиŅ, Ņ ŅĐĩĐŧ ŅŅĐžĐąŅ ĐˇĐ°ĐąŅаŅŅ ŅĐĩСŅĐģŅŅĐ°Ņ Đ¸ ĐŋŅОдОĐģĐļиŅŅ ŅайОŅŅ.
+ĐŅĐž ĐŊаСŅваĐĩŅŅŅ ÂĢаŅиĐŊŅ
ŅĐžĐŊĐŊŅĐŧÂģ, ĐŋĐžŅĐžĐŧŅ ŅŅĐž ĐēĐžĐŧĐŋŅŅŅĐĩŅŅ/ĐŋŅĐžĐŗŅаĐŧĐŧĐĩ ĐŊĐĩ ĐŊŅĐļĐŊĐž ÂĢŅиĐŊŅ
ŅĐžĐŊиСиŅОваŅŅŅŅÂģ Ņ ĐŧĐĩĐ´ĐģĐĩĐŊĐŊОК СадаŅĐĩĐš, ĐŋŅĐžŅŅĐ°Đ¸Đ˛Đ°Ņ Đ¸ вŅĐļĐ¸Đ´Đ°Ņ ŅĐžŅĐŊŅĐš ĐŧĐžĐŧĐĩĐŊŅ ĐĩŅ ĐˇĐ°Đ˛ĐĩŅŅĐĩĐŊиŅ, ŅŅĐžĐąŅ ĐˇĐ°ĐąŅаŅŅ ŅĐĩСŅĐģŅŅĐ°Ņ Đ¸ ĐŋŅОдОĐģĐļиŅŅ ŅайОŅŅ.
-ĐĐŧĐĩŅŅĐž ŅŅĐžĐŗĐž в "аŅиĐŊŅ
ŅĐžĐŊĐŊОК" ŅиŅŅĐĩĐŧĐĩ СавĐĩŅŅŅĐŊĐŊĐ°Ņ ĐˇĐ°Đ´Đ°Ņа ĐŧĐžĐļĐĩŅ ĐŊĐĩĐŧĐŊĐžĐŗĐž ĐŋОдОĐļдаŅŅ (ĐąŅĐēваĐģŅĐŊĐž ĐŊĐĩŅĐēĐžĐģŅĐēĐž ĐŧиĐēŅĐžŅĐĩĐēŅĐŊĐ´),
-ĐŋĐžĐēа ĐēĐžĐŧĐŋŅŅŅĐĩŅ / ĐŋŅĐžĐŗŅаĐŧĐŧа СаĐŊиĐŧаĐĩŅŅŅ Đ´ŅŅĐŗĐ¸Đŧи ваĐļĐŊŅĐŧи вĐĩŅаĐŧи, Ņ ŅĐĩĐŧ ŅŅĐžĐąŅ ĐŋĐžŅĐžĐŧ вĐĩŅĐŊŅŅŅŅŅ,
-СайŅаŅŅ ŅĐĩСŅĐģŅŅаŅŅ Đ˛ŅĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ Đ¸ ĐŊаŅаŅŅ Đ¸Ņ
ОйŅайаŅŅваŅŅ.
+ĐĐŧĐĩŅŅĐž ŅŅĐžĐŗĐž, в ÂĢаŅиĐŊŅ
ŅĐžĐŊĐŊОКÂģ ŅиŅŅĐĩĐŧĐĩ, ŅĐļĐĩ СавĐĩŅŅивŅаŅŅŅ ĐˇĐ°Đ´Đ°Ņа ĐŧĐžĐļĐĩŅ ĐŊĐĩĐŧĐŊĐžĐŗĐž ĐŋОдОĐļдаŅŅ (ĐŊĐĩŅĐēĐžĐģŅĐēĐž ĐŧиĐēŅĐžŅĐĩĐēŅĐŊĐ´) в ĐžŅĐĩŅĐĩди, ĐŋĐžĐēа ĐēĐžĐŧĐŋŅŅŅĐĩŅ/ĐŋŅĐžĐŗŅаĐŧĐŧа СавĐĩŅŅĐ¸Ņ ŅĐž, ŅĐĩĐŧ СаĐŊиĐŧаĐģŅŅ, и СаŅĐĩĐŧ вĐĩŅĐŊŅŅŅŅ, ŅŅĐžĐąŅ ĐˇĐ°ĐąŅаŅŅ ŅĐĩСŅĐģŅŅаŅŅ Đ¸ ĐŋŅОдОĐģĐļиŅŅ ŅайОŅŅ Ņ ĐŊиĐŧи.
-"ХиĐŊŅ
ŅĐžĐŊĐŊĐžĐĩ" иŅĐŋĐžĐģĐŊĐĩĐŊиĐĩ (в ĐŋŅĐžŅивОвĐĩŅ "аŅиĐŊŅ
ŅĐžĐŊĐŊĐžĐŧŅ") ŅаĐēĐļĐĩ ĐŊаСŅваŅŅ "ĐŋĐžŅĐģĐĩдОваŅĐĩĐģŅĐŊŅĐŧ",
-ĐŋĐžŅĐžĐŧŅ ŅŅĐž ĐēĐžĐŧĐŋŅŅŅĐĩŅ / ĐŋŅĐžĐŗŅаĐŧĐŧа ĐŋĐžŅĐģĐĩдОваŅĐĩĐģŅĐŊĐž вŅĐŋĐžĐģĐŊŅĐĩŅ Đ˛ŅĐĩ ŅŅĐĩĐąŅĐĩĐŧŅĐĩ ŅĐ°ĐŗĐ¸ ĐŋĐĩŅĐĩĐ´ ŅĐĩĐŧ, ĐēаĐē ĐŋĐĩŅĐĩĐšŅи Đē ŅĐģĐĩĐ´ŅŅŅĐĩĐš СадаŅĐĩ,
-даĐļĐĩ ĐĩŅĐģи в ĐŋŅĐžŅĐĩŅŅĐĩ ĐŋŅиŅ
ОдиŅŅŅ ĐļдаŅŅ.
+ĐĐģŅ ÂĢŅиĐŊŅ
ŅĐžĐŊĐŊĐžĐŗĐžÂģ (в ĐŋŅĐžŅивОĐŋĐžĐģĐžĐļĐŊĐžŅŅŅ ÂĢаŅиĐŊŅ
ŅĐžĐŊĐŊĐžĐŧŅÂģ) иŅĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ ŅаŅŅĐž иŅĐŋĐžĐģŅСŅŅŅ ŅĐĩŅĐŧиĐŊ ÂĢĐŋĐžŅĐģĐĩдОваŅĐĩĐģŅĐŊŅĐšÂģ, ĐŋĐžŅĐžĐŧŅ ŅŅĐž ĐēĐžĐŧĐŋŅŅŅĐĩŅ/ĐŋŅĐžĐŗŅаĐŧĐŧа вŅĐŋĐžĐģĐŊŅĐĩŅ Đ˛ŅĐĩ ŅĐ°ĐŗĐ¸ ĐŋĐž ĐŋĐžŅŅĐ´ĐēŅ, ĐŋŅĐĩĐļĐ´Đĩ ŅĐĩĐŧ ĐŋĐĩŅĐĩĐēĐģŅŅиŅŅŅŅ ĐŊа Đ´ŅŅĐŗŅŅ ĐˇĐ°Đ´Đ°ŅŅ, даĐļĐĩ ĐĩŅĐģи ŅŅи ŅĐ°ĐŗĐ¸ вĐēĐģŅŅаŅŅ ĐžĐļидаĐŊиĐĩ.
-### ĐĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅŅ Đ¸ ĐąŅŅĐŗĐĩŅŅ
+### ĐĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅŅ Đ¸ ĐąŅŅĐŗĐĩŅŅ { #concurrency-and-burgers }
-ĐĸĐžŅ **аŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš** ĐēОд, Đž ĐēĐžŅĐžŅĐžĐŧ идŅŅ ŅĐĩŅŅ Đ˛ŅŅĐĩ, иĐŊĐžĐŗĐ´Đ° ĐŊаСŅваŅŅ **"ĐēĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅŅŅ"**. ĐĐŊа ĐžŅĐģиŅаĐĩŅŅŅ ĐžŅ **"ĐŋаŅаĐģĐģĐĩĐģиСĐŧа"**.
+Đĸа идĐĩŅ **аŅиĐŊŅ
ŅĐžĐŊĐŊĐžĐŗĐž** ĐēОда, ĐžĐŋиŅаĐŊĐŊĐ°Ņ Đ˛ŅŅĐĩ, иĐŊĐžĐŗĐ´Đ° ŅаĐēĐļĐĩ ĐŊаСŅваĐĩŅŅŅ **ÂĢĐēĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅŅŅÂģ**. ĐĐŊа ĐžŅĐģиŅаĐĩŅŅŅ ĐžŅ **ÂĢĐŋаŅаĐģĐģĐĩĐģиСĐŧаÂģ**.
-Đа, **ĐēĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅŅ** и **ĐŋаŅаĐģĐģĐĩĐģиСĐŧ** ĐŋОдŅаСŅĐŧĐĩваŅŅ, ŅŅĐž ŅаСĐŊŅĐĩ вĐĩŅи ĐŋŅОиŅŅ
ОдŅŅ ĐŋŅиĐŧĐĩŅĐŊĐž в ОдĐŊĐž вŅĐĩĐŧŅ.
+Đ **ĐēĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅŅ**, и **ĐŋаŅаĐģĐģĐĩĐģиСĐŧ** ĐžŅĐŊĐžŅŅŅŅŅ Đē ÂĢŅаСĐŊŅĐŧ вĐĩŅаĐŧ, ĐŋŅОиŅŅ
ОдŅŅиĐŧ ĐŋŅиĐŧĐĩŅĐŊĐž ОдĐŊОвŅĐĩĐŧĐĩĐŊĐŊĐžÂģ.
-ĐĐž вĐŊŅŅŅĐĩĐŊĐŊĐĩĐĩ ŅŅŅŅОКŅŅвО **ĐēĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅи** и **ĐŋаŅаĐģĐģĐĩĐģиСĐŧа** дОвОĐģŅĐŊĐž ŅаСĐŊĐžĐĩ.
+ĐĐž ŅаСĐģиŅĐ¸Ņ ĐŧĐĩĐļĐ´Ņ *ĐēĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅŅŅ* и *ĐŋаŅаĐģĐģĐĩĐģиСĐŧĐžĐŧ* дОвОĐģŅĐŊĐž ŅŅŅĐĩŅŅвĐĩĐŊĐŊŅĐĩ.
-ЧŅĐžĐąŅ ŅŅĐž ĐŋĐžĐŊŅŅŅ, ĐŋŅĐĩĐ´ŅŅавŅŅĐĩ ŅаĐēŅŅ ĐēаŅŅиĐŊŅ:
+ЧŅĐžĐąŅ Đ¸Ņ
ŅвидĐĩŅŅ, ĐŋŅĐĩĐ´ŅŅавŅŅĐĩ ŅĐģĐĩĐ´ŅŅŅŅŅ Đ¸ŅŅĐžŅĐ¸Ņ ĐŋŅĐž ĐąŅŅĐŗĐĩŅŅ:
-### ĐĐžĐŊĐēŅŅĐĩĐŊŅĐŊŅĐĩ ĐąŅŅĐŗĐĩŅŅ
+### ĐĐžĐŊĐēŅŅĐĩĐŊŅĐŊŅĐĩ ĐąŅŅĐŗĐĩŅŅ { #concurrent-burgers }
-
+ĐŅ Đ¸Đ´ŅŅĐĩ ŅĐž ŅвОĐĩĐš вОСĐģŅĐąĐģĐĩĐŊĐŊОК Са ŅаŅŅŅŅĐ´ĐžĐŧ, Đ˛Ņ ŅŅОиŅĐĩ в ĐžŅĐĩŅĐĩди, ĐŋĐžĐēа ĐēаŅŅĐ¸Ņ ĐŋŅиĐŊиĐŧаĐĩŅ ĐˇĐ°ĐēĐ°ĐˇŅ Ņ ĐģŅĐ´ĐĩĐš ĐŋĐĩŅĐĩĐ´ ваĐŧи. đ
-ĐŅ Đ¸Đ´ŅŅĐĩ ŅĐž ŅвОĐĩĐš вОСĐģŅĐąĐģĐĩĐŊĐŊОК đ в ŅаŅŅŅŅĐ´ đ и ŅŅаĐŊОвиŅĐĩŅŅ Đ˛ ĐžŅĐĩŅĐĩĐ´Ņ, в ŅŅĐž вŅĐĩĐŧŅ ĐēаŅŅĐ¸Ņ đ ĐŋŅиĐŊиĐŧаĐĩŅ ĐˇĐ°ĐēĐ°ĐˇŅ Ņ ĐŋĐžŅĐĩŅиŅĐĩĐģĐĩĐš ĐŋĐĩŅĐĩĐ´ ваĐŧи.
+
-ĐĐžĐŗĐ´Đ° ĐŊаĐēĐžĐŊĐĩŅ ĐŋОдŅ
ĐžĐ´Đ¸Ņ ĐžŅĐĩŅĐĩĐ´Ņ, Đ˛Ņ ĐˇĐ°ĐēаСŅваĐĩŅĐĩ ĐŋаŅĐžŅĐēŅ ŅаĐŧŅŅ
вĐēŅŅĐŊŅŅ
и ĐŊавОŅĐžŅĐĩĐŊĐŊŅŅ
ĐąŅŅĐŗĐĩŅОв đ, ОдиĐŊ Đ´ĐģŅ ŅвОĐĩĐš вОСĐģŅĐąĐģĐĩĐŊĐŊОК đ, а Đ´ŅŅĐŗĐžĐš ŅĐĩĐąĐĩ.
+ĐаĐēĐžĐŊĐĩŅ Đ˛Đ°Ņа ĐžŅĐĩŅĐĩĐ´Ņ: Đ˛Ņ ĐˇĐ°ĐēаСŅваĐĩŅĐĩ 2 ĐžŅĐĩĐŊŅ ÂĢĐŊавОŅĐžŅĐĩĐŊĐŊŅŅ
Âģ ĐąŅŅĐŗĐĩŅа â Đ´ĐģŅ Đ˛Đ°ŅĐĩĐš вОСĐģŅĐąĐģĐĩĐŊĐŊОК и Đ´ĐģŅ ŅĐĩĐąŅ. đđ
-ĐŅдаŅŅĐĩ Đ´ĐĩĐŊŅĐŗĐ¸ đ¸.
+
-ĐаŅŅĐ¸Ņ đ ŅŅĐž-ŅĐž ĐŗĐžĐ˛ĐžŅĐ¸Ņ ĐŋОваŅаĐŧ ĐŊа ĐēŅŅ
ĐŊĐĩ đ¨âđŗ, ŅĐĩĐŋĐĩŅŅ ĐžĐŊи СĐŊаŅŅ, ĐēаĐēиĐĩ ĐąŅŅĐŗĐĩŅŅ ĐŊŅĐļĐŊĐž ĐąŅĐ´ĐĩŅ ĐŋŅĐ¸ĐŗĐžŅОвиŅŅ đ
-(ĐŊĐž ĐŋĐžĐēа ĐžĐŊи СаĐŊŅŅŅ ĐąŅŅĐŗĐĩŅаĐŧи ĐŋŅĐĩĐ´ŅĐ´ŅŅиŅ
ĐēĐģиĐĩĐŊŅОв).
+ĐаŅŅĐ¸Ņ ĐŗĐžĐ˛ĐžŅĐ¸Ņ ŅŅĐž-ŅĐž ĐŋОваŅŅ ĐŊа ĐēŅŅ
ĐŊĐĩ, ŅŅĐžĐąŅ ĐžĐŊи СĐŊаĐģи, ŅŅĐž ĐŊŅĐļĐŊĐž ĐŋŅĐ¸ĐŗĐžŅОвиŅŅ Đ˛Đ°Ņи ĐąŅŅĐŗĐĩŅŅ (Ņ
ĐžŅŅ ŅĐĩĐšŅĐ°Ņ ĐžĐŊи ĐŗĐžŅОвŅŅ ĐąŅŅĐŗĐĩŅŅ Đ´ĐģŅ ĐŋŅĐĩĐ´ŅĐ´ŅŅиŅ
ĐēĐģиĐĩĐŊŅОв).
-ĐаŅŅĐ¸Ņ đ ĐžŅдаŅŅ Đ˛Đ°Đŧ ŅĐĩĐē Ņ ĐŊĐžĐŧĐĩŅĐžĐŧ СаĐēаСа.
+
-Đ ĐžĐļидаĐŊии ĐĩĐ´Ņ Đ˛Ņ Đ¸Đ´ŅŅĐĩ ŅĐž ŅвОĐĩĐš вОСĐģŅĐąĐģĐĩĐŊĐŊОК đ вŅĐąŅаŅŅ ŅŅĐžĐģиĐē, ŅадиŅĐĩŅŅ Đ¸ дОвОĐģŅĐŊĐž ĐŋŅОдОĐģĐļиŅĐĩĐģŅĐŊĐžĐĩ вŅĐĩĐŧŅ ĐžĐąŅаĐĩŅĐĩŅŅ đ
-(ĐŋĐžŅĐēĐžĐģŅĐēŅ Đ˛Đ°Ņи ĐąŅŅĐŗĐĩŅŅ ŅаĐŧŅĐĩ ĐŊавОŅĐžŅĐĩĐŊĐŊŅĐĩ, ĐŗĐžŅОвŅŅŅŅ ĐžĐŊи ĐŊĐĩ ŅаĐē ĐąŅŅŅŅĐž â¨đâ¨).
+ĐŅ ĐŋĐģаŅиŅĐĩ. đ¸
-ĐĄĐ¸Đ´Ņ ĐˇĐ° ŅŅĐžĐģиĐēĐžĐŧ Ņ Đ˛ĐžĐˇĐģŅĐąĐģĐĩĐŊĐŊОК đ в ĐžĐļидаĐŊии ĐąŅŅĐŗĐĩŅОв đ, Đ˛Ņ ĐžŅĐģиŅĐŊĐž ĐŋŅОвОдиŅĐĩ вŅĐĩĐŧŅ,
-вОŅŅ
иŅаŅŅŅ ĐĩŅ Đ˛ĐĩĐģиĐēĐžĐģĐĩĐŋиĐĩĐŧ, ĐēŅаŅĐžŅОК и ŅĐŧĐžĐŧ â¨đâ¨.
+ĐаŅŅĐ¸Ņ Đ˛ŅдаŅŅ Đ˛Đ°Đŧ ĐŊĐžĐŧĐĩŅ Đ˛Đ°ŅĐĩĐš ĐžŅĐĩŅĐĩди.
-ĐŅŅ ĐĩŅŅ ĐžĐļĐ¸Đ´Đ°Ņ ĐˇĐ°ĐēаС и йОĐģŅĐ°Ņ ŅĐž ŅвОĐĩĐš вОСĐģŅĐąĐģĐĩĐŊĐŊОК đ, вŅĐĩĐŧŅ ĐžŅ Đ˛ŅĐĩĐŧĐĩĐŊи Đ˛Ņ ĐŋŅОвĐĩŅŅĐĩŅĐĩ,
-ĐēаĐēОК ĐŊĐžĐŧĐĩŅ ĐŗĐžŅĐ¸Ņ ĐŊад ĐŋŅиĐģавĐēĐžĐŧ, и ĐŊĐĩ ĐŋОдОŅĐģа Đģи ŅĐļĐĩ ваŅа ĐžŅĐĩŅĐĩĐ´Ņ.
+
-Đ Đ˛ĐžŅ ĐŊаĐēĐžĐŊĐĩŅ ĐŊаŅŅаŅŅ ŅŅĐžŅ ĐŧĐžĐŧĐĩĐŊŅ, и Đ˛Ņ Đ¸Đ´ŅŅĐĩ Đē ŅŅОКĐēĐĩ, ŅŅĐžĐąŅ ĐˇĐ°ĐąŅаŅŅ ĐąŅŅĐŗĐĩŅŅ đ и вĐĩŅĐŊŅŅŅŅŅ ĐˇĐ° ŅŅĐžĐģиĐē.
+ĐĐžĐēа Đ˛Ņ ĐļĐ´ŅŅĐĩ, Đ˛Ņ Đ˛ĐŧĐĩŅŅĐĩ ŅĐž ŅвОĐĩĐš вОСĐģŅĐąĐģĐĩĐŊĐŊОК идŅŅĐĩ и вŅйиŅаĐĩŅĐĩ ŅŅĐžĐģиĐē, ŅадиŅĐĩŅŅ Đ¸ Đ´ĐžĐģĐŗĐž йОĐģŅаĐĩŅĐĩ (ваŅи ĐąŅŅĐŗĐĩŅŅ ĐžŅĐĩĐŊŅ ÂĢĐŊавОŅĐžŅĐĩĐŊĐŊŅĐĩÂģ, ĐŋĐžŅŅĐžĐŧŅ Đ¸Đŧ ĐŊŅĐļĐŊĐž вŅĐĩĐŧŅ ĐŊа ĐŋŅĐ¸ĐŗĐžŅОвĐģĐĩĐŊиĐĩ).
-ĐŅ ŅĐž ŅвОĐĩĐš вОСĐģŅĐąĐģĐĩĐŊĐŊОК đ ĐĩдиŅĐĩ ĐąŅŅĐŗĐĩŅŅ đ и ĐžŅĐģиŅĐŊĐž ĐŋŅОвОдиŅĐĩ вŅĐĩĐŧŅ â¨.
+ĐĄĐ¸Đ´Ņ ĐˇĐ° ŅŅĐžĐģиĐēĐžĐŧ ŅĐž ŅвОĐĩĐš вОСĐģŅĐąĐģĐĩĐŊĐŊОК в ĐžĐļидаĐŊии ĐąŅŅĐŗĐĩŅОв, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐŋŅОвĐĩŅŅи ŅŅĐž вŅĐĩĐŧŅ, вОŅŅ
иŅаŅŅŅ ŅĐĩĐŧ, ĐēаĐēĐ°Ņ ĐžĐŊа ĐēĐģаŅŅĐŊаŅ, ĐŧиĐģĐ°Ņ Đ¸ ŅĐŧĐŊĐ°Ņ â¨đâ¨.
+
+
+
+ĐĐžĐēа Đ˛Ņ ĐļĐ´ŅŅĐĩ и ŅĐ°ĐˇĐŗĐžĐ˛Đ°ŅиваĐĩŅĐĩ, вŅĐĩĐŧŅ ĐžŅ Đ˛ŅĐĩĐŧĐĩĐŊи Đ˛Ņ ĐŋĐžĐŗĐģŅĐ´ŅваĐĩŅĐĩ ĐŊа ĐŊĐžĐŧĐĩŅ ĐŊа ŅайĐģĐž, ŅŅĐžĐąŅ ĐŋĐžĐŊŅŅŅ, ĐŊĐĩ ĐŋОдОŅĐģа Đģи ŅĐļĐĩ ваŅа ĐžŅĐĩŅĐĩĐ´Ņ.
+
+Đ Đ˛ĐžŅ Đ˛ ĐēаĐēОК-ŅĐž ĐŧĐžĐŧĐĩĐŊŅ Đ˛Đ°Ņа ĐžŅĐĩŅĐĩĐ´Ņ ĐŊаŅŅŅĐŋаĐĩŅ. ĐŅ ĐŋОдŅ
ОдиŅĐĩ Đē ŅŅОКĐēĐĩ, СайиŅаĐĩŅĐĩ ŅвОи ĐąŅŅĐŗĐĩŅŅ Đ¸ вОСвŅаŅаĐĩŅĐĩŅŅ Đē ŅŅĐžĐģиĐēŅ.
+
+
+
+ĐŅ ŅĐž ŅвОĐĩĐš вОСĐģŅĐąĐģĐĩĐŊĐŊОК ĐĩдиŅĐĩ ĐąŅŅĐŗĐĩŅŅ Đ¸ ĐžŅĐģиŅĐŊĐž ĐŋŅОвОдиŅĐĩ вŅĐĩĐŧŅ. â¨
+
+
+
+/// info | ĐĐŊŅĐžŅĐŧаŅиŅ
+
+ĐŅĐĩĐēŅаŅĐŊŅĐĩ иĐģĐģŅŅŅŅаŅии ĐžŅ Ketrina Thompson. đ¨
+
+///
---
-Đ ŅĐĩĐŋĐĩŅŅ ĐŋŅĐĩĐ´ŅŅавŅŅĐĩ, ŅŅĐž в ŅŅОК ĐŊĐĩйОĐģŅŅОК иŅŅĐžŅии Đ˛Ņ ĐēĐžĐŧĐŋŅŅŅĐĩŅ / ĐŋŅĐžĐŗŅаĐŧĐŧа đ¤.
+ĐŅĐĩĐ´ŅŅавŅŅĐĩ, ŅŅĐž в ŅŅОК иŅŅĐžŅии Đ˛Ņ â ĐēĐžĐŧĐŋŅŅŅĐĩŅ/ĐŋŅĐžĐŗŅаĐŧĐŧа đ¤.
-Đ ĐžŅĐĩŅĐĩди Đ˛Ņ ĐŋŅĐžŅŅĐž ĐŗĐģаСĐĩĐĩŅĐĩ ĐŋĐž ŅŅĐžŅĐžĐŊаĐŧ đ´, ĐļĐ´ŅŅĐĩ и ĐŊиŅĐĩĐŗĐž ĐžŅОйО "ĐŋŅОдŅĐēŅивĐŊĐžĐŗĐž" ĐŊĐĩ Đ´ĐĩĐģаĐĩŅĐĩ.
-ĐĐž ĐžŅĐĩŅĐĩĐ´Ņ Đ´Đ˛Đ¸ĐļĐĩŅŅŅ Đ´ĐžĐ˛ĐžĐģŅĐŊĐž ĐąŅŅŅŅĐž, ĐŋĐžŅĐēĐžĐģŅĐēŅ ĐēаŅŅĐ¸Ņ đ ŅĐžĐģŅĐēĐž ĐŋŅиĐŊиĐŧаĐĩŅ ĐˇĐ°ĐēĐ°ĐˇŅ (а ĐŊĐĩ СаĐŊиĐŧаĐĩŅŅŅ ĐŋŅĐ¸ĐŗĐžŅОвĐģĐĩĐŊиĐĩĐŧ ĐĩĐ´Ņ), ŅаĐē ŅŅĐž ĐŊиŅĐĩĐŗĐž ŅŅŅаŅĐŊĐžĐŗĐž.
+ĐĐžĐēа Đ˛Ņ ŅŅОиŅĐĩ в ĐžŅĐĩŅĐĩди, Đ˛Ņ ĐŋŅĐžŅŅĐž ĐąĐĩСдĐĩĐšŅŅвŅĐĩŅĐĩ đ´, ĐļĐ´ŅŅĐĩ ŅвОĐĩĐš ĐžŅĐĩŅĐĩди и ĐŊĐĩ Đ´ĐĩĐģаĐĩŅĐĩ ĐŊиŅĐĩĐŗĐž ĐžŅОйО ÂĢĐŋŅОдŅĐēŅивĐŊĐžĐŗĐžÂģ. ĐĐž ĐžŅĐĩŅĐĩĐ´Ņ Đ´Đ˛Đ¸ĐļĐĩŅŅŅ ĐąŅŅŅŅĐž, ĐŋĐžŅĐžĐŧŅ ŅŅĐž ĐēаŅŅĐ¸Ņ ŅĐžĐģŅĐēĐž ĐŋŅиĐŊиĐŧаĐĩŅ ĐˇĐ°ĐēĐ°ĐˇŅ (а ĐŊĐĩ ĐŗĐžŅĐžĐ˛Đ¸Ņ Đ¸Ņ
), ŅаĐē ŅŅĐž ŅŅĐž ĐŊĐžŅĐŧаĐģŅĐŊĐž.
-ĐĐžĐŗĐ´Đ° ĐŋОдŅ
ĐžĐ´Đ¸Ņ ĐžŅĐĩŅĐĩĐ´Ņ Đ˛Ņ ĐŊаĐēĐžĐŊĐĩŅ ĐŋŅĐĩĐ´ĐŋŅиĐŊиĐŧаĐĩŅĐĩ "ĐŋŅОдŅĐēŅивĐŊŅĐĩ" Đ´ĐĩĐšŅŅĐ˛Đ¸Ņ đ¤: ĐŋŅĐžŅĐŧаŅŅиваĐĩŅĐĩ ĐŧĐĩĐŊŅ, вŅйиŅаĐĩŅĐĩ в ĐŊŅĐŧ ŅŅĐž-ŅĐž, ŅСĐŊаŅŅĐĩ, ŅŅĐž Ņ
ĐžŅĐĩŅ Đ˛Đ°Ņа вОСĐģŅĐąĐģĐĩĐŊĐŊĐ°Ņ đ, ŅОйиŅаĐĩŅĐĩŅŅ ĐžĐŋĐģаŅиŅŅ đ¸, ŅĐŧĐžŅŅиŅĐĩ, ĐēаĐēŅŅ Đ´ĐžŅŅаĐģи ĐēаŅŅŅ, ĐŋŅОвĐĩŅŅĐĩŅĐĩ, ŅŅĐžĐąŅ Ņ Đ˛Đ°Ņ ŅĐŋиŅаĐģи вĐĩŅĐŊŅŅ ŅŅĐŧĐŧŅ, и ŅŅĐž в СаĐēаСĐĩ вŅŅ Đ˛ĐĩŅĐŊĐž и Ņ. Đ´.
+ĐĐžĐŗĐ´Đ° ĐŋŅиŅ
ĐžĐ´Đ¸Ņ Đ˛Đ°Ņа ĐžŅĐĩŅĐĩĐ´Ņ, Đ˛Ņ Đ˛ŅĐŋĐžĐģĐŊŅĐĩŅĐĩ Đ´ĐĩĐšŅŅвиŅĐĩĐģŅĐŊĐž ÂĢĐŋŅОдŅĐēŅивĐŊŅŅÂģ ŅайОŅŅ: ĐŋŅĐžŅĐŧаŅŅиваĐĩŅĐĩ ĐŧĐĩĐŊŅ, ŅĐĩŅаĐĩŅĐĩ, ŅĐĩĐŗĐž Ņ
ĐžŅиŅĐĩ, ŅŅиŅŅваĐĩŅĐĩ вŅĐąĐžŅ ŅвОĐĩĐš вОСĐģŅĐąĐģĐĩĐŊĐŊОК, ĐŋĐģаŅиŅĐĩ, ĐŋŅОвĐĩŅŅĐĩŅĐĩ, ŅŅĐž даĐģи ĐŋŅавиĐģŅĐŊŅŅ ĐēŅĐŋŅŅŅ/ĐēаŅŅŅ, ŅŅĐž ŅŅĐŧĐŧа ŅĐŋиŅаĐŊа ĐēĐžŅŅĐĩĐēŅĐŊĐž, ŅŅĐž в СаĐēаСĐĩ вĐĩŅĐŊŅĐĩ ĐŋОСиŅии и Ņ.Đ´.
-Đ Ņ
ĐžŅŅ Đ˛Ņ Đ˛ŅŅ ĐĩŅŅ ĐŊĐĩ ĐŋĐžĐģŅŅиĐģи ĐąŅŅĐŗĐĩŅŅ đ, ваŅа ŅайОŅа Ņ ĐēаŅŅиŅĐžĐŧ đ ŅŅавиŅŅŅ "ĐŊа ĐŋаŅСŅ" â¸,
-ĐŋĐžŅĐēĐžĐģŅĐēŅ ŅĐĩĐŋĐĩŅŅ ĐŊŅĐļĐŊĐž ĐļдаŅŅ đ, ĐēĐžĐŗĐ´Đ° СаĐēаС ĐŋŅĐ¸ĐŗĐžŅОвŅŅ.
+ĐĐž СаŅĐĩĐŧ, Ņ
ĐžŅŅ Ņ Đ˛Đ°Ņ ĐĩŅŅ ĐŊĐĩŅ ĐąŅŅĐŗĐĩŅОв, ваŅа ÂĢŅайОŅаÂģ Ņ ĐēаŅŅиŅĐžĐŧ ĐŋĐžŅŅавĐģĐĩĐŊа ÂĢĐŊа ĐŋаŅСŅÂģ â¸, ĐŋĐžŅĐžĐŧŅ ŅŅĐž ĐŊŅĐļĐŊĐž ĐŋОдОĐļдаŅŅ đ, ĐŋĐžĐēа ĐąŅŅĐŗĐĩŅŅ ĐąŅĐ´ŅŅ ĐŗĐžŅОвŅ.
-ĐĐž ĐžŅĐžĐšĐ´Ņ Ņ ĐŊĐžĐŧĐĩŅĐēĐžĐŧ ĐžŅ ĐŋŅиĐģавĐēа, Đ˛Ņ ŅадиŅĐĩŅŅ ĐˇĐ° ŅŅĐžĐģиĐē и ĐŧĐžĐļĐĩŅĐĩ ĐŋĐĩŅĐĩĐēĐģŅŅиŅŅ đ вĐŊиĐŧаĐŊиĐĩ
-ĐŊа ŅĐ˛ĐžŅ Đ˛ĐžĐˇĐģŅĐąĐģĐĩĐŊĐŊŅŅ đ и "ŅайОŅаŅŅ" ⯠đ¤ ŅĐļĐĩ ĐŊад ŅŅиĐŧ. Đ Đ˛ĐžŅ Đ˛Ņ ŅĐŊОва ĐžŅĐĩĐŊŅ
-"ĐŋŅОдŅĐēŅивĐŊŅ" đ¤, ĐŧиĐģĐž йОĐģŅаĐĩŅĐĩ вдвОŅĐŧ и вŅŅ ŅаĐēĐžĐĩ đ.
+ĐĐž, ĐžŅĐžĐšĐ´Ņ ĐžŅ ŅŅОКĐēи и ŅĐĩв Са ŅŅĐžĐģиĐē Ņ ĐŊĐžĐŧĐĩŅĐēĐžĐŧ, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐŋĐĩŅĐĩĐēĐģŅŅиŅŅ đ вĐŊиĐŧаĐŊиĐĩ ĐŊа ŅĐ˛ĐžŅ Đ˛ĐžĐˇĐģŅĐąĐģĐĩĐŊĐŊŅŅ Đ¸ ÂĢĐŋĐžŅайОŅаŅŅÂģ ⯠đ¤ ĐŊад ŅŅиĐŧ. ĐĄĐŊОва ĐžŅĐĩĐŊŅ ÂĢĐŋŅОдŅĐēŅивĐŊĐžÂģ â ŅĐģиŅŅ Ņ Đ˛Đ°ŅĐĩĐš вОСĐģŅĐąĐģĐĩĐŊĐŊОК đ.
-Đ ĐēаĐēОК-ŅĐž ĐŧĐžĐŧĐĩĐŊŅ ĐēаŅŅĐ¸Ņ đ ĐŋĐžĐŧĐĩŅŅĐ¸Ņ ĐŊа ŅайĐģĐž Đ˛Đ°Ņ ĐŊĐžĐŧĐĩŅ, ĐŋОдŅаСŅĐŧĐĩваŅ, ŅŅĐž ĐąŅŅĐŗĐĩŅŅ ĐŗĐžŅĐžĐ˛Ņ đ, ĐŊĐž Đ˛Ņ ĐŊĐĩ ŅŅаĐŊĐĩŅĐĩ ĐŋОдŅĐēаĐēиваŅŅ ĐēаĐē ŅĐŧаĐģиŅŅĐŊĐŊŅĐš, ĐģиŅŅ ŅĐžĐģŅĐēĐž ŅвидĐĩв ĐŊа ŅĐēŅаĐŊĐĩ ŅĐ˛ĐžŅ ĐžŅĐĩŅĐĩĐ´Ņ. ĐŅ ŅвĐĩŅĐĩĐŊŅ, ŅŅĐž ваŅи ĐąŅŅĐŗĐĩŅŅ đ ĐŊиĐēŅĐž ĐŊĐĩ ŅŅаŅиŅ, вĐĩĐ´Ņ Ņ Đ˛Đ°Ņ ŅвОК ĐŊĐžĐŧĐĩŅĐžĐē, а Ņ Đ´ŅŅĐŗĐ¸Ņ
ŅвОК.
+ĐĐžŅĐžĐŧ ĐēаŅŅĐ¸Ņ đ ÂĢĐŗĐžĐ˛ĐžŅиŅÂģ: ÂĢĐ¯ СаĐēĐžĐŊŅиĐģ Đ´ĐĩĐģаŅŅ ĐąŅŅĐŗĐĩŅŅÂģ, â вŅĐ˛ĐžĐ´Ņ Đ˛Đ°Ņ ĐŊĐžĐŧĐĩŅ ĐŊа ŅайĐģĐž, ĐŊĐž Đ˛Ņ ĐŊĐĩ ĐŋОдĐŋŅŅĐŗĐ¸Đ˛Đ°ĐĩŅĐĩ ĐēаĐē ŅŅĐŧаŅŅĐĩĐ´ŅиК в ŅŅ ĐļĐĩ ŅĐĩĐēŅĐŊĐ´Ņ, ĐēаĐē ŅĐžĐģŅĐēĐž ĐŊĐžĐŧĐĩŅ ŅĐŧĐĩĐŊиĐģŅŅ ĐŊа ваŅ. ĐŅ ĐˇĐŊаĐĩŅĐĩ, ŅŅĐž ваŅи ĐąŅŅĐŗĐĩŅŅ ĐŊиĐēŅĐž ĐŊĐĩ ŅĐēŅадŅŅ, ĐŋĐžŅĐžĐŧŅ ŅŅĐž Ņ Đ˛Đ°Ņ ĐĩŅŅŅ ĐŊĐžĐŧĐĩŅ Đ˛Đ°ŅĐĩĐš ĐžŅĐĩŅĐĩди, а Ņ Đ´ŅŅĐŗĐ¸Ņ
â иŅ
.
-ĐĐžŅŅĐžĐŧŅ Đ˛Ņ ĐŋОдОĐļĐ´ŅŅĐĩ, ĐŋĐžĐēа вОСĐģŅĐąĐģĐĩĐŊĐŊĐ°Ņ đ СаĐēĐžĐŊŅĐ¸Ņ ŅаŅŅĐēаСŅваŅŅ Đ¸ŅŅĐžŅĐ¸Ņ (СаĐēĐžĐŊŅиŅĐĩ ŅĐĩĐēŅŅŅŅ ŅайОŅŅ â¯ / СадаŅŅ Đ˛ ОйŅайОŅĐēĐĩ đ¤),
-и ĐŧиĐģĐž ŅĐģŅĐąĐŊŅвŅиŅŅ, ŅĐēаĐļĐĩŅĐĩ, ŅŅĐž идŅŅĐĩ СайиŅаŅŅ ĐˇĐ°ĐēаС â¸.
+ĐĐžŅŅĐžĐŧŅ Đ˛Ņ Đ´ĐžĐļидаĐĩŅĐĩŅŅ, ĐŋĐžĐēа ваŅа вОСĐģŅĐąĐģĐĩĐŊĐŊĐ°Ņ ĐˇĐ°ĐēĐžĐŊŅĐ¸Ņ Đ¸ŅŅĐžŅĐ¸Ņ (СавĐĩŅŅиŅŅŅ ŅĐĩĐēŅŅĐ°Ņ ŅайОŅа ⯠/ вŅĐŋĐžĐģĐŊŅĐĩĐŧĐ°Ņ ĐˇĐ°Đ´Đ°Ņа đ¤), ĐŧŅĐŗĐēĐž ŅĐģŅйаĐĩŅĐĩŅŅ Đ¸ ĐŗĐžĐ˛ĐžŅиŅĐĩ, ŅŅĐž идŅŅĐĩ Са ĐąŅŅĐŗĐĩŅаĐŧи â¸.
-Đ Đ˛ĐžŅ Đ˛Ņ ĐŋОдŅ
ОдиŅĐĩ Đē ŅŅОКĐēĐĩ đ, Đē ĐŋĐĩŅвОĐŊаŅаĐģŅĐŊОК СадаŅĐĩ, ĐēĐžŅĐžŅĐ°Ņ ŅĐļĐĩ СавĐĩŅŅĐĩĐŊа â¯, ĐąĐĩŅŅŅĐĩ ĐąŅŅĐŗĐĩŅŅ đ, ĐŗĐžĐ˛ĐžŅиŅĐĩ ŅĐŋаŅийО и ĐžŅĐŊĐžŅиŅĐĩ СаĐēаС Са ŅŅĐžĐģиĐē. Đа ŅŅĐžĐŧ СаĐēаĐŊŅиваĐĩŅŅŅ ŅŅаĐŋ / СадаŅа вСаиĐŧОдĐĩĐšŅŅĐ˛Đ¸Ņ Ņ ĐēаŅŅОК âš.
-Đ ŅĐ˛ĐžŅ ĐžŅĐĩŅĐĩĐ´Ņ ĐŋĐžŅĐžĐļдаĐĩŅŅŅ ĐˇĐ°Đ´Đ°Ņа "ĐŋĐžĐĩдаĐŊиĐĩ ĐąŅŅĐŗĐĩŅОв" đ â¯, ĐŊĐž ĐŋŅĐĩĐ´ŅĐ´ŅŅĐ°Ņ ("ĐŋĐžĐģŅŅĐĩĐŊиĐĩ ĐąŅŅĐŗĐĩŅОв") СавĐĩŅŅĐĩĐŊа âš.
+ĐаŅĐĩĐŧ Đ˛Ņ Đ¸Đ´ŅŅĐĩ Đē ŅŅОКĐēĐĩ đ, Đē иŅŅ
ОдĐŊОК СадаŅĐĩ, ĐēĐžŅĐžŅĐ°Ņ ŅĐĩĐŋĐĩŅŅ ĐˇĐ°Đ˛ĐĩŅŅĐĩĐŊа â¯, СайиŅаĐĩŅĐĩ ĐąŅŅĐŗĐĩŅŅ, ĐąĐģĐ°ĐŗĐžĐ´Đ°ŅиŅĐĩ и ĐŊĐĩŅŅŅĐĩ иŅ
Đē ŅŅĐžĐģиĐēŅ. Đа ŅŅĐžĐŧ ŅĐ°Đŗ/СадаŅа вСаиĐŧОдĐĩĐšŅŅĐ˛Đ¸Ņ ŅĐž ŅŅОКĐēОК СавĐĩŅŅŅĐŊ âš. ĐŅĐž, в ŅĐ˛ĐžŅ ĐžŅĐĩŅĐĩĐ´Ņ, ŅОСдаŅŅ ĐŊОвŅŅ ĐˇĐ°Đ´Đ°ŅŅ â ÂĢĐĩŅŅŅ ĐąŅŅĐŗĐĩŅŅÂģ đ â¯, ĐŊĐž ĐŋŅĐĩĐ´ŅĐ´ŅŅĐ°Ņ ÂĢĐŋĐžĐģŅŅиŅŅ ĐąŅŅĐŗĐĩŅŅÂģ â СавĐĩŅŅĐĩĐŊа âš.
-### ĐаŅаĐģĐģĐĩĐģŅĐŊŅĐĩ ĐąŅŅĐŗĐĩŅŅ
+### ĐаŅаĐģĐģĐĩĐģŅĐŊŅĐĩ ĐąŅŅĐŗĐĩŅŅ { #parallel-burgers }
-ĐĸĐĩĐŋĐĩŅŅ ĐŋŅĐĩĐ´ŅŅавиĐŧ, ŅŅĐž вĐŧĐĩŅŅĐž ĐąŅŅĐŗĐĩŅĐŊОК "ĐĐžĐŊĐēŅŅĐĩĐŊŅĐŊŅĐĩ ĐąŅŅĐŗĐĩŅŅ" Đ˛Ņ ŅĐĩŅиĐģи ŅŅ
ОдиŅŅ Đ˛ "ĐаŅаĐģĐģĐĩĐģŅĐŊŅĐĩ ĐąŅŅĐŗĐĩŅŅ".
+ĐĸĐĩĐŋĐĩŅŅ ĐŋŅĐĩĐ´ŅŅавиĐŧ, ŅŅĐž ŅŅĐž ĐŊĐĩ ÂĢĐĐžĐŊĐēŅŅĐĩĐŊŅĐŊŅĐĩ ĐąŅŅĐŗĐĩŅŅÂģ, а ÂĢĐаŅаĐģĐģĐĩĐģŅĐŊŅĐĩ ĐąŅŅĐŗĐĩŅŅÂģ.
-Đ Đ˛ĐžŅ Đ˛Ņ Đ¸Đ´ŅŅĐĩ ŅĐž ŅвОĐĩĐš вОСĐģŅĐąĐģĐĩĐŊĐŊОК đ ĐžŅвĐĩдаŅŅ ĐŋаŅаĐģĐģĐĩĐģŅĐŊĐžĐŗĐž ŅаŅŅŅŅда đ.
+ĐŅ Đ¸Đ´ŅŅĐĩ ŅĐž ŅвОĐĩĐš вОСĐģŅĐąĐģĐĩĐŊĐŊОК Са ĐŋаŅаĐģĐģĐĩĐģŅĐŊŅĐŧ ŅаŅŅŅŅĐ´ĐžĐŧ.
-ĐŅ ŅŅаĐŊОвиŅĐĩŅŅ Đ˛ ĐžŅĐĩŅĐĩĐ´Ņ ĐŋĐžĐēа ĐŊĐĩŅĐēĐžĐģŅĐēĐž (ĐŋŅŅŅŅ ĐąŅĐ´ĐĩŅ 8) ĐēаŅŅиŅОв, ĐēĐžŅĐžŅŅĐĩ ĐŋĐž ŅОвĐŧĐĩŅŅиŅĐĩĐģŅŅŅĐ˛Ņ ĐĩŅŅ Đ¸ ĐŋОваŅŅ đŠâđŗđ¨âđŗđŠâđŗđ¨âđŗđŠâđŗđ¨âđŗđŠâđŗđ¨âđŗ, ĐŋŅиĐŊиĐŧаŅŅ ĐˇĐ°ĐēĐ°ĐˇŅ Ņ ĐŋĐžŅĐĩŅиŅĐĩĐģĐĩĐš ĐŋĐĩŅĐĩĐ´ ваĐŧи.
+ĐŅ ŅŅОиŅĐĩ в ĐžŅĐĩŅĐĩди, ĐŋĐžĐēа ĐŊĐĩŅĐēĐžĐģŅĐēĐž (ŅĐēаĐļĐĩĐŧ, 8) ĐēаŅŅиŅОв, ĐēĐžŅĐžŅŅĐĩ ОдĐŊОвŅĐĩĐŧĐĩĐŊĐŊĐž ŅвĐģŅŅŅŅŅ ĐŋОваŅаĐŧи, ĐŋŅиĐŊиĐŧаŅŅ ĐˇĐ°ĐēĐ°ĐˇŅ Ņ ĐģŅĐ´ĐĩĐš ĐŋĐĩŅĐĩĐ´ ваĐŧи.
-ĐŅи ŅŅĐžĐŧ ĐēĐģиĐĩĐŊŅŅ ĐŊĐĩ ĐžŅŅ
ОдŅŅ ĐžŅ ŅŅОКĐēи и ĐļĐ´ŅŅ đ ĐŋĐžĐģŅŅĐĩĐŊĐ¸Ņ ĐĩĐ´Ņ, ĐŋĐžŅĐēĐžĐģŅĐēŅ ĐēаĐļĐ´ŅĐš
-иС 8 ĐēаŅŅиŅОв идŅŅ ĐŊа ĐēŅŅ
ĐŊŅ ĐŗĐžŅОвиŅŅ ĐąŅŅĐŗĐĩŅŅ đ, а ŅĐžĐģŅĐēĐž ĐŋĐžŅĐžĐŧ ĐŋŅиĐŊиĐŧаĐĩŅ ŅĐģĐĩĐ´ŅŅŅиК СаĐēаС.
+ĐŅĐĩ ĐŋĐĩŅĐĩĐ´ ваĐŧи ĐļĐ´ŅŅ, ĐŋĐžĐēа иŅ
ĐąŅŅĐŗĐĩŅŅ ĐąŅĐ´ŅŅ ĐŗĐžŅОвŅ, ĐŊĐĩ ĐžŅŅ
ĐžĐ´Ņ ĐžŅ ŅŅОКĐēи, ĐŋĐžŅĐžĐŧŅ ŅŅĐž ĐēаĐļĐ´ŅĐš иС 8 ĐēаŅŅиŅОв ŅŅĐ°ĐˇŅ Đ¸Đ´ŅŅ ĐŗĐžŅОвиŅŅ ĐąŅŅĐŗĐĩŅ ĐŋĐĩŅĐĩĐ´ ŅĐĩĐŧ, ĐēаĐē ĐŋŅиĐŊŅŅŅ ŅĐģĐĩĐ´ŅŅŅиК СаĐēаС.
-ĐаĐēĐžĐŊĐĩŅ ĐŊаŅŅаŅŅ Đ˛Đ°Ņа ĐžŅĐĩŅĐĩĐ´Ņ, и Đ˛Ņ ĐŋŅĐžŅиŅĐĩ два ŅаĐŧŅŅ
ĐŊавОŅĐžŅĐĩĐŊĐŊŅŅ
ĐąŅŅĐŗĐĩŅа đ, ОдиĐŊ Đ´ĐģŅ Đ´Đ°ĐŧŅ ŅĐĩŅĐ´Ņа đ, а Đ´ŅŅĐŗĐžĐš ŅĐĩĐąĐĩ.
+
-Đи Đž ŅŅĐŧ ĐŊĐĩ ĐļаĐģĐĩŅ, ŅаŅĐŋĐģаŅиваĐĩŅĐĩŅŅ đ¸.
+ĐаĐēĐžĐŊĐĩŅ Đ˛Đ°Ņа ĐžŅĐĩŅĐĩĐ´Ņ: Đ˛Ņ ĐˇĐ°ĐēаСŅваĐĩŅĐĩ 2 ĐžŅĐĩĐŊŅ ÂĢĐŊавОŅĐžŅĐĩĐŊĐŊŅŅ
Âģ ĐąŅŅĐŗĐĩŅа â Đ´ĐģŅ Đ˛Đ°ŅĐĩĐš вОСĐģŅĐąĐģĐĩĐŊĐŊОК и Đ´ĐģŅ ŅĐĩĐąŅ.
-Đ ĐēаŅŅĐ¸Ņ ŅŅ
ĐžĐ´Đ¸Ņ ĐŊа ĐēŅŅ
ĐŊŅ đ¨âđŗ.
+ĐŅ ĐŋĐģаŅиŅĐĩ đ¸.
-ĐаĐŧ ĐŋŅиŅ
ОдиŅŅŅ ĐļдаŅŅ ĐŋĐĩŅĐĩĐ´ ŅŅОКĐēОК đ, ŅŅĐžĐąŅ ĐŊиĐēŅĐž ĐŋĐž ŅĐģŅŅаКĐŊĐžŅŅи ĐŊĐĩ СайŅаĐģ ваŅи ĐąŅŅĐŗĐĩŅŅ đ, вĐĩĐ´Ņ ĐŊиĐēаĐēиŅ
ĐŊĐžĐŧĐĩŅĐēОв Ņ Đ˛Đ°Ņ ĐŊĐĩŅ.
+
-ĐĐžŅĐēĐžĐģŅĐēŅ Đ˛Ņ Ņ Đ˛ĐžĐˇĐģŅĐąĐģĐĩĐŊĐŊОК đ Ņ
ĐžŅиŅĐĩ ĐŋĐžĐģŅŅиŅŅ ĐˇĐ°ĐēаС вОвŅĐĩĐŧŅ đ, и ŅĐģĐĩдиŅĐĩ Са ŅĐĩĐŧ, ŅŅĐžĐąŅ ĐŊиĐēŅĐž ĐŊĐĩ вĐēĐģиĐŊиĐģŅŅ Đ˛ ĐžŅĐĩŅĐĩĐ´Ņ,
-Ņ Đ˛Đ°Ņ ĐŊĐĩ ĐŋĐžĐģŅŅаĐĩŅŅŅ ŅĐ´ĐĩĐģŅŅŅ Đ´ĐžĐģĐļĐŊĐžĐŗĐž вĐŊиĐŧаĐŊиĐĩ ŅвОĐĩĐš даĐŧĐĩ ŅĐĩŅĐ´Ņа đ.
+ĐаŅŅĐ¸Ņ ŅŅ
ĐžĐ´Đ¸Ņ ĐŊа ĐēŅŅ
ĐŊŅ.
-ĐŅĐž "ŅиĐŊŅ
ŅĐžĐŊĐŊаŅ" ŅайОŅа, Đ˛Ņ "ŅиĐŊŅ
ŅĐžĐŊиСиŅОваĐŊŅ" Ņ ĐēаŅŅиŅĐžĐŧ/ĐŋОваŅĐžĐŧ đ¨âđŗ. ĐŅиŅ
ОдиŅŅŅ ĐļдаŅŅ đ Ņ ŅŅОКĐēи,
-ĐēĐžĐŗĐ´Đ° ĐēаŅŅиŅ/ĐŋĐžĐ˛Đ°Ņ đ¨âđŗ СаĐēĐžĐŊŅĐ¸Ņ Đ´ĐĩĐģаŅŅ ĐąŅŅĐŗĐĩŅŅ đ и вŅŅŅĐ¸Ņ Đ˛Đ°Đŧ СаĐēаС, иĐŊаŅĐĩ ĐĩĐŗĐž ŅĐģŅŅаКĐŊĐž ĐŧĐžĐļĐĩŅ ĐˇĐ°ĐąŅаŅŅ ĐēŅĐž-ŅĐž Đ´ŅŅĐŗĐžĐš.
+ĐŅ ĐļĐ´ŅŅĐĩ, ŅŅĐžŅ Ņ ŅŅОКĐēи đ, ŅŅĐžĐąŅ ĐŊиĐēŅĐž ĐŊĐĩ СайŅаĐģ ваŅи ĐąŅŅĐŗĐĩŅŅ ŅаĐŊŅŅĐĩ ваŅ, ŅаĐē ĐēаĐē ĐŊиĐēаĐēиŅ
ĐŊĐžĐŧĐĩŅĐēОв ĐŊĐĩŅ.
-ĐаĐēĐžĐŊĐĩŅ ĐēаŅŅиŅ/ĐŋĐžĐ˛Đ°Ņ đ¨âđŗ вОСвŅаŅаĐĩŅŅŅ Ņ ĐąŅŅĐŗĐĩŅаĐŧи đ ĐŋĐžŅĐģĐĩ ĐŊĐĩвŅĐŊĐžŅиĐŧĐž Đ´ĐžĐģĐŗĐžĐŗĐž ĐžĐļидаĐŊĐ¸Ņ đ Са ŅŅОКĐēОК.
+
-ĐŅ ŅĐēĐžŅĐĩĐĩ СайиŅаĐĩŅĐĩ СаĐēаС đ и идŅŅĐĩ Ņ Đ˛ĐžĐˇĐģŅĐąĐģĐĩĐŊĐŊОК đ Са ŅŅĐžĐģиĐē.
+ĐĸаĐē ĐēаĐē Đ˛Ņ ŅĐž ŅвОĐĩĐš вОСĐģŅĐąĐģĐĩĐŊĐŊОК СаĐŊŅŅŅ ŅĐĩĐŧ, ŅŅĐžĐąŅ ĐŊиĐēŅĐž ĐŊĐĩ вŅŅаĐģ ĐŋĐĩŅĐĩĐ´ ваĐŧи и ĐŊĐĩ СайŅаĐģ ваŅи ĐąŅŅĐŗĐĩŅŅ, ĐēаĐē ŅĐžĐģŅĐēĐž ĐžĐŊи ĐŋĐžŅвŅŅŅŅ, Đ˛Ņ ĐŊĐĩ ĐŧĐžĐļĐĩŅĐĩ ŅĐ´ĐĩĐģиŅŅ Đ˛ĐŊиĐŧаĐŊиĐĩ ŅвОĐĩĐš вОСĐģŅĐąĐģĐĩĐŊĐŊОК. đ
-ĐĸаĐŧ Đ˛Ņ ĐŋŅĐžŅŅĐž ĐĩдиŅĐĩ ŅŅи ĐąŅŅĐŗĐĩŅŅ, и ĐŊа ŅŅĐžĐŧ вŅŅ đ âš.
+ĐŅĐž ÂĢŅиĐŊŅ
ŅĐžĐŊĐŊаŅÂģ ŅайОŅа, Đ˛Ņ ÂĢŅиĐŊŅ
ŅĐžĐŊиСиŅОваĐŊŅÂģ Ņ ĐēаŅŅиŅĐžĐŧ/ĐŋОваŅĐžĐŧ đ¨âđŗ. ĐаĐŧ ĐŊŅĐļĐŊĐž ĐļдаŅŅ đ и ĐŊаŅ
ОдиŅŅŅŅ ŅаĐŧ в ŅĐžŅĐŊŅĐš ĐŧĐžĐŧĐĩĐŊŅ, ĐēĐžĐŗĐ´Đ° ĐēаŅŅиŅ/ĐŋĐžĐ˛Đ°Ņ đ¨âđŗ СаĐēĐžĐŊŅĐ¸Ņ ĐąŅŅĐŗĐĩŅŅ Đ¸ вŅŅŅĐ¸Ņ Đ¸Ņ
ваĐŧ, иĐŊаŅĐĩ иŅ
ĐŧĐžĐļĐĩŅ ĐˇĐ°ĐąŅаŅŅ ĐēŅĐž-ŅĐž Đ´ŅŅĐŗĐžĐš.
-ĐаĐŧ ĐŊĐĩ ĐžŅОйО ŅдаĐģĐžŅŅ ĐŋООйŅаŅŅŅŅ, ĐŋĐžŅĐžĐŧŅ ŅŅĐž йОĐģŅŅŅŅ ŅаŅŅŅ Đ˛ŅĐĩĐŧĐĩĐŊи đ ĐŋŅиŅĐģĐžŅŅ ĐŋŅОвĐĩŅŅи Ņ ĐēаŅŅŅ đ.
+
+
+ĐаŅĐĩĐŧ Đ˛Đ°Ņ ĐēаŅŅиŅ/ĐŋĐžĐ˛Đ°Ņ đ¨âđŗ ĐŊаĐēĐžĐŊĐĩŅ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅŅŅ Ņ Đ˛Đ°ŅиĐŧи ĐąŅŅĐŗĐĩŅаĐŧи, ĐŋĐžŅĐģĐĩ Đ´ĐžĐģĐŗĐžĐŗĐž ĐžĐļидаĐŊĐ¸Ņ đ Ņ ŅŅОКĐēи.
+
+
+
+ĐŅ ĐąĐĩŅŅŅĐĩ ĐąŅŅĐŗĐĩŅŅ Đ¸ идŅŅĐĩ ŅĐž ŅвОĐĩĐš вОСĐģŅĐąĐģĐĩĐŊĐŊОК Đē ŅŅĐžĐģиĐēŅ.
+
+ĐŅ ĐŋŅĐžŅŅĐž иŅ
ŅŅĐĩдаĐĩŅĐĩ â и вŅŅ. âš
+
+
+
+Đ Đ°ĐˇĐŗĐžĐ˛ĐžŅОв и ŅĐģиŅŅа ĐąŅĐģĐž ĐŊĐĩĐŧĐŊĐžĐŗĐž, ĐŋĐžŅĐžĐŧŅ ŅŅĐž йОĐģŅŅŅŅ ŅаŅŅŅ Đ˛ŅĐĩĐŧĐĩĐŊи Đ˛Ņ ĐļдаĐģи đ Ņ ŅŅОКĐēи. đ
+
+/// info | ĐĐŊŅĐžŅĐŧаŅиŅ
+
+ĐŅĐĩĐēŅаŅĐŊŅĐĩ иĐģĐģŅŅŅŅаŅии ĐžŅ Ketrina Thompson. đ¨
+
+///
---
-Đ ĐžĐŋиŅаĐŊĐŊĐžĐŧ ŅŅĐĩĐŊаŅии Đ˛Ņ ĐēĐžĐŧĐŋŅŅŅĐĩŅ / ĐŋŅĐžĐŗŅаĐŧĐŧа đ¤ Ņ Đ´Đ˛ŅĐŧŅ Đ¸ŅĐŋĐžĐģĐŊиŅĐĩĐģŅĐŧи (Đ˛Ņ Đ¸ ваŅа вОСĐģŅĐąĐģĐĩĐŊĐŊĐ°Ņ đ),
-ĐŊа ĐŋŅĐžŅŅĐļĐĩĐŊии Đ´ĐžĐģĐŗĐžĐŗĐž вŅĐĩĐŧĐĩĐŊи đ Đ˛Ņ ĐžĐąĐ° ŅĐ´ĐĩĐģŅĐĩŅĐĩ вŅŅ Đ˛ĐŊиĐŧаĐŊиĐĩ â¯ ĐˇĐ°Đ´Đ°ŅĐĩ "ĐļдаŅŅ ĐŊа ĐēаŅŅĐĩ".
+Đ ŅŅĐžĐŧ ŅŅĐĩĐŊаŅии ÂĢĐŋаŅаĐģĐģĐĩĐģŅĐŊŅŅ
ĐąŅŅĐŗĐĩŅОвÂģ Đ˛Ņ â ĐēĐžĐŧĐŋŅŅŅĐĩŅ/ĐŋŅĐžĐŗŅаĐŧĐŧа đ¤ Ņ Đ´Đ˛ŅĐŧŅ ĐŋŅĐžŅĐĩŅŅĐžŅаĐŧи (Đ˛Ņ Đ¸ ваŅа вОСĐģŅĐąĐģĐĩĐŊĐŊаŅ), Ойа ĐļĐ´ŅŅ đ и ŅĐ´ĐĩĐģŅŅŅ Đ˛ĐŊиĐŧаĐŊиĐĩ ⯠ŅĐžĐŧŅ, ŅŅĐžĐąŅ ÂĢĐļдаŅŅ Ņ ŅŅОКĐēиÂģ đ Đ´ĐžĐģĐŗĐžĐĩ вŅĐĩĐŧŅ.
-Đ ŅŅĐžĐŧ ŅĐĩŅŅĐžŅаĐŊĐĩ ĐąŅŅŅŅĐžĐŗĐž ĐŋиŅаĐŊĐ¸Ņ 8 иŅĐŋĐžĐģĐŊиŅĐĩĐģĐĩĐš (ĐēаŅŅиŅОв/ĐŋОваŅОв) đŠâđŗđ¨âđŗđŠâđŗđ¨âđŗđŠâđŗđ¨âđŗđŠâđŗđ¨âđŗ.
-ĐĨĐžŅŅ Đ˛ ĐąŅŅĐŗĐĩŅĐŊОК ĐēĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžĐŗĐž ŅиĐŋа ĐąŅĐģĐž вŅĐĩĐŗĐž два (ОдиĐŊ ĐēаŅŅĐ¸Ņ Đ¸ ОдиĐŊ ĐŋОваŅ) đ đ¨âđŗ.
+Đ ŅĐĩŅŅĐžŅаĐŊĐĩ 8 ĐŋŅĐžŅĐĩŅŅĐžŅОв (ĐēаŅŅиŅОв/ĐŋОваŅОв). ĐĸĐžĐŗĐ´Đ° ĐēаĐē в ÂĢĐēĐžĐŊĐēŅŅĐĩĐŊŅĐŊŅŅ
ĐąŅŅĐŗĐĩŅаŅ
Âģ ĐŧĐžĐŗĐģĐž ĐąŅŅŅ ŅĐžĐģŅĐēĐž 2 (ОдиĐŊ ĐēаŅŅĐ¸Ņ Đ¸ ОдиĐŊ ĐŋОваŅ).
-ĐĐĩŅĐŧĐžŅŅŅ ĐŊа ОйиĐģиĐĩ ŅайОŅĐŊиĐēОв, ĐžĐŋŅŅ Đ˛ иŅĐžĐŗĐĩ ĐŋĐžĐģŅŅиĐģŅŅ ĐŊĐĩ иС ĐģŅŅŅиŅ
đ.
+РвŅŅ ĐļĐĩ ŅиĐŊаĐģŅĐŊŅĐš ĐžĐŋŅŅ â ĐŊĐĩ ŅаĐŧŅĐš ĐģŅŅŅиК. đ
---
-ĐĸаĐē ĐąŅ Đ˛ŅĐŗĐģŅĐ´ĐĩĐģ аĐŊаĐģĐžĐŗ иŅŅĐžŅии ĐŋŅĐž ĐąŅŅĐŗĐĩŅĐŊŅŅ đ в "ĐŋаŅаĐģĐģĐĩĐģŅĐŊĐžĐŧ" ĐŧиŅĐĩ.
+ĐŅĐž ĐąŅĐģа ĐŋаŅаĐģĐģĐĩĐģŅĐŊĐ°Ņ Đ˛ĐĩŅŅĐ¸Ņ Đ¸ŅŅĐžŅии ĐŋŅĐž ĐąŅŅĐŗĐĩŅŅ. đ
-ĐĐžŅ ĐąĐžĐģĐĩĐĩ ŅĐĩаĐģиŅŅиŅĐŊŅĐš ĐŋŅиĐŧĐĩŅ. ĐŅĐĩĐ´ŅŅавŅŅĐĩ ŅĐĩĐąĐĩ йаĐŊĐē.
+ĐĐģŅ ĐąĐžĐģĐĩĐĩ ÂĢĐļиСĐŊĐĩĐŊĐŊĐžĐŗĐžÂģ ĐŋŅиĐŧĐĩŅа ĐŋŅĐĩĐ´ŅŅавŅŅĐĩ йаĐŊĐē.
-ĐĐž ĐŊĐĩдавĐŊиŅ
ĐŋĐžŅ Đ˛ йОĐģŅŅиĐŊŅŅвĐĩ йаĐŊĐēОв ĐąŅĐģĐž ĐŊĐĩŅĐēĐžĐģŅĐēĐž ĐēаŅŅиŅОв đ¨âđŧđ¨âđŧđ¨âđŧđ¨âđŧ и Đ´ĐģиĐŊĐŊŅĐĩ ĐžŅĐĩŅĐĩди đđđđđđđđ.
+ĐĐž ĐŊĐĩдавĐŊĐĩĐŗĐž вŅĐĩĐŧĐĩĐŊи в йОĐģŅŅиĐŊŅŅвĐĩ йаĐŊĐēОв ĐąŅĐģĐž ĐŊĐĩŅĐēĐžĐģŅĐēĐž ĐēаŅŅиŅОв đ¨âđŧđ¨âđŧđ¨âđŧđ¨âđŧ и Đ´ĐģиĐŊĐŊĐ°Ņ ĐžŅĐĩŅĐĩĐ´Ņ đđđđđđđđ.
-ĐаĐļĐ´ŅĐš ĐēаŅŅĐ¸Ņ ĐžĐąŅĐģŅĐļиваĐģ ОдĐŊĐžĐŗĐž ĐēĐģиĐĩĐŊŅа, ĐŋĐžŅĐžĐŧ ŅĐģĐĩĐ´ŅŅŅĐĩĐŗĐž đ¨âđŧâ¯.
+ĐŅĐĩ ĐēаŅŅиŅŅ Đ´ĐĩĐģаŅŅ Đ˛ŅŅ ŅайОŅŅ Ņ ĐžĐ´ĐŊиĐŧ ĐēĐģиĐĩĐŊŅĐžĐŧ Са Đ´ŅŅĐŗĐ¸Đŧ đ¨âđŧâ¯.
-ĐŅĐļĐŊĐž ĐąŅĐģĐž Đ´ĐžĐģĐŗĐžĐĩ вŅĐĩĐŧŅ đ ŅŅĐžŅŅŅ ĐŋĐĩŅĐĩĐ´ ĐžĐēĐžŅĐēĐžĐŧ вĐŧĐĩŅŅĐĩ ŅĐž вŅĐĩĐŧи, иĐŊаŅĐĩ ĐŋŅĐžĐŋŅŅŅиŅŅ ŅĐ˛ĐžŅ ĐžŅĐĩŅĐĩĐ´Ņ.
+РваĐŧ ĐŋŅиŅ
ОдиŅŅŅ Đ´ĐžĐģĐŗĐž đ ŅŅĐžŅŅŅ Đ˛ ĐžŅĐĩŅĐĩди, иĐŊаŅĐĩ Đ˛Ņ ĐŋĐžŅĐĩŅŅĐĩŅĐĩ ŅĐ˛ĐžŅ ĐžŅĐĩŅĐĩĐ´Ņ.
-ĐĄĐžĐŧĐŊĐĩваŅŅŅ, ŅŅĐž Ņ Đ˛Đ°Ņ ĐąŅ Đ˛ĐžĐˇĐŊиĐēĐģĐž ĐļĐĩĐģаĐŊиĐĩ ĐŋŅиКŅи Ņ Đ˛ĐžĐˇĐģŅĐąĐģĐĩĐŊĐŊОК đ в йаĐŊĐē đĻ ĐžĐŋĐģаŅиваŅŅ ĐŊаĐģĐžĐŗĐ¸.
+ĐŅ Đ˛ŅŅĐ´ Đģи СаŅ
ĐžŅиŅĐĩ вСŅŅŅ ŅĐ˛ĐžŅ Đ˛ĐžĐˇĐģŅĐąĐģĐĩĐŊĐŊŅŅ đ Ņ ŅОйОК, ŅŅĐžĐąŅ ĐˇĐ°ĐŊŅŅŅŅŅ Đ´ĐĩĐģаĐŧи в йаĐŊĐēĐĩ đĻ.
-### ĐŅĐ˛ĐžĐ´Ņ Đž ĐąŅŅĐŗĐĩŅаŅ
+### ĐŅвОд ĐŋŅĐž ĐąŅŅĐŗĐĩŅŅ { #burger-conclusion }
-Đ ĐŊаŅĐĩĐš иŅŅĐžŅии ĐŋŅĐž ĐŋĐžŅ
Од в ŅаŅŅŅŅĐ´ Са ĐąŅŅĐŗĐĩŅаĐŧи ĐŋŅиŅ
ОдиŅŅŅ ĐŧĐŊĐžĐŗĐž ĐļдаŅŅ đ,
-ĐŋĐžŅŅĐžĐŧŅ Đ¸ĐŧĐĩĐĩŅ ŅĐŧŅŅĐģ ĐžŅĐŗĐ°ĐŊиСОваŅŅ ĐēĐžĐŊĐēŅŅĐĩĐŊŅĐŊŅŅ ŅиŅŅĐĩĐŧŅ â¸đâ¯.
+Đ ŅŅĐžĐŧ ŅŅĐĩĐŊаŅии ÂĢŅаŅŅŅŅда Ņ Đ˛Đ°ŅĐĩĐš вОСĐģŅĐąĐģĐĩĐŊĐŊОКÂģ, ŅаĐē ĐēаĐē ĐŧĐŊĐžĐŗĐž ĐžĐļидаĐŊĐ¸Ņ đ, ĐŗĐžŅаСдО ĐģĐžĐŗĐ¸ŅĐŊĐĩĐĩ иĐŧĐĩŅŅ ĐēĐžĐŊĐēŅŅĐĩĐŊŅĐŊŅŅ ŅиŅŅĐĩĐŧŅ â¸đâ¯.
-Đ ŅĐž ĐļĐĩ ŅаĐŧĐžĐĩ Ņ ĐąĐžĐģŅŅиĐŊŅŅвОĐŧ вĐĩĐą-ĐŋŅиĐģĐžĐļĐĩĐŊиК.
+ĐĸаĐē ОйŅŅĐžĐ¸Ņ Đ´ĐĩĐģĐž и Ņ ĐąĐžĐģŅŅиĐŊŅŅвОĐŧ вĐĩĐą-ĐŋŅиĐģĐžĐļĐĩĐŊиК.
-ĐĐžĐģŅСОваŅĐĩĐģĐĩĐš ĐžŅĐĩĐŊŅ ĐŧĐŊĐžĐŗĐž, ĐŊĐž Đ˛Đ°Ņ ŅĐĩŅвĐĩŅ Đ˛ŅŅ ŅавĐŊĐž вŅĐŊŅĐļĐ´ĐĩĐŊ ĐļдаŅŅ đ СаĐŋŅĐžŅŅ ĐŋĐž иŅ
ŅĐģайОĐŧŅ Đ¸ĐŊŅĐĩŅĐŊĐĩŅ-ŅĐžĐĩдиĐŊĐĩĐŊиŅ.
+ĐŅĐĩĐŊŅ ĐŧĐŊĐžĐŗĐž ĐŋĐžĐģŅСОваŅĐĩĐģĐĩĐš, ĐŊĐž Đ˛Đ°Ņ ŅĐĩŅвĐĩŅ ĐļĐ´ŅŅ đ, ĐŋĐžĐēа иŅ
ĐŊĐĩ ŅаĐŧĐžĐĩ Ņ
ĐžŅĐžŅĐĩĐĩ ŅĐžĐĩдиĐŊĐĩĐŊиĐĩ ĐžŅĐŋŅĐ°Đ˛Đ¸Ņ Đ¸Ņ
СаĐŋŅĐžŅŅ.
-ĐĐžŅĐžĐŧ ŅĐŊОва ĐļдаŅŅ đ, ĐŋĐžĐēа вĐĩŅĐŊŅŅŅŅ ĐžŅвĐĩŅ.
+РСаŅĐĩĐŧ ŅĐŊОва ĐļĐ´ŅŅ đ, ĐŋĐžĐēа ĐžŅĐŋŅавŅŅŅŅ ĐžŅвĐĩŅŅ.
-
-ĐŅĐž ĐžĐļидаĐŊиĐĩ đ иСĐŧĐĩŅŅĐĩŅŅŅ ĐŧиĐēŅĐžŅĐĩĐēŅĐŊдаĐŧи, ĐŊĐž ĐĩŅĐģи вŅŅ ŅĐģĐžĐļиŅŅ, ŅĐž ĐŊайĐĩĐŗĐ°ĐĩŅ Đ´ĐžĐ˛ĐžĐģŅĐŊĐž ĐŧĐŊĐžĐŗĐž вŅĐĩĐŧĐĩĐŊи.
+ĐŅĐž ÂĢĐžĐļидаĐŊиĐĩÂģ đ иСĐŧĐĩŅŅĐĩŅŅŅ ĐŧиĐēŅĐžŅĐĩĐēŅĐŊдаĐŧи, ĐŊĐž ĐĩŅĐģи вŅŅ ŅĐģĐžĐļиŅŅ, ŅĐž в ŅŅĐŧĐŧĐĩ ĐŋĐžĐģŅŅаĐĩŅŅŅ ĐŧĐŊĐžĐŗĐž ĐžĐļидаĐŊиŅ.
-ĐĐžŅ ĐŋĐžŅĐĩĐŧŅ ĐĩŅŅŅ ŅĐŧŅŅĐģ иŅĐŋĐžĐģŅСОваŅŅ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊĐžĐĩ â¸đ⯠ĐŋŅĐžĐŗŅаĐŧĐŧиŅОваĐŊиĐĩ ĐŋŅи ĐŋĐžŅŅŅĐžĐĩĐŊии вĐĩĐą-API.
+ĐĐžŅ ĐŋĐžŅĐĩĐŧŅ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš â¸đ⯠ĐēОд ĐžŅĐĩĐŊŅ ŅĐŧĐĩŅŅĐĩĐŊ Đ´ĐģŅ Đ˛ĐĩĐą-API.
-ĐĐžĐģŅŅиĐŊŅŅвО ĐŋĐžĐŋŅĐģŅŅĐŊŅŅ
ŅŅĐĩĐšĐŧвОŅĐēОв (вĐēĐģŅŅĐ°Ņ Flask и Django) ŅОСдаваĐģиŅŅ
-Đ´Đž ĐŋĐžŅвĐģĐĩĐŊĐ¸Ņ Đ˛ Python ĐŊОвŅŅ
вОСĐŧĐžĐļĐŊĐžŅŅĐĩĐš аŅиĐŊŅ
ŅĐžĐŊĐŊĐžĐŗĐž ĐŋŅĐžĐŗŅаĐŧĐŧиŅОваĐŊиŅ. ĐĐžŅŅĐžĐŧŅ
-иŅ
ĐŧĐžĐļĐŊĐž ŅаСвОŅаŅиваŅŅ Ņ ĐŋОддĐĩŅĐļĐēОК ĐŋаŅаĐģĐģĐĩĐģŅĐŊĐžĐŗĐž иŅĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ Đ¸Đģи аŅиĐŊŅ
ŅĐžĐŊĐŊĐžĐŗĐž
-ĐŋŅĐžĐŗŅаĐŧĐŧиŅОваĐŊĐ¸Ņ ŅŅаŅĐžĐŗĐž ŅиĐŋа, ĐēĐžŅĐžŅĐžĐĩ ĐŊĐĩ ĐŊаŅŅĐžĐģŅĐēĐž ŅŅŅĐĩĐēŅивĐŊĐž.
+ĐĐŧĐĩĐŊĐŊĐž ŅаĐēĐ°Ņ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊĐžŅŅŅ ŅĐ´ĐĩĐģаĐģа NodeJS ĐŋĐžĐŋŅĐģŅŅĐŊŅĐŧ (Ņ
ĐžŅŅ NodeJS â ĐŊĐĩ ĐŋаŅаĐģĐģĐĩĐģŅĐŊŅĐš), и ŅŅĐž ŅиĐģŅĐŊĐ°Ņ ŅŅĐžŅĐžĐŊа Go ĐēаĐē ŅСŅĐēа ĐŋŅĐžĐŗŅаĐŧĐŧиŅОваĐŊиŅ.
-ĐŅи ŅĐžĐŧ, ŅŅĐž ĐžŅĐŊОвĐŊĐ°Ņ ŅĐŋĐĩŅиŅиĐēаŅĐ¸Ņ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊĐžĐŗĐž вСаиĐŧОдĐĩĐšŅŅĐ˛Đ¸Ņ Python Ņ Đ˛ĐĩĐą-ŅĐĩŅвĐĩŅĐžĐŧ
-(ASGI)
-ĐąŅĐģа ŅаСŅайОŅаĐŊа ĐēĐžĐŧаĐŊдОК Django Đ´ĐģŅ Đ˛ĐŊĐĩĐ´ŅĐĩĐŊĐ¸Ņ ĐŋОддĐĩŅĐļĐēи вĐĩĐą-ŅĐžĐēĐĩŅОв.
+ĐĸĐžĐŗĐž ĐļĐĩ ŅŅОвĐŊŅ ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅи Đ˛Ņ ĐŋĐžĐģŅŅаĐĩŅĐĩ Ņ **FastAPI**.
-ĐĐŧĐĩĐŊĐŊĐž аŅиĐŊŅ
ŅĐžĐŊĐŊĐžŅŅŅ ŅĐ´ĐĩĐģаĐģа NodeJS ŅаĐēиĐŧ ĐŋĐžĐŋŅĐģŅŅĐŊŅĐŧ (ĐŊĐĩŅĐŧĐžŅŅŅ ĐŊа ŅĐž, ŅŅĐž ĐžĐŊ ĐŊĐĩ ĐŋаŅаĐģĐģĐĩĐģŅĐŊŅĐš),
-и в ŅŅĐžĐŧ ĐŋŅĐĩиĐŧŅŅĐĩŅŅвО Go ĐēаĐē ŅСŅĐēа ĐŋŅĐžĐŗŅаĐŧĐŧиŅОваĐŊиŅ.
+Đ ŅаĐē ĐēаĐē ĐŧĐžĐļĐŊĐž ОдĐŊОвŅĐĩĐŧĐĩĐŊĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ ĐŋаŅаĐģĐģĐĩĐģиСĐŧ и аŅиĐŊŅ
ŅĐžĐŊĐŊĐžŅŅŅ, Đ˛Ņ ĐŋĐžĐģŅŅаĐĩŅĐĩ ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅŅ Đ˛ŅŅĐĩ, ŅĐĩĐŧ Ņ ĐąĐžĐģŅŅиĐŊŅŅва ĐŋŅĐžŅĐĩŅŅиŅОваĐŊĐŊŅŅ
ŅŅĐĩĐšĐŧвОŅĐēОв ĐŊа NodeJS и ĐŊа ŅŅОвĐŊĐĩ Go, ĐēĐžŅĐžŅŅĐš â ĐēĐžĐŧĐŋиĐģиŅŅĐĩĐŧŅĐš ŅСŅĐē, ĐąĐģиĐļĐĩ Đē C (вŅŅ ĐąĐģĐ°ĐŗĐžĐ´Đ°ŅŅ Starlette).
-Đ ŅĐžŅ ĐļĐĩ ŅŅОвĐĩĐŊŅ ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅи даŅŅ **FastAPI**.
+### ĐĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅŅ ĐģŅŅŅĐĩ ĐŋаŅаĐģĐģĐĩĐģиСĐŧа? { #is-concurrency-better-than-parallelism }
-ĐĐžŅĐēĐžĐģŅĐēŅ ĐŧĐžĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ ĐŋŅĐĩиĐŧŅŅĐĩŅŅва ĐŋаŅаĐģĐģĐĩĐģиСĐŧа и аŅиĐŊŅ
ŅĐžĐŊĐŊĐžŅŅи вĐŧĐĩŅŅĐĩ,
-Đ˛Ņ ĐŋĐžĐģŅŅаĐĩŅĐĩ ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅŅ ĐģŅŅŅĐĩ, ŅĐĩĐŧ Ņ ĐąĐžĐģŅŅиĐŊŅŅва ĐŋŅĐžŅĐĩŅŅиŅОваĐŊĐŊŅŅ
NodeJS ŅŅĐĩĐšĐŧвОŅĐēОв
-и ĐŊа ŅŅОвĐŊĐĩ Ņ Go, ĐēĐžŅĐžŅŅĐš ŅвĐģŅĐĩŅŅŅ ĐēĐžĐŧĐŋиĐģиŅŅĐĩĐŧŅĐŧ ŅСŅĐēĐžĐŧ ĐąĐģиСĐēиĐŧ Đē C (вŅŅ ĐąĐģĐ°ĐŗĐžĐ´Đ°ŅŅ Starlette).
+ĐĐĩŅ! ĐĐžŅаĐģŅ Đ¸ŅŅĐžŅии ĐŊĐĩ в ŅŅĐžĐŧ.
-### ĐĐžĐģŅŅаĐĩŅŅŅ, ĐēĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅŅ ĐģŅŅŅĐĩ ĐŋаŅаĐģĐģĐĩĐģиСĐŧа?
+ĐĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅŅ ĐžŅĐģиŅаĐĩŅŅŅ ĐžŅ ĐŋаŅаĐģĐģĐĩĐģиСĐŧа. Đ ĐžĐŊа ĐģŅŅŅĐĩ в **ĐēĐžĐŊĐēŅĐĩŅĐŊŅŅ
** ŅŅĐĩĐŊаŅиŅŅ
, ĐŗĐ´Đĩ ĐŧĐŊĐžĐŗĐž ĐžĐļидаĐŊиŅ. ĐĐžŅŅĐžĐŧŅ ĐŋŅи ŅаСŅайОŅĐēĐĩ вĐĩĐą-ĐŋŅиĐģĐžĐļĐĩĐŊиК ĐžĐŊа ОйŅŅĐŊĐž ĐŊаĐŧĐŊĐžĐŗĐž ĐģŅŅŅĐĩ ĐŋаŅаĐģĐģĐĩĐģиСĐŧа. ĐĐž ĐŊĐĩ вО вŅŅĐŧ.
-ĐĐĩŅ! ĐĐžŅаĐģŅ Đ¸ŅŅĐžŅии ŅОвŅĐĩĐŧ ĐŊĐĩ в ŅŅĐžĐŧ.
+ЧŅĐžĐąŅ ŅŅавĐŊОвĐĩŅиŅŅ ŅŅĐž, ĐŋŅĐĩĐ´ŅŅавŅŅĐĩ ŅаĐēŅŅ ĐēĐžŅĐžŅĐēŅŅ Đ¸ŅŅĐžŅиŅ:
-ĐĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅŅ ĐžŅĐģиŅаĐĩŅŅŅ ĐžŅ ĐŋаŅаĐģĐģĐĩĐģиСĐŧа. ĐĐŊа ĐģŅŅŅĐĩ в **ĐēĐžĐŊĐēŅĐĩŅĐŊŅŅ
** ŅĐģŅŅаŅŅ
, ĐŗĐ´Đĩ ĐŧĐŊĐžĐŗĐž вŅĐĩĐŧĐĩĐŊи ĐŋŅиŅ
ОдиŅŅŅ ĐŊа ĐžĐļидаĐŊиĐĩ.
-ĐĐžŅ ĐŋĐžŅĐĩĐŧŅ ĐžĐŊа СаŅаŅŅŅŅ ĐģŅŅŅĐĩ ĐŋаŅаĐģĐģĐĩĐģиСĐŧа ĐŋŅи ŅаСŅайОŅĐēĐĩ вĐĩĐą-ĐŋŅиĐģĐžĐļĐĩĐŊиК. ĐĐž ŅŅĐž ĐŊĐĩ СĐŊаŅиŅ, ŅŅĐž ĐēĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅŅ ĐģŅŅŅĐĩ в ĐģŅĐąŅŅ
ŅŅĐĩĐŊаŅиŅŅ
.
-
-ĐаваКŅĐĩ ĐŋĐžŅĐŧĐžŅŅиĐŧ Ņ Đ´ŅŅĐŗĐžĐš ŅŅĐžŅĐžĐŊŅ, ĐŋŅĐĩĐ´ŅŅавŅŅĐĩ ŅаĐēŅŅ ĐēаŅŅиĐŊŅ:
-
-> ĐаĐŧ ĐŊŅĐļĐŊĐž ŅĐąŅаŅŅŅŅ Đ˛ йОĐģŅŅĐžĐŧ ĐŗŅŅСĐŊĐžĐŧ Đ´ĐžĐŧĐĩ.
+> ĐаĐŧ ĐŊŅĐļĐŊĐž ŅĐąŅаŅŅ ĐąĐžĐģŅŅОК ĐŗŅŅСĐŊŅĐš Đ´ĐžĐŧ.
*Đа, ŅŅĐž вŅŅ Đ¸ŅŅĐžŅиŅ*.
---
-ĐĸŅŅ ĐŊĐĩ ĐŊŅĐļĐŊĐž ĐŊĐ¸ĐŗĐ´Đĩ ĐļдаŅŅ đ, ĐŋŅĐžŅŅĐž ĐĩŅŅŅ ĐēŅŅа ŅайОŅŅ Đ˛ ŅаСĐŊŅŅ
ŅаŅŅŅŅ
Đ´ĐžĐŧа.
+ĐĐ´ĐĩŅŅ ĐŊĐ¸ĐŗĐ´Đĩ ĐŊĐĩŅ ĐžĐļидаĐŊĐ¸Ņ đ, ĐŋŅĐžŅŅĐž ĐžŅĐĩĐŊŅ ĐŧĐŊĐžĐŗĐž ŅайОŅŅ Đ˛ ŅаСĐŊŅŅ
ĐŧĐĩŅŅаŅ
Đ´ĐžĐŧа.
-ĐĐžĐļĐŊĐž ĐžŅĐŗĐ°ĐŊиСОваŅŅ ĐžŅĐĩŅĐĩĐ´Ņ ĐēаĐē в ĐŋŅиĐŧĐĩŅĐĩ Ņ ĐąŅŅĐŗĐĩŅаĐŧи, ŅĐŊаŅаĐģа ĐŗĐžŅŅиĐŊаŅ, ĐŋĐžŅĐžĐŧ ĐēŅŅ
ĐŊŅ,
-ĐŊĐž ŅŅĐž ĐŊи ĐŊа ŅŅĐž ĐŊĐĩ ĐŋОвĐģиŅĐĩŅ, ĐŋĐžŅĐēĐžĐģŅĐēŅ Đ˛Ņ ĐŊĐ¸ĐŗĐ´Đĩ ĐŊĐĩ ĐļĐ´ŅŅĐĩ đ, а ĐŋŅĐžŅŅĐž ŅŅŅŅĐĩ да ĐŧĐžĐĩŅĐĩ.
+ĐĐžĐļĐŊĐž ĐžŅĐŗĐ°ĐŊиСОваŅŅ ÂĢĐžŅĐĩŅĐĩдиÂģ ĐēаĐē в ĐŋŅиĐŧĐĩŅĐĩ Ņ ĐąŅŅĐŗĐĩŅаĐŧи â ŅĐŊаŅаĐģа ĐŗĐžŅŅиĐŊаŅ, ĐŋĐžŅĐžĐŧ ĐēŅŅ
ĐŊŅ, â ĐŊĐž ŅаĐē ĐēаĐē Đ˛Ņ ĐŊиŅĐĩĐŗĐž ĐŊĐĩ ĐļĐ´ŅŅĐĩ đ, а ĐŋŅĐžŅŅĐž ŅйиŅаĐĩŅĐĩ и ŅйиŅаĐĩŅĐĩ, ĐžŅĐĩŅĐĩди ĐŊи ĐŊа ŅŅĐž ĐŊĐĩ ĐŋОвĐģиŅŅŅ.
-Đ ĐŋĐžĐŊадОйиŅŅŅ ĐžĐ´Đ¸ĐŊаĐēОвОĐĩ ĐēĐžĐģиŅĐĩŅŅвО вŅĐĩĐŧĐĩĐŊи Ņ ĐžŅĐĩŅĐĩĐ´ŅŅ (ĐēĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅŅŅ) и ĐąĐĩС ĐŊĐĩŅ,
-и ŅайОŅŅ ĐąŅĐ´ĐĩŅ ŅĐ´ĐĩĐģаĐŊĐž ŅĐžĐļĐĩ ОдиĐŊаĐēОвОĐĩ ĐēĐžĐģиŅĐĩŅŅвО.
+Đа СавĐĩŅŅĐĩĐŊиĐĩ ŅКдŅŅ ĐžĐ´Đ¸ĐŊаĐēОвОĐĩ вŅĐĩĐŧŅ â Ņ ĐžŅĐĩŅĐĩĐ´ŅĐŧи (ĐēĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅŅŅ) и ĐąĐĩС ĐŊиŅ
â и ОйŅŅĐŧ вŅĐŋĐžĐģĐŊĐĩĐŊĐŊОК ŅайОŅŅ ĐąŅĐ´ĐĩŅ ĐžĐ´Đ¸ĐŊаĐēОвŅĐŧ.
-ĐĐ´ĐŊаĐēĐž в ŅĐģŅŅаĐĩ, ĐĩŅĐģи ĐąŅ Đ˛Ņ ĐŧĐžĐŗĐģи ĐŋŅивĐĩŅŅи 8 ĐąŅвŅиŅ
ĐēаŅŅиŅОв/ĐŋОваŅОв, а ĐŊŅĐŊĐĩ ŅйОŅŅиĐēОв đŠâđŗđ¨âđŗđŠâđŗđ¨âđŗđŠâđŗđ¨âđŗđŠâđŗđ¨âđŗ,
-и ĐēаĐļĐ´ŅĐš иС ĐŊиŅ
(вĐŧĐĩŅŅĐĩ Ņ Đ˛Đ°Đŧи) вСŅĐģŅŅ ĐąŅ ĐˇĐ° ŅвОК ŅŅаŅŅĐžĐē Đ´ĐžĐŧа,
-Ņ ŅаĐēОК ĐŋĐžĐŧĐžŅŅŅ Đ˛Ņ ĐąŅ ĐˇĐ°ĐēĐžĐŊŅиĐģи ĐŊаĐŧĐŊĐžĐŗĐž ĐąŅŅŅŅĐĩĐĩ, Đ´ĐĩĐģĐ°Ņ Đ˛ŅŅ ŅайОŅŅ **ĐŋаŅаĐģĐģĐĩĐģŅĐŊĐž**.
+ĐĐž в ŅŅĐžĐŧ ŅĐģŅŅаĐĩ, ĐĩŅĐģи ĐąŅ Đ˛Ņ ĐŧĐžĐŗĐģи ĐŋŅивĐĩŅŅи 8 ĐąŅвŅиŅ
ĐēаŅŅиŅОв/ĐŋОваŅОв, а ŅĐĩĐŋĐĩŅŅ â ŅйОŅŅиĐēОв, и ĐēаĐļĐ´ŅĐš иС ĐŊиŅ
(ĐŋĐģŅŅ Đ˛Ņ) вСŅĐģ ĐąŅ ŅĐ˛ĐžŅ ĐˇĐžĐŊŅ Đ´ĐžĐŧа Đ´ĐģŅ ŅйОŅĐēи, Đ˛Ņ ĐŧĐžĐŗĐģи ĐąŅ ŅĐ´ĐĩĐģаŅŅ Đ˛ŅŅ ŅайОŅŅ **ĐŋаŅаĐģĐģĐĩĐģŅĐŊĐž**, Ņ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊОК ĐŋĐžĐŧĐžŅŅŅ, и СавĐĩŅŅиŅŅ ĐŗĐžŅаСдО ĐąŅŅŅŅĐĩĐĩ.
-Đ ĐžĐŋиŅаĐŊĐŊĐžĐŧ ŅŅĐĩĐŊаŅии ĐēаĐļĐ´ŅĐš ŅйОŅŅиĐē (вĐēĐģŅŅĐ°Ņ Đ˛Đ°Ņ) ĐąŅĐģ ĐąŅ Đ¸ŅĐŋĐžĐģĐŊиŅĐĩĐģĐĩĐŧ, СаĐŊŅŅŅĐŧ ĐŊа ŅвОŅĐŧ ŅŅаŅŅĐēĐĩ ŅайОŅŅ.
+Đ ŅŅĐžĐŧ ŅŅĐĩĐŊаŅии ĐēаĐļĐ´ŅĐš ŅйОŅŅиĐē (вĐēĐģŅŅĐ°Ņ Đ˛Đ°Ņ) ĐąŅĐģ ĐąŅ ĐŋŅĐžŅĐĩŅŅĐžŅĐžĐŧ, вŅĐŋĐžĐģĐŊŅŅŅиĐŧ ŅĐ˛ĐžŅ ŅаŅŅŅ ŅайОŅŅ.
-Đ ĐŋĐžŅĐēĐžĐģŅĐēŅ ĐąĐžĐģŅŅŅŅ ŅаŅŅŅ Đ˛ŅĐĩĐŧĐĩĐŊи вŅĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ ĐˇĐ°ĐŊиĐŧаĐĩŅ ŅĐĩаĐģŅĐŊĐ°Ņ ŅайОŅа (а ĐŊĐĩ ĐžĐļидаĐŊиĐĩ),
-а ŅайОŅŅ Đ˛ ĐēĐžĐŧĐŋŅŅŅĐĩŅĐĩ Đ´ĐĩĐģаĐĩŅ ĐĻĐ,
-ŅаĐēиĐĩ СадаŅи ĐŊаСŅваŅŅ ĐžĐŗŅаĐŊиŅĐĩĐŊĐŊŅĐŧи ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅŅŅ ĐŋŅĐžŅĐĩŅŅĐžŅа.
+Đ ŅаĐē ĐēаĐē ĐžŅĐŊОвĐŊĐžĐĩ вŅĐĩĐŧŅ Đ˛ŅĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ ŅŅ
ĐžĐ´Đ¸Ņ ĐŊа ŅĐĩаĐģŅĐŊŅŅ ŅайОŅŅ (а ĐŊĐĩ ĐžĐļидаĐŊиĐĩ), а ŅайОŅŅ Đ˛ ĐēĐžĐŧĐŋŅŅŅĐĩŅĐĩ вŅĐŋĐžĐģĐŊŅĐĩŅ CPU, ŅаĐēиĐĩ СадаŅи ĐŊаСŅваŅŅ ÂĢĐžĐŗŅаĐŊиŅĐĩĐŊĐŊŅĐŧи ĐŋŅĐžŅĐĩŅŅĐžŅĐžĐŧÂģ (CPU bound).
---
-ĐĐŗŅаĐŊиŅĐĩĐŊиĐĩ ĐŋĐž ĐŋŅĐžŅĐĩŅŅĐžŅŅ ĐŋŅĐžŅвĐģŅĐĩŅŅŅ Đ˛ ĐžĐŋĐĩŅаŅиŅŅ
, ĐŗĐ´Đĩ ŅŅĐĩĐąŅĐĩŅŅŅ Đ˛ŅĐŋĐžĐģĐŊŅŅŅ ŅĐģĐžĐļĐŊŅĐĩ ĐŧаŅĐĩĐŧаŅиŅĐĩŅĐēиĐĩ вŅŅиŅĐģĐĩĐŊиŅ.
+ĐĸиĐŋиŅĐŊŅĐĩ ĐŋŅиĐŧĐĩŅŅ CPU-bound ĐžĐŋĐĩŅаŅиК â ŅĐĩ, ĐēĐžŅĐžŅŅĐĩ ŅŅĐĩĐąŅŅŅ ŅĐģĐžĐļĐŊОК ĐŧаŅĐĩĐŧаŅиŅĐĩŅĐēОК ОйŅайОŅĐēи.
ĐаĐŋŅиĐŧĐĩŅ:
-* ĐĐąŅайОŅĐēа **СвŅĐēа** иĐģи **иСОйŅаĐļĐĩĐŊиК**.
-* **ĐĐžĐŧĐŋŅŅŅĐĩŅĐŊĐžĐĩ СŅĐĩĐŊиĐĩ**: иСОйŅаĐļĐĩĐŊиĐĩ ŅĐžŅŅĐžĐ¸Ņ Đ¸Đˇ ĐŧиĐģĐģиОĐŊОв ĐŋиĐēŅĐĩĐģĐĩĐš, в ĐēаĐļĐ´ĐžĐŧ ĐŋиĐēŅĐĩĐģĐĩ 3 ŅĐžŅŅавĐģŅŅŅиŅ
ŅвĐĩŅа,
-ОйŅайОŅĐēа ОйŅŅĐŊĐž ŅŅĐĩĐąŅĐĩŅ ĐŋŅОвĐĩĐ´ĐĩĐŊĐ¸Ņ ŅаŅŅŅŅОв ĐŋĐž вŅĐĩĐŧ ĐŋиĐēŅĐĩĐģŅĐŧ ŅŅаСŅ.
-* **ĐаŅиĐŊĐŊĐžĐĩ ОйŅŅĐĩĐŊиĐĩ**: СдĐĩŅŅ ĐžĐąŅŅĐŊĐž ŅŅĐĩĐąŅĐĩŅŅŅ ŅĐŧĐŊĐžĐļĐĩĐŊиĐĩ "ĐŧаŅŅиŅ" и "вĐĩĐēŅĐžŅОв".
-ĐŅĐĩĐ´ŅŅавŅŅĐĩ ĐŗĐ¸ĐŗĐ°ĐŊŅŅĐēŅŅ ŅайĐģиŅŅ Ņ ŅиŅĐģаĐŧи в ĐĐēŅĐĩĐģĐĩ, и вŅĐĩ иŅ
ĐŊадО ОдĐŊОвŅĐĩĐŧĐĩĐŊĐŊĐž ĐŋĐĩŅĐĩĐŧĐŊĐžĐļиŅŅ.
-* **ĐĐģŅйОĐēĐžĐĩ ОйŅŅĐĩĐŊиĐĩ**: ŅŅĐž ОйĐģаŅŅŅ *ĐŧаŅиĐŊĐŊĐžĐŗĐž ОйŅŅĐĩĐŊиŅ*, ĐŋĐžŅŅĐžĐŧŅ ŅŅда ĐŋОдŅ
ĐžĐ´Đ¸Ņ ŅĐž ĐļĐĩ ĐžĐŋиŅаĐŊиĐĩ.
-ĐŅĐžŅŅĐž Ņ Đ˛Đ°Ņ ĐąŅĐ´ĐĩŅ ĐŊĐĩ ОдĐŊа ŅайĐģиŅа в ĐĐēŅĐĩĐģĐĩ, а ĐŧĐŊĐžĐļĐĩŅŅвО. Đ ŅŅĐ´Đĩ ŅĐģŅŅаĐĩв иŅĐŋĐžĐģŅСŅĐĩŅŅŅ
-ŅĐŋĐĩŅиаĐģŅĐŊŅĐš ĐŋŅĐžŅĐĩŅŅĐžŅ Đ´ĐģŅ ŅОСдаĐŊĐ¸Ņ Đ¸ / иĐģи иŅĐŋĐžĐģŅСОваĐŊĐ¸Ņ ĐŋĐžŅŅŅĐžĐĩĐŊĐŊŅŅ
ŅаĐēиĐŧ ОйŅаСОĐŧ ĐŧОдĐĩĐģĐĩĐš.
+* ĐĐąŅайОŅĐēа **аŅдиО** иĐģи **иСОйŅаĐļĐĩĐŊиК**.
+* **ĐĐžĐŧĐŋŅŅŅĐĩŅĐŊĐžĐĩ СŅĐĩĐŊиĐĩ**: иСОйŅаĐļĐĩĐŊиĐĩ ŅĐžŅŅĐžĐ¸Ņ Đ¸Đˇ ĐŧиĐģĐģиОĐŊОв ĐŋиĐēŅĐĩĐģĐĩĐš, ĐēаĐļĐ´ŅĐš ĐŋиĐēŅĐĩĐģŅ Đ¸ĐŧĐĩĐĩŅ 3 СĐŊаŅĐĩĐŊиŅ/ŅвĐĩŅа; ОйŅŅĐŊĐž ŅŅĐĩĐąŅĐĩŅŅŅ Đ˛ŅŅиŅĐģиŅŅ ŅŅĐž-ŅĐž Đ´ĐģŅ Đ˛ŅĐĩŅ
ŅŅиŅ
ĐŋиĐēŅĐĩĐģĐĩĐš ОдĐŊОвŅĐĩĐŧĐĩĐŊĐŊĐž.
+* **ĐаŅиĐŊĐŊĐžĐĩ ОйŅŅĐĩĐŊиĐĩ**: ОйŅŅĐŊĐž ŅŅĐĩĐąŅĐĩŅ ĐŧĐŊĐžĐļĐĩŅŅва ŅĐŧĐŊĐžĐļĐĩĐŊиК ÂĢĐŧаŅŅиŅÂģ и ÂĢвĐĩĐēŅĐžŅОвÂģ. ĐŅĐĩĐ´ŅŅавŅŅĐĩ ĐžĐŗŅĐžĐŧĐŊŅŅ ŅайĐģиŅŅ Ņ ŅиŅĐģаĐŧи и ŅĐŧĐŊĐžĐļĐĩĐŊиĐĩ вŅĐĩŅ
ŅŅиŅ
ŅиŅĐĩĐģ ÂĢОдĐŊОвŅĐĩĐŧĐĩĐŊĐŊĐžÂģ.
+* **ĐĐģŅйОĐēĐžĐĩ ОйŅŅĐĩĐŊиĐĩ**: ŅŅĐž ĐŋОдĐŋĐžĐģĐĩ ĐаŅиĐŊĐŊĐžĐŗĐž ОйŅŅĐĩĐŊиŅ, ŅаĐē ŅŅĐž вŅŅ Đ˛ŅŅĐĩŅĐēаСаĐŊĐŊĐžĐĩ ĐŋŅиĐŧĐĩĐŊиĐŧĐž. ĐŅĐžŅŅĐž ŅŅĐž ĐŊĐĩ ОдĐŊа ŅайĐģиŅа ŅиŅĐĩĐģ, а иŅ
ĐžĐŗŅĐžĐŧĐŊŅĐš ĐŊайОŅ, и вО ĐŧĐŊĐžĐŗĐ¸Ņ
ŅĐģŅŅаŅŅ
Đ˛Ņ Đ¸ŅĐŋĐžĐģŅСŅĐĩŅĐĩ ŅĐŋĐĩŅиаĐģŅĐŊŅĐš ĐŋŅĐžŅĐĩŅŅĐžŅ, ŅŅĐžĐąŅ ŅŅŅОиŅŅ Đ¸/иĐģи иŅĐŋĐžĐģŅСОваŅŅ ŅаĐēиĐĩ ĐŧОдĐĩĐģи.
-### ĐĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅŅ + ĐŋаŅаĐģĐģĐĩĐģиСĐŧ: ĐĐĩĐą + ĐŧаŅиĐŊĐŊĐžĐĩ ОйŅŅĐĩĐŊиĐĩ
+### ĐĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅŅ + ĐŋаŅаĐģĐģĐĩĐģиСĐŧ: ĐĐĩĐą + ĐаŅиĐŊĐŊĐžĐĩ ОйŅŅĐĩĐŊиĐĩ { #concurrency-parallelism-web-machine-learning }
-**FastAPI** ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ Đ˛ĐžĐˇĐŧĐžĐļĐŊĐžŅŅи ĐēĐžĐŊĐēŅŅĐĩŅĐŊĐžĐŗĐž ĐŋŅĐžĐŗŅаĐŧĐŧиŅОваĐŊиŅ,
-ĐēĐžŅĐžŅĐžĐĩ ĐžŅĐĩĐŊŅ ŅаŅĐŋŅĐžŅŅŅаĐŊĐĩĐŊĐž в вĐĩĐą-ŅаСŅайОŅĐēĐĩ (иĐŧĐĩĐŊĐŊĐž ŅŅиĐŧ ŅĐģавиŅŅŅ NodeJS).
+ĐĄ **FastAPI** Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ ĐŋŅĐĩиĐŧŅŅĐĩŅŅва ĐēĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅи, ŅŅĐž ĐžŅĐĩĐŊŅ ŅаŅĐŋŅĐžŅŅŅаĐŊĐĩĐŊĐž в вĐĩĐą-ŅаСŅайОŅĐēĐĩ (ŅŅĐž Ņа ĐļĐĩ ĐžŅĐŊОвĐŊĐ°Ņ ÂĢŅиŅĐēаÂģ NodeJS).
-ĐŅĐžĐŧĐĩ ŅĐžĐŗĐž Đ˛Ņ ŅĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ Đ˛ŅĐĩ ĐŋŅĐĩиĐŧŅŅĐĩŅŅва ĐŋаŅаĐģĐģĐĩĐģиСĐŧа и
-ĐŧĐŊĐžĐŗĐžĐŋŅĐžŅĐĩŅŅĐžŅĐŊĐžŅŅи (ĐēĐžĐŗĐ´Đ° ĐŊĐĩŅĐēĐžĐģŅĐēĐž ĐŋŅĐžŅĐĩŅŅОв ŅайОŅаŅŅ ĐŋаŅаĐģĐģĐĩĐģŅĐŊĐž),
-ĐĩŅĐģи ŅайОŅĐ°Ņ ĐŊĐ°ĐŗŅŅСĐēа ĐŋŅĐĩĐ´ĐŋĐžĐģĐ°ĐŗĐ°ĐĩŅ **ĐžĐŗŅаĐŊиŅĐĩĐŊиĐĩ ĐŋĐž ĐŋŅĐžŅĐĩŅŅĐžŅŅ**,
-ĐēаĐē, ĐŊаĐŋŅиĐŧĐĩŅ, в ŅиŅŅĐĩĐŧаŅ
ĐŧаŅиĐŊĐŊĐžĐŗĐž ОйŅŅĐĩĐŊиŅ.
+ĐĐž Đ˛Ņ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ Đ˛ŅĐŗĐžĐ´Ņ ĐŋаŅаĐģĐģĐĩĐģиСĐŧа и ĐŧĐŊĐžĐŗĐžĐŋŅĐžŅĐĩŅŅĐŊĐžŅŅи (ĐēĐžĐŗĐ´Đ° ĐŊĐĩŅĐēĐžĐģŅĐēĐž ĐŋŅĐžŅĐĩŅŅОв ŅайОŅаŅŅ ĐŋаŅаĐģĐģĐĩĐģŅĐŊĐž) Đ´ĐģŅ ŅайОŅиŅ
ĐŊĐ°ĐŗŅŅСОĐē, **ĐžĐŗŅаĐŊиŅĐĩĐŊĐŊŅŅ
ĐŋŅĐžŅĐĩŅŅĐžŅĐžĐŧ** (CPU bound), ĐēаĐē в ŅиŅŅĐĩĐŧаŅ
ĐаŅиĐŊĐŊĐžĐŗĐž ОйŅŅĐĩĐŊиŅ.
-ĐĐĩОйŅ
ОдиĐŧĐž ŅаĐēĐļĐĩ ĐžŅĐŧĐĩŅиŅŅ, ŅŅĐž Python ŅвĐģŅĐĩŅŅŅ ĐŗĐģавĐŊŅĐŧ ŅСŅĐēĐžĐŧ в ОйĐģаŅŅи
-**даŅа-ŅаКĐĩĐŊŅ**,
-ĐŧаŅиĐŊĐŊĐžĐŗĐž ОйŅŅĐĩĐŊĐ¸Ņ Đ¸, ĐžŅОйĐĩĐŊĐŊĐž, ĐŗĐģŅйОĐēĐžĐŗĐž ОйŅŅĐĩĐŊиŅ. ĐŅŅ ŅŅĐž Đ´ĐĩĐģаĐĩŅ FastAPI
-ĐžŅĐģиŅĐŊŅĐŧ ваŅиаĐŊŅĐžĐŧ (ŅŅĐĩди ĐŧĐŊĐžĐŗĐ¸Ņ
Đ´ŅŅĐŗĐ¸Ņ
) Đ´ĐģŅ ŅаСŅайОŅĐēи вĐĩĐą-API и ĐŋŅиĐģĐžĐļĐĩĐŊиК
-в ОйĐģаŅŅи даŅа-ŅаКĐĩĐŊŅ / ĐŧаŅиĐŊĐŊĐžĐŗĐž ОйŅŅĐĩĐŊиŅ.
+ĐĐģŅŅ Đē ŅŅĐžĐŧŅ ĐŋŅĐžŅŅОК ŅаĐēŅ, ŅŅĐž Python â ĐžŅĐŊОвĐŊОК ŅСŅĐē Đ´ĐģŅ **Data Science**, ĐаŅиĐŊĐŊĐžĐŗĐž ОйŅŅĐĩĐŊĐ¸Ņ Đ¸ ĐžŅОйĐĩĐŊĐŊĐž ĐĐģŅйОĐēĐžĐŗĐž ОйŅŅĐĩĐŊиŅ, Đ´ĐĩĐģаĐĩŅ FastAPI ĐžŅĐĩĐŊŅ Ņ
ĐžŅĐžŅиĐŧ вŅйОŅĐžĐŧ Đ´ĐģŅ Đ˛ĐĩĐą-API и ĐŋŅиĐģĐžĐļĐĩĐŊиК в ОйĐģаŅŅи Data Science / ĐаŅиĐŊĐŊĐžĐŗĐž ОйŅŅĐĩĐŊĐ¸Ņ (ŅŅĐĩди ĐŧĐŊĐžĐŗĐ¸Ņ
Đ´ŅŅĐŗĐ¸Ņ
).
-ĐаĐē дОйиŅŅŅŅ ŅаĐēĐžĐŗĐž ĐŋаŅаĐģĐģĐĩĐģиСĐŧа в ŅĐēŅĐŋĐģŅаŅаŅии ĐžĐŋиŅаĐŊĐž в ŅаСдĐĩĐģĐĩ [РаСвŅŅŅŅваĐŊиĐĩ](deployment/index.md){.internal-link target=_blank}.
+ĐаĐē дОйиŅŅŅŅ ŅаĐēĐžĐŗĐž ĐŋаŅаĐģĐģĐĩĐģиСĐŧа в ĐŋŅОдаĐēŅĐŊ, ŅĐŧ. ŅаСдĐĩĐģ [РаСвŅŅŅŅваĐŊиĐĩ](deployment/index.md){.internal-link target=_blank}.
-## `async` и `await`
+## `async` и `await` { #async-and-await }
-Đ ŅОвŅĐĩĐŧĐĩĐŊĐŊŅŅ
вĐĩŅŅиŅŅ
Python ŅаСŅайОŅĐēа аŅиĐŊŅ
ŅĐžĐŊĐŊĐžĐŗĐž ĐēОда ŅĐĩаĐģиСОваĐŊа ĐžŅĐĩĐŊŅ Đ¸ĐŊŅŅиŅивĐŊĐž.
-ĐĐŊ вŅĐŗĐģŅĐ´Đ¸Ņ ĐēаĐē ОйŅŅĐŊŅĐš "ĐŋĐžŅĐģĐĩдОваŅĐĩĐģŅĐŊŅĐš" ĐēОд и ŅаĐŧĐžŅŅĐžŅŅĐĩĐģŅĐŊĐž вŅĐŋĐžĐģĐŊŅĐĩŅ "ĐžĐļидаĐŊиĐĩ", ĐēĐžĐŗĐ´Đ° ŅŅĐž ĐŊĐĩОйŅ
ОдиĐŧĐž.
+Đ ŅОвŅĐĩĐŧĐĩĐŊĐŊŅŅ
вĐĩŅŅиŅŅ
Python ĐĩŅŅŅ ĐžŅĐĩĐŊŅ Đ¸ĐŊŅŅиŅивĐŊŅĐš ŅĐŋĐžŅОй ĐžĐŋŅĐĩĐ´ĐĩĐģŅŅŅ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš ĐēОд. ĐŅĐž Đ´ĐĩĐģаĐĩŅ ĐĩĐŗĐž ĐŋĐžŅ
ĐžĐļиĐŧ ĐŊа ОйŅŅĐŊŅĐš ÂĢĐŋĐžŅĐģĐĩдОваŅĐĩĐģŅĐŊŅĐšÂģ ĐēОд, а ÂĢĐžĐļидаĐŊиĐĩÂģ вŅĐŋĐžĐģĐŊŅĐĩŅŅŅ ĐˇĐ° Đ˛Đ°Ņ Đ˛ ĐŊŅĐļĐŊŅĐĩ ĐŧĐžĐŧĐĩĐŊŅŅ.
-ĐŅĐģи ĐŊĐĩĐēĐ°Ņ ĐžĐŋĐĩŅаŅĐ¸Ņ ŅŅĐĩĐąŅĐĩŅ ĐžĐļидаĐŊĐ¸Ņ ĐŋĐĩŅĐĩĐ´ ŅĐĩĐŧ, ĐēаĐē вĐĩŅĐŊŅŅŅ ŅĐĩСŅĐģŅŅаŅ, и
-ĐŋОддĐĩŅĐļиваĐĩŅ ŅОвŅĐĩĐŧĐĩĐŊĐŊŅĐĩ вОСĐŧĐžĐļĐŊĐžŅŅи Python, ĐēОд ĐŧĐžĐļĐŊĐž ĐŊаĐŋиŅаŅŅ ŅĐģĐĩĐ´ŅŅŅиĐŧ ОйŅаСОĐŧ:
+ĐĐžĐŗĐ´Đ° ĐĩŅŅŅ ĐžĐŋĐĩŅаŅиŅ, ĐēĐžŅĐžŅОК ĐŊŅĐļĐŊĐž ĐŋОдОĐļдаŅŅ ĐŋĐĩŅĐĩĐ´ ŅĐĩĐŧ, ĐēаĐē вĐĩŅĐŊŅŅŅ ŅĐĩСŅĐģŅŅаŅ, и ĐžĐŊа ĐŋОддĐĩŅĐļиваĐĩŅ ŅŅи ĐŊОвŅĐĩ вОСĐŧĐžĐļĐŊĐžŅŅи Python, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐŊаĐŋиŅаŅŅ ŅаĐē:
```Python
burgers = await get_burgers(2)
```
-ĐĐģавĐŊĐžĐĩ СдĐĩŅŅ ŅĐģОвО `await`. ĐĐŊĐž ŅООйŅаĐĩŅ Đ¸ĐŊŅĐĩŅĐŋŅĐĩŅаŅĐžŅŅ, ŅŅĐž ĐŊĐĩОйŅ
ОдиĐŧĐž Đ´ĐžĐļдаŅŅŅŅ â¸
-ĐŋĐžĐēа `get_burgers(2)` СаĐēĐžĐŊŅĐ¸Ņ ŅвОи Đ´ĐĩĐģа đ, и ŅĐžĐģŅĐēĐž ĐŋĐžŅĐģĐĩ ŅŅĐžĐŗĐž ŅĐžŅ
ŅаĐŊиŅŅ ŅĐĩСŅĐģŅŅĐ°Ņ Đ˛ `burgers`.
-ĐĐŊĐ°Ņ ŅŅĐž, Python ĐŧĐžĐļĐĩŅ ĐŋĐžĐēа ĐŋĐĩŅĐĩĐēĐģŅŅиŅŅŅŅ ĐŊа вŅĐŋĐžĐģĐŊĐĩĐŊиĐĩ Đ´ŅŅĐŗĐ¸Ņ
ĐˇĐ°Đ´Đ°Ņ đ â¯
-(ĐŊаĐŋŅиĐŧĐĩŅ ĐŋĐžĐģŅŅĐĩĐŊиĐĩ ŅĐģĐĩĐ´ŅŅŅĐĩĐŗĐž СаĐŋŅĐžŅа).
+ĐĐģŅŅ ĐˇĐ´ĐĩŅŅ â `await`. ĐĐŊ ĐŗĐžĐ˛ĐžŅĐ¸Ņ Python, ŅŅĐž ĐŊŅĐļĐŊĐž ĐŋОдОĐļдаŅŅ â¸, ĐŋĐžĐēа `get_burgers(2)` СаĐēĐžĐŊŅĐ¸Ņ ŅĐ˛ĐžŅ Đ´ĐĩĐģĐž đ, ĐŋŅĐĩĐļĐ´Đĩ ŅĐĩĐŧ ŅĐžŅ
ŅаĐŊŅŅŅ ŅĐĩСŅĐģŅŅĐ°Ņ Đ˛ `burgers`. ĐĐģĐ°ĐŗĐžĐ´Đ°ŅŅ ŅŅĐžĐŧŅ Python ĐąŅĐ´ĐĩŅ ĐˇĐŊаŅŅ, ŅŅĐž Са ŅŅĐž вŅĐĩĐŧŅ ĐŧĐžĐļĐŊĐž СаĐŊŅŅŅŅŅ ŅĐĩĐŧ-ŅĐž ĐĩŅŅ đ ⯠(ĐŊаĐŋŅиĐŧĐĩŅ, ĐŋŅиĐŊŅŅŅ Đ´ŅŅĐŗĐžĐš СаĐŋŅĐžŅ).
-ЧŅĐžĐąŅ ĐēĐģŅŅĐĩвОĐĩ ŅĐģОвО `await` ŅŅайОŅаĐģĐž, ĐžĐŊĐž Đ´ĐžĐģĐļĐŊĐž ĐŊаŅ
ОдиŅŅŅŅ Đ˛ĐŊŅŅŅи ŅŅĐŊĐēŅии,
-ĐēĐžŅĐžŅĐ°Ņ ĐŋОддĐĩŅĐļиваĐĩŅ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊĐžŅŅŅ. ĐĐģŅ ŅŅĐžĐŗĐž ваĐŧ ĐŋŅĐžŅŅĐž ĐŊŅĐļĐŊĐž ОйŅŅвиŅŅ ĐĩŅ ĐēаĐē `async def`:
+ЧŅĐžĐąŅ `await` ŅайОŅаĐģ, ĐžĐŊ Đ´ĐžĐģĐļĐĩĐŊ ĐŊаŅ
ОдиŅŅŅŅ Đ˛ĐŊŅŅŅи ŅŅĐŊĐēŅии, ĐēĐžŅĐžŅĐ°Ņ ĐŋОддĐĩŅĐļиваĐĩŅ ŅаĐēŅŅ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊĐžŅŅŅ. ĐĐģŅ ŅŅĐžĐŗĐž ĐŋŅĐžŅŅĐž ОйŅŅвиŅĐĩ ĐĩŅ Ņ `async def`:
```Python hl_lines="1"
async def get_burgers(number: int):
- # ĐĐžŅОвиĐŧ ĐąŅŅĐŗĐĩŅŅ ĐŋĐž ŅĐŋĐĩŅиаĐģŅĐŊĐžĐŧŅ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊĐžĐŧŅ ŅĐĩŅĐĩĐŋŅŅ
+ # ĐĄĐ´ĐĩĐģаŅŅ ŅŅĐž-ŅĐž аŅиĐŊŅ
ŅĐžĐŊĐŊĐžĐĩ, ŅŅĐžĐąŅ ĐŋŅĐ¸ĐŗĐžŅОвиŅŅ ĐąŅŅĐŗĐĩŅŅ
return burgers
```
@@ -355,26 +325,22 @@ async def get_burgers(number: int):
```Python hl_lines="2"
# ĐŅĐž ĐŊĐĩ аŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš ĐēОд
def get_sequential_burgers(number: int):
- # ĐĐžŅОвиĐŧ ĐąŅŅĐŗĐĩŅŅ ĐŋĐžŅĐģĐĩдОваŅĐĩĐģŅĐŊĐž ĐŋĐž ŅĐ°ĐŗĐ°Đŧ
+ # ĐĄĐ´ĐĩĐģаŅŅ ŅŅĐž-ŅĐž ĐŋĐžŅĐģĐĩдОваŅĐĩĐģŅĐŊĐžĐĩ, ŅŅĐžĐąŅ ĐŋŅĐ¸ĐŗĐžŅОвиŅŅ ĐąŅŅĐŗĐĩŅŅ
return burgers
```
-ĐĐąŅŅвĐģĐĩĐŊиĐĩ `async def` ŅĐēаСŅваĐĩŅ Đ¸ĐŊŅĐĩŅĐŋŅĐĩŅаŅĐžŅŅ, ŅŅĐž вĐŊŅŅŅи ŅŅОК ŅŅĐŊĐēŅии
-ŅĐģĐĩĐ´ŅĐĩŅ ĐžĐļидаŅŅ Đ˛ŅŅаĐļĐĩĐŊиК `await`, и ŅŅĐž ĐŧĐžĐļĐŊĐž ĐŋĐžŅŅавиŅŅ Đ˛ŅĐŋĐžĐģĐŊĐĩĐŊиĐĩ ŅаĐēОК ŅŅĐŊĐēŅии ĐŊа "ĐŋаŅСŅ" ⸠и
-ĐŋĐĩŅĐĩĐēĐģŅŅиŅŅŅŅ ĐŊа Đ´ŅŅĐŗĐ¸Đĩ СадаŅи đ, Ņ ŅĐĩĐŧ ŅŅĐžĐąŅ Đ˛ĐĩŅĐŊŅŅŅŅŅ ŅŅда ĐŋОСĐļĐĩ.
+ĐĄ `async def` Python СĐŊаĐĩŅ, ŅŅĐž вĐŊŅŅŅи ŅŅОК ŅŅĐŊĐēŅии ĐŊŅĐļĐŊĐž ŅŅиŅŅваŅŅ Đ˛ŅŅаĐļĐĩĐŊĐ¸Ņ `await` и ŅŅĐž вŅĐŋĐžĐģĐŊĐĩĐŊиĐĩ ŅаĐēОК ŅŅĐŊĐēŅии ĐŧĐžĐļĐŊĐž ÂĢĐŋŅиОŅŅаĐŊавĐģиваŅŅÂģ ⸠и идŅи Đ´ĐĩĐģаŅŅ ŅŅĐž-ŅĐž ĐĩŅŅ đ, ŅŅĐžĐąŅ ĐŋĐžŅĐžĐŧ вĐĩŅĐŊŅŅŅŅŅ.
-ĐŅĐģи Đ˛Ņ Ņ
ĐžŅиŅĐĩ вŅСваŅŅ ŅŅĐŊĐēŅĐ¸Ņ Ņ `async def`, ваĐŧ ĐŊŅĐļĐŊĐž "ĐžĐļидаŅŅ" ĐĩŅ.
-ĐĐžŅŅĐžĐŧŅ ŅаĐēĐžĐĩ ĐŊĐĩ ŅŅайОŅаĐĩŅ:
+ĐĐžĐŗĐ´Đ° Đ˛Ņ Ņ
ĐžŅиŅĐĩ вŅСваŅŅ ŅŅĐŊĐēŅиŅ, ОйŅŅвĐģĐĩĐŊĐŊŅŅ Ņ `async def`, ĐŊŅĐļĐŊĐž ĐĩŅ ÂĢĐžĐļидаŅŅÂģ. ĐĐžŅŅĐžĐŧŅ Đ˛ĐžŅ ŅаĐē ĐŊĐĩ ŅŅайОŅаĐĩŅ:
```Python
-# ĐŅĐž ĐŊĐĩ СаŅайОŅаĐĩŅ, ĐŋĐžŅĐēĐžĐģŅĐēŅ get_burgers ОйŅŅвĐģĐĩĐŊа Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩĐŧ async def
+# ĐŅĐž ĐŊĐĩ ŅŅайОŅаĐĩŅ, ĐŋĐžŅĐžĐŧŅ ŅŅĐž get_burgers ĐžĐŋŅĐĩĐ´ĐĩĐģĐĩĐŊа Ņ: async def
burgers = get_burgers(2)
```
---
-ĐŅĐģи ŅŅĐžŅĐžĐŊĐŊŅŅ ĐąĐ¸ĐąĐģиОŅĐĩĐēа ŅŅĐĩĐąŅĐĩŅ Đ˛ŅСŅваŅŅ ĐĩŅ Ņ ĐēĐģŅŅĐĩвŅĐŧ ŅĐģОвОĐŧ `await`,
-ĐŊĐĩОйŅ
ОдиĐŧĐž ĐŋиŅаŅŅ *ŅŅĐŊĐēŅии ОйŅайОŅĐēи ĐŋŅŅи* Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩĐŧ `async def`, ĐŊаĐŋŅиĐŧĐĩŅ:
+ĐŅаĐē, ĐĩŅĐģи Đ˛Ņ Đ¸ŅĐŋĐžĐģŅСŅĐĩŅĐĩ йийĐģиОŅĐĩĐēŅ, ĐēĐžŅĐžŅŅŅ ĐŧĐžĐļĐŊĐž вŅСŅваŅŅ Ņ `await`, ваĐŧ ĐŊŅĐļĐŊĐž ŅОСдаŅŅ *ŅŅĐŊĐēŅиŅ-ОйŅайОŅŅиĐē ĐŋŅŅи*, ĐēĐžŅĐžŅĐ°Ņ ĐĩŅ Đ¸ŅĐŋĐžĐģŅСŅĐĩŅ, Ņ `async def`, ĐŊаĐŋŅиĐŧĐĩŅ:
```Python hl_lines="2-3"
@app.get('/burgers')
@@ -383,129 +349,96 @@ async def read_burgers():
return burgers
```
-### ĐĸĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ ĐŋОдŅОйĐŊĐžŅŅи
+### ĐĐžĐģĐĩĐĩ ŅĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ ĐŋОдŅОйĐŊĐžŅŅи { #more-technical-details }
-ĐаĐē Đ˛Ņ ĐŧĐžĐŗĐģи СаĐŧĐĩŅиŅŅ, `await` ĐŧĐžĐļĐĩŅ ĐŋŅиĐŧĐĩĐŊŅŅŅŅŅ ŅĐžĐģŅĐēĐž в ŅŅĐŊĐēŅиŅŅ
, ОйŅŅвĐģĐĩĐŊĐŊŅŅ
Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩĐŧ `async def`.
+ĐŅ ĐŧĐžĐŗĐģи СаĐŧĐĩŅиŅŅ, ŅŅĐž `await` ĐŧĐžĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ ŅĐžĐģŅĐēĐž вĐŊŅŅŅи ŅŅĐŊĐēŅиК, ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐŊŅŅ
Ņ `async def`.
-
-ĐĐž вŅĐŋĐžĐģĐŊĐĩĐŊиĐĩ ŅаĐēОК ŅŅĐŊĐēŅии ĐŊĐĩОйŅ
ОдиĐŧĐž "ĐžĐļидаŅŅ" Ņ ĐŋĐžĐŧĐžŅŅŅ `await`.
-ĐŅĐž ОСĐŊаŅаĐĩŅ, ŅŅĐž ĐĩŅ ĐŧĐžĐļĐŊĐž вŅСваŅŅ ŅĐžĐģŅĐēĐž иС Đ´ŅŅĐŗĐžĐš ŅŅĐŊĐēŅии, ĐēĐžŅĐžŅĐ°Ņ ŅĐžĐļĐĩ ОйŅŅвĐģĐĩĐŊа Ņ `async def`.
+ĐĐž ĐŋŅи ŅŅĐžĐŧ ŅŅĐŊĐēŅии, ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐŊŅĐĩ Ņ `async def`, ĐŊŅĐļĐŊĐž ÂĢĐžĐļидаŅŅÂģ. ĐĐŊаŅиŅ, ŅŅĐŊĐēŅии Ņ `async def` ŅĐžĐļĐĩ ĐŧĐžĐļĐŊĐž вŅСŅваŅŅ ŅĐžĐģŅĐēĐž иС ŅŅĐŊĐēŅиК, ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐŊŅŅ
Ņ `async def`.
-ĐĐž ĐēаĐē ĐļĐĩ ŅĐžĐŗĐ´Đ° ĐŋĐžŅвиĐģаŅŅ ĐŋĐĩŅĐ˛Đ°Ņ ĐēŅŅиŅа? Đ ŅĐŧŅŅĐģĐĩ... ĐēаĐē ĐŊаĐŧ вŅСваŅŅ ĐŋĐĩŅвŅŅ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊŅŅ ŅŅĐŊĐēŅиŅ?
+ĐĸаĐē ŅŅĐž ĐļĐĩ Ņ ÂĢŅĐšŅĐžĐŧ и ĐēŅŅиŅĐĩĐšÂģ â ĐēаĐē вŅСваŅŅ ĐŋĐĩŅвŅŅ `async` ŅŅĐŊĐēŅиŅ?
-ĐŅи ŅайОŅĐĩ Ņ **FastAPI** ĐŋŅĐžŅŅĐž ĐŊĐĩ Đ´ŅĐŧаКŅĐĩ Ой ŅŅĐžĐŧ, ĐŋĐžŅĐžĐŧŅ ŅŅĐž "ĐŋĐĩŅвОК" ŅŅĐŊĐēŅиĐĩĐš ŅвĐģŅĐĩŅŅŅ Đ˛Đ°Ņа *ŅŅĐŊĐēŅĐ¸Ņ ĐžĐąŅайОŅĐēи ĐŋŅŅи*,
-и даĐģŅŅĐĩ Ņ ŅŅиĐŧ ŅаСйĐĩŅŅŅŅŅ FastAPI.
+ĐŅĐģи Đ˛Ņ ŅайОŅаĐĩŅĐĩ Ņ **FastAPI**, ваĐŧ ĐŊĐĩ Đž ŅĐĩĐŧ ĐąĐĩŅĐŋĐžĐēОиŅŅŅŅ, ĐŋĐžŅĐžĐŧŅ ŅŅĐž ŅŅОК ÂĢĐŋĐĩŅвОКÂģ ŅŅĐŊĐēŅиĐĩĐš ĐąŅĐ´ĐĩŅ Đ˛Đ°Ņа *ŅŅĐŊĐēŅиŅ-ОйŅайОŅŅиĐē ĐŋŅŅи*, а FastAPI СĐŊаĐĩŅ, ĐēаĐē ŅĐ´ĐĩĐģаŅŅ Đ˛ŅŅ ĐŋŅавиĐģŅĐŊĐž.
-ĐŅĐžĐŧĐĩ ŅĐžĐŗĐž, ĐĩŅĐģи Ņ
ĐžŅиŅĐĩ, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ ŅиĐŊŅаĐēŅĐ¸Ņ `async` / `await` и ĐąĐĩС FastAPI.
+ĐĐž ĐĩŅĐģи Đ˛Ņ Ņ
ĐžŅиŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ `async` / `await` ĐąĐĩС FastAPI, Đ˛Ņ ŅĐžĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ ŅŅĐž ŅĐ´ĐĩĐģаŅŅ.
-### ĐиŅиŅĐĩ ŅвОК аŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš ĐēОд
+### ĐиŅиŅĐĩ ŅвОК аŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš ĐēОд { #write-your-own-async-code }
-Starlette (и **FastAPI**) ĐžŅĐŊОваĐŊŅ ĐŊа AnyIO, ŅŅĐž Đ´ĐĩĐģаĐĩŅ Đ¸Ņ
ŅОвĐŧĐĩŅŅиĐŧŅĐŧи ĐēаĐē ŅĐž ŅŅаĐŊдаŅŅĐŊОК йийĐģиОŅĐĩĐēОК asyncio в Python, ŅаĐē и Ņ Trio.
+Starlette (и **FastAPI**) ĐžŅĐŊОваĐŊŅ ĐŊа AnyIO, ŅŅĐž Đ´ĐĩĐģаĐĩŅ Đ¸Ņ
ŅОвĐŧĐĩŅŅиĐŧŅĐŧи и ŅĐž ŅŅаĐŊдаŅŅĐŊОК йийĐģиОŅĐĩĐēОК Python asyncio, и Ņ Trio.
-Đ ŅаŅŅĐŊĐžŅŅи, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐŊаĐŋŅŅĐŧŅŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ AnyIO в ŅĐĩŅ
ĐŋŅĐžĐĩĐēŅаŅ
, ĐŗĐ´Đĩ ŅŅĐĩĐąŅĐĩŅŅŅ ĐąĐžĐģĐĩĐĩ ŅĐģĐžĐļĐŊĐ°Ņ ĐģĐžĐŗĐ¸Đēа ŅайОŅŅ Ņ ĐēĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅŅŅ.
+Đ ŅаŅŅĐŊĐžŅŅи, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐŊаĐŋŅŅĐŧŅŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ AnyIO Đ´ĐģŅ ĐŋŅОдвиĐŊŅŅŅŅ
ŅŅĐĩĐŊаŅиĐĩв ĐēĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅи, ĐŗĐ´Đĩ в ваŅĐĩĐŧ ĐēОдĐĩ ĐŊŅĐļĐŊŅ ĐąĐžĐģĐĩĐĩ ŅĐģĐžĐļĐŊŅĐĩ ĐŋаŅŅĐĩŅĐŊŅ.
-ĐаĐļĐĩ ĐĩŅĐģи Đ˛Ņ ĐŊĐĩ иŅĐŋĐžĐģŅСŅĐĩŅĐĩ FastAPI, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐŋиŅаŅŅ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ Ņ ĐŋĐžĐŧĐžŅŅŅ AnyIO, ŅŅĐžĐąŅ ĐžĐŊи ĐąŅĐģи ĐŧаĐēŅиĐŧаĐģŅĐŊĐž ŅОвĐŧĐĩŅŅиĐŧŅĐŧи и ĐŋĐžĐģŅŅаĐģи ĐĩĐŗĐž ĐŋŅĐĩиĐŧŅŅĐĩŅŅва (ĐŊаĐŋŅиĐŧĐĩŅ *ŅŅŅŅĐēŅŅŅĐŊŅŅ ĐēĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅŅ*).
+РдаĐļĐĩ ĐĩŅĐģи Đ˛Ņ ĐŊĐĩ иŅĐŋĐžĐģŅСŅĐĩŅĐĩ FastAPI, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐŋиŅаŅŅ ŅвОи аŅиĐŊŅ
ŅĐžĐŊĐŊŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ Ņ AnyIO, ŅŅĐžĐąŅ ĐžĐŊи ĐąŅĐģи ĐŧаĐēŅиĐŧаĐģŅĐŊĐž ŅОвĐŧĐĩŅŅиĐŧŅĐŧи и ĐŋĐžĐģŅŅаĐģи ĐĩĐŗĐž ĐŋŅĐĩиĐŧŅŅĐĩŅŅва (ĐŊаĐŋŅиĐŧĐĩŅ, *ŅŅŅŅĐēŅŅŅĐŊŅŅ ĐēĐžĐŊĐēŅŅĐĩĐŊŅĐŊĐžŅŅŅ*).
-### ĐŅŅĐŗĐ¸Đĩ Đ˛Đ¸Đ´Ņ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊĐžĐŗĐž ĐŋŅĐžĐŗŅаĐŧĐŧиŅОваĐŊиŅ
+Đ¯ ŅОСдаĐģ ĐĩŅŅ ĐžĐ´ĐŊŅ ĐąĐ¸ĐąĐģиОŅĐĩĐēŅ ĐŋОвĐĩŅŅ
AnyIO, ŅĐžĐŊĐēиК ŅĐģОК, ŅŅĐžĐąŅ ĐŊĐĩĐŧĐŊĐžĐŗĐž ŅĐģŅŅŅиŅŅ Đ°ĐŊĐŊĐžŅаŅии ŅиĐŋОв и ĐŋĐžĐģŅŅиŅŅ ĐąĐžĐģĐĩĐĩ ĐēаŅĐĩŅŅвĐĩĐŊĐŊĐžĐĩ **авŅОСавĐĩŅŅĐĩĐŊиĐĩ**, **ĐžŅийĐēи ĐŋŅŅĐŧĐž в ŅĐĩдаĐēŅĐžŅĐĩ** и Ņ.Đ´. ĐĸаĐŧ ŅаĐēĐļĐĩ ĐĩŅŅŅ Đ´ŅŅĐļĐĩĐģŅĐąĐŊĐžĐĩ ввĐĩĐ´ĐĩĐŊиĐĩ и ŅŅĐēОвОдŅŅвО, ŅŅĐžĐąŅ ĐŋĐžĐŧĐžŅŅ Đ˛Đ°Đŧ **ĐŋĐžĐŊŅŅŅ** и ĐŋиŅаŅŅ **ŅвОК ŅОйŅŅвĐĩĐŊĐŊŅĐš аŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš ĐēОд**: Asyncer. ĐĐŊа ĐžŅОйĐĩĐŊĐŊĐž ĐŋĐžĐģĐĩСĐŊа, ĐĩŅĐģи ваĐŧ ĐŊŅĐļĐŊĐž **ĐēĐžĐŧйиĐŊиŅОваŅŅ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš ĐēОд Ņ ĐžĐąŅŅĐŊŅĐŧ** (ĐąĐģĐžĐēиŅŅŅŅиĐŧ/ŅиĐŊŅ
ŅĐžĐŊĐŊŅĐŧ) ĐēОдОĐŧ.
-ĐĄŅиĐģŅ ĐŊаĐŋиŅаĐŊĐ¸Ņ ĐēОда Ņ `async` и `await` ĐŋĐžŅвиĐģŅŅ Đ˛ ŅСŅĐēĐĩ Python ĐžŅĐŊĐžŅиŅĐĩĐģŅĐŊĐž ĐŊĐĩдавĐŊĐž.
+### ĐŅŅĐŗĐ¸Đĩ ŅĐžŅĐŧŅ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊĐžĐŗĐž ĐēОда { #other-forms-of-asynchronous-code }
-ĐĐž ĐžĐŊ ŅиĐģŅĐŊĐž ОйĐģĐĩĐŗŅаĐĩŅ ŅайОŅŅ Ņ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊŅĐŧ ĐēОдОĐŧ.
+ĐĸаĐēОК ŅŅиĐģŅ Đ¸ŅĐŋĐžĐģŅСОваĐŊĐ¸Ņ `async` и `await` ĐžŅĐŊĐžŅиŅĐĩĐģŅĐŊĐž ĐŊОвŅĐš в ŅСŅĐēĐĩ.
-РОвĐŊĐž ŅаĐēОК ĐļĐĩ ŅиĐŊŅаĐēŅĐ¸Ņ (ĐŊŅ Đ¸Đģи ĐŋĐžŅŅи ŅаĐēОК ĐļĐĩ) ĐŊĐĩдавĐŊĐž ĐąŅĐģ вĐēĐģŅŅŅĐŊ в ŅОвŅĐĩĐŧĐĩĐŊĐŊŅĐĩ вĐĩŅŅии JavaScript (в ĐąŅаŅСĐĩŅĐĩ и NodeJS).
+ĐĐž ĐžĐŊ ŅиĐģŅĐŊĐž ŅĐŋŅĐžŅаĐĩŅ ŅайОŅŅ Ņ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊŅĐŧ ĐēОдОĐŧ.
-ĐĐž ŅŅĐžĐŗĐž ĐŋОддĐĩŅĐļĐēа аŅиĐŊŅ
ŅĐžĐŊĐŊĐžĐŗĐž ĐēОда ĐąŅĐģа ŅĐĩаĐģиСОваĐŊа ĐŊаĐŧĐŊĐžĐŗĐž ŅĐģĐžĐļĐŊĐĩĐĩ, и ĐĩĐŗĐž ĐąŅĐģĐž ŅŅŅĐ´ĐŊĐĩĐĩ вОŅĐŋŅиĐŊиĐŧаŅŅ.
+ĐĸаĐēОК ĐļĐĩ (иĐģи ĐŋĐžŅŅи ŅаĐēОК ĐļĐĩ) ŅиĐŊŅаĐēŅĐ¸Ņ ĐŊĐĩдавĐŊĐž ĐŋĐžŅвиĐģŅŅ Đ˛ ŅОвŅĐĩĐŧĐĩĐŊĐŊŅŅ
вĐĩŅŅиŅŅ
JavaScript (в ĐąŅаŅСĐĩŅĐĩ и NodeJS).
-Đ ĐŋŅĐĩĐ´ŅĐ´ŅŅиŅ
вĐĩŅŅиŅŅ
Python Đ´ĐģŅ ŅŅĐžĐŗĐž иŅĐŋĐžĐģŅСОваĐģиŅŅ ĐŋĐžŅĐžĐēи иĐģи Gevent. ĐĐž ŅаĐēОК ĐēОд ĐŊаĐŧĐŊĐžĐŗĐž ŅĐģĐžĐļĐŊĐĩĐĩ ĐŋĐžĐŊиĐŧаŅŅ, ĐžŅĐģаĐļиваŅŅ Đ¸ ĐŧŅŅĐģĐĩĐŊĐŊĐž ĐŋŅĐĩĐ´ŅŅавĐģŅŅŅ.
+ĐĐž ŅŅĐžĐŗĐž ŅайОŅа Ņ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊŅĐŧ ĐēОдОĐŧ ĐąŅĐģа СаĐŧĐĩŅĐŊĐž ŅĐģĐžĐļĐŊĐĩĐĩ и ŅŅŅĐ´ĐŊĐĩĐĩ Đ´ĐģŅ ĐŋĐžĐŊиĐŧаĐŊиŅ.
-ЧŅĐž ĐēаŅаĐĩŅŅŅ JavaScript (в ĐąŅаŅСĐĩŅĐĩ и NodeJS), ŅаĐŊŅŅĐĩ ŅаĐŧ иŅĐŋĐžĐģŅСОваĐģи Đ´ĐģŅ ŅŅОК ŅĐĩĐģи
-"ОйŅаŅĐŊŅĐĩ вŅСОвŅ". ЧŅĐž вŅĐģиваĐģĐžŅŅ Đ˛
-ад ОйŅаŅĐŊŅŅ
вŅСОвОв.
+Đ ĐŋŅĐĩĐ´ŅĐ´ŅŅиŅ
вĐĩŅŅиŅŅ
Python ĐŧĐžĐļĐŊĐž ĐąŅĐģĐž иŅĐŋĐžĐģŅСОваŅŅ ĐŋĐžŅĐžĐēи иĐģи Gevent. ĐĐž ŅаĐēОК ĐēОд ĐŗĐžŅаСдО ŅĐģĐžĐļĐŊĐĩĐĩ ĐŋĐžĐŊиĐŧаŅŅ, ĐžŅĐģаĐļиваŅŅ Đ¸ Đ´ĐĩŅĐļаŅŅ Đ˛ ĐŗĐžĐģОвĐĩ.
-## ĐĄĐžĐŋŅĐžĐŗŅаĐŧĐŧŅ
+Đ ĐŋŅĐĩĐļĐŊиŅ
вĐĩŅŅиŅŅ
NodeJS/ĐąŅаŅСĐĩŅĐŊĐžĐŗĐž JavaScript Đ˛Ņ ĐąŅ Đ¸ŅĐŋĐžĐģŅСОваĐģи ÂĢcallbacksÂģ (ОйŅаŅĐŊŅĐĩ вŅСОвŅ), ŅŅĐž ĐŋŅĐ¸Đ˛ĐžĐ´Đ¸Ņ Đē ÂĢcallback hellÂģ (ад ОйŅаŅĐŊŅŅ
вŅСОвОв).
-**ĐĐžŅŅŅиĖĐŊа** (иĐģи ĐļĐĩ ŅĐžĐŋŅĐžĐŗŅаĐŧĐŧа) â ŅŅĐž ĐēŅŅŅĐžĐĩ ŅĐģОвĐĩŅĐēĐž Đ´ĐģŅ Đ¸ĐŧĐĩĐŊОваĐŊĐ¸Ņ ŅОК ŅŅŅĐŊĐžŅŅи,
-ĐēĐžŅĐžŅŅŅ Đ˛ĐžĐˇĐ˛ŅаŅаĐĩŅ ŅŅĐŊĐēŅĐ¸Ņ `async def`. Python СĐŊаĐĩŅ, ŅŅĐž ĐĩŅ ĐŧĐžĐļĐŊĐž СаĐŋŅŅŅиŅŅ, ĐēаĐē и ОйŅŅĐŊŅŅ ŅŅĐŊĐēŅиŅ,
-ĐŊĐž ĐēŅĐžĐŧĐĩ ŅĐžĐŗĐž ŅĐžĐŋŅĐžĐŗŅаĐŧĐŧŅ ĐŧĐžĐļĐŊĐž ĐŋĐžŅŅавиŅŅ ĐŊа ĐŋаŅĐˇŅ â¸ Đ˛ ŅĐžĐŧ ĐŧĐĩŅŅĐĩ, ĐŗĐ´Đĩ вŅŅŅĐĩŅиŅŅŅ ŅĐģОвО `await`.
+## ĐĄĐžĐŋŅĐžĐŗŅаĐŧĐŧŅ { #coroutines }
-ĐŅŅ ŅŅĐŊĐēŅиОĐŊаĐģŅĐŊĐžŅŅŅ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊĐžĐŗĐž ĐŋŅĐžĐŗŅаĐŧĐŧиŅОваĐŊĐ¸Ņ Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩĐŧ `async` и `await`
-ŅаŅŅĐž ОйОйŅаŅŅ ŅĐģОвОĐŧ "ĐēĐžŅŅŅиĐŊŅ". ĐĐŊи аĐŊаĐģĐžĐŗĐ¸ŅĐŊŅ "ĐŗĐžŅŅŅиĐŊаĐŧ", ĐēĐģŅŅĐĩвОК ĐžŅОйĐĩĐŊĐŊĐžŅŅи
-ŅСŅĐēа Go.
+**ĐĄĐžĐŋŅĐžĐŗŅаĐŧĐŧа** (coroutine) â ŅŅĐž ĐŋŅĐžŅŅĐž ÂĢĐŊавОŅĐžŅĐĩĐŊĐŊĐžĐĩÂģ ŅĐģОвО Đ´ĐģŅ ŅĐžĐŗĐž, ŅŅĐž вОСвŅаŅаĐĩŅ ŅŅĐŊĐēŅĐ¸Ņ `async def`. Python СĐŊаĐĩŅ, ŅŅĐž ŅŅĐž ĐŋĐžŅ
ĐžĐļĐĩ ĐŊа ŅŅĐŊĐēŅиŅ: ĐĩŅ ĐŧĐžĐļĐŊĐž СаĐŋŅŅŅиŅŅ, ĐžĐŊа ĐēĐžĐŗĐ´Đ°-ĐŊийŅĐ´Ņ ĐˇĐ°Đ˛ĐĩŅŅиŅŅŅ, ĐŊĐž ĐĩŅ Đ˛ŅĐŋĐžĐģĐŊĐĩĐŊиĐĩ ĐŧĐžĐļĐĩŅ ĐŋŅиОŅŅаĐŊавĐģиваŅŅŅŅ â¸ Đ˛ĐŊŅŅŅи, ĐēĐžĐŗĐ´Đ° вŅŅŅĐĩŅаĐĩŅŅŅ `await`.
-## ĐаĐēĐģŅŅĐĩĐŊиĐĩ
+ЧаŅŅĐž вŅŅ ŅŅĐŊĐēŅиОĐŊаĐģŅĐŊĐžŅŅŅ Đ¸ŅĐŋĐžĐģŅСОваĐŊĐ¸Ņ Đ°ŅиĐŊŅ
ŅĐžĐŊĐŊĐžĐŗĐž ĐēОда Ņ `async` и `await` ĐēŅаŅĐēĐž ĐŊаСŅваŅŅ ÂĢŅĐžĐŋŅĐžĐŗŅаĐŧĐŧаĐŧиÂģ. ĐŅĐž ŅĐžĐŋĐžŅŅавиĐŧĐž Ņ ĐēĐģŅŅĐĩвОК ĐžŅОйĐĩĐŊĐŊĐžŅŅŅŅ Go â ÂĢgoroutinesÂģ.
-Đ ŅаĐŧĐžĐŧ ĐŊаŅаĐģĐĩ ĐąŅĐģа ŅаĐēĐ°Ņ ŅŅаСа:
+## ĐаĐēĐģŅŅĐĩĐŊиĐĩ { #conclusion }
-> ХОвŅĐĩĐŧĐĩĐŊĐŊŅĐĩ вĐĩŅŅии Python ĐŋОддĐĩŅĐļиваŅŅ ŅаСŅайОŅĐēŅ ŅаĐē ĐŊаСŅваĐĩĐŧĐžĐŗĐž
-**"аŅиĐŊŅ
ŅĐžĐŊĐŊĐžĐŗĐž ĐēОда"** ĐŋĐžŅŅĐĩĐ´ŅŅвОĐŧ ĐŊаĐŋиŅаĐŊĐ¸Ņ **"ŅĐžĐŋŅĐžĐŗŅаĐŧĐŧ"** Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩĐŧ
-ŅиĐŊŅаĐēŅиŅа **`async` и `await`**.
+ĐĐĩŅĐŊŅĐŧŅŅ Đē ŅОК ĐļĐĩ ŅŅаСĐĩ:
-ĐĸĐĩĐŋĐĩŅŅ Đ˛ŅŅ Đ´ĐžĐģĐļĐŊĐž СвŅŅаŅŅ ĐŋĐžĐŊŅŅĐŊĐĩĐĩ. â¨
+> ХОвŅĐĩĐŧĐĩĐŊĐŊŅĐĩ вĐĩŅŅии Python ĐŋОддĐĩŅĐļиваŅŅ **ÂĢаŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš ĐēОдÂģ** Ņ ĐŋĐžĐŧĐžŅŅŅ **ÂĢŅĐžĐŋŅĐžĐŗŅаĐŧĐŧÂģ** (coroutines) и ŅиĐŊŅаĐēŅиŅа **`async` и `await`**.
-Đа ŅŅĐžĐŧ ĐžŅĐŊОваĐŊа ŅайОŅа FastAPI (ĐŋĐžŅŅĐĩĐ´ŅŅвОĐŧ Starlette), и иĐŧĐĩĐŊĐŊĐž ŅŅĐž
-ОйĐĩŅĐŋĐĩŅиваĐĩŅ ĐĩĐŗĐž вŅŅĐžĐēŅŅ ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅŅ.
+ĐĸĐĩĐŋĐĩŅŅ ŅŅĐž Đ´ĐžĐģĐļĐŊĐž СвŅŅаŅŅ ĐŋĐžĐŊŅŅĐŊĐĩĐĩ. â¨
-## ĐŅĐĩĐŊŅ ŅĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ ĐŋОдŅОйĐŊĐžŅŅи
+ĐĐŧĐĩĐŊĐŊĐž ŅŅĐž ÂĢдвиĐļĐĩŅÂģ FastAPI (ŅĐĩŅĐĩС Starlette) и ОйĐĩŅĐŋĐĩŅиваĐĩŅ ŅŅĐžĐģŅ Đ˛ĐŋĐĩŅаŅĐģŅŅŅŅŅ ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅŅ.
-/// warning
+## ĐŅĐĩĐŊŅ ŅĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ ĐŋОдŅОйĐŊĐžŅŅи { #very-technical-details }
-ĐŅĐžŅ ŅаСдĐĩĐģ ŅиŅаŅŅ ĐŊĐĩ ОйŅСаŅĐĩĐģŅĐŊĐž.
+/// warning | ĐŅĐĩĐ´ŅĐŋŅĐĩĐļĐ´ĐĩĐŊиĐĩ
-ĐĐ´ĐĩŅŅ ĐŋŅивОдŅŅŅŅ ĐŋОдŅОйĐŊĐžŅŅи вĐŊŅŅŅĐĩĐŊĐŊĐĩĐŗĐž ŅŅŅŅОКŅŅва **FastAPI**.
+ĐĄĐēĐžŅĐĩĐĩ вŅĐĩĐŗĐž, ŅŅĐžŅ ŅаСдĐĩĐģ ĐŧĐžĐļĐŊĐž ĐŋŅĐžĐŋŅŅŅиŅŅ.
-ĐĐž ĐĩŅĐģи Đ˛Ņ ĐžĐąĐģадаĐĩŅĐĩ ŅĐĩŅ
ĐŊиŅĐĩŅĐēиĐŧи СĐŊаĐŊиŅĐŧи (ĐēĐžŅŅŅиĐŊŅ, ĐŋĐžŅĐžĐēи, ĐąĐģĐžĐēиŅОвĐēа и Ņ. Đ´.)
-и ваĐŧ иĐŊŅĐĩŅĐĩŅĐŊĐž, ĐēаĐē FastAPI ОйŅайаŅŅваĐĩŅ `async def` в ĐžŅĐģиŅиĐĩ ĐžŅ ĐžĐąŅŅĐŊŅŅ
`def`,
-ŅиŅаКŅĐĩ даĐģŅŅĐĩ.
+ĐĐ´ĐĩŅŅ â ĐžŅĐĩĐŊŅ ŅĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ ĐŋОдŅОйĐŊĐžŅŅи Đž ŅĐžĐŧ, ĐēаĐē **FastAPI** ŅайОŅаĐĩŅ ÂĢĐŋОд ĐēаĐŋĐžŅĐžĐŧÂģ.
+
+ĐŅĐģи Ņ Đ˛Đ°Ņ ĐĩŅŅŅ Đ´ĐžŅŅаŅĐžŅĐŊĐž ŅĐĩŅ
ĐŊиŅĐĩŅĐēиŅ
СĐŊаĐŊиК (ŅĐžĐŋŅĐžĐŗŅаĐŧĐŧŅ, ĐŋĐžŅĐžĐēи, ĐąĐģĐžĐēиŅОвĐēи и Ņ.Đ´.) и ваĐŧ иĐŊŅĐĩŅĐĩŅĐŊĐž, ĐēаĐē FastAPI ОйŅайаŅŅваĐĩŅ `async def` ĐŋĐž ŅŅавĐŊĐĩĐŊĐ¸Ņ Ņ ĐžĐąŅŅĐŊŅĐŧ `def`, â вĐŋĐĩŅŅĐ´.
///
-### ФŅĐŊĐēŅии ОйŅайОŅĐēи ĐŋŅŅи
+### ФŅĐŊĐēŅии-ОйŅайОŅŅиĐēи ĐŋŅŅи { #path-operation-functions }
-ĐĐžĐŗĐ´Đ° Đ˛Ņ ĐžĐąŅŅвĐģŅĐĩŅĐĩ *ŅŅĐŊĐēŅĐ¸Ņ ĐžĐąŅайОŅĐēи ĐŋŅŅи* ОйŅŅĐŊŅĐŧ ОйŅаСОĐŧ Ņ ĐēĐģŅŅĐĩвŅĐŧ ŅĐģОвОĐŧ `def`
-вĐŧĐĩŅŅĐž `async def`, FastAPI ĐžĐļидаĐĩŅ ĐĩŅ Đ˛ŅĐŋĐžĐģĐŊĐĩĐŊиŅ, СаĐŋŅŅŅив ŅŅĐŊĐēŅĐ¸Ņ Đ˛Đž вĐŊĐĩŅĐŊĐĩĐŧ
-ĐŋŅĐģĐĩ ĐŋĐžŅĐžĐēОв, а ĐŊĐĩ ĐŊаĐŋŅŅĐŧŅŅ (ŅŅĐž ĐąŅ ĐˇĐ°ĐąĐģĐžĐēиŅОваĐģĐž ŅĐĩŅвĐĩŅ).
+ĐĐžĐŗĐ´Đ° Đ˛Ņ ĐžĐąŅŅвĐģŅĐĩŅĐĩ *ŅŅĐŊĐēŅиŅ-ОйŅайОŅŅиĐē ĐŋŅŅи* ОйŅŅĐŊŅĐŧ `def` вĐŧĐĩŅŅĐž `async def`, ĐžĐŊа СаĐŋŅŅĐēаĐĩŅŅŅ Đ˛Đž вĐŊĐĩŅĐŊĐĩĐŧ ĐŋŅĐģĐĩ ĐŋĐžŅĐžĐēОв, ĐēĐžŅĐžŅŅĐš СаŅĐĩĐŧ ÂĢĐžĐļидаĐĩŅŅŅÂģ, вĐŧĐĩŅŅĐž ĐŋŅŅĐŧĐžĐŗĐž вŅСОва (ĐŋŅŅĐŧОК вŅСОв СайĐģĐžĐēиŅОваĐģ ĐąŅ ŅĐĩŅвĐĩŅ).
-ĐŅĐģи ŅаĐŊĐĩĐĩ Đ˛Ņ Đ¸ŅĐŋĐžĐģŅСОваĐģи Đ´ŅŅĐŗĐžĐš аŅиĐŊŅ
ŅĐžĐŊĐŊŅĐš ŅŅĐĩĐšĐŧвОŅĐē, ĐēĐžŅĐžŅŅĐš ŅайОŅаĐĩŅ Đ¸ĐŊаŅĐĩ,
-и ĐŋŅивŅĐēĐģи ОйŅŅвĐģŅŅŅ ĐŋŅĐžŅŅŅĐĩ вŅŅиŅĐģиŅĐĩĐģŅĐŊŅĐĩ *ŅŅĐŊĐēŅии* ŅĐĩŅĐĩС `def` Ņади
-ĐŊĐĩСĐŊаŅиŅĐĩĐģŅĐŊĐžĐŗĐž ĐŋŅиŅĐžŅŅа ŅĐēĐžŅĐžŅŅи (ĐŋĐžŅŅĐ´Đēа 100 ĐŊаĐŊĐžŅĐĩĐēŅĐŊĐ´), ОйŅаŅиŅĐĩ вĐŊиĐŧаĐŊиĐĩ,
-ŅŅĐž Ņ **FastAPI** Đ˛Ņ ĐŋĐžĐģŅŅиŅĐĩ ĐŋŅĐžŅивОĐŋĐžĐģĐžĐļĐŊŅĐš ŅŅŅĐĩĐēŅ. Đ ŅаĐēĐžĐŧ ŅĐģŅŅаĐĩ йОĐģŅŅĐĩ ĐŋОдŅ
ОдиŅ
-`async def`, ĐĩŅĐģи ŅĐžĐģŅĐēĐž *ŅŅĐŊĐēŅĐ¸Ņ ĐžĐąŅайОŅĐēи ĐŋŅŅи* ĐŊĐĩ иŅĐŋĐžĐģŅСŅĐĩŅ ĐēОд, ĐŋŅивОдŅŅиК
-Đē ĐąĐģĐžĐēиŅОвĐēĐĩ I/O.
-
+ĐŅĐģи Đ˛Ņ ĐŋŅиŅĐģи иС Đ´ŅŅĐŗĐžĐŗĐž async-ŅŅĐĩĐšĐŧвОŅĐēа, ĐēĐžŅĐžŅŅĐš ŅайОŅаĐĩŅ Đ¸ĐŊаŅĐĩ, и ĐŋŅивŅĐēĐģи ОйŅŅвĐģŅŅŅ ŅŅивиаĐģŅĐŊŅĐĩ *ŅŅĐŊĐēŅии-ОйŅайОŅŅиĐēи ĐŋŅŅи*, вŅĐŋĐžĐģĐŊŅŅŅиĐĩ ŅĐžĐģŅĐēĐž вŅŅиŅĐģĐĩĐŊиŅ, ŅĐĩŅĐĩС ĐŋŅĐžŅŅОК `def` Ņади ĐēŅĐžŅĐĩŅĐŊОК вŅĐŗĐžĐ´Ņ Đ˛ ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅи (ĐžĐēĐžĐģĐž 100 ĐŊаĐŊĐžŅĐĩĐēŅĐŊĐ´), ОйŅаŅиŅĐĩ вĐŊиĐŧаĐŊиĐĩ: в **FastAPI** ŅŅŅĐĩĐēŅ ĐąŅĐ´ĐĩŅ ĐŋŅĐžŅивОĐŋĐžĐģĐžĐļĐŊŅĐŧ. Đ ŅаĐēиŅ
ŅĐģŅŅаŅŅ
ĐģŅŅŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ `async def`, ĐĩŅĐģи ŅĐžĐģŅĐēĐž ваŅи *ŅŅĐŊĐēŅии-ОйŅайОŅŅиĐēи ĐŋŅŅи* ĐŊĐĩ иŅĐŋĐžĐģŅСŅŅŅ ĐēОд, вŅĐŋĐžĐģĐŊŅŅŅиК ĐąĐģĐžĐēиŅŅŅŅиК I/O.
-
-ĐĐž в ĐģŅйОĐŧ ŅĐģŅŅаĐĩ вĐĩĐģиĐēа вĐĩŅĐžŅŅĐŊĐžŅŅŅ, ŅŅĐž **FastAPI** [ĐžĐēаĐļĐĩŅŅŅ ĐąŅŅŅŅĐĩĐĩ](index.md#_11){.internal-link target=_blank}
-Đ´ŅŅĐŗĐžĐŗĐž ŅŅĐĩĐšĐŧвОŅĐēа (иĐģи Ņ
ĐžŅŅ ĐąŅ ĐŊа ŅŅОвĐŊĐĩ Ņ ĐŊиĐŧ).
+ĐĸĐĩĐŧ ĐŊĐĩ ĐŧĐĩĐŊĐĩĐĩ, в ОйОиŅ
ŅĐģŅŅаŅŅ
вĐĩĐģиĐēа вĐĩŅĐžŅŅĐŊĐžŅŅŅ, ŅŅĐž **FastAPI** [вŅŅ ŅавĐŊĐž ĐąŅĐ´ĐĩŅ ĐąŅŅŅŅĐĩĐĩ](index.md#performance){.internal-link target=_blank} (иĐģи ĐēаĐē ĐŧиĐŊиĐŧŅĐŧ ŅĐžĐŋĐžŅŅавиĐŧ) Ņ Đ˛Đ°ŅиĐŧ ĐŋŅĐĩĐ´ŅĐ´ŅŅиĐŧ ŅŅĐĩĐšĐŧвОŅĐēĐžĐŧ.
-### ĐавиŅиĐŧĐžŅŅи
+### ĐавиŅиĐŧĐžŅŅи { #dependencies }
-ĐĸĐž ĐļĐĩ ĐžŅĐŊĐžŅиŅŅŅ Đē СавиŅиĐŧĐžŅŅŅĐŧ. ĐŅĐģи ŅŅĐž ОйŅŅĐŊĐ°Ņ ŅŅĐŊĐēŅĐ¸Ņ `def`, а ĐŊĐĩ `async def`,
-ĐžĐŊа СаĐŋŅŅĐēаĐĩŅŅŅ Đ˛Đž вĐŊĐĩŅĐŊĐĩĐŧ ĐŋŅĐģĐĩ ĐŋĐžŅĐžĐēОв.
+ĐĸĐž ĐļĐĩ ĐžŅĐŊĐžŅиŅŅŅ Đē [СавиŅиĐŧĐžŅŅŅĐŧ](tutorial/dependencies/index.md){.internal-link target=_blank}. ĐŅĐģи СавиŅиĐŧĐžŅŅŅ â ŅŅĐž ОйŅŅĐŊĐ°Ņ ŅŅĐŊĐēŅĐ¸Ņ `def`, а ĐŊĐĩ `async def`, ĐžĐŊа СаĐŋŅŅĐēаĐĩŅŅŅ Đ˛Đž вĐŊĐĩŅĐŊĐĩĐŧ ĐŋŅĐģĐĩ ĐŋĐžŅĐžĐēОв.
-### ĐОдСавиŅиĐŧĐžŅŅи
+### ĐОдСавиŅиĐŧĐžŅŅи { #sub-dependencies }
-ĐŅ ĐŧĐžĐļĐĩŅĐĩ ОйŅŅвиŅŅ ĐŧĐŊĐžĐļĐĩŅŅвО ŅŅŅĐģаŅŅиŅ
ŅŅ Đ´ŅŅĐŗ ĐŊа Đ´ŅŅĐŗĐ° СавиŅиĐŧĐžŅŅĐĩĐš и ĐŋОдСавиŅиĐŧĐžŅŅĐĩĐš
-(в видĐĩ ĐŋаŅаĐŧĐĩŅŅОв ĐŋŅи ĐžĐŋŅĐĩĐ´ĐĩĐģĐĩĐŊии ŅŅĐŊĐēŅии). ĐаĐēиĐĩ-ŅĐž ĐąŅĐ´ŅŅ ŅОСдаĐŊŅ Ņ ĐŋĐžĐŧĐžŅŅŅ `async def`,
-Đ´ŅŅĐŗĐ¸Đĩ ОйŅŅĐŊŅĐŧ ОйŅаСОĐŧ ŅĐĩŅĐĩС `def`, и ŅаĐēĐ°Ņ ŅŅ
ĐĩĐŧа вĐŋĐžĐģĐŊĐĩ ŅайОŅĐžŅĐŋĐžŅОйĐŊа. ФŅĐŊĐēŅии,
-ОйŅŅвĐģĐĩĐŊĐŊŅĐĩ Ņ ĐŋĐžĐŧĐžŅŅŅ `def` ĐąŅĐ´ŅŅ ĐˇĐ°ĐŋŅŅĐēаŅŅŅŅ ĐŊа вĐŊĐĩŅĐŊĐĩĐŧ ĐŋĐžŅĐžĐēĐĩ (иС ĐŋŅĐģа),
-а ĐŊĐĩ Ņ ĐŋĐžĐŧĐžŅŅŅ `await`.
+ĐŖ Đ˛Đ°Ņ ĐŧĐžĐļĐĩŅ ĐąŅŅŅ ĐŊĐĩŅĐēĐžĐģŅĐēĐž СавиŅиĐŧĐžŅŅĐĩĐš и [ĐŋОдСавиŅиĐŧĐžŅŅĐĩĐš](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank}, ĐēĐžŅĐžŅŅĐĩ ŅŅĐĩĐąŅŅŅ Đ´ŅŅĐŗ Đ´ŅŅĐŗĐ° (в видĐĩ ĐŋаŅаĐŧĐĩŅŅОв ĐžĐŋŅĐĩĐ´ĐĩĐģĐĩĐŊиК ŅŅĐŊĐēŅиК): ŅаŅŅŅ Đ¸Đˇ ĐŊиŅ
ĐŧĐžĐļĐĩŅ ĐąŅŅŅ ĐžĐąŅŅвĐģĐĩĐŊа Ņ `async def`, а ŅаŅŅŅ â ОйŅŅĐŊŅĐŧ `def`. ĐŅŅ ĐąŅĐ´ĐĩŅ ŅайОŅаŅŅ, а ŅĐĩ, ŅŅĐž ОйŅŅвĐģĐĩĐŊŅ ĐžĐąŅŅĐŊŅĐŧ `def`, ĐąŅĐ´ŅŅ Đ˛ŅСŅваŅŅŅŅ Đ˛Đž вĐŊĐĩŅĐŊĐĩĐŧ ĐŋĐžŅĐžĐēĐĩ (иС ĐŋŅĐģа), а ĐŊĐĩ ÂĢĐžĐļидаŅŅŅŅÂģ.
-### ĐŅŅĐŗĐ¸Đĩ ŅĐģŅĐļĐĩĐąĐŊŅĐĩ ŅŅĐŊĐēŅии
+### ĐŅŅĐŗĐ¸Đĩ ŅĐģŅĐļĐĩĐąĐŊŅĐĩ ŅŅĐŊĐēŅии { #other-utility-functions }
-ĐŅĐąŅĐĩ Đ´ŅŅĐŗĐ¸Đĩ ŅĐģŅĐļĐĩĐąĐŊŅĐĩ ŅŅĐŊĐēŅии, ĐēĐžŅĐžŅŅĐĩ Đ˛Ņ Đ˛ŅСŅваĐĩŅĐĩ ĐŊаĐŋŅŅĐŧŅŅ, ĐŧĐžĐļĐŊĐž ОйŅŅвĐģŅŅŅ
-Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩĐŧ `def` иĐģи `async def`. FastAPI ĐŊĐĩ ĐąŅĐ´ĐĩŅ Đ˛ĐģиŅŅŅ ĐŊа ŅĐž, ĐēаĐē вŅ
-иŅ
СаĐŋŅŅĐēаĐĩŅĐĩ.
+ĐŅĐąŅĐĩ Đ´ŅŅĐŗĐ¸Đĩ ŅĐģŅĐļĐĩĐąĐŊŅĐĩ ŅŅĐŊĐēŅии, ĐēĐžŅĐžŅŅĐĩ Đ˛Ņ Đ˛ŅСŅваĐĩŅĐĩ ĐŊаĐŋŅŅĐŧŅŅ, ĐŧĐžĐļĐŊĐž ОйŅŅвĐģŅŅŅ ĐžĐąŅŅĐŊŅĐŧ `def` иĐģи `async def`, и FastAPI ĐŊĐĩ ĐąŅĐ´ĐĩŅ Đ˛ĐģиŅŅŅ ĐŊа ŅĐž, ĐēаĐē Đ˛Ņ Đ¸Ņ
вŅСŅваĐĩŅĐĩ.
-ĐŅиĐŧ ĐžĐŊи ĐžŅĐģиŅаŅŅŅŅ ĐžŅ ŅŅĐŊĐēŅиК, ĐēĐžŅĐžŅŅĐĩ FastAPI вŅСŅваĐĩŅ ŅаĐŧĐžŅŅĐžŅŅĐĩĐģŅĐŊĐž:
-*ŅŅĐŊĐēŅии ОйŅайОŅĐēи ĐŋŅŅи* и СавиŅиĐŧĐžŅŅи.
+Đ ĐžŅĐģиŅиĐĩ ĐžŅ ŅŅĐŊĐēŅиК, ĐēĐžŅĐžŅŅĐĩ FastAPI вŅСŅваĐĩŅ ĐˇĐ° ваŅ: *ŅŅĐŊĐēŅии-ОйŅайОŅŅиĐēи ĐŋŅŅи* и СавиŅиĐŧĐžŅŅи.
-ĐŅĐģи ŅĐģŅĐļĐĩĐąĐŊĐ°Ņ ŅŅĐŊĐēŅĐ¸Ņ ĐžĐąŅŅвĐģĐĩĐŊа Ņ ĐŋĐžĐŧĐžŅŅŅ `def`, ĐžĐŊа ĐąŅĐ´ĐĩŅ Đ˛ŅСваĐŊа ĐŊаĐŋŅŅĐŧŅŅ
-(ĐēаĐē Đ˛Ņ Đ¸ ĐŊаĐŋиŅаĐģи в ĐēОдĐĩ), а ĐŊĐĩ в ĐžŅĐ´ĐĩĐģŅĐŊĐžĐŧ ĐŋĐžŅĐžĐēĐĩ. ĐŅĐģи ĐļĐĩ ĐžĐŊа ОйŅŅвĐģĐĩĐŊа Ņ
-ĐŋĐžĐŧĐžŅŅŅ `async def`, ĐĩŅ Đ˛ŅСОв Đ´ĐžĐģĐļĐĩĐŊ ĐžŅŅŅĐĩŅŅвĐģŅŅŅŅŅ Ņ ĐžĐļидаĐŊиĐĩĐŧ ŅĐĩŅĐĩС `await`.
+ĐŅĐģи ŅĐģŅĐļĐĩĐąĐŊĐ°Ņ ŅŅĐŊĐēŅĐ¸Ņ â ОйŅŅĐŊĐ°Ņ ŅŅĐŊĐēŅĐ¸Ņ Ņ `def`, ĐžĐŊа ĐąŅĐ´ĐĩŅ Đ˛ŅСваĐŊа ĐŊаĐŋŅŅĐŧŅŅ (ĐēаĐē Đ˛Ņ Đ¸ ĐŋиŅĐĩŅĐĩ в ĐēОдĐĩ), ĐŊĐĩ в ĐŋŅĐģĐĩ ĐŋĐžŅĐžĐēОв; ĐĩŅĐģи ŅŅĐŊĐēŅĐ¸Ņ ĐžĐąŅŅвĐģĐĩĐŊа Ņ `async def`, ŅĐžĐŗĐ´Đ° ĐŋŅи ĐĩŅ Đ˛ŅСОвĐĩ в ваŅĐĩĐŧ ĐēОдĐĩ Đ˛Ņ Đ´ĐžĐģĐļĐŊŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ `await`.
---
-
-ĐŅŅ ŅаС ĐŋОвŅĐžŅиĐŧ, ŅŅĐž вŅĐĩ ŅŅи ŅĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ ĐŋОдŅОйĐŊĐžŅŅи ĐŋĐžĐģĐĩСĐŊŅ, ŅĐžĐģŅĐēĐž ĐĩŅĐģи Đ˛Ņ ŅĐŋĐĩŅиаĐģŅĐŊĐž иŅ
иŅĐēаĐģи.
+ĐĄĐŊОва: ŅŅĐž ĐžŅĐĩĐŊŅ ŅĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ ĐŋОдŅОйĐŊĐžŅŅи, ĐŋĐžĐģĐĩСĐŊŅĐĩ, вĐĩŅĐžŅŅĐŊĐž, ŅĐžĐģŅĐēĐž ĐĩŅĐģи Đ˛Ņ ŅĐĩĐģĐĩĐŊаĐŋŅавĐģĐĩĐŊĐŊĐž иŅ
иŅĐĩŅĐĩ.
-Đ ĐŋŅĐžŅивĐŊĐžĐŧ ŅĐģŅŅаĐĩ ĐŋŅĐžŅŅĐž ОСĐŊаĐēĐžĐŧŅŅĐĩŅŅ Ņ ĐžŅĐŊОвĐŊŅĐŧи ĐŋŅиĐŊŅиĐŋаĐŧи в ŅаСдĐĩĐģĐĩ вŅŅĐĩ: ĐĐĩŅ Đ˛ŅĐĩĐŧĐĩĐŊи?.
+ĐĐŊаŅĐĩ ваĐŧ Đ´ĐžŅŅаŅĐžŅĐŊĐž ŅŅĐēОвОдŅŅвОваŅŅŅŅ ŅĐĩĐēĐžĐŧĐĩĐŊдаŅиŅĐŧи иС ŅаСдĐĩĐģа вŅŅĐĩ: ĐĐĩŅ Đ˛ŅĐĩĐŧĐĩĐŊи?.
diff --git a/docs/ru/docs/benchmarks.md b/docs/ru/docs/benchmarks.md
index 259dca8e6..612b39f70 100644
--- a/docs/ru/docs/benchmarks.md
+++ b/docs/ru/docs/benchmarks.md
@@ -1,37 +1,34 @@
-# ĐаĐŧĐĩŅŅ ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅи
+# ĐĐĩĐŊŅĐŧаŅĐēи (ŅĐĩŅŅŅ ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅи) { #benchmarks }
-ĐĐĩСавиŅиĐŧŅĐĩ ŅĐĩŅŅŅ ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅи ĐŋŅиĐģĐžĐļĐĩĐŊиК ĐžŅ TechEmpower ĐŋĐžĐēаСŅваŅŅ, ŅŅĐž **FastAPI** ĐŋОд ŅĐŋŅавĐģĐĩĐŊиĐĩĐŧ Uvicorn ОдиĐŊ иС ŅаĐŧŅŅ
ĐąŅŅŅŅŅŅ
Python-ŅŅĐĩĐšĐŧвОŅĐēОв и ŅŅŅŅĐŋаĐĩŅ ŅĐžĐģŅĐēĐž Starlette и Uvicorn (ĐēĐžŅĐžŅŅĐĩ иŅĐŋĐžĐģŅСŅŅŅŅŅ Đ˛ FastAPI). (*)
+ĐĐĩСавиŅиĐŧŅĐĩ ĐąĐĩĐŊŅĐŧаŅĐēи TechEmpower ĐŋĐžĐēаСŅваŅŅ, ŅŅĐž ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ **FastAPI** ĐŋОд ŅĐŋŅавĐģĐĩĐŊиĐĩĐŧ Uvicorn â ОдĐŊи иС ŅаĐŧŅŅ
ĐąŅŅŅŅŅŅ
PythonâŅŅĐĩĐšĐŧвОŅĐēОв, ŅŅŅŅĐŋаŅŅиĐĩ ŅĐžĐģŅĐēĐž Starlette и ŅаĐŧĐžĐŧŅ Uvicorn (иŅĐŋĐžĐģŅСŅŅŅŅŅ Đ˛ĐŊŅŅŅи FastAPI).
-ĐĐž ĐŋŅи ĐŋŅĐžŅĐŧĐžŅŅĐĩ и ŅŅавĐŊĐĩĐŊии СаĐŧĐĩŅОв ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅи ŅĐģĐĩĐ´ŅĐĩŅ Đ¸ĐŧĐĩŅŅ Đ˛ Đ˛Đ¸Đ´Ņ ĐŊиĐļĐĩĐžĐŋиŅаĐŊĐŊĐžĐĩ.
+ĐĐž ĐŋŅи ĐŋŅĐžŅĐŧĐžŅŅĐĩ ĐąĐĩĐŊŅĐŧаŅĐēОв и ŅŅавĐŊĐĩĐŊиК ŅĐģĐĩĐ´ŅĐĩŅ Đ¸ĐŧĐĩŅŅ Đ˛ Đ˛Đ¸Đ´Ņ ŅĐģĐĩĐ´ŅŅŅĐĩĐĩ.
-## ĐаĐŧĐĩŅŅ ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅи и ŅĐēĐžŅĐžŅŅи
+## ĐĐĩĐŊŅĐŧаŅĐēи и ŅĐēĐžŅĐžŅŅŅ { #benchmarks-and-speed }
-Đ ĐŋОдОйĐŊŅŅ
ŅĐĩŅŅаŅ
ŅаŅŅĐž ĐŧĐžĐļĐŊĐž ŅвидĐĩŅŅ, ŅŅĐž иĐŊŅŅŅŅĐŧĐĩĐŊŅŅ ŅаСĐŊĐžĐŗĐž ŅиĐŋа ŅŅавĐŊиваŅŅ Đ´ŅŅĐŗ Ņ Đ´ŅŅĐŗĐžĐŧ, ĐēаĐē аĐŊаĐģĐžĐŗĐ¸ŅĐŊŅĐĩ.
+ĐŅи ĐŋŅОвĐĩŅĐēĐĩ ĐąĐĩĐŊŅĐŧаŅĐēОв ŅаŅŅĐž ĐŧĐžĐļĐŊĐž ŅвидĐĩŅŅ, ŅŅĐž иĐŊŅŅŅŅĐŧĐĩĐŊŅŅ ŅаСĐŊŅŅ
ŅиĐŋОв ŅŅавĐŊиваŅŅ ĐēаĐē ŅĐēвиваĐģĐĩĐŊŅĐŊŅĐĩ.
-Đ ŅаŅŅĐŊĐžŅŅи, ŅŅавĐŊиваŅŅ Đ˛ĐŧĐĩŅŅĐĩ Uvicorn, Starlette и FastAPI (ŅŅĐĩди ĐŧĐŊĐžĐŗĐ¸Ņ
Đ´ŅŅĐŗĐ¸Ņ
иĐŊŅŅŅŅĐŧĐĩĐŊŅОв).
+Đ ŅаŅŅĐŊĐžŅŅи, ŅаŅŅĐž ŅŅавĐŊиваŅŅ Đ˛ĐŧĐĩŅŅĐĩ Uvicorn, Starlette и FastAPI (ŅŅĐĩди ĐŧĐŊĐžĐŗĐ¸Ņ
Đ´ŅŅĐŗĐ¸Ņ
иĐŊŅŅŅŅĐŧĐĩĐŊŅОв).
-ЧĐĩĐŧ ĐŋŅĐžŅĐĩ ĐŋŅОйĐģĐĩĐŧа, ĐēĐžŅĐžŅŅŅ ŅĐĩŅаĐĩŅ Đ¸ĐŊŅŅŅŅĐŧĐĩĐŊŅ, ŅĐĩĐŧ вŅŅĐĩ ĐĩĐŗĐž ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅŅ. РйОĐģŅŅиĐŊŅŅвО ŅĐĩŅŅОв ĐŊĐĩ ĐŋŅОвĐĩŅŅŅŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ŅŅĐŊĐēŅии, ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩĐŧŅĐĩ иĐŊŅŅŅŅĐŧĐĩĐŊŅĐžĐŧ.
+ЧĐĩĐŧ ĐŋŅĐžŅĐĩ СадаŅа, ĐēĐžŅĐžŅŅŅ ŅĐĩŅаĐĩŅ Đ¸ĐŊŅŅŅŅĐŧĐĩĐŊŅ, ŅĐĩĐŧ вŅŅĐĩ ĐĩĐŗĐž ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅŅ. РйОĐģŅŅиĐŊŅŅвО ĐąĐĩĐŊŅĐŧаŅĐēОв ĐŊĐĩ ŅĐĩŅŅиŅŅŅŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ вОСĐŧĐžĐļĐŊĐžŅŅи, ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩĐŧŅĐĩ иĐŊŅŅŅŅĐŧĐĩĐŊŅĐžĐŧ.
-ĐĐĩŅаŅŅ
Đ¸Ņ Đ¸ĐŊŅŅŅŅĐŧĐĩĐŊŅОв иĐŧĐĩĐĩŅ ŅĐģĐĩĐ´ŅŅŅиК вид:
+ĐĐĩŅаŅŅ
Đ¸Ņ Đ˛ŅĐŗĐģŅĐ´Đ¸Ņ ŅаĐē:
* **Uvicorn**: ASGI-ŅĐĩŅвĐĩŅ
- * **Starlette** (иŅĐŋĐžĐģŅСŅĐĩŅ Uvicorn): вĐĩĐą-ĐŧиĐēŅĐžŅŅĐĩĐšĐŧвОŅĐē
- * **FastAPI** (иŅĐŋĐžĐģŅСŅĐĩŅ Starlette): API-ĐŧиĐēŅĐžŅŅĐĩĐšĐŧвОŅĐē Ņ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐŧи ŅŅĐŊĐēŅиŅĐŧи Đ´ĐģŅ ŅОСдаĐŊĐ¸Ņ API, Ņ Đ˛Đ°ĐģидаŅиĐĩĐš даĐŊĐŊŅŅ
и Ņ.Đ´.
+ * **Starlette**: (иŅĐŋĐžĐģŅСŅĐĩŅ Uvicorn) вĐĩĐą-ĐŧиĐēŅĐžŅŅĐĩĐšĐŧвОŅĐē
+ * **FastAPI**: (иŅĐŋĐžĐģŅСŅĐĩŅ Starlette) API-ĐŧиĐēŅĐžŅŅĐĩĐšĐŧвОŅĐē Ņ ŅŅĐ´ĐžĐŧ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅŅ
вОСĐŧĐžĐļĐŊĐžŅŅĐĩĐš Đ´ĐģŅ ŅОСдаĐŊĐ¸Ņ API, вĐēĐģŅŅĐ°Ņ Đ˛Đ°ĐģидаŅĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
и Ņ. Đŋ.
* **Uvicorn**:
- * ĐŅĐ´ĐĩŅ Đ¸ĐŧĐĩŅŅ ĐŊаиĐģŅŅŅŅŅ ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅŅ, ŅаĐē ĐēаĐē ĐŊĐĩ иĐŧĐĩĐĩŅ ĐąĐžĐģŅŅĐžĐŗĐž ĐēĐžĐģиŅĐĩŅŅва Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊĐžĐŗĐž ĐēОда, ĐēŅĐžĐŧĐĩ ŅаĐŧĐžĐŗĐž ŅĐĩŅвĐĩŅа.
- * ĐŅ ĐŊĐĩ ĐąŅĐ´ĐĩŅĐĩ ĐŋиŅаŅŅ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐŊа Uvicorn ĐŊаĐŋŅŅĐŧŅŅ. ĐŅĐž ОСĐŊаŅаĐģĐž ĐąŅ, ŅŅĐž ĐĐ°Ņ ĐēОд Đ´ĐžĐģĐļĐĩĐŊ вĐēĐģŅŅаŅŅ ĐēаĐē ĐŧиĐŊиĐŧŅĐŧ вĐĩŅŅ
- ĐēОд, ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩĐŧŅĐš Starlette (иĐģи **FastAPI**). Đ ĐĩŅĐģи ĐŅ ŅаĐē ŅĐ´ĐĩĐģаĐĩŅĐĩ, ŅĐž в ĐēĐžĐŊĐĩŅĐŊĐžĐŧ иŅĐžĐŗĐĩ ĐаŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐąŅĐ´ĐĩŅ Đ¸ĐŧĐĩŅŅ ŅĐĩ ĐļĐĩ ĐŊаĐēĐģадĐŊŅĐĩ ŅаŅŅ
ОдŅ, ŅŅĐž и ĐŋŅи иŅĐŋĐžĐģŅСОваĐŊии ŅŅĐĩĐšĐŧвОŅĐēа, ĐŧиĐŊиĐŧиСиŅŅŅŅĐĩĐŗĐž ĐēОд ĐаŅĐĩĐŗĐž ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ Đ¸ ĐаŅи ĐžŅийĐēи.
- * Uvicorn ĐŋОдĐģĐĩĐļĐ¸Ņ ŅŅавĐŊĐĩĐŊĐ¸Ņ Ņ Daphne, Hypercorn, uWSGI и Đ´ŅŅĐŗĐ¸Đŧи вĐĩĐą-ŅĐĩŅвĐĩŅаĐŧи.
-
+ * ĐŅĐ´ĐĩŅ Đ¸ĐŧĐĩŅŅ ĐŊаиĐģŅŅŅŅŅ ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅŅ, ŅаĐē ĐēаĐē ĐŋĐžĐŧиĐŧĐž ŅаĐŧĐžĐŗĐž ŅĐĩŅвĐĩŅа Ņ ĐŊĐĩĐŗĐž ĐŊĐĩĐŧĐŊĐžĐŗĐž Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊĐžĐŗĐž ĐēОда.
+ * ĐŅ ĐŊĐĩ ĐąŅĐ´ĐĩŅĐĩ ĐŋиŅаŅŅ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐŊĐĩĐŋĐžŅŅĐĩĐ´ŅŅвĐĩĐŊĐŊĐž ĐŊа Uvicorn. ĐŅĐž ОСĐŊаŅаĐģĐž ĐąŅ, ŅŅĐž ĐĐ°Ņ ĐēОд Đ´ĐžĐģĐļĐĩĐŊ вĐēĐģŅŅаŅŅ ĐēаĐē ĐŧиĐŊиĐŧŅĐŧ вĐĩŅŅ ĐēОд, ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩĐŧŅĐš Starlette (иĐģи **FastAPI**). Đ ĐĩŅĐģи ĐŅ ŅаĐē ŅĐ´ĐĩĐģаĐĩŅĐĩ, ŅĐž в ĐēĐžĐŊĐĩŅĐŊĐžĐŧ иŅĐžĐŗĐĩ ĐаŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐąŅĐ´ĐĩŅ Đ¸ĐŧĐĩŅŅ ŅĐĩ ĐļĐĩ ĐŊаĐēĐģадĐŊŅĐĩ ŅаŅŅ
ОдŅ, ŅŅĐž и ĐŋŅи иŅĐŋĐžĐģŅСОваĐŊии ŅŅĐĩĐšĐŧвОŅĐēа, ĐŧиĐŊиĐŧиСиŅŅŅŅĐĩĐŗĐž ĐēОд ĐаŅĐĩĐŗĐž ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ Đ¸ ĐаŅи ĐžŅийĐēи.
+ * ĐŅĐģи ĐŅ ŅŅавĐŊиваĐĩŅĐĩ Uvicorn, ŅŅавĐŊиваКŅĐĩ ĐĩĐŗĐž Ņ Daphne, Hypercorn, uWSGI и Ņ. Đ´. â ŅĐĩŅвĐĩŅаĐŧи ĐŋŅиĐģĐžĐļĐĩĐŊиК.
* **Starlette**:
- * ĐŅĐ´ĐĩŅ ŅŅŅŅĐŋаŅŅ Uvicorn ĐŋĐž ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅи. ФаĐēŅиŅĐĩŅĐēи Starlette ŅĐŋŅавĐģŅĐĩŅŅŅ Uvicorn и иС-Са вŅĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ ĐąĐžĐģŅŅĐĩĐŗĐž ĐēĐžĐģиŅĐĩŅŅва ĐēОда ĐžĐŊ ĐŊĐĩ ĐŧĐžĐļĐĩŅ ĐąŅŅŅ ĐąŅŅŅŅĐĩĐĩ, ŅĐĩĐŧ Uvicorn.
- * ĐаŅĐž ĐžĐŊ ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ ĐаĐŧ иĐŊŅŅŅŅĐŧĐĩĐŊŅŅ Đ´ĐģŅ ŅОСдаĐŊĐ¸Ņ ĐŋŅĐžŅŅŅŅ
вĐĩĐą-ĐŋŅиĐģĐžĐļĐĩĐŊиК Ņ ĐžĐąŅайОŅĐēОК ĐŧаŅŅŅŅŅОв URL и Ņ.Đ´.
- * Starlette ŅĐģĐĩĐ´ŅĐĩŅ ŅŅавĐŊиваŅŅ Ņ Sanic, Flask, Django и Đ´ŅŅĐŗĐ¸Đŧи вĐĩĐą-ŅŅĐĩĐšĐŧвОŅĐēаĐŧи (иĐģи ĐŧиĐēŅĐžŅŅĐĩĐšĐŧвОŅĐēаĐŧи).
-
+ * ĐŅĐ´ĐĩŅ ĐŊа ŅĐģĐĩĐ´ŅŅŅĐĩĐŧ ĐŧĐĩŅŅĐĩ ĐŋĐž ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅи ĐŋĐžŅĐģĐĩ Uvicorn. ФаĐēŅиŅĐĩŅĐēи Starlette СаĐŋŅŅĐēаĐĩŅŅŅ ĐŋОд ŅĐŋŅавĐģĐĩĐŊиĐĩĐŧ Uvicorn, ĐŋĐžŅŅĐžĐŧŅ ĐžĐŊ ĐŧĐžĐļĐĩŅ ĐąŅŅŅ ŅĐžĐģŅĐēĐž ÂĢĐŧĐĩĐ´ĐģĐĩĐŊĐŊĐĩĐĩÂģ Uvicorn иСâСа вŅĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ ĐąĐžĐģŅŅĐĩĐŗĐž ОйŅŅĐŧа ĐēОда.
+ * ĐаŅĐž ĐžĐŊ ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ ĐаĐŧ иĐŊŅŅŅŅĐŧĐĩĐŊŅŅ Đ´ĐģŅ ŅОСдаĐŊĐ¸Ņ ĐŋŅĐžŅŅŅŅ
вĐĩĐąâĐŋŅиĐģĐžĐļĐĩĐŊиК Ņ ĐŧаŅŅŅŅŅиСаŅиĐĩĐš ĐŋĐž ĐŋŅŅŅĐŧ и Ņ. Đŋ.
+ * ĐŅĐģи ĐŅ ŅŅавĐŊиваĐĩŅĐĩ Starlette, ŅŅавĐŊиваКŅĐĩ ĐĩĐŗĐž Ņ Sanic, Flask, Django и Ņ. Đ´. â вĐĩĐąâŅŅĐĩĐšĐŧвОŅĐēаĐŧи (иĐģи ĐŧиĐēŅĐžŅŅĐĩĐšĐŧвОŅĐēаĐŧи).
* **FastAPI**:
- * ĐĸаĐē ĐļĐĩ ĐēаĐē Starlette иŅĐŋĐžĐģŅСŅĐĩŅ Uvicorn и ĐŊĐĩ ĐŧĐžĐļĐĩŅ ĐąŅŅŅ ĐąŅŅŅŅĐĩĐĩ ĐŊĐĩĐŗĐž, **FastAPI** иŅĐŋĐžĐģŅСŅĐĩŅ Starlette, ŅĐž ĐĩŅŅŅ ĐžĐŊ ĐŊĐĩ ĐŧĐžĐļĐĩŅ ĐąŅŅŅ ĐąŅŅŅŅĐĩĐĩ Starlette.
- * FastAPI ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ ĐąĐžĐģŅŅĐĩ вОСĐŧĐžĐļĐŊĐžŅŅĐĩĐš ĐŋОвĐĩŅŅ
Starlette, ĐēĐžŅĐžŅŅĐĩ ĐŊавĐĩŅĐŊŅĐēа ĐаĐŧ ĐŋĐžĐŊадОйŅŅŅŅ ĐŋŅи ŅОСдаĐŊии API, ŅаĐēиĐĩ ĐēаĐē ĐŋŅОвĐĩŅĐēа даĐŊĐŊŅŅ
и ŅĐĩŅиаĐģиСаŅиŅ. РдОвĐĩŅĐžĐē ĐŅ ĐĩŅŅ Đ¸ ĐŋĐžĐģŅŅаĐĩŅĐĩ авŅĐžĐŧаŅиŅĐĩŅĐēŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ (авŅĐžĐŧаŅиŅĐĩŅĐēĐ°Ņ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ Đ´Đ°ĐļĐĩ ĐŊĐĩ ŅвĐĩĐģиŅиваĐĩŅ ĐŊаĐēĐģадĐŊŅĐĩ ŅаŅŅ
ĐžĐ´Ņ ĐŋŅи ŅайОŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиŅ, ŅаĐē ĐēаĐē ĐžĐŊа ŅОСдаĐĩŅŅŅ ĐŋŅи СаĐŋŅŅĐēĐĩ).
- * ĐŅĐģи ĐŅ ĐŊĐĩ иŅĐŋĐžĐģŅСŅĐĩŅĐĩ FastAPI, а иŅĐŋĐžĐģŅСŅĐĩŅĐĩ Starlette ĐŊаĐŋŅŅĐŧŅŅ (иĐģи Đ´ŅŅĐŗĐžĐš иĐŊŅŅŅŅĐŧĐĩĐŊŅ Đ˛ŅОдĐĩ Sanic, Flask, Responder и Ņ.Đ´.), ĐаĐŧ ĐŋŅиŅĐģĐžŅŅ ĐąŅ ŅаĐŧĐžŅŅĐžŅŅĐĩĐģŅĐŊĐž ŅĐĩаĐģиСОваŅŅ Đ˛Đ°ĐģидаŅĐ¸Ņ Đ¸ ŅĐĩŅиаĐģиСаŅĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
. ĐĸĐž ĐĩŅŅŅ, в иŅĐžĐŗĐĩ, ĐаŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ иĐŧĐĩĐģĐž ĐąŅ ŅаĐēиĐĩ ĐļĐĩ ĐŊаĐēĐģадĐŊŅĐĩ ŅаŅŅ
ОдŅ, ĐēаĐē ĐĩŅĐģи ĐąŅ ĐžĐŊĐž ĐąŅĐģĐž ŅОСдаĐŊĐž Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩĐŧ FastAPI. РвО ĐŧĐŊĐžĐŗĐ¸Ņ
ŅĐģŅŅаŅŅ
ваĐģидаŅĐ¸Ņ Đ¸ ŅĐĩŅиаĐģиСаŅĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
ĐŋŅĐĩĐ´ŅŅавĐģŅŅŅ ŅОйОК ŅаĐŧŅĐš йОĐģŅŅОК ОйŅŅĐŧ ĐēОда, ĐŊаĐŋиŅаĐŊĐŊĐžĐŗĐž в ĐŋŅиĐģĐžĐļĐĩĐŊиŅŅ
.
- * ĐĸаĐēиĐŧ ОйŅаСОĐŧ, иŅĐŋĐžĐģŅСŅŅ FastAPI ĐŅ ĐŋĐžŅŅаŅиŅĐĩ ĐŧĐĩĐŊŅŅĐĩ вŅĐĩĐŧĐĩĐŊи ĐŊа ŅаСŅайОŅĐēŅ, ŅĐŧĐĩĐŊŅŅиŅĐĩ ĐēĐžĐģиŅĐĩŅŅвО ĐžŅийОĐē, ŅŅŅĐžĐē ĐēОда и, вĐĩŅĐžŅŅĐŊĐž, ĐŋĐžĐģŅŅиŅĐĩ ŅŅ ĐļĐĩ ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅŅ (иĐģи ĐģŅŅŅĐĩ), ĐēаĐē и ĐĩŅĐģи ĐąŅ ĐŊĐĩ иŅĐŋĐžĐģŅСОваĐģи ĐĩĐŗĐž (ĐŋĐžŅĐēĐžĐģŅĐēŅ ĐаĐŧ ĐŋŅиŅĐģĐžŅŅ ĐąŅ ŅĐĩаĐģиСОваŅŅ Đ˛ŅĐĩ ĐĩĐŗĐž вОСĐŧĐžĐļĐŊĐžŅŅи в ŅвОĐĩĐŧ ĐēОдĐĩ).
- * FastAPI Đ´ĐžĐģĐļĐŊĐž ŅŅавĐŊиваŅŅ Ņ ŅŅĐĩĐšĐŧвОŅĐēаĐŧи вĐĩĐą-ĐŋŅиĐģĐžĐļĐĩĐŊиК (иĐģи ĐŊайОŅаĐŧи иĐŊŅŅŅŅĐŧĐĩĐŊŅОв), ĐēĐžŅĐžŅŅĐĩ ОйĐĩŅĐŋĐĩŅиваŅŅ Đ˛Đ°ĐģидаŅĐ¸Ņ Đ¸ ŅĐĩŅиаĐģиСаŅĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
, а ŅаĐēĐļĐĩ ĐŋŅĐĩĐ´ĐžŅŅавĐģŅŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиŅ, ŅаĐēиĐŧи ĐēаĐē Flask-apispec, NestJS, Molten и иĐŧ ĐŋОдОйĐŊŅĐĩ.
+ * ĐĸĐžŅĐŊĐž ŅаĐē ĐļĐĩ, ĐēаĐē Starlette иŅĐŋĐžĐģŅСŅĐĩŅ Uvicorn и ĐŊĐĩ ĐŧĐžĐļĐĩŅ ĐąŅŅŅ ĐąŅŅŅŅĐĩĐĩ ĐŊĐĩĐŗĐž, **FastAPI** иŅĐŋĐžĐģŅСŅĐĩŅ Starlette, ĐŋĐžŅŅĐžĐŧŅ ĐŊĐĩ ĐŧĐžĐļĐĩŅ ĐąŅŅŅ ĐąŅŅŅŅĐĩĐĩ ĐĩĐŗĐž.
+ * FastAPI ĐŋŅĐĩĐ´ĐžŅŅавĐģŅĐĩŅ ĐąĐžĐģŅŅĐĩ вОСĐŧĐžĐļĐŊĐžŅŅĐĩĐš ĐŋОвĐĩŅŅ
Starlette â ŅĐĩ, ĐēĐžŅĐžŅŅĐĩ ĐŋĐžŅŅи вŅĐĩĐŗĐ´Đ° ĐŊŅĐļĐŊŅ ĐŋŅи ŅОСдаĐŊии API, ŅаĐēиĐĩ ĐēаĐē ваĐģидаŅĐ¸Ņ Đ¸ ŅĐĩŅиаĐģиСаŅĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
. РдОвĐĩŅĐžĐē ĐŅ ĐĩŅŅ Đ¸ ĐŋĐžĐģŅŅаĐĩŅĐĩ авŅĐžĐŧаŅиŅĐĩŅĐēŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ (авŅĐžĐŧаŅиŅĐĩŅĐēĐ°Ņ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ Đ´Đ°ĐļĐĩ ĐŊĐĩ ŅвĐĩĐģиŅиваĐĩŅ ĐŊаĐēĐģадĐŊŅĐĩ ŅаŅŅ
ĐžĐ´Ņ ĐŋŅи ŅайОŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиŅ, ŅаĐē ĐēаĐē ĐžĐŊа ŅОСдаŅŅŅŅ ĐŋŅи СаĐŋŅŅĐēĐĩ).
+ * ĐŅĐģи ĐąŅ ĐŅ ĐŊĐĩ иŅĐŋĐžĐģŅСОваĐģи FastAPI, а иŅĐŋĐžĐģŅСОваĐģи Starlette ĐŊаĐŋŅŅĐŧŅŅ (иĐģи Đ´ŅŅĐŗĐžĐš иĐŊŅŅŅŅĐŧĐĩĐŊŅ Đ˛ŅОдĐĩ Sanic, Flask, Responder и Ņ. Đ´.), ĐаĐŧ ĐŋŅиŅĐģĐžŅŅ ĐąŅ ŅаĐŧĐžŅŅĐžŅŅĐĩĐģŅĐŊĐž ŅĐĩаĐģиСОваŅŅ Đ˛Đ°ĐģидаŅĐ¸Ņ Đ¸ ŅĐĩŅиаĐģиСаŅĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
. ĐĸĐž ĐĩŅŅŅ, в иŅĐžĐŗĐĩ, ĐаŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ иĐŧĐĩĐģĐž ĐąŅ ŅаĐēиĐĩ ĐļĐĩ ĐŊаĐēĐģадĐŊŅĐĩ ŅаŅŅ
ОдŅ, ĐēаĐē ĐĩŅĐģи ĐąŅ ĐžĐŊĐž ĐąŅĐģĐž ŅОСдаĐŊĐž Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊиĐĩĐŧ FastAPI. РвО ĐŧĐŊĐžĐŗĐ¸Ņ
ŅĐģŅŅаŅŅ
ваĐģидаŅĐ¸Ņ Đ¸ ŅĐĩŅиаĐģиСаŅĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
ĐŋŅĐĩĐ´ŅŅавĐģŅŅŅ ŅОйОК ŅаĐŧŅĐš йОĐģŅŅОК ОйŅŅĐŧ ĐēОда, ĐŊаĐŋиŅаĐŊĐŊĐžĐŗĐž в ĐŋŅиĐģĐžĐļĐĩĐŊиŅŅ
.
+ * ĐĸаĐēиĐŧ ОйŅаСОĐŧ, иŅĐŋĐžĐģŅСŅŅ FastAPI, ĐŅ ŅĐēĐžĐŊĐžĐŧиŅĐĩ вŅĐĩĐŧŅ ŅаСŅайОŅĐēи, ŅĐŧĐĩĐŊŅŅаĐĩŅĐĩ ĐēĐžĐģиŅĐĩŅŅвО ĐžŅийОĐē, ŅŅŅĐžĐē ĐēОда и, вĐĩŅĐžŅŅĐŊĐž, ĐŋĐžĐģŅŅиŅĐĩ ŅŅ ĐļĐĩ ĐŋŅОиСвОдиŅĐĩĐģŅĐŊĐžŅŅŅ (иĐģи ĐģŅŅŅĐĩ), ĐēаĐē и ĐĩŅĐģи ĐąŅ ĐŊĐĩ иŅĐŋĐžĐģŅСОваĐģи ĐĩĐŗĐž (ĐŋĐžŅĐēĐžĐģŅĐēŅ ĐаĐŧ ĐŋŅиŅĐģĐžŅŅ ĐąŅ ŅĐĩаĐģиСОваŅŅ Đ˛ŅĐĩ ĐĩĐŗĐž вОСĐŧĐžĐļĐŊĐžŅŅи в ŅвОŅĐŧ ĐēОдĐĩ).
+ * ĐŅĐģи ĐŅ ŅŅавĐŊиваĐĩŅĐĩ FastAPI, ŅŅавĐŊиваКŅĐĩ ĐĩĐŗĐž Ņ ŅŅĐĩĐšĐŧвОŅĐēĐžĐŧ вĐĩĐąâĐŋŅиĐģĐžĐļĐĩĐŊиК (иĐģи ĐŊайОŅĐžĐŧ иĐŊŅŅŅŅĐŧĐĩĐŊŅОв), ĐēĐžŅĐžŅŅĐš ОйĐĩŅĐŋĐĩŅиваĐĩŅ Đ˛Đ°ĐģидаŅĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
, ŅĐĩŅиаĐģиСаŅĐ¸Ņ Đ¸ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиŅ, ŅаĐēиĐŧи ĐēаĐē Flask-apispec, NestJS, Molten и иĐŧ ĐŋОдОйĐŊŅĐĩ. ФŅĐĩĐšĐŧвОŅĐēи Ņ Đ¸ĐŊŅĐĩĐŗŅиŅОваĐŊĐŊОК авŅĐžĐŧаŅиŅĐĩŅĐēОК ваĐģидаŅиĐĩĐš даĐŊĐŊŅŅ
, ŅĐĩŅиаĐģиСаŅиĐĩĐš и Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиĐĩĐš.
diff --git a/docs/ru/docs/deployment/cloud.md b/docs/ru/docs/deployment/cloud.md
new file mode 100644
index 000000000..a400d1843
--- /dev/null
+++ b/docs/ru/docs/deployment/cloud.md
@@ -0,0 +1,16 @@
+# РаСвĐĩŅŅŅваĐŊиĐĩ FastAPI Ņ ĐžĐąĐģаŅĐŊŅŅ
ĐŋŅОваКдĐĩŅОв { #deploy-fastapi-on-cloud-providers }
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ ĐŋŅаĐēŅиŅĐĩŅĐēи ĐģŅĐąĐžĐŗĐž ОйĐģаŅĐŊĐžĐŗĐž ĐŋŅОваКдĐĩŅа, ŅŅĐžĐąŅ ŅаСвĐĩŅĐŊŅŅŅ ŅвОĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐŊа FastAPI.
+
+РйОĐģŅŅиĐŊŅŅвĐĩ ŅĐģŅŅаĐĩв Ņ ĐžŅĐŊОвĐŊŅŅ
ОйĐģаŅĐŊŅŅ
ĐŋŅОваКдĐĩŅОв ĐĩŅŅŅ ŅŅĐēОвОдŅŅва ĐŋĐž ŅаСвĐĩŅŅŅваĐŊĐ¸Ņ FastAPI ĐŊа иŅ
ĐŋĐģаŅŅĐžŅĐŧĐĩ.
+
+## ĐĐąĐģаŅĐŊŅĐĩ ĐŋŅОваКдĐĩŅŅ â ŅĐŋĐžĐŊŅĐžŅŅ { #cloud-providers-sponsors }
+
+ĐĐĩĐēĐžŅĐžŅŅĐĩ ОйĐģаŅĐŊŅĐĩ ĐŋŅОваКдĐĩŅŅ â¨ [**ŅĐŋĐžĐŊŅиŅŅŅŅ FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ⨠â ŅŅĐž ОйĐĩŅĐŋĐĩŅиваĐĩŅ ĐŊĐĩĐŋŅĐĩŅŅвĐŊĐžĐĩ и СдОŅОвОĐĩ ŅаСвиŅиĐĩ FastAPI и ĐĩĐŗĐž ŅĐēĐžŅиŅŅĐĩĐŧŅ.
+
+Đ ŅŅĐž ĐŋĐžĐēаСŅваĐĩŅ Đ¸Ņ
иŅĐēŅĐĩĐŊĐŊŅŅ ĐŋŅивĐĩŅĐļĐĩĐŊĐŊĐžŅŅŅ FastAPI и ĐĩĐŗĐž ŅООйŅĐĩŅŅĐ˛Ņ (ваĐŧ): ĐžĐŊи ĐŊĐĩ ŅĐžĐģŅĐēĐž Ņ
ĐžŅŅŅ ĐŋŅĐĩĐ´ĐžŅŅавиŅŅ Đ˛Đ°Đŧ Ņ
ĐžŅĐžŅиК ŅĐĩŅвиŅ, ĐŊĐž и ŅŅŅĐĩĐŧŅŅŅŅ ĐŗĐ°ŅаĐŊŅиŅОваŅŅ, ŅŅĐž Ņ Đ˛Đ°Ņ ĐąŅĐ´ĐĩŅ Ņ
ĐžŅĐžŅиК и ŅŅайиĐģŅĐŊŅĐš ŅŅĐĩĐšĐŧвОŅĐē â FastAPI. đ
+
+ĐОСĐŧĐžĐļĐŊĐž, Đ˛Ņ ĐˇĐ°Ņ
ĐžŅиŅĐĩ ĐŋĐžĐŋŅОйОваŅŅ Đ¸Ņ
ŅĐĩŅвиŅŅ Đ¸ вОŅĐŋĐžĐģŅСОваŅŅŅŅ Đ¸Ņ
ŅŅĐēОвОдŅŅваĐŧи:
+
+* Render
+* Railway
diff --git a/docs/ru/docs/deployment/concepts.md b/docs/ru/docs/deployment/concepts.md
index acfa1f4fe..207d1604d 100644
--- a/docs/ru/docs/deployment/concepts.md
+++ b/docs/ru/docs/deployment/concepts.md
@@ -1,323 +1,321 @@
-# ĐĐžĐŊŅĐĩĐŋŅии ŅаСвŅŅŅŅваĐŊиŅ
+# ĐĐžĐŊŅĐĩĐŋŅии ŅаСвŅŅŅŅваĐŊĐ¸Ņ { #deployments-concepts }
-ĐĄŅŅĐĩŅŅвŅĐĩŅ ĐŊĐĩŅĐēĐžĐģŅĐēĐž ĐēĐžĐŊŅĐĩĐŋŅиК, ĐŋŅиĐŧĐĩĐŊŅĐĩĐŧŅŅ
Đ´ĐģŅ ŅаСвŅŅŅŅваĐŊĐ¸Ņ ĐŋŅиĐģĐžĐļĐĩĐŊиК **FastAPI**, ŅавĐŊĐž ĐēаĐē и Đ´ĐģŅ ĐģŅĐąŅŅ
Đ´ŅŅĐŗĐ¸Ņ
ŅиĐŋОв вĐĩĐą-ĐŋŅиĐģĐžĐļĐĩĐŊиК, ŅŅĐĩди ĐēĐžŅĐžŅŅŅ
Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ вŅĐąŅаŅŅ **ĐŊаийОĐģĐĩĐĩ ĐŋОдŅ
ОдŅŅиК** ŅĐŋĐžŅОй.
+ĐŅи ŅаСвŅŅŅŅваĐŊии ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ **FastAPI** (и вООйŅĐĩ ĐģŅĐąĐžĐŗĐž вĐĩĐąâAPI) ĐĩŅŅŅ ĐŊĐĩŅĐēĐžĐģŅĐēĐž ĐēĐžĐŊŅĐĩĐŋŅиК, Đž ĐēĐžŅĐžŅŅŅ
ŅŅĐžĐ¸Ņ Đ´ŅĐŧаŅŅ â Ņ Đ¸Ņ
ĐŋĐžĐŧĐžŅŅŅ ĐŧĐžĐļĐŊĐž вŅĐąŅаŅŅ **ĐŊаийОĐģĐĩĐĩ ĐŋОдŅ
ОдŅŅиК** ŅĐŋĐžŅОй **ŅаСвŅŅŅŅваĐŊĐ¸Ņ Đ˛Đ°ŅĐĩĐŗĐž ĐŋŅиĐģĐžĐļĐĩĐŊиŅ**.
-ХаĐŧŅĐĩ ваĐļĐŊŅĐĩ иС ĐŊиŅ
:
+ĐĐĩĐēĐžŅĐžŅŅĐĩ иС ваĐļĐŊŅŅ
ĐēĐžĐŊŅĐĩĐŋŅиК:
-* ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ йОĐģĐĩĐĩ ĐąĐĩСОĐŋаŅĐŊĐžĐŗĐž ĐŋŅĐžŅĐžĐēĐžĐģа HTTPS
-* ĐаŅŅŅОКĐēи СаĐŋŅŅĐēа ĐŋŅиĐģĐžĐļĐĩĐŊиŅ
-* ĐĐĩŅĐĩĐˇĐ°ĐŗŅŅСĐēа ĐŋŅиĐģĐžĐļĐĩĐŊиŅ
-* ĐаĐŋŅŅĐē ĐŊĐĩŅĐēĐžĐģŅĐēиŅ
ŅĐēСĐĩĐŧĐŋĐģŅŅОв ĐŋŅиĐģĐžĐļĐĩĐŊиŅ
-* ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŋаĐŧŅŅŅŅ
-* ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ ĐŋĐĩŅĐĩŅиŅĐģĐĩĐŊĐŊŅŅ
ŅŅĐŊĐēŅиК ĐŋĐĩŅĐĩĐ´ СаĐŋŅŅĐēĐžĐŧ ĐŋŅиĐģĐžĐļĐĩĐŊиŅ.
+* ĐĐĩСОĐŋаŅĐŊĐžŅŅŅ â HTTPS
+* ĐаĐŋŅŅĐē ĐŋŅи ŅŅаŅŅĐĩ
+* ĐĐĩŅĐĩСаĐŋŅŅĐēи
+* Đ ĐĩĐŋĐģиĐēаŅĐ¸Ņ (ĐēĐžĐģиŅĐĩŅŅвО СаĐŋŅŅĐĩĐŊĐŊŅŅ
ĐŋŅĐžŅĐĩŅŅОв)
+* ĐаĐŧŅŅŅ
+* ĐŅĐĩдваŅиŅĐĩĐģŅĐŊŅĐĩ ŅĐ°ĐŗĐ¸ ĐŋĐĩŅĐĩĐ´ СаĐŋŅŅĐēĐžĐŧ
-РаŅŅĐŧĐžŅŅиĐŧ ĐŊиĐļĐĩ вĐģиŅĐŊиĐĩ ĐēаĐļĐ´ĐžĐŗĐž иС ĐŊиŅ
ĐŊа ĐŋŅĐžŅĐĩŅŅ **ŅаСвŅŅŅŅваĐŊиŅ**.
+ĐĐžŅĐŧĐžŅŅиĐŧ, ĐēаĐē ĐžĐŊи вĐģиŅŅŅ ĐŊа **ŅаСвŅŅŅŅваĐŊиŅ**.
-ĐаŅа ĐēĐžĐŊĐĩŅĐŊĐ°Ņ ŅĐĩĐģŅ - **ОйŅĐģŅĐļиваŅŅ ĐēĐģиĐĩĐŊŅОв ваŅĐĩĐŗĐž API ĐąĐĩСОĐŋаŅĐŊĐž** и **ĐąĐĩŅĐŋĐĩŅĐĩйОКĐŊĐž**, Ņ ĐŧаĐēŅиĐŧаĐģŅĐŊĐž ŅŅŅĐĩĐēŅивĐŊŅĐŧ иŅĐŋĐžĐģŅСОваĐŊиĐĩĐŧ **вŅŅиŅĐģиŅĐĩĐģŅĐŊŅŅ
ŅĐĩŅŅŅŅОв** (ĐŊаĐŋŅиĐŧĐĩŅ, ŅдаĐģŅĐŊĐŊŅŅ
ŅĐĩŅвĐĩŅОв/виŅŅŅаĐģŅĐŊŅŅ
ĐŧаŅиĐŊ). đ
+Đ ĐēĐžĐŊĐĩŅĐŊĐžĐŧ иŅĐžĐŗĐĩ ŅĐĩĐģŅ â **ОйŅĐģŅĐļиваŅŅ ĐēĐģиĐĩĐŊŅОв ваŅĐĩĐŗĐž API** ĐąĐĩСОĐŋаŅĐŊĐž, **иСйĐĩĐŗĐ°ŅŅ ĐŋĐĩŅĐĩйОĐĩв** и ĐŧаĐēŅиĐŧаĐģŅĐŊĐž ŅŅŅĐĩĐēŅивĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ **вŅŅиŅĐģиŅĐĩĐģŅĐŊŅĐĩ ŅĐĩŅŅŅŅŅ** (ĐŊаĐŋŅиĐŧĐĩŅ, ŅдаĐģŅĐŊĐŊŅĐĩ ŅĐĩŅвĐĩŅŅ/виŅŅŅаĐģŅĐŊŅĐĩ ĐŧаŅиĐŊŅ). đ
-ĐĐ´ĐĩŅŅ Ņ ĐŊĐĩĐŧĐŊĐžĐŗĐž ŅаŅŅĐēаĐļŅ ĐаĐŧ Ой ŅŅиŅ
**ĐēĐžĐŊŅĐĩĐŋŅиŅŅ
** и ĐŊадĐĩŅŅŅ, ŅŅĐž Ņ Đ˛Đ°Ņ ŅĐģĐžĐļиŅŅŅ **иĐŊŅŅиŅивĐŊĐžĐĩ ĐŋĐžĐŊиĐŧаĐŊиĐĩ**, ĐēаĐēОК ŅĐŋĐžŅОй вŅĐąŅаŅŅ ĐŋŅи ŅаСвĐĩŅŅŅваĐŊии ваŅĐĩĐŗĐž API в ŅаСĐģиŅĐŊŅŅ
ĐžĐēŅŅĐļĐĩĐŊиŅŅ
, вОСĐŧĐžĐļĐŊĐž, даĐļĐĩ **ĐĩŅŅ ĐŊĐĩ ŅŅŅĐĩŅŅвŅŅŅиŅ
**.
+ĐĐ´ĐĩŅŅ Ņ ĐŊĐĩĐŧĐŊĐžĐŗĐž ŅаŅŅĐēаĐļŅ Đž ŅŅиŅ
**ĐēĐžĐŊŅĐĩĐŋŅиŅŅ
**, ŅŅĐžĐąŅ Ņ Đ˛Đ°Ņ ĐŋĐžŅвиĐģаŅŅ **иĐŊŅŅиŅиŅ**, ĐēаĐē ŅаСвŅŅŅŅваŅŅ Đ˛Đ°Ņ API в ŅаСĐŊŅŅ
ĐžĐēŅŅĐļĐĩĐŊиŅŅ
, вОСĐŧĐžĐļĐŊĐž даĐļĐĩ в **ĐąŅĐ´ŅŅиŅ
**, ĐēĐžŅĐžŅŅŅ
ĐĩŅŅ ĐŊĐĩ ŅŅŅĐĩŅŅвŅĐĩŅ.
-ĐСĐŊаĐēĐžĐŧивŅиŅŅ Ņ ŅŅиĐŧи ĐēĐžĐŊŅĐĩĐŋŅиŅĐŧи, Đ˛Ņ ŅĐŧĐžĐļĐĩŅĐĩ **ĐžŅĐĩĐŊиŅŅ Đ¸ вŅĐąŅаŅŅ** ĐģŅŅŅиК ŅĐŋĐžŅОй ŅаСвŅŅŅŅваĐŊии **ĐаŅĐĩĐŗĐž API**.
+ĐŖŅиŅŅĐ˛Đ°Ņ ŅŅи ĐēĐžĐŊŅĐĩĐŋŅии, Đ˛Ņ ŅĐŧĐžĐļĐĩŅĐĩ **ĐžŅĐĩĐŊиŅŅ Đ¸ ŅĐŋŅĐžĐĩĐēŅиŅОваŅŅ** ĐģŅŅŅиК ŅĐŋĐžŅОй ŅаСвŅŅŅŅваĐŊĐ¸Ņ **ŅвОиŅ
API**.
-Đ ĐŋĐžŅĐģĐĩĐ´ŅŅŅиŅ
ĐŗĐģаваŅ
Ņ ĐŋŅĐĩĐ´ĐžŅŅавĐģŅ ĐаĐŧ **ĐēĐžĐŊĐēŅĐĩŅĐŊŅĐĩ ŅĐĩŅĐĩĐŋŅŅ** ŅаСвŅŅŅŅваĐŊĐ¸Ņ ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ FastAPI.
+Đ ŅĐģĐĩĐ´ŅŅŅиŅ
ĐŗĐģаваŅ
Ņ Đ´Đ°Đŧ йОĐģĐĩĐĩ **ĐēĐžĐŊĐēŅĐĩŅĐŊŅĐĩ ŅĐĩŅĐĩĐŋŅŅ** ĐŋĐž ŅаСвŅŅŅŅваĐŊĐ¸Ņ ĐŋŅиĐģĐžĐļĐĩĐŊиК FastAPI.
-Đ ŅĐĩĐšŅĐ°Ņ Đ´Đ°Đ˛Đ°ĐšŅĐĩ ĐžŅŅаĐŊОвиĐŧŅŅ ĐŊа ваĐļĐŊŅŅ
**идĐĩŅŅ
ŅŅиŅ
ĐēĐžĐŊŅĐĩĐŋŅиК**. ĐŅи идĐĩи ĐŧĐžĐļĐŊĐž ŅаĐēĐļĐĩ ĐŋŅиĐŧĐĩĐŊиŅŅ Đ¸ Đē Đ´ŅŅĐŗĐ¸Đŧ ŅиĐŋаĐŧ вĐĩĐą-ĐŋŅиĐģĐžĐļĐĩĐŊиК. đĄ
+Đ ĐŋĐžĐēа даваКŅĐĩ ŅаСйĐĩŅŅĐŧ ваĐļĐŊŅĐĩ **идĐĩи**. ĐŅи ĐēĐžĐŊŅĐĩĐŋŅии ĐŋŅиĐŧĐĩĐŊиĐŧŅ Đ¸ Đē Đ´ŅŅĐŗĐ¸Đŧ ŅиĐŋаĐŧ вĐĩĐąâAPI. đĄ
-## ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ йОĐģĐĩĐĩ ĐąĐĩСОĐŋаŅĐŊĐžĐŗĐž ĐŋŅĐžŅĐžĐēĐžĐģа HTTPS
+## ĐĐĩСОĐŋаŅĐŊĐžŅŅŅ â HTTPS { #security-https }
-Đ [ĐŋŅĐĩĐ´ŅĐ´ŅŅĐĩĐš ĐŗĐģавĐĩ Ой HTTPS](https.md){.internal-link target=_blank} ĐŧŅ ŅаŅŅĐŧĐžŅŅĐĩĐģи, ĐēаĐē HTTPS ОйĐĩŅĐŋĐĩŅиваĐĩŅ ŅиŅŅОваĐŊиĐĩ Đ´ĐģŅ Đ˛Đ°ŅĐĩĐŗĐž API.
+Đ [ĐŋŅĐĩĐ´ŅĐ´ŅŅĐĩĐš ĐŗĐģавĐĩ ĐŋŅĐž HTTPS](https.md){.internal-link target=_blank} ĐŧŅ ŅаСОйŅаĐģиŅŅ, ĐēаĐē HTTPS ОйĐĩŅĐŋĐĩŅиваĐĩŅ ŅиŅŅОваĐŊиĐĩ Đ´ĐģŅ Đ˛Đ°ŅĐĩĐŗĐž API.
-ĐĸаĐēĐļĐĩ ĐŧŅ ĐˇĐ°ĐŧĐĩŅиĐģи, ŅŅĐž ОйŅŅĐŊĐž Đ´ĐģŅ ŅайОŅŅ Ņ HTTPS ваŅĐĩĐŧŅ ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ ĐŊŅĐļĐĩĐŊ **Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐš** ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ - **ĐŋŅĐžĐēŅи-ŅĐĩŅвĐĩŅ ĐˇĐ°Đ˛ĐĩŅŅĐĩĐŊĐ¸Ņ ŅайОŅŅ TLS**.
+ĐĸаĐēĐļĐĩ ĐŧŅ ŅвидĐĩĐģи, ŅŅĐž HTTPS ОйŅŅĐŊĐž ОйĐĩŅĐŋĐĩŅиваĐĩŅ ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ, **вĐŊĐĩŅĐŊиК** ĐŋĐž ĐžŅĐŊĐžŅĐĩĐŊĐ¸Ņ Đē ŅĐĩŅвĐĩŅŅ Đ˛Đ°ŅĐĩĐŗĐž ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ â **TLS Termination Proxy**.
-Đ ĐĩŅĐģи ĐŋŅĐžĐēŅи-ŅĐĩŅвĐĩŅ ĐŊĐĩ ŅĐŧĐĩĐĩŅ ŅаĐŧ **ОйĐŊОвĐģŅŅŅ ŅĐĩŅŅиŅиĐēаŅŅ HTTPS**, ŅĐž ĐŊŅĐļĐĩĐŊ ĐĩŅŅ ĐžĐ´Đ¸ĐŊ ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ Đ´ĐģŅ ŅŅĐžĐŗĐž Đ´ĐĩĐšŅŅвиŅ.
+Đ Đ´ĐžĐģĐļĐĩĐŊ ĐąŅŅŅ ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ, ĐžŅвĐĩŅаŅŅиК Са **ОйĐŊОвĐģĐĩĐŊиĐĩ HTTPSâŅĐĩŅŅиŅиĐēаŅОв** â ŅŅĐž ĐŧĐžĐļĐĩŅ ĐąŅŅŅ ŅĐžŅ ĐļĐĩ ŅаĐŧŅĐš ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ Đ¸Đģи ĐžŅĐ´ĐĩĐģŅĐŊŅĐš.
-### ĐŅиĐŧĐĩŅŅ Đ¸ĐŊŅŅŅŅĐŧĐĩĐŊŅОв Đ´ĐģŅ ŅайОŅŅ Ņ HTTPS
+### ĐŅиĐŧĐĩŅŅ Đ¸ĐŊŅŅŅŅĐŧĐĩĐŊŅОв Đ´ĐģŅ HTTPS { #example-tools-for-https }
-ĐĐžŅ ĐŊĐĩĐēĐžŅĐžŅŅĐĩ иĐŊŅŅŅŅĐŧĐĩĐŊŅŅ, ĐēĐžŅĐžŅŅĐĩ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐŋŅиĐŧĐĩĐŊŅŅŅ ĐēаĐē ĐŋŅĐžĐēŅи-ŅĐĩŅвĐĩŅŅ:
+ĐĐĩĐēĐžŅĐžŅŅĐĩ иĐŊŅŅŅŅĐŧĐĩĐŊŅŅ, ĐēĐžŅĐžŅŅĐĩ ĐŧĐžĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ ĐēаĐē TLS Termination Proxy:
* Traefik
- * ĐĄ авŅĐžĐŧаŅиŅĐĩŅĐēиĐŧ ОйĐŊОвĐģĐĩĐŊиĐĩĐŧ ŅĐĩŅŅиŅиĐēаŅОв â¨
+ * ĐвŅĐžĐŧаŅиŅĐĩŅĐēи ОйĐŊОвĐģŅĐĩŅ ŅĐĩŅŅиŅиĐēаŅŅ â¨
* Caddy
- * ĐĄ авŅĐžĐŧаŅиŅĐĩŅĐēиĐŧ ОйĐŊОвĐģĐĩĐŊиĐĩĐŧ ŅĐĩŅŅиŅиĐēаŅОв â¨
+ * ĐвŅĐžĐŧаŅиŅĐĩŅĐēи ОйĐŊОвĐģŅĐĩŅ ŅĐĩŅŅиŅиĐēаŅŅ â¨
* Nginx
- * ĐĄ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐŧ ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅĐžĐŧ ŅиĐŋа Certbot Đ´ĐģŅ ĐžĐąĐŊОвĐģĐĩĐŊĐ¸Ņ ŅĐĩŅŅиŅиĐēаŅОв
+ * ĐĄ вĐŊĐĩŅĐŊиĐŧ ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅĐžĐŧ (ĐŊаĐŋŅиĐŧĐĩŅ, Certbot) Đ´ĐģŅ ĐžĐąĐŊОвĐģĐĩĐŊĐ¸Ņ ŅĐĩŅŅиŅиĐēаŅОв
* HAProxy
- * ĐĄ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐŧ ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅĐžĐŧ ŅиĐŋа Certbot Đ´ĐģŅ ĐžĐąĐŊОвĐģĐĩĐŊĐ¸Ņ ŅĐĩŅŅиŅиĐēаŅОв
-* Kubernetes Ņ Ingress Controller ĐŋĐžŅ
ĐžĐļиĐŧ ĐŊа Nginx
- * ĐĄ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐŧ ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅĐžĐŧ ŅиĐŋа cert-manager Đ´ĐģŅ ĐžĐąĐŊОвĐģĐĩĐŊĐ¸Ņ ŅĐĩŅŅиŅиĐēаŅОв
-* ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ ŅŅĐģŅĐŗ ОйĐģаŅĐŊĐžĐŗĐž ĐŋŅОваКдĐĩŅа (ŅиŅаКŅĐĩ ĐŊиĐļĐĩ đ)
+ * ĐĄ вĐŊĐĩŅĐŊиĐŧ ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅĐžĐŧ (ĐŊаĐŋŅиĐŧĐĩŅ, Certbot) Đ´ĐģŅ ĐžĐąĐŊОвĐģĐĩĐŊĐ¸Ņ ŅĐĩŅŅиŅиĐēаŅОв
+* Kubernetes Ņ Ingress Controller (ĐŊаĐŋŅиĐŧĐĩŅ, Nginx)
+ * ĐĄ вĐŊĐĩŅĐŊиĐŧ ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅĐžĐŧ (ĐŊаĐŋŅиĐŧĐĩŅ, cert-manager) Đ´ĐģŅ ĐžĐąĐŊОвĐģĐĩĐŊĐ¸Ņ ŅĐĩŅŅиŅиĐēаŅОв
+* ĐĐąŅайаŅŅваĐĩŅŅŅ Đ˛ĐŊŅŅŅи ОйĐģаŅĐŊĐžĐŗĐž ĐŋŅОваКдĐĩŅа ĐēаĐē ŅаŅŅŅ ĐĩĐŗĐž ŅŅĐģŅĐŗ (ŅĐŧ. ĐŊиĐļĐĩ đ)
-Đ ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŧ ваŅиаĐŊŅĐĩ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ вОŅĐŋĐžĐģŅСОваŅŅŅŅ ŅŅĐģŅĐŗĐ°Đŧи **ОйĐģаŅĐŊĐžĐŗĐž ŅĐĩŅвиŅа**, ĐēĐžŅĐžŅŅĐš ŅĐ´ĐĩĐģаĐĩŅ ĐąĐžĐģŅŅŅŅ ŅаŅŅŅ ŅайОŅŅ, вĐēĐģŅŅĐ°Ņ ĐŊаŅŅŅОКĐēŅ HTTPS. ĐŅĐž ĐŧĐžĐļĐĩŅ ĐŊаĐģĐžĐļиŅŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ĐžĐŗŅаĐŊиŅĐĩĐŊĐ¸Ņ Đ¸Đģи ĐŋĐžŅŅĐĩйОваŅŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅŅ ĐŋĐģаŅŅ Đ¸ Ņ.Đŋ. ĐаŅĐž ĐаĐŧ ĐŊĐĩ ĐŋĐžĐŊадОйиŅŅŅ ŅаĐŧĐžŅŅĐžŅŅĐĩĐģŅĐŊĐž СаĐŊиĐŧаŅŅŅŅ ĐŊаŅŅŅОКĐēаĐŧи ĐŋŅĐžĐēŅи-ŅĐĩŅвĐĩŅа.
+ĐŅŅĐŗĐžĐš ваŅиаĐŊŅ â иŅĐŋĐžĐģŅСОваŅŅ **ОйĐģаŅĐŊŅĐš ŅĐĩŅвиŅ**, ĐēĐžŅĐžŅŅĐš вОСŅĐŧŅŅ ĐŊа ŅĐĩĐąŅ ĐąĐžĐģŅŅĐĩ СадаŅ, вĐēĐģŅŅĐ°Ņ ĐŊаŅŅŅОКĐēŅ HTTPS. ĐĸаĐŧ ĐŧĐžĐŗŅŅ ĐąŅŅŅ ĐžĐŗŅаĐŊиŅĐĩĐŊĐ¸Ņ Đ¸Đģи Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊĐ°Ņ ŅŅОиĐŧĐžŅŅŅ Đ¸ Ņ.Đŋ., ĐŊĐž в ŅаĐēĐžĐŧ ŅĐģŅŅаĐĩ ваĐŧ ĐŊĐĩ ĐŋŅидŅŅŅŅ ŅаĐŧиĐŧ ĐŊаŅŅŅаиваŅŅ TLS Termination Proxy.
-РдаĐģŅĐŊĐĩĐšŅĐĩĐŧ Ņ ĐŋĐžĐēаĐļŅ ĐаĐŧ ĐŊĐĩĐēĐžŅĐžŅŅĐĩ ĐēĐžĐŊĐēŅĐĩŅĐŊŅĐĩ ĐŋŅиĐŧĐĩŅŅ Đ¸Ņ
ĐŋŅиĐŧĐĩĐŊĐĩĐŊиŅ.
+Đ ŅĐģĐĩĐ´ŅŅŅиŅ
ĐŗĐģаваŅ
Ņ ĐŋĐžĐēаĐļŅ ĐēĐžĐŊĐēŅĐĩŅĐŊŅĐĩ ĐŋŅиĐŧĐĩŅŅ.
---
-ĐĄĐģĐĩĐ´ŅŅŅиĐĩ ĐēĐžĐŊŅĐĩĐŋŅии ŅаŅŅĐŧаŅŅиваŅŅ ĐŋŅиĐŧĐĩĐŊĐĩĐŊиĐĩ ĐŋŅĐžĐŗŅаĐŧĐŧŅ, СаĐŋŅŅĐēаŅŅĐĩĐš ĐĐ°Ņ API (ŅаĐēОК ĐēаĐē Uvicorn).
+ĐаĐģĐĩĐĩ ŅаŅŅĐŧĐžŅŅиĐŧ ĐēĐžĐŊŅĐĩĐŋŅии, ŅвŅСаĐŊĐŊŅĐĩ Ņ ĐŋŅĐžĐŗŅаĐŧĐŧОК, ĐēĐžŅĐžŅĐ°Ņ ĐˇĐ°ĐŋŅŅĐēаĐĩŅ Đ˛Đ°Ņ ŅĐĩаĐģŅĐŊŅĐš API (ĐŊаĐŋŅиĐŧĐĩŅ, Uvicorn).
-## ĐŅĐžĐŗŅаĐŧĐŧа и ĐŋŅĐžŅĐĩŅŅ
+## ĐŅĐžĐŗŅаĐŧĐŧа и ĐŋŅĐžŅĐĩŅŅ { #program-and-process }
-ĐŅ ŅаŅŅĐž ĐąŅĐ´ĐĩĐŧ вŅŅŅĐĩŅаŅŅ ŅĐģОва **ĐŋŅĐžŅĐĩŅŅ** и **ĐŋŅĐžĐŗŅаĐŧĐŧа**, ĐŋĐžŅĐžĐŧŅ ŅĐģĐĩĐ´ŅĐĩŅ ŅŅŅĐŊиŅŅ ĐžŅĐģиŅĐ¸Ņ ĐŧĐĩĐļĐ´Ņ ĐŊиĐŧи.
+ĐŅ ŅаŅŅĐž ĐąŅĐ´ĐĩĐŧ ĐŗĐžĐ˛ĐžŅиŅŅ Đž ŅайОŅаŅŅĐĩĐŧ "**ĐŋŅĐžŅĐĩŅŅĐĩ**", ĐŋĐžŅŅĐžĐŧŅ ĐŋĐžĐģĐĩСĐŊĐž ŅŅŅĐēĐž ĐŋĐžĐŊиĐŧаŅŅ, ŅŅĐž ŅŅĐž СĐŊаŅĐ¸Ņ Đ¸ ŅĐĩĐŧ ĐžŅĐģиŅаĐĩŅŅŅ ĐžŅ "**ĐŋŅĐžĐŗŅаĐŧĐŧŅ**".
-### ЧŅĐž ŅаĐēĐžĐĩ ĐŋŅĐžĐŗŅаĐŧĐŧа
+### ЧŅĐž ŅаĐēĐžĐĩ ĐŋŅĐžĐŗŅаĐŧĐŧа { #what-is-a-program }
-ĐĸĐĩŅĐŧиĐŊĐžĐŧ **ĐŋŅĐžĐŗŅаĐŧĐŧа** ОйŅŅĐŊĐž ĐžĐŋиŅŅваŅŅ ĐŧĐŊĐžĐļĐĩŅŅвО вĐĩŅĐĩĐš:
+ĐĄĐģОвОĐŧ **ĐŋŅĐžĐŗŅаĐŧĐŧа** ОйŅŅĐŊĐž ĐŊаСŅваŅŅ ŅаСĐŊŅĐĩ вĐĩŅи:
-* **ĐОд**, ĐēĐžŅĐžŅŅĐš Đ˛Ņ ĐŊаĐŋиŅаĐģи, в ĐŊаŅĐĩĐŧ ŅĐģŅŅаĐĩ **Python-ŅаКĐģŅ**.
-* **ФаКĐģ**, ĐēĐžŅĐžŅŅĐš ĐŧĐžĐļĐĩŅ ĐąŅŅŅ **иŅĐŋĐžĐģĐŊĐĩĐŊ** ĐžĐŋĐĩŅаŅиОĐŊĐŊОК ŅиŅŅĐĩĐŧОК, ĐŊаĐŋŅиĐŧĐĩŅ `python`, `python.exe` иĐģи `uvicorn`.
-* ĐĐžĐŊĐēŅĐĩŅĐŊĐ°Ņ ĐŋŅĐžĐŗŅаĐŧĐŧа, **СаĐŋŅŅĐĩĐŊĐŊаŅ** ĐžĐŋĐĩŅаŅиОĐŊĐŊОК ŅиŅŅĐĩĐŧОК и иŅĐŋĐžĐģŅСŅŅŅĐ°Ņ ŅĐĩĐŊŅŅаĐģŅĐŊŅĐš ĐŋŅĐžŅĐĩŅŅĐžŅ Đ¸ ĐŋаĐŧŅŅŅ. Đ ŅаĐēĐžĐŧ ŅĐģŅŅаĐĩ ŅŅĐž ŅаĐēĐļĐĩ ĐŊаСŅваĐĩŅŅŅ **ĐŋŅĐžŅĐĩŅŅ**.
+* **ĐОд**, ĐēĐžŅĐžŅŅĐš Đ˛Ņ ĐŋиŅĐĩŅĐĩ, ŅĐž ĐĩŅŅŅ **PythonâŅаКĐģŅ**.
+* **ФаКĐģ**, ĐēĐžŅĐžŅŅĐš ĐŧĐžĐļĐĩŅ ĐąŅŅŅ **СаĐŋŅŅĐĩĐŊ** ĐžĐŋĐĩŅаŅиОĐŊĐŊОК ŅиŅŅĐĩĐŧОК, ĐŊаĐŋŅиĐŧĐĩŅ: `python`, `python.exe` иĐģи `uvicorn`.
+* ĐĐžĐŊĐēŅĐĩŅĐŊŅŅ ĐŋŅĐžĐŗŅаĐŧĐŧŅ Đ˛ ĐŧĐžĐŧĐĩĐŊŅ, ĐēĐžĐŗĐ´Đ° ĐžĐŊа **ŅайОŅаĐĩŅ** в ĐžĐŋĐĩŅаŅиОĐŊĐŊОК ŅиŅŅĐĩĐŧĐĩ, иŅĐŋĐžĐģŅСŅŅ CPU и ĐŋаĐŧŅŅŅ. ĐŅĐž ŅаĐēĐļĐĩ ĐŊаСŅваŅŅ **ĐŋŅĐžŅĐĩŅŅĐžĐŧ**.
-### ЧŅĐž ŅаĐēĐžĐĩ ĐŋŅĐžŅĐĩŅŅ
+### ЧŅĐž ŅаĐēĐžĐĩ ĐŋŅĐžŅĐĩŅŅ { #what-is-a-process }
-ĐĸĐĩŅĐŧиĐŊ **ĐŋŅĐžŅĐĩŅŅ** иĐŧĐĩĐĩŅ ĐąĐžĐģĐĩĐĩ ŅСĐēĐžĐĩ ŅĐžĐģĐēОваĐŊиĐĩ, ĐŋОдŅаСŅĐŧĐĩĐ˛Đ°Ņ ŅŅĐž-ŅĐž, СаĐŋŅŅĐĩĐŊĐŊĐžĐĩ ĐžĐŋĐĩŅаŅиОĐŊĐŊОК ŅиŅŅĐĩĐŧОК (ĐēаĐē в ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŧ ĐŋŅĐŊĐēŅĐĩ иС вŅŅĐĩŅŅĐžŅŅĐĩĐŗĐž айСаŅа):
+ĐĄĐģОвО **ĐŋŅĐžŅĐĩŅŅ** ОйŅŅĐŊĐž иŅĐŋĐžĐģŅСŅŅŅ ĐąĐžĐģĐĩĐĩ ĐēĐžĐŊĐēŅĐĩŅĐŊĐž â ŅĐžĐģŅĐēĐž Đ´ĐģŅ ŅĐžĐŗĐž, ŅŅĐž ŅĐĩаĐģŅĐŊĐž вŅĐŋĐžĐģĐŊŅĐĩŅŅŅ Đ˛ ĐžĐŋĐĩŅаŅиОĐŊĐŊОК ŅиŅŅĐĩĐŧĐĩ (ĐēаĐē в ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŧ ĐŋŅĐŊĐēŅĐĩ вŅŅĐĩ):
-* ĐĐžĐŊĐēŅĐĩŅĐŊĐ°Ņ ĐŋŅĐžĐŗŅаĐŧĐŧа, **СаĐŋŅŅĐĩĐŊĐŊаŅ** ĐžĐŋĐĩŅаŅиОĐŊĐŊОК ŅиŅŅĐĩĐŧОК.
- * ĐŅĐž ĐŊĐĩ иĐŧĐĩĐĩŅ ĐžŅĐŊĐžŅĐĩĐŊĐ¸Ņ Đē ĐēаĐēĐžĐŧŅ-ĐģийО ŅаКĐģŅ Đ¸Đģи ĐēОдŅ, ĐŊĐž ĐŊĐĩŅŅĐž **ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐŊĐžĐĩ**, ŅĐŋŅавĐģŅĐĩĐŧĐžĐĩ и **вŅĐŋĐžĐģĐŊŅĐĩĐŧĐžĐĩ** ĐžĐŋĐĩŅаŅиОĐŊĐŊОК ŅиŅŅĐĩĐŧОК.
-* ĐŅĐąĐ°Ņ ĐŋŅĐžĐŗŅаĐŧĐŧа, ĐģŅйОК ĐēОд, **ĐŧĐžĐŗŅŅ Đ´ĐĩĐģаŅŅ ŅŅĐž-ŅĐž** ŅĐžĐģŅĐēĐž ĐēĐžĐŗĐ´Đ° ĐžĐŊи **вŅĐŋĐžĐģĐŊŅŅŅŅŅ**. ĐĸĐž ĐĩŅŅŅ, ĐēĐžĐŗĐ´Đ° ŅвĐģŅŅŅŅŅ **ŅайОŅаŅŅиĐŧ ĐŋŅĐžŅĐĩŅŅĐžĐŧ**.
-* ĐŅĐžŅĐĩŅŅ ĐŧĐžĐļĐĩŅ ĐąŅŅŅ **ĐŋŅĐĩŅваĐŊ** (иĐģи "ŅйиŅ") ĐаĐŧи иĐģи ваŅĐĩĐš ĐžĐŋĐĩŅаŅиОĐŊĐŊОК ŅиŅŅĐĩĐŧОК. Đ ŅĐĩСŅĐģŅŅаŅĐĩ ŅĐĩĐŗĐž ĐžĐŊ ĐŋĐĩŅĐĩŅŅаĐŊĐĩŅ Đ¸ŅĐŋĐžĐģĐŊŅŅŅŅŅ Đ¸ **ĐŊĐĩ ĐąŅĐ´ĐĩŅ ĐŋŅОдОĐģĐļаŅŅ Đ´ĐĩĐģаŅŅ ŅŅĐž-ĐģийО**.
-* ĐаĐļĐ´ĐžĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ, ĐēĐžŅĐžŅĐžĐĩ Đ˛Ņ ĐˇĐ°ĐŋŅŅŅиĐģи ĐŊа ŅвОŅĐŧ ĐēĐžĐŧĐŋŅŅŅĐĩŅĐĩ, ĐēаĐļĐ´Đ°Ņ ĐŋŅĐžĐŗŅаĐŧĐŧа, ĐēаĐļĐ´ĐžĐĩ "ĐžĐēĐŊĐž" СаĐŋŅŅĐēаĐĩŅ ĐēаĐēОК-ŅĐž ĐŋŅĐžŅĐĩŅŅ. РОйŅŅĐŊĐž ĐŊа вĐēĐģŅŅĐĩĐŊĐŊĐžĐŧ ĐēĐžĐŧĐŋŅŅŅĐĩŅĐĩ **ОдĐŊОвŅĐĩĐŧĐĩĐŊĐŊĐž** СаĐŋŅŅĐĩĐŊĐž ĐŧĐŊĐžĐļĐĩŅŅвО ĐŋŅĐžŅĐĩŅŅОв.
-* Đ **ОдĐŊа ĐŋŅĐžĐŗŅаĐŧĐŧа** ĐŧĐžĐļĐĩŅ ĐˇĐ°ĐŋŅŅŅиŅŅ **ĐŊĐĩŅĐēĐžĐģŅĐēĐž ĐŋаŅаĐģĐģĐĩĐģŅĐŊŅŅ
ĐŋŅĐžŅĐĩŅŅОв**.
+* ĐĐžĐŊĐēŅĐĩŅĐŊĐ°Ņ ĐŋŅĐžĐŗŅаĐŧĐŧа в ĐŧĐžĐŧĐĩĐŊŅ, ĐēĐžĐŗĐ´Đ° ĐžĐŊа **СаĐŋŅŅĐĩĐŊа** в ĐžĐŋĐĩŅаŅиОĐŊĐŊОК ŅиŅŅĐĩĐŧĐĩ.
+ * Đ ĐĩŅŅ ĐŊĐĩ Đž ŅаКĐģĐĩ и ĐŊĐĩ Đž ĐēОдĐĩ, а **ĐēĐžĐŊĐēŅĐĩŅĐŊĐž** Đž ŅĐžĐŧ, ŅŅĐž **иŅĐŋĐžĐģĐŊŅĐĩŅŅŅ** и ŅĐŋŅавĐģŅĐĩŅŅŅ ĐžĐŋĐĩŅаŅиОĐŊĐŊОК ŅиŅŅĐĩĐŧОК.
+* ĐŅĐąĐ°Ņ ĐŋŅĐžĐŗŅаĐŧĐŧа, ĐģŅйОК ĐēОд **ĐŧĐžĐŗŅŅ ŅŅĐžâŅĐž Đ´ĐĩĐģаŅŅ** ŅĐžĐģŅĐēĐž ĐēĐžĐŗĐ´Đ° **иŅĐŋĐžĐģĐŊŅŅŅŅŅ**, ŅĐž ĐĩŅŅŅ ĐēĐžĐŗĐ´Đ° ĐĩŅŅŅ **ŅайОŅаŅŅиК ĐŋŅĐžŅĐĩŅŅ**.
+* ĐŅĐžŅĐĩŅŅ ĐŧĐžĐļĐŊĐž **СавĐĩŅŅиŅŅ** (иĐģи ÂĢŅйиŅŅÂģ) ваĐŧи иĐģи ĐžĐŋĐĩŅаŅиОĐŊĐŊОК ŅиŅŅĐĩĐŧОК. Đ ŅŅĐžŅ ĐŧĐžĐŧĐĩĐŊŅ ĐžĐŊ ĐŋĐĩŅĐĩŅŅаŅŅ Đ˛ŅĐŋĐžĐģĐŊŅŅŅŅŅ Đ¸ **йОĐģŅŅĐĩ ĐŊиŅĐĩĐŗĐž Đ´ĐĩĐģаŅŅ ĐŊĐĩ ĐŧĐžĐļĐĩŅ**.
+* ĐŖ ĐēаĐļĐ´ĐžĐŗĐž СаĐŋŅŅĐĩĐŊĐŊĐžĐŗĐž ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ ĐŊа ваŅĐĩĐŧ ĐēĐžĐŧĐŋŅŅŅĐĩŅĐĩ ĐĩŅŅŅ ŅвОК ĐŋŅĐžŅĐĩŅŅ; Ņ ĐēаĐļдОК ĐŋŅĐžĐŗŅаĐŧĐŧŅ, Ņ ĐēаĐļĐ´ĐžĐŗĐž ĐžĐēĐŊа и Ņ.Đ´. ĐĐąŅŅĐŊĐž ОдĐŊОвŅĐĩĐŧĐĩĐŊĐŊĐž **ŅайОŅаĐĩŅ ĐŧĐŊĐžĐŗĐž ĐŋŅĐžŅĐĩŅŅОв**, ĐŋĐžĐēа ĐēĐžĐŧĐŋŅŅŅĐĩŅ Đ˛ĐēĐģŅŅŅĐŊ.
+* ĐĐžĐŗŅŅ **ОдĐŊОвŅĐĩĐŧĐĩĐŊĐŊĐž** ŅайОŅаŅŅ **ĐŊĐĩŅĐēĐžĐģŅĐēĐž ĐŋŅĐžŅĐĩŅŅОв** ОдĐŊОК и ŅОК ĐļĐĩ **ĐŋŅĐžĐŗŅаĐŧĐŧŅ**.
-ĐŅĐģи Đ˛Ņ ĐˇĐ°ĐŗĐģŅĐŊĐĩŅĐĩ в "диŅĐŋĐĩŅŅĐĩŅ ĐˇĐ°Đ´Đ°Ņ" иĐģи "ŅиŅŅĐĩĐŧĐŊŅĐš ĐŧĐžĐŊиŅĐžŅ" (иĐģи аĐŊаĐģĐžĐŗĐ¸ŅĐŊŅĐĩ иĐŊŅŅŅŅĐŧĐĩĐŊŅŅ) ваŅĐĩĐš ĐžĐŋĐĩŅаŅиОĐŊĐŊОК ŅиŅŅĐĩĐŧŅ, ŅĐž ŅвидиŅĐĩ ĐŧĐŊĐžĐļĐĩŅŅвО ŅайОŅаŅŅиŅ
ĐŋŅĐžŅĐĩŅŅОв.
+ĐŅĐģи Đ˛Ņ ĐŋĐžŅĐŧĐžŅŅиŅĐĩ ÂĢдиŅĐŋĐĩŅŅĐĩŅ ĐˇĐ°Đ´Đ°ŅÂģ иĐģи ÂĢŅиŅŅĐĩĐŧĐŊŅĐš ĐŧĐžĐŊиŅĐžŅÂģ (иĐģи аĐŊаĐģĐžĐŗĐ¸ŅĐŊŅĐĩ иĐŊŅŅŅŅĐŧĐĩĐŊŅŅ) в ваŅĐĩĐš ĐžĐŋĐĩŅаŅиОĐŊĐŊОК ŅиŅŅĐĩĐŧĐĩ, ŅĐž ŅвидиŅĐĩ ĐŧĐŊĐžĐļĐĩŅŅвО ŅайОŅаŅŅиŅ
ĐŋŅĐžŅĐĩŅŅОв.
-ĐĐŋĐžĐģĐŊĐĩ вĐĩŅĐžŅŅĐŊĐž, ŅŅĐž Đ˛Ņ ŅвидиŅĐĩ ĐŊĐĩŅĐēĐžĐģŅĐēĐž ĐŋŅĐžŅĐĩŅŅОв Ņ ĐžĐ´ĐŊиĐŧ и ŅĐĩĐŧ ĐļĐĩ ĐŊаСваĐŊиĐĩĐŧ ĐąŅаŅСĐĩŅĐŊОК ĐŋŅĐžĐŗŅаĐŧĐŧŅ (Firefox, Chrome, Edge и Ņ. Đ.). ĐĐąŅŅĐŊĐž ĐąŅаŅСĐĩŅŅ ĐˇĐ°ĐŋŅŅĐēаŅŅ ĐžĐ´Đ¸ĐŊ ĐŋŅĐžŅĐĩŅŅ ĐŊа вĐēĐģадĐēŅ Đ¸ вдОйавОĐē ĐŊĐĩĐēĐžŅĐžŅŅĐĩ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ĐŋŅĐžŅĐĩŅŅŅ.
+ĐаĐŋŅиĐŧĐĩŅ, вŅ, ŅĐēĐžŅĐĩĐĩ вŅĐĩĐŗĐž, ŅвидиŅĐĩ ĐŊĐĩŅĐēĐžĐģŅĐēĐž ĐŋŅĐžŅĐĩŅŅОв ОдĐŊĐžĐŗĐž и ŅĐžĐŗĐž ĐļĐĩ ĐąŅаŅСĐĩŅа (Firefox, Chrome, Edge и Ņ.Đ´.). ĐĐąŅŅĐŊĐž ĐąŅаŅСĐĩŅŅ ĐˇĐ°ĐŋŅŅĐēаŅŅ ĐžĐ´Đ¸ĐŊ ĐŋŅĐžŅĐĩŅŅ ĐŊа вĐēĐģадĐēŅ ĐŋĐģŅŅ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐĩ ĐŋŅĐžŅĐĩŅŅŅ.
---
-ĐĸĐĩĐŋĐĩŅŅ, ĐēĐžĐŗĐ´Đ° ĐŊаĐŧ иСвĐĩŅŅĐŊа ŅаСĐŊиŅа ĐŧĐĩĐļĐ´Ņ **ĐŋŅĐžŅĐĩŅŅĐžĐŧ** и **ĐŋŅĐžĐŗŅаĐŧĐŧОК**, даваКŅĐĩ ĐŋŅОдОĐģĐļиĐŧ ОйŅŅĐļĐ´ĐĩĐŊиĐĩ ŅаСвŅŅŅŅваĐŊиŅ.
+ĐĸĐĩĐŋĐĩŅŅ, ĐēĐžĐŗĐ´Đ° ĐŧŅ ĐŋĐžĐŊиĐŧаĐĩĐŧ ŅаСĐŊиŅŅ ĐŧĐĩĐļĐ´Ņ **ĐŋŅĐžŅĐĩŅŅĐžĐŧ** и **ĐŋŅĐžĐŗŅаĐŧĐŧОК**, ĐŋŅОдОĐģĐļиĐŧ ŅĐ°ĐˇĐŗĐžĐ˛ĐžŅ Đž ŅаСвŅŅŅŅваĐŊиŅŅ
.
-## ĐаŅŅŅОКĐēи СаĐŋŅŅĐēа ĐŋŅиĐģĐžĐļĐĩĐŊиŅ
+## ĐаĐŋŅŅĐē ĐŋŅи ŅŅаŅŅĐĩ { #running-on-startup }
-РйОĐģŅŅиĐŊŅŅвĐĩ ŅĐģŅŅаĐĩв ĐēĐžĐŗĐ´Đ° Đ˛Ņ ŅОСдаŅŅĐĩ вĐĩĐą-ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ, ŅĐž ĐļĐĩĐģаĐĩŅĐĩ, ŅŅОй ĐžĐŊĐž **ŅайОŅаĐģĐž ĐŋĐžŅŅĐžŅĐŊĐŊĐž** и ĐŊĐĩĐŋŅĐĩŅŅвĐŊĐž, ĐŋŅĐĩĐ´ĐžŅŅавĐģŅŅ ĐēĐģиĐĩĐŊŅаĐŧ Đ´ĐžŅŅŅĐŋ в ĐģŅйОĐĩ вŅĐĩĐŧŅ. ĐĨĐžŅŅ Đ¸ĐŊĐžĐŗĐ´Đ° Ņ Đ˛Đ°Ņ ĐŧĐžĐŗŅŅ ĐąŅŅŅ ĐŋŅиŅиĐŊŅ, ŅŅОй ĐžĐŊĐž СаĐŋŅŅĐēаĐģĐžŅŅ ŅĐžĐģŅĐēĐž ĐŋŅи ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐŊŅŅ
ŅŅĐģОвиŅŅ
.
+РйОĐģŅŅиĐŊŅŅвĐĩ ŅĐģŅŅаĐĩв, ŅĐžĐˇĐ´Đ°Đ˛Đ°Ņ Đ˛ĐĩĐąâAPI, Đ˛Ņ Ņ
ĐžŅиŅĐĩ, ŅŅĐžĐąŅ ĐžĐŊ **ŅайОŅаĐģ ĐŋĐžŅŅĐžŅĐŊĐŊĐž**, ĐąĐĩС ĐŋĐĩŅĐĩŅŅвОв, ŅŅĐžĐąŅ ĐēĐģиĐĩĐŊŅŅ Đ˛ŅĐĩĐŗĐ´Đ° ĐŧĐžĐŗĐģи Đē ĐŊĐĩĐŧŅ ĐžĐąŅаŅиŅŅŅŅ. РаСвĐĩ ŅŅĐž Ņ Đ˛Đ°Ņ ĐĩŅŅŅ ĐžŅОйŅĐĩ ĐŋŅиŅиĐŊŅ ĐˇĐ°ĐŋŅŅĐēаŅŅ ĐĩĐŗĐž ŅĐžĐģŅĐēĐž ĐŋŅи ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐŊŅŅ
ŅŅĐģОвиŅŅ
, ĐŊĐž ОйŅŅĐŊĐž Đ˛Ņ Ņ
ĐžŅиŅĐĩ, ŅŅĐžĐąŅ ĐžĐŊ ĐąŅĐģ ĐŋĐžŅŅĐžŅĐŊĐŊĐž СаĐŋŅŅĐĩĐŊ и **Đ´ĐžŅŅŅĐŋĐĩĐŊ**.
-### ĐŖĐ´Đ°ĐģŅĐŊĐŊŅĐš ŅĐĩŅвĐĩŅ
+### Đа ŅдаĐģŅĐŊĐŊĐžĐŧ ŅĐĩŅвĐĩŅĐĩ { #in-a-remote-server }
-ĐĐžĐŗĐ´Đ° Đ˛Ņ ĐŊаŅŅŅаиваĐĩŅĐĩ ŅдаĐģŅĐŊĐŊŅĐš ŅĐĩŅвĐĩŅ (ОйĐģаŅĐŊŅĐš ŅĐĩŅвĐĩŅ, виŅŅŅаĐģŅĐŊŅŅ ĐŧаŅиĐŊŅ Đ¸ Ņ.Đŋ.), ŅаĐŧĐžĐĩ ĐŋŅĐžŅŅĐžĐĩ, ŅŅĐž ĐŧĐžĐļĐŊĐž ŅĐ´ĐĩĐģаŅŅ, СаĐŋŅŅŅиŅŅ Uvicorn (иĐģи ĐĩĐŗĐž аĐŊаĐģĐžĐŗ) вŅŅŅĐŊŅŅ, ĐēаĐē Đ˛Ņ Đ´ĐĩĐģаĐĩŅĐĩ ĐŋŅи ĐģĐžĐēаĐģŅĐŊОК ŅаСŅайОŅĐēĐĩ.
+ĐĐžĐŗĐ´Đ° Đ˛Ņ ĐŊаŅŅŅаиваĐĩŅĐĩ ŅдаĐģŅĐŊĐŊŅĐš ŅĐĩŅвĐĩŅ (ОйĐģаŅĐŊŅĐš ŅĐĩŅвĐĩŅ, виŅŅŅаĐģŅĐŊŅŅ ĐŧаŅиĐŊŅ Đ¸ Ņ.Đŋ.), ŅаĐŧŅĐš ĐŋŅĐžŅŅОК ваŅиаĐŊŅ â вŅŅŅĐŊŅŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ `fastapi run` (ĐžĐŊ иŅĐŋĐžĐģŅСŅĐĩŅ Uvicorn) иĐģи ŅŅĐžâŅĐž ĐŋĐžŅ
ĐžĐļĐĩĐĩ, ĐēаĐē Đ˛Ņ Đ´ĐĩĐģаĐĩŅĐĩ ĐŋŅи ĐģĐžĐēаĐģŅĐŊОК ŅаСŅайОŅĐēĐĩ.
-ĐŅĐž ŅайОŅиК ŅĐŋĐžŅОй и ĐžĐŊ ĐŋĐžĐģĐĩСĐĩĐŊ **вО вŅĐĩĐŧŅ ŅаСŅайОŅĐēи**.
+ĐŅĐž ĐąŅĐ´ĐĩŅ ŅайОŅаŅŅ Đ¸ ĐŋĐžĐģĐĩСĐŊĐž **вО вŅĐĩĐŧŅ ŅаСŅайОŅĐēи**.
-ĐĐž ĐĩŅĐģи Đ˛Ņ ĐŋĐžŅĐĩŅŅĐĩŅĐĩ ŅĐžĐĩдиĐŊĐĩĐŊиĐĩ Ņ ŅĐĩŅвĐĩŅĐžĐŧ, ŅĐž ĐŊĐĩ ŅĐŧĐžĐļĐĩŅĐĩ ĐžŅŅĐģĐĩĐļиваŅŅ - ŅайОŅаĐĩŅ Đģи вŅŅ ĐĩŅŅ **СаĐŋŅŅĐĩĐŊĐŊŅĐš ĐаĐŧи ĐŋŅĐžŅĐĩŅŅ**.
+ĐĐž ĐĩŅĐģи ŅĐžĐĩдиĐŊĐĩĐŊиĐĩ Ņ ŅĐĩŅвĐĩŅĐžĐŧ ĐŋŅĐĩŅвŅŅŅŅ, **СаĐŋŅŅĐĩĐŊĐŊŅĐš ĐŋŅĐžŅĐĩŅŅ**, ŅĐēĐžŅĐĩĐĩ вŅĐĩĐŗĐž, СавĐĩŅŅиŅŅŅ.
-Đ ĐĩŅĐģи ŅĐĩŅвĐĩŅ ĐŋĐĩŅĐĩĐˇĐ°ĐŗŅŅСиŅŅŅ (ĐŊаĐŋŅиĐŧĐĩŅ, ĐŋĐžŅĐģĐĩ ОйĐŊОвĐģĐĩĐŊĐ¸Ņ Đ¸Đģи ĐēаĐēиŅ
-ŅĐž Đ´ĐĩĐšŅŅвиК ОйĐģаŅĐŊĐžĐŗĐž ĐŋŅОваКдĐĩŅа), Đ˛Ņ ŅĐēĐžŅĐĩĐĩ вŅĐĩĐŗĐž **ŅŅĐžĐŗĐž ĐŊĐĩ СаĐŧĐĩŅиŅĐĩ**, ŅŅĐžĐąŅ ŅĐŊОва СаĐŋŅŅŅиŅŅ ĐŋŅĐžŅĐĩŅŅ Đ˛ŅŅŅĐŊŅŅ. ĐŅĐģĐĩĐ´ŅŅвиĐĩ ŅŅĐžĐŗĐž ĐĐ°Ņ API ĐžŅŅаĐŊĐĩŅŅŅ ĐŧŅŅŅвŅĐŧ. đą
+Đ ĐĩŅĐģи ŅĐĩŅвĐĩŅ ĐŋĐĩŅĐĩĐˇĐ°ĐŗŅŅСиŅŅŅ (ĐŊаĐŋŅиĐŧĐĩŅ, ĐŋĐžŅĐģĐĩ ОйĐŊОвĐģĐĩĐŊиК иĐģи ĐŧĐ¸ĐŗŅаŅиК Ņ ĐžĐąĐģаŅĐŊĐžĐŗĐž ĐŋŅОваКдĐĩŅа), вŅ, вĐĩŅĐžŅŅĐŊĐž, **даĐļĐĩ ĐŊĐĩ СаĐŧĐĩŅиŅĐĩ ŅŅĐžĐŗĐž**. ĐСâСа ŅŅĐžĐŗĐž Đ˛Ņ ĐŊĐĩ ŅСĐŊаĐĩŅĐĩ, ŅŅĐž ĐŊŅĐļĐŊĐž вŅŅŅĐŊŅŅ ĐŋĐĩŅĐĩСаĐŋŅŅŅиŅŅ ĐŋŅĐžŅĐĩŅŅ â и Đ˛Đ°Ņ API ĐŋŅĐžŅŅĐž ĐąŅĐ´ĐĩŅ ÂĢĐŧŅŅŅвÂģ. đą
-### ĐвŅĐžĐŧаŅиŅĐĩŅĐēиК СаĐŋŅŅĐē ĐŋŅĐžĐŗŅаĐŧĐŧ
+### ĐвŅĐžĐŧаŅиŅĐĩŅĐēиК СаĐŋŅŅĐē ĐŋŅи ŅŅаŅŅĐĩ { #run-automatically-on-startup }
-ĐĐĩŅĐžŅŅĐŊĐž Đ˛Ņ ĐˇĐ°Ņ
ĐžŅиŅĐĩ, ŅŅОй ĐаŅа ŅĐĩŅвĐĩŅĐŊĐ°Ņ ĐŋŅĐžĐŗŅаĐŧĐŧа (ŅаĐēаŅ, ĐēаĐē Uvicorn) ŅŅаŅŅОваĐģа авŅĐžĐŧаŅиŅĐĩŅĐēи ĐŋŅи вĐēĐģŅŅĐĩĐŊии ŅĐĩŅвĐĩŅа, ĐąĐĩС **ŅĐĩĐģОвĐĩŅĐĩŅĐēĐžĐŗĐž вĐŧĐĩŅаŅĐĩĐģŅŅŅва** и вŅĐĩĐŗĐ´Đ° ĐŧĐžĐŗĐģа ŅĐŋŅавĐģŅŅŅ ĐаŅиĐŧ API (ŅаĐē ĐēаĐē Uvicorn СаĐŋŅŅĐēаĐĩŅ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ FastAPI).
+ĐаĐē ĐŋŅавиĐģĐž, Đ˛Ņ ĐˇĐ°Ņ
ĐžŅиŅĐĩ, ŅŅĐžĐąŅ ŅĐĩŅвĐĩŅĐŊĐ°Ņ ĐŋŅĐžĐŗŅаĐŧĐŧа (ĐŊаĐŋŅиĐŧĐĩŅ, Uvicorn) СаĐŋŅŅĐēаĐģаŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēи ĐŋŅи ŅŅаŅŅĐĩ ŅĐĩŅвĐĩŅа и ĐąĐĩС **ŅŅаŅŅĐ¸Ņ ŅĐĩĐģОвĐĩĐēа**, ŅŅĐžĐąŅ Đ˛ŅĐĩĐŗĐ´Đ° ĐąŅĐģ ĐŋŅĐžŅĐĩŅŅ, СаĐŋŅŅĐĩĐŊĐŊŅĐš Ņ Đ˛Đ°ŅиĐŧ API (ĐŊаĐŋŅиĐŧĐĩŅ, Uvicorn, СаĐŋŅŅĐēаŅŅиК ваŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ FastAPI).
-### ĐŅĐ´ĐĩĐģŅĐŊĐ°Ņ ĐŋŅĐžĐŗŅаĐŧĐŧа
+### ĐŅĐ´ĐĩĐģŅĐŊĐ°Ņ ĐŋŅĐžĐŗŅаĐŧĐŧа { #separate-program }
-ĐĐģŅ ŅŅĐžĐŗĐž Ņ ĐžĐąŅŅĐŊĐž иŅĐŋĐžĐģŅСŅŅŅ ĐžŅĐ´ĐĩĐģŅĐŊŅŅ ĐŋŅĐžĐŗŅаĐŧĐŧŅ, ĐēĐžŅĐžŅĐ°Ņ ŅĐģĐĩĐ´Đ¸Ņ ĐˇĐ° ŅĐĩĐŧ, ŅŅĐžĐąŅ ĐаŅи ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ ĐˇĐ°ĐŋŅŅĐēаĐģиŅŅ ĐŋŅи вĐēĐģŅŅĐĩĐŊии ŅĐĩŅвĐĩŅа. ĐĸаĐēОК ĐŋОдŅ
Од ĐŗĐ°ŅаĐŊŅиŅŅĐĩŅ, ŅŅĐž Đ´ŅŅĐŗĐ¸Đĩ ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅŅ Đ¸Đģи ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ ŅаĐēĐļĐĩ ĐąŅĐ´ŅŅ ĐˇĐ°ĐŋŅŅĐĩĐŊŅ, ĐŊаĐŋŅиĐŧĐĩŅ, йаСа даĐŊĐŊŅŅ
+ЧŅĐžĐąŅ ŅŅĐžĐŗĐž дОйиŅŅŅŅ, ОйŅŅĐŊĐž иŅĐŋĐžĐģŅСŅŅŅ **ĐžŅĐ´ĐĩĐģŅĐŊŅŅ ĐŋŅĐžĐŗŅаĐŧĐŧŅ**, ĐēĐžŅĐžŅĐ°Ņ ĐŗĐ°ŅаĐŊŅиŅŅĐĩŅ ĐˇĐ°ĐŋŅŅĐē ваŅĐĩĐŗĐž ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ ĐŋŅи ŅŅаŅŅĐĩ. ĐĐž ĐŧĐŊĐžĐŗĐ¸Ņ
ŅĐģŅŅаŅŅ
ĐžĐŊа ŅаĐēĐļĐĩ СаĐŋŅŅĐēаĐĩŅ Đ¸ Đ´ŅŅĐŗĐ¸Đĩ ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅŅ/ĐŋŅиĐģĐžĐļĐĩĐŊиŅ, ĐŊаĐŋŅиĐŧĐĩŅ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊĐŊŅŅ
.
-### ĐŅиĐŧĐĩŅŅ Đ¸ĐŊŅŅŅŅĐŧĐĩĐŊŅОв, ŅĐŋŅавĐģŅŅŅиŅ
СаĐŋŅŅĐēĐžĐŧ ĐŋŅĐžĐŗŅаĐŧĐŧ
+### ĐŅиĐŧĐĩŅŅ Đ¸ĐŊŅŅŅŅĐŧĐĩĐŊŅОв Đ´ĐģŅ ĐˇĐ°ĐŋŅŅĐēа ĐŋŅи ŅŅаŅŅĐĩ { #example-tools-to-run-at-startup }
-ĐĐžŅ ĐŊĐĩŅĐēĐžĐģŅĐēĐž ĐŋŅиĐŧĐĩŅОв, ĐēĐžŅĐžŅŅĐĩ ĐŧĐžĐŗŅŅ ŅĐŋŅавиŅŅŅŅ Ņ ŅаĐēОК СадаŅĐĩĐš:
+ĐŅиĐŧĐĩŅŅ Đ¸ĐŊŅŅŅŅĐŧĐĩĐŊŅОв, ĐēĐžŅĐžŅŅĐĩ ĐŧĐžĐŗŅŅ Ņ ŅŅиĐŧ ŅĐŋŅавиŅŅŅŅ:
* Docker
* Kubernetes
* Docker Compose
-* Docker в ŅĐĩĐļиĐŧĐĩ Swarm
+* Docker в ŅĐĩĐļиĐŧĐĩ Swarm (Swarm Mode)
* Systemd
* Supervisor
-* ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ ŅŅĐģŅĐŗ ОйĐģаŅĐŊĐžĐŗĐž ĐŋŅОваКдĐĩŅа
+* ĐĐąŅайОŅĐēа вĐŊŅŅŅи ОйĐģаŅĐŊĐžĐŗĐž ĐŋŅОваКдĐĩŅа ĐēаĐē ŅаŅŅŅ ĐĩĐŗĐž ŅŅĐģŅĐŗ
* ĐŅĐžŅиĐĩ...
-Đ¯ ĐŋĐžĐēаĐļŅ ĐаĐŧ ĐŊĐĩĐēĐžŅĐžŅŅĐĩ ĐŋŅиĐŧĐĩŅŅ Đ¸Ņ
иŅĐŋĐžĐģŅСОваĐŊĐ¸Ņ Đ˛ ŅĐģĐĩĐ´ŅŅŅиŅ
ĐŗĐģаваŅ
.
+ĐĐžĐģĐĩĐĩ ĐēĐžĐŊĐēŅĐĩŅĐŊŅĐĩ ĐŋŅиĐŧĐĩŅŅ ĐąŅĐ´ŅŅ Đ˛ ŅĐģĐĩĐ´ŅŅŅиŅ
ĐŗĐģаваŅ
.
-## ĐĐĩŅĐĩСаĐŋŅŅĐē
+## ĐĐĩŅĐĩСаĐŋŅŅĐēи { #restarts }
-ĐŅ, вĐĩŅĐžŅŅĐŊĐž, ŅаĐēĐļĐĩ СаŅ
ĐžŅиŅĐĩ, ŅŅОй ваŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ **ĐŋĐĩŅĐĩСаĐŋŅŅĐēаĐģĐžŅŅ**, ĐĩŅĐģи в ĐŊŅĐŧ ĐŋŅОиСОŅŅĐģ ŅйОК.
+ĐОдОйĐŊĐž ŅĐžĐŧŅ ĐēаĐē Đ˛Ņ ĐžĐąĐĩŅĐŋĐĩŅиваĐĩŅĐĩ СаĐŋŅŅĐē ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ ĐŋŅи ŅŅаŅŅĐĩ, вŅ, вĐĩŅĐžŅŅĐŊĐž, СаŅ
ĐžŅиŅĐĩ ОйĐĩŅĐŋĐĩŅиŅŅ ĐĩĐŗĐž **ĐŋĐĩŅĐĩСаĐŋŅŅĐē** ĐŋĐžŅĐģĐĩ ŅйОĐĩв.
-### ĐŅ ĐžŅийаĐĩĐŧŅŅ
+### ĐŅ ĐžŅийаĐĩĐŧŅŅ { #we-make-mistakes }
-ĐŅĐĩ ĐģŅди ŅОвĐĩŅŅаŅŅ **ĐžŅийĐēи**. ĐŅĐžĐŗŅаĐŧĐŧĐŊĐžĐĩ ОйĐĩŅĐŋĐĩŅĐĩĐŊиĐĩ ĐŋĐžŅŅи *вŅĐĩĐŗĐ´Đ°* ŅОдĐĩŅĐļĐ¸Ņ **ĐąĐ°ĐŗĐ¸** ŅĐŋŅŅŅавŅиĐĩŅŅ Đ˛ ŅаСĐŊŅŅ
ĐŧĐĩŅŅаŅ
. đ
+ĐŅ, ĐģŅди, ĐŋĐžŅŅĐžŅĐŊĐŊĐž ŅОвĐĩŅŅаĐĩĐŧ **ĐžŅийĐēи**. Đ ĐŋŅĐžĐŗŅаĐŧĐŧĐŊĐžĐŧ ОйĐĩŅĐŋĐĩŅĐĩĐŊии ĐŋĐžŅŅи вŅĐĩĐŗĐ´Đ° ĐĩŅŅŅ **ĐąĐ°ĐŗĐ¸**, ŅĐēŅŅŅŅĐĩ в ŅаСĐŊŅŅ
ĐŧĐĩŅŅаŅ
. đ
-Đ ĐŧŅ, ĐąŅĐ´ŅŅи ŅаСŅайОŅŅиĐēаĐŧи, ĐŋŅОдОĐģĐļаĐĩĐŧ ŅĐģŅŅŅаŅŅ ĐēОд, ĐēĐžĐŗĐ´Đ° ОйĐŊаŅŅĐļиваĐĩĐŧ в ĐŊŅĐŧ ĐąĐ°ĐŗĐ¸ иĐģи дОйавĐģŅĐĩĐŧ ĐŊОвŅĐš ŅŅĐŊĐēŅиОĐŊаĐģ (вОСĐŧĐžĐļĐŊĐž, дОйавĐģŅŅ ĐŋŅи ŅŅĐžĐŧ ĐąĐ°ĐŗĐ¸ đ
).
+Đ ĐŧŅ, ĐēаĐē ŅаСŅайОŅŅиĐēи, ĐŋŅОдОĐģĐļаĐĩĐŧ ŅĐģŅŅŅаŅŅ ĐēОд â ĐŊаŅ
ОдиĐŧ ĐąĐ°ĐŗĐ¸ и дОйавĐģŅĐĩĐŧ ĐŊОвŅĐĩ вОСĐŧĐžĐļĐŊĐžŅŅи (иĐŊĐžĐŗĐ´Đ° дОйавĐģŅŅ ĐŊОвŅĐĩ ĐąĐ°ĐŗĐ¸ đ
).
-### ĐĐĩйОĐģŅŅиĐĩ ĐžŅийĐēи ОйŅайаŅŅваŅŅŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēи
+### ĐĐĩйОĐģŅŅиĐĩ ĐžŅийĐēи ОйŅайаŅŅваŅŅŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēи { #small-errors-automatically-handled }
-ĐĐžĐŗĐ´Đ° Đ˛Ņ ŅОСдаŅŅĐĩ ŅвОи API ĐŊа ĐžŅĐŊОвĐĩ FastAPI и Đ´ĐžĐŋŅŅĐēаĐĩŅĐĩ в ĐēОдĐĩ ĐžŅийĐēŅ, ŅĐž FastAPI ОйŅŅĐŊĐž ĐžŅŅаĐŊĐžĐ˛Đ¸Ņ ĐĩŅ ŅаŅĐŋŅĐžŅŅŅаĐŊĐĩĐŊиĐĩ вĐŊŅŅŅи ОдĐŊĐžĐŗĐž СаĐŋŅĐžŅа, ĐŋŅи ОйŅайОŅĐēĐĩ ĐēĐžŅĐžŅĐžĐŗĐž ĐžĐŊа вОСĐŊиĐēĐģа. đĄ
+ĐĄĐžĐˇĐ´Đ°Đ˛Đ°Ņ Đ˛ĐĩĐąâAPI Ņ FastAPI, ĐĩŅĐģи в ĐŊаŅĐĩĐŧ ĐēОдĐĩ вОСĐŊиĐēаĐĩŅ ĐžŅийĐēа, FastAPI ОйŅŅĐŊĐž ÂĢĐģĐžĐēаĐģиСŅĐĩŅÂģ ĐĩŅ Đ˛ ĐŋŅĐĩĐ´ĐĩĐģаŅ
ОдĐŊĐžĐŗĐž СаĐŋŅĐžŅа, ĐēĐžŅĐžŅŅĐš ŅŅŅ ĐžŅийĐēŅ Đ˛ŅСваĐģ. đĄ
-ĐĐģиĐĩĐŊŅ ĐŋĐžĐģŅŅĐ¸Ņ ĐžŅийĐēŅ **500 Internal Server Error** в ĐžŅвĐĩŅ ĐŊа ŅвОК СаĐŋŅĐžŅ, ĐŊĐž ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐŊĐĩ ŅĐģĐžĐŧаĐĩŅŅŅ Đ¸ ĐąŅĐ´ĐĩŅ ĐŋŅОдОĐģĐļаŅŅ ŅайОŅаŅŅ Ņ ĐŋĐžŅĐģĐĩĐ´ŅŅŅиĐŧи СаĐŋŅĐžŅаĐŧи.
+ĐĐģиĐĩĐŊŅ ĐŋĐžĐģŅŅĐ¸Ņ **500 Internal Server Error** Đ´ĐģŅ ŅŅĐžĐŗĐž СаĐŋŅĐžŅа, ĐŊĐž ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐŋŅОдОĐģĐļĐ¸Ņ ŅайОŅаŅŅ Đ´ĐģŅ ĐŋĐžŅĐģĐĩĐ´ŅŅŅиŅ
СаĐŋŅĐžŅОв, а ĐŊĐĩ ÂĢŅĐŋадŅŅÂģ ŅĐĩĐģиĐēĐžĐŧ.
-### ĐĐžĐģŅŅиĐĩ ĐžŅийĐēи - ĐадĐĩĐŊиĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиК
+### ĐĐžĐģŅŅиĐĩ ĐžŅийĐēи â ĐŋадĐĩĐŊĐ¸Ņ { #bigger-errors-crashes }
-ĐĸĐĩĐŧ ĐŊĐĩ ĐŧĐĩĐŊĐĩĐĩ, ĐŧĐžĐļĐĩŅ ŅĐģŅŅиŅŅŅŅ ŅаĐē, ŅŅĐž ĐžŅийĐēа вŅСОвĐĩŅ **ŅйОК вŅĐĩĐŗĐž ĐŋŅиĐģĐžĐļĐĩĐŊиŅ** иĐģи даĐļĐĩ ŅйОК в Uvicorn, а ŅĐž и в ŅаĐŧĐžĐŧ Python. đĨ
+ĐĸĐĩĐŧ ĐŊĐĩ ĐŧĐĩĐŊĐĩĐĩ вОСĐŧĐžĐļĐŊŅ ŅĐģŅŅаи, ĐēĐžĐŗĐ´Đ° ĐēОд **ŅĐžĐŊŅĐĩŅ Đ˛ŅŅ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ**, ĐŋŅĐ¸Đ˛ĐžĐ´Ņ Đē ŅĐąĐžŅ Uvicorn и Python. đĨ
-ĐĐž ĐŧŅ Đ˛ŅŅ ĐĩŅŅ Ņ
ĐžŅиĐŧ, ŅŅĐžĐąŅ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ **ĐŋŅОдОĐģĐļаĐģĐž ŅайОŅаŅŅ** ĐŊĐĩŅĐŧĐžŅŅŅ ĐŊа ŅŅŅ ĐĩдиĐŊŅŅвĐĩĐŊĐŊŅŅ ĐžŅийĐēŅ, ОйŅайаŅŅваŅ, ĐēаĐē ĐŧиĐŊиĐŧŅĐŧ, СаĐŋŅĐžŅŅ Đē *ĐžĐŋĐĩŅаŅиŅĐŧ ĐŋŅŅи* ĐŊĐĩ иĐŧĐĩŅŅиĐŧ ĐžŅийОĐē.
+РвŅ, ŅĐēĐžŅĐĩĐĩ вŅĐĩĐŗĐž, ĐŊĐĩ СаŅ
ĐžŅиŅĐĩ, ŅŅĐžĐąŅ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐžŅŅаваĐģĐžŅŅ ÂĢĐŧŅŅŅвŅĐŧÂģ иСâСа ĐžŅийĐēи в ОдĐŊĐžĐŧ ĐŧĐĩŅŅĐĩ â Đ˛Ņ ĐˇĐ°Ņ
ĐžŅиŅĐĩ, ŅŅĐžĐąŅ ĐžĐŊĐž **ĐŋŅОдОĐģĐļаĐģĐž ŅайОŅаŅŅ** Ņ
ĐžŅŅ ĐąŅ Đ´ĐģŅ *ĐžĐŋĐĩŅаŅиК ĐŋŅŅи*, ĐēĐžŅĐžŅŅĐĩ ĐŊĐĩ ŅĐģĐžĐŧаĐŊŅ.
-### ĐĐĩŅĐĩСаĐŋŅŅĐē ĐŋĐžŅĐģĐĩ ĐŋадĐĩĐŊиŅ
+### ĐĐĩŅĐĩСаĐŋŅŅĐē ĐŋĐžŅĐģĐĩ ĐŋадĐĩĐŊĐ¸Ņ { #restart-after-crash }
-ĐĐģŅ ŅĐģŅŅаĐĩв, ĐēĐžĐŗĐ´Đ° ĐžŅийĐēи ĐŋŅивОдŅŅ Đē ŅĐąĐžŅ Đ˛ СаĐŋŅŅĐĩĐŊĐŊĐžĐŧ **ĐŋŅĐžŅĐĩŅŅĐĩ**, ĐаĐŧ ĐŋĐžĐŊадОйиŅŅŅ Đ´ĐžĐąĐ°Đ˛Đ¸ŅŅ ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ, ĐēĐžŅĐžŅŅĐš **ĐŋĐĩŅĐĩСаĐŋŅŅŅиŅ** ĐŋŅĐžŅĐĩŅŅ Ņ
ĐžŅŅ ĐąŅ ĐŋаŅŅ ŅаС...
+Đ ŅĐģŅŅаŅŅ
Đ´ĐĩĐšŅŅвиŅĐĩĐģŅĐŊĐž ŅĐĩŅŅŅСĐŊŅŅ
ĐžŅийОĐē, ĐēĐžŅĐžŅŅĐĩ ŅĐžĐŊŅŅŅ ŅайОŅаŅŅиК **ĐŋŅĐžŅĐĩŅŅ**, ваĐŧ ĐŋĐžĐŊадОйиŅŅŅ Đ˛ĐŊĐĩŅĐŊиК ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ, ĐžŅвĐĩŅаŅŅиК Са **ĐŋĐĩŅĐĩСаĐŋŅŅĐē** ĐŋŅĐžŅĐĩŅŅа, ĐēаĐē ĐŧиĐŊиĐŧŅĐŧ ĐŋаŅŅ ŅаС...
-/// tip | ĐаĐŧĐĩŅĐēа
+/// tip | ХОвĐĩŅ
-... ĐŅĐģи ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐŋадаĐĩŅ ŅŅĐ°ĐˇŅ ĐļĐĩ ĐŋĐžŅĐģĐĩ СаĐŋŅŅĐēа, вĐĩŅĐžŅŅĐŊĐž ĐąĐĩŅĐŋĐžĐģĐĩСĐŊĐž ĐĩĐŗĐž ĐąĐĩŅĐēĐžĐŊĐĩŅĐŊĐž ĐŋĐĩŅĐĩСаĐŋŅŅĐēаŅŅ. ĐĐž ĐŋĐžĐģĐ°ĐŗĐ°Ņ, Đ˛Ņ ĐˇĐ°ĐŧĐĩŅиŅĐĩ ŅаĐēĐžĐĩ ĐŋОвĐĩĐ´ĐĩĐŊиĐĩ вО вŅĐĩĐŧŅ ŅаСŅайОŅĐēи иĐģи, ĐŋĐž ĐēŅаКĐŊĐĩĐš ĐŧĐĩŅĐĩ, ŅŅĐ°ĐˇŅ ĐŋĐžŅĐģĐĩ ŅаСвŅŅŅŅваĐŊиŅ.
+...ĐĨĐžŅŅ ĐĩŅĐģи ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ **ĐŋадаĐĩŅ ŅŅĐ°ĐˇŅ ĐļĐĩ**, вĐĩŅĐžŅŅĐŊĐž, ĐŊĐĩŅ ŅĐŧŅŅĐģа ĐŋĐĩŅĐĩСаĐŋŅŅĐēаŅŅ ĐĩĐŗĐž ĐąĐĩŅĐēĐžĐŊĐĩŅĐŊĐž. ĐĐž ŅаĐēиĐĩ ŅĐģŅŅаи вŅ, ŅĐēĐžŅĐĩĐĩ вŅĐĩĐŗĐž, СаĐŧĐĩŅиŅĐĩ вО вŅĐĩĐŧŅ ŅаСŅайОŅĐēи иĐģи ĐēаĐē ĐŧиĐŊиĐŧŅĐŧ ŅŅĐ°ĐˇŅ ĐŋĐžŅĐģĐĩ ŅаСвŅŅŅŅваĐŊиŅ.
-ĐĸаĐē ŅŅĐž даваКŅĐĩ ŅĐžŅŅĐĩĐ´ĐžŅĐžŅиĐŧŅŅ ĐŊа ĐēĐžĐŊĐēŅĐĩŅĐŊŅŅ
ŅĐģŅŅаŅŅ
, ĐēĐžĐŗĐ´Đ° ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐŧĐžĐļĐĩŅ ĐŋĐžĐģĐŊĐžŅŅŅŅ Đ˛ŅĐšŅи иС ŅŅŅĐžŅ, ĐŊĐž вŅŅ ĐĩŅŅ ĐĩŅŅŅ ŅĐŧŅŅĐģ ĐĩĐŗĐž СаĐŋŅŅŅиŅŅ ĐˇĐ°ĐŊОвО.
+ĐаваКŅĐĩ ŅĐžŅŅĐĩĐ´ĐžŅĐžŅиĐŧŅŅ ĐŊа ĐžŅĐŊОвĐŊŅŅ
ŅŅĐĩĐŊаŅиŅŅ
, ĐēĐžĐŗĐ´Đ° в ĐēаĐēиŅ
âŅĐž ĐēĐžĐŊĐēŅĐĩŅĐŊŅŅ
ŅиŅŅаŅиŅŅ
**в ĐąŅĐ´ŅŅĐĩĐŧ** ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐŧĐžĐļĐĩŅ ĐŋадаŅŅ ŅĐĩĐģиĐēĐžĐŧ, и ĐŋŅи ŅŅĐžĐŧ иĐŧĐĩĐĩŅ ŅĐŧŅŅĐģ ĐĩĐŗĐž ĐŋĐĩŅĐĩСаĐŋŅŅĐēаŅŅ.
///
-ĐОСĐŧĐžĐļĐŊĐž Đ˛Ņ ĐˇĐ°Ņ
ĐžŅиŅĐĩ, ŅŅОй ĐąŅĐģ ĐŊĐĩĐēиК **вĐŊĐĩŅĐŊиК ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ**, ĐžŅвĐĩŅŅŅвĐĩĐŊĐŊŅĐš Са ĐŋĐĩŅĐĩСаĐŋŅŅĐē ваŅĐĩĐŗĐž ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ Đ´Đ°ĐļĐĩ ĐĩŅĐģи ŅĐļĐĩ ĐŊĐĩ ŅайОŅаĐĩŅ Uvicorn иĐģи Python. ĐĸĐž ĐĩŅŅŅ ĐŊиŅĐĩĐŗĐž иС ŅĐžĐŗĐž, ŅŅĐž ĐŊаĐŋиŅаĐŊĐž в ваŅĐĩĐŧ ĐēОдĐĩ вĐŊŅŅŅи ĐŋŅиĐģĐžĐļĐĩĐŊиŅ, ĐŊĐĩ ĐŧĐžĐļĐĩŅ ĐąŅŅŅ Đ˛ŅĐŋĐžĐģĐŊĐĩĐŊĐž в ĐŋŅиĐŊŅиĐŋĐĩ.
+ĐĄĐēĐžŅĐĩĐĩ вŅĐĩĐŗĐž, Đ˛Ņ ĐˇĐ°Ņ
ĐžŅиŅĐĩ, ŅŅĐžĐąŅ ĐŋĐĩŅĐĩСаĐŋŅŅĐēĐžĐŧ ваŅĐĩĐŗĐž ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ ĐˇĐ°ĐŊиĐŧаĐģŅŅ **вĐŊĐĩŅĐŊиК ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ**, ĐŋĐžŅĐžĐŧŅ ŅŅĐž Đē ŅĐžĐŧŅ ĐŧĐžĐŧĐĩĐŊŅŅ Uvicorn и Python ŅĐļĐĩ ŅĐŋаĐģи, и вĐŊŅŅŅи ŅĐžĐŗĐž ĐļĐĩ ĐēОда ваŅĐĩĐŗĐž ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ ŅĐ´ĐĩĐģаŅŅ ŅĐļĐĩ ĐŊиŅĐĩĐŗĐž ĐŊĐĩĐģŅСŅ.
-### ĐŅиĐŧĐĩŅŅ Đ¸ĐŊŅŅŅŅĐŧĐĩĐŊŅОв Đ´ĐģŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēĐžĐŗĐž ĐŋĐĩŅĐĩСаĐŋŅŅĐēа
+### ĐŅиĐŧĐĩŅŅ Đ¸ĐŊŅŅŅŅĐŧĐĩĐŊŅОв Đ´ĐģŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēĐžĐŗĐž ĐŋĐĩŅĐĩСаĐŋŅŅĐēа { #example-tools-to-restart-automatically }
-РйОĐģŅŅиĐŊŅŅвĐĩ ŅĐģŅŅаĐĩв иĐŊŅŅŅŅĐŧĐĩĐŊŅŅ **СаĐŋŅŅĐēаŅŅиĐĩ ĐŋŅĐžĐŗŅаĐŧĐŧŅ ĐŋŅи ŅŅаŅŅĐĩ ŅĐĩŅвĐĩŅа** ŅĐŧĐĩŅŅ **ĐŋĐĩŅĐĩСаĐŋŅŅĐēаŅŅ** ŅŅи ĐŋŅĐžĐŗŅаĐŧĐŧŅ.
+РйОĐģŅŅиĐŊŅŅвĐĩ ŅĐģŅŅаĐĩв ŅĐžŅ ĐļĐĩ иĐŊŅŅŅŅĐŧĐĩĐŊŅ, ĐēĐžŅĐžŅŅĐš **СаĐŋŅŅĐēаĐĩŅ ĐŋŅĐžĐŗŅаĐŧĐŧŅ ĐŋŅи ŅŅаŅŅĐĩ**, ŅĐŧĐĩĐĩŅ ĐžĐąŅайаŅŅваŅŅ Đ¸ авŅĐžĐŧаŅиŅĐĩŅĐēиĐĩ **ĐŋĐĩŅĐĩСаĐŋŅŅĐēи**.
-Đ ĐēаŅĐĩŅŅвĐĩ ĐŋŅиĐŧĐĩŅа ĐŧĐžĐļĐŊĐž вСŅŅŅ ŅĐĩ ĐļĐĩ:
+ĐаĐŋŅиĐŧĐĩŅ, ŅŅĐž ĐŧĐžĐļĐĩŅ ĐąŅŅŅ:
* Docker
* Kubernetes
* Docker Compose
-* Docker в ŅĐĩĐļиĐŧĐĩ Swarm
+* Docker в ŅĐĩĐļиĐŧĐĩ Swarm (Swarm Mode)
* Systemd
* Supervisor
-* ĐŅĐŋĐžĐģŅСОваĐŊиĐĩ ŅŅĐģŅĐŗ ОйĐģаŅĐŊĐžĐŗĐž ĐŋŅОваКдĐĩŅа
+* ĐĐąŅайОŅĐēа вĐŊŅŅŅи ОйĐģаŅĐŊĐžĐŗĐž ĐŋŅОваКдĐĩŅа ĐēаĐē ŅаŅŅŅ ĐĩĐŗĐž ŅŅĐģŅĐŗ
* ĐŅĐžŅиĐĩ...
-## ĐаĐŋŅŅĐē ĐŊĐĩŅĐēĐžĐģŅĐēиŅ
ŅĐēСĐĩĐŧĐŋĐģŅŅОв ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ (Đ ĐĩĐŋĐģиĐēаŅиŅ) - ĐŅĐžŅĐĩŅŅŅ Đ¸ ĐŋаĐŧŅŅŅ
+## Đ ĐĩĐŋĐģиĐēаŅĐ¸Ņ â ĐŋŅĐžŅĐĩŅŅŅ Đ¸ ĐŋаĐŧŅŅŅ { #replication-processes-and-memory }
-ĐŅиĐģĐžĐļĐĩĐŊиĐĩ FastAPI, ŅĐŋŅавĐģŅĐĩĐŧĐžĐĩ ŅĐĩŅвĐĩŅĐŊОК ĐŋŅĐžĐŗŅаĐŧĐŧОК (ŅаĐēОК ĐēаĐē Uvicorn), СаĐŋŅŅĐēаĐĩŅŅŅ ĐēаĐē **ОдиĐŊ ĐŋŅĐžŅĐĩŅŅ** и ĐŧĐžĐļĐĩŅ ĐžĐąŅĐģŅĐļиваŅŅ ĐŧĐŊĐžĐļĐĩŅŅвО ĐēĐģиĐĩĐŊŅОв ОдĐŊОвŅĐĩĐŧĐĩĐŊĐŊĐž.
+Đ ĐŋŅиĐģĐžĐļĐĩĐŊии FastAPI, иŅĐŋĐžĐģŅСŅŅ ŅĐĩŅвĐĩŅĐŊŅŅ ĐŋŅĐžĐŗŅаĐŧĐŧŅ (ĐŊаĐŋŅиĐŧĐĩŅ, ĐēĐžĐŧаĐŊĐ´Ņ `fastapi`, ĐēĐžŅĐžŅĐ°Ņ ĐˇĐ°ĐŋŅŅĐēаĐĩŅ Uvicorn), СаĐŋŅŅĐē в **ОдĐŊĐžĐŧ ĐŋŅĐžŅĐĩŅŅĐĩ** ŅĐļĐĩ ĐŋОСвОĐģŅĐĩŅ ĐžĐąŅĐģŅĐļиваŅŅ ĐŊĐĩŅĐēĐžĐģŅĐēиŅ
ĐēĐģиĐĩĐŊŅОв ОдĐŊОвŅĐĩĐŧĐĩĐŊĐŊĐž.
-ĐĐž ŅаŅŅĐž ĐаĐŧ ĐŧĐžĐļĐĩŅ ĐŋĐžĐŊадОйиŅŅŅŅ ĐŊĐĩŅĐēĐžĐģŅĐēĐž ОдĐŊОвŅĐĩĐŧĐĩĐŊĐŊĐž ŅайОŅаŅŅиŅ
ОдиĐŊаĐēОвŅŅ
ĐŋŅĐžŅĐĩŅŅОв.
+ĐĐž вО ĐŧĐŊĐžĐŗĐ¸Ņ
ŅĐģŅŅаŅŅ
Đ˛Ņ ĐˇĐ°Ņ
ĐžŅиŅĐĩ ОдĐŊОвŅĐĩĐŧĐĩĐŊĐŊĐž СаĐŋŅŅŅиŅŅ ĐŊĐĩŅĐēĐžĐģŅĐēĐž ĐŋŅĐžŅĐĩŅŅОвâвОŅĐēĐĩŅОв.
-### ĐĐŊĐžĐļĐĩŅŅвО ĐŋŅĐžŅĐĩŅŅОв - ĐĐžŅĐēĐĩŅŅ (Workers)
+### ĐĐĩŅĐēĐžĐģŅĐēĐž ĐŋŅĐžŅĐĩŅŅОв â ĐĐžŅĐēĐĩŅŅ { #multiple-processes-workers }
-ĐŅĐģи ĐēĐžĐģиŅĐĩŅŅвО ĐаŅиŅ
ĐēĐģиĐĩĐŊŅОв йОĐģŅŅĐĩ, ŅĐĩĐŧ ĐŧĐžĐļĐĩŅ ĐžĐąŅĐģŅĐļиŅŅ ĐžĐ´Đ¸ĐŊ ĐŋŅĐžŅĐĩŅŅ (Đ´ĐžĐŋŅŅŅиĐŧ, ŅŅĐž виŅŅŅаĐģŅĐŊĐ°Ņ ĐŧаŅиĐŊа ĐŊĐĩ ŅĐģиŅĐēĐžĐŧ ĐŧĐžŅĐŊаŅ), ĐŊĐž ĐŋŅи ŅŅĐžĐŧ ĐаĐŧ Đ´ĐžŅŅŅĐŋĐŊĐž **ĐŊĐĩŅĐēĐžĐģŅĐēĐž ŅĐ´ĐĩŅ ĐŋŅĐžŅĐĩŅŅĐžŅа**, ŅĐž Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ СаĐŋŅŅŅиŅŅ **ĐŊĐĩŅĐēĐžĐģŅĐēĐž ĐŋŅĐžŅĐĩŅŅОв** ОдĐŊĐžĐŗĐž и ŅĐžĐŗĐž ĐļĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ ĐŋаŅаĐģĐģĐĩĐģŅĐŊĐž и ŅаŅĐŋŅĐĩĐ´ĐĩĐģиŅŅ ĐˇĐ°ĐŋŅĐžŅŅ ĐŧĐĩĐļĐ´Ņ ŅŅиĐŧи ĐŋŅĐžŅĐĩŅŅаĐŧи.
+ĐŅĐģи ĐēĐģиĐĩĐŊŅОв йОĐģŅŅĐĩ, ŅĐĩĐŧ ŅĐŋĐžŅОйĐĩĐŊ ОйŅĐģŅĐļиŅŅ ĐžĐ´Đ¸ĐŊ ĐŋŅĐžŅĐĩŅŅ (ĐŊаĐŋŅиĐŧĐĩŅ, ĐĩŅĐģи виŅŅŅаĐģŅĐŊĐ°Ņ ĐŧаŅиĐŊа ĐŊĐĩ ŅĐģиŅĐēĐžĐŧ ĐŧĐžŅĐŊаŅ), и ĐŊа ŅĐĩŅвĐĩŅĐĩ ĐĩŅŅŅ **ĐŊĐĩŅĐēĐžĐģŅĐēĐž ŅĐ´ĐĩŅ CPU**, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ СаĐŋŅŅŅиŅŅ **ĐŊĐĩŅĐēĐžĐģŅĐēĐž ĐŋŅĐžŅĐĩŅŅОв** ОдĐŊĐžĐŗĐž и ŅĐžĐŗĐž ĐļĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ ĐŋаŅаĐģĐģĐĩĐģŅĐŊĐž и ŅаŅĐŋŅĐĩĐ´ĐĩĐģŅŅŅ ĐˇĐ°ĐŋŅĐžŅŅ ĐŧĐĩĐļĐ´Ņ ĐŊиĐŧи.
-**ĐĐĩŅĐēĐžĐģŅĐēĐž СаĐŋŅŅĐĩĐŊĐŊŅŅ
ĐŋŅĐžŅĐĩŅŅОв** ОдĐŊОК и ŅОК ĐļĐĩ API-ĐŋŅĐžĐŗŅаĐŧĐŧŅ ŅаŅŅĐž ĐŊаСŅваŅŅ **вОŅĐēĐĩŅаĐŧи**.
+ĐĐžĐŗĐ´Đ° Đ˛Ņ ĐˇĐ°ĐŋŅŅĐēаĐĩŅĐĩ **ĐŊĐĩŅĐēĐžĐģŅĐēĐž ĐŋŅĐžŅĐĩŅŅОв** ОдĐŊОК и ŅОК ĐļĐĩ ĐŋŅĐžĐŗŅаĐŧĐŧŅ API, иŅ
ОйŅŅĐŊĐž ĐŊаСŅваŅŅ **вОŅĐēĐĩŅаĐŧи**.
-### ĐŅĐžŅĐĩŅŅŅ Đ¸ ĐŋĐžŅŅŅĖ
+### ĐŅĐžŅĐĩŅŅŅâвОŅĐēĐĩŅŅ Đ¸ ĐŋĐžŅŅŅ { #worker-processes-and-ports }
-ĐĐžĐŧĐŊиŅĐĩ Đģи ĐŅ, ĐēаĐē ĐŊа ŅŅŅаĐŊиŅĐĩ [ĐĐą HTTPS](https.md){.internal-link target=_blank} ĐŧŅ ĐžĐąŅŅĐļдаĐģи, ŅŅĐž ĐŊа ŅĐĩŅвĐĩŅĐĩ ŅĐžĐģŅĐēĐž ОдиĐŊ ĐŋŅĐžŅĐĩŅŅ ĐŧĐžĐļĐĩŅ ŅĐģŅŅаŅŅ ĐžĐ´ĐŊŅ ĐēĐžĐŧйиĐŊаŅĐ¸Ņ IP-адŅĐĩŅа и ĐŋĐžŅŅа?
+ĐĐžĐŧĐŊиŅĐĩ иС ŅаСдĐĩĐģа [ĐĐą HTTPS](https.md){.internal-link target=_blank}, ŅŅĐž ĐŊа ŅĐĩŅвĐĩŅĐĩ ŅĐžĐģŅĐēĐž ОдиĐŊ ĐŋŅĐžŅĐĩŅŅ ĐŧĐžĐļĐĩŅ ŅĐģŅŅаŅŅ ĐēĐžĐŊĐēŅĐĩŅĐŊŅŅ ĐēĐžĐŧйиĐŊаŅĐ¸Ņ ĐŋĐžŅŅа и IPâадŅĐĩŅа?
-ĐĄ ŅĐĩŅ
ĐŋĐžŅ ĐŊиŅĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊиĐģĐžŅŅ.
+ĐŅĐž ĐŋĐžâĐŋŅĐĩĐļĐŊĐĩĐŧŅ ŅаĐē.
-ХООŅвĐĩŅŅŅвĐĩĐŊĐŊĐž, ŅŅĐžĐąŅ Đ¸ĐŧĐĩŅŅ Đ˛ĐžĐˇĐŧĐžĐļĐŊĐžŅŅŅ ŅайОŅаŅŅ Ņ **ĐŊĐĩŅĐēĐžĐģŅĐēиĐŧи ĐŋŅĐžŅĐĩŅŅаĐŧи** ОдĐŊОвŅĐĩĐŧĐĩĐŊĐŊĐž, Đ´ĐžĐģĐļĐĩĐŊ ĐąŅŅŅ **ОдиĐŊ ĐŋŅĐžŅĐĩŅŅ, ĐŋŅĐžŅĐģŅŅиваŅŅиК ĐŋĐžŅŅ** и СаŅĐĩĐŧ ĐēаĐēиĐŧ-ĐģийО ОйŅаСОĐŧ ĐŋĐĩŅĐĩдаŅŅиК даĐŊĐŊŅĐĩ ĐēаĐļĐ´ĐžĐŧŅ ŅайОŅĐĩĐŧŅ ĐŋŅĐžŅĐĩŅŅŅ.
+ĐĐžŅŅĐžĐŧŅ, ŅŅĐžĐąŅ ĐžĐ´ĐŊОвŅĐĩĐŧĐĩĐŊĐŊĐž ŅайОŅаĐģĐž **ĐŊĐĩŅĐēĐžĐģŅĐēĐž ĐŋŅĐžŅĐĩŅŅОв**, Đ´ĐžĐģĐļĐĩĐŊ ĐąŅŅŅ **ОдиĐŊ ĐŋŅĐžŅĐĩŅŅ, ŅĐģŅŅаŅŅиК ĐŋĐžŅŅ**, ĐēĐžŅĐžŅŅĐš СаŅĐĩĐŧ ĐēаĐēиĐŧâŅĐž ОйŅаСОĐŧ ĐŋĐĩŅĐĩдаŅŅ ĐēĐžĐŧĐŧŅĐŊиĐēаŅĐ¸Ņ ĐēаĐļĐ´ĐžĐŧŅ Đ˛ĐžŅĐēĐĩŅâĐŋŅĐžŅĐĩŅŅŅ.
-### ĐŖ ĐēаĐļĐ´ĐžĐŗĐž ĐŋŅĐžŅĐĩŅŅа ŅĐ˛ĐžŅ ĐŋаĐŧŅŅŅ
+### ĐаĐŧŅŅŅ ĐŊа ĐŋŅĐžŅĐĩŅŅ { #memory-per-process }
-РайОŅаŅŅĐ°Ņ ĐŋŅĐžĐŗŅаĐŧĐŧа ĐˇĐ°ĐŗŅŅĐļаĐĩŅ Đ˛ ĐŋаĐŧŅŅŅ Đ´Đ°ĐŊĐŊŅĐĩ, ĐŊĐĩОйŅ
ОдиĐŧŅĐĩ Đ´ĐģŅ ĐĩŅ ŅайОŅŅ, ĐŊаĐŋŅиĐŧĐĩŅ, ĐŋĐĩŅĐĩĐŧĐĩĐŊĐŊŅĐĩ ŅОдĐĩŅĐļаŅиĐĩ ĐŧОдĐĩĐģи ĐŧаŅиĐŊĐŊĐžĐŗĐž ОйŅŅĐĩĐŊĐ¸Ņ Đ¸Đģи йОĐģŅŅиĐĩ ŅаКĐģŅ. ĐаĐļĐ´Đ°Ņ ĐŋĐĩŅĐĩĐŧĐĩĐŊĐŊĐ°Ņ **ĐŋĐžŅŅĐĩĐąĐģŅĐĩŅ ĐŊĐĩĐēĐžŅĐžŅĐžĐĩ ĐēĐžĐģиŅĐĩŅŅвО ĐžĐŋĐĩŅаŅивĐŊОК ĐŋаĐŧŅŅи (RAM)** ŅĐĩŅвĐĩŅа.
+ĐĐžĐŗĐ´Đ° ĐŋŅĐžĐŗŅаĐŧĐŧа ĐˇĐ°ĐŗŅŅĐļаĐĩŅ ŅŅĐžâŅĐž в ĐŋаĐŧŅŅŅ (ĐŊаĐŋŅиĐŧĐĩŅ, ĐŧОдĐĩĐģŅ ĐŧаŅиĐŊĐŊĐžĐŗĐž ОйŅŅĐĩĐŊĐ¸Ņ Đ˛ ĐŋĐĩŅĐĩĐŧĐĩĐŊĐŊŅŅ Đ¸Đģи ŅОдĐĩŅĐļиĐŧĐžĐĩ йОĐģŅŅĐžĐŗĐž ŅаКĐģа в ĐŋĐĩŅĐĩĐŧĐĩĐŊĐŊŅŅ), вŅŅ ŅŅĐž **ĐŋĐžŅŅĐĩĐąĐģŅĐĩŅ ŅаŅŅŅ ĐŋаĐŧŅŅи (RAM)** ŅĐĩŅвĐĩŅа.
-ĐĐąŅŅĐŊĐž ĐŋŅĐžŅĐĩŅŅŅ **ĐŊĐĩ Đ´ĐĩĐģŅŅŅŅ ĐŋаĐŧŅŅŅŅ Đ´ŅŅĐŗ Ņ Đ´ŅŅĐŗĐžĐŧ**. ХиĐĩ ОСĐŊаŅаĐĩŅ, ŅŅĐž ĐēаĐļĐ´ŅĐš ŅайОŅаŅŅиК ĐŋŅĐžŅĐĩŅŅ Đ¸ĐŧĐĩĐĩŅ ŅвОи даĐŊĐŊŅĐĩ, ĐŋĐĩŅĐĩĐŧĐĩĐŊĐŊŅĐĩ и ŅвОК ĐēŅŅĐžĐē ĐŋаĐŧŅŅи. Đ ĐĩŅĐģи Đ´ĐģŅ Đ˛ŅĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ Đ˛Đ°ŅĐĩĐŗĐž ĐēОда ĐŋŅĐžŅĐĩŅŅŅ ĐŊŅĐļĐŊĐž ĐŧĐŊĐžĐŗĐž ĐŋаĐŧŅŅи, ŅĐž **ĐēаĐļĐ´ŅĐš ŅаĐēОК ĐļĐĩ ĐŋŅĐžŅĐĩŅŅ** СаĐŋŅŅĐĩĐŊĐŊŅĐš Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊĐž, ĐŋĐžŅŅĐĩĐąŅĐĩŅ ŅаĐēĐžĐŗĐž ĐļĐĩ ĐēĐžĐģиŅĐĩŅŅва ĐŋаĐŧŅŅи.
+Đ ŅаСĐŊŅĐĩ ĐŋŅĐžŅĐĩŅŅŅ ĐžĐąŅŅĐŊĐž **ĐŊĐĩ Đ´ĐĩĐģŅŅ ĐŋаĐŧŅŅŅ**. ĐŅĐž СĐŊаŅиŅ, ŅŅĐž Ņ ĐēаĐļĐ´ĐžĐŗĐž ĐŋŅĐžŅĐĩŅŅа ŅвОи ĐŋĐĩŅĐĩĐŧĐĩĐŊĐŊŅĐĩ и ŅĐ˛ĐžŅ ĐŋаĐŧŅŅŅ. ĐŅĐģи Đ˛Đ°Ņ ĐēОд ĐŋĐžŅŅĐĩĐąĐģŅĐĩŅ ĐŧĐŊĐžĐŗĐž ĐŋаĐŧŅŅи, ŅĐž **ĐēаĐļĐ´ŅĐš ĐŋŅĐžŅĐĩŅŅ** ĐąŅĐ´ĐĩŅ ĐŋĐžŅŅĐĩĐąĐģŅŅŅ ŅĐžĐŋĐžŅŅавиĐŧŅĐš ОйŅŅĐŧ ĐŋаĐŧŅŅи.
-### ĐаĐŧŅŅŅ ŅĐĩŅвĐĩŅа
+### ĐаĐŧŅŅŅ ŅĐĩŅвĐĩŅа { #server-memory }
-ĐĐžĐŋŅŅŅиĐŧ, ŅŅĐž ĐĐ°Ņ ĐēОд ĐˇĐ°ĐŗŅŅĐļаĐĩŅ ĐŧОдĐĩĐģŅ ĐŧаŅиĐŊĐŊĐžĐŗĐž ОйŅŅĐĩĐŊĐ¸Ņ **ŅаСĐŧĐĩŅĐžĐŧ 1 ĐĐ**. ĐĐžĐŗĐ´Đ° Đ˛Ņ ĐˇĐ°ĐŋŅŅŅиŅĐĩ ŅĐ˛ĐžŅ API ĐēаĐē ОдиĐŊ ĐŋŅĐžŅĐĩŅŅ, ĐžĐŊ СаКĐŧŅŅ Đ˛ ĐžĐŋĐĩŅаŅивĐŊОК ĐŋаĐŧŅŅи ĐŊĐĩ ĐŧĐĩĐŊĐĩĐĩ 1 ĐĐ. Đ ĐĩŅĐģи Đ˛Ņ ĐˇĐ°ĐŋŅŅŅиŅĐĩ **4 ŅаĐēиŅ
ĐļĐĩ ĐŋŅĐžŅĐĩŅŅа** (4 вОŅĐēĐĩŅа), ŅĐž ĐēаĐļĐ´ŅĐš иС ĐŊиŅ
СаКĐŧŅŅ 1 ĐĐ ĐžĐŋĐĩŅаŅивĐŊОК ĐŋаĐŧŅŅи. Đ ŅĐĩСŅĐģŅŅаŅĐĩ ваŅĐĩĐŧŅ API ĐŋĐžŅŅĐĩĐąŅĐĩŅŅŅ **4 ĐĐ ĐžĐŋĐĩŅаŅивĐŊОК ĐŋаĐŧŅŅи (RAM)**.
+ĐаĐŋŅиĐŧĐĩŅ, ĐĩŅĐģи Đ˛Đ°Ņ ĐēОд ĐˇĐ°ĐŗŅŅĐļаĐĩŅ ĐŧОдĐĩĐģŅ ĐаŅиĐŊĐŊĐžĐŗĐž ОйŅŅĐĩĐŊĐ¸Ņ ŅаСĐŧĐĩŅĐžĐŧ **1 ĐĐ**, ŅĐž ĐŋŅи СаĐŋŅŅĐēĐĩ ОдĐŊĐžĐŗĐž ĐŋŅĐžŅĐĩŅŅа Ņ Đ˛Đ°ŅиĐŧ API ĐžĐŊ ĐąŅĐ´ĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ ĐēаĐē ĐŧиĐŊиĐŧŅĐŧ 1 ĐĐ RAM. Đ ĐĩŅĐģи Đ˛Ņ ĐˇĐ°ĐŋŅŅŅиŅĐĩ **4 ĐŋŅĐžŅĐĩŅŅа** (4 вОŅĐēĐĩŅа), ĐēаĐļĐ´ŅĐš ĐŋŅĐžŅĐĩŅŅ ĐąŅĐ´ĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ 1 ĐĐ RAM. ĐŅĐĩĐŗĐž Đ˛Đ°Ņ API ĐąŅĐ´ĐĩŅ ĐŋĐžŅŅĐĩĐąĐģŅŅŅ **4 ĐĐ RAM**.
-Đ ĐĩŅĐģи ĐĐ°Ņ ŅдаĐģŅĐŊĐŊŅĐš ŅĐĩŅвĐĩŅ Đ¸Đģи виŅŅŅаĐģŅĐŊĐ°Ņ ĐŧаŅиĐŊа ŅаŅĐŋĐžĐģĐ°ĐŗĐ°ĐĩŅ ŅĐžĐģŅĐēĐž 3 ĐĐ ĐŋаĐŧŅŅи, ŅĐž ĐŋĐžĐŋŅŅĐēа ĐˇĐ°ĐŗŅŅСиŅŅ Đ˛ ĐŊĐĩŅ 4 ĐРдаĐŊĐŊŅŅ
вŅСОвĐĩŅ ĐŋŅОйĐģĐĩĐŧŅ. đ¨
+Đ ĐĩŅĐģи Ņ Đ˛Đ°ŅĐĩĐŗĐž ŅдаĐģŅĐŊĐŊĐžĐŗĐž ŅĐĩŅвĐĩŅа иĐģи виŅŅŅаĐģŅĐŊОК ĐŧаŅиĐŊŅ ŅĐžĐģŅĐēĐž 3 ĐĐ RAM, ĐŋĐžĐŋŅŅĐēа ĐˇĐ°ĐŗŅŅСиŅŅ ĐąĐžĐģĐĩĐĩ 4 ĐРвŅСОвĐĩŅ ĐŋŅОйĐģĐĩĐŧŅ. đ¨
-### ĐĐŊĐžĐļĐĩŅŅвО ĐŋŅĐžŅĐĩŅŅОв - ĐŅиĐŧĐĩŅ
+### ĐĐĩŅĐēĐžĐģŅĐēĐž ĐŋŅĐžŅĐĩŅŅОв â ĐŋŅиĐŧĐĩŅ { #multiple-processes-an-example }
-Đ ŅŅĐžĐŧ ĐŋŅиĐŧĐĩŅĐĩ **ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ ĐŋŅĐžŅĐĩŅŅОв** СаĐŋŅŅŅĐ¸Ņ Đ¸ ĐąŅĐ´ĐĩŅ ŅĐŋŅавĐģŅŅŅ Đ´Đ˛ŅĐŧŅ **вОŅĐēĐĩŅаĐŧи**.
+Đ ŅŅĐžĐŧ ĐŋŅиĐŧĐĩŅĐĩ ĐĩŅŅŅ **ĐŋŅĐžŅĐĩŅŅâĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ**, ĐēĐžŅĐžŅŅĐš СаĐŋŅŅĐēаĐĩŅ Đ¸ ĐēĐžĐŊŅŅĐžĐģиŅŅĐĩŅ Đ´Đ˛Đ° **ĐŋŅĐžŅĐĩŅŅаâвОŅĐēĐĩŅа**.
-ĐĐĩĐŊĐĩĐ´ĐļĐĩŅ ĐŋŅĐžŅĐĩŅŅОв ĐąŅĐ´ĐĩŅ ŅĐģŅŅаŅŅ ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐŊŅĐš **ŅĐžĐēĐĩŅ** (IP:ĐŋĐžŅŅ) и ĐŋĐĩŅĐĩдаваŅŅ Đ´Đ°ĐŊĐŊŅĐĩ ŅайОŅаŅŅиĐŧ ĐŋŅĐžŅĐĩŅŅаĐŧ.
+ĐŅĐžŅĐĩŅŅâĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ, вĐĩŅĐžŅŅĐŊĐž, ĐąŅĐ´ĐĩŅ ŅĐĩĐŧ, ĐēŅĐž ŅĐģŅŅаĐĩŅ **ĐŋĐžŅŅ** ĐŊа IP. Đ ĐžĐŊ ĐąŅĐ´ĐĩŅ ĐŋĐĩŅĐĩдаваŅŅ Đ˛ŅŅ ĐēĐžĐŧĐŧŅĐŊиĐēаŅĐ¸Ņ Đ˛ĐžŅĐēĐĩŅâĐŋŅĐžŅĐĩŅŅаĐŧ.
-ĐаĐļĐ´ŅĐš иС ŅŅиŅ
ĐŋŅĐžŅĐĩŅŅОв ĐąŅĐ´ĐĩŅ ĐˇĐ°ĐŋŅŅĐēаŅŅ Đ˛Đ°ŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ Đ´ĐģŅ ĐžĐąŅайОŅĐēи ĐŋĐžĐģŅŅĐĩĐŊĐŊĐžĐŗĐž **СаĐŋŅĐžŅа** и вОСвŅаŅĐĩĐŊĐ¸Ņ Đ˛ŅŅиŅĐģĐĩĐŊĐŊĐžĐŗĐž **ĐžŅвĐĩŅа** и ĐžĐŊи ĐąŅĐ´ŅŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ ĐžĐŋĐĩŅаŅивĐŊŅŅ ĐŋаĐŧŅŅŅ.
+ĐŅи вОŅĐēĐĩŅŅ ĐąŅĐ´ŅŅ ĐˇĐ°ĐŋŅŅĐēаŅŅ Đ˛Đ°ŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ, вŅĐŋĐžĐģĐŊŅŅŅ ĐžŅĐŊОвĐŊŅĐĩ вŅŅиŅĐģĐĩĐŊĐ¸Ņ Đ´ĐģŅ ĐŋĐžĐģŅŅĐĩĐŊĐ¸Ņ **СаĐŋŅĐžŅа** и вОСвŅаŅа **ĐžŅвĐĩŅа**, и ĐˇĐ°ĐŗŅŅĐļаŅŅ Đ˛ŅŅ, ŅŅĐž Đ˛Ņ ĐēĐģадŅŅĐĩ в ĐŋĐĩŅĐĩĐŧĐĩĐŊĐŊŅĐĩ, в RAM.
+
+ĐĐž Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐžŅĐēĐģŅŅиŅŅ ĐĩŅ, ŅŅŅаĐŊОвив `syntaxHighlight` в `False`:
+
+{* ../../docs_src/configure_swagger_ui/tutorial001.py hl[3] *}
+
+âĻи ĐŋĐžŅĐģĐĩ ŅŅĐžĐŗĐž Swagger UI йОĐģŅŅĐĩ ĐŊĐĩ ĐąŅĐ´ĐĩŅ ĐŋĐžĐēаСŅваŅŅ ĐŋОдŅвĐĩŅĐēŅ ŅиĐŊŅаĐēŅиŅа:
+
+
+
+## ĐСĐŧĐĩĐŊиŅŅ ŅĐĩĐŧŅ { #change-the-theme }
+
+ĐĐŊаĐģĐžĐŗĐ¸ŅĐŊĐž Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ СадаŅŅ ŅĐĩĐŧŅ ĐŋОдŅвĐĩŅĐēи ŅиĐŊŅаĐēŅиŅа Ņ ĐēĐģŅŅĐžĐŧ "syntaxHighlight.theme" (ОйŅаŅиŅĐĩ вĐŊиĐŧаĐŊиĐĩ, ŅŅĐž ĐŋĐžŅĐĩŅĐĩдиĐŊĐĩ ŅŅĐžĐ¸Ņ ŅĐžŅĐēа):
+
+{* ../../docs_src/configure_swagger_ui/tutorial002.py hl[3] *}
+
+ĐŅа ĐŊаŅŅŅОКĐēа иСĐŧĐĩĐŊĐ¸Ņ ŅвĐĩŅОвŅŅ ŅĐĩĐŧŅ ĐŋОдŅвĐĩŅĐēи ŅиĐŊŅаĐēŅиŅа:
+
+
+
+## ĐСĐŧĐĩĐŊиŅŅ ĐŋаŅаĐŧĐĩŅŅŅ Swagger UI ĐŋĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ { #change-default-swagger-ui-parameters }
+
+FastAPI вĐēĐģŅŅаĐĩŅ ĐŊĐĩĐēĐžŅĐžŅŅĐĩ ĐŋаŅаĐŧĐĩŅŅŅ ĐēĐžĐŊŅĐ¸ĐŗŅŅаŅии ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ, ĐŋОдŅ
ОдŅŅиĐĩ Đ´ĐģŅ ĐąĐžĐģŅŅиĐŊŅŅва ŅĐģŅŅаĐĩв.
+
+ĐŅĐž вĐēĐģŅŅаĐĩŅ ŅĐģĐĩĐ´ŅŅŅиĐĩ ĐŊаŅŅŅОКĐēи ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ:
+
+{* ../../fastapi/openapi/docs.py ln[8:23] hl[17:23] *}
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ĐŋĐĩŅĐĩĐžĐŋŅĐĩĐ´ĐĩĐģиŅŅ ĐģŅĐąŅŅ Đ¸Đˇ ĐŊиŅ
, ŅĐēаСав Đ´ŅŅĐŗĐžĐĩ СĐŊаŅĐĩĐŊиĐĩ в аŅĐŗŅĐŧĐĩĐŊŅĐĩ `swagger_ui_parameters`.
+
+ĐаĐŋŅиĐŧĐĩŅ, ŅŅĐžĐąŅ ĐžŅĐēĐģŅŅиŅŅ `deepLinking`, ĐŧĐžĐļĐŊĐž ĐŋĐĩŅĐĩдаŅŅ ŅаĐēиĐĩ ĐŊаŅŅŅОКĐēи в `swagger_ui_parameters`:
+
+{* ../../docs_src/configure_swagger_ui/tutorial003.py hl[3] *}
+
+## ĐŅŅĐŗĐ¸Đĩ ĐŋаŅаĐŧĐĩŅŅŅ Swagger UI { #other-swagger-ui-parameters }
+
+ЧŅĐžĐąŅ ŅвидĐĩŅŅ Đ˛ŅĐĩ ĐžŅŅаĐģŅĐŊŅĐĩ вОСĐŧĐžĐļĐŊŅĐĩ ĐŊаŅŅŅОКĐēи, ĐŋŅĐžŅиŅаКŅĐĩ ĐžŅиŅиаĐģŅĐŊŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ ĐŋĐž ĐŋаŅаĐŧĐĩŅŅаĐŧ Swagger UI.
+
+## ĐаŅŅŅОКĐēи ŅĐžĐģŅĐēĐž Đ´ĐģŅ JavaScript { #javascript-only-settings }
+
+Swagger UI ŅаĐēĐļĐĩ Đ´ĐžĐŋŅŅĐēаĐĩŅ Đ´ŅŅĐŗĐ¸Đĩ ĐŊаŅŅŅОКĐēи, ĐēĐžŅĐžŅŅĐĩ ŅвĐģŅŅŅŅŅ **ŅиŅŅĐž JavaScript-ОйŅĐĩĐēŅаĐŧи** (ĐŊаĐŋŅиĐŧĐĩŅ, JavaScript-ŅŅĐŊĐēŅиŅĐŧи).
+
+FastAPI ŅаĐēĐļĐĩ вĐēĐģŅŅаĐĩŅ ŅĐģĐĩĐ´ŅŅŅиĐĩ ĐŊаŅŅŅОКĐēи `presets` (ŅĐžĐģŅĐēĐž Đ´ĐģŅ JavaScript):
+
+```JavaScript
+presets: [
+ SwaggerUIBundle.presets.apis,
+ SwaggerUIBundle.SwaggerUIStandalonePreset
+]
+```
+
+ĐŅĐž ОйŅĐĩĐēŅŅ **JavaScript**, а ĐŊĐĩ ŅŅŅĐžĐēи, ĐŋĐžŅŅĐžĐŧŅ ĐŊаĐŋŅŅĐŧŅŅ ĐŋĐĩŅĐĩдаŅŅ Đ¸Ņ
иС Python-ĐēОда ĐŊĐĩĐģŅСŅ.
+
+ĐŅĐģи ваĐŧ ĐŊŅĐļĐŊŅ ŅаĐēиĐĩ ĐŊаŅŅŅОКĐēи ŅĐžĐģŅĐēĐž Đ´ĐģŅ JavaScript, иŅĐŋĐžĐģŅСŅĐšŅĐĩ ОдиĐŊ иС ĐŧĐĩŅОдОв вŅŅĐĩ. ĐĐĩŅĐĩĐžĐŋŅĐĩĐ´ĐĩĐģиŅĐĩ *ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи* Swagger UI и вŅŅŅĐŊŅŅ ĐŊаĐŋиŅиŅĐĩ ĐģŅйОК ĐŊĐĩОйŅ
ОдиĐŧŅĐš JavaScript.
diff --git a/docs/ru/docs/how-to/custom-docs-ui-assets.md b/docs/ru/docs/how-to/custom-docs-ui-assets.md
new file mode 100644
index 000000000..c07a9695b
--- /dev/null
+++ b/docs/ru/docs/how-to/custom-docs-ui-assets.md
@@ -0,0 +1,185 @@
+# ХвОи ŅŅаŅиŅĐĩŅĐēиĐĩ ŅĐĩŅŅŅŅŅ UI Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии (ŅаĐŧĐžŅŅĐžŅŅĐĩĐģŅĐŊŅĐš Ņ
ĐžŅŅиĐŊĐŗ) { #custom-docs-ui-static-assets-self-hosting }
+
+ĐĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ API иŅĐŋĐžĐģŅСŅĐĩŅ **Swagger UI** и **ReDoc**, и Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž иС ĐŊиŅ
ĐŊŅĐļĐŊŅ ĐŊĐĩĐēĐžŅĐžŅŅĐĩ ŅаКĐģŅ JavaScript и CSS.
+
+ĐĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ ŅŅи ŅаКĐģŅ ĐžŅдаŅŅŅŅ Ņ CDN.
+
+ĐĐž ŅŅĐž ĐŧĐžĐļĐŊĐž ĐŊаŅŅŅОиŅŅ: Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅĐēаСаŅŅ ĐēĐžĐŊĐēŅĐĩŅĐŊŅĐš CDN иĐģи ĐžŅдаваŅŅ ŅаКĐģŅ ŅаĐŧĐžŅŅĐžŅŅĐĩĐģŅĐŊĐž.
+
+## ĐĐžĐģŅСОваŅĐĩĐģŅŅĐēиК CDN Đ´ĐģŅ JavaScript и CSS { #custom-cdn-for-javascript-and-css }
+
+ĐĐžĐŋŅŅŅиĐŧ, Đ˛Ņ Ņ
ĐžŅиŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ Đ´ŅŅĐŗĐžĐš CDN, ĐŊаĐŋŅиĐŧĐĩŅ `https://unpkg.com/`.
+
+ĐŅĐž ĐŧĐžĐļĐĩŅ ĐąŅŅŅ ĐŋĐžĐģĐĩСĐŊĐž, ĐĩŅĐģи, ĐŊаĐŋŅиĐŧĐĩŅ, Đ˛Ņ ĐļивŅŅĐĩ в ŅŅŅаĐŊĐĩ, ĐŗĐ´Đĩ ĐŊĐĩĐēĐžŅĐžŅŅĐĩ URL ĐžĐŗŅаĐŊиŅĐĩĐŊŅ.
+
+### ĐŅĐēĐģŅŅиŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ { #disable-the-automatic-docs }
+
+ĐĐĩŅвŅĐš ŅĐ°Đŗ â ĐžŅĐēĐģŅŅиŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиŅ, ŅаĐē ĐēаĐē ĐŋĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ ĐžĐŊа иŅĐŋĐžĐģŅСŅĐĩŅ ŅŅаĐŊдаŅŅĐŊŅĐš CDN.
+
+ЧŅĐžĐąŅ ĐžŅĐēĐģŅŅиŅŅ ĐĩŅ, ŅŅŅаĐŊОвиŅĐĩ иŅ
URL в СĐŊаŅĐĩĐŊиĐĩ `None` ĐŋŅи ŅОСдаĐŊии ваŅĐĩĐŗĐž ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ `FastAPI`:
+
+{* ../../docs_src/custom_docs_ui/tutorial001.py hl[8] *}
+
+### ĐОдĐēĐģŅŅиŅŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ { #include-the-custom-docs }
+
+ĐĸĐĩĐŋĐĩŅŅ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅОСдаŅŅ *ĐžĐŋĐĩŅаŅии ĐŋŅŅи* Đ´ĐģŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēОК Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии.
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ĐŋĐĩŅĐĩиŅĐŋĐžĐģŅСОваŅŅ Đ˛ĐŊŅŅŅĐĩĐŊĐŊиĐĩ ŅŅĐŊĐēŅии FastAPI Đ´ĐģŅ ŅОСдаĐŊĐ¸Ņ HTML-ŅŅŅаĐŊĐ¸Ņ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии и ĐŋĐĩŅĐĩдаŅŅ Đ¸Đŧ ĐŊĐĩОйŅ
ОдиĐŧŅĐĩ аŅĐŗŅĐŧĐĩĐŊŅŅ:
+
+* `openapi_url`: URL, ĐŋĐž ĐēĐžŅĐžŅĐžĐŧŅ HTML-ŅŅŅаĐŊиŅа Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии ŅĐŧĐžĐļĐĩŅ ĐŋĐžĐģŅŅиŅŅ ŅŅ
ĐĩĐŧŅ OpenAPI Đ´ĐģŅ Đ˛Đ°ŅĐĩĐŗĐž API. ĐĐ´ĐĩŅŅ ĐŧĐžĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ Đ°ŅŅийŅŅ `app.openapi_url`.
+* `title`: ĐˇĐ°ĐŗĐžĐģОвОĐē ваŅĐĩĐŗĐž API.
+* `oauth2_redirect_url`: СдĐĩŅŅ ĐŧĐžĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ `app.swagger_ui_oauth2_redirect_url`, ŅŅĐžĐąŅ ĐžŅŅавиŅŅ ĐˇĐŊаŅĐĩĐŊиĐĩ ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ.
+* `swagger_js_url`: URL, ĐŋĐž ĐēĐžŅĐžŅĐžĐŧŅ HTML Đ´ĐģŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии Swagger UI ŅĐŧĐžĐļĐĩŅ ĐŋĐžĐģŅŅиŅŅ ŅаКĐģ **JavaScript**. ĐŅĐž URL ваŅĐĩĐŗĐž ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēĐžĐŗĐž CDN.
+* `swagger_css_url`: URL, ĐŋĐž ĐēĐžŅĐžŅĐžĐŧŅ HTML Đ´ĐģŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии Swagger UI ŅĐŧĐžĐļĐĩŅ ĐŋĐžĐģŅŅиŅŅ ŅаКĐģ **CSS**. ĐŅĐž URL ваŅĐĩĐŗĐž ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēĐžĐŗĐž CDN.
+
+ĐĐŊаĐģĐžĐŗĐ¸ŅĐŊĐž и Đ´ĐģŅ ReDoc...
+
+{* ../../docs_src/custom_docs_ui/tutorial001.py hl[2:6,11:19,22:24,27:33] *}
+
+/// tip | ХОвĐĩŅ
+
+*ĐĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи* Đ´ĐģŅ `swagger_ui_redirect` â ŅŅĐž вŅĐŋĐžĐŧĐžĐŗĐ°ŅĐĩĐģŅĐŊŅĐš ŅĐŊĐ´ĐŋОиĐŊŅ ĐŊа ŅĐģŅŅаК, ĐēĐžĐŗĐ´Đ° Đ˛Ņ Đ¸ŅĐŋĐžĐģŅСŅĐĩŅĐĩ OAuth2.
+
+ĐŅĐģи Đ˛Ņ Đ¸ĐŊŅĐĩĐŗŅиŅŅĐĩŅĐĩ ŅвОК API Ņ ĐŋŅОваКдĐĩŅĐžĐŧ OAuth2, Đ˛Ņ ŅĐŧĐžĐļĐĩŅĐĩ аŅŅĐĩĐŊŅиŅиŅиŅОваŅŅŅŅ Đ¸ вĐĩŅĐŊŅŅŅŅŅ Đē Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии API Ņ ĐŋĐžĐģŅŅĐĩĐŊĐŊŅĐŧи ŅŅŅŅĐŊŅĐŧи даĐŊĐŊŅĐŧи, а СаŅĐĩĐŧ вСаиĐŧОдĐĩĐšŅŅвОваŅŅ Ņ ĐŊиĐŧ, иŅĐŋĐžĐģŅСŅŅ ŅĐĩаĐģŅĐŊŅŅ Đ°ŅŅĐĩĐŊŅиŅиĐēаŅĐ¸Ņ OAuth2.
+
+Swagger UI ŅĐ´ĐĩĐģаĐĩŅ ŅŅĐž Са Đ˛Đ°Ņ ÂĢСа ĐēŅĐģиŅаĐŧиÂģ, ĐŊĐž Đ´ĐģŅ ŅŅĐžĐŗĐž ĐĩĐŧŅ ĐŊŅĐļĐĩĐŊ ŅŅĐžŅ Đ˛ŅĐŋĐžĐŧĐžĐŗĐ°ŅĐĩĐģŅĐŊŅĐš ÂĢredirectÂģ ŅĐŊĐ´ĐŋОиĐŊŅ.
+
+///
+
+### ХОСдаКŅĐĩ *ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи*, ŅŅĐžĐąŅ ĐŋŅОвĐĩŅиŅŅ { #create-a-path-operation-to-test-it }
+
+ЧŅĐžĐąŅ ŅĐąĐĩдиŅŅŅŅ, ŅŅĐž вŅŅ ŅайОŅаĐĩŅ, ŅОСдаКŅĐĩ *ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи*:
+
+{* ../../docs_src/custom_docs_ui/tutorial001.py hl[36:38] *}
+
+### ĐĸĐĩŅŅиŅОваĐŊиĐĩ { #test-it }
+
+ĐĸĐĩĐŋĐĩŅŅ Đ˛Ņ Đ´ĐžĐģĐļĐŊŅ Đ¸ĐŧĐĩŅŅ Đ˛ĐžĐˇĐŧĐžĐļĐŊĐžŅŅŅ ĐžŅĐēŅŅŅŅ ŅĐ˛ĐžŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ ĐŋĐž адŅĐĩŅŅ http://127.0.0.1:8000/docs и ĐŋĐĩŅĐĩĐˇĐ°ĐŗŅŅСиŅŅ ŅŅŅаĐŊиŅŅ â ÂĢаŅŅĐĩŅŅÂģ (ŅŅаŅиŅĐĩŅĐēиĐĩ ŅаКĐģŅ) ĐąŅĐ´ŅŅ ĐˇĐ°ĐŗŅŅĐļаŅŅŅŅ Ņ ĐŊĐžĐ˛ĐžĐŗĐž CDN.
+
+## ХаĐŧĐžŅŅĐžŅŅĐĩĐģŅĐŊŅĐš Ņ
ĐžŅŅиĐŊĐŗ JavaScript и CSS Đ´ĐģŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии { #self-hosting-javascript-and-css-for-docs }
+
+ХаĐŧĐžŅŅĐžŅŅĐĩĐģŅĐŊŅĐš Ņ
ĐžŅŅиĐŊĐŗ JavaScript и CSS ĐŧĐžĐļĐĩŅ ĐąŅŅŅ ĐŋĐžĐģĐĩСĐĩĐŊ, ĐĩŅĐģи, ĐŊаĐŋŅиĐŧĐĩŅ, ваĐŧ ĐŊŅĐļĐŊĐž, ŅŅĐžĐąŅ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ĐŋŅОдОĐģĐļаĐģĐž ŅайОŅаŅŅ Đ˛ ĐžŅĐģаКĐŊĐĩ, ĐąĐĩС Đ´ĐžŅŅŅĐŋа Đē ĐžŅĐēŅŅŅĐžĐŧŅ ĐĐŊŅĐĩŅĐŊĐĩŅŅ, иĐģи в ĐģĐžĐēаĐģŅĐŊОК ŅĐĩŅи.
+
+ĐĐ´ĐĩŅŅ Đ˛Ņ ŅвидиŅĐĩ, ĐēаĐē ĐžŅдаваŅŅ ŅŅи ŅаКĐģŅ ŅаĐŧĐžŅŅĐžŅŅĐĩĐģŅĐŊĐž, в ŅĐžĐŧ ĐļĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊии FastAPI, и ĐŊаŅŅŅОиŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ ĐŊа иŅ
иŅĐŋĐžĐģŅСОваĐŊиĐĩ.
+
+### ĐĄŅŅŅĐēŅŅŅа ŅаКĐģОв ĐŋŅĐžĐĩĐēŅа { #project-file-structure }
+
+ĐĐžĐŋŅŅŅиĐŧ, ŅŅŅŅĐēŅŅŅа ŅаКĐģОв ваŅĐĩĐŗĐž ĐŋŅĐžĐĩĐēŅа вŅĐŗĐģŅĐ´Đ¸Ņ ŅаĐē:
+
+```
+.
+âââ app
+â âââ __init__.py
+â âââ main.py
+```
+
+ĐĸĐĩĐŋĐĩŅŅ ŅОСдаКŅĐĩ диŅĐĩĐēŅĐžŅĐ¸Ņ Đ´ĐģŅ Ņ
ŅаĐŊĐĩĐŊĐ¸Ņ ŅŅиŅ
ŅŅаŅиŅĐĩŅĐēиŅ
ŅаКĐģОв.
+
+ĐĐžĐ˛Đ°Ņ ŅŅŅŅĐēŅŅŅа ŅаКĐģОв ĐŧĐžĐļĐĩŅ Đ˛ŅĐŗĐģŅĐ´ĐĩŅŅ ŅаĐē:
+
+```
+.
+âââ app
+â  âââ __init__.py
+â  âââ main.py
+âââ static/
+```
+
+### ĐĄĐēаŅаКŅĐĩ ŅаКĐģŅ { #download-the-files }
+
+ĐĄĐēаŅаКŅĐĩ ŅŅаŅиŅĐĩŅĐēиĐĩ ŅаКĐģŅ, ĐŊĐĩОйŅ
ОдиĐŧŅĐĩ Đ´ĐģŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии, и ĐŋĐžĐŧĐĩŅŅиŅĐĩ иŅ
в диŅĐĩĐēŅĐžŅĐ¸Ņ `static/`.
+
+ĐĄĐēĐžŅĐĩĐĩ вŅĐĩĐŗĐž, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐēĐģиĐēĐŊŅŅŅ ĐŋŅавОК ĐēĐŊĐžĐŋĐēОК ĐŊа ĐēаĐļдОК ŅŅŅĐģĐēĐĩ и вŅĐąŅаŅŅ ŅŅĐž-ŅĐž вŅОдĐĩ ÂĢĐĄĐžŅ
ŅаĐŊиŅŅ ŅŅŅĐģĐēŅ ĐēаĐē...Âģ.
+
+**Swagger UI** иŅĐŋĐžĐģŅСŅĐĩŅ ŅаКĐģŅ:
+
+* `swagger-ui-bundle.js`
+* `swagger-ui.css`
+
+Đ **ReDoc** иŅĐŋĐžĐģŅСŅĐĩŅ ŅаКĐģ:
+
+* `redoc.standalone.js`
+
+ĐĐžŅĐģĐĩ ŅŅĐžĐŗĐž ŅŅŅŅĐēŅŅŅа ŅаКĐģОв ĐŧĐžĐļĐĩŅ Đ˛ŅĐŗĐģŅĐ´ĐĩŅŅ ŅаĐē:
+
+```
+.
+âââ app
+â  âââ __init__.py
+â  âââ main.py
+âââ static
+ âââ redoc.standalone.js
+ âââ swagger-ui-bundle.js
+ âââ swagger-ui.css
+```
+
+### ĐŅĐĩĐ´ĐžŅŅавŅŅĐĩ Đ´ĐžŅŅŅĐŋ Đē ŅŅаŅиŅĐĩŅĐēиĐŧ ŅаКĐģаĐŧ { #serve-the-static-files }
+
+* ĐĐŧĐŋĐžŅŅиŅŅĐšŅĐĩ `StaticFiles`.
+* ĐĄĐŧĐžĐŊŅиŅŅĐšŅĐĩ ŅĐēСĐĩĐŧĐŋĐģŅŅ `StaticFiles()` в ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐŊŅĐš ĐŋŅŅŅ.
+
+{* ../../docs_src/custom_docs_ui/tutorial002.py hl[7,11] *}
+
+### ĐŅĐžŅĐĩŅŅиŅŅĐšŅĐĩ ŅŅаŅиŅĐĩŅĐēиĐĩ ŅаКĐģŅ { #test-the-static-files }
+
+ĐаĐŋŅŅŅиŅĐĩ ŅĐ˛ĐžŅ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ и ĐžŅĐēŅОКŅĐĩ http://127.0.0.1:8000/static/redoc.standalone.js.
+
+ĐŅ Đ´ĐžĐģĐļĐŊŅ ŅвидĐĩŅŅ ĐžŅĐĩĐŊŅ Đ´ĐģиĐŊĐŊŅĐš JavaScript-ŅаКĐģ Đ´ĐģŅ **ReDoc**.
+
+ĐĐŊ ĐŧĐžĐļĐĩŅ ĐŊаŅиĐŊаŅŅŅŅ ĐŋŅиĐŧĐĩŅĐŊĐž ŅаĐē:
+
+```JavaScript
+/*! For license information please see redoc.standalone.js.LICENSE.txt */
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("null")):
+...
+```
+
+ĐŅĐž ĐŋОдŅвĐĩŅĐļдаĐĩŅ, ŅŅĐž ваŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ŅĐŧĐĩĐĩŅ ĐžŅдаваŅŅ ŅŅаŅиŅĐĩŅĐēиĐĩ ŅаКĐģŅ Đ¸ ŅŅĐž Đ˛Ņ ĐŋĐžĐŧĐĩŅŅиĐģи ŅаКĐģŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии в ĐŊŅĐļĐŊĐžĐĩ ĐŧĐĩŅŅĐž.
+
+ĐĸĐĩĐŋĐĩŅŅ ĐŧĐžĐļĐŊĐž ĐŊаŅŅŅОиŅŅ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ ŅаĐē, ŅŅĐžĐąŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ Đ¸ŅĐŋĐžĐģŅСОваĐģа ŅŅи ŅŅаŅиŅĐĩŅĐēиĐĩ ŅаКĐģŅ.
+
+### ĐŅĐēĐģŅŅиŅŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ Đ´ĐģŅ ŅŅаŅиŅĐĩŅĐēиŅ
ŅаКĐģОв { #disable-the-automatic-docs-for-static-files }
+
+ĐĸаĐē ĐļĐĩ, ĐēаĐē и ĐŋŅи иŅĐŋĐžĐģŅСОваĐŊии ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēĐžĐŗĐž CDN, ĐŋĐĩŅвŅĐŧ ŅĐ°ĐŗĐžĐŧ ĐąŅĐ´ĐĩŅ ĐžŅĐēĐģŅŅĐĩĐŊиĐĩ авŅĐžĐŧаŅиŅĐĩŅĐēОК Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии, ŅаĐē ĐēаĐē ĐŋĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ ĐžĐŊа иŅĐŋĐžĐģŅСŅĐĩŅ CDN.
+
+ЧŅĐžĐąŅ ĐžŅĐēĐģŅŅиŅŅ ĐĩŅ, ŅŅŅаĐŊОвиŅĐĩ иŅ
URL в СĐŊаŅĐĩĐŊиĐĩ `None` ĐŋŅи ŅОСдаĐŊии ваŅĐĩĐŗĐž ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ `FastAPI`:
+
+{* ../../docs_src/custom_docs_ui/tutorial002.py hl[9] *}
+
+### ĐОдĐēĐģŅŅиŅŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ ŅĐž ŅŅаŅиŅĐĩŅĐēиĐŧи ŅаКĐģаĐŧи { #include-the-custom-docs-for-static-files }
+
+ĐĐŊаĐģĐžĐŗĐ¸ŅĐŊĐž ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēĐžĐŧŅ CDN, ŅĐĩĐŋĐĩŅŅ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅОСдаŅŅ *ĐžĐŋĐĩŅаŅии ĐŋŅŅи* Đ´ĐģŅ ŅОйŅŅвĐĩĐŊĐŊОК Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии.
+
+ĐĄĐŊОва ĐŧĐžĐļĐŊĐž ĐŋĐĩŅĐĩиŅĐŋĐžĐģŅСОваŅŅ Đ˛ĐŊŅŅŅĐĩĐŊĐŊиĐĩ ŅŅĐŊĐēŅии FastAPI Đ´ĐģŅ ŅОСдаĐŊĐ¸Ņ HTML-ŅŅŅаĐŊĐ¸Ņ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии и ĐŋĐĩŅĐĩдаŅŅ Đ¸Đŧ ĐŊĐĩОйŅ
ОдиĐŧŅĐĩ аŅĐŗŅĐŧĐĩĐŊŅŅ:
+
+* `openapi_url`: URL, ĐŋĐž ĐēĐžŅĐžŅĐžĐŧŅ HTML-ŅŅŅаĐŊиŅа Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии ŅĐŧĐžĐļĐĩŅ ĐŋĐžĐģŅŅиŅŅ ŅŅ
ĐĩĐŧŅ OpenAPI Đ´ĐģŅ Đ˛Đ°ŅĐĩĐŗĐž API. ĐĐ´ĐĩŅŅ ĐŧĐžĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ Đ°ŅŅийŅŅ `app.openapi_url`.
+* `title`: ĐˇĐ°ĐŗĐžĐģОвОĐē ваŅĐĩĐŗĐž API.
+* `oauth2_redirect_url`: СдĐĩŅŅ ĐŧĐžĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ `app.swagger_ui_oauth2_redirect_url`, ŅŅĐžĐąŅ ĐžŅŅавиŅŅ ĐˇĐŊаŅĐĩĐŊиĐĩ ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ.
+* `swagger_js_url`: URL, ĐŋĐž ĐēĐžŅĐžŅĐžĐŧŅ HTML Đ´ĐģŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии Swagger UI ŅĐŧĐžĐļĐĩŅ ĐŋĐžĐģŅŅиŅŅ ŅаКĐģ **JavaScript**. **ĐŅĐž ŅĐžŅ ŅаКĐģ, ĐēĐžŅĐžŅŅĐš ŅĐĩĐŋĐĩŅŅ ĐžŅдаŅŅ Đ˛Đ°ŅĐĩ ŅОйŅŅвĐĩĐŊĐŊĐžĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ**.
+* `swagger_css_url`: URL, ĐŋĐž ĐēĐžŅĐžŅĐžĐŧŅ HTML Đ´ĐģŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии Swagger UI ŅĐŧĐžĐļĐĩŅ ĐŋĐžĐģŅŅиŅŅ ŅаКĐģ **CSS**. **ĐŅĐž ŅĐžŅ ŅаКĐģ, ĐēĐžŅĐžŅŅĐš ŅĐĩĐŋĐĩŅŅ ĐžŅдаŅŅ Đ˛Đ°ŅĐĩ ŅОйŅŅвĐĩĐŊĐŊĐžĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ**.
+
+ĐĐŊаĐģĐžĐŗĐ¸ŅĐŊĐž и Đ´ĐģŅ ReDoc...
+
+{* ../../docs_src/custom_docs_ui/tutorial002.py hl[2:6,14:22,25:27,30:36] *}
+
+/// tip | ХОвĐĩŅ
+
+*ĐĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи* Đ´ĐģŅ `swagger_ui_redirect` â ŅŅĐž вŅĐŋĐžĐŧĐžĐŗĐ°ŅĐĩĐģŅĐŊŅĐš ŅĐŊĐ´ĐŋОиĐŊŅ ĐŊа ŅĐģŅŅаК, ĐēĐžĐŗĐ´Đ° Đ˛Ņ Đ¸ŅĐŋĐžĐģŅСŅĐĩŅĐĩ OAuth2.
+
+ĐŅĐģи Đ˛Ņ Đ¸ĐŊŅĐĩĐŗŅиŅŅĐĩŅĐĩ ŅвОК API Ņ ĐŋŅОваКдĐĩŅĐžĐŧ OAuth2, Đ˛Ņ ŅĐŧĐžĐļĐĩŅĐĩ аŅŅĐĩĐŊŅиŅиŅиŅОваŅŅŅŅ Đ¸ вĐĩŅĐŊŅŅŅŅŅ Đē Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии API Ņ ĐŋĐžĐģŅŅĐĩĐŊĐŊŅĐŧи ŅŅŅŅĐŊŅĐŧи даĐŊĐŊŅĐŧи, а СаŅĐĩĐŧ вСаиĐŧОдĐĩĐšŅŅвОваŅŅ Ņ ĐŊиĐŧ, иŅĐŋĐžĐģŅСŅŅ ŅĐĩаĐģŅĐŊŅŅ Đ°ŅŅĐĩĐŊŅиŅиĐēаŅĐ¸Ņ OAuth2.
+
+Swagger UI ŅĐ´ĐĩĐģаĐĩŅ ŅŅĐž Са Đ˛Đ°Ņ ÂĢСа ĐēŅĐģиŅаĐŧиÂģ, ĐŊĐž Đ´ĐģŅ ŅŅĐžĐŗĐž ĐĩĐŧŅ ĐŊŅĐļĐĩĐŊ ŅŅĐžŅ Đ˛ŅĐŋĐžĐŧĐžĐŗĐ°ŅĐĩĐģŅĐŊŅĐš ÂĢredirectÂģ ŅĐŊĐ´ĐŋОиĐŊŅ.
+
+///
+
+### ХОСдаКŅĐĩ *ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи* Đ´ĐģŅ ŅĐĩŅŅа ŅŅаŅиŅĐĩŅĐēиŅ
ŅаКĐģОв { #create-a-path-operation-to-test-static-files }
+
+ЧŅĐžĐąŅ ŅĐąĐĩдиŅŅŅŅ, ŅŅĐž вŅŅ ŅайОŅаĐĩŅ, ŅОСдаКŅĐĩ *ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи*:
+
+{* ../../docs_src/custom_docs_ui/tutorial002.py hl[39:41] *}
+
+### ĐĸĐĩŅŅиŅОваĐŊиĐĩ UI ŅĐž ŅŅаŅиŅĐĩŅĐēиĐŧи ŅаКĐģаĐŧи { #test-static-files-ui }
+
+ĐĸĐĩĐŋĐĩŅŅ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐžŅĐēĐģŅŅиŅŅ WiâFi, ĐžŅĐēŅŅŅŅ ŅĐ˛ĐžŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ ĐŋĐž адŅĐĩŅŅ http://127.0.0.1:8000/docs и ĐŋĐĩŅĐĩĐˇĐ°ĐŗŅŅСиŅŅ ŅŅŅаĐŊиŅŅ.
+
+ĐаĐļĐĩ ĐąĐĩС ĐĐŊŅĐĩŅĐŊĐĩŅа Đ˛Ņ ŅĐŧĐžĐļĐĩŅĐĩ видĐĩŅŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ Đē ŅвОĐĩĐŧŅ API и вСаиĐŧОдĐĩĐšŅŅвОваŅŅ Ņ ĐŊиĐŧ.
diff --git a/docs/ru/docs/how-to/custom-request-and-route.md b/docs/ru/docs/how-to/custom-request-and-route.md
new file mode 100644
index 000000000..df8a5ee3c
--- /dev/null
+++ b/docs/ru/docs/how-to/custom-request-and-route.md
@@ -0,0 +1,109 @@
+# ĐĐžĐģŅСОваŅĐĩĐģŅŅĐēиĐĩ ĐēĐģаŅŅŅ Request и APIRoute { #custom-request-and-apiroute-class }
+
+Đ ĐŊĐĩĐēĐžŅĐžŅŅŅ
ŅĐģŅŅаŅŅ
ĐŧĐžĐļĐĩŅ ĐŋĐžĐŊадОйиŅŅŅŅ ĐŋĐĩŅĐĩĐžĐŋŅĐĩĐ´ĐĩĐģиŅŅ ĐģĐžĐŗĐ¸ĐēŅ, иŅĐŋĐžĐģŅСŅĐĩĐŧŅŅ ĐēĐģаŅŅаĐŧи `Request` и `APIRoute`.
+
+Đ ŅаŅŅĐŊĐžŅŅи, ŅŅĐž ĐŧĐžĐļĐĩŅ ĐąŅŅŅ Ņ
ĐžŅĐžŅĐĩĐš аĐģŅŅĐĩŅĐŊаŅивОК ĐģĐžĐŗĐ¸ĐēĐĩ в middleware.
+
+ĐаĐŋŅиĐŧĐĩŅ, ĐĩŅĐģи Đ˛Ņ Ņ
ĐžŅиŅĐĩ ĐŋŅĐžŅиŅаŅŅ Đ¸Đģи иСĐŧĐĩĐŊиŅŅ ŅĐĩĐģĐž СаĐŋŅĐžŅа Đ´Đž ŅĐžĐŗĐž, ĐēаĐē ĐžĐŊĐž ĐąŅĐ´ĐĩŅ ĐžĐąŅайОŅаĐŊĐž ваŅиĐŧ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩĐŧ.
+
+/// danger | ĐĐŋаŅĐŊĐžŅŅŅ
+
+ĐŅĐž ÂĢĐŋŅОдвиĐŊŅŅаŅÂģ вОСĐŧĐžĐļĐŊĐžŅŅŅ.
+
+ĐŅĐģи Đ˛Ņ ŅĐžĐģŅĐēĐž ĐŊаŅиĐŊаĐĩŅĐĩ ŅайОŅаŅŅ Ņ **FastAPI**, вОСĐŧĐžĐļĐŊĐž, ŅŅĐžĐ¸Ņ ĐŋŅĐžĐŋŅŅŅиŅŅ ŅŅĐžŅ ŅаСдĐĩĐģ.
+
+///
+
+## ĐĄŅĐĩĐŊаŅии иŅĐŋĐžĐģŅСОваĐŊĐ¸Ņ { #use-cases }
+
+ĐĐĩĐēĐžŅĐžŅŅĐĩ ŅŅĐĩĐŊаŅии:
+
+* ĐŅĐĩОйŅаСОваĐŊиĐĩ ŅĐĩĐģ СаĐŋŅĐžŅОв, ĐŊĐĩ в ŅĐžŅĐŧаŅĐĩ JSON, в JSON (ĐŊаĐŋŅиĐŧĐĩŅ, `msgpack`).
+* РаŅĐŋаĐēОвĐēа ŅĐĩĐģ СаĐŋŅĐžŅОв, ŅĐļаŅŅŅ
Ņ ĐŋĐžĐŧĐžŅŅŅ gzip.
+* ĐвŅĐžĐŧаŅиŅĐĩŅĐēĐžĐĩ ĐģĐžĐŗĐ¸ŅОваĐŊиĐĩ вŅĐĩŅ
ŅĐĩĐģ СаĐŋŅĐžŅОв.
+
+## ĐĐąŅайОŅĐēа ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēĐžĐŗĐž ĐēОдиŅОваĐŊĐ¸Ņ ŅĐĩĐģа СаĐŋŅĐžŅа { #handling-custom-request-body-encodings }
+
+ĐĐžŅĐŧĐžŅŅиĐŧ ĐēаĐē иŅĐŋĐžĐģŅСОваŅŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиК ĐŋОдĐēĐģаŅŅ `Request` Đ´ĐģŅ ŅаŅĐŋаĐēОвĐēи gzip-СаĐŋŅĐžŅОв.
+
+Đ ĐŋОдĐēĐģаŅŅ `APIRoute`, ŅŅĐžĐąŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ ŅŅĐžŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиК ĐēĐģаŅŅ ĐˇĐ°ĐŋŅĐžŅа.
+
+### ХОСдаŅŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиК ĐēĐģаŅŅ `GzipRequest` { #create-a-custom-gziprequest-class }
+
+/// tip | ХОвĐĩŅ
+
+ĐŅĐž ŅŅĐĩĐąĐŊŅĐš ĐŋŅиĐŧĐĩŅ, Đ´ĐĩĐŧĐžĐŊŅŅŅиŅŅŅŅиК ĐŋŅиĐŊŅиĐŋ ŅайОŅŅ. ĐŅĐģи ваĐŧ ĐŊŅĐļĐŊа ĐŋОддĐĩŅĐļĐēа Gzip, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ ĐŗĐžŅОвŅĐš [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware){.internal-link target=_blank}.
+
+///
+
+ĐĄĐŊаŅаĐģа ŅОСдадиĐŧ ĐēĐģаŅŅ `GzipRequest`, ĐēĐžŅĐžŅŅĐš ĐŋĐĩŅĐĩĐžĐŋŅĐĩĐ´ĐĩĐģĐ¸Ņ ĐŧĐĩŅОд `Request.body()` и ŅаŅĐŋаĐēŅĐĩŅ ŅĐĩĐģĐž СаĐŋŅĐžŅа ĐŋŅи ĐŊаĐģиŅии ŅООŅвĐĩŅŅŅвŅŅŅĐĩĐŗĐž HTTP-ĐˇĐ°ĐŗĐžĐģОвĐēа.
+
+ĐŅĐģи в ĐˇĐ°ĐŗĐžĐģОвĐēĐĩ ĐŊĐĩŅ `gzip`, ĐžĐŊ ĐŊĐĩ ĐąŅĐ´ĐĩŅ ĐŋŅŅаŅŅŅŅ ŅаŅĐŋаĐēОвŅваŅŅ ŅĐĩĐģĐž.
+
+ĐĸаĐēиĐŧ ОйŅаСОĐŧ, ОдиĐŊ и ŅĐžŅ ĐļĐĩ ĐēĐģаŅŅ ĐŧаŅŅŅŅŅа ŅĐŧĐžĐļĐĩŅ ĐžĐąŅайаŅŅваŅŅ ĐēаĐē gzip-ŅĐļаŅŅĐĩ, ŅаĐē и ĐŊĐĩŅĐļаŅŅĐĩ СаĐŋŅĐžŅŅ.
+
+{* ../../docs_src/custom_request_and_route/tutorial001.py hl[8:15] *}
+
+### ХОСдаŅŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиК ĐēĐģаŅŅ `GzipRoute` { #create-a-custom-gziproute-class }
+
+ĐаĐģĐĩĐĩ ŅОСдадиĐŧ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиК ĐŋОдĐēĐģаŅŅ `fastapi.routing.APIRoute`, ĐēĐžŅĐžŅŅĐš ĐąŅĐ´ĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ `GzipRequest`.
+
+Đа ŅŅĐžŅ ŅаС ĐžĐŊ ĐŋĐĩŅĐĩĐžĐŋŅĐĩĐ´ĐĩĐģĐ¸Ņ ĐŧĐĩŅОд `APIRoute.get_route_handler()`.
+
+ĐŅĐžŅ ĐŧĐĩŅОд вОСвŅаŅаĐĩŅ ŅŅĐŊĐēŅиŅ. ĐĐŧĐĩĐŊĐŊĐž ŅŅа ŅŅĐŊĐēŅĐ¸Ņ ĐŋĐžĐģŅŅаĐĩŅ HTTP-СаĐŋŅĐžŅ Đ¸ вОСвŅаŅаĐĩŅ HTTP-ĐžŅвĐĩŅ.
+
+ĐĐ´ĐĩŅŅ ĐŧŅ Đ¸ŅĐŋĐžĐģŅСŅĐĩĐŧ ĐĩŅ, ŅŅĐžĐąŅ ŅОСдаŅŅ `GzipRequest` иС иŅŅ
ОдĐŊĐžĐŗĐž HTTP-СаĐŋŅĐžŅа.
+
+{* ../../docs_src/custom_request_and_route/tutorial001.py hl[18:26] *}
+
+/// note | ĐĸĐĩŅ
ĐŊиŅĐĩŅĐēиĐĩ Đ´ĐĩŅаĐģи
+
+ĐŖ `Request` ĐĩŅŅŅ Đ°ŅŅийŅŅ `request.scope` â ŅŅĐž ĐŋŅĐžŅŅĐž Python-`dict`, ŅОдĐĩŅĐļаŅиК ĐŧĐĩŅадаĐŊĐŊŅĐĩ, ŅвŅСаĐŊĐŊŅĐĩ Ņ HTTP-СаĐŋŅĐžŅĐžĐŧ.
+
+ĐŖ `Request` ŅаĐēĐļĐĩ ĐĩŅŅŅ `request.receive` â ŅŅĐŊĐēŅĐ¸Ņ Đ´ĐģŅ ÂĢĐŋĐžĐģŅŅĐĩĐŊиŅÂģ ŅĐĩĐģа СаĐŋŅĐžŅа.
+
+Đ `dict` `scope`, и ŅŅĐŊĐēŅĐ¸Ņ `receive` ŅвĐģŅŅŅŅŅ ŅаŅŅŅŅ ŅĐŋĐĩŅиŅиĐēаŅии ASGI.
+
+ĐĐŧĐĩĐŊĐŊĐž ŅŅиŅ
двŅŅ
ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅОв â `scope` и `receive` â Đ´ĐžŅŅаŅĐžŅĐŊĐž, ŅŅĐžĐąŅ ŅОСдаŅŅ ĐŊОвŅĐš ŅĐēСĐĩĐŧĐŋĐģŅŅ `Request`.
+
+ЧŅĐžĐąŅ ŅСĐŊаŅŅ ĐąĐžĐģŅŅĐĩ Đž `Request`, ŅĐŧ. Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ Starlette Đž СаĐŋŅĐžŅаŅ
.
+
+///
+
+ĐдиĐŊŅŅвĐĩĐŊĐŊĐžĐĩ, ŅŅĐž Đ´ĐĩĐģаĐĩŅ ĐŋĐž-Đ´ŅŅĐŗĐžĐŧŅ ŅŅĐŊĐēŅиŅ, вОСвŅаŅŅĐŊĐŊĐ°Ņ `GzipRequest.get_route_handler`, â ĐŋŅĐĩОйŅаСŅĐĩŅ `Request` в `GzipRequest`.
+
+ĐĐģĐ°ĐŗĐžĐ´Đ°ŅŅ ŅŅĐžĐŧŅ ĐŊĐ°Ņ `GzipRequest` ĐŋОСайОŅиŅŅŅ Đž ŅаŅĐŋаĐēОвĐēĐĩ даĐŊĐŊŅŅ
(ĐŋŅи ĐŊĐĩОйŅ
ОдиĐŧĐžŅŅи) Đ´Đž ĐŋĐĩŅĐĩдаŅи иŅ
в ĐŊаŅи *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*.
+
+ĐаĐģŅŅĐĩ вŅŅ ĐģĐžĐŗĐ¸Đēа ОйŅайОŅĐēи ĐžŅŅаŅŅŅŅ ĐŋŅĐĩĐļĐŊĐĩĐš.
+
+ĐĐž ĐąĐģĐ°ĐŗĐžĐ´Đ°ŅŅ Đ¸ĐˇĐŧĐĩĐŊĐĩĐŊиŅĐŧ в `GzipRequest.body` ŅĐĩĐģĐž СаĐŋŅĐžŅа ĐąŅĐ´ĐĩŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēи ŅаŅĐŋаĐēОваĐŊĐž ĐŋŅи ĐŊĐĩОйŅ
ОдиĐŧĐžŅŅи, ĐēĐžĐŗĐ´Đ° ĐžĐŊĐž ĐąŅĐ´ĐĩŅ ĐˇĐ°ĐŗŅŅĐļĐĩĐŊĐž **FastAPI**.
+
+## ĐĐžŅŅŅĐŋ Đē ŅĐĩĐģŅ ĐˇĐ°ĐŋŅĐžŅа в ОйŅайОŅŅиĐēĐĩ иŅĐēĐģŅŅĐĩĐŊиК { #accessing-the-request-body-in-an-exception-handler }
+
+/// tip | ХОвĐĩŅ
+
+ĐĐģŅ ŅĐĩŅĐĩĐŊĐ¸Ņ ŅŅОК СадаŅи, вĐĩŅĐžŅŅĐŊĐž, ĐŊаĐŧĐŊĐžĐŗĐž ĐŋŅĐžŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ `body` в ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēĐžĐŧ ОйŅайОŅŅиĐēĐĩ `RequestValidationError` ([ĐĐąŅайОŅĐēа ĐžŅийОĐē](../tutorial/handling-errors.md#use-the-requestvalidationerror-body){.internal-link target=_blank}).
+
+ĐĐž ŅŅĐžŅ ĐŋŅиĐŧĐĩŅ Đ˛ŅŅ ŅавĐŊĐž аĐēŅŅаĐģĐĩĐŊ и ĐŋĐžĐēаСŅваĐĩŅ, ĐēаĐē вСаиĐŧОдĐĩĐšŅŅвОваŅŅ Ņ Đ˛ĐŊŅŅŅĐĩĐŊĐŊиĐŧи ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅаĐŧи.
+
+///
+
+ĐĸĐĩĐŧ ĐļĐĩ ĐŋОдŅ
ОдОĐŧ ĐŧĐžĐļĐŊĐž вОŅĐŋĐžĐģŅСОваŅŅŅŅ, ŅŅĐžĐąŅ ĐŋĐžĐģŅŅиŅŅ Đ´ĐžŅŅŅĐŋ Đē ŅĐĩĐģŅ ĐˇĐ°ĐŋŅĐžŅа в ОйŅайОŅŅиĐēĐĩ иŅĐēĐģŅŅĐĩĐŊиК.
+
+ĐŅĐļĐŊĐž ĐģиŅŅ ĐžĐąŅайОŅаŅŅ ĐˇĐ°ĐŋŅĐžŅ Đ˛ĐŊŅŅŅи ĐąĐģĐžĐēа `try`/`except`:
+
+{* ../../docs_src/custom_request_and_route/tutorial002.py hl[13,15] *}
+
+ĐŅĐģи ĐŋŅОиСОКдŅŅ Đ¸ŅĐēĐģŅŅĐĩĐŊиĐĩ, ŅĐēСĐĩĐŧĐŋĐģŅŅ `Request` вŅŅ ĐĩŅŅ ĐąŅĐ´ĐĩŅ Đ˛ ОйĐģаŅŅи видиĐŧĐžŅŅи, ĐŋĐžŅŅĐžĐŧŅ ĐŧŅ ŅĐŧĐžĐļĐĩĐŧ ĐŋŅĐžŅиŅаŅŅ ŅĐĩĐģĐž СаĐŋŅĐžŅа и иŅĐŋĐžĐģŅСОваŅŅ ĐĩĐŗĐž ĐŋŅи ОйŅайОŅĐēĐĩ ĐžŅийĐēи:
+
+{* ../../docs_src/custom_request_and_route/tutorial002.py hl[16:18] *}
+
+## ĐĐžĐģŅСОваŅĐĩĐģŅŅĐēиК ĐēĐģаŅŅ `APIRoute` в ŅĐžŅŅĐĩŅĐĩ { #custom-apiroute-class-in-a-router }
+
+ĐŅ ŅаĐēĐļĐĩ ĐŧĐžĐļĐĩŅĐĩ СадаŅŅ ĐŋаŅаĐŧĐĩŅŅ `route_class` Ņ `APIRouter`:
+
+{* ../../docs_src/custom_request_and_route/tutorial003.py hl[26] *}
+
+Đ ŅŅĐžĐŧ ĐŋŅиĐŧĐĩŅĐĩ *ĐžĐŋĐĩŅаŅии ĐŋŅŅи*, ОйŅŅвĐģĐĩĐŊĐŊŅĐĩ в `router`, ĐąŅĐ´ŅŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиК ĐēĐģаŅŅ `TimedRoute` и ĐŋĐžĐģŅŅĐ°Ņ Đ´ĐžĐŋĐžĐģĐŊиŅĐĩĐģŅĐŊŅĐš HTTP-ĐˇĐ°ĐŗĐžĐģОвОĐē `X-Response-Time` в ĐžŅвĐĩŅĐĩ Ņ Đ˛ŅĐĩĐŧĐĩĐŊĐĩĐŧ, СаŅŅаŅĐĩĐŊĐŊŅĐŧ ĐŊа ŅĐžŅĐŧиŅОваĐŊиĐĩ ĐžŅвĐĩŅа:
+
+{* ../../docs_src/custom_request_and_route/tutorial003.py hl[13:20] *}
diff --git a/docs/ru/docs/how-to/extending-openapi.md b/docs/ru/docs/how-to/extending-openapi.md
new file mode 100644
index 000000000..2897fb89b
--- /dev/null
+++ b/docs/ru/docs/how-to/extending-openapi.md
@@ -0,0 +1,80 @@
+# РаŅŅиŅĐĩĐŊиĐĩ OpenAPI { #extending-openapi }
+
+ĐĐŊĐžĐŗĐ´Đ° ĐŧĐžĐļĐĩŅ ĐŋĐžĐŊадОйиŅŅŅŅ Đ¸ĐˇĐŧĐĩĐŊиŅŅ ŅĐŗĐĩĐŊĐĩŅиŅОваĐŊĐŊŅŅ ŅŅ
ĐĩĐŧŅ OpenAPI.
+
+Đ ŅŅĐžĐŧ ŅаСдĐĩĐģĐĩ ĐŋĐžĐēаСаĐŊĐž, ĐēаĐē ŅŅĐž ŅĐ´ĐĩĐģаŅŅ.
+
+## ĐĐąŅŅĐŊŅĐš ĐŋŅĐžŅĐĩŅŅ { #the-normal-process }
+
+ĐĐąŅŅĐŊŅĐš (ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ) ĐŋŅĐžŅĐĩŅŅ Đ˛ŅĐŗĐģŅĐ´Đ¸Ņ ŅаĐē.
+
+ĐŅиĐģĐžĐļĐĩĐŊиĐĩ `FastAPI` (ŅĐēСĐĩĐŧĐŋĐģŅŅ) иĐŧĐĩĐĩŅ ĐŧĐĩŅОд `.openapi()`, ĐēĐžŅĐžŅŅĐš Đ´ĐžĐģĐļĐĩĐŊ вОСвŅаŅаŅŅ ŅŅ
ĐĩĐŧŅ OpenAPI.
+
+Đ ĐŋŅĐžŅĐĩŅŅĐĩ ŅОСдаĐŊĐ¸Ņ ĐžĐąŅĐĩĐēŅа ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ ŅĐĩĐŗĐ¸ŅŅŅиŅŅĐĩŅŅŅ *ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи* (ОйŅайОŅŅиĐē ĐŋŅŅи) Đ´ĐģŅ `/openapi.json` (иĐģи Đ´ĐģŅ ŅĐžĐŗĐž, ŅŅĐž ŅĐēаСаĐŊĐž в ваŅĐĩĐŧ `openapi_url`).
+
+ĐĐŊа ĐŋŅĐžŅŅĐž вОСвŅаŅаĐĩŅ JSON-ĐžŅвĐĩŅ Ņ ŅĐĩСŅĐģŅŅаŅĐžĐŧ вŅСОва ĐŧĐĩŅОда ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ `.openapi()`.
+
+ĐĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ ĐŧĐĩŅОд `.openapi()` ĐŋŅОвĐĩŅŅĐĩŅ ŅвОКŅŅвО `.openapi_schema`: ĐĩŅĐģи в ĐŊŅĐŧ ŅĐļĐĩ ĐĩŅŅŅ Đ´Đ°ĐŊĐŊŅĐĩ, вОСвŅаŅаĐĩŅ Đ¸Ņ
.
+
+ĐŅĐģи ĐŊĐĩŅ â ĐŗĐĩĐŊĐĩŅиŅŅĐĩŅ ŅŅ
ĐĩĐŧŅ Ņ ĐŋĐžĐŧĐžŅŅŅ Đ˛ŅĐŋĐžĐŧĐžĐŗĐ°ŅĐĩĐģŅĐŊОК ŅŅĐŊĐēŅии `fastapi.openapi.utils.get_openapi`.
+
+ФŅĐŊĐēŅĐ¸Ņ `get_openapi()` ĐŋŅиĐŊиĐŧаĐĩŅ ĐŋаŅаĐŧĐĩŅŅŅ:
+
+* `title`: ĐĐ°ĐŗĐžĐģОвОĐē OpenAPI, ĐžŅОйŅаĐļаĐĩŅŅŅ Đ˛ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии.
+* `version`: ĐĐĩŅŅĐ¸Ņ Đ˛Đ°ŅĐĩĐŗĐž API, ĐŊаĐŋŅиĐŧĐĩŅ `2.5.0`.
+* `openapi_version`: ĐĐĩŅŅĐ¸Ņ Đ¸ŅĐŋĐžĐģŅСŅĐĩĐŧОК ŅĐŋĐĩŅиŅиĐēаŅии OpenAPI. ĐĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ â ĐŋĐžŅĐģĐĩĐ´ĐŊŅŅ: `3.1.0`.
+* `summary`: ĐŅаŅĐēĐžĐĩ ĐžĐŋиŅаĐŊиĐĩ API.
+* `description`: ĐĐŋиŅаĐŊиĐĩ ваŅĐĩĐŗĐž API; ĐŧĐžĐļĐĩŅ Đ˛ĐēĐģŅŅаŅŅ Markdown и ĐąŅĐ´ĐĩŅ ĐžŅОйŅаĐļаĐĩŅŅŅ Đ˛ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии.
+* `routes`: ĐĄĐŋиŅĐžĐē ĐŧаŅŅŅŅŅОв â ŅŅĐž ĐēаĐļĐ´Đ°Ņ ĐˇĐ°ŅĐĩĐŗĐ¸ŅŅŅиŅОваĐŊĐŊĐ°Ņ *ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи*. ĐĐĩŅŅŅŅŅ Đ¸Đˇ `app.routes`.
+
+/// info | ĐĐŊŅĐžŅĐŧаŅиŅ
+
+ĐаŅаĐŧĐĩŅŅ `summary` Đ´ĐžŅŅŅĐŋĐĩĐŊ в OpenAPI 3.1.0 и вŅŅĐĩ, ĐŋОддĐĩŅĐļиваĐĩŅŅŅ FastAPI вĐĩŅŅии 0.99.0 и вŅŅĐĩ.
+
+///
+
+## ĐĐĩŅĐĩĐžĐŋŅĐĩĐ´ĐĩĐģĐĩĐŊиĐĩ СĐŊаŅĐĩĐŊиК ĐŋĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ { #overriding-the-defaults }
+
+ĐŅĐŋĐžĐģŅСŅŅ Đ¸ĐŊŅĐžŅĐŧаŅĐ¸Ņ Đ˛ŅŅĐĩ, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅОК ĐļĐĩ вŅĐŋĐžĐŧĐžĐŗĐ°ŅĐĩĐģŅĐŊОК ŅŅĐŊĐēŅиĐĩĐš ŅĐŗĐĩĐŊĐĩŅиŅОваŅŅ ŅŅ
ĐĩĐŧŅ OpenAPI и ĐŋĐĩŅĐĩĐžĐŋŅĐĩĐ´ĐĩĐģиŅŅ ĐģŅĐąŅĐĩ ĐŊŅĐļĐŊŅĐĩ ŅаŅŅи.
+
+ĐаĐŋŅиĐŧĐĩŅ, дОйавиĐŧ ŅаŅŅиŅĐĩĐŊиĐĩ OpenAPI ReDoc Đ´ĐģŅ Đ˛ĐēĐģŅŅĐĩĐŊĐ¸Ņ ŅОйŅŅвĐĩĐŊĐŊĐžĐŗĐž ĐģĐžĐŗĐžŅиĐŋа.
+
+### ĐĐąŅŅĐŊŅĐš **FastAPI** { #normal-fastapi }
+
+ĐĄĐŊаŅаĐģа ĐŊаĐŋиŅиŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ **FastAPI** ĐēаĐē ОйŅŅĐŊĐž:
+
+{* ../../docs_src/extending_openapi/tutorial001.py hl[1,4,7:9] *}
+
+### ĐĄĐŗĐĩĐŊĐĩŅиŅŅĐšŅĐĩ ŅŅ
ĐĩĐŧŅ OpenAPI { #generate-the-openapi-schema }
+
+ĐаŅĐĩĐŧ иŅĐŋĐžĐģŅСŅĐšŅĐĩ ŅŅ ĐļĐĩ вŅĐŋĐžĐŧĐžĐŗĐ°ŅĐĩĐģŅĐŊŅŅ ŅŅĐŊĐēŅĐ¸Ņ Đ´ĐģŅ ĐŗĐĩĐŊĐĩŅаŅии ŅŅ
ĐĩĐŧŅ OpenAPI вĐŊŅŅŅи ŅŅĐŊĐēŅии `custom_openapi()`:
+
+{* ../../docs_src/extending_openapi/tutorial001.py hl[2,15:21] *}
+
+### ĐСĐŧĐĩĐŊиŅĐĩ ŅŅ
ĐĩĐŧŅ OpenAPI { #modify-the-openapi-schema }
+
+ĐĸĐĩĐŋĐĩŅŅ ĐŧĐžĐļĐŊĐž дОйавиŅŅ ŅаŅŅиŅĐĩĐŊиĐĩ ReDoc, дОйавив ĐēаŅŅĐžĐŧĐŊŅĐš `x-logo` в ÂĢОйŅĐĩĐēŅÂģ `info` в ŅŅ
ĐĩĐŧĐĩ OpenAPI:
+
+{* ../../docs_src/extending_openapi/tutorial001.py hl[22:24] *}
+
+### ĐŅŅиŅŅĐšŅĐĩ ŅŅ
ĐĩĐŧŅ OpenAPI { #cache-the-openapi-schema }
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ иŅĐŋĐžĐģŅСОваŅŅ ŅвОКŅŅвО `.openapi_schema` ĐēаĐē ÂĢĐēŅŅÂģ Đ´ĐģŅ Ņ
ŅаĐŊĐĩĐŊĐ¸Ņ ŅĐŗĐĩĐŊĐĩŅиŅОваĐŊĐŊОК ŅŅ
ĐĩĐŧŅ.
+
+ĐĸаĐē ĐŋŅиĐģĐžĐļĐĩĐŊĐ¸Ņ ĐŊĐĩ ĐŋŅидŅŅŅŅ ĐŗĐĩĐŊĐĩŅиŅОваŅŅ ŅŅ
ĐĩĐŧŅ ĐēаĐļĐ´ŅĐš ŅаС, ĐēĐžĐŗĐ´Đ° ĐŋĐžĐģŅСОваŅĐĩĐģŅ ĐžŅĐēŅŅваĐĩŅ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ API.
+
+ĐĐŊа ĐąŅĐ´ĐĩŅ ŅОСдаĐŊа ОдиĐŊ ŅаС, а СаŅĐĩĐŧ ŅĐžŅ ĐļĐĩ ĐēŅŅиŅОваĐŊĐŊŅĐš ваŅиаĐŊŅ ĐąŅĐ´ĐĩŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅŅŅ Đ´ĐģŅ ĐŋĐžŅĐģĐĩĐ´ŅŅŅиŅ
СаĐŋŅĐžŅОв.
+
+{* ../../docs_src/extending_openapi/tutorial001.py hl[13:14,25:26] *}
+
+### ĐĐĩŅĐĩĐžĐŋŅĐĩĐ´ĐĩĐģиŅĐĩ ĐŧĐĩŅОд { #override-the-method }
+
+ĐĸĐĩĐŋĐĩŅŅ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ СаĐŧĐĩĐŊиŅŅ ĐŧĐĩŅОд `.openapi()` ĐŊа ваŅŅ ĐŊОвŅŅ ŅŅĐŊĐēŅиŅ.
+
+{* ../../docs_src/extending_openapi/tutorial001.py hl[29] *}
+
+### ĐŅОвĐĩŅŅŅĐĩ { #check-it }
+
+ĐĐĩŅĐĩКдиŅĐĩ ĐŊа http://127.0.0.1:8000/redoc â Đ˛Ņ ŅвидиŅĐĩ, ŅŅĐž иŅĐŋĐžĐģŅСŅĐĩŅŅŅ Đ˛Đ°Ņ ĐēаŅŅĐžĐŧĐŊŅĐš ĐģĐžĐŗĐžŅиĐŋ (в ŅŅĐžĐŧ ĐŋŅиĐŧĐĩŅĐĩ â ĐģĐžĐŗĐžŅиĐŋ **FastAPI**):
+
+
diff --git a/docs/ru/docs/how-to/general.md b/docs/ru/docs/how-to/general.md
new file mode 100644
index 000000000..029ea1d27
--- /dev/null
+++ b/docs/ru/docs/how-to/general.md
@@ -0,0 +1,39 @@
+# ĐĐąŅĐĩĐĩ â ĐаĐē ŅĐ´ĐĩĐģаŅŅ â Đ ĐĩŅĐĩĐŋŅŅ { #general-how-to-recipes }
+
+ĐĐ´ĐĩŅŅ ĐŊĐĩŅĐēĐžĐģŅĐēĐž ŅĐēаСаŅĐĩĐģĐĩĐš ĐŊа Đ´ŅŅĐŗĐ¸Đĩ ĐŧĐĩŅŅа в Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии Đ´ĐģŅ ĐžĐąŅиŅ
иĐģи ŅаŅŅŅŅ
вОĐŋŅĐžŅОв.
+
+## ФиĐģŅŅŅаŅĐ¸Ņ Đ´Đ°ĐŊĐŊŅŅ
â ĐĐĩСОĐŋаŅĐŊĐžŅŅŅ { #filter-data-security }
+
+ЧŅĐžĐąŅ ŅĐąĐĩдиŅŅŅŅ, ŅŅĐž Đ˛Ņ ĐŊĐĩ вОСвŅаŅаĐĩŅĐĩ йОĐģŅŅĐĩ даĐŊĐŊŅŅ
, ŅĐĩĐŧ ŅĐģĐĩĐ´ŅĐĩŅ, ĐŋŅĐžŅиŅаКŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиŅ: [Đ ŅĐēОвОдŅŅвО â ĐОдĐĩĐģŅ ĐžŅвĐĩŅа â ĐОСвŅаŅаĐĩĐŧŅĐš ŅиĐŋ](../tutorial/response-model.md){.internal-link target=_blank}.
+
+## ĐĸĐĩĐŗĐ¸ в Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии â OpenAPI { #documentation-tags-openapi }
+
+ЧŅĐžĐąŅ Đ´ĐžĐąĐ°Đ˛Đ¸ŅŅ ŅĐĩĐŗĐ¸ Đē ваŅиĐŧ *ĐžĐŋĐĩŅаŅиŅĐŧ ĐŋŅŅи* и ĐŗŅŅĐŋĐŋиŅОваŅŅ Đ¸Ņ
в иĐŊŅĐĩŅŅĐĩĐšŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии, ĐŋŅĐžŅиŅаКŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиŅ: [Đ ŅĐēОвОдŅŅвО â ĐĐžĐŊŅĐ¸ĐŗŅŅаŅии ĐžĐŋĐĩŅаŅиК ĐŋŅŅи â ĐĸĐĩĐŗĐ¸](../tutorial/path-operation-configuration.md#tags){.internal-link target=_blank}.
+
+## ĐŅаŅĐēĐžĐĩ ĐžĐŋиŅаĐŊиĐĩ и ĐžĐŋиŅаĐŊиĐĩ в Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии â OpenAPI { #documentation-summary-and-description-openapi }
+
+ЧŅĐžĐąŅ Đ´ĐžĐąĐ°Đ˛Đ¸ŅŅ ĐēŅаŅĐēĐžĐĩ ĐžĐŋиŅаĐŊиĐĩ и ĐžĐŋиŅаĐŊиĐĩ Đē ваŅиĐŧ *ĐžĐŋĐĩŅаŅиŅĐŧ ĐŋŅŅи* и ĐžŅОйŅаСиŅŅ Đ¸Ņ
в иĐŊŅĐĩŅŅĐĩĐšŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии, ĐŋŅĐžŅиŅаКŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиŅ: [Đ ŅĐēОвОдŅŅвО â ĐĐžĐŊŅĐ¸ĐŗŅŅаŅии ĐžĐŋĐĩŅаŅиК ĐŋŅŅи â ĐŅаŅĐēĐžĐĩ ĐžĐŋиŅаĐŊиĐĩ и ĐžĐŋиŅаĐŊиĐĩ](../tutorial/path-operation-configuration.md#summary-and-description){.internal-link target=_blank}.
+
+## ĐĐŋиŅаĐŊиĐĩ ĐžŅвĐĩŅа в Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии â OpenAPI { #documentation-response-description-openapi }
+
+ЧŅĐžĐąŅ ĐˇĐ°Đ´Đ°ŅŅ ĐžĐŋиŅаĐŊиĐĩ ĐžŅвĐĩŅа, ĐžŅОйŅаĐļаĐĩĐŧĐžĐĩ в иĐŊŅĐĩŅŅĐĩĐšŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии, ĐŋŅĐžŅиŅаКŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиŅ: [Đ ŅĐēОвОдŅŅвО â ĐĐžĐŊŅĐ¸ĐŗŅŅаŅии ĐžĐŋĐĩŅаŅиК ĐŋŅŅи â ĐĐŋиŅаĐŊиĐĩ ĐžŅвĐĩŅа](../tutorial/path-operation-configuration.md#response-description){.internal-link target=_blank}.
+
+## ĐĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ â ĐŋĐžĐŧĐĩŅиŅŅ ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи ŅŅŅаŅĐĩвŅĐĩĐš â OpenAPI { #documentation-deprecate-a-path-operation-openapi }
+
+ЧŅĐžĐąŅ ĐŋĐžĐŧĐĩŅиŅŅ *ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи* ĐēаĐē ŅŅŅаŅĐĩвŅŅŅ Đ¸ ĐŋĐžĐēаСаŅŅ ŅŅĐž в иĐŊŅĐĩŅŅĐĩĐšŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии, ĐŋŅĐžŅиŅаКŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиŅ: [Đ ŅĐēОвОдŅŅвО â ĐĐžĐŊŅĐ¸ĐŗŅŅаŅии ĐžĐŋĐĩŅаŅиК ĐŋŅŅи â ĐĐžĐŧĐĩŅиŅŅ ĐžĐŋĐĩŅаŅĐ¸Ņ ĐŋŅŅи ŅŅŅаŅĐĩвŅĐĩĐš](../tutorial/path-operation-configuration.md#deprecate-a-path-operation){.internal-link target=_blank}.
+
+## ĐŅĐĩОйŅаСОваĐŊиĐĩ ĐģŅĐąŅŅ
даĐŊĐŊŅŅ
Đē ŅĐžŅĐŧаŅŅ, ŅОвĐŧĐĩŅŅиĐŧĐžĐŧŅ Ņ JSON { #convert-any-data-to-json-compatible }
+
+ЧŅĐžĐąŅ ĐŋŅĐĩОйŅаСОваŅŅ ĐģŅĐąŅĐĩ даĐŊĐŊŅĐĩ Đē ŅĐžŅĐŧаŅŅ, ŅОвĐŧĐĩŅŅиĐŧĐžĐŧŅ Ņ JSON, ĐŋŅĐžŅиŅаКŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиŅ: [Đ ŅĐēОвОдŅŅвО â JSON-ŅОвĐŧĐĩŅŅиĐŧŅĐš ĐēОдиŅОвŅиĐē](../tutorial/encoder.md){.internal-link target=_blank}.
+
+## ĐĐĩŅадаĐŊĐŊŅĐĩ OpenAPI â ĐĐžĐēŅĐŧĐĩĐŊŅаŅĐ¸Ņ { #openapi-metadata-docs }
+
+ЧŅĐžĐąŅ Đ´ĐžĐąĐ°Đ˛Đ¸ŅŅ ĐŧĐĩŅадаĐŊĐŊŅĐĩ в ваŅŅ ŅŅ
ĐĩĐŧŅ OpenAPI, вĐēĐģŅŅĐ°Ņ ĐģиŅĐĩĐŊСиŅ, вĐĩŅŅиŅ, ĐēĐžĐŊŅаĐēŅŅ Đ¸ Ņ.Đ´., ĐŋŅĐžŅиŅаКŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиŅ: [Đ ŅĐēОвОдŅŅвО â ĐĐĩŅадаĐŊĐŊŅĐĩ и URL Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии](../tutorial/metadata.md){.internal-link target=_blank}.
+
+## ĐĐžĐģŅСОваŅĐĩĐģŅŅĐēиК URL OpenAPI { #openapi-custom-url }
+
+ЧŅĐžĐąŅ ĐŊаŅŅŅОиŅŅ URL OpenAPI (иĐģи ŅдаĐģиŅŅ ĐĩĐŗĐž), ĐŋŅĐžŅиŅаКŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиŅ: [Đ ŅĐēОвОдŅŅвО â ĐĐĩŅадаĐŊĐŊŅĐĩ и URL Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии](../tutorial/metadata.md#openapi-url){.internal-link target=_blank}.
+
+## URL Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии OpenAPI { #openapi-docs-urls }
+
+ЧŅĐžĐąŅ Đ¸ĐˇĐŧĐĩĐŊиŅŅ URL, иŅĐŋĐžĐģŅСŅĐĩĐŧŅĐĩ Đ´ĐģŅ Đ°Đ˛ŅĐžĐŧаŅиŅĐĩŅĐēи ŅĐŗĐĩĐŊĐĩŅиŅОваĐŊĐŊŅŅ
ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиŅ
иĐŊŅĐĩŅŅĐĩĐšŅОв Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии, ĐŋŅĐžŅиŅаКŅĐĩ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиŅ: [Đ ŅĐēОвОдŅŅвО â ĐĐĩŅадаĐŊĐŊŅĐĩ и URL Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии](../tutorial/metadata.md#docs-urls){.internal-link target=_blank}.
diff --git a/docs/ru/docs/how-to/graphql.md b/docs/ru/docs/how-to/graphql.md
new file mode 100644
index 000000000..9ed6d95ca
--- /dev/null
+++ b/docs/ru/docs/how-to/graphql.md
@@ -0,0 +1,60 @@
+# GraphQL { #graphql }
+
+ĐĸаĐē ĐēаĐē **FastAPI** ĐžŅĐŊОваĐŊ ĐŊа ŅŅаĐŊдаŅŅĐĩ **ASGI**, ĐžŅĐĩĐŊŅ ĐģĐĩĐŗĐēĐž иĐŊŅĐĩĐŗŅиŅОваŅŅ ĐģŅĐąŅŅ ĐąĐ¸ĐąĐģиОŅĐĩĐēŅ **GraphQL**, ŅаĐēĐļĐĩ ŅОвĐŧĐĩŅŅиĐŧŅŅ Ņ ASGI.
+
+ĐŅ ĐŧĐžĐļĐĩŅĐĩ ĐēĐžĐŧйиĐŊиŅОваŅŅ ĐžĐąŅŅĐŊŅĐĩ *ĐžĐŋĐĩŅаŅии ĐŋŅŅи* FastAPI Ņ GraphQL в ОдĐŊĐžĐŧ ĐŋŅиĐģĐžĐļĐĩĐŊии.
+
+/// tip | ХОвĐĩŅ
+
+**GraphQL** ŅĐĩŅаĐĩŅ ĐŊĐĩĐēĐžŅĐžŅŅĐĩ ĐžŅĐĩĐŊŅ ŅĐŋĐĩŅиŅиŅĐĩŅĐēиĐĩ СадаŅи.
+
+ĐŖ ĐŊĐĩĐŗĐž ĐĩŅŅŅ ĐēаĐē **ĐŋŅĐĩиĐŧŅŅĐĩŅŅва**, ŅаĐē и **ĐŊĐĩĐ´ĐžŅŅаŅĐēи** ĐŋĐž ŅŅавĐŊĐĩĐŊĐ¸Ņ Ņ ĐžĐąŅŅĐŊŅĐŧи **вĐĩĐą-API**.
+
+ĐŖĐąĐĩдиŅĐĩŅŅ, ŅŅĐž **вŅĐŗĐžĐ´Ņ** Đ´ĐģŅ Đ˛Đ°ŅĐĩĐŗĐž ŅĐģŅŅĐ°Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊĐ¸Ņ ĐŋĐĩŅĐĩвĐĩŅиваŅŅ **ĐŊĐĩĐ´ĐžŅŅаŅĐēи**. đ¤
+
+///
+
+## ĐийĐģиОŅĐĩĐēи GraphQL { #graphql-libraries }
+
+ĐиĐļĐĩ ĐŋŅивĐĩĐ´ĐĩĐŊŅ ĐŊĐĩĐēĐžŅĐžŅŅĐĩ йийĐģиОŅĐĩĐēи **GraphQL** Ņ ĐŋОддĐĩŅĐļĐēОК **ASGI**. ĐŅ
ĐŧĐžĐļĐŊĐž иŅĐŋĐžĐģŅСОваŅŅ Ņ **FastAPI**:
+
+* Strawberry đ
+ * ĐĄ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиĐĩĐš Đ´ĐģŅ FastAPI
+* Ariadne
+ * ĐĄ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиĐĩĐš Đ´ĐģŅ FastAPI
+* Tartiflette
+ * ĐĄ Tartiflette ASGI Đ´ĐģŅ Đ¸ĐŊŅĐĩĐŗŅаŅии Ņ ASGI
+* Graphene
+ * ĐĄ starlette-graphene3
+
+## GraphQL ŅĐž Strawberry { #graphql-with-strawberry }
+
+ĐŅĐģи ваĐŧ ĐŊŅĐļĐŊĐž иĐģи Ņ
ĐžŅĐĩŅŅŅ ŅайОŅаŅŅ Ņ **GraphQL**, **Strawberry** â **ŅĐĩĐēĐžĐŧĐĩĐŊĐ´ŅĐĩĐŧаŅ** йийĐģиОŅĐĩĐēа, ŅаĐē ĐēаĐē ĐĩŅ Đ´Đ¸ĐˇĐ°ĐšĐŊ ĐąĐģиĐļĐĩ вŅĐĩĐŗĐž Đē диСаКĐŊŅ **FastAPI**, вŅŅ ĐžŅĐŊОваĐŊĐž ĐŊа **аĐŊĐŊĐžŅаŅиŅŅ
ŅиĐŋОв**.
+
+РСавиŅиĐŧĐžŅŅи ĐžŅ Đ˛Đ°ŅĐĩĐŗĐž ŅŅĐĩĐŊаŅĐ¸Ņ Đ¸ŅĐŋĐžĐģŅСОваĐŊĐ¸Ņ Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐŋŅĐĩĐ´ĐŋĐžŅĐĩŅŅŅ Đ´ŅŅĐŗŅŅ ĐąĐ¸ĐąĐģиОŅĐĩĐēŅ, ĐŊĐž ĐĩŅĐģи ĐąŅ Đ˛Ņ ŅĐŋŅĐžŅиĐģи ĐŧĐĩĐŊŅ, Ņ, ŅĐēĐžŅĐĩĐĩ вŅĐĩĐŗĐž, ĐŋŅĐĩĐ´ĐģĐžĐļиĐģ ĐąŅ ĐŋĐžĐŋŅОйОваŅŅ **Strawberry**.
+
+ĐĐžŅ ĐŊĐĩйОĐģŅŅОК ĐŋŅиĐŧĐĩŅ ŅĐžĐŗĐž, ĐēаĐē ĐŧĐžĐļĐŊĐž иĐŊŅĐĩĐŗŅиŅОваŅŅ Strawberry Ņ FastAPI:
+
+{* ../../docs_src/graphql/tutorial001.py hl[3,22,25] *}
+
+ĐОдŅОйĐŊĐĩĐĩ Đž Strawberry ĐŧĐžĐļĐŊĐž ŅСĐŊаŅŅ Đ˛ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии Strawberry.
+
+Đ ŅаĐēĐļĐĩ в Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии ĐŋĐž иĐŊŅĐĩĐŗŅаŅии Strawberry Ņ FastAPI.
+
+## ĐŖŅŅаŅĐĩвŅиК `GraphQLApp` иС Starlette { #older-graphqlapp-from-starlette }
+
+Đ ĐŋŅĐĩĐ´ŅĐ´ŅŅиŅ
вĐĩŅŅиŅŅ
Starlette ĐąŅĐģ ĐēĐģаŅŅ `GraphQLApp` Đ´ĐģŅ Đ¸ĐŊŅĐĩĐŗŅаŅии Ņ Graphene.
+
+ĐĐŊ ĐąŅĐģ ОйŅŅвĐģĐĩĐŊ ŅŅŅаŅĐĩвŅиĐŧ в Starlette, ĐŊĐž ĐĩŅĐģи Ņ Đ˛Đ°Ņ ĐĩŅŅŅ ĐēОд, ĐēĐžŅĐžŅŅĐš ĐĩĐŗĐž иŅĐŋĐžĐģŅСОваĐģ, Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ĐģĐĩĐŗĐēĐž **ĐŧĐ¸ĐŗŅиŅОваŅŅ** ĐŊа starlette-graphene3, ĐēĐžŅĐžŅŅĐš ŅĐĩŅаĐĩŅ ŅŅ ĐļĐĩ СадаŅŅ Đ¸ иĐŧĐĩĐĩŅ **ĐŋĐžŅŅи идĐĩĐŊŅиŅĐŊŅĐš иĐŊŅĐĩŅŅĐĩĐšŅ**.
+
+/// tip | ХОвĐĩŅ
+
+ĐŅĐģи ваĐŧ ĐŊŅĐļĐĩĐŊ GraphQL, Ņ Đ˛ŅŅ ĐļĐĩ ŅĐĩĐēĐžĐŧĐĩĐŊĐ´ŅŅ ĐŋĐžŅĐŧĐžŅŅĐĩŅŅ Strawberry, ŅаĐē ĐēаĐē ĐžĐŊ ĐžŅĐŊОваĐŊ ĐŊа аĐŊĐŊĐžŅаŅиŅŅ
ŅиĐŋОв, а ĐŊĐĩ ĐŊа ĐŋĐžĐģŅСОваŅĐĩĐģŅŅĐēиŅ
ĐēĐģаŅŅаŅ
и ŅиĐŋаŅ
.
+
+///
+
+## ĐОдŅОйĐŊĐĩĐĩ { #learn-more }
+
+ĐОдŅОйĐŊĐĩĐĩ Đž **GraphQL** Đ˛Ņ ĐŧĐžĐļĐĩŅĐĩ ŅСĐŊаŅŅ Đ˛ ĐžŅиŅиаĐģŅĐŊОК Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии GraphQL.
+
+ĐĸаĐēĐļĐĩ ĐŧĐžĐļĐŊĐž ĐŋĐžŅиŅаŅŅ ĐąĐžĐģŅŅĐĩ Đž ĐēаĐļдОК иС ŅĐēаСаĐŊĐŊŅŅ
вŅŅĐĩ йийĐģиОŅĐĩĐē ĐŋĐž ĐŋŅивĐĩĐ´ŅĐŊĐŊŅĐŧ ŅŅŅĐģĐēаĐŧ.
diff --git a/docs/ru/docs/how-to/index.md b/docs/ru/docs/how-to/index.md
new file mode 100644
index 000000000..228c125dd
--- /dev/null
+++ b/docs/ru/docs/how-to/index.md
@@ -0,0 +1,13 @@
+# ĐаĐē ŅĐ´ĐĩĐģаŅŅ â Đ ĐĩŅĐĩĐŋŅŅ { #how-to-recipes }
+
+ĐĐ´ĐĩŅŅ Đ˛Ņ ĐŊаКдĐĩŅĐĩ ŅаСĐŊŅĐĩ ŅĐĩŅĐĩĐŋŅŅ Đ¸ ŅŅĐēОвОдŅŅва ÂĢĐēаĐē ŅĐ´ĐĩĐģаŅŅÂģ ĐŋĐž ŅаСĐģиŅĐŊŅĐŧ ŅĐĩĐŧаĐŧ.
+
+ĐĐžĐģŅŅиĐŊŅŅвО иС ŅŅиŅ
идĐĩĐš йОĐģĐĩĐĩ-ĐŧĐĩĐŊĐĩĐĩ ĐŊĐĩСавиŅиĐŧŅ, и в йОĐģŅŅиĐŊŅŅвĐĩ ŅĐģŅŅаĐĩв ваĐŧ ŅŅĐžĐ¸Ņ Đ¸ĐˇŅŅаŅŅ Đ¸Ņ
ŅĐžĐģŅĐēĐž ĐĩŅĐģи ĐžĐŊи ĐŊаĐŋŅŅĐŧŅŅ ĐžŅĐŊĐžŅŅŅŅŅ Đē ваŅĐĩĐŧŅ ĐŋŅĐžĐĩĐēŅŅ.
+
+ĐŅĐģи ŅŅĐž-ŅĐž ĐēаĐļĐĩŅŅŅ Đ¸ĐŊŅĐĩŅĐĩŅĐŊŅĐŧ и ĐŋĐžĐģĐĩСĐŊŅĐŧ Đ´ĐģŅ Đ˛Đ°ŅĐĩĐŗĐž ĐŋŅĐžĐĩĐēŅа, ŅĐŧĐĩĐģĐž иСŅŅаКŅĐĩ; в ĐŋŅĐžŅивĐŊĐžĐŧ ŅĐģŅŅаĐĩ, вĐĩŅĐžŅŅĐŊĐž, ĐŧĐžĐļĐŊĐž ĐŋŅĐžŅŅĐž ĐŋŅĐžĐŋŅŅŅиŅŅ.
+
+/// tip | ХОвĐĩŅ
+
+ĐŅĐģи Đ˛Ņ Ņ
ĐžŅиŅĐĩ иСŅŅиŅŅ FastAPI ŅŅŅŅĐēŅŅŅиŅОваĐŊĐŊĐž (ŅĐĩĐēĐžĐŧĐĩĐŊĐ´ŅĐĩŅŅŅ), вĐŧĐĩŅŅĐž ŅŅĐžĐŗĐž ŅиŅаКŅĐĩ [ĐŖŅĐĩĐąĐŊиĐē â Đ ŅĐēОвОдŅŅвО ĐŋĐžĐģŅСОваŅĐĩĐģŅ](../tutorial/index.md){.internal-link target=_blank} ĐŋĐž ĐŗĐģаваĐŧ.
+
+///
diff --git a/docs/ru/docs/how-to/separate-openapi-schemas.md b/docs/ru/docs/how-to/separate-openapi-schemas.md
new file mode 100644
index 000000000..5b1214016
--- /dev/null
+++ b/docs/ru/docs/how-to/separate-openapi-schemas.md
@@ -0,0 +1,104 @@
+# РаСдĐĩĐģŅŅŅ ŅŅ
ĐĩĐŧŅ OpenAPI Đ´ĐģŅ Đ˛Ņ
Ода и вŅŅ
Ода иĐģи ĐŊĐĩŅ { #separate-openapi-schemas-for-input-and-output-or-not }
+
+ĐŅи иŅĐŋĐžĐģŅСОваĐŊии **Pydantic v2** ŅĐŗĐĩĐŊĐĩŅиŅОваĐŊĐŊŅĐš OpenAPI ŅŅаĐŊОвиŅŅŅ ŅŅŅŅ ĐąĐžĐģĐĩĐĩ ŅĐžŅĐŊŅĐŧ и **ĐēĐžŅŅĐĩĐēŅĐŊŅĐŧ**, ŅĐĩĐŧ ŅаĐŊŅŅĐĩ. đ
+
+Đа ŅаĐŧĐžĐŧ Đ´ĐĩĐģĐĩ, в ĐŊĐĩĐēĐžŅĐžŅŅŅ
ŅĐģŅŅаŅŅ
в OpenAPI ĐąŅĐ´ĐĩŅ Đ´Đ°ĐļĐĩ **двĐĩ JSON ŅŅ
ĐĩĐŧŅ** Đ´ĐģŅ ĐžĐ´ĐŊОК и ŅОК ĐļĐĩ PydanticâĐŧОдĐĩĐģи: Đ´ĐģŅ Đ˛Ņ
Ода и Đ´ĐģŅ Đ˛ŅŅ
Ода â в СавиŅиĐŧĐžŅŅи ĐžŅ ĐŊаĐģиŅĐ¸Ņ **СĐŊаŅĐĩĐŊиК ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ**.
+
+ĐĐžŅĐŧĐžŅŅиĐŧ, ĐēаĐē ŅŅĐž ŅайОŅаĐĩŅ, и ĐēаĐē ŅŅĐž иСĐŧĐĩĐŊиŅŅ ĐŋŅи ĐŊĐĩОйŅ
ОдиĐŧĐžŅŅи.
+
+## PydanticâĐŧОдĐĩĐģи Đ´ĐģŅ Đ˛Ņ
Ода и вŅŅ
Ода { #pydantic-models-for-input-and-output }
+
+ĐŅĐĩĐ´ĐŋĐžĐģĐžĐļиĐŧ, Ņ Đ˛Đ°Ņ ĐĩŅŅŅ PydanticâĐŧОдĐĩĐģŅ ŅĐž СĐŊаŅĐĩĐŊиŅĐŧи ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ, ĐēаĐē СдĐĩŅŅ:
+
+{* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py ln[1:7] hl[7] *}
+
+### ĐОдĐĩĐģŅ Đ´ĐģŅ Đ˛Ņ
Ода { #model-for-input }
+
+ĐŅĐģи иŅĐŋĐžĐģŅСОваŅŅ ŅŅŅ ĐŧОдĐĩĐģŅ ĐēаĐē вŅ
ОдĐŊŅŅ, ĐēаĐē СдĐĩŅŅ:
+
+{* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py ln[1:15] hl[14] *}
+
+âĻŅĐž ĐŋĐžĐģĐĩ `description` **ĐŊĐĩ ĐąŅĐ´ĐĩŅ ĐžĐąŅСаŅĐĩĐģŅĐŊŅĐŧ**, ĐŋĐžŅĐžĐŧŅ ŅŅĐž Ņ ĐŊĐĩĐŗĐž СĐŊаŅĐĩĐŊиĐĩ ĐŋĐž ŅĐŧĐžĐģŅаĐŊĐ¸Ņ `None`.
+
+### ĐŅ
ОдĐŊĐ°Ņ ĐŧОдĐĩĐģŅ Đ˛ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии { #input-model-in-docs }
+
+Đ Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅии ŅŅĐž видĐŊĐž: Ņ ĐŋĐžĐģŅ `description` ĐŊĐĩŅ **ĐēŅаŅĐŊОК СвŅСдОŅĐēи** â ĐžĐŊĐž ĐŊĐĩ ĐžŅĐŧĐĩŅĐĩĐŊĐž ĐēаĐē ОйŅСаŅĐĩĐģŅĐŊĐžĐĩ:
+
+
+
+
+
+
+- Ãlà nà wáēšĖáēšĖbÚ FastAPI, iášŖáēšĖ gÃga, Ãŗ ráģrÚn lÃĄti káģĖ, o yÃĄra lÃĄti kÃŗÃ˛dÚ, Ãŗ sÃŦ ášŖetÃĄn fÃēn iášŖeláģpáģ nà lÃlo -
- - ---- - -**ÃkáģsÃláēšĖ**: https://fastapi.tiangolo.com - -**Orisun KÃŗÃ˛dÚ**: https://github.com/fastapi/fastapi - ---- - -FastAPI jáēšĖ ÃŦgbà lÃŗdÊ, tÃ Ãŗ yÃĄra (iášŖáēš-giga), ÃŦlà nà wáēšĖáēšĖbÚ fÃēn kikáģ à wáģn API páēšĖlÃē Python èyà tÃ Ãŗ da lori à wáģn ÃŦtáģĖkasà à mÃŦ irÃēfáēšĖ Python. - -Ãwáģn áēšya pà tà kÃŦ ni: - -* **à yÃĄra**: IášŖáēš tÃ Ãŗ ga pÃēpáģĖ, tÃ Ãŗ wa ni ibamu páēšĖlÃē **NodeJS** à ti **Go** (áģpáēš si Starlette à ti Pydantic). [áģkan nÃnÃē à wáģn ÃŦlà nà Python ti o yÃĄra jÚláģ ti o wa](#isesi). -* **à yÃĄra lÃĄti kÃŗÃ˛dÚ**: O mu iyara páģ si lÃĄti káģ à wáģn áēšya tuntun kÃŗÃ˛dÚ nipasáēš "Igba ÃŦdÃĄ áģgáģĖrÚn-Ãēn" (i.e. 200%) si "áģĖáģĖdÃērÃēn ÃŦdÃĄ áģgáģĖrÚn-Ãēn" (i.e. 300%). -* **ÃÃŦtáģĖ kÊkerÊ**: O n din aášŖiášŖe ku bi áģgbon ÃŦdÃĄ áģgáģĖrÚn-Ãēn (i.e. 40%) ti eda eniyan (oášŖiášŖáēš kÃŗÃ˛dÚ) fa. * -* **áģgbáģĖn à ti ÃŦmáģĖ**: Atiláēšyin olootu nla. Ãparà nibi gbogbo. ÃkÃŗkÃ˛ dÃáēšĖ nipa wÃwÃĄ ibi tà ÃŦášŖÃ˛ro kÃŗÃ˛dÚ wà . -* **Iráģrun**: A káģ kÃ Ãŗ le ráģrun lÃĄti lo à ti lÃĄti káģ áēškáģ nÃnÃē rè. à mÃĄa fÃēn áģ nà à kÃŗkÃ˛ dÃáēšĖ lÃĄtÄą ka à káģsÃláēš. -* **à kÃēkurÃē nà kikáģ**: à dÃn à tÃēnkáģ à ti à tÃēntÃ˛ kÃŗÃ˛dÚ kÚ. ÃkÊde Ã ášŖÃ yà n káģĖáģĖkan nÃnÃē ráēšĖ nà áģĖpáģĖláģpáģĖ Ã wáģn ÃŦlÃ˛. O ášŖe iranláģwáģ lÃĄti mÃĄ ášŖe nà áģĖpáģĖláģpáģĖ Ã ášŖÃŦášŖe. -* **à lÃĄgbÃĄra**: Ã Å ášŖe à gbÊjÃĄde kÃŗÃ˛dÚ tÃ Ãŗ ášŖetÃĄn fÃēn ÃŦášŖeláģĖpáģĖ. PáēšĖlÃē à káģsÃláēšĖ tÃ Ãŗ mÃĄa ášŖÃ là yÊ ara ráēšĖ fÃēn áēš nà ÃŦbÃĄášŖepáģĖ alÃĄdÃ ÃĄášŖiášŖáēšĖ páēšĖlÃē rè. -* **AjohunÅĄe/ÃtáģĖkasÃ**: à da lori (à ti ibamu ni kikun páēšĖlÃē) à wáģn ÃŦmáģ ajohunÅĄe/ÃŦtáģĖkasà fÃēn à wáģn API: OpenAPI (èyà tà a máģ táēšláēš si Swagger) à ti JSON Schema. - -* iášŖiro yi da lori à wáģn idanwo tà áēšgbáēš ÃŦdà gbà sÃŗkè FastAPI ášŖe, nÃgbà tà wáģn káģ à wáģn ohun elo iášŖeláģpáģ kÃŗÃ˛dÚ páēšĖlÃē ráēš. - -## Ãwáģn onÃgbáģĖwáģĖ - - - -{% if sponsors %} -{% for sponsor in sponsors.gold -%} -async def...uvicorn main:app --reload...email-validator - fÃēn ifáģwáģsi ÃmeèlÃŦ.
-* pydantic-settings - fÃēn ètÃ˛ ÃŦsà kÃŗso.
-* pydantic-extra-types - fÃēn à fikÃēn orÃášŖi lÃĄti láģ páēšĖlÃē Pydantic.
-
-Ãyà tà Starlette Å lÃ˛:
-
-* httpx - NÃlÃ˛ tÃ Ãŗ bÃĄ fáēšĖ lÃĄti láģ `TestClient`.
-* jinja2 - NÃlÃ˛ tÃ Ãŗ bÃĄ fáēšĖ lÃĄti láģ iášŖeto awoášŖe aiyipada.
-* python-multipart - NÃlÃ˛ tÃ Ãŗ bÃĄ fáēšĖ lÃĄti ášŖe à tÃŦláēšĖyÃŦn fÃēn "à yáēšĖwÃ˛" fáģáģmu, páēšĖlÃē `request.form()`.
-* itsdangerous - NÃlÃ˛ fÃēn à tÃŦláēšĖyÃŦn `SessionMiddleware`.
-* pyyaml - NÃlÃ˛ fÃēn à tÃŦláēšĖyÃŦn Starlette's `SchemaGenerator` (Ãŗ ášŖe ášŖe kÃ Ãŗ mÃĄ nÃlÃ˛ ráēšĖ fÃēn FastAPI).
-
-Ãyà tà FastAPI / Starlette Å lÃ˛:
-
-* uvicorn - FÃēn olupin tà yÃŗÃ˛ sáēšĖ à mÃēyáēš Ã ti tà yÃŗÃ˛ ášŖe ÃŦpèsè fÃēn iášŖáēšĖ ráēš tà bà ohun èlÃ˛ ráēš.
-* orjson - NÃlÃ˛ tÃ Ãŗ bÃĄ fáēšĖ lÃĄti láģ `ORJSONResponse`.
-* ujson - NÃlÃ˛ tÃ Ãŗ bÃĄ fáēšĖ lÃĄti láģ `UJSONResponse`.
-
-à lè fi gbogbo à wáģn wáģĖnyà sÃŗrà áēšráģ páēšĖlÃē `pip install "fastapi[all]"`.
-
-## Iwe-aášŖáēš
-
-IášŖáēšĖ yÃŦà ni iwe-aášŖáēš lÃĄbáēšĖ à wáģn Ã˛fin tà iwe-aášŖáēš MIT.
diff --git a/docs/yo/mkdocs.yml b/docs/yo/mkdocs.yml
deleted file mode 100644
index de18856f4..000000000
--- a/docs/yo/mkdocs.yml
+++ /dev/null
@@ -1 +0,0 @@
-INHERIT: ../en/mkdocs.yml
diff --git a/docs/zh-hant/docs/async.md b/docs/zh-hant/docs/async.md
index 6ab75d2ab..09e2bf994 100644
--- a/docs/zh-hant/docs/async.md
+++ b/docs/zh-hant/docs/async.md
@@ -381,7 +381,7 @@ Starlette īŧå **FastAPI**īŧ æ¯åēæŧ GeventãäŊéäēį¨åŧįĸŧčĻæ´éŖäģĨįč§ŖãčĒŋčŠĻåæčã
-å¨čŧčį NodeJS / įčĻŊå¨ JavaScript ä¸īŧäŊ æäŊŋį¨ãååŧãīŧéå¯čŊæå°č´ååŧå°įã
+å¨čŧčį NodeJS / įčĻŊå¨ JavaScript ä¸īŧäŊ æäŊŋį¨ãååŧãīŧéå¯čŊæå°č´âååŧå°įâã
## åį¨
diff --git a/docs/zh-hant/docs/deployment/cloud.md b/docs/zh-hant/docs/deployment/cloud.md
index 29ebe3ff5..426937d3e 100644
--- a/docs/zh-hant/docs/deployment/cloud.md
+++ b/docs/zh-hant/docs/deployment/cloud.md
@@ -10,8 +10,4 @@
éäšåąįžäēäģåå° FastAPI åå
ļ**į¤žįž¤**īŧå
æŦäŊ īŧįįæŖæŋčĢžīŧäģåä¸å
叿įēäŊ æäž**åĒčŗĒįæå**īŧé叿įĸēäŋäŊ ææä¸å**č¯åĨŊä¸åĨåēˇįæĄæļ**īŧFastAPIãđ
-äŊ å¯čŊææŗåčŠĻäģåįæåīŧäģĨ䏿äģåįæåīŧ
-
-* Platform.sh
-* Porter
-* Coherence
+äŊ å¯čŊææŗåčŠĻäģåįæåīŧäģĨ䏿äģåįæå.
diff --git a/docs/zh-hant/docs/index.md b/docs/zh-hant/docs/index.md
index 81d99ede4..168ad5c4c 100644
--- a/docs/zh-hant/docs/index.md
+++ b/docs/zh-hant/docs/index.md
@@ -81,7 +81,7 @@ FastAPI æ¯ä¸åįžäģŖãåŋĢéīŧéĢæčŊīŧį web æĄæļīŧ፿ŧ Python
"_æå° **FastAPI** čåĨŽåžä¸åžäēãåŽå¤ĒæčļŖäēīŧ_"
-textÂģ or ÂĢ`text`Âģ or ÂĢ"text"Âģ, ignore that further markup when deciding if the text is an abbreviation), and if the description (the text inside the title attribute) contains the full phrase for this abbreviation, then append a dash (ÂĢâÂģ) to the full phrase, followed by the translation of the full phrase.
+
+Conversion scheme:
+
+ Source (English):
+
+ {abbreviation}
+
+ Result:
+
+ {abbreviation}
+
+Examples:
+
+ Source (English):
+
+ ÂĢÂĢÂĢ
+ IoT
+ CPU
+ TL;DR:
+ ÂģÂģÂģ
+
+ Result (German):
+
+ ÂĢÂĢÂĢ
+ IoT
+ CPU
+ TL;DR:
+ ÂģÂģÂģ
+
+1.1) If the language to which you translate mostly uses the letters of the ASCII char set (for example Spanish, French, German, but not Russian, Chinese) and if the translation of the full phrase is identical to, or starts with the same letters as the original full phrase, then only give the translation of the full phrase.
+
+Conversion scheme:
+
+ Source (English):
+
+ {abbreviation}
+
+ Result:
+
+ {abbreviation}
+
+Examples:
+
+ Source (English):
+
+ ÂĢÂĢÂĢ
+ JWT
+ Enum
+ ASGI
+ ÂģÂģÂģ
+
+ Result (German):
+
+ ÂĢÂĢÂĢ
+ JWT
+ Enum
+ ASGI
+ ÂģÂģÂģ
+
+2) If the description is not a full phrase for an abbreviation which the abbr element surrounds, but some other information, then just translate the description.
+
+Conversion scheme:
+
+ Source (English):
+
+ {text}
+
+ Result:
+
+ {translation of text}
+
+Examples:
+
+ Source (English):
+
+ ÂĢÂĢÂĢ
+ path
+ linter
+ parsing
+ 0.95.0
+ at the time of writing this
+ ÂģÂģÂģ
+
+ Result (German):
+
+ ÂĢÂĢÂĢ
+ Pfad
+ Linter
+ Parsen
+ 0.95.0
+ zum Zeitpunkt als das hier geschrieben wurde
+ ÂģÂģÂģ
+
+
+3) If the text surrounded by the abbr element is an abbreviation and the description contains both the full phrase for that abbreviation, and other information, separated by a colon (ÂĢ:Âģ), then append a dash (ÂĢâÂģ) and the translation of the full phrase to the original full phrase and translate the other information.
+
+Conversion scheme:
+
+ Source (English):
+
+ {abbreviation}
+
+ Result:
+
+ {abbreviation}
+
+Examples:
+
+ Source (English):
+
+ ÂĢÂĢÂĢ
+ I/O
+ CDN
+ IDE
+ ÂģÂģÂģ
+
+ Result (German):
+
+ ÂĢÂĢÂĢ
+ I/O
+ CDN
+ IDE
+ ÂģÂģÂģ
+
+3.1) Like in rule 2.1, you can leave the original full phrase away, if the translated full phrase is identical or starts with the same letters as the original full phrase.
+
+Conversion scheme:
+
+ Source (English):
+
+ {abbreviation}
+
+ Result:
+
+ {abbreviation}
+
+Example:
+
+ Source (English):
+
+ ÂĢÂĢÂĢ
+ ORM
+ ÂģÂģÂģ
+
+ Result (German):
+
+ ÂĢÂĢÂĢ
+ ORM
+ ÂģÂģÂģ
+
+4) If there is an existing translation, and it has ADDITIONAL abbr elements in a sentence, and these additional abbr elements do not exist in the related sentence in the English text, then KEEP those additional abbr elements in the translation. Do not remove them. Except when you remove the whole sentence from the translation, because the whole sentence was removed from the English text, then also remove the abbr element. The reasoning for this rule is, that such additional abbr elements are manually added by the human editor of the translation, in order to translate or explain an English word to the human readers of the translation. These additional abbr elements would not make sense in the English text, but they do make sense in the translation. So keep them in the translation, even though they are not part of the English text. This rule only applies to abbr elements.
+
+5) Apply above rules also when there is an existing translation! Make sure that all title attributes in abbr elements get properly translated or updated, using the schemes given above. However, leave the ADDITIONAL abbr's from rule 4 alone. Do not change their formatting or content.
-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.
"""
+app = typer.Typer()
+
@lru_cache
def get_langs() -> dict[str, str]:
- return yaml.safe_load(Path("docs/language_names.yml").read_text())
+ return yaml.safe_load(Path("docs/language_names.yml").read_text(encoding="utf-8"))
def generate_lang_path(*, lang: str, path: Path) -> Path:
@@ -46,56 +687,87 @@ def generate_lang_path(*, lang: str, path: Path) -> 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:
+ assert language != "en", (
+ "`en` is the source language, choose another language as translation target"
+ )
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()
+ lang_prompt_content = lang_prompt_path.read_text(encoding="utf-8")
en_docs_path = Path("docs/en/docs")
- assert str(path).startswith(str(en_docs_path)), (
+ assert str(en_path).startswith(str(en_docs_path)), (
f"Path must be inside {en_docs_path}"
)
- out_path = generate_lang_path(lang=lang, path=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(encoding="utf-8")
old_translation: str | None = None
if out_path.exists():
- old_translation = out_path.read_text()
- agent = Agent("openai:gpt-4o")
+ print(f"Found existing translation: {out_path}")
+ old_translation = out_path.read_text(encoding="utf-8")
+ print(f"Translating {en_path} to {language} ({language_name})")
+ agent = Agent("openai:gpt-5")
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.",
+ "There is an existing previous translation for the original English content, that may be outdated.",
+ "Update the translation only where necessary:",
+ "- If the original English content has added parts, also add these parts to the translation.",
+ "- If the original English content has removed parts, also remove them from the translation, unless you were instructed earlier to not do that in specific cases.",
+ "- If parts of the original English content have changed, also change those parts 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 original English content changed.",
+ "- change formatting or whitespace unless absolutely required.",
+ "Only change what must be changed. The goal is to minimize diffs for easier human review.",
+ "UNLESS you were instructed earlier to behave different, there MUST NOT be whole sentences or partial sentences in the updated translation, which are not in the original English content, and there MUST NOT be whole sentences or partial sentences in the original English content, which are not in the updated translation. Remember: the updated translation shall be IN SYNC with the original English content.",
"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"
- out_path.write_text(out_content)
+ out_content = f"{result.output.strip()}\n"
+ print(f"Saving translation to {out_path}")
+ out_path.write_text(out_content, encoding="utf-8", newline="\n")
-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 +791,17 @@ 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():
- if str(path).replace("docs/en/docs/", "").startswith(non_translated_sections):
- continue
- paths_to_process.append(path)
+def iter_en_paths_to_translate() -> Iterable[Path]:
+ en_docs_root = Path("docs/en/docs/")
+ for path in iter_all_en_paths():
+ relpath = path.relative_to(en_docs_root)
+ if not str(relpath).startswith(non_translated_sections):
+ 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 +809,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 +824,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/main.py b/tests/main.py
index 6927eab61..2f1d61711 100644
--- a/tests/main.py
+++ b/tests/main.py
@@ -3,7 +3,12 @@ from typing import FrozenSet, List, Optional
from fastapi import FastAPI, Path, Query
-app = FastAPI()
+external_docs = {
+ "description": "External API documentation.",
+ "url": "https://docs.example.com/api-general",
+}
+
+app = FastAPI(openapi_external_docs=external_docs)
@app.api_route("/api_route")
diff --git a/tests/test_application.py b/tests/test_application.py
index a7d50ea72..8f1b0a18d 100644
--- a/tests/test_application.py
+++ b/tests/test_application.py
@@ -58,6 +58,10 @@ def test_openapi_schema():
assert response.json() == {
"openapi": "3.1.0",
"info": {"title": "FastAPI", "version": "0.1.0"},
+ "externalDocs": {
+ "description": "External API documentation.",
+ "url": "https://docs.example.com/api-general",
+ },
"paths": {
"/api_route": {
"get": {
diff --git a/tests/test_compat.py b/tests/test_compat.py
index f4a3093c5..43c686489 100644
--- a/tests/test_compat.py
+++ b/tests/test_compat.py
@@ -80,6 +80,51 @@ def test_complex():
assert response2.json() == [1, 2]
+@needs_pydanticv2
+def test_propagates_pydantic2_model_config():
+ app = FastAPI()
+
+ class Missing:
+ def __bool__(self):
+ return False
+
+ class EmbeddedModel(BaseModel):
+ model_config = ConfigDict(arbitrary_types_allowed=True)
+ value: Union[str, Missing] = Missing()
+
+ class Model(BaseModel):
+ model_config = ConfigDict(
+ arbitrary_types_allowed=True,
+ )
+ value: Union[str, Missing] = Missing()
+ embedded_model: EmbeddedModel = EmbeddedModel()
+
+ @app.post("/")
+ def foo(req: Model) -> Dict[str, Union[str, None]]:
+ return {
+ "value": req.value or None,
+ "embedded_value": req.embedded_model.value or None,
+ }
+
+ client = TestClient(app)
+
+ response = client.post("/", json={})
+ assert response.status_code == 200, response.text
+ assert response.json() == {
+ "value": None,
+ "embedded_value": None,
+ }
+
+ response2 = client.post(
+ "/", json={"value": "foo", "embedded_model": {"value": "bar"}}
+ )
+ assert response2.status_code == 200, response2.text
+ assert response2.json() == {
+ "value": "foo",
+ "embedded_value": "bar",
+ }
+
+
def test_is_bytes_sequence_annotation_union():
# For coverage
# TODO: in theory this would allow declaring types that could be lists of bytes
diff --git a/tests/test_custom_schema_fields.py b/tests/test_custom_schema_fields.py
index ee51fc7ff..d890291b1 100644
--- a/tests/test_custom_schema_fields.py
+++ b/tests/test_custom_schema_fields.py
@@ -1,7 +1,13 @@
+from typing import Optional
+
from fastapi import FastAPI
from fastapi._compat import PYDANTIC_V2
from fastapi.testclient import TestClient
from pydantic import BaseModel
+from typing_extensions import Annotated
+
+if PYDANTIC_V2:
+ from pydantic import WithJsonSchema
app = FastAPI()
@@ -10,12 +16,17 @@ class Item(BaseModel):
name: str
if PYDANTIC_V2:
+ description: Annotated[
+ Optional[str], WithJsonSchema({"type": ["string", "null"]})
+ ] = None
+
model_config = {
"json_schema_extra": {
"x-something-internal": {"level": 4},
}
}
else:
+ description: Optional[str] = None # type: ignore[no-redef]
class Config:
schema_extra = {
@@ -42,7 +53,11 @@ item_schema = {
"name": {
"title": "Name",
"type": "string",
- }
+ },
+ "description": {
+ "title": "Description",
+ "type": ["string", "null"] if PYDANTIC_V2 else "string",
+ },
},
}
@@ -57,4 +72,4 @@ def test_response():
# For coverage
response = client.get("/foo")
assert response.status_code == 200, response.text
- assert response.json() == {"name": "Foo item"}
+ assert response.json() == {"name": "Foo item", "description": None}
diff --git a/tests/test_dependency_after_yield_raise.py b/tests/test_dependency_after_yield_raise.py
new file mode 100644
index 000000000..b560dc36f
--- /dev/null
+++ b/tests/test_dependency_after_yield_raise.py
@@ -0,0 +1,69 @@
+from typing import Any
+
+import pytest
+from fastapi import Depends, FastAPI, HTTPException
+from fastapi.testclient import TestClient
+from typing_extensions import Annotated
+
+
+class CustomError(Exception):
+ pass
+
+
+def catching_dep() -> Any:
+ try:
+ yield "s"
+ except CustomError as err:
+ raise HTTPException(status_code=418, detail="Session error") from err
+
+
+def broken_dep() -> Any:
+ yield "s"
+ raise ValueError("Broken after yield")
+
+
+app = FastAPI()
+
+
+@app.get("/catching")
+def catching(d: Annotated[str, Depends(catching_dep)]) -> Any:
+ raise CustomError("Simulated error during streaming")
+
+
+@app.get("/broken")
+def broken(d: Annotated[str, Depends(broken_dep)]) -> Any:
+ return {"message": "all good?"}
+
+
+client = TestClient(app)
+
+
+def test_catching():
+ response = client.get("/catching")
+ assert response.status_code == 418
+ assert response.json() == {"detail": "Session error"}
+
+
+def test_broken_raise():
+ with pytest.raises(ValueError, match="Broken after yield"):
+ client.get("/broken")
+
+
+def test_broken_no_raise():
+ """
+ When a dependency with yield raises after the yield (not in an except), the
+ response is already "successfully" sent back to the client, but there's still
+ an error in the server afterwards, an exception is raised and captured or shown
+ in the server logs.
+ """
+ with TestClient(app, raise_server_exceptions=False) as client:
+ response = client.get("/broken")
+ assert response.status_code == 200
+ assert response.json() == {"message": "all good?"}
+
+
+def test_broken_return_finishes():
+ client = TestClient(app, raise_server_exceptions=False)
+ response = client.get("/broken")
+ assert response.status_code == 200
+ assert response.json() == {"message": "all good?"}
diff --git a/tests/test_dependency_after_yield_streaming.py b/tests/test_dependency_after_yield_streaming.py
new file mode 100644
index 000000000..7e1c8822b
--- /dev/null
+++ b/tests/test_dependency_after_yield_streaming.py
@@ -0,0 +1,130 @@
+from contextlib import contextmanager
+from typing import Any, Generator
+
+import pytest
+from fastapi import Depends, FastAPI
+from fastapi.responses import StreamingResponse
+from fastapi.testclient import TestClient
+from typing_extensions import Annotated
+
+
+class Session:
+ def __init__(self) -> None:
+ self.data = ["foo", "bar", "baz"]
+ self.open = True
+
+ def __iter__(self) -> Generator[str, None, None]:
+ for item in self.data:
+ if self.open:
+ yield item
+ else:
+ raise ValueError("Session closed")
+
+
+@contextmanager
+def acquire_session() -> Generator[Session, None, None]:
+ session = Session()
+ try:
+ yield session
+ finally:
+ session.open = False
+
+
+def dep_session() -> Any:
+ with acquire_session() as s:
+ yield s
+
+
+def broken_dep_session() -> Any:
+ with acquire_session() as s:
+ s.open = False
+ yield s
+
+
+SessionDep = Annotated[Session, Depends(dep_session)]
+BrokenSessionDep = Annotated[Session, Depends(broken_dep_session)]
+
+app = FastAPI()
+
+
+@app.get("/data")
+def get_data(session: SessionDep) -> Any:
+ data = list(session)
+ return data
+
+
+@app.get("/stream-simple")
+def get_stream_simple(session: SessionDep) -> Any:
+ def iter_data():
+ yield from ["x", "y", "z"]
+
+ return StreamingResponse(iter_data())
+
+
+@app.get("/stream-session")
+def get_stream_session(session: SessionDep) -> Any:
+ def iter_data():
+ yield from session
+
+ return StreamingResponse(iter_data())
+
+
+@app.get("/broken-session-data")
+def get_broken_session_data(session: BrokenSessionDep) -> Any:
+ return list(session)
+
+
+@app.get("/broken-session-stream")
+def get_broken_session_stream(session: BrokenSessionDep) -> Any:
+ def iter_data():
+ yield from session
+
+ return StreamingResponse(iter_data())
+
+
+client = TestClient(app)
+
+
+def test_regular_no_stream():
+ response = client.get("/data")
+ assert response.json() == ["foo", "bar", "baz"]
+
+
+def test_stream_simple():
+ response = client.get("/stream-simple")
+ assert response.text == "xyz"
+
+
+def test_stream_session():
+ response = client.get("/stream-session")
+ assert response.text == "foobarbaz"
+
+
+def test_broken_session_data():
+ with pytest.raises(ValueError, match="Session closed"):
+ client.get("/broken-session-data")
+
+
+def test_broken_session_data_no_raise():
+ client = TestClient(app, raise_server_exceptions=False)
+ response = client.get("/broken-session-data")
+ assert response.status_code == 500
+ assert response.text == "Internal Server Error"
+
+
+def test_broken_session_stream_raise():
+ # Can raise ValueError on Pydantic v2 and ExceptionGroup on Pydantic v1
+ with pytest.raises((ValueError, Exception)):
+ client.get("/broken-session-stream")
+
+
+def test_broken_session_stream_no_raise():
+ """
+ When a dependency with yield raises after the streaming response already started
+ the 200 status code is already sent, but there's still an error in the server
+ afterwards, an exception is raised and captured or shown in the server logs.
+ """
+ with TestClient(app, raise_server_exceptions=False) as client:
+ response = client.get("/broken-session-stream")
+ assert response.status_code == 200
+ assert response.text == ""
diff --git a/tests/test_dependency_after_yield_websockets.py b/tests/test_dependency_after_yield_websockets.py
new file mode 100644
index 000000000..7c323c338
--- /dev/null
+++ b/tests/test_dependency_after_yield_websockets.py
@@ -0,0 +1,79 @@
+from contextlib import contextmanager
+from typing import Any, Generator
+
+import pytest
+from fastapi import Depends, FastAPI, WebSocket
+from fastapi.testclient import TestClient
+from typing_extensions import Annotated
+
+
+class Session:
+ def __init__(self) -> None:
+ self.data = ["foo", "bar", "baz"]
+ self.open = True
+
+ def __iter__(self) -> Generator[str, None, None]:
+ for item in self.data:
+ if self.open:
+ yield item
+ else:
+ raise ValueError("Session closed")
+
+
+@contextmanager
+def acquire_session() -> Generator[Session, None, None]:
+ session = Session()
+ try:
+ yield session
+ finally:
+ session.open = False
+
+
+def dep_session() -> Any:
+ with acquire_session() as s:
+ yield s
+
+
+def broken_dep_session() -> Any:
+ with acquire_session() as s:
+ s.open = False
+ yield s
+
+
+SessionDep = Annotated[Session, Depends(dep_session)]
+BrokenSessionDep = Annotated[Session, Depends(broken_dep_session)]
+
+app = FastAPI()
+
+
+@app.websocket("/ws")
+async def websocket_endpoint(websocket: WebSocket, session: SessionDep):
+ await websocket.accept()
+ for item in session:
+ await websocket.send_text(f"{item}")
+
+
+@app.websocket("/ws-broken")
+async def websocket_endpoint_broken(websocket: WebSocket, session: BrokenSessionDep):
+ await websocket.accept()
+ for item in session:
+ await websocket.send_text(f"{item}") # pragma no cover
+
+
+client = TestClient(app)
+
+
+def test_websocket_dependency_after_yield():
+ with client.websocket_connect("/ws") as websocket:
+ data = websocket.receive_text()
+ assert data == "foo"
+ data = websocket.receive_text()
+ assert data == "bar"
+ data = websocket.receive_text()
+ assert data == "baz"
+
+
+def test_websocket_dependency_after_yield_broken():
+ with pytest.raises(ValueError, match="Session closed"):
+ with client.websocket_connect("/ws-broken"):
+ pass # pragma no cover
diff --git a/tests/test_dependency_contextmanager.py b/tests/test_dependency_contextmanager.py
index 039c423b9..02c10458c 100644
--- a/tests/test_dependency_contextmanager.py
+++ b/tests/test_dependency_contextmanager.py
@@ -286,12 +286,12 @@ def test_background_tasks():
assert data["context_a"] == "started a"
assert data["bg"] == "not set"
middleware_state = json.loads(response.headers["x-state"])
- assert middleware_state["context_b"] == "finished b with a: started a"
- assert middleware_state["context_a"] == "finished a"
+ assert middleware_state["context_b"] == "started b"
+ assert middleware_state["context_a"] == "started a"
assert middleware_state["bg"] == "not set"
assert state["context_b"] == "finished b with a: started a"
assert state["context_a"] == "finished a"
- assert state["bg"] == "bg set - b: finished b with a: started a - a: finished a"
+ assert state["bg"] == "bg set - b: started b - a: started a"
def test_sync_raise_raises():
@@ -397,7 +397,4 @@ def test_sync_background_tasks():
assert data["sync_bg"] == "not set"
assert state["context_b"] == "finished b with a: started a"
assert state["context_a"] == "finished a"
- assert (
- state["sync_bg"]
- == "sync_bg set - b: finished b with a: started a - a: finished a"
- )
+ assert state["sync_bg"] == "sync_bg set - b: started b - a: started a"
diff --git a/tests/test_dependency_normal_exceptions.py b/tests/test_dependency_yield_except_httpexception.py
similarity index 100%
rename from tests/test_dependency_normal_exceptions.py
rename to tests/test_dependency_yield_except_httpexception.py
diff --git a/tests/test_enforce_once_required_parameter.py b/tests/test_enforce_once_required_parameter.py
index 30329282f..2e5ac6c06 100644
--- a/tests/test_enforce_once_required_parameter.py
+++ b/tests/test_enforce_once_required_parameter.py
@@ -102,7 +102,7 @@ def test_schema():
def test_get_invalid():
response = client.get("/foo")
- assert response.status_code == status.HTTP_422_UNPROCESSABLE_ENTITY
+ assert response.status_code == 422
def test_get_valid():
diff --git a/tests/test_file_and_form_order_issue_9116.py b/tests/test_file_and_form_order_issue_9116.py
new file mode 100644
index 000000000..cb9a31d31
--- /dev/null
+++ b/tests/test_file_and_form_order_issue_9116.py
@@ -0,0 +1,90 @@
+"""
+Regression test, Error 422 if Form is declared before File
+See https://github.com/tiangolo/fastapi/discussions/9116
+"""
+
+from pathlib import Path
+from typing import List
+
+import pytest
+from fastapi import FastAPI, File, Form
+from fastapi.testclient import TestClient
+from typing_extensions import Annotated
+
+app = FastAPI()
+
+
+@app.post("/file_before_form")
+def file_before_form(
+ file: bytes = File(),
+ city: str = Form(),
+):
+ return {"file_content": file, "city": city}
+
+
+@app.post("/file_after_form")
+def file_after_form(
+ city: str = Form(),
+ file: bytes = File(),
+):
+ return {"file_content": file, "city": city}
+
+
+@app.post("/file_list_before_form")
+def file_list_before_form(
+ files: Annotated[List[bytes], File()],
+ city: Annotated[str, Form()],
+):
+ return {"file_contents": files, "city": city}
+
+
+@app.post("/file_list_after_form")
+def file_list_after_form(
+ city: Annotated[str, Form()],
+ files: Annotated[List[bytes], File()],
+):
+ return {"file_contents": files, "city": city}
+
+
+client = TestClient(app)
+
+
+@pytest.fixture
+def tmp_file_1(tmp_path: Path) -> Path:
+ f = tmp_path / "example1.txt"
+ f.write_text("foo")
+ return f
+
+
+@pytest.fixture
+def tmp_file_2(tmp_path: Path) -> Path:
+ f = tmp_path / "example2.txt"
+ f.write_text("bar")
+ return f
+
+
+@pytest.mark.parametrize("endpoint_path", ("/file_before_form", "/file_after_form"))
+def test_file_form_order(endpoint_path: str, tmp_file_1: Path):
+ response = client.post(
+ url=endpoint_path,
+ data={"city": "Thimphou"},
+ files={"file": (tmp_file_1.name, tmp_file_1.read_bytes())},
+ )
+ assert response.status_code == 200, response.text
+ assert response.json() == {"file_content": "foo", "city": "Thimphou"}
+
+
+@pytest.mark.parametrize(
+ "endpoint_path", ("/file_list_before_form", "/file_list_after_form")
+)
+def test_file_list_form_order(endpoint_path: str, tmp_file_1: Path, tmp_file_2: Path):
+ response = client.post(
+ url=endpoint_path,
+ data={"city": "Thimphou"},
+ files=(
+ ("files", (tmp_file_1.name, tmp_file_1.read_bytes())),
+ ("files", (tmp_file_2.name, tmp_file_2.read_bytes())),
+ ),
+ )
+ assert response.status_code == 200, response.text
+ assert response.json() == {"file_contents": ["foo", "bar"], "city": "Thimphou"}
diff --git a/tests/test_get_model_definitions_formfeed_escape.py b/tests/test_get_model_definitions_formfeed_escape.py
new file mode 100644
index 000000000..f77195dc5
--- /dev/null
+++ b/tests/test_get_model_definitions_formfeed_escape.py
@@ -0,0 +1,180 @@
+from typing import Any, Iterator, Set, Type
+
+import fastapi._compat
+import fastapi.openapi.utils
+import pydantic.schema
+import pytest
+from fastapi import FastAPI
+from pydantic import BaseModel
+from starlette.testclient import TestClient
+
+from .utils import needs_pydanticv1
+
+
+class Address(BaseModel):
+ """
+ This is a public description of an Address
+ \f
+ You can't see this part of the docstring, it's private!
+ """
+
+ line_1: str
+ city: str
+ state_province: str
+
+
+class Facility(BaseModel):
+ id: str
+ address: Address
+
+
+app = FastAPI()
+
+client = TestClient(app)
+
+
+@app.get("/facilities/{facility_id}")
+def get_facility(facility_id: str) -> Facility: ...
+
+
+openapi_schema = {
+ "components": {
+ "schemas": {
+ "Address": {
+ # NOTE: the description of this model shows only the public-facing text, before the `\f` in docstring
+ "description": "This is a public description of an Address\n",
+ "properties": {
+ "city": {"title": "City", "type": "string"},
+ "line_1": {"title": "Line 1", "type": "string"},
+ "state_province": {"title": "State Province", "type": "string"},
+ },
+ "required": ["line_1", "city", "state_province"],
+ "title": "Address",
+ "type": "object",
+ },
+ "Facility": {
+ "properties": {
+ "address": {"$ref": "#/components/schemas/Address"},
+ "id": {"title": "Id", "type": "string"},
+ },
+ "required": ["id", "address"],
+ "title": "Facility",
+ "type": "object",
+ },
+ "HTTPValidationError": {
+ "properties": {
+ "detail": {
+ "items": {"$ref": "#/components/schemas/ValidationError"},
+ "title": "Detail",
+ "type": "array",
+ }
+ },
+ "title": "HTTPValidationError",
+ "type": "object",
+ },
+ "ValidationError": {
+ "properties": {
+ "loc": {
+ "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]},
+ "title": "Location",
+ "type": "array",
+ },
+ "msg": {"title": "Message", "type": "string"},
+ "type": {"title": "Error Type", "type": "string"},
+ },
+ "required": ["loc", "msg", "type"],
+ "title": "ValidationError",
+ "type": "object",
+ },
+ }
+ },
+ "info": {"title": "FastAPI", "version": "0.1.0"},
+ "openapi": "3.1.0",
+ "paths": {
+ "/facilities/{facility_id}": {
+ "get": {
+ "operationId": "get_facility_facilities__facility_id__get",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "facility_id",
+ "required": True,
+ "schema": {"title": "Facility Id", "type": "string"},
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {"$ref": "#/components/schemas/Facility"}
+ }
+ },
+ "description": "Successful Response",
+ },
+ "422": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ },
+ "description": "Validation Error",
+ },
+ },
+ "summary": "Get Facility",
+ }
+ }
+ },
+}
+
+
+def test_openapi_schema():
+ """
+ Sanity check to ensure our app's openapi schema renders as we expect
+ """
+ response = client.get("/openapi.json")
+ assert response.status_code == 200, response.text
+ assert response.json() == openapi_schema
+
+
+class SortedTypeSet(set):
+ """
+ Set of Types whose `__iter__()` method yields results sorted by the type names
+ """
+
+ def __init__(self, seq: Set[Type[Any]], *, sort_reversed: bool):
+ super().__init__(seq)
+ self.sort_reversed = sort_reversed
+
+ def __iter__(self) -> Iterator[Type[Any]]:
+ members_sorted = sorted(
+ super().__iter__(),
+ key=lambda type_: type_.__name__,
+ reverse=self.sort_reversed,
+ )
+ yield from members_sorted
+
+
+@needs_pydanticv1
+@pytest.mark.parametrize("sort_reversed", [True, False])
+def test_model_description_escaped_with_formfeed(sort_reversed: bool):
+ """
+ Regression test for bug fixed by https://github.com/fastapi/fastapi/pull/6039.
+
+ Test `get_model_definitions` with models passed in different order.
+ """
+ all_fields = fastapi.openapi.utils.get_fields_from_routes(app.routes)
+
+ flat_models = fastapi._compat.get_flat_models_from_fields(
+ all_fields, known_models=set()
+ )
+ model_name_map = pydantic.schema.get_model_name_map(flat_models)
+
+ expected_address_description = "This is a public description of an Address\n"
+
+ models = fastapi._compat.get_model_definitions(
+ flat_models=SortedTypeSet(flat_models, sort_reversed=sort_reversed),
+ model_name_map=model_name_map,
+ )
+ assert models["Address"]["description"] == expected_address_description
diff --git a/tests/test_jsonable_encoder.py b/tests/test_jsonable_encoder.py
index 1906d6bf1..447c5b4d6 100644
--- a/tests/test_jsonable_encoder.py
+++ b/tests/test_jsonable_encoder.py
@@ -216,9 +216,12 @@ def test_custom_encoders():
instance = MyModel(dt_field=safe_datetime.now())
encoded_instance = jsonable_encoder(
- instance, custom_encoder={safe_datetime: lambda o: o.isoformat()}
+ instance, custom_encoder={safe_datetime: lambda o: o.strftime("%H:%M:%S")}
)
- assert encoded_instance["dt_field"] == instance.dt_field.isoformat()
+ assert encoded_instance["dt_field"] == instance.dt_field.strftime("%H:%M:%S")
+
+ encoded_instance2 = jsonable_encoder(instance)
+ assert encoded_instance2["dt_field"] == instance.dt_field.isoformat()
def test_custom_enum_encoders():
diff --git a/tests/test_openapi_schema_type.py b/tests/test_openapi_schema_type.py
new file mode 100644
index 000000000..a45ea20c8
--- /dev/null
+++ b/tests/test_openapi_schema_type.py
@@ -0,0 +1,26 @@
+from typing import List, Optional, Union
+
+import pytest
+from fastapi.openapi.models import Schema, SchemaType
+
+
+@pytest.mark.parametrize(
+ "type_value",
+ [
+ "array",
+ ["string", "null"],
+ None,
+ ],
+)
+def test_allowed_schema_type(
+ type_value: Optional[Union[SchemaType, List[SchemaType]]],
+) -> None:
+ """Test that Schema accepts SchemaType, List[SchemaType] and None for type field."""
+ schema = Schema(type=type_value)
+ assert schema.type == type_value
+
+
+def test_invalid_type_value() -> None:
+ """Test that Schema raises ValueError for invalid type values."""
+ with pytest.raises(ValueError, match="2 validation errors for Schema"):
+ Schema(type=True) # type: ignore[arg-type]
diff --git a/tests/test_response_model_default_factory.py b/tests/test_response_model_default_factory.py
new file mode 100644
index 000000000..13c1f442b
--- /dev/null
+++ b/tests/test_response_model_default_factory.py
@@ -0,0 +1,47 @@
+from fastapi import FastAPI
+from fastapi.testclient import TestClient
+from pydantic import BaseModel, Field
+
+app = FastAPI()
+
+
+class ResponseModel(BaseModel):
+ code: int = 200
+ message: str = Field(default_factory=lambda: "Successful operation.")
+
+
+@app.get(
+ "/response_model_has_default_factory_return_dict",
+ response_model=ResponseModel,
+)
+async def response_model_has_default_factory_return_dict():
+ return {"code": 200}
+
+
+@app.get(
+ "/response_model_has_default_factory_return_model",
+ response_model=ResponseModel,
+)
+async def response_model_has_default_factory_return_model():
+ return ResponseModel()
+
+
+client = TestClient(app)
+
+
+def test_response_model_has_default_factory_return_dict():
+ response = client.get("/response_model_has_default_factory_return_dict")
+
+ assert response.status_code == 200, response.text
+
+ assert response.json()["code"] == 200
+ assert response.json()["message"] == "Successful operation."
+
+
+def test_response_model_has_default_factory_return_model():
+ response = client.get("/response_model_has_default_factory_return_model")
+
+ assert response.status_code == 200, response.text
+
+ assert response.json()["code"] == 200
+ assert response.json()["message"] == "Successful operation."
diff --git a/tests/test_return_none_stringified_annotations.py b/tests/test_return_none_stringified_annotations.py
new file mode 100644
index 000000000..be052d532
--- /dev/null
+++ b/tests/test_return_none_stringified_annotations.py
@@ -0,0 +1,17 @@
+import http
+
+from fastapi import FastAPI
+from fastapi.testclient import TestClient
+
+
+def test_no_content():
+ app = FastAPI()
+
+ @app.get("/no-content", status_code=http.HTTPStatus.NO_CONTENT)
+ def return_no_content() -> "None":
+ return
+
+ client = TestClient(app)
+ response = client.get("/no-content")
+ assert response.status_code == http.HTTPStatus.NO_CONTENT, response.text
+ assert not response.content
diff --git a/tests/test_route_scope.py b/tests/test_route_scope.py
index 2021c828f..792ea66c3 100644
--- a/tests/test_route_scope.py
+++ b/tests/test_route_scope.py
@@ -47,4 +47,4 @@ def test_websocket():
def test_websocket_invalid_path_doesnt_match():
with pytest.raises(WebSocketDisconnect):
with client.websocket_connect("/itemsx/portal-gun"):
- pass
+ pass # pragma: no cover
diff --git a/tests/test_tutorial/test_behind_a_proxy/test_tutorial001_01.py b/tests/test_tutorial/test_behind_a_proxy/test_tutorial001_01.py
new file mode 100644
index 000000000..f13046e01
--- /dev/null
+++ b/tests/test_tutorial/test_behind_a_proxy/test_tutorial001_01.py
@@ -0,0 +1,21 @@
+from fastapi.testclient import TestClient
+
+from docs_src.behind_a_proxy.tutorial001_01 import app
+
+client = TestClient(
+ app,
+ base_url="https://example.com",
+ follow_redirects=False,
+)
+
+
+def test_redirect() -> None:
+ response = client.get("/items")
+ assert response.status_code == 307
+ assert response.headers["location"] == "https://example.com/items/"
+
+
+def test_no_redirect() -> None:
+ response = client.get("/items/")
+ assert response.status_code == 200
+ assert response.json() == ["plumbus", "portal gun"]
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_dependencies/test_tutorial008c.py b/tests/test_tutorial/test_dependencies/test_tutorial008c.py
index 11e96bf46..369b0a221 100644
--- a/tests/test_tutorial/test_dependencies/test_tutorial008c.py
+++ b/tests/test_tutorial/test_dependencies/test_tutorial008c.py
@@ -40,7 +40,7 @@ def test_fastapi_error(mod: ModuleType):
client = TestClient(mod.app)
with pytest.raises(FastAPIError) as exc_info:
client.get("/items/portal-gun")
- assert "No response object was returned" in exc_info.value.args[0]
+ assert "raising an exception and a dependency with yield" in exc_info.value.args[0]
def test_internal_server_error(mod: ModuleType):
diff --git a/tests/test_tutorial/test_header_params/test_tutorial003.py b/tests/test_tutorial/test_header_params/test_tutorial003.py
index 0b58227f6..473b96123 100644
--- a/tests/test_tutorial/test_header_params/test_tutorial003.py
+++ b/tests/test_tutorial/test_header_params/test_tutorial003.py
@@ -29,8 +29,12 @@ def get_client(request: pytest.FixtureRequest):
[
("/items", None, 200, {"X-Token values": None}),
("/items", {"x-token": "foo"}, 200, {"X-Token values": ["foo"]}),
- # TODO: fix this, is it a bug?
- # ("/items", [("x-token", "foo"), ("x-token", "bar")], 200, {"X-Token values": ["foo", "bar"]}),
+ (
+ "/items",
+ [("x-token", "foo"), ("x-token", "bar")],
+ 200,
+ {"X-Token values": ["foo", "bar"]},
+ ),
],
)
def test(path, headers, expected_status, expected_response, client: TestClient):
diff --git a/tests/test_tutorial/test_response_model/test_tutorial003.py b/tests/test_tutorial/test_response_model/test_tutorial003.py
index 384c8e0f1..70cfd6e4c 100644
--- a/tests/test_tutorial/test_response_model/test_tutorial003.py
+++ b/tests/test_tutorial/test_response_model/test_tutorial003.py
@@ -1,12 +1,27 @@
+import importlib
+
+import pytest
from dirty_equals import IsDict, IsOneOf
from fastapi.testclient import TestClient
-from docs_src.response_model.tutorial003 import app
-
-client = TestClient(app)
+from ...utils import needs_py310
-def test_post_user():
+@pytest.fixture(
+ name="client",
+ params=[
+ "tutorial003",
+ pytest.param("tutorial003_py310", marks=needs_py310),
+ ],
+)
+def get_client(request: pytest.FixtureRequest):
+ mod = importlib.import_module(f"docs_src.response_model.{request.param}")
+
+ client = TestClient(mod.app)
+ return client
+
+
+def test_post_user(client: TestClient):
response = client.post(
"/user/",
json={
@@ -24,7 +39,7 @@ def test_post_user():
}
-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_response_model/test_tutorial003_04.py b/tests/test_tutorial/test_response_model/test_tutorial003_04.py
index 4aa80145a..f32e93ddc 100644
--- a/tests/test_tutorial/test_response_model/test_tutorial003_04.py
+++ b/tests/test_tutorial/test_response_model/test_tutorial003_04.py
@@ -1,9 +1,18 @@
+import importlib
+
import pytest
from fastapi.exceptions import FastAPIError
+from ...utils import needs_py310
-def test_invalid_response_model():
+
+@pytest.mark.parametrize(
+ "module_name",
+ [
+ "tutorial003_04",
+ pytest.param("tutorial003_04_py310", marks=needs_py310),
+ ],
+)
+def test_invalid_response_model(module_name: str) -> None:
with pytest.raises(FastAPIError):
- from docs_src.response_model.tutorial003_04 import app
-
- assert app # pragma: no cover
+ importlib.import_module(f"docs_src.response_model.{module_name}")
diff --git a/tests/test_tutorial/test_response_model/test_tutorial003_04_py310.py b/tests/test_tutorial/test_response_model/test_tutorial003_04_py310.py
deleted file mode 100644
index b876facc8..000000000
--- a/tests/test_tutorial/test_response_model/test_tutorial003_04_py310.py
+++ /dev/null
@@ -1,12 +0,0 @@
-import pytest
-from fastapi.exceptions import FastAPIError
-
-from ...utils import needs_py310
-
-
-@needs_py310
-def test_invalid_response_model():
- with pytest.raises(FastAPIError):
- from docs_src.response_model.tutorial003_04_py310 import app
-
- assert app # pragma: no cover
diff --git a/tests/test_tutorial/test_response_model/test_tutorial003_py310.py b/tests/test_tutorial/test_response_model/test_tutorial003_py310.py
deleted file mode 100644
index 3a3aee38a..000000000
--- a/tests/test_tutorial/test_response_model/test_tutorial003_py310.py
+++ /dev/null
@@ -1,160 +0,0 @@
-import pytest
-from dirty_equals import IsDict, IsOneOf
-from fastapi.testclient import TestClient
-
-from ...utils import needs_py310
-
-
-@pytest.fixture(name="client")
-def get_client():
- from docs_src.response_model.tutorial003_py310 import app
-
- client = TestClient(app)
- return client
-
-
-@needs_py310
-def test_post_user(client: TestClient):
- response = client.post(
- "/user/",
- json={
- "username": "foo",
- "password": "fighter",
- "email": "foo@example.com",
- "full_name": "Grave Dohl",
- },
- )
- assert response.status_code == 200, response.text
- assert response.json() == {
- "username": "foo",
- "email": "foo@example.com",
- "full_name": "Grave Dohl",
- }
-
-
-@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": {
- "/user/": {
- "post": {
- "responses": {
- "200": {
- "description": "Successful Response",
- "content": {
- "application/json": {
- "schema": {"$ref": "#/components/schemas/UserOut"}
- }
- },
- },
- "422": {
- "description": "Validation Error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HTTPValidationError"
- }
- }
- },
- },
- },
- "summary": "Create User",
- "operationId": "create_user_user__post",
- "requestBody": {
- "content": {
- "application/json": {
- "schema": {"$ref": "#/components/schemas/UserIn"}
- }
- },
- "required": True,
- },
- }
- }
- },
- "components": {
- "schemas": {
- "UserOut": {
- "title": "UserOut",
- "required": IsOneOf(
- ["username", "email", "full_name"],
- # TODO: remove when deprecating Pydantic v1
- ["username", "email"],
- ),
- "type": "object",
- "properties": {
- "username": {"title": "Username", "type": "string"},
- "email": {
- "title": "Email",
- "type": "string",
- "format": "email",
- },
- "full_name": IsDict(
- {
- "title": "Full Name",
- "anyOf": [{"type": "string"}, {"type": "null"}],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {"title": "Full Name", "type": "string"}
- ),
- },
- },
- "UserIn": {
- "title": "UserIn",
- "required": ["username", "password", "email"],
- "type": "object",
- "properties": {
- "username": {"title": "Username", "type": "string"},
- "password": {"title": "Password", "type": "string"},
- "email": {
- "title": "Email",
- "type": "string",
- "format": "email",
- },
- "full_name": IsDict(
- {
- "title": "Full Name",
- "anyOf": [{"type": "string"}, {"type": "null"}],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {"title": "Full Name", "type": "string"}
- ),
- },
- },
- "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_testing/test_tutorial004.py b/tests/test_tutorial/test_testing/test_tutorial004.py
new file mode 100644
index 000000000..812ee44c1
--- /dev/null
+++ b/tests/test_tutorial/test_testing/test_tutorial004.py
@@ -0,0 +1,5 @@
+from docs_src.app_testing.tutorial004 import test_read_items
+
+
+def test_main():
+ test_read_items()