diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml
index a0e83e5c8..fb1fa6f09 100644
--- a/.github/workflows/build-docs.yml
+++ b/.github/workflows/build-docs.yml
@@ -4,9 +4,33 @@ on:
branches:
- master
pull_request:
- types: [opened, synchronize]
+ types:
+ - opened
+ - synchronize
jobs:
+ changes:
+ runs-on: ubuntu-latest
+ # Required permissions
+ permissions:
+ pull-requests: read
+ # Set job outputs to values from filter step
+ outputs:
+ docs: ${{ steps.filter.outputs.docs }}
+ steps:
+ - uses: actions/checkout@v3
+ # For pull requests it's not necessary to checkout the code but for master it is
+ - uses: dorny/paths-filter@v2
+ id: filter
+ with:
+ filters: |
+ docs:
+ - README.md
+ - docs/**
+ - docs_src/**
+ - requirements-docs.txt
build-docs:
+ needs: changes
+ if: ${{ needs.changes.outputs.docs == 'true' }}
runs-on: ubuntu-latest
steps:
- name: Dump GitHub context
diff --git a/.github/workflows/preview-docs.yml b/.github/workflows/preview-docs.yml
index 298f75b02..da98f5d2b 100644
--- a/.github/workflows/preview-docs.yml
+++ b/.github/workflows/preview-docs.yml
@@ -16,19 +16,23 @@ jobs:
rm -rf ./site
mkdir ./site
- name: Download Artifact Docs
+ id: download
uses: dawidd6/action-download-artifact@v2.27.0
with:
+ if_no_artifact_found: ignore
github_token: ${{ secrets.FASTAPI_PREVIEW_DOCS_DOWNLOAD_ARTIFACTS }}
workflow: build-docs.yml
run_id: ${{ github.event.workflow_run.id }}
name: docs-zip
path: ./site/
- name: Unzip docs
+ if: steps.download.outputs.found_artifact == 'true'
run: |
cd ./site
unzip docs.zip
rm -f docs.zip
- name: Deploy to Netlify
+ if: steps.download.outputs.found_artifact == 'true'
id: netlify
uses: nwtgck/actions-netlify@v2.0.0
with:
@@ -40,6 +44,7 @@ jobs:
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
- name: Comment Deploy
+ if: steps.netlify.outputs.deploy-url != ''
uses: ./.github/actions/comment-docs-preview-in-pr
with:
token: ${{ secrets.FASTAPI_PREVIEW_DOCS_COMMENT_DEPLOY }}
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index bdadcc6d3..b84c5bf17 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -32,7 +32,7 @@ jobs:
- name: Build distribution
run: python -m build
- name: Publish
- uses: pypa/gh-action-pypi-publish@v1.8.5
+ uses: pypa/gh-action-pypi-publish@v1.8.6
with:
password: ${{ secrets.PYPI_API_TOKEN }}
- name: Dump GitHub context
diff --git a/README.md b/README.md
index ee25f1803..7dc199367 100644
--- a/README.md
+++ b/README.md
@@ -446,7 +446,6 @@ To understand more about it, see the section ujson
- for faster JSON "parsing".
* email_validator
- for email validation.
Used by Starlette:
diff --git a/docs/az/docs/index.md b/docs/az/docs/index.md
index 282c15032..8b1c65194 100644
--- a/docs/az/docs/index.md
+++ b/docs/az/docs/index.md
@@ -441,7 +441,6 @@ To understand more about it, see the section ujson
- for faster JSON "parsing".
* email_validator
- for email validation.
Used by Starlette:
diff --git a/docs/de/docs/index.md b/docs/de/docs/index.md
index 68fc8b753..f1c873d75 100644
--- a/docs/de/docs/index.md
+++ b/docs/de/docs/index.md
@@ -440,7 +440,6 @@ To understand more about it, see the section ujson
- for faster JSON "parsing".
* email_validator
- for email validation.
Used by Starlette:
diff --git a/docs/en/data/external_links.yml b/docs/en/data/external_links.yml
index af5810778..ad738df35 100644
--- a/docs/en/data/external_links.yml
+++ b/docs/en/data/external_links.yml
@@ -233,6 +233,10 @@ articles:
link: https://medium.com/@krishnardt365/fastapi-docker-and-postgres-91943e71be92
title: Fastapi, Docker(Docker compose) and Postgres
german:
+ - author: Marcel Sander (actidoo)
+ author_link: https://www.actidoo.com
+ link: https://www.actidoo.com/de/blog/python-fastapi-domain-driven-design
+ title: Domain-driven Design mit Python und FastAPI
- author: Nico Axtmann
author_link: https://twitter.com/_nicoax
link: https://blog.codecentric.de/2019/08/inbetriebnahme-eines-scikit-learn-modells-mit-onnx-und-fastapi/
diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml
index 9913c5df5..1b5240b5e 100644
--- a/docs/en/data/sponsors.yml
+++ b/docs/en/data/sponsors.yml
@@ -31,3 +31,6 @@ bronze:
- url: https://www.exoflare.com/open-source/?utm_source=FastAPI&utm_campaign=open_source
title: Biosecurity risk assessments made easy.
img: https://fastapi.tiangolo.com/img/sponsors/exoflare.png
+ - url: https://www.flint.sh
+ title: IT expertise, consulting and development by passionate people
+ img: https://fastapi.tiangolo.com/img/sponsors/flint.png
diff --git a/docs/en/data/sponsors_badge.yml b/docs/en/data/sponsors_badge.yml
index 014744a10..b3cb06327 100644
--- a/docs/en/data/sponsors_badge.yml
+++ b/docs/en/data/sponsors_badge.yml
@@ -16,3 +16,4 @@ logins:
- armand-sauzay
- databento-bot
- nanram22
+ - Flint-company
diff --git a/docs/en/docs/advanced/testing-database.md b/docs/en/docs/advanced/testing-database.md
index 16484b09a..13a6959b6 100644
--- a/docs/en/docs/advanced/testing-database.md
+++ b/docs/en/docs/advanced/testing-database.md
@@ -44,7 +44,7 @@ So the new file structure looks like:
First, we create a new database session with the new database.
-For the tests we'll use a file `test.db` instead of `sql_app.db`.
+We'll use an in-memory database that persists during the tests instead of the local file `sql_app.db`.
But the rest of the session code is more or less the same, we just copy it.
diff --git a/docs/en/docs/img/sponsors/flint.png b/docs/en/docs/img/sponsors/flint.png
new file mode 100644
index 000000000..761cc334c
Binary files /dev/null and b/docs/en/docs/img/sponsors/flint.png differ
diff --git a/docs/en/docs/index.md b/docs/en/docs/index.md
index 9a81f14d1..afd6d7138 100644
--- a/docs/en/docs/index.md
+++ b/docs/en/docs/index.md
@@ -445,7 +445,6 @@ To understand more about it, see the section ujson
- for faster JSON "parsing".
* email_validator
- for email validation.
Used by Starlette:
diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md
index 15e951035..74b7f25ca 100644
--- a/docs/en/docs/release-notes.md
+++ b/docs/en/docs/release-notes.md
@@ -2,6 +2,51 @@
## Latest Changes
+* ⬆️ Upgrade MkDocs and MkDocs Material. PR [#9729](https://github.com/tiangolo/fastapi/pull/9729) by [@tiangolo](https://github.com/tiangolo).
+* 👷 Build and deploy docs only on docs changes. PR [#9728](https://github.com/tiangolo/fastapi/pull/9728) by [@tiangolo](https://github.com/tiangolo).
+
+## 0.98.0
+
+### Features
+
+* ✨ Allow disabling `redirect_slashes` at the FastAPI app level. PR [#3432](https://github.com/tiangolo/fastapi/pull/3432) by [@cyberlis](https://github.com/cyberlis).
+
+### Docs
+
+* 📝 Update docs on Pydantic using ujson internally. PR [#5804](https://github.com/tiangolo/fastapi/pull/5804) by [@mvasilkov](https://github.com/mvasilkov).
+* ✏ Rewording in `docs/en/docs/tutorial/debugging.md`. PR [#9581](https://github.com/tiangolo/fastapi/pull/9581) by [@ivan-abc](https://github.com/ivan-abc).
+* 📝 Add german blog post (Domain-driven Design mit Python und FastAPI). PR [#9261](https://github.com/tiangolo/fastapi/pull/9261) by [@msander](https://github.com/msander).
+* ✏️ Tweak wording in `docs/en/docs/tutorial/security/index.md`. PR [#9561](https://github.com/tiangolo/fastapi/pull/9561) by [@jyothish-mohan](https://github.com/jyothish-mohan).
+* 📝 Update `Annotated` notes in `docs/en/docs/tutorial/schema-extra-example.md`. PR [#9620](https://github.com/tiangolo/fastapi/pull/9620) by [@Alexandrhub](https://github.com/Alexandrhub).
+* ✏️ Fix typo `Annotation` -> `Annotated` in `docs/en/docs/tutorial/query-params-str-validations.md`. PR [#9625](https://github.com/tiangolo/fastapi/pull/9625) by [@mccricardo](https://github.com/mccricardo).
+* 📝 Use in memory database for testing SQL in docs. PR [#1223](https://github.com/tiangolo/fastapi/pull/1223) by [@HarshaLaxman](https://github.com/HarshaLaxman).
+
+### Translations
+
+* 🌐 Add Russian translation for `docs/ru/docs/tutorial/metadata.md`. PR [#9681](https://github.com/tiangolo/fastapi/pull/9681) by [@TabarakoAkula](https://github.com/TabarakoAkula).
+* 🌐 Fix typo in Spanish translation for `docs/es/docs/tutorial/first-steps.md`. PR [#9571](https://github.com/tiangolo/fastapi/pull/9571) by [@lilidl-nft](https://github.com/lilidl-nft).
+* 🌐 Add Russian translation for `docs/tutorial/path-operation-configuration.md`. PR [#9696](https://github.com/tiangolo/fastapi/pull/9696) by [@TabarakoAkula](https://github.com/TabarakoAkula).
+* 🌐 Add Chinese translation for `docs/zh/docs/advanced/security/index.md`. PR [#9666](https://github.com/tiangolo/fastapi/pull/9666) by [@lordqyxz](https://github.com/lordqyxz).
+* 🌐 Add Chinese translations for `docs/zh/docs/advanced/settings.md`. PR [#9652](https://github.com/tiangolo/fastapi/pull/9652) by [@ChoyeonChern](https://github.com/ChoyeonChern).
+* 🌐 Add Chinese translations for `docs/zh/docs/advanced/websockets.md`. PR [#9651](https://github.com/tiangolo/fastapi/pull/9651) by [@ChoyeonChern](https://github.com/ChoyeonChern).
+* 🌐 Add Chinese translation for `docs/zh/docs/tutorial/testing.md`. PR [#9641](https://github.com/tiangolo/fastapi/pull/9641) by [@wdh99](https://github.com/wdh99).
+* 🌐 Add Russian translation for `docs/tutorial/extra-models.md`. PR [#9619](https://github.com/tiangolo/fastapi/pull/9619) by [@ivan-abc](https://github.com/ivan-abc).
+* 🌐 Add Russian translation for `docs/tutorial/cors.md`. PR [#9608](https://github.com/tiangolo/fastapi/pull/9608) by [@ivan-abc](https://github.com/ivan-abc).
+* 🌐 Add Polish translation for `docs/pl/docs/features.md`. PR [#5348](https://github.com/tiangolo/fastapi/pull/5348) by [@mbroton](https://github.com/mbroton).
+* 🌐 Add Russian translation for `docs/ru/docs/tutorial/body-nested-models.md`. PR [#9605](https://github.com/tiangolo/fastapi/pull/9605) by [@Alexandrhub](https://github.com/Alexandrhub).
+
+### Internal
+
+* ⬆ Bump ruff from 0.0.272 to 0.0.275. PR [#9721](https://github.com/tiangolo/fastapi/pull/9721) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* ⬆ Update uvicorn[standard] requirement from <0.21.0,>=0.12.0 to >=0.12.0,<0.23.0. PR [#9463](https://github.com/tiangolo/fastapi/pull/9463) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* ⬆ Bump mypy from 1.3.0 to 1.4.0. PR [#9719](https://github.com/tiangolo/fastapi/pull/9719) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* ⬆ Update pre-commit requirement from <3.0.0,>=2.17.0 to >=2.17.0,<4.0.0. PR [#9251](https://github.com/tiangolo/fastapi/pull/9251) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* ⬆ Bump pypa/gh-action-pypi-publish from 1.8.5 to 1.8.6. PR [#9482](https://github.com/tiangolo/fastapi/pull/9482) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* ✏️ Fix tooltips for light/dark theme toggler in docs. PR [#9588](https://github.com/tiangolo/fastapi/pull/9588) by [@pankaj1707k](https://github.com/pankaj1707k).
+* 🔧 Set minimal hatchling version needed to build the package. PR [#9240](https://github.com/tiangolo/fastapi/pull/9240) by [@mgorny](https://github.com/mgorny).
+* 📝 Add repo link to PyPI. PR [#9559](https://github.com/tiangolo/fastapi/pull/9559) by [@JacobCoffee](https://github.com/JacobCoffee).
+* ✏️ Fix typos in data for tests. PR [#4958](https://github.com/tiangolo/fastapi/pull/4958) by [@ryanrussell](https://github.com/ryanrussell).
+* 🔧 Update sponsors, add Flint. PR [#9699](https://github.com/tiangolo/fastapi/pull/9699) by [@tiangolo](https://github.com/tiangolo).
* 👷 Lint in CI only once, only with one version of Python, run tests with all of them. PR [#9686](https://github.com/tiangolo/fastapi/pull/9686) by [@tiangolo](https://github.com/tiangolo).
## 0.97.0
diff --git a/docs/en/docs/tutorial/debugging.md b/docs/en/docs/tutorial/debugging.md
index bda889c45..3deba54d5 100644
--- a/docs/en/docs/tutorial/debugging.md
+++ b/docs/en/docs/tutorial/debugging.md
@@ -64,7 +64,7 @@ from myapp import app
# Some more code
```
-in that case, the automatic variable inside of `myapp.py` will not have the variable `__name__` with a value of `"__main__"`.
+in that case, the automatically created variable inside of `myapp.py` will not have the variable `__name__` with a value of `"__main__"`.
So, the line:
diff --git a/docs/en/docs/tutorial/query-params-str-validations.md b/docs/en/docs/tutorial/query-params-str-validations.md
index c4b221cb1..549e6c75b 100644
--- a/docs/en/docs/tutorial/query-params-str-validations.md
+++ b/docs/en/docs/tutorial/query-params-str-validations.md
@@ -44,7 +44,7 @@ To achieve that, first import:
=== "Python 3.6+"
- In versions of Python below Python 3.9 you import `Annotation` from `typing_extensions`.
+ In versions of Python below Python 3.9 you import `Annotated` from `typing_extensions`.
It will already be installed with FastAPI.
diff --git a/docs/en/docs/tutorial/schema-extra-example.md b/docs/en/docs/tutorial/schema-extra-example.md
index 5312254d9..e0f7ed256 100644
--- a/docs/en/docs/tutorial/schema-extra-example.md
+++ b/docs/en/docs/tutorial/schema-extra-example.md
@@ -86,6 +86,9 @@ Here we pass an `example` of the data expected in `Body()`:
=== "Python 3.10+ non-Annotated"
+ !!! tip
+ Prefer to use the `Annotated` version if possible.
+
```Python hl_lines="18-23"
{!> ../../../docs_src/schema_extra_example/tutorial003_py310.py!}
```
@@ -138,6 +141,9 @@ Each specific example `dict` in the `examples` can contain:
=== "Python 3.10+ non-Annotated"
+ !!! tip
+ Prefer to use the `Annotated` version if possible.
+
```Python hl_lines="19-45"
{!> ../../../docs_src/schema_extra_example/tutorial004_py310.py!}
```
diff --git a/docs/en/docs/tutorial/security/index.md b/docs/en/docs/tutorial/security/index.md
index 9aed2adb5..035b31736 100644
--- a/docs/en/docs/tutorial/security/index.md
+++ b/docs/en/docs/tutorial/security/index.md
@@ -26,7 +26,7 @@ That's what all the systems with "login with Facebook, Google, Twitter, GitHub"
### OAuth 1
-There was an OAuth 1, which is very different from OAuth2, and more complex, as it included directly specifications on how to encrypt the communication.
+There was an OAuth 1, which is very different from OAuth2, and more complex, as it included direct specifications on how to encrypt the communication.
It is not very popular or used nowadays.
diff --git a/docs/en/mkdocs.yml b/docs/en/mkdocs.yml
index b7cefee53..73df174d1 100644
--- a/docs/en/mkdocs.yml
+++ b/docs/en/mkdocs.yml
@@ -11,14 +11,14 @@ theme:
accent: amber
toggle:
icon: material/lightbulb
- name: Switch to light mode
+ name: Switch to dark mode
- media: '(prefers-color-scheme: dark)'
scheme: slate
primary: teal
accent: amber
toggle:
icon: material/lightbulb-outline
- name: Switch to dark mode
+ name: Switch to light mode
features:
- search.suggest
- search.highlight
diff --git a/docs/es/docs/index.md b/docs/es/docs/index.md
index 727a6617b..5b75880c0 100644
--- a/docs/es/docs/index.md
+++ b/docs/es/docs/index.md
@@ -433,7 +433,6 @@ Para entender más al respecto revisa la sección ujson
- para "parsing" de JSON más rápido.
* email_validator
- para validación de emails.
Usados por Starlette:
diff --git a/docs/es/docs/tutorial/first-steps.md b/docs/es/docs/tutorial/first-steps.md
index 110036e8c..efa61f994 100644
--- a/docs/es/docs/tutorial/first-steps.md
+++ b/docs/es/docs/tutorial/first-steps.md
@@ -181,7 +181,7 @@ $ uvicorn main:my_awesome_api --reload
-### Paso 3: crea un *operación de path*
+### Paso 3: crea una *operación de path*
#### Path
diff --git a/docs/fa/docs/index.md b/docs/fa/docs/index.md
index ebaa8085a..248084389 100644
--- a/docs/fa/docs/index.md
+++ b/docs/fa/docs/index.md
@@ -436,7 +436,6 @@ item: Item
استفاده شده توسط Pydantic:
-* ujson
- برای "تجزیه (parse)" سریعتر JSON .
* email_validator
- برای اعتبارسنجی آدرسهای ایمیل.
استفاده شده توسط Starlette:
diff --git a/docs/fr/docs/index.md b/docs/fr/docs/index.md
index 5ee8b462f..7c7547be1 100644
--- a/docs/fr/docs/index.md
+++ b/docs/fr/docs/index.md
@@ -445,7 +445,6 @@ Pour en savoir plus, consultez la section ujson
- pour un "décodage" JSON plus rapide.
* email_validator
- pour la validation des adresses email.
Utilisées par Starlette :
diff --git a/docs/he/docs/index.md b/docs/he/docs/index.md
index 19f2f2041..802dbe8b5 100644
--- a/docs/he/docs/index.md
+++ b/docs/he/docs/index.md
@@ -440,7 +440,6 @@ item: Item
בשימוש Pydantic:
-- ujson
- "פרסור" JSON.
- email_validator
- לאימות כתובות אימייל.
בשימוש Starlette:
diff --git a/docs/id/docs/index.md b/docs/id/docs/index.md
index 66fc2859e..ed551f910 100644
--- a/docs/id/docs/index.md
+++ b/docs/id/docs/index.md
@@ -441,7 +441,6 @@ To understand more about it, see the section ujson
- for faster JSON "parsing".
* email_validator
- for email validation.
Used by Starlette:
diff --git a/docs/it/docs/index.md b/docs/it/docs/index.md
index 9d95dd6d7..42c9a7e8c 100644
--- a/docs/it/docs/index.md
+++ b/docs/it/docs/index.md
@@ -438,7 +438,6 @@ To understand more about it, see the section ujson
- for faster JSON "parsing".
* email_validator
- for email validation.
Used by Starlette:
diff --git a/docs/ja/docs/index.md b/docs/ja/docs/index.md
index f3a159f70..a9c381a23 100644
--- a/docs/ja/docs/index.md
+++ b/docs/ja/docs/index.md
@@ -431,7 +431,6 @@ item: Item
Pydantic によって使用されるもの:
-- ujson
- より速い JSON への"変換".
- email_validator
- E メールの検証
Starlette によって使用されるもの:
diff --git a/docs/ko/docs/index.md b/docs/ko/docs/index.md
index c64713705..a6991a9b8 100644
--- a/docs/ko/docs/index.md
+++ b/docs/ko/docs/index.md
@@ -437,7 +437,6 @@ item: Item
Pydantic이 사용하는:
-* ujson
- 더 빠른 JSON "파싱".
* email_validator
- 이메일 유효성 검사.
Starlette이 사용하는:
diff --git a/docs/nl/docs/index.md b/docs/nl/docs/index.md
index 23143a96f..47d62f8c4 100644
--- a/docs/nl/docs/index.md
+++ b/docs/nl/docs/index.md
@@ -444,7 +444,6 @@ To understand more about it, see the section ujson
- for faster JSON "parsing".
* email_validator
- for email validation.
Used by Starlette:
diff --git a/docs/pl/docs/features.md b/docs/pl/docs/features.md
new file mode 100644
index 000000000..49d362dd9
--- /dev/null
+++ b/docs/pl/docs/features.md
@@ -0,0 +1,200 @@
+# 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.6** (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.
+* **Szybkość**:
+ * w benchmarkach Pydantic jest szybszy niż wszystkie inne testowane biblioteki.
+* 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/index.md b/docs/pl/docs/index.md
index 98e1e82fc..bade7a88c 100644
--- a/docs/pl/docs/index.md
+++ b/docs/pl/docs/index.md
@@ -435,7 +435,6 @@ Aby dowiedzieć się o tym więcej, zobacz sekcję ujson
- dla szybszego "parsowania" danych JSON.
* email_validator
- dla walidacji adresów email.
Używane przez Starlette:
diff --git a/docs/pl/mkdocs.yml b/docs/pl/mkdocs.yml
index 0d7a783fc..5ca1bbfef 100644
--- a/docs/pl/mkdocs.yml
+++ b/docs/pl/mkdocs.yml
@@ -63,6 +63,7 @@ nav:
- tr: /tr/
- uk: /uk/
- zh: /zh/
+- features.md
- Samouczek:
- tutorial/index.md
- tutorial/first-steps.md
diff --git a/docs/pt/docs/index.md b/docs/pt/docs/index.md
index 76668b4da..591e7f3d4 100644
--- a/docs/pt/docs/index.md
+++ b/docs/pt/docs/index.md
@@ -430,7 +430,6 @@ Para entender mais sobre performance, veja a seção ujson
- para JSON mais rápido "parsing".
* email_validator
- para validação de email.
Usados por Starlette:
diff --git a/docs/ru/docs/index.md b/docs/ru/docs/index.md
index 14a6d5a8b..30c32e046 100644
--- a/docs/ru/docs/index.md
+++ b/docs/ru/docs/index.md
@@ -439,7 +439,6 @@ item: Item
Используется Pydantic:
-* ujson
- для более быстрого JSON "парсинга".
* email_validator
- для проверки электронной почты.
Используется Starlette:
diff --git a/docs/ru/docs/tutorial/body-nested-models.md b/docs/ru/docs/tutorial/body-nested-models.md
new file mode 100644
index 000000000..6435e316f
--- /dev/null
+++ b/docs/ru/docs/tutorial/body-nested-models.md
@@ -0,0 +1,382 @@
+# Body - Вложенные модели
+
+С помощью **FastAPI**, вы можете определять, валидировать, документировать и использовать модели произвольной вложенности (благодаря библиотеке Pydantic).
+
+## Определение полей содержащих списки
+
+Вы можете определять атрибут как подтип. Например, тип `list` в Python:
+
+=== "Python 3.10+"
+
+ ```Python hl_lines="12"
+ {!> ../../../docs_src/body_nested_models/tutorial001_py310.py!}
+ ```
+
+=== "Python 3.6+"
+
+ ```Python hl_lines="14"
+ {!> ../../../docs_src/body_nested_models/tutorial001.py!}
+ ```
+
+Это приведёт к тому, что обьект `tags` преобразуется в список, несмотря на то что тип его элементов не объявлен.
+
+## Определение полей содержащих список с определением типов его элементов
+
+Однако в Python есть способ объявления списков с указанием типов для вложенных элементов:
+
+### Импортируйте `List` из модуля typing
+
+В Python 3.9 и выше вы можете использовать стандартный тип `list` для объявления аннотаций типов, как мы увидим ниже. 💡
+
+Но в версиях Python до 3.9 (начиная с 3.6) сначала вам необходимо импортировать `List` из стандартного модуля `typing` в Python:
+
+```Python hl_lines="1"
+{!> ../../../docs_src/body_nested_models/tutorial002.py!}
+```
+
+### Объявление `list` с указанием типов для вложенных элементов
+
+Объявление типов для элементов (внутренних типов) вложенных в такие типы как `list`, `dict`, `tuple`:
+
+* Если у вас Python версии ниже чем 3.9, импортируйте их аналог из модуля `typing`
+* Передайте внутренний(ие) тип(ы) как "параметры типа", используя квадратные скобки: `[` и `]`
+
+В Python версии 3.9 это будет выглядеть так:
+
+```Python
+my_list: list[str]
+```
+
+В версиях Python до 3.9 это будет выглядеть так:
+
+```Python
+from typing import List
+
+my_list: List[str]
+```
+
+Это всё стандартный синтаксис Python для объявления типов.
+
+Используйте этот же стандартный синтаксис для атрибутов модели с внутренними типами.
+
+Таким образом, в нашем примере мы можем явно указать тип данных для поля `tags` как "список строк":
+
+=== "Python 3.10+"
+
+ ```Python hl_lines="12"
+ {!> ../../../docs_src/body_nested_models/tutorial002_py310.py!}
+ ```
+
+=== "Python 3.9+"
+
+ ```Python hl_lines="14"
+ {!> ../../../docs_src/body_nested_models/tutorial002_py39.py!}
+ ```
+
+=== "Python 3.6+"
+
+ ```Python hl_lines="14"
+ {!> ../../../docs_src/body_nested_models/tutorial002.py!}
+ ```
+
+## Типы множеств
+
+Но затем мы подумали и поняли, что теги не должны повторяться и, вероятно, они должны быть уникальными строками.
+
+И в Python есть специальный тип данных для множеств уникальных элементов - `set`.
+
+Тогда мы может обьявить поле `tags` как множество строк:
+
+=== "Python 3.10+"
+
+ ```Python hl_lines="12"
+ {!> ../../../docs_src/body_nested_models/tutorial003_py310.py!}
+ ```
+
+=== "Python 3.9+"
+
+ ```Python hl_lines="14"
+ {!> ../../../docs_src/body_nested_models/tutorial003_py39.py!}
+ ```
+
+=== "Python 3.6+"
+
+ ```Python hl_lines="1 14"
+ {!> ../../../docs_src/body_nested_models/tutorial003.py!}
+ ```
+
+С помощью этого, даже если вы получите запрос с повторяющимися данными, они будут преобразованы в множество уникальных элементов.
+
+И когда вы выводите эти данные, даже если исходный набор содержал дубликаты, они будут выведены в виде множества уникальных элементов.
+
+И они также будут соответствующим образом аннотированы / задокументированы.
+
+## Вложенные Модели
+
+У каждого атрибута Pydantic-модели есть тип.
+
+Но этот тип может сам быть другой моделью Pydantic.
+
+Таким образом вы можете объявлять глубоко вложенные JSON "объекты" с определёнными именами атрибутов, типами и валидацией.
+
+Всё это может быть произвольно вложенным.
+
+### Определение подмодели
+
+Например, мы можем определить модель `Image`:
+
+=== "Python 3.10+"
+
+ ```Python hl_lines="7-9"
+ {!> ../../../docs_src/body_nested_models/tutorial004_py310.py!}
+ ```
+
+=== "Python 3.9+"
+
+ ```Python hl_lines="9-11"
+ {!> ../../../docs_src/body_nested_models/tutorial004_py39.py!}
+ ```
+
+=== "Python 3.6+"
+
+ ```Python hl_lines="9-11"
+ {!> ../../../docs_src/body_nested_models/tutorial004.py!}
+ ```
+
+### Использование вложенной модели в качестве типа
+
+Также мы можем использовать эту модель как тип атрибута:
+
+=== "Python 3.10+"
+
+ ```Python hl_lines="18"
+ {!> ../../../docs_src/body_nested_models/tutorial004_py310.py!}
+ ```
+
+=== "Python 3.9+"
+
+ ```Python hl_lines="20"
+ {!> ../../../docs_src/body_nested_models/tutorial004_py39.py!}
+ ```
+
+=== "Python 3.6+"
+
+ ```Python hl_lines="20"
+ {!> ../../../docs_src/body_nested_models/tutorial004.py!}
+ ```
+
+Это означает, что **FastAPI** будет ожидать тело запроса, аналогичное этому:
+
+```JSON
+{
+ "name": "Foo",
+ "description": "The pretender",
+ "price": 42.0,
+ "tax": 3.2,
+ "tags": ["rock", "metal", "bar"],
+ "image": {
+ "url": "http://example.com/baz.jpg",
+ "name": "The Foo live"
+ }
+}
+```
+
+Ещё раз: сделав такое объявление, с помощью **FastAPI** вы получите:
+
+* Поддержку редакторов IDE (автодополнение и т.д), даже для вложенных моделей
+* Преобразование данных
+* Валидацию данных
+* Автоматическую документацию
+
+## Особые типы и валидация
+
+Помимо обычных простых типов, таких как `str`, `int`, `float`, и т.д. Вы можете использовать более сложные базовые типы, которые наследуются от типа `str`.
+
+Чтобы увидеть все варианты, которые у вас есть, ознакомьтесь с документацией по необычным типам Pydantic. Вы увидите некоторые примеры в следующей главе.
+
+Например, так как в модели `Image` у нас есть поле `url`, то мы можем объявить его как тип `HttpUrl` из модуля Pydantic вместо типа `str`:
+
+=== "Python 3.10+"
+
+ ```Python hl_lines="2 8"
+ {!> ../../../docs_src/body_nested_models/tutorial005_py310.py!}
+ ```
+
+=== "Python 3.9+"
+
+ ```Python hl_lines="4 10"
+ {!> ../../../docs_src/body_nested_models/tutorial005_py39.py!}
+ ```
+
+=== "Python 3.6+"
+
+ ```Python hl_lines="4 10"
+ {!> ../../../docs_src/body_nested_models/tutorial005.py!}
+ ```
+
+Строка будет проверена на соответствие допустимому URL-адресу и задокументирована в JSON схему / OpenAPI.
+
+## Атрибуты, содержащие списки подмоделей
+
+Вы также можете использовать модели Pydantic в качестве типов вложенных в `list`, `set` и т.д:
+
+=== "Python 3.10+"
+
+ ```Python hl_lines="18"
+ {!> ../../../docs_src/body_nested_models/tutorial006_py310.py!}
+ ```
+
+=== "Python 3.9+"
+
+ ```Python hl_lines="20"
+ {!> ../../../docs_src/body_nested_models/tutorial006_py39.py!}
+ ```
+
+=== "Python 3.6+"
+
+ ```Python hl_lines="20"
+ {!> ../../../docs_src/body_nested_models/tutorial006.py!}
+ ```
+
+Такая реализация будет ожидать (конвертировать, валидировать, документировать и т.д) JSON-содержимое в следующем формате:
+
+```JSON hl_lines="11"
+{
+ "name": "Foo",
+ "description": "The pretender",
+ "price": 42.0,
+ "tax": 3.2,
+ "tags": [
+ "rock",
+ "metal",
+ "bar"
+ ],
+ "images": [
+ {
+ "url": "http://example.com/baz.jpg",
+ "name": "The Foo live"
+ },
+ {
+ "url": "http://example.com/dave.jpg",
+ "name": "The Baz"
+ }
+ ]
+}
+```
+
+!!! info "Информация"
+ Заметьте, что теперь у ключа `images` есть список объектов изображений.
+
+## Глубоко вложенные модели
+
+Вы можете определять модели с произвольным уровнем вложенности:
+
+=== "Python 3.10+"
+
+ ```Python hl_lines="7 12 18 21 25"
+ {!> ../../../docs_src/body_nested_models/tutorial007_py310.py!}
+ ```
+
+=== "Python 3.9+"
+
+ ```Python hl_lines="9 14 20 23 27"
+ {!> ../../../docs_src/body_nested_models/tutorial007_py39.py!}
+ ```
+
+=== "Python 3.6+"
+
+ ```Python hl_lines="9 14 20 23 27"
+ {!> ../../../docs_src/body_nested_models/tutorial007.py!}
+ ```
+
+!!! info "Информация"
+ Заметьте, что у объекта `Offer` есть список объектов `Item`, которые, в свою очередь, могут содержать необязательный список объектов `Image`
+
+## Тела с чистыми списками элементов
+
+Если верхний уровень значения тела JSON-объекта представляет собой JSON `array` (в Python - `list`), вы можете объявить тип в параметре функции, так же, как в моделях Pydantic:
+
+```Python
+images: List[Image]
+```
+
+в Python 3.9 и выше:
+
+```Python
+images: list[Image]
+```
+
+например так:
+
+=== "Python 3.9+"
+
+ ```Python hl_lines="13"
+ {!> ../../../docs_src/body_nested_models/tutorial008_py39.py!}
+ ```
+
+=== "Python 3.6+"
+
+ ```Python hl_lines="15"
+ {!> ../../../docs_src/body_nested_models/tutorial008.py!}
+ ```
+
+## Универсальная поддержка редактора
+
+И вы получаете поддержку редактора везде.
+
+Даже для элементов внутри списков:
+
+
+
+Вы не могли бы получить такую поддержку редактора, если бы работали напрямую с `dict`, а не с моделями Pydantic.
+
+Но вы также не должны беспокоиться об этом, входящие словари автоматически конвертируются, а ваш вывод также автоматически преобразуется в формат JSON.
+
+## Тела запросов с произвольными словарями (`dict` )
+
+Вы также можете объявить тело запроса как `dict` с ключами определенного типа и значениями другого типа данных.
+
+Без необходимости знать заранее, какие значения являются допустимыми для имён полей/атрибутов (как это было бы в случае с моделями Pydantic).
+
+Это было бы полезно, если вы хотите получить ключи, которые вы еще не знаете.
+
+---
+
+Другой полезный случай - когда вы хотите чтобы ключи были другого типа данных, например, `int`.
+
+Именно это мы сейчас и увидим здесь.
+
+В этом случае вы принимаете `dict`, пока у него есть ключи типа `int` со значениями типа `float`:
+
+=== "Python 3.9+"
+
+ ```Python hl_lines="7"
+ {!> ../../../docs_src/body_nested_models/tutorial009_py39.py!}
+ ```
+
+=== "Python 3.6+"
+
+ ```Python hl_lines="9"
+ {!> ../../../docs_src/body_nested_models/tutorial009.py!}
+ ```
+
+!!! tip "Совет"
+ Имейте в виду, что JSON поддерживает только ключи типа `str`.
+
+ Но Pydantic обеспечивает автоматическое преобразование данных.
+
+ Это значит, что даже если пользователи вашего API могут отправлять только строки в качестве ключей, при условии, что эти строки содержат целые числа, Pydantic автоматический преобразует и валидирует эти данные.
+
+ А `dict`, с именем `weights`, который вы получите в качестве ответа Pydantic, действительно будет иметь ключи типа `int` и значения типа `float`.
+
+## Резюме
+
+С помощью **FastAPI** вы получаете максимальную гибкость, предоставляемую моделями Pydantic, сохраняя при этом простоту, краткость и элегантность вашего кода.
+
+И дополнительно вы получаете:
+
+* Поддержку редактора (автодополнение доступно везде!)
+* Преобразование данных (также известно как парсинг / сериализация)
+* Валидацию данных
+* Документацию схемы данных
+* Автоматическую генерацию документации
diff --git a/docs/ru/docs/tutorial/cors.md b/docs/ru/docs/tutorial/cors.md
new file mode 100644
index 000000000..8c7fbc046
--- /dev/null
+++ b/docs/ru/docs/tutorial/cors.md
@@ -0,0 +1,84 @@
+# CORS (Cross-Origin Resource Sharing)
+
+Понятие CORS или "Cross-Origin Resource Sharing" относится к ситуациям, при которых запущенный в браузере фронтенд содержит JavaScript-код, который взаимодействует с бэкендом, находящимся на другом "источнике" ("origin").
+
+## Источник
+
+Источник - это совокупность протокола (`http`, `https`), домена (`myapp.com`, `localhost`, `localhost.tiangolo.com`) и порта (`80`, `443`, `8080`).
+
+Поэтому это три разных источника:
+
+* `http://localhost`
+* `https://localhost`
+* `http://localhost:8080`
+
+Даже если они все расположены в `localhost`, они используют разные протоколы и порты, а значит, являются разными источниками.
+
+## Шаги
+
+Допустим, у вас есть фронтенд, запущенный в браузере по адресу `http://localhost:8080`, и его JavaScript-код пытается взаимодействовать с бэкендом, запущенным по адресу `http://localhost` (поскольку мы не указали порт, браузер по умолчанию будет использовать порт `80`).
+
+Затем браузер отправит бэкенду HTTP-запрос `OPTIONS`, и если бэкенд вернёт соответствующие заголовки для авторизации взаимодействия с другим источником (`http://localhost:8080`), то браузер разрешит JavaScript-коду на фронтенде отправить запрос на этот бэкенд.
+
+Чтобы это работало, у бэкенда должен быть список "разрешённых источников" ("allowed origins").
+
+В таком случае этот список должен содержать `http://localhost:8080`, чтобы фронтенд работал корректно.
+
+## Подстановочный символ `"*"`
+
+В качестве списка источников можно указать подстановочный символ `"*"` ("wildcard"), чтобы разрешить любые источники.
+
+Но тогда не будут разрешены некоторые виды взаимодействия, включая всё связанное с учётными данными: куки, заголовки Authorization с Bearer-токенами наподобие тех, которые мы использовали ранее и т.п.
+
+Поэтому, чтобы всё работало корректно, лучше явно указывать список разрешённых источников.
+
+## Использование `CORSMiddleware`
+
+Вы можете настроить этот механизм в вашем **FastAPI** приложении, используя `CORSMiddleware`.
+
+* Импортируйте `CORSMiddleware`.
+* Создайте список разрешённых источников (в виде строк).
+* Добавьте его как "middleware" к вашему **FastAPI** приложению.
+
+Вы также можете указать, разрешает ли ваш бэкенд использование:
+
+* Учётных данных (включая заголовки Authorization, куки и т.п.).
+* Отдельных HTTP-методов (`POST`, `PUT`) или всех вместе, используя `"*"`.
+* Отдельных HTTP-заголовков или всех вместе, используя `"*"`.
+
+```Python hl_lines="2 6-11 13-19"
+{!../../../docs_src/cors/tutorial001.py!}
+```
+
+`CORSMiddleware` использует для параметров "запрещающие" значения по умолчанию, поэтому вам нужно явным образом разрешить использование отдельных источников, методов или заголовков, чтобы браузеры могли использовать их в кросс-доменном контексте.
+
+Поддерживаются следующие аргументы:
+
+* `allow_origins` - Список источников, на которые разрешено выполнять кросс-доменные запросы. Например, `['https://example.org', 'https://www.example.org']`. Можно использовать `['*']`, чтобы разрешить любые источники.
+* `allow_origin_regex` - Регулярное выражение для определения источников, на которые разрешено выполнять кросс-доменные запросы. Например, `'https://.*\.example\.org'`.
+* `allow_methods` - Список HTTP-методов, которые разрешены для кросс-доменных запросов. По умолчанию равно `['GET']`. Можно использовать `['*']`, чтобы разрешить все стандартные методы.
+* `allow_headers` - Список HTTP-заголовков, которые должны поддерживаться при кросс-доменных запросах. По умолчанию равно `[]`. Можно использовать `['*']`, чтобы разрешить все заголовки. Заголовки `Accept`, `Accept-Language`, `Content-Language` и `Content-Type` всегда разрешены для простых CORS-запросов.
+* `allow_credentials` - указывает, что куки разрешены в кросс-доменных запросах. По умолчанию равно `False`. Также, `allow_origins` нельзя присвоить `['*']`, если разрешено использование учётных данных. В таком случае должен быть указан список источников.
+* `expose_headers` - Указывает любые заголовки ответа, которые должны быть доступны браузеру. По умолчанию равно `[]`.
+* `max_age` - Устанавливает максимальное время в секундах, в течение которого браузер кэширует CORS-ответы. По умолчанию равно `600`.
+
+`CORSMiddleware` отвечает на два типа HTTP-запросов...
+
+### CORS-запросы с предварительной проверкой
+
+Это любые `OPTIONS` запросы с заголовками `Origin` и `Access-Control-Request-Method`.
+
+В этом случае middleware перехватит входящий запрос и отправит соответствующие CORS-заголовки в ответе, а также ответ `200` или `400` в информационных целях.
+
+### Простые запросы
+
+Любые запросы с заголовком `Origin`. В этом случае middleware передаст запрос дальше как обычно, но добавит соответствующие CORS-заголовки к ответу.
+
+## Больше информации
+
+Для получения более подробной информации о CORS, обратитесь к Документации CORS от Mozilla.
+
+!!! note "Технические детали"
+ Вы также можете использовать `from starlette.middleware.cors import CORSMiddleware`.
+
+ **FastAPI** предоставляет несколько middleware в `fastapi.middleware` только для вашего удобства как разработчика. Но большинство доступных middleware взяты напрямую из Starlette.
diff --git a/docs/ru/docs/tutorial/extra-models.md b/docs/ru/docs/tutorial/extra-models.md
new file mode 100644
index 000000000..a346f7432
--- /dev/null
+++ b/docs/ru/docs/tutorial/extra-models.md
@@ -0,0 +1,252 @@
+# Дополнительные модели
+
+В продолжение прошлого примера будет уже обычным делом иметь несколько связанных между собой моделей.
+
+Это особенно применимо в случае моделей пользователя, потому что:
+
+* **Модель для ввода** должна иметь возможность содержать пароль.
+* **Модель для вывода** не должна содержать пароль.
+* **Модель для базы данных**, возможно, должна содержать хэшированный пароль.
+
+!!! danger "Внимание"
+ Никогда не храните пароли пользователей в чистом виде. Всегда храните "безопасный хэш", который вы затем сможете проверить.
+
+ Если вам это не знакомо, вы можете узнать про "хэш пароля" в [главах о безопасности](security/simple-oauth2.md#password-hashing){.internal-link target=_blank}.
+
+## Множественные модели
+
+Ниже изложена основная идея того, как могут выглядеть эти модели с полями для паролей, а также описаны места, где они используются:
+
+=== "Python 3.10+"
+
+ ```Python hl_lines="7 9 14 20 22 27-28 31-33 38-39"
+ {!> ../../../docs_src/extra_models/tutorial001_py310.py!}
+ ```
+
+=== "Python 3.6+"
+
+ ```Python hl_lines="9 11 16 22 24 29-30 33-35 40-41"
+ {!> ../../../docs_src/extra_models/tutorial001.py!}
+ ```
+
+### Про `**user_in.dict()`
+
+#### `.dict()` из Pydantic
+
+`user_in` - это Pydantic-модель класса `UserIn`.
+
+У Pydantic-моделей есть метод `.dict()`, который возвращает `dict` с данными модели.
+
+Поэтому, если мы создадим Pydantic-объект `user_in` таким способом:
+
+```Python
+user_in = UserIn(username="john", password="secret", email="john.doe@example.com")
+```
+
+и затем вызовем:
+
+```Python
+user_dict = user_in.dict()
+```
+
+то теперь у нас есть `dict` с данными модели в переменной `user_dict` (это `dict` вместо объекта Pydantic-модели).
+
+И если мы вызовем:
+
+```Python
+print(user_dict)
+```
+
+мы можем получить `dict` с такими данными:
+
+```Python
+{
+ 'username': 'john',
+ 'password': 'secret',
+ 'email': 'john.doe@example.com',
+ 'full_name': None,
+}
+```
+
+#### Распаковка `dict`
+
+Если мы возьмём `dict` наподобие `user_dict` и передадим его в функцию (или класс), используя `**user_dict`, Python распакует его. Он передаст ключи и значения `user_dict` напрямую как аргументы типа ключ-значение.
+
+Поэтому, продолжая описанный выше пример с `user_dict`, написание такого кода:
+
+```Python
+UserInDB(**user_dict)
+```
+
+Будет работать так же, как примерно такой код:
+
+```Python
+UserInDB(
+ username="john",
+ password="secret",
+ email="john.doe@example.com",
+ full_name=None,
+)
+```
+
+Или, если для большей точности мы напрямую используем `user_dict` с любым потенциальным содержимым, то этот пример будет выглядеть так:
+
+```Python
+UserInDB(
+ username = user_dict["username"],
+ password = user_dict["password"],
+ email = user_dict["email"],
+ full_name = user_dict["full_name"],
+)
+```
+
+#### Pydantic-модель из содержимого другой модели
+
+Как в примере выше мы получили `user_dict` из `user_in.dict()`, этот код:
+
+```Python
+user_dict = user_in.dict()
+UserInDB(**user_dict)
+```
+
+будет равнозначен такому:
+
+```Python
+UserInDB(**user_in.dict())
+```
+
+...потому что `user_in.dict()` - это `dict`, и затем мы указываем, чтобы Python его "распаковал", когда передаём его в `UserInDB` и ставим перед ним `**`.
+
+Таким образом мы получаем Pydantic-модель на основе данных из другой Pydantic-модели.
+
+#### Распаковка `dict` и дополнительные именованные аргументы
+
+И затем, если мы добавим дополнительный именованный аргумент `hashed_password=hashed_password` как здесь:
+
+```Python
+UserInDB(**user_in.dict(), hashed_password=hashed_password)
+```
+
+... то мы получим что-то подобное:
+
+```Python
+UserInDB(
+ username = user_dict["username"],
+ password = user_dict["password"],
+ email = user_dict["email"],
+ full_name = user_dict["full_name"],
+ hashed_password = hashed_password,
+)
+```
+
+!!! warning "Предупреждение"
+ Цель использованных в примере вспомогательных функций - не более чем демонстрация возможных операций с данными, но, конечно, они не обеспечивают настоящую безопасность.
+
+## Сократите дублирование
+
+Сокращение дублирования кода - это одна из главных идей **FastAPI**.
+
+Поскольку дублирование кода повышает риск появления багов, проблем с безопасностью, проблем десинхронизации кода (когда вы обновляете код в одном месте, но не обновляете в другом), и т.д.
+
+А все описанные выше модели используют много общих данных и дублируют названия атрибутов и типов.
+
+Мы можем это улучшить.
+
+Мы можем определить модель `UserBase`, которая будет базовой для остальных моделей. И затем мы можем создать подклассы этой модели, которые будут наследовать её атрибуты (объявления типов, валидацию, и т.п.).
+
+Все операции конвертации, валидации, документации, и т.п. будут по-прежнему работать нормально.
+
+В этом случае мы можем определить только различия между моделями (с `password` в чистом виде, с `hashed_password` и без пароля):
+
+=== "Python 3.10+"
+
+ ```Python hl_lines="7 13-14 17-18 21-22"
+ {!> ../../../docs_src/extra_models/tutorial002_py310.py!}
+ ```
+
+=== "Python 3.6+"
+
+ ```Python hl_lines="9 15-16 19-20 23-24"
+ {!> ../../../docs_src/extra_models/tutorial002.py!}
+ ```
+
+## `Union` или `anyOf`
+
+Вы можете определить ответ как `Union` из двух типов. Это означает, что ответ должен соответствовать одному из них.
+
+Он будет определён в OpenAPI как `anyOf`.
+
+Для этого используйте стандартные аннотации типов в Python `typing.Union`:
+
+!!! note "Примечание"
+ При объявлении `Union`, сначала указывайте наиболее детальные типы, затем менее детальные. В примере ниже более детальный `PlaneItem` стоит перед `CarItem` в `Union[PlaneItem, CarItem]`.
+
+=== "Python 3.10+"
+
+ ```Python hl_lines="1 14-15 18-20 33"
+ {!> ../../../docs_src/extra_models/tutorial003_py310.py!}
+ ```
+
+=== "Python 3.6+"
+
+ ```Python hl_lines="1 14-15 18-20 33"
+ {!> ../../../docs_src/extra_models/tutorial003.py!}
+ ```
+
+### `Union` в Python 3.10
+
+В этом примере мы передаём `Union[PlaneItem, CarItem]` в качестве значения аргумента `response_model`.
+
+Поскольку мы передаём его как **значение аргумента** вместо того, чтобы поместить его в **аннотацию типа**, нам придётся использовать `Union` даже в Python 3.10.
+
+Если оно было бы указано в аннотации типа, то мы могли бы использовать вертикальную черту как в примере:
+
+```Python
+some_variable: PlaneItem | CarItem
+```
+
+Но если мы помещаем его в `response_model=PlaneItem | CarItem` мы получим ошибку, потому что Python попытается произвести **некорректную операцию** между `PlaneItem` и `CarItem` вместо того, чтобы интерпретировать это как аннотацию типа.
+
+## Список моделей
+
+Таким же образом вы можете определять ответы как списки объектов.
+
+Для этого используйте `typing.List` из стандартной библиотеки Python (или просто `list` в Python 3.9 и выше):
+
+=== "Python 3.9+"
+
+ ```Python hl_lines="18"
+ {!> ../../../docs_src/extra_models/tutorial004_py39.py!}
+ ```
+
+=== "Python 3.6+"
+
+ ```Python hl_lines="1 20"
+ {!> ../../../docs_src/extra_models/tutorial004.py!}
+ ```
+
+## Ответ с произвольным `dict`
+
+Вы также можете определить ответ, используя произвольный одноуровневый `dict` и определяя только типы ключей и значений без использования Pydantic-моделей.
+
+Это полезно, если вы заранее не знаете корректных названий полей/атрибутов (которые будут нужны при использовании Pydantic-модели).
+
+В этом случае вы можете использовать `typing.Dict` (или просто `dict` в Python 3.9 и выше):
+
+=== "Python 3.9+"
+
+ ```Python hl_lines="6"
+ {!> ../../../docs_src/extra_models/tutorial005_py39.py!}
+ ```
+
+=== "Python 3.6+"
+
+ ```Python hl_lines="1 8"
+ {!> ../../../docs_src/extra_models/tutorial005.py!}
+ ```
+
+## Резюме
+
+Используйте несколько Pydantic-моделей и свободно применяйте наследование для каждой из них.
+
+Вам не обязательно иметь единственную модель данных для каждой сущности, если эта сущность должна иметь возможность быть в разных "состояниях". Как в случае с "сущностью" пользователя, у которого есть состояния с полями `password`, `password_hash` и без пароля.
diff --git a/docs/ru/docs/tutorial/metadata.md b/docs/ru/docs/tutorial/metadata.md
new file mode 100644
index 000000000..331c96734
--- /dev/null
+++ b/docs/ru/docs/tutorial/metadata.md
@@ -0,0 +1,111 @@
+# URL-адреса метаданных и документации
+
+Вы можете настроить несколько конфигураций метаданных в вашем **FastAPI** приложении.
+
+## Метаданные для API
+
+Вы можете задать следующие поля, которые используются в спецификации OpenAPI и в UI автоматической документации API:
+
+| Параметр | Тип | Описание |
+|------------|--|-------------|
+| `title` | `str` | Заголовок API. |
+| `description` | `str` | Краткое описание API. Может быть использован Markdown. |
+| `version` | `string` | Версия API. Версия вашего собственного приложения, а не OpenAPI. К примеру `2.5.0`. |
+| `terms_of_service` | `str` | Ссылка к условиям пользования API. Если указано, то это должен быть URL-адрес. |
+| `contact` | `dict` | Контактная информация для открытого API. Может содержать несколько полей.
поля
contact
Параметр Тип Описание name
str
Идентификационное имя контактного лица/организации. url
str
URL указывающий на контактную информацию. ДОЛЖЕН быть в формате URL. email
str
Email адрес контактного лица/организации. ДОЛЖЕН быть в формате email адреса. поля
license_info
Параметр Тип Описание name
str
ОБЯЗАТЕЛЬНО (если установлен параметр license_info
). Название лицензии, используемой для APIurl
str
URL, указывающий на лицензию, используемую для API. ДОЛЖЕН быть в формате URL.
+
+## Метаданные для тегов
+
+Вы также можете добавить дополнительные метаданные для различных тегов, используемых для группировки ваших операций пути с помощью параметра `openapi_tags`.
+
+Он принимает список, содержащий один словарь для каждого тега.
+
+Каждый словарь может содержать в себе:
+
+* `name` (**обязательно**): `str`-значение с тем же именем тега, которое вы используете в параметре `tags` в ваших *операциях пути* и `APIRouter`ах.
+* `description`: `str`-значение с кратким описанием для тега. Может содержать Markdown и будет отображаться в UI документации.
+* `externalDocs`: `dict`-значение описывающее внешнюю документацию. Включает в себя:
+ * `description`: `str`-значение с кратким описанием для внешней документации.
+ * `url` (**обязательно**): `str`-значение с URL-адресом для внешней документации.
+
+### Создание метаданных для тегов
+
+Давайте попробуем сделать это на примере с тегами для `users` и `items`.
+
+Создайте метаданные для ваших тегов и передайте их в параметре `openapi_tags`:
+
+```Python hl_lines="3-16 18"
+{!../../../docs_src/metadata/tutorial004.py!}
+```
+
+Помните, что вы можете использовать Markdown внутри описания, к примеру "login" будет отображен жирным шрифтом (**login**) и "fancy" будет отображаться курсивом (_fancy_).
+
+!!! tip "Подсказка"
+ Вам необязательно добавлять метаданные для всех используемых тегов
+
+### Используйте собственные теги
+Используйте параметр `tags` с вашими *операциями пути* (и `APIRouter`ами), чтобы присвоить им различные теги:
+
+```Python hl_lines="21 26"
+{!../../../docs_src/metadata/tutorial004.py!}
+```
+
+!!! info "Дополнительная информация"
+ Узнайте больше о тегах в [Конфигурации операции пути](../path-operation-configuration/#tags){.internal-link target=_blank}.
+
+### Проверьте документацию
+
+Теперь, если вы проверите документацию, вы увидите всю дополнительную информацию:
+
+
+
+### Порядок расположения тегов
+
+Порядок расположения словарей метаданных для каждого тега определяет также порядок, отображаемый в документах UI
+
+К примеру, несмотря на то, что `users` будут идти после `items` в алфавитном порядке, они отображаются раньше, потому что мы добавляем свои метаданные в качестве первого словаря в списке.
+
+## URL-адреса OpenAPI
+
+По умолчанию схема OpenAPI отображена по адресу `/openapi.json`.
+
+Но вы можете изменить это с помощью параметра `openapi_url`.
+
+К примеру, чтобы задать её отображение по адресу `/api/v1/openapi.json`:
+
+```Python hl_lines="3"
+{!../../../docs_src/metadata/tutorial002.py!}
+```
+
+Если вы хотите отключить схему OpenAPI полностью, вы можете задать `openapi_url=None`, это также отключит пользовательские интерфейсы документации, которые его использует.
+
+## URL-адреса документации
+
+Вы можете изменить конфигурацию двух пользовательских интерфейсов документации, среди которых
+
+* **Swagger UI**: отображаемый по адресу `/docs`.
+ * Вы можете задать его URL с помощью параметра `docs_url`.
+ * Вы можете отключить это с помощью настройки `docs_url=None`.
+* **ReDoc**: отображаемый по адресу `/redoc`.
+ * Вы можете задать его URL с помощью параметра `redoc_url`.
+ * Вы можете отключить это с помощью настройки `redoc_url=None`.
+
+К примеру, чтобы задать отображение Swagger UI по адресу `/documentation` и отключить ReDoc:
+
+```Python hl_lines="3"
+{!../../../docs_src/metadata/tutorial003.py!}
+```
diff --git a/docs/ru/docs/tutorial/path-operation-configuration.md b/docs/ru/docs/tutorial/path-operation-configuration.md
new file mode 100644
index 000000000..013903add
--- /dev/null
+++ b/docs/ru/docs/tutorial/path-operation-configuration.md
@@ -0,0 +1,179 @@
+# Конфигурация операций пути
+
+Существует несколько параметров, которые вы можете передать вашему *декоратору операций пути* для его настройки.
+
+!!! warning "Внимание"
+ Помните, что эти параметры передаются непосредственно *декоратору операций пути*, а не вашей *функции-обработчику операций пути*.
+
+## Коды состояния
+
+Вы можете определить (HTTP) `status_code`, который будет использован в ответах вашей *операции пути*.
+
+Вы можете передать только `int`-значение кода, например `404`.
+
+Но если вы не помните, для чего нужен каждый числовой код, вы можете использовать сокращенные константы в параметре `status`:
+
+=== "Python 3.10+"
+
+ ```Python hl_lines="1 15"
+ {!> ../../../docs_src/path_operation_configuration/tutorial001_py310.py!}
+ ```
+
+=== "Python 3.9+"
+
+ ```Python hl_lines="3 17"
+ {!> ../../../docs_src/path_operation_configuration/tutorial001_py39.py!}
+ ```
+
+=== "Python 3.6+"
+
+ ```Python hl_lines="3 17"
+ {!> ../../../docs_src/path_operation_configuration/tutorial001.py!}
+ ```
+
+Этот код состояния будет использован в ответе и будет добавлен в схему OpenAPI.
+
+!!! note "Технические детали"
+ Вы также можете использовать `from starlette import status`.
+
+ **FastAPI** предоставляет тот же `starlette.status` под псевдонимом `fastapi.status` для удобства разработчика. Но его источник - это непосредственно Starlette.
+
+## Теги
+
+Вы можете добавлять теги к вашим *операциям пути*, добавив параметр `tags` с `list` заполненным `str`-значениями (обычно в нём только одна строка):
+
+=== "Python 3.10+"
+
+ ```Python hl_lines="15 20 25"
+ {!> ../../../docs_src/path_operation_configuration/tutorial002_py310.py!}
+ ```
+
+=== "Python 3.9+"
+
+ ```Python hl_lines="17 22 27"
+ {!> ../../../docs_src/path_operation_configuration/tutorial002_py39.py!}
+ ```
+
+=== "Python 3.6+"
+
+ ```Python hl_lines="17 22 27"
+ {!> ../../../docs_src/path_operation_configuration/tutorial002.py!}
+ ```
+
+Они будут добавлены в схему OpenAPI и будут использованы в автоматической документации интерфейса:
+
+
+
+### Теги с перечислениями
+
+Если у вас большое приложение, вы можете прийти к необходимости добавить **несколько тегов**, и возможно, вы захотите убедиться в том, что всегда используете **один и тот же тег** для связанных *операций пути*.
+
+В этих случаях, имеет смысл хранить теги в классе `Enum`.
+
+**FastAPI** поддерживает это так же, как и в случае с обычными строками:
+
+```Python hl_lines="1 8-10 13 18"
+{!../../../docs_src/path_operation_configuration/tutorial002b.py!}
+```
+
+## Краткое и развёрнутое содержание
+
+Вы можете добавить параметры `summary` и `description`:
+
+=== "Python 3.10+"
+
+ ```Python hl_lines="18-19"
+ {!> ../../../docs_src/path_operation_configuration/tutorial003_py310.py!}
+ ```
+
+=== "Python 3.9+"
+
+ ```Python hl_lines="20-21"
+ {!> ../../../docs_src/path_operation_configuration/tutorial003_py39.py!}
+ ```
+
+=== "Python 3.6+"
+
+ ```Python hl_lines="20-21"
+ {!> ../../../docs_src/path_operation_configuration/tutorial003.py!}
+ ```
+
+## Описание из строк документации
+
+Так как описания обычно длинные и содержат много строк, вы можете объявить описание *операции пути* в функции строки документации и **FastAPI** прочитает её отсюда.
+
+Вы можете использовать Markdown в строке документации, и он будет интерпретирован и отображён корректно (с учетом отступа в строке документации).
+
+=== "Python 3.10+"
+
+ ```Python hl_lines="17-25"
+ {!> ../../../docs_src/path_operation_configuration/tutorial004_py310.py!}
+ ```
+
+=== "Python 3.9+"
+
+ ```Python hl_lines="19-27"
+ {!> ../../../docs_src/path_operation_configuration/tutorial004_py39.py!}
+ ```
+
+=== "Python 3.6+"
+
+ ```Python hl_lines="19-27"
+ {!> ../../../docs_src/path_operation_configuration/tutorial004.py!}
+ ```
+
+Он будет использован в интерактивной документации:
+
+
+
+## Описание ответа
+
+Вы можете указать описание ответа с помощью параметра `response_description`:
+
+=== "Python 3.10+"
+
+ ```Python hl_lines="19"
+ {!> ../../../docs_src/path_operation_configuration/tutorial005_py310.py!}
+ ```
+
+=== "Python 3.9+"
+
+ ```Python hl_lines="21"
+ {!> ../../../docs_src/path_operation_configuration/tutorial005_py39.py!}
+ ```
+
+=== "Python 3.6+"
+
+ ```Python hl_lines="21"
+ {!> ../../../docs_src/path_operation_configuration/tutorial005.py!}
+ ```
+
+!!! info "Дополнительная информация"
+ Помните, что `response_description` относится конкретно к ответу, а `description` относится к *операции пути* в целом.
+
+!!! check "Технические детали"
+ OpenAPI указывает, что каждой *операции пути* необходимо описание ответа.
+
+ Если вдруг вы не укажете его, то **FastAPI** автоматически сгенерирует это описание с текстом "Successful response".
+
+
+
+## Обозначение *операции пути* как устаревшей
+
+Если вам необходимо пометить *операцию пути* как устаревшую, при этом не удаляя её, передайте параметр `deprecated`:
+
+```Python hl_lines="16"
+{!../../../docs_src/path_operation_configuration/tutorial006.py!}
+```
+
+Он будет четко помечен как устаревший в интерактивной документации:
+
+
+
+Проверьте, как будут выглядеть устаревшие и не устаревшие *операции пути*:
+
+
+
+## Резюме
+
+Вы можете легко конфигурировать и добавлять метаданные в ваши *операции пути*, передавая параметры *декораторам операций пути*.
diff --git a/docs/ru/mkdocs.yml b/docs/ru/mkdocs.yml
index 9fb56ce1b..4a7512ac0 100644
--- a/docs/ru/mkdocs.yml
+++ b/docs/ru/mkdocs.yml
@@ -77,12 +77,17 @@ nav:
- tutorial/extra-data-types.md
- tutorial/cookie-params.md
- tutorial/testing.md
+ - tutorial/extra-models.md
- tutorial/response-status-code.md
- tutorial/query-params.md
- tutorial/body-multiple-params.md
+ - tutorial/metadata.md
+ - tutorial/path-operation-configuration.md
+ - tutorial/cors.md
- tutorial/static-files.md
- tutorial/debugging.md
- tutorial/schema-extra-example.md
+ - tutorial/body-nested-models.md
- async.md
- Развёртывание:
- deployment/index.md
diff --git a/docs/sq/docs/index.md b/docs/sq/docs/index.md
index cff2c2804..a83b7b519 100644
--- a/docs/sq/docs/index.md
+++ b/docs/sq/docs/index.md
@@ -441,7 +441,6 @@ To understand more about it, see the section
ujson
- for faster JSON "parsing".
* email_validator
- for email validation.
Used by Starlette:
diff --git a/docs/sv/docs/index.md b/docs/sv/docs/index.md
index 23143a96f..47d62f8c4 100644
--- a/docs/sv/docs/index.md
+++ b/docs/sv/docs/index.md
@@ -444,7 +444,6 @@ To understand more about it, see the section ujson
- for faster JSON "parsing".
* email_validator
- for email validation.
Used by Starlette:
diff --git a/docs/tr/docs/index.md b/docs/tr/docs/index.md
index 6bd30d709..2339337f3 100644
--- a/docs/tr/docs/index.md
+++ b/docs/tr/docs/index.md
@@ -449,7 +449,6 @@ Daha fazla bilgi için, bu bölüme bir göz at ujson
- daha hızlı JSON "dönüşümü" için.
* email_validator
- email doğrulaması için.
Starlette tarafında kullanılan:
diff --git a/docs/uk/docs/index.md b/docs/uk/docs/index.md
index cff2c2804..a83b7b519 100644
--- a/docs/uk/docs/index.md
+++ b/docs/uk/docs/index.md
@@ -441,7 +441,6 @@ To understand more about it, see the section ujson
- for faster JSON "parsing".
* email_validator
- for email validation.
Used by Starlette:
diff --git a/docs/zh/docs/advanced/security/index.md b/docs/zh/docs/advanced/security/index.md
new file mode 100644
index 000000000..962523c09
--- /dev/null
+++ b/docs/zh/docs/advanced/security/index.md
@@ -0,0 +1,16 @@
+# 高级安全 - 介绍
+
+## 附加特性
+
+除 [教程 - 用户指南: 安全性](../../tutorial/security/){.internal-link target=_blank} 中涵盖的功能之外,还有一些额外的功能来处理安全性.
+
+!!! tip "小贴士"
+ 接下来的章节 **并不一定是 "高级的"**.
+
+ 而且对于你的使用场景来说,解决方案很可能就在其中。
+
+## 先阅读教程
+
+接下来的部分假设你已经阅读了主要的 [教程 - 用户指南: 安全性](../../tutorial/security/){.internal-link target=_blank}.
+
+它们都基于相同的概念,但支持一些额外的功能.
diff --git a/docs/zh/docs/advanced/settings.md b/docs/zh/docs/advanced/settings.md
new file mode 100644
index 000000000..597e99a77
--- /dev/null
+++ b/docs/zh/docs/advanced/settings.md
@@ -0,0 +1,433 @@
+# 设置和环境变量
+
+在许多情况下,您的应用程序可能需要一些外部设置或配置,例如密钥、数据库凭据、电子邮件服务的凭据等等。
+
+这些设置中的大多数是可变的(可以更改的),比如数据库的 URL。而且许多设置可能是敏感的,比如密钥。
+
+因此,通常会将它们提供为由应用程序读取的环境变量。
+
+## 环境变量
+
+!!! tip
+ 如果您已经知道什么是"环境变量"以及如何使用它们,请随意跳到下面的下一节。
+
+环境变量(也称为"env var")是一种存在于 Python 代码之外、存在于操作系统中的变量,可以被您的 Python 代码(或其他程序)读取。
+
+您可以在 shell 中创建和使用环境变量,而无需使用 Python:
+
+=== "Linux、macOS、Windows Bash"
+
+
ujson
- 更快的 JSON 「解析」。
* email_validator
- 用于 email 校验。
用于 Starlette:
diff --git a/docs/zh/docs/tutorial/testing.md b/docs/zh/docs/tutorial/testing.md
new file mode 100644
index 000000000..41f01f8d8
--- /dev/null
+++ b/docs/zh/docs/tutorial/testing.md
@@ -0,0 +1,212 @@
+# 测试
+
+感谢 Starlette,测试**FastAPI** 应用轻松又愉快。
+
+它基于 HTTPX, 而HTTPX又是基于Requests设计的,所以很相似且易懂。
+
+有了它,你可以直接与**FastAPI**一起使用 pytest。
+
+## 使用 `TestClient`
+
+!!! 信息
+ 要使用 `TestClient`,先要安装 `httpx`.
+
+ 例:`pip install httpx`.
+
+导入 `TestClient`.
+
+通过传入你的**FastAPI**应用创建一个 `TestClient` 。
+
+创建名字以 `test_` 开头的函数(这是标准的 `pytest` 约定)。
+
+像使用 `httpx` 那样使用 `TestClient` 对象。
+
+为你需要检查的地方用标准的Python表达式写个简单的 `assert` 语句(重申,标准的`pytest`)。
+
+```Python hl_lines="2 12 15-18"
+{!../../../docs_src/app_testing/tutorial001.py!}
+```
+
+!!! 提示
+ 注意测试函数是普通的 `def`,不是 `async def`。
+
+ 还有client的调用也是普通的调用,不是用 `await`。
+
+ 这让你可以直接使用 `pytest` 而不会遇到麻烦。
+
+!!! note "技术细节"
+ 你也可以用 `from starlette.testclient import TestClient`。
+
+ **FastAPI** 提供了和 `starlette.testclient` 一样的 `fastapi.testclient`,只是为了方便开发者。但它直接来自Starlette。
+
+!!! 提示
+ 除了发送请求之外,如果你还想测试时在FastAPI应用中调用 `async` 函数(例如异步数据库函数), 可以在高级教程中看下 [Async Tests](../advanced/async-tests.md){.internal-link target=_blank} 。
+
+## 分离测试
+
+在实际应用中,你可能会把你的测试放在另一个文件里。
+
+您的**FastAPI**应用程序也可能由一些文件/模块组成等等。
+
+### **FastAPI** app 文件
+
+假设你有一个像 [更大的应用](./bigger-applications.md){.internal-link target=_blank} 中所描述的文件结构:
+
+```
+.
+├── app
+│ ├── __init__.py
+│ └── main.py
+```
+
+在 `main.py` 文件中你有一个 **FastAPI** app:
+
+
+```Python
+{!../../../docs_src/app_testing/main.py!}
+```
+
+### 测试文件
+
+然后你会有一个包含测试的文件 `test_main.py` 。app可以像Python包那样存在(一样是目录,但有个 `__init__.py` 文件):
+
+``` hl_lines="5"
+.
+├── app
+│ ├── __init__.py
+│ ├── main.py
+│ └── test_main.py
+```
+
+因为这文件在同一个包中,所以你可以通过相对导入从 `main` 模块(`main.py`)导入`app`对象:
+
+```Python hl_lines="3"
+{!../../../docs_src/app_testing/test_main.py!}
+```
+
+...然后测试代码和之前一样的。
+
+## 测试:扩展示例
+
+现在让我们扩展这个例子,并添加更多细节,看下如何测试不同部分。
+
+### 扩展后的 **FastAPI** app 文件
+
+让我们继续之前的文件结构:
+
+```
+.
+├── app
+│ ├── __init__.py
+│ ├── main.py
+│ └── test_main.py
+```
+
+假设现在包含**FastAPI** app的文件 `main.py` 有些其他**路径操作**。
+
+有个 `GET` 操作会返回错误。
+
+有个 `POST` 操作会返回一些错误。
+
+所有*路径操作* 都需要一个`X-Token` 头。
+
+=== "Python 3.10+"
+
+ ```Python
+ {!> ../../../docs_src/app_testing/app_b_an_py310/main.py!}
+ ```
+
+=== "Python 3.9+"
+
+ ```Python
+ {!> ../../../docs_src/app_testing/app_b_an_py39/main.py!}
+ ```
+
+=== "Python 3.6+"
+
+ ```Python
+ {!> ../../../docs_src/app_testing/app_b_an/main.py!}
+ ```
+
+=== "Python 3.10+ non-Annotated"
+
+ !!! tip
+ Prefer to use the `Annotated` version if possible.
+
+ ```Python
+ {!> ../../../docs_src/app_testing/app_b_py310/main.py!}
+ ```
+
+=== "Python 3.6+ non-Annotated"
+
+ !!! tip
+ Prefer to use the `Annotated` version if possible.
+
+ ```Python
+ {!> ../../../docs_src/app_testing/app_b/main.py!}
+ ```
+
+### 扩展后的测试文件
+
+然后您可以使用扩展后的测试更新`test_main.py`:
+
+```Python
+{!> ../../../docs_src/app_testing/app_b/test_main.py!}
+```
+
+每当你需要客户端在请求中传递信息,但你不知道如何传递时,你可以通过搜索(谷歌)如何用 `httpx`做,或者是用 `requests` 做,毕竟HTTPX的设计是基于Requests的设计的。
+
+接着只需在测试中同样操作。
+
+示例:
+
+* 传一个*路径* 或*查询* 参数,添加到URL上。
+* 传一个JSON体,传一个Python对象(例如一个`dict`)到参数 `json`。
+* 如果你需要发送 *Form Data* 而不是 JSON,使用 `data` 参数。
+* 要发送 *headers*,传 `dict` 给 `headers` 参数。
+* 对于 *cookies*,传 `dict` 给 `cookies` 参数。
+
+关于如何传数据给后端的更多信息 (使用`httpx` 或 `TestClient`),请查阅 HTTPX 文档.
+
+!!! 信息
+ 注意 `TestClient` 接收可以被转化为JSON的数据,而不是Pydantic模型。
+
+ 如果你在测试中有一个Pydantic模型,并且你想在测试时发送它的数据给应用,你可以使用在[JSON Compatible Encoder](encoder.md){.internal-link target=_blank}介绍的`jsonable_encoder` 。
+
+## 运行起来
+
+之后,你只需要安装 `pytest`:
+
+