diff --git a/.github/DISCUSSION_TEMPLATE/translations.yml b/.github/DISCUSSION_TEMPLATE/translations.yml new file mode 100644 index 000000000..16e304d99 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/translations.yml @@ -0,0 +1,45 @@ +labels: [lang-all] +body: + - type: markdown + attributes: + value: | + Thanks for your interest in helping translate the FastAPI docs! 🌍 + + Please follow these instructions carefully to propose a new language translation. 🙏 + + This structured process helps ensure translations can be properly maintained long-term. + - type: checkboxes + id: checks + attributes: + label: Initial Checks + description: Please confirm and check all the following options. + options: + - label: I checked that this language is not already being translated in FastAPI docs. + required: true + - label: I searched existing discussions to ensure no one else proposed this language. + required: true + - label: I am a native speaker of the language I want to help translate. + required: true + - type: input + id: language + attributes: + label: Target Language + description: What language do you want to translate the FastAPI docs into? + placeholder: e.g. Latin + validations: + required: true + - type: textarea + id: additional_info + attributes: + label: Additional Information + description: Any other relevant information about your translation proposal + - type: markdown + attributes: + value: | + Translations are automatized with AI and then reviewed by native speakers. 🤖 🙋 + + This allows us to keep them consistent and up-to-date. + + If there are several native speakers commenting on this discussion and + committing to help review new translations, the FastAPI team will review it + and potentially make it an official translation. 😎 diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index 6ecdf487c..e84e4e4ab 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -53,7 +53,7 @@ jobs: with: python-version: "3.11" - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true @@ -95,7 +95,7 @@ jobs: with: python-version: "3.11" - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true diff --git a/.github/workflows/contributors.yml b/.github/workflows/contributors.yml index 87abfe3a1..34b54b452 100644 --- a/.github/workflows/contributors.yml +++ b/.github/workflows/contributors.yml @@ -30,7 +30,7 @@ jobs: with: python-version: "3.11" - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index aec327f48..9ca69b208 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -29,7 +29,7 @@ jobs: with: python-version: "3.11" - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true diff --git a/.github/workflows/label-approved.yml b/.github/workflows/label-approved.yml index 02070146c..908a9453d 100644 --- a/.github/workflows/label-approved.yml +++ b/.github/workflows/label-approved.yml @@ -26,7 +26,7 @@ jobs: with: python-version: "3.11" - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true diff --git a/.github/workflows/notify-translations.yml b/.github/workflows/notify-translations.yml index c96992689..621d1253a 100644 --- a/.github/workflows/notify-translations.yml +++ b/.github/workflows/notify-translations.yml @@ -34,7 +34,7 @@ jobs: with: python-version: "3.11" - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true diff --git a/.github/workflows/people.yml b/.github/workflows/people.yml index 6ec3c1ad2..c1df3455e 100644 --- a/.github/workflows/people.yml +++ b/.github/workflows/people.yml @@ -30,7 +30,7 @@ jobs: with: python-version: "3.11" - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true @@ -51,3 +51,4 @@ jobs: run: python ./scripts/people.py env: GITHUB_TOKEN: ${{ secrets.FASTAPI_PEOPLE }} + SLEEP_INTERVAL: ${{ vars.PEOPLE_SLEEP_INTERVAL }} diff --git a/.github/workflows/smokeshow.yml b/.github/workflows/smokeshow.yml index a0ffd55e6..d8a5dfb30 100644 --- a/.github/workflows/smokeshow.yml +++ b/.github/workflows/smokeshow.yml @@ -26,7 +26,7 @@ jobs: with: python-version: '3.9' - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true diff --git a/.github/workflows/sponsors.yml b/.github/workflows/sponsors.yml index a5230c834..6da4d90e1 100644 --- a/.github/workflows/sponsors.yml +++ b/.github/workflows/sponsors.yml @@ -30,7 +30,7 @@ jobs: with: python-version: "3.11" - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5e8092641..c3940be01 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -29,7 +29,7 @@ jobs: with: python-version: "3.11" - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true @@ -67,7 +67,7 @@ jobs: with: python-version: ${{ matrix.python-version }} - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true @@ -112,7 +112,7 @@ jobs: with: python-version: '3.8' - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true diff --git a/.github/workflows/topic-repos.yml b/.github/workflows/topic-repos.yml index 3c5c881f1..433aeb00b 100644 --- a/.github/workflows/topic-repos.yml +++ b/.github/workflows/topic-repos.yml @@ -25,7 +25,7 @@ jobs: with: python-version: "3.11" - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 05c33a608..e461b0133 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,7 +14,7 @@ repos: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.9.4 + rev: v0.12.4 hooks: - id: ruff args: diff --git a/README.md b/README.md index 9a1260b90..b3eaa6b35 100644 --- a/README.md +++ b/README.md @@ -48,22 +48,21 @@ The key features are: - - - - - + - + + - + + + @@ -150,7 +149,7 @@ $ pip install "fastapi[standard]" ### Create it -* Create a file `main.py` with: +Create a file `main.py` with: ```Python from typing import Union @@ -472,15 +471,20 @@ Used by Starlette: * jinja2 - Required if you want to use the default template configuration. * python-multipart - Required if you want to support form "parsing", with `request.form()`. -Used by FastAPI / Starlette: +Used by FastAPI: * uvicorn - for the server that loads and serves your application. This includes `uvicorn[standard]`, which includes some dependencies (e.g. `uvloop`) needed for high performance serving. -* `fastapi-cli` - to provide the `fastapi` command. +* `fastapi-cli[standard]` - to provide the `fastapi` command. + * This includes `fastapi-cloud-cli`, which allows you to deploy your FastAPI application to FastAPI Cloud. ### Without `standard` Dependencies If you don't want to include the `standard` optional dependencies, you can install with `pip install fastapi` instead of `pip install "fastapi[standard]"`. +### Without `fastapi-cloud-cli` + +If you want to install FastAPI with the standard dependencies but without the `fastapi-cloud-cli`, you can install with `pip install "fastapi[standard-no-fastapi-cloud-cli]"`. + ### Additional Optional Dependencies There are some additional dependencies you might want to install. diff --git a/docs/bn/docs/about/index.md b/docs/bn/docs/about/index.md new file mode 100644 index 000000000..b6d611ae9 --- /dev/null +++ b/docs/bn/docs/about/index.md @@ -0,0 +1,3 @@ +# āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ + +**FastAPI** āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤ — āĻāϰ āĻĄāĻŋāϜāĻžāχāύ, āĻ…āύ⧁āĻĒā§āϰ⧇āϰāĻŖāĻž āĻ“ āφāϰāĻ“ āĻ…āύ⧇āĻ• āĻ•āĻŋāϛ⧁āĨ¤ 🤓 diff --git a/docs/bn/docs/environment-variables.md b/docs/bn/docs/environment-variables.md new file mode 100644 index 000000000..9122ca5bf --- /dev/null +++ b/docs/bn/docs/environment-variables.md @@ -0,0 +1,298 @@ +# āĻāύāĻ­āĻžāϝāĻŧāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞāϏ + +/// tip + +āφāĻĒāύāĻŋ āϝāĻĻāĻŋ "āĻāύāĻ­āĻžāϝāĻŧāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞāϏ" āϕ⧀ āĻāĻŦāĻ‚ āϏ⧇āϗ⧁āϞ⧋ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻšāϝāĻŧ āϏ⧇āϟāĻž āϜāĻžāύ⧇āύ, āϤāĻžāĻšāϞ⧇ āĻāχ āĻ…āĻ‚āĻļāϟāĻŋ āĻ¸ā§āĻ•āĻŋāĻĒ āĻ•āϰ⧇ āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ + +/// + +āĻāύāĻ­āĻžāϝāĻŧāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ (āϏāĻ‚āĻ•ā§āώ⧇āĻĒ⧇ "**env var**" āύāĻžāĻŽā§‡āĻ“ āĻĒāϰāĻŋāϚāĻŋāϤ) āĻšāϞ⧋ āĻāĻŽāύ āĻāĻ•āϟāĻŋ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ āϝāĻž āĻĒāĻžāχāĻĨāύ āϕ⧋āĻĄā§‡āϰ **āĻŦāĻžāχāϰ⧇**, **āĻ…āĻĒāĻžāϰ⧇āϟāĻŋāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡** āĻĨāĻžāϕ⧇ āĻāĻŦāĻ‚ āφāĻĒāύāĻžāϰ āĻĒāĻžāχāĻĨāύ āϕ⧋āĻĄ (āĻŦāĻž āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ) āĻĻā§āĻŦāĻžāϰāĻž āϝāĻžāϕ⧇ āϰāĻŋāĻĄ āĻ•āϰāĻž āϝāĻžāϝāĻŧāĨ¤ + +āĻāύāĻ­āĻžāϝāĻŧāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞāϏ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇āϰ **āϏ⧇āϟāĻŋāĻ‚āϏ** āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāϤ⧇, āĻĒāĻžāχāĻĨāύ⧇āϰ **āχāύāĻ¸ā§āϟāϞ⧇āĻļāύ** āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāϰ āĻ…āĻ‚āĻļ āĻšāĻŋāϏ⧇āĻŦ⧇, āχāĻ¤ā§āϝāĻžāĻĻāĻŋ āĻ•āĻžāĻœā§‡ āωāĻĒāϝ⧋āĻ—ā§€ āĻšāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ + +## Env Vars āϤ⧈āϰ⧀ āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰ + +āφāĻĒāύāĻŋ **āĻļ⧇āϞ (āϟāĻžāĻ°ā§āĻŽāĻŋāύāĻžāϞ)**-āĻ, āĻĒāĻžāχāĻĨāύ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻ›āĻžāĻĄāĻŧāĻžāχ, āĻāύāĻ­āĻžāϝāĻŧāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞāϏ **āϤ⧈āϰāĻŋ** āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύāσ + +//// tab | āϞāĻŋāύāĻžāĻ•ā§āϏ, āĻŽā§āϝāĻžāĻ•āĻ“āĻāϏ, āωāχāĻ¨ā§āĻĄā§‹āϜ Bash + +
+ +```console +// āφāĻĒāύāĻŋ āϚāĻžāχāϞ⧇ MY_NAME āύāĻžāĻŽā§‡ āĻāĻ•āϟāĻŋ env var āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ +$ export MY_NAME="Wade Wilson" + +// āϤāĻžāϰāĻĒāϰ⧇ āĻāϟāĻŋāϕ⧇ āϚāĻžāχāϞ⧇ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ +$ echo "Hello $MY_NAME" + +Hello Wade Wilson +``` + +
+ +//// + +//// tab | āωāχāĻ¨ā§āĻĄā§‹āϜ āĻĒāĻžāĻ“ā§ŸāĻžāϰāĻļ⧇āϞ + +
+ +```console +// MY_NAME āύāĻžāĻŽā§‡ env var āϤ⧈āϰāĻŋ +$ $Env:MY_NAME = "Wade Wilson" + +// āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡ āĻāϟāĻŋāϕ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ +$ echo "Hello $Env:MY_NAME" + +Hello Wade Wilson +``` + +
+ +//// + +## āĻĒāĻžāχāĻĨāύ⧇ env vars āϰāĻŋāĻĄ āĻ•āϰāĻž + +āφāĻĒāύāĻŋ āϚāĻžāχāϞ⧇ āĻĒāĻžāχāĻĨāύ⧇āϰ **āĻŦāĻžāχāϰ⧇**, āϟāĻžāĻ°ā§āĻŽāĻŋāύāĻžāϞ⧇ (āĻŦāĻž āĻ…āĻ¨ā§āϝ āϕ⧋āύ⧋ āωāĻĒāĻžāϝāĻŧ⧇) āĻāύāĻ­āĻžāϝāĻŧāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞāϏ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ, āĻāĻŦāĻ‚ āĻĒāϰ⧇ āϏ⧇āϗ⧁āϞ⧋ **āĻĒāĻžāχāĻĨāύ⧇ āϰāĻŋāĻĄ** (āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰāϤ⧇) āĻĒāĻžāϰ⧇āύāĨ¤ + +āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āφāĻĒāύāĻžāϰ `main.py` āύāĻžāĻŽā§‡ āĻāĻ•āϟāĻŋ āĻĢāĻžāχāϞ āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰ⧇āσ + +```Python hl_lines="3" +import os + +name = os.getenv("MY_NAME", "World") +print(f"Hello {name} from Python") +``` + +/// tip + +`os.getenv()` āĻāϰ āĻĻā§āĻŦāĻŋāĻ¤ā§€ā§Ÿ āφāĻ°ā§āϗ⧁āĻŽā§‡āĻ¨ā§āϟāϟāĻŋ āĻšāϞ⧋ āĻāϰ āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻ­ā§āϝāĻžāϞ⧁ āϝāĻž āϰāĻŋāϟāĻžāĻ°ā§āύ āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤ + +āϝāĻĻāĻŋ āĻāϟāĻŋ āĻĻ⧇āĻ“ā§ŸāĻž āύāĻž āĻšā§Ÿ, āĻĄāĻŋāĻĢāĻ˛ā§āϟāĻ­āĻžāĻŦ⧇ `None` āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšāĻŦ⧇, āĻāĻ–āĻžāύ⧇ āφāĻŽāϰāĻž āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻ­ā§āϝāĻžāϞ⧁ āĻšāĻŋāϏ⧇āĻŦ⧇ `"World"` āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĻ›āĻŋāĨ¤ + +/// + +āϤāĻžāϰāĻĒāϰ⧇ āĻĒāĻžāχāĻĨāύ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋāϕ⧇ āύāĻŋāĻŽā§āύ⧋āĻ•ā§āϤāĻ­āĻžāĻŦ⧇ āĻ•āϞ āĻ•āϰāĻž āϝāĻžāĻŦ⧇āσ + +//// tab | āϞāĻŋāύāĻžāĻ•ā§āϏ, āĻŽā§āϝāĻžāĻ•āĻ“āĻāϏ, āωāχāĻ¨ā§āĻĄā§‹āϜ Bash + +
+ +```console +// āĻāĻ–āύ⧋ āφāĻŽāϰāĻž āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ āϏ⧇āϟ āĻ•āϰāĻŋāύāĻŋ +$ python main.py + +// āϝ⧇āĻšā§‡āϤ⧁ env var āϏ⧇āϟ āĻ•āϰāĻž āĻšā§ŸāύāĻŋ, āϤāĻžāχ āφāĻŽāϰāĻž āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻ­ā§āϝāĻžāϞ⧁ āĻĒāĻžāĻšā§āĻ›āĻŋ + +Hello World from Python + +// āĻ•āĻŋāĻ¨ā§āϤ⧁ āφāĻŽāϰāĻž āĻĒā§āϰāĻĨāĻŽā§‡ āϝāĻĻāĻŋ āĻāĻ•āϟāĻž āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟ āĻ­āĻžāϰāĻŋā§Ÿā§‡āĻŦāϞ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āύ⧇āχ +$ export MY_NAME="Wade Wilson" + +// āĻāĻŦāĻ‚ āϤāĻžāϰāĻĒāϰ āφāĻŦāĻžāϰ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāϟāĻŋāϕ⧇ āĻ•āϞ āĻ•āϰāĻŋ +$ python main.py + +// āĻāĻ–āύ āĻāϟāĻŋ āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ āϰāĻŋāĻĄ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇ + +Hello Wade Wilson from Python +``` + +
+ +//// + +//// tab | āωāχāĻ¨ā§āĻĄā§‹āϜ āĻĒāĻžāĻ“ā§ŸāĻžāϰāĻļ⧇āϞ + +
+ +```console +// āĻāĻ–āύ⧋ āφāĻŽāϰāĻž āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ āϏ⧇āϟ āĻ•āϰāĻŋāύāĻŋ +$ python main.py + +// āϝ⧇āĻšā§‡āϤ⧁ env var āϏ⧇āϟ āĻ•āϰāĻž āĻšā§ŸāύāĻŋ, āϤāĻžāχ āφāĻŽāϰāĻž āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻ­ā§āϝāĻžāϞ⧁ āĻĒāĻžāĻšā§āĻ›āĻŋ + +Hello World from Python + +// āĻ•āĻŋāĻ¨ā§āϤ⧁ āφāĻŽāϰāĻž āĻĒā§āϰāĻĨāĻŽā§‡ āϝāĻĻāĻŋ āĻāĻ•āϟāĻž āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟ āĻ­āĻžāϰāĻŋā§Ÿā§‡āĻŦāϞ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āύ⧇āχ +$ $Env:MY_NAME = "Wade Wilson" + +// āĻāĻŦāĻ‚ āϤāĻžāϰāĻĒāϰ āφāĻŦāĻžāϰ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāϟāĻŋāϕ⧇ āĻ•āϞ āĻ•āϰāĻŋ +$ python main.py + +// āĻāĻ–āύ āĻāϟāĻŋ āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ āϰāĻŋāĻĄ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇ + +Hello Wade Wilson from Python +``` + +
+ +//// + +āϝ⧇āĻšā§‡āϤ⧁ āĻāύāĻ­āĻžāϝāĻŧāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞāϏ āϕ⧋āĻĄā§‡āϰ āĻŦāĻžāχāϰ⧇ āϏ⧇āϟ āĻ•āϰāĻž āϝāĻžāϝāĻŧ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻĒāϰāĻŦāĻ°ā§āϤ⧀āϤ⧇ āϕ⧋āĻĄ āĻĻā§āĻŦāĻžāϰāĻž āϰāĻŋāĻĄ āĻ•āϰāĻž āϝāĻžāϝāĻŧ, āĻāĻŦāĻ‚ āĻŦāĻžāĻ•āĻŋ āĻĢāĻžāχāϞāϗ⧁āϞ⧋āϰ āϏāĻžāĻĨ⧇ āϰāĻžāĻ–āϤ⧇ (`git` āĻ āĻ•āĻŽāĻŋāϟ) āĻšā§Ÿ āύāĻž, āϤāĻžāχ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύāϏ āĻŦāĻž **āϏ⧇āϟāĻŋāĻ‚āϏ** āĻāϰ āϜāĻ¨ā§āϝ āĻāϗ⧁āϞ⧋ āϏāĻžāϧāĻžāϰāĻŖāϤ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšā§Ÿā§‡ āĻĨāĻžāϕ⧇āĨ¤ + +āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āĻāύāĻ­āĻžāϝāĻŧāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻāĻ•āϟāĻŋ **āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āχāύāĻ­ā§‹āϕ⧇āĻļāύ⧇āϰ** āϜāĻ¨ā§āϝāĻ“ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ, āϝāĻž āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āϏ⧇āχ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡āϰ āϜāĻ¨ā§āϝāχ āĻāϭ⧇āχāϞ⧇āĻŦāϞ āĻĨāĻžāĻ•āĻŦ⧇ āĻāĻŦāĻ‚ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āϤāĻžāϰ āϚāϞāĻžāĻ•āĻžāϞ⧀āύ āϏāĻŽāϝāĻŧ āĻĒāĻ°ā§āϝāĻ¨ā§āϤāχ āϏāĻ•ā§āϰāĻŋāϝāĻŧ āĻĨāĻžāĻ•āĻŦ⧇āĨ¤ + +āĻāϟāĻŋ āĻ•āϰāϤ⧇, āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋ āϰāĻžāύ āĻ•āϰāĻžāϰ āĻ āĻŋāĻ• āφāϗ⧇āχ, āĻāĻ•āχ āϞāĻžāχāύ⧇ āĻāύāĻ­āĻžāϝāĻŧāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ: + +
+ +```console +// āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋ āĻ•āϞ āĻ•āϰāĻžāϰ āϏāĻŽā§Ÿ āĻāĻ•āχ āϞāĻžāχāύ⧇ MY_NAME āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋā§Ÿā§‡āĻŦāϞ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ +$ MY_NAME="Wade Wilson" python main.py + +// āĻāĻ–āύ āĻāϟāĻŋ āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟ āĻ­ā§āϝāϰāĻŋā§Ÿā§‡āĻŦāϞāϟāĻŋāϕ⧇ āϰāĻŋāĻĄ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇ + +Hello Wade Wilson from Python + +// āĻĒāϰāĻŦāĻ°ā§āϤ⧀āϤ⧇ āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞāϟāĻŋāϕ⧇ āφāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝāĻžāĻšā§āϛ⧇ āύāĻž +$ python main.py + +Hello World from Python +``` + +
+ +/// tip + +āĻāϟāĻŋ āύāĻŋā§Ÿā§‡ āφāϰ⧋ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤ āĻĒ⧜āϤ⧇ āĻĒāĻžāϰ⧇āύ āĻāĻ–āĻžāύ⧇ The Twelve-Factor App: ConfigāĨ¤ + +/// + +## āϟāĻžāχāĻĒāϏ āĻāĻŦāĻ‚ āĻ­ā§āϝāĻžāϞāĻŋāĻĄā§‡āĻļāύ + +āĻāχ āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞāϗ⧁āϞ⧋ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ **āĻŸā§‡āĻ•ā§āϏāϟ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚āϏ** āĻšā§āϝāĻžāĻ¨ā§āĻĄā§‡āϞ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇, āϝ⧇āĻšā§‡āϤ⧁ āĻāϗ⧁āϞ⧋ āĻĒāĻžāχāĻĨāύ⧇āϰ āĻŦāĻžāχāϰ⧇ āĻ…āĻŦāĻ¸ā§āĻĨāĻŋāϤ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻāĻŦāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āĻŦāĻžāĻ•āĻŋ āĻ…āĻ‚āĻļ⧇āϰ (āĻāĻŽāύāĻ•āĻŋ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻ…āĻĒāĻžāϰ⧇āϟāĻŋāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āϝ⧇āĻŽāύ āϞāĻŋāύāĻžāĻ•ā§āϏ, āωāχāĻ¨ā§āĻĄā§‹āϜ, āĻŽā§āϝāĻžāĻ•āĻ“āĻāϏ) āϏāĻžāĻĨ⧇ āϏāĻžāĻŽāĻžā§āϜāĻ¸ā§āϝāĻĒā§‚āĻ°ā§āĻŖ āĻšāϤ⧇ āĻšāϝāĻŧāĨ¤ + +āĻāϰ āĻ…āĻ°ā§āĻĨ āĻšāĻšā§āϛ⧇ āĻĒāĻžāχāĻĨāύ⧇ āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ āĻĨ⧇āϕ⧇ āϰāĻŋāĻĄ āĻ•āϰāĻž **āϝ⧇āϕ⧋āύ⧋ āĻ­ā§āϝāĻžāϞ⧁** āĻāĻ•āϟāĻŋ `str` āĻšāĻŦ⧇, āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝ āϕ⧋āύ⧋ āϟāĻžāχāĻĒ⧇ āĻ•āύāĻ­āĻžāĻ°ā§āϏāύ āĻŦāĻž āϝ⧇āϕ⧋āύ⧋ āϭ⧇āϞāĻŋāĻĄā§‡āĻļāύ āϕ⧋āĻĄā§‡ āφāϞāĻžāĻĻāĻžāĻ­āĻžāĻŦ⧇ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤ + +āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ **āĻāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϏ⧇āϟāĻŋāĻ‚āϏ** āĻšā§āϝāĻžāĻ¨ā§āĻĄā§‡āϞ āĻ•āϰāĻž āύāĻŋā§Ÿā§‡ āφāϰ⧋ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤ āϜāĻžāύāĻž āϝāĻžāĻŦ⧇ [Advanced User Guide - Settings and Environment Variables](./advanced/settings.md){.internal-link target=_blank}. + +## `PATH` āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋā§Ÿā§‡āĻŦāϞ + +**`PATH`** āύāĻžāĻŽā§‡ āĻāĻ•āϟāĻŋ **āĻŦāĻŋāĻļ⧇āώ** āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋā§Ÿā§‡āĻŦāϞ āĻ°ā§Ÿā§‡āϛ⧇, āϝ⧇āϟāĻŋ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āϰāĻžāύ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻ…āĻĒāĻžāϰ⧇āϟāĻŋāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽāϏ (āϞāĻŋāύāĻžāĻ•ā§āϏ, āĻŽā§āϝāĻžāĻ•āĻ“āĻāϏ, āωāχāĻ¨ā§āĻĄā§‹āϜ) āĻĻā§āĻŦāĻžāϰāĻž āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšā§ŸāĨ¤ + +`PATH` āϭ⧇āϰāĻŋā§Ÿā§‡āĻŦāϞ āĻāϰ āĻ­ā§āϝāĻžāϞ⧁ āĻšāĻšā§āϛ⧇ āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻļāĻžāϞ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ āϝāĻž āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋāϕ⧇ āϕ⧋āϞāύ `:` āĻĻāĻŋā§Ÿā§‡ āφāϞāĻžāĻĻāĻž āĻ•āϰāĻžāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āϞāĻŋāύāĻžāĻ•ā§āϏ⧇ āĻ“ āĻŽā§āϝāĻžāĻ•āĻ“āĻāϏ āĻ, āĻāĻŦāĻ‚ āϏ⧇āĻŽāĻŋāϕ⧋āϞāύ `;` āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āωāχāĻ¨ā§āĻĄā§‹āϜ āĻ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻĨāĻžāϕ⧇āĨ¤ + +āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, `PATH` āϭ⧇āϰāĻŋā§Ÿā§‡āĻŦāϞ āύāĻŋāĻšā§‡āϰ āĻŽāϤ⧋ āĻĻ⧇āĻ–āϤ⧇ āĻšāϤ⧇ āĻĒāĻžāϰ⧇āσ + +//// tab | āϞāĻŋāύāĻžāĻ•ā§āϏ, āĻŽā§āϝāĻžāĻ•āĻ“āĻāϏ + +```plaintext +/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin +``` + +āϤāĻžāϰāĻŽāĻžāύ⧇ āĻšāϞ⧋ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϗ⧁āϞ⧋āϕ⧇ āύāĻŋāĻšā§‡āϰ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋāϗ⧁āϞ⧋āϤ⧇ āϖ⧁āρāϜāĻŦ⧇āσ + +* `/usr/local/bin` +* `/usr/bin` +* `/bin` +* `/usr/sbin` +* `/sbin` + +//// + +//// tab | āωāχāĻ¨ā§āĻĄā§‹āϜ + +```plaintext +C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32 +``` + +āϤāĻžāϰāĻŽāĻžāύ⧇ āĻšāϞ⧋ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϗ⧁āϞ⧋āϕ⧇ āύāĻŋāĻšā§‡āϰ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋāϗ⧁āϞ⧋āϤ⧇ āϖ⧁āρāϜāĻŦ⧇āσ + +* `C:\Program Files\Python312\Scripts` +* `C:\Program Files\Python312` +* `C:\Windows\System32` + +//// + +āϝāĻ–āύ āφāĻĒāύāĻŋ āϟāĻžāĻ°ā§āĻŽāĻŋāύāĻžāϞ⧇ āϕ⧋āύ⧋ **āĻ•āĻŽāĻžāĻ¨ā§āĻĄ** āϞāĻŋāĻ–āĻŦ⧇āύ, āĻ…āĻĒāĻžāϰ⧇āϟāĻŋāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ **āĻĒā§āϰāĻ¤ā§āϝ⧇āĻ•āϟāĻŋ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋāϤ⧇** āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋ **āϖ⧁āρāϜāĻŦ⧇** āϝ⧇āϗ⧁āϞ⧋ `PATH` āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋā§Ÿā§‡āĻŦāϞ āĻ āϞāĻŋāĻ¸ā§āϟ āĻ•āϰāĻž āφāϛ⧇āĨ¤ + +āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āϝāĻ–āύ āφāĻĒāύāĻŋ āϟāĻžāĻ°ā§āĻŽāĻŋāύāĻžāϞ⧇ `python` āϟāĻžāχāĻĒ āĻ•āϰāĻŦ⧇āύ, āĻ…āĻĒāĻžāϰ⧇āϟāĻŋāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻāχ āϞāĻŋāĻ¸ā§āϟ āĻāϰ **āĻĒā§āϰāĻĨāĻŽ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋāϤ⧇** `python` āύāĻžāĻŽā§‡āϰ āĻāĻ•āϟāĻŋ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āϖ⧁āρāϜāĻŦ⧇āĨ¤ + +āϝāĻĻāĻŋ āĻāϟāĻŋ āϖ⧁āρāĻœā§‡ āĻĒāĻžā§Ÿ, āϤāĻžāĻšāϞ⧇ āĻāϟāĻŋ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋāϕ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āĨ¤ āĻ…āĻ¨ā§āϝāĻĨāĻžā§Ÿ āĻāϟāĻŋ **āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋāϗ⧁āϞ⧋āϤ⧇** āĻāϟāĻŋāϕ⧇ āϖ⧁āρāϜāϤ⧇ āĻĨāĻžāĻ•āĻŦ⧇āĨ¤ + +### āĻĒāĻžāχāĻĨāύ āχāύāĻ¸ā§āϟāϞ āĻāĻŦāĻ‚ `PATH` āφāĻĒāĻĄā§‡āϟ + +āϝāĻ–āύ āφāĻĒāύāĻŋ āĻĒāĻžāχāĻĨāύ āχāύāĻ¸ā§āϟāϞ āĻ•āϰ⧇āύ, āφāĻĒāύāĻŋ `PATH` āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋā§Ÿā§‡āĻŦāϞ āφāĻĒāĻĄā§‡āϟ āĻ•āϰāϤ⧇ āϚāĻžāύ āĻ•āĻŋāύāĻž āϏ⧇āϟāĻž āϜāĻŋāĻœā§āĻžā§‡āϏ āĻ•āϰāĻž āĻšāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ + +//// tab | āϞāĻŋāύāĻžāĻ•ā§āϏ, āĻŽā§āϝāĻžāĻ•āĻ“āĻāϏ + +āϧāϰāĻž āϝāĻžāĻ• āφāĻĒāύāĻŋ āĻĒāĻžāχāĻĨāύ āχāύāĻ¸ā§āϟāϞ āĻ•āϰāϞ⧇āύ āĻāĻŦāĻ‚ āĻāϟāĻŋ `/opt/custompython/bin` āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋāϤ⧇ āχāύāĻ¸ā§āϟāϞ āĻšāĻšā§āϛ⧇āĨ¤ + +āϝāĻĻāĻŋ āφāĻĒāύāĻŋ "Yes" āϏāĻŋāϞ⧇āĻ•ā§āϟ āĻ•āϰ⧇ `PATH` āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋā§Ÿā§‡āĻŦāϞ āφāĻĒāĻĄā§‡āϟ āĻ•āϰāϤ⧇ āϚāĻžāύ, āϤāĻžāĻšāϞ⧇ āχāύāĻ¸ā§āϟāϞāĻžāϰ `/opt/custompython/bin` āϕ⧇ `PATH` āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋā§Ÿā§‡āĻŦāϞ āĻ āĻāĻĄ āĻ•āϰ⧇ āĻĻāĻŋāĻŦ⧇āĨ¤ + +āĻāϟāĻž āĻĻ⧇āĻ–āϤ⧇ āĻāĻŽāύāϟāĻž āĻšāϤ⧇ āĻĒāĻžāϰ⧇āσ + +```plaintext +/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/custompython/bin +``` + +āĻāχāĻ­āĻžāĻŦ⧇, āφāĻĒāύāĻŋ āϝāĻ–āύ āϟāĻžāĻ°ā§āĻŽāĻŋāύāĻžāϞ⧇ `python` āϟāĻžāχāĻĒ āĻ•āϰ⧇āύ, āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻĒāĻžāχāĻĨāύ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋāϕ⧇ `/opt/custompython/bin` (āϏāĻ°ā§āĻŦāĻļ⧇āώ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋ) āϤ⧇ āϖ⧁āρāĻœā§‡ āĻĒāĻžāĻŦ⧇ āĻāĻŦāĻ‚ āĻāϟāĻžāϕ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āĨ¤ + +//// + +//// tab | āωāχāĻ¨ā§āĻĄā§‹āϜ + +āϧāϰāĻž āϝāĻžāĻ• āφāĻĒāύāĻŋ āĻĒāĻžāχāĻĨāύ āχāύāĻ¸ā§āϟāϞ āĻ•āϰāϞ⧇āύ āĻāĻŦāĻ‚ āĻāϟāĻŋ `C:\opt\custompython\bin` āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋāϤ⧇ āχāύāĻ¸ā§āϟāϞ āĻšāĻšā§āϛ⧇āĨ¤ + +āϝāĻĻāĻŋ āφāĻĒāύāĻŋ "Yes" āϏāĻŋāϞ⧇āĻ•ā§āϟ āĻ•āϰ⧇ `PATH` āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋā§Ÿā§‡āĻŦāϞ āφāĻĒāĻĄā§‡āϟ āĻ•āϰāϤ⧇ āϚāĻžāύ, āϤāĻžāĻšāϞ⧇ āχāύāĻ¸ā§āϟāϞāĻžāϰ `C:\opt\custompython\bin` āϕ⧇ `PATH` āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋā§Ÿā§‡āĻŦāϞ āĻ āĻāĻĄ āĻ•āϰ⧇ āĻĻāĻŋāĻŦ⧇āĨ¤ + +```plaintext +C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32;C:\opt\custompython\bin +``` + +āĻāχāĻ­āĻžāĻŦ⧇, āφāĻĒāύāĻŋ āϝāĻ–āύ āϟāĻžāĻ°ā§āĻŽāĻŋāύāĻžāϞ⧇ `python` āϟāĻžāχāĻĒ āĻ•āϰ⧇āύ, āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻĒāĻžāχāĻĨāύ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋāϕ⧇ `C:\opt\custompython\bin` (āϏāĻ°ā§āĻŦāĻļ⧇āώ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋ) āϤ⧇ āϖ⧁āρāĻœā§‡ āĻĒāĻžāĻŦ⧇ āĻāĻŦāĻ‚ āĻāϟāĻžāϕ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āĨ¤ + +//// + +āϤāĻžāχ, āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āϟāĻžāχāĻĒ āĻ•āϰ⧇āύāσ + +
+ +```console +$ python +``` + +
+ +//// tab | āϞāĻŋāύāĻžāĻ•ā§āϏ, āĻŽā§āϝāĻžāĻ•āĻ“āĻāϏ + +āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ `python` āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϕ⧇ `/opt/custompython/bin` āĻ **āϖ⧁āρāĻœā§‡ āĻĒāĻžāĻŦ⧇** āĻāĻŦāĻ‚ āĻāϟāĻžāϕ⧇ āϰāĻžāύ āĻ•āϰāĻŦ⧇āĨ¤ + +āĻāϟāĻž āĻŽā§‹āϟāĻžāĻŽā§āϟāĻŋāĻ­āĻžāĻŦ⧇ āύāĻŋāĻšā§‡āϰ āĻŽāϤ⧋ āĻ•āϰ⧇ āϞ⧇āĻ–āĻžāϰ āϏāĻŽāĻžāύ āĻšāĻŦ⧇āσ + +
+ +```console +$ /opt/custompython/bin/python +``` + +
+ +//// + +//// tab | āωāχāĻ¨ā§āĻĄā§‹āϜ + +āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ `python` āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϕ⧇ `C:\opt\custompython\bin\python` āĻ **āϖ⧁āρāĻœā§‡ āĻĒāĻžāĻŦ⧇** āĻāĻŦāĻ‚ āĻāϟāĻžāϕ⧇ āϰāĻžāύ āĻ•āϰāĻŦ⧇āĨ¤ + +āĻāϟāĻž āĻŽā§‹āϟāĻžāĻŽā§āϟāĻŋāĻ­āĻžāĻŦ⧇ āύāĻŋāĻšā§‡āϰ āĻŽāϤ⧋ āĻ•āϰ⧇ āϞ⧇āĻ–āĻžāϰ āϏāĻŽāĻžāύ āĻšāĻŦ⧇āσ + +
+ +```console +$ C:\opt\custompython\bin\python +``` + +
+ +//// + +āĻāχ āϤāĻĨā§āϝāϗ⧁āϞ⧋ [āĻ­āĻžāĻ°ā§āϚ⧁⧟āĻžāϞ āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟāϏ](virtual-environments.md){.internal-link target=_blank} āĻļ⧇āĻ–āĻžāϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āϏāĻšāĻžā§ŸāĻ• āĻšāĻŦ⧇āĨ¤ + +## āωāĻĒāϏāĻ‚āĻšāĻžāϰ + +āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āφāĻĒāύāĻŋ **āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋā§Ÿā§‡āĻŦāϞāϏ** āĻ•āĻŋ āĻāĻŦāĻ‚ āĻāϟāĻŋāϕ⧇ āĻĒāĻžāχāĻĨāύ⧇ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻšā§Ÿ āϤāĻžāϰ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻŦ⧇āϏāĻŋāĻ• āϧāĻžāϰāύāĻž āĻĒ⧇āϞ⧇āύāĨ¤ + +āϚāĻžāχāϞ⧇ āĻāχ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āφāϰ⧋ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤ āĻĒ⧜āϤ⧇ āĻĒāĻžāϰ⧇āύ Wikipedia for Environment Variable āĻāĨ¤ + +āĻ…āύ⧇āĻ• āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇, āĻĻ⧇āĻ–āĻž āĻŽāĻžāĻ¤ā§āϰāχ āĻāύāĻ­āĻžāϝāĻŧāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻĒā§āĻ°ā§Ÿā§‹āϜāύ āĻšāĻŦ⧇ āϤāĻž āĻ¸ā§āĻĒāĻˇā§āϟ āĻšā§Ÿ āύāĻžāĨ¤ āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻĄā§‡āϭ⧇āϞāĻĒāĻŽā§‡āĻ¨ā§āĻŸā§‡āϰ āϏāĻŽāϝāĻŧ āφāĻĒāύāĻŋ āύāĻžāύāĻž āϰāĻ•āĻŽ āĻĒāϰāĻŋāĻ¸ā§āĻĨāĻŋāϤāĻŋāϤ⧇ āĻāϗ⧁āϞ⧋āϰ āϏāĻŽā§āĻŽā§āĻ–ā§€āύ āĻšāĻŦ⧇āύ, āϤāĻžāχ āĻāϗ⧁āϞ⧋ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻœā§‡āύ⧇ āϰāĻžāĻ–āĻž āĻ­āĻžāϞ⧋āĨ¤ + +āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āφāĻĒāύāĻžāϰ āĻāχ āχāύāĻĢāϰāĻŽā§‡āĻļāύāϟāĻŋ āĻĒāϰāĻŦāĻ°ā§āϤ⧀, [āĻ­āĻžāĻ°ā§āϚ⧁⧟āĻžāϞ āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟāϏ](virtual-environments.md) āĻ…āĻ‚āĻļ⧇ āĻĻāϰāĻ•āĻžāϰ āĻšāĻŦ⧇āĨ¤ diff --git a/docs/de/docs/advanced/generate-clients.md b/docs/de/docs/advanced/generate-clients.md index 38a69031c..f491d29af 100644 --- a/docs/de/docs/advanced/generate-clients.md +++ b/docs/de/docs/advanced/generate-clients.md @@ -20,7 +20,7 @@ Einige von diesen ✨ [**sponsern FastAPI**](../help-fastapi.md#den-autor-sponse Und es zeigt deren wahres Engagement fÃŧr FastAPI und seine **Community** (Sie), da diese Ihnen nicht nur einen **guten Service** bieten mÃļchten, sondern auch sicherstellen mÃļchten, dass Sie Ãŧber ein **gutes und gesundes Framework** verfÃŧgen, FastAPI. 🙇 -Beispielsweise kÃļnnten Sie Speakeasy ausprobieren. +Beispielsweise kÃļnnten Sie Speakeasy ausprobieren. Es gibt auch mehrere andere Unternehmen, welche ähnliche Dienste anbieten und die Sie online suchen und finden kÃļnnen. 🤓 diff --git a/docs/de/docs/deployment/concepts.md b/docs/de/docs/deployment/concepts.md index 97ad854e2..907598e54 100644 --- a/docs/de/docs/deployment/concepts.md +++ b/docs/de/docs/deployment/concepts.md @@ -216,7 +216,7 @@ Dieser Manager-Prozess wäre wahrscheinlich derjenige, welcher der IP am **Port* Diese Workerprozesse wÃŧrden Ihre Anwendung ausfÃŧhren, sie wÃŧrden die Hauptberechnungen durchfÃŧhren, um einen **Request** entgegenzunehmen und eine **Response** zurÃŧckzugeben, und sie wÃŧrden alles, was Sie in Variablen einfÃŧgen, in den RAM laden. - + Und natÃŧrlich wÃŧrden auf derselben Maschine neben Ihrer Anwendung wahrscheinlich auch **andere Prozesse** laufen. diff --git a/docs/de/docs/deployment/https.md b/docs/de/docs/deployment/https.md index 630582995..a216f44af 100644 --- a/docs/de/docs/deployment/https.md +++ b/docs/de/docs/deployment/https.md @@ -85,7 +85,7 @@ Zuerst wÃŧrde der Browser mithilfe der **DNS-Server** herausfinden, welches die Die DNS-Server geben dem Browser eine bestimmte **IP-Adresse** zurÃŧck. Das wäre die von Ihrem Server verwendete Ãļffentliche IP-Adresse, die Sie in den DNS-Servern konfiguriert haben. - + ### TLS-Handshake-Start @@ -93,7 +93,7 @@ Der Browser kommuniziert dann mit dieser IP-Adresse Ãŧber **Port 443** (den HTTP Der erste Teil der Kommunikation besteht lediglich darin, die Verbindung zwischen dem Client und dem Server herzustellen und die zu verwendenden kryptografischen SchlÃŧssel usw. zu vereinbaren. - + Diese Interaktion zwischen dem Client und dem Server zum Aufbau der TLS-Verbindung wird als **TLS-Handshake** bezeichnet. @@ -111,7 +111,7 @@ Mithilfe der oben beschriebenen **SNI-Erweiterung** wÃŧrde der TLS-Terminierungs In diesem Fall wÃŧrde er das Zertifikat fÃŧr `someapp.example.com` verwenden. - + Der Client **vertraut** bereits der Entität, die das TLS-Zertifikat generiert hat (in diesem Fall Let's Encrypt, aber wir werden später mehr darÃŧber erfahren), sodass er **verifizieren** kann, dass das Zertifikat gÃŧltig ist. @@ -133,19 +133,19 @@ Da Client und Server (sprich, der Browser und der TLS-Terminierungsproxy) nun Ãŧ Der Client sendet also einen **HTTPS-Request**. Das ist einfach ein HTTP-Request Ãŧber eine verschlÃŧsselte TLS-Verbindung. - + ### Den Request entschlÃŧsseln Der TLS-Terminierungsproxy wÃŧrde die vereinbarte VerschlÃŧsselung zum **EntschlÃŧsseln des Requests** verwenden und den **einfachen (entschlÃŧsselten) HTTP-Request** an den Prozess weiterleiten, der die Anwendung ausfÃŧhrt (z. B. einen Prozess, bei dem Uvicorn die FastAPI-Anwendung ausfÃŧhrt). - + ### HTTP-Response Die Anwendung wÃŧrde den Request verarbeiten und eine **einfache (unverschlÃŧsselte) HTTP-Response** an den TLS-Terminierungsproxy senden. - + ### HTTPS-Response @@ -153,7 +153,7 @@ Der TLS-Terminierungsproxy wÃŧrde dann die Response mithilfe der zuvor vereinbar Als Nächstes ÃŧberprÃŧft der Browser, ob die Response gÃŧltig und mit dem richtigen kryptografischen SchlÃŧssel usw. verschlÃŧsselt ist. Anschließend **entschlÃŧsselt er die Response** und verarbeitet sie. - + Der Client (Browser) weiß, dass die Response vom richtigen Server kommt, da dieser die Kryptografie verwendet, die zuvor mit dem **HTTPS-Zertifikat** vereinbart wurde. @@ -163,7 +163,7 @@ Auf demselben Server (oder denselben Servern) kÃļnnten sich **mehrere Anwendunge Nur ein Prozess kann diese spezifische IP und den Port verarbeiten (in unserem Beispiel der TLS-Terminierungsproxy), aber die anderen Anwendungen/Prozesse kÃļnnen auch auf dem/den Server(n) ausgefÃŧhrt werden, solange sie nicht versuchen, dieselbe **Kombination aus Ãļffentlicher IP und Port** zu verwenden. - + Auf diese Weise kÃļnnte der TLS-Terminierungsproxy HTTPS und Zertifikate fÃŧr **mehrere Domains**, fÃŧr mehrere Anwendungen, verarbeiten und die Requests dann jeweils an die richtige Anwendung weiterleiten. @@ -173,7 +173,7 @@ Irgendwann in der Zukunft wÃŧrde jedes Zertifikat **ablaufen** (etwa 3 Monate na Und dann gäbe es ein anderes Programm (in manchen Fällen ist es ein anderes Programm, in manchen Fällen ist es derselbe TLS-Terminierungsproxy), das mit Let's Encrypt kommuniziert und das/die Zertifikat(e) erneuert. - + Die **TLS-Zertifikate** sind **einem Domainnamen zugeordnet**, nicht einer IP-Adresse. diff --git a/docs/de/docs/how-to/custom-docs-ui-assets.md b/docs/de/docs/how-to/custom-docs-ui-assets.md index ab8cd9f6b..f68902b99 100644 --- a/docs/de/docs/how-to/custom-docs-ui-assets.md +++ b/docs/de/docs/how-to/custom-docs-ui-assets.md @@ -98,7 +98,7 @@ Sie kÃļnnen wahrscheinlich mit der rechten Maustaste auf jeden Link klicken und Und **ReDoc** verwendet diese Datei: -* `redoc.standalone.js` +* `redoc.standalone.js` Danach kÃļnnte Ihre Dateistruktur wie folgt aussehen: @@ -129,14 +129,8 @@ Sie sollten eine sehr lange JavaScript-Datei fÃŧr **ReDoc** sehen. Sie kÃļnnte beginnen mit etwas wie: ```JavaScript -/*! - * ReDoc - OpenAPI/Swagger-generated API Reference Documentation - * ------------------------------------------------------------- - * Version: "2.0.0-rc.18" - * Repo: https://github.com/Redocly/redoc - */ -!function(e,t){"object"==typeof exports&&"object"==typeof m - +/*! For license information please see redoc.standalone.js.LICENSE.txt */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("null")): ... ``` diff --git a/docs/de/docs/tutorial/bigger-applications.md b/docs/de/docs/tutorial/bigger-applications.md index 59e91bdcc..514e3fd3a 100644 --- a/docs/de/docs/tutorial/bigger-applications.md +++ b/docs/de/docs/tutorial/bigger-applications.md @@ -52,7 +52,7 @@ from app.routers import items * Es gibt auch ein Unterverzeichnis `app/internal/` mit einer weiteren Datei `__init__.py`, es handelt sich also um ein weiteres „Python-Subpackage“: `app.internal`. * Und die Datei `app/internal/admin.py` ist ein weiteres Submodul: `app.internal.admin`. - + Die gleiche Dateistruktur mit Kommentaren: @@ -270,7 +270,7 @@ Aber diese Datei existiert nicht, unsere Abhängigkeiten befinden sich in einer Erinnern Sie sich, wie unsere Anwendungs-/Dateistruktur aussieht: - + --- diff --git a/docs/em/docs/deployment/concepts.md b/docs/em/docs/deployment/concepts.md index 019703296..bbb017277 100644 --- a/docs/em/docs/deployment/concepts.md +++ b/docs/em/docs/deployment/concepts.md @@ -216,7 +216,7 @@ 👈 👨‍🏭 đŸ› ī¸ 🔜 🕐 🏃‍♂ 👆 🈸, đŸ‘Ģ 🔜 🎭 👑 📊 📨 **📨** & 📨 **📨**, & đŸ‘Ģ 🔜 📐 đŸ•ŗ 👆 🚮 đŸ”ĸ 💾. - + & â†—ī¸, 🎏 🎰 🔜 🎲 âœ”ī¸ **🎏 đŸ› ī¸** 🏃 👍, â†–ī¸ âšĒī¸âžĄī¸ 👆 🈸. diff --git a/docs/em/docs/deployment/https.md b/docs/em/docs/deployment/https.md index 31cf99001..6d2641a92 100644 --- a/docs/em/docs/deployment/https.md +++ b/docs/em/docs/deployment/https.md @@ -85,7 +85,7 @@ 🏓 đŸ’Ŋ 🔜 đŸ’Ŧ đŸ–Ĩ âš™ī¸ đŸŽ¯ **đŸ“ĸ đŸ“ĸ**. 👈 🔜 đŸ“ĸ đŸ“ĸ đŸ“ĸ âš™ī¸ 👆 đŸ’Ŋ, 👈 👆 🔗 🏓 đŸ’Ŋ. - + ### 🤝 🤝 â–ļī¸ @@ -93,7 +93,7 @@ đŸĨ‡ 🍕 đŸ“ģ đŸ› ī¸ 🔗 🖖 👩‍đŸ’ģ & đŸ’Ŋ & 💭 🔐 🔑 đŸ‘Ģ 🔜 âš™ī¸, â™’ī¸. - + 👉 🔗 🖖 👩‍đŸ’ģ & đŸ’Ŋ đŸ› ī¸ 🤝 🔗 🤙 **🤝 🤝**. @@ -111,7 +111,7 @@ 👉 đŸ’ŧ, âšĢī¸ 🔜 âš™ī¸ 📄 `someapp.example.com`. - + 👩‍đŸ’ģ âĒ **💙** 👨‍đŸ’ŧ 👈 🏗 👈 🤝 📄 (👉 đŸ’ŧ âžĄī¸ 🗜, âœ‹ī¸ đŸ‘Ĩ 🔜 👀 🔃 👈 âĒ), âšĢī¸ đŸ’Ē **✔** 👈 📄 ☑. @@ -133,19 +133,19 @@ , 👩‍đŸ’ģ 📨 **đŸ‡ē🇸🔍 📨**. 👉 đŸ‡ē🇸🔍 📨 🔘 🗜 🤝 🔗. - + ### 🗜 📨 🤝 ❎ đŸ—ŗ 🔜 âš™ī¸ 🔐 ✔ **🗜 📨**, & 🔜 đŸ“ļ **✅ (🗜) đŸ‡ē🇸🔍 📨** đŸ› ī¸ 🏃 🈸 (đŸ–ŧ đŸ› ī¸ âŽī¸ Uvicorn 🏃‍♂ FastAPI 🈸). - + ### đŸ‡ē🇸🔍 📨 🈸 🔜 đŸ› ī¸ 📨 & 📨 **✅ (đŸ’Ŋ) đŸ‡ē🇸🔍 📨** 🤝 ❎ đŸ—ŗ. - + ### đŸ‡ē🇸🔍 📨 @@ -153,7 +153,7 @@ ⏭, đŸ–Ĩ 🔜 ✔ 👈 📨 ☑ & 🗜 âŽī¸ â–ļī¸ī¸ 🔐 🔑, â™’ī¸. âšĢī¸ 🔜 â¤´ī¸ **🗜 📨** & đŸ› ī¸ âšĢī¸. - + 👩‍đŸ’ģ (đŸ–Ĩ) 🔜 💭 👈 📨 👟 âšĒī¸âžĄī¸ ☑ đŸ’Ŋ â†Šī¸ âšĢī¸ âš™ī¸ ⚛ đŸ‘Ģ ✔ âš™ī¸ **đŸ‡ē🇸🔍 📄** ⏭. @@ -163,7 +163,7 @@ 🕴 1ī¸âƒŖ đŸ› ī¸ đŸ’Ē 🚚 đŸŽ¯ đŸ“ĸ & ⛴ (🤝 ❎ đŸ—ŗ 👆 đŸ–ŧ) âœ‹ī¸ 🎏 🈸/đŸ› ī¸ đŸ’Ē 🏃 🔛 đŸ’Ŋ(Ⓜ) đŸ’â€â™‚ī¸, 📏 đŸ‘Ģ đŸšĢ 🔄 âš™ī¸ 🎏 **🌀 đŸ“ĸ đŸ“ĸ & ⛴**. - + 👈 🌌, 🤝 ❎ đŸ—ŗ đŸ’Ē đŸĩ đŸ‡ē🇸🔍 & 📄 **💗 🆔**, 💗 🈸, & â¤´ī¸ đŸ“ļ 📨 â–ļī¸ī¸ 🈸 🔠 đŸ’ŧ. @@ -173,7 +173,7 @@ & â¤´ī¸, 📤 🔜 ➕1ī¸âƒŖ 📋 (đŸ’ŧ âšĢī¸ ➕1ī¸âƒŖ 📋, đŸ’ŧ âšĢī¸ đŸ’Ē 🎏 🤝 ❎ đŸ—ŗ) 👈 🔜 đŸ’Ŧ âžĄī¸ 🗜, & â™ģ 📄(Ⓜ). - + **🤝 📄** **🔗 âŽī¸ 🆔 📛**, đŸšĢ âŽī¸ đŸ“ĸ đŸ“ĸ. diff --git a/docs/em/docs/tutorial/bigger-applications.md b/docs/em/docs/tutorial/bigger-applications.md index 68f506f27..78a321ae6 100644 --- a/docs/em/docs/tutorial/bigger-applications.md +++ b/docs/em/docs/tutorial/bigger-applications.md @@ -52,7 +52,7 @@ from app.routers import items * 📤 📁 `app/internal/` âŽī¸ ➕1ī¸âƒŖ 📁 `__init__.py`, âšĢī¸ ➕1ī¸âƒŖ "🐍 đŸ“Ļ": `app.internal`. * & 📁 `app/internal/admin.py` ➕1ī¸âƒŖ 🔁: `app.internal.admin`. - + 🎏 📁 📊 âŽī¸ 🏤: @@ -244,7 +244,7 @@ from .dependencies import get_token_header 💭 ❔ 👆 📱/📁 📊 👀 💖: - + --- diff --git a/docs/en/data/contributors.yml b/docs/en/data/contributors.yml index c4364e923..e06510ac4 100644 --- a/docs/en/data/contributors.yml +++ b/docs/en/data/contributors.yml @@ -1,18 +1,23 @@ tiangolo: login: tiangolo - count: 723 + count: 753 avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 url: https://github.com/tiangolo dependabot: login: dependabot - count: 94 + count: 104 avatarUrl: https://avatars.githubusercontent.com/in/29110?v=4 url: https://github.com/apps/dependabot alejsdev: login: alejsdev count: 47 - avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=356f39ff3f0211c720b06d3dbb060e98884085e3&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=638c65283ac9e9e2c3a0f9d1e3370db4b8a2c58d&v=4 url: https://github.com/alejsdev +pre-commit-ci: + login: pre-commit-ci + count: 33 + avatarUrl: https://avatars.githubusercontent.com/in/68672?v=4 + url: https://github.com/apps/pre-commit-ci github-actions: login: github-actions count: 26 @@ -23,11 +28,6 @@ Kludex: count: 23 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4 url: https://github.com/Kludex -pre-commit-ci: - login: pre-commit-ci - count: 22 - avatarUrl: https://avatars.githubusercontent.com/in/68672?v=4 - url: https://github.com/apps/pre-commit-ci dmontagu: login: dmontagu count: 17 @@ -70,7 +70,7 @@ vishnuvskvkl: url: https://github.com/vishnuvskvkl svlandeg: login: svlandeg - count: 6 + count: 7 avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4 url: https://github.com/svlandeg alissadb: @@ -116,7 +116,7 @@ hitrust: ShahriyarR: login: ShahriyarR count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/3852029?u=c9a1691e5ebdc94cbf543086099a6ed705cdb873&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/3852029?u=631b2ae59360ab380c524b32bc3d245aff1165af&v=4 url: https://github.com/ShahriyarR adriangb: login: adriangb @@ -171,7 +171,7 @@ hukkin: marcosmmb: login: marcosmmb count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/6181089?u=b8567a842b38c5570c315b2b7ca766fa7be6721e&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/6181089?u=03c50eec631857d84df5232890780d00a3f76903&v=4 url: https://github.com/marcosmmb Serrones: login: Serrones @@ -183,11 +183,11 @@ uriyyo: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/32038156?u=a27b65a9ec3420586a827a0facccbb8b6df1ffb3&v=4 url: https://github.com/uriyyo -amacfie: - login: amacfie +andrew222651: + login: andrew222651 count: 3 avatarUrl: https://avatars.githubusercontent.com/u/889657?u=d70187989940b085bcbfa3bedad8dbc5f3ab1fe7&v=4 - url: https://github.com/amacfie + url: https://github.com/andrew222651 rkbeatss: login: rkbeatss count: 3 @@ -311,7 +311,7 @@ dconathan: Jamim: login: Jamim count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/5607572?u=0cf3027bec78ba4f0b89802430c136bc69847d7a&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/5607572?u=9ce0b6a6d1a5124e28b3c04d8d26827ca328713a&v=4 url: https://github.com/Jamim svalouch: login: svalouch @@ -366,7 +366,7 @@ sattosan: michaeloliverx: login: michaeloliverx count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/55017335?u=e606eb5cc397c07523be47637b1ee796904fbb59&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/55017335?u=efb0cb6e261ff64d862fafb91ee80fc2e1f8a2ed&v=4 url: https://github.com/michaeloliverx voegtlel: login: voegtlel @@ -488,6 +488,11 @@ Lancetnik: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/44573917?u=f9a18be7324333daf9cc314c35c3051f0a20a7a6&v=4 url: https://github.com/Lancetnik +joakimnordling: + login: joakimnordling + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/6637576?u=df5d99db9b899b399effd429f4358baaa6f7199c&v=4 + url: https://github.com/joakimnordling yogabonito: login: yogabonito count: 2 @@ -508,6 +513,11 @@ tamird: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/1535036?v=4 url: https://github.com/tamird +ndimares: + login: ndimares + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/6267663?u=cfb27efde7a7212be8142abb6c058a1aeadb41b1&v=4 + url: https://github.com/ndimares rabinlamadong: login: rabinlamadong count: 2 @@ -518,6 +528,11 @@ AyushSinghal1794: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/89984761?v=4 url: https://github.com/AyushSinghal1794 +gsheni: + login: gsheni + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/8726321?u=ee3bd9ff6320f4715d1dd9671a3d55cccb65b984&v=4 + url: https://github.com/gsheni DanielKusyDev: login: DanielKusyDev count: 2 @@ -528,3 +543,18 @@ DanielYang59: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/80093591?u=63873f701c7c74aac83c906800a1dddc0bc8c92f&v=4 url: https://github.com/DanielYang59 +valentinDruzhinin: + login: valentinDruzhinin + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4 + url: https://github.com/valentinDruzhinin +blueswen: + login: blueswen + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/1564148?u=6d6b8cc8f2b5cef715e68d6175154a8a94d518ee&v=4 + url: https://github.com/blueswen +YuriiMotov: + login: YuriiMotov + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 + url: https://github.com/YuriiMotov diff --git a/docs/en/data/external_links.yml b/docs/en/data/external_links.yml index 9e411a631..50f84ecbf 100644 --- a/docs/en/data/external_links.yml +++ b/docs/en/data/external_links.yml @@ -411,3 +411,8 @@ Talks: author_link: https://twitter.com/chriswithers13 link: https://www.youtube.com/watch?v=3DLwPcrE5mA title: 'PyCon UK 2019: FastAPI from the ground up' + Taiwanese: + - author: Blueswen + author_link: https://github.com/blueswen + link: https://www.youtube.com/watch?v=y3sumuoDq4w + title: 'PyCon TW 2024: 全斚äŊåŧˇåŒ– Python æœå‹™å¯č§€æ¸Ŧ性īŧšäģĨ FastAPI 和 Grafana Stack į‚ē例' diff --git a/docs/en/data/github_sponsors.yml b/docs/en/data/github_sponsors.yml index 805d72b73..0cb200185 100644 --- a/docs/en/data/github_sponsors.yml +++ b/docs/en/data/github_sponsors.yml @@ -1,22 +1,13 @@ sponsors: +- - login: classmethod + avatarUrl: https://avatars.githubusercontent.com/u/1532151?v=4 + url: https://github.com/classmethod - - login: renderinc avatarUrl: https://avatars.githubusercontent.com/u/36424661?v=4 url: https://github.com/renderinc - - login: bump-sh - avatarUrl: https://avatars.githubusercontent.com/u/33217836?v=4 - url: https://github.com/bump-sh - - login: Nixtla - avatarUrl: https://avatars.githubusercontent.com/u/79945230?v=4 - url: https://github.com/Nixtla - login: andrew-propelauth - avatarUrl: https://avatars.githubusercontent.com/u/89474256?u=1188c27cb744bbec36447a2cfd4453126b2ddb5c&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/89474256?u=c98993dec8553c09d424ede67bbe86e5c35f48c9&v=4 url: https://github.com/andrew-propelauth - - login: liblaber - avatarUrl: https://avatars.githubusercontent.com/u/100821118?v=4 - url: https://github.com/liblaber - - login: zanfaruqui - avatarUrl: https://avatars.githubusercontent.com/u/104461687?v=4 - url: https://github.com/zanfaruqui - login: blockbee-io avatarUrl: https://avatars.githubusercontent.com/u/115143449?u=1b8620c2d6567c4df2111a371b85a51f448f9b85&v=4 url: https://github.com/blockbee-io @@ -26,16 +17,25 @@ sponsors: - login: coderabbitai avatarUrl: https://avatars.githubusercontent.com/u/132028505?v=4 url: https://github.com/coderabbitai - - login: porter-dev - avatarUrl: https://avatars.githubusercontent.com/u/62078005?v=4 - url: https://github.com/porter-dev + - login: madisonredtfeldt + avatarUrl: https://avatars.githubusercontent.com/u/152656511?v=4 + url: https://github.com/madisonredtfeldt + - login: subtotal + avatarUrl: https://avatars.githubusercontent.com/u/176449348?v=4 + url: https://github.com/subtotal + - login: Nixtla + avatarUrl: https://avatars.githubusercontent.com/u/79945230?v=4 + url: https://github.com/Nixtla - login: scalar avatarUrl: https://avatars.githubusercontent.com/u/301879?v=4 url: https://github.com/scalar - - login: ObliviousAI avatarUrl: https://avatars.githubusercontent.com/u/65656077?v=4 url: https://github.com/ObliviousAI -- - login: svix +- - login: dribia + avatarUrl: https://avatars.githubusercontent.com/u/41189616?v=4 + url: https://github.com/dribia + - login: svix avatarUrl: https://avatars.githubusercontent.com/u/80175132?v=4 url: https://github.com/svix - login: stainless-api @@ -50,18 +50,21 @@ sponsors: - login: permitio avatarUrl: https://avatars.githubusercontent.com/u/71775833?v=4 url: https://github.com/permitio -- - login: mercedes-benz - avatarUrl: https://avatars.githubusercontent.com/u/34240465?v=4 - url: https://github.com/mercedes-benz - - login: xoflare +- - login: xoflare avatarUrl: https://avatars.githubusercontent.com/u/74335107?v=4 url: https://github.com/xoflare - login: marvin-robot avatarUrl: https://avatars.githubusercontent.com/u/41086007?u=b9fcab402d0cd0aec738b6574fe60855cb0cd36d&v=4 url: https://github.com/marvin-robot + - login: mercedes-benz + avatarUrl: https://avatars.githubusercontent.com/u/34240465?v=4 + url: https://github.com/mercedes-benz - login: Ponte-Energy-Partners avatarUrl: https://avatars.githubusercontent.com/u/114745848?v=4 url: https://github.com/Ponte-Energy-Partners + - login: snapit-cypher + avatarUrl: https://avatars.githubusercontent.com/u/115662654?v=4 + url: https://github.com/snapit-cypher - login: LambdaTest-Inc avatarUrl: https://avatars.githubusercontent.com/u/171592363?u=96606606a45fa170427206199014f2a5a2a4920b&v=4 url: https://github.com/LambdaTest-Inc @@ -77,59 +80,50 @@ sponsors: - - login: takashi-yoneya avatarUrl: https://avatars.githubusercontent.com/u/33813153?u=2d0522bceba0b8b69adf1f2db866503bd96f944e&v=4 url: https://github.com/takashi-yoneya + - login: Doist + avatarUrl: https://avatars.githubusercontent.com/u/2565372?v=4 + url: https://github.com/Doist - - login: mainframeindustries avatarUrl: https://avatars.githubusercontent.com/u/55092103?v=4 url: https://github.com/mainframeindustries - - login: CanoaPBC - avatarUrl: https://avatars.githubusercontent.com/u/64223768?v=4 - url: https://github.com/CanoaPBC - login: yasyf avatarUrl: https://avatars.githubusercontent.com/u/709645?u=f36736b3c6a85f578886ecc42a740e7b436e7a01&v=4 url: https://github.com/yasyf +- - login: alixlahuec + avatarUrl: https://avatars.githubusercontent.com/u/29543316?u=44357eb2a93bccf30fb9d389b8befe94a3d00985&v=4 + url: https://github.com/alixlahuec - - login: primer-io avatarUrl: https://avatars.githubusercontent.com/u/62146168?v=4 url: https://github.com/primer-io - - login: povilasb - avatarUrl: https://avatars.githubusercontent.com/u/1213442?u=b11f58ed6ceea6e8297c9b310030478ebdac894d&v=4 - url: https://github.com/povilasb - - login: upciti avatarUrl: https://avatars.githubusercontent.com/u/43346262?v=4 url: https://github.com/upciti - - login: freddiev4 - avatarUrl: https://avatars.githubusercontent.com/u/8339018?u=1aad5b4f5a04cb750852b843d5e1d8f4ce339c2e&v=4 - url: https://github.com/freddiev4 - - login: samuelcolvin avatarUrl: https://avatars.githubusercontent.com/u/4039449?u=42eb3b833047c8c4b4f647a031eaef148c16d93f&v=4 url: https://github.com/samuelcolvin - - login: vincentkoc - avatarUrl: https://avatars.githubusercontent.com/u/25068?u=fbd5b2d51142daa4bdbc21e21953a3b8b8188a4a&v=4 - url: https://github.com/vincentkoc - - login: ddilidili - avatarUrl: https://avatars.githubusercontent.com/u/42176885?u=c0a849dde06987434653197b5f638d3deb55fc6c&v=4 - url: https://github.com/ddilidili + - login: CoodingPenguin + avatarUrl: https://avatars.githubusercontent.com/u/37505775?u=6a9e1f6647fbf95f99afeee82a3682e15fc6e959&v=4 + url: https://github.com/CoodingPenguin + - login: deight93 + avatarUrl: https://avatars.githubusercontent.com/u/37678115?u=a608798b5bd0034183a9c430ebb42fb266db86ce&v=4 + url: https://github.com/deight93 - login: otosky avatarUrl: https://avatars.githubusercontent.com/u/42260747?u=69d089387c743d89427aa4ad8740cfb34045a9e0&v=4 url: https://github.com/otosky - login: ramonalmeidam avatarUrl: https://avatars.githubusercontent.com/u/45269580?u=3358750b3a5854d7c3ed77aaca7dd20a0f529d32&v=4 url: https://github.com/ramonalmeidam - - login: sepsi77 - avatarUrl: https://avatars.githubusercontent.com/u/18682303?v=4 - url: https://github.com/sepsi77 + - login: kaoru0310 + avatarUrl: https://avatars.githubusercontent.com/u/80977929?u=1b61d10142b490e56af932ddf08a390fae8ee94f&v=4 + url: https://github.com/kaoru0310 - login: RaamEEIL avatarUrl: https://avatars.githubusercontent.com/u/20320552?v=4 url: https://github.com/RaamEEIL - - login: jhundman - avatarUrl: https://avatars.githubusercontent.com/u/24263908?v=4 - url: https://github.com/jhundman - - login: b-rad-c - avatarUrl: https://avatars.githubusercontent.com/u/25362581?u=5bb10629f4015b62bec1f9a366675d5085551af9&v=4 - url: https://github.com/b-rad-c - login: ehaca avatarUrl: https://avatars.githubusercontent.com/u/25950317?u=cec1a3e0643b785288ae8260cc295a85ab344995&v=4 url: https://github.com/ehaca - login: raphaellaude - avatarUrl: https://avatars.githubusercontent.com/u/28026311?u=28faad3e62250ef91a0c3c5d0faba39592d9ab39&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/28026311?u=91e1c00d9ac4f8045527e13de8050d504531cbc0&v=4 url: https://github.com/raphaellaude - login: timlrx avatarUrl: https://avatars.githubusercontent.com/u/28362229?u=9a745ca31372ee324af682715ae88ce8522f9094&v=4 @@ -137,21 +131,9 @@ sponsors: - login: Leay15 avatarUrl: https://avatars.githubusercontent.com/u/32212558?u=c4aa9c1737e515959382a5515381757b1fd86c53&v=4 url: https://github.com/Leay15 - - login: BoYanZh - avatarUrl: https://avatars.githubusercontent.com/u/32470225?u=55b174d080382822759d74307f8a0355fa86e808&v=4 - url: https://github.com/BoYanZh - - login: ygorpontelo - avatarUrl: https://avatars.githubusercontent.com/u/32963605?u=35f7103f9c4c4c2589ae5737ee882e9375ef072e&v=4 - url: https://github.com/ygorpontelo - login: ProteinQure avatarUrl: https://avatars.githubusercontent.com/u/33707203?v=4 url: https://github.com/ProteinQure - - login: chickenandstats - avatarUrl: https://avatars.githubusercontent.com/u/79477966?u=ae2b894aa954070db1d7830dab99b49eba4e4567&v=4 - url: https://github.com/chickenandstats - - login: kaoru0310 - avatarUrl: https://avatars.githubusercontent.com/u/80977929?u=1b61d10142b490e56af932ddf08a390fae8ee94f&v=4 - url: https://github.com/kaoru0310 - login: DelfinaCare avatarUrl: https://avatars.githubusercontent.com/u/83734439?v=4 url: https://github.com/DelfinaCare @@ -182,6 +164,9 @@ sponsors: - login: patricioperezv avatarUrl: https://avatars.githubusercontent.com/u/73832292?u=5f471f156e19ee7920e62ae0f4a47b95580e61cf&v=4 url: https://github.com/patricioperezv + - login: chickenandstats + avatarUrl: https://avatars.githubusercontent.com/u/79477966?u=ae2b894aa954070db1d7830dab99b49eba4e4567&v=4 + url: https://github.com/chickenandstats - login: dodo5522 avatarUrl: https://avatars.githubusercontent.com/u/1362607?u=9bf1e0e520cccc547c046610c468ce6115bbcf9f&v=4 url: https://github.com/dodo5522 @@ -191,9 +176,6 @@ sponsors: - login: knallgelb avatarUrl: https://avatars.githubusercontent.com/u/2358812?u=c48cb6362b309d74cbf144bd6ad3aed3eb443e82&v=4 url: https://github.com/knallgelb - - login: Shark009 - avatarUrl: https://avatars.githubusercontent.com/u/3163309?u=0c6f4091b0eda05c44c390466199826e6dc6e431&v=4 - url: https://github.com/Shark009 - login: dblackrun avatarUrl: https://avatars.githubusercontent.com/u/3528486?v=4 url: https://github.com/dblackrun @@ -209,15 +191,15 @@ sponsors: - login: anomaly avatarUrl: https://avatars.githubusercontent.com/u/3654837?v=4 url: https://github.com/anomaly + - login: mj0331 + avatarUrl: https://avatars.githubusercontent.com/u/3890353?u=1c627ac1a024515b4871de5c3ebbfaa1a57f65d4&v=4 + url: https://github.com/mj0331 - login: gorhack avatarUrl: https://avatars.githubusercontent.com/u/4141690?u=ec119ebc4bdf00a7bc84657a71aa17834f4f27f3&v=4 url: https://github.com/gorhack - - login: Ryandaydev - avatarUrl: https://avatars.githubusercontent.com/u/4292423?u=48f68868db8886fce31a1d802c1003914c6cd7c6&v=4 - url: https://github.com/Ryandaydev - - login: jaredtrog - avatarUrl: https://avatars.githubusercontent.com/u/4381365?v=4 - url: https://github.com/jaredtrog + - login: vincentkoc + avatarUrl: https://avatars.githubusercontent.com/u/25068?u=fbd5b2d51142daa4bdbc21e21953a3b8b8188a4a&v=4 + url: https://github.com/vincentkoc - login: jstanden avatarUrl: https://avatars.githubusercontent.com/u/63288?u=c3658d57d2862c607a0e19c2101c3c51876e36ad&v=4 url: https://github.com/jstanden @@ -239,9 +221,6 @@ sponsors: - login: wshayes avatarUrl: https://avatars.githubusercontent.com/u/365303?u=07ca03c5ee811eb0920e633cc3c3db73dbec1aa5&v=4 url: https://github.com/wshayes - - login: gaetanBloch - avatarUrl: https://avatars.githubusercontent.com/u/583199?u=50c49e83d6b4feb78a091901ea02ead1462f442b&v=4 - url: https://github.com/gaetanBloch - login: koxudaxi avatarUrl: https://avatars.githubusercontent.com/u/630670?u=507d8577b4b3670546b449c4c2ccbc5af40d72f7&v=4 url: https://github.com/koxudaxi @@ -251,15 +230,9 @@ sponsors: - login: mintuhouse avatarUrl: https://avatars.githubusercontent.com/u/769950?u=ecfbd79a97d33177e0d093ddb088283cf7fe8444&v=4 url: https://github.com/mintuhouse - - login: TrevorBenson - avatarUrl: https://avatars.githubusercontent.com/u/9167887?u=dccbea3327a57750923333d8ebf1a0b3f1948949&v=4 - url: https://github.com/TrevorBenson - login: wdwinslow - avatarUrl: https://avatars.githubusercontent.com/u/11562137?u=dc01daafb354135603a263729e3d26d939c0c452&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/11562137?u=371272f2c69e680e0559a7b0a57385e83a5dc728&v=4 url: https://github.com/wdwinslow - - login: catherinenelson1 - avatarUrl: https://avatars.githubusercontent.com/u/11951946?u=fe11bc35d36b6038cd46a946e4e46ef8aa5688ab&v=4 - url: https://github.com/catherinenelson1 - login: jsoques avatarUrl: https://avatars.githubusercontent.com/u/12414216?u=620921d94196546cc8b9eae2cc4cbc3f95bab42f&v=4 url: https://github.com/jsoques @@ -278,6 +251,12 @@ sponsors: - login: ashi-agrawal avatarUrl: https://avatars.githubusercontent.com/u/17105294?u=99c7a854035e5398d8e7b674f2d42baae6c957f8&v=4 url: https://github.com/ashi-agrawal + - login: Ryandaydev + avatarUrl: https://avatars.githubusercontent.com/u/4292423?u=679ff84cb7b988c5795a5fa583857f574a055763&v=4 + url: https://github.com/Ryandaydev + - login: jaredtrog + avatarUrl: https://avatars.githubusercontent.com/u/4381365?v=4 + url: https://github.com/jaredtrog - login: oliverxchen avatarUrl: https://avatars.githubusercontent.com/u/4471774?u=534191f25e32eeaadda22dfab4b0a428733d5489&v=4 url: https://github.com/oliverxchen @@ -288,23 +267,20 @@ sponsors: avatarUrl: https://avatars.githubusercontent.com/u/5920492?u=208d419cf667b8ac594c82a8db01932c7e50d057&v=4 url: https://github.com/eseglem - login: FernandoCelmer - avatarUrl: https://avatars.githubusercontent.com/u/6262214?u=d29fff3fd862fda4ca752079f13f32e84c762ea4&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/6262214?u=58ba6d5888fa7f355934e52db19f950e20b38162&v=4 url: https://github.com/FernandoCelmer - - login: simw - avatarUrl: https://avatars.githubusercontent.com/u/6322526?v=4 - url: https://github.com/simw - login: Rehket avatarUrl: https://avatars.githubusercontent.com/u/7015688?u=3afb0ba200feebbc7f958950e92db34df2a3c172&v=4 url: https://github.com/Rehket - login: hiancdtrsnm avatarUrl: https://avatars.githubusercontent.com/u/7343177?v=4 url: https://github.com/hiancdtrsnm +- - login: jpizquierdo + avatarUrl: https://avatars.githubusercontent.com/u/6716239?v=4 + url: https://github.com/jpizquierdo - - login: pawamoy avatarUrl: https://avatars.githubusercontent.com/u/3999221?u=b030e4c89df2f3a36bc4710b925bdeb6745c9856&v=4 url: https://github.com/pawamoy - - login: bnkc - avatarUrl: https://avatars.githubusercontent.com/u/34930566?u=db5e6f4f87836cad26c2aa90ce390ce49041c5a9&v=4 - url: https://github.com/bnkc - login: petercool avatarUrl: https://avatars.githubusercontent.com/u/37613029?u=81c525232bb35780945a68e88afd96bb2cdad9c4&v=4 url: https://github.com/petercool @@ -320,6 +296,9 @@ sponsors: - login: caviri avatarUrl: https://avatars.githubusercontent.com/u/45425937?u=4e14bd64282bad8f385eafbdb004b5a279366d6e&v=4 url: https://github.com/caviri + - login: joshuatz + avatarUrl: https://avatars.githubusercontent.com/u/17817563?u=f1bf05b690d1fc164218f0b420cdd3acb7913e21&v=4 + url: https://github.com/joshuatz - login: SebTota avatarUrl: https://avatars.githubusercontent.com/u/25122511?v=4 url: https://github.com/SebTota @@ -335,21 +314,18 @@ sponsors: - login: rlnchow avatarUrl: https://avatars.githubusercontent.com/u/28018479?u=a93ca9cf1422b9ece155784a72d5f2fdbce7adff&v=4 url: https://github.com/rlnchow - - login: dvlpjrs - avatarUrl: https://avatars.githubusercontent.com/u/32254642?u=fbd6ad0324d4f1eb6231cf775be1c7bd4404e961&v=4 - url: https://github.com/dvlpjrs - login: engineerjoe440 avatarUrl: https://avatars.githubusercontent.com/u/33275230?u=eb223cad27017bb1e936ee9b429b450d092d0236&v=4 url: https://github.com/engineerjoe440 + - login: bnkc + avatarUrl: https://avatars.githubusercontent.com/u/34930566?u=db5e6f4f87836cad26c2aa90ce390ce49041c5a9&v=4 + url: https://github.com/bnkc + - login: lukzmu + avatarUrl: https://avatars.githubusercontent.com/u/175964415?u=75348f25bb99a5f92ddb40c0b9b1ff7acb39c150&v=4 + url: https://github.com/lukzmu - login: hgalytoby avatarUrl: https://avatars.githubusercontent.com/u/50397689?u=62c7ff3519858423579676cd0efbd7e3f1ffe63a&v=4 url: https://github.com/hgalytoby - - login: conservative-dude - avatarUrl: https://avatars.githubusercontent.com/u/55538308?u=f250c44942ea6e73a6bd90739b381c470c192c11&v=4 - url: https://github.com/conservative-dude - - login: CR1337 - avatarUrl: https://avatars.githubusercontent.com/u/62649536?u=57a6aab10d2421a497306da8bcded01b826c54ae&v=4 - url: https://github.com/CR1337 - login: PunRabbit avatarUrl: https://avatars.githubusercontent.com/u/70463212?u=1a835cfbc99295a60c8282f6aa6199d1b42241a5&v=4 url: https://github.com/PunRabbit @@ -363,14 +339,11 @@ sponsors: avatarUrl: https://avatars.githubusercontent.com/u/1484589?u=54556072b8136efa12ae3b6902032ea2a39ace4b&v=4 url: https://github.com/miguelgr - login: WillHogan - avatarUrl: https://avatars.githubusercontent.com/u/1661551?u=7036c064cf29781470573865264ec8e60b6b809f&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/1661551?u=8a80356e3e7d5a417157aba7ea565dabc8678327&v=4 url: https://github.com/WillHogan - login: my3 avatarUrl: https://avatars.githubusercontent.com/u/1825270?v=4 url: https://github.com/my3 - - login: leobiscassi - avatarUrl: https://avatars.githubusercontent.com/u/1977418?u=f9f82445a847ab479bd7223debd677fcac6c49a0&v=4 - url: https://github.com/leobiscassi - login: Alisa-lisa avatarUrl: https://avatars.githubusercontent.com/u/4137964?u=e7e393504f554f4ff15863a1e01a5746863ef9ce&v=4 url: https://github.com/Alisa-lisa @@ -389,6 +362,9 @@ sponsors: - login: tochikuji avatarUrl: https://avatars.githubusercontent.com/u/851759?v=4 url: https://github.com/tochikuji + - login: moonape1226 + avatarUrl: https://avatars.githubusercontent.com/u/8532038?u=d9f8b855a429fff9397c3833c2ff83849ebf989d&v=4 + url: https://github.com/moonape1226 - login: msehnout avatarUrl: https://avatars.githubusercontent.com/u/9369632?u=8c988f1b008a3f601385a3616f9327820f66e3a5&v=4 url: https://github.com/msehnout @@ -419,9 +395,6 @@ sponsors: - login: TheR1D avatarUrl: https://avatars.githubusercontent.com/u/16740832?u=b0dfdbdb27b79729430c71c6128962f77b7b53f7&v=4 url: https://github.com/TheR1D - - login: joshuatz - avatarUrl: https://avatars.githubusercontent.com/u/17817563?u=f1bf05b690d1fc164218f0b420cdd3acb7913e21&v=4 - url: https://github.com/joshuatz - login: danielunderwood avatarUrl: https://avatars.githubusercontent.com/u/4472301?v=4 url: https://github.com/danielunderwood @@ -446,16 +419,7 @@ sponsors: - login: harsh183 avatarUrl: https://avatars.githubusercontent.com/u/7780198?v=4 url: https://github.com/harsh183 - - login: hcristea - avatarUrl: https://avatars.githubusercontent.com/u/7814406?u=19092923a4ea5b338567961c8270b9206a6d81bb&v=4 - url: https://github.com/hcristea - - login: moonape1226 - avatarUrl: https://avatars.githubusercontent.com/u/8532038?u=d9f8b855a429fff9397c3833c2ff83849ebf989d&v=4 - url: https://github.com/moonape1226 -- - login: larsyngvelundin - avatarUrl: https://avatars.githubusercontent.com/u/34173819?u=74958599695bf83ac9f1addd935a51548a10c6b0&v=4 - url: https://github.com/larsyngvelundin - - login: andrecorumba +- - login: andrecorumba avatarUrl: https://avatars.githubusercontent.com/u/37807517?u=9b9be3b41da9bda60957da9ef37b50dbf65baa61&v=4 url: https://github.com/andrecorumba - login: rwxd @@ -470,21 +434,24 @@ sponsors: - login: Olegt0rr avatarUrl: https://avatars.githubusercontent.com/u/25399456?u=3e87b5239a2f4600975ba13be73054f8567c6060&v=4 url: https://github.com/Olegt0rr - - login: FabulousCodingFox - avatarUrl: https://avatars.githubusercontent.com/u/78906517?u=924a27cbee3db7e0ece5cc1509921402e1445e74&v=4 - url: https://github.com/FabulousCodingFox - - login: anqorithm - avatarUrl: https://avatars.githubusercontent.com/u/61029571?u=468256fa4e2d9ce2870b608299724bebb7a33f18&v=4 - url: https://github.com/anqorithm - - login: Materacl - avatarUrl: https://avatars.githubusercontent.com/u/70155818?u=ae11d084518856127cca483816a91a187e3124ee&v=4 - url: https://github.com/Materacl + - login: larsyngvelundin + avatarUrl: https://avatars.githubusercontent.com/u/34173819?u=74958599695bf83ac9f1addd935a51548a10c6b0&v=4 + url: https://github.com/larsyngvelundin + - login: 0ne-stone + avatarUrl: https://avatars.githubusercontent.com/u/62360849?u=746dd21c34e7e06eefb11b03e8bb01aaae3c2a4f&v=4 + url: https://github.com/0ne-stone + - login: darixsamani + avatarUrl: https://avatars.githubusercontent.com/u/67915678?u=cfa82128692eeeec4bf0e7a0faaa9a614695c0f9&v=4 + url: https://github.com/darixsamani + - login: nayasinghania + avatarUrl: https://avatars.githubusercontent.com/u/74111380?u=af853245a21fe052b6a27e41a8de8cf4cdf76e85&v=4 + url: https://github.com/nayasinghania - login: Toothwitch avatarUrl: https://avatars.githubusercontent.com/u/1710406?u=5eebb23b46cd26e48643b9e5179536cad491c17a&v=4 url: https://github.com/Toothwitch - - login: ssbarnea - avatarUrl: https://avatars.githubusercontent.com/u/102495?u=c7bd9ddf127785286fc939dd18cb02db0a453bce&v=4 - url: https://github.com/ssbarnea + - login: roboman-tech + avatarUrl: https://avatars.githubusercontent.com/u/8183070?u=fdeaa2ed29f598eb7901693884c0ad32b16982e3&v=4 + url: https://github.com/roboman-tech - login: andreagrandi avatarUrl: https://avatars.githubusercontent.com/u/636391?u=13d90cb8ec313593a5b71fbd4e33b78d6da736f5&v=4 url: https://github.com/andreagrandi diff --git a/docs/en/data/people.yml b/docs/en/data/people.yml index 7f910ab34..e3eab5d01 100644 --- a/docs/en/data/people.yml +++ b/docs/en/data/people.yml @@ -1,43 +1,43 @@ maintainers: - login: tiangolo - answers: 1894 + answers: 1898 avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 url: https://github.com/tiangolo experts: - login: tiangolo - count: 1894 + count: 1898 avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 url: https://github.com/tiangolo +- login: YuriiMotov + count: 941 + avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 + url: https://github.com/YuriiMotov - login: github-actions - count: 770 + count: 769 avatarUrl: https://avatars.githubusercontent.com/in/15368?v=4 url: https://github.com/apps/github-actions - login: Kludex - count: 645 + count: 654 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4 url: https://github.com/Kludex - login: jgould22 - count: 250 + count: 263 avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 url: https://github.com/jgould22 - login: dmontagu count: 240 avatarUrl: https://avatars.githubusercontent.com/u/35119617?u=540f30c937a6450812628b9592a1dfe91bbe148e&v=4 url: https://github.com/dmontagu -- login: YuriiMotov - count: 223 - avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 - url: https://github.com/YuriiMotov - login: Mause count: 219 avatarUrl: https://avatars.githubusercontent.com/u/1405026?v=4 url: https://github.com/Mause - login: ycd - count: 217 - avatarUrl: https://avatars.githubusercontent.com/u/62724709?u=29682e4b6ac7d5293742ccf818188394b9a82972&v=4 + count: 216 + avatarUrl: https://avatars.githubusercontent.com/u/62724709?u=f1e7bae394a315da950912c92dc861a8eaf95d4c&v=4 url: https://github.com/ycd - login: JarroVGIT - count: 192 + count: 190 avatarUrl: https://avatars.githubusercontent.com/u/13659033?u=e8bea32d07a5ef72f7dde3b2079ceb714923ca05&v=4 url: https://github.com/JarroVGIT - login: euri10 @@ -46,48 +46,52 @@ experts: url: https://github.com/euri10 - login: iudeen count: 128 - avatarUrl: https://avatars.githubusercontent.com/u/10519440?u=2843b3303282bff8b212dcd4d9d6689452e4470c&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/10519440?u=f09cdd745e5bf16138f29b42732dd57c7f02bee1&v=4 url: https://github.com/iudeen - login: phy25 count: 126 avatarUrl: https://avatars.githubusercontent.com/u/331403?v=4 url: https://github.com/phy25 - login: JavierSanchezCastro - count: 85 + count: 93 avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 url: https://github.com/JavierSanchezCastro +- login: luzzodev + count: 84 + avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4 + url: https://github.com/luzzodev - login: raphaelauv count: 83 avatarUrl: https://avatars.githubusercontent.com/u/10202690?u=e6f86f5c0c3026a15d6b51792fa3e532b12f1371&v=4 url: https://github.com/raphaelauv -- login: ghandic - count: 71 - avatarUrl: https://avatars.githubusercontent.com/u/23500353?u=e2e1d736f924d9be81e8bfc565b6d8836ba99773&v=4 - url: https://github.com/ghandic - login: ArcLightSlavik count: 71 avatarUrl: https://avatars.githubusercontent.com/u/31127044?u=b0f2c37142f4b762e41ad65dc49581813422bd71&v=4 url: https://github.com/ArcLightSlavik +- login: ghandic + count: 71 + avatarUrl: https://avatars.githubusercontent.com/u/23500353?u=e2e1d736f924d9be81e8bfc565b6d8836ba99773&v=4 + url: https://github.com/ghandic - login: n8sty - count: 66 + count: 67 avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4 url: https://github.com/n8sty - login: falkben count: 59 avatarUrl: https://avatars.githubusercontent.com/u/653031?u=ad9838e089058c9e5a0bab94c0eec7cc181e0cd0&v=4 url: https://github.com/falkben -- login: acidjunk +- login: yinziyan1206 count: 50 - avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4 - url: https://github.com/acidjunk + avatarUrl: https://avatars.githubusercontent.com/u/37829370?u=da44ca53aefd5c23f346fab8e9fd2e108294c179&v=4 + url: https://github.com/yinziyan1206 - login: sm-Fifteen count: 49 avatarUrl: https://avatars.githubusercontent.com/u/516999?u=437c0c5038558c67e887ccd863c1ba0f846c03da&v=4 url: https://github.com/sm-Fifteen -- login: yinziyan1206 +- login: acidjunk count: 49 - avatarUrl: https://avatars.githubusercontent.com/u/37829370?u=da44ca53aefd5c23f346fab8e9fd2e108294c179&v=4 - url: https://github.com/yinziyan1206 + avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4 + url: https://github.com/acidjunk - login: adriangb count: 46 avatarUrl: https://avatars.githubusercontent.com/u/1755071?u=612704256e38d6ac9cbed24f10e4b6ac2da74ecb&v=4 @@ -100,34 +104,30 @@ experts: count: 45 avatarUrl: https://avatars.githubusercontent.com/u/16958893?u=f8be7088d5076d963984a21f95f44e559192d912&v=4 url: https://github.com/insomnes -- login: odiseo0 - count: 43 - avatarUrl: https://avatars.githubusercontent.com/u/87550035?u=241a71f6b7068738b81af3e57f45ffd723538401&v=4 - url: https://github.com/odiseo0 - login: frankie567 count: 43 avatarUrl: https://avatars.githubusercontent.com/u/1144727?u=c159fe047727aedecbbeeaa96a1b03ceb9d39add&v=4 url: https://github.com/frankie567 +- login: odiseo0 + count: 43 + avatarUrl: https://avatars.githubusercontent.com/u/87550035?u=241a71f6b7068738b81af3e57f45ffd723538401&v=4 + url: https://github.com/odiseo0 +- login: sinisaos + count: 41 + avatarUrl: https://avatars.githubusercontent.com/u/30960668?v=4 + url: https://github.com/sinisaos - login: includeamin count: 40 avatarUrl: https://avatars.githubusercontent.com/u/11836741?u=8bd5ef7e62fe6a82055e33c4c0e0a7879ff8cfb6&v=4 url: https://github.com/includeamin -- login: sinisaos - count: 39 - avatarUrl: https://avatars.githubusercontent.com/u/30960668?v=4 - url: https://github.com/sinisaos -- login: luzzodev +- login: STeveShary count: 37 - avatarUrl: https://avatars.githubusercontent.com/u/27291415?v=4 - url: https://github.com/luzzodev + avatarUrl: https://avatars.githubusercontent.com/u/5167622?u=de8f597c81d6336fcebc37b32dfd61a3f877160c&v=4 + url: https://github.com/STeveShary - login: chbndrhnns count: 37 avatarUrl: https://avatars.githubusercontent.com/u/7534547?v=4 url: https://github.com/chbndrhnns -- login: STeveShary - count: 37 - avatarUrl: https://avatars.githubusercontent.com/u/5167622?u=de8f597c81d6336fcebc37b32dfd61a3f877160c&v=4 - url: https://github.com/STeveShary - login: krishnardt count: 35 avatarUrl: https://avatars.githubusercontent.com/u/31960541?u=47f4829c77f4962ab437ffb7995951e41eeebe9b&v=4 @@ -144,9 +144,13 @@ experts: count: 27 avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 url: https://github.com/hasansezertasan +- login: alv2017 + count: 26 + avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 + url: https://github.com/alv2017 - login: dbanty count: 26 - avatarUrl: https://avatars.githubusercontent.com/u/43723790?u=9bcce836bbce55835291c5b2ac93a4e311f4b3c3&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/43723790?u=9d726785d08e50b1e1cd96505800c8ea8405bce2&v=4 url: https://github.com/dbanty - login: wshayes count: 25 @@ -156,14 +160,14 @@ experts: count: 23 avatarUrl: https://avatars.githubusercontent.com/u/9435877?u=719327b7d2c4c62212456d771bfa7c6b8dbb9eac&v=4 url: https://github.com/SirTelemak +- login: connebs + count: 22 + avatarUrl: https://avatars.githubusercontent.com/u/9054108?u=e151d5f545a3395136d711c227c22032fda67cfa&v=4 + url: https://github.com/connebs - login: nymous count: 22 avatarUrl: https://avatars.githubusercontent.com/u/4216559?u=360a36fb602cded27273cbfc0afc296eece90662&v=4 url: https://github.com/nymous -- login: acnebs - count: 22 - avatarUrl: https://avatars.githubusercontent.com/u/9054108?v=4 - url: https://github.com/acnebs - login: chrisK824 count: 22 avatarUrl: https://avatars.githubusercontent.com/u/79946379?u=03d85b22d696a58a9603e55fbbbe2de6b0f4face&v=4 @@ -172,10 +176,6 @@ experts: count: 21 avatarUrl: https://avatars.githubusercontent.com/u/51059348?u=5fe59a56e1f2f9ccd8005d71752a8276f133ae1a&v=4 url: https://github.com/rafsaf -- login: ebottos94 - count: 20 - avatarUrl: https://avatars.githubusercontent.com/u/100039558?u=8b91053b3abe4a9209375e3651e1c1ef192d884b&v=4 - url: https://github.com/ebottos94 - login: nsidnev count: 20 avatarUrl: https://avatars.githubusercontent.com/u/22559461?u=a9cc3238217e21dc8796a1a500f01b722adb082c&v=4 @@ -184,26 +184,26 @@ experts: count: 20 avatarUrl: https://avatars.githubusercontent.com/u/565544?v=4 url: https://github.com/chris-allnutt +- login: ebottos94 + count: 20 + avatarUrl: https://avatars.githubusercontent.com/u/100039558?u=8b91053b3abe4a9209375e3651e1c1ef192d884b&v=4 + url: https://github.com/ebottos94 - login: estebanx64 count: 19 avatarUrl: https://avatars.githubusercontent.com/u/10840422?u=45f015f95e1c0f06df602be4ab688d4b854cc8a8&v=4 url: https://github.com/estebanx64 -- login: sehraramiz +- login: retnikt count: 18 - avatarUrl: https://avatars.githubusercontent.com/u/14166324?u=8fac65e84dfff24245d304a5b5b09f7b5bd69dc9&v=4 - url: https://github.com/sehraramiz + avatarUrl: https://avatars.githubusercontent.com/u/24581770?v=4 + url: https://github.com/retnikt - login: zoliknemet count: 18 avatarUrl: https://avatars.githubusercontent.com/u/22326718?u=31ba446ac290e23e56eea8e4f0c558aaf0b40779&v=4 url: https://github.com/zoliknemet -- login: retnikt +- login: sehraramiz count: 18 - avatarUrl: https://avatars.githubusercontent.com/u/24581770?v=4 - url: https://github.com/retnikt -- login: caeser1996 - count: 17 - avatarUrl: https://avatars.githubusercontent.com/u/16540232?u=05d2beb8e034d584d0a374b99d8826327bd7f614&v=4 - url: https://github.com/caeser1996 + avatarUrl: https://avatars.githubusercontent.com/u/14166324?u=8fac65e84dfff24245d304a5b5b09f7b5bd69dc9&v=4 + url: https://github.com/sehraramiz - login: Hultner count: 17 avatarUrl: https://avatars.githubusercontent.com/u/2669034?u=115e53df959309898ad8dc9443fbb35fee71df07&v=4 @@ -212,659 +212,511 @@ experts: count: 17 avatarUrl: https://avatars.githubusercontent.com/u/1765494?u=5b1ab7c582db4b4016fa31affe977d10af108ad4&v=4 url: https://github.com/harunyasar +- login: caeser1996 + count: 17 + avatarUrl: https://avatars.githubusercontent.com/u/16540232?u=05d2beb8e034d584d0a374b99d8826327bd7f614&v=4 + url: https://github.com/caeser1996 - login: nkhitrov count: 17 avatarUrl: https://avatars.githubusercontent.com/u/28262306?u=e19427d8dc296d6950e9c424adacc92d37496fe9&v=4 url: https://github.com/nkhitrov -- login: jonatasoli - count: 16 - avatarUrl: https://avatars.githubusercontent.com/u/26334101?u=071c062d2861d3dd127f6b4a5258cd8ef55d4c50&v=4 - url: https://github.com/jonatasoli - login: dstlny count: 16 avatarUrl: https://avatars.githubusercontent.com/u/41964673?u=9f2174f9d61c15c6e3a4c9e3aeee66f711ce311f&v=4 url: https://github.com/dstlny -- login: ceb10n +- login: jonatasoli + count: 16 + avatarUrl: https://avatars.githubusercontent.com/u/26334101?u=f601c3f111f2148bd9244c2cb3ebbd57b592e674&v=4 + url: https://github.com/jonatasoli +- login: ghost count: 15 - avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4 - url: https://github.com/ceb10n + avatarUrl: https://avatars.githubusercontent.com/u/10137?u=b1951d34a583cf12ec0d3b0781ba19be97726318&v=4 + url: https://github.com/ghost - login: jorgerpo count: 15 avatarUrl: https://avatars.githubusercontent.com/u/12537771?u=7444d20019198e34911082780cc7ad73f2b97cb3&v=4 url: https://github.com/jorgerpo -- login: simondale00 - count: 15 - avatarUrl: https://avatars.githubusercontent.com/u/33907262?u=2721fb37014d50daf473267c808aa678ecaefe09&v=4 - url: https://github.com/simondale00 -- login: ghost +- login: pythonweb2 count: 15 - avatarUrl: https://avatars.githubusercontent.com/u/10137?u=b1951d34a583cf12ec0d3b0781ba19be97726318&v=4 - url: https://github.com/ghost + avatarUrl: https://avatars.githubusercontent.com/u/32141163?v=4 + url: https://github.com/pythonweb2 - login: abhint count: 15 avatarUrl: https://avatars.githubusercontent.com/u/25699289?u=b5d219277b4d001ac26fb8be357fddd88c29d51b&v=4 url: https://github.com/abhint last_month_experts: -- login: Kludex - count: 14 - avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4 - url: https://github.com/Kludex - login: YuriiMotov - count: 10 + count: 289 avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 url: https://github.com/YuriiMotov -- login: sehraramiz - count: 7 - avatarUrl: https://avatars.githubusercontent.com/u/14166324?u=8fac65e84dfff24245d304a5b5b09f7b5bd69dc9&v=4 - url: https://github.com/sehraramiz - login: luzzodev - count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/27291415?v=4 + count: 12 + avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4 url: https://github.com/luzzodev -- login: yokwejuste +- login: raceychan + count: 6 + avatarUrl: https://avatars.githubusercontent.com/u/75417963?u=060c62870ec5a791765e63ac20d8885d11143786&v=4 + url: https://github.com/raceychan +- login: valentinDruzhinin + count: 5 + avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4 + url: https://github.com/valentinDruzhinin +- login: DoctorJohn + count: 5 + avatarUrl: https://avatars.githubusercontent.com/u/14076775?u=2913e70a6142772847e91e2aaa5b9152391715e9&v=4 + url: https://github.com/DoctorJohn +- login: eqsdxr count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/71908316?u=592c1e42aa0ee5cb94890e0b863e2acc78cc3bbc&v=4 - url: https://github.com/yokwejuste -- login: alv2017 - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 - url: https://github.com/alv2017 -- login: Trinkes - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/9466879?v=4 - url: https://github.com/Trinkes -- login: PREPONDERANCE - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/112809059?u=30ab12dc9ddba2f94ab90e6ad4ad8bc5cfa7fccd&v=4 - url: https://github.com/PREPONDERANCE -- login: nbx3 + avatarUrl: https://avatars.githubusercontent.com/u/157279130?u=58fddf77ed76966eaa8c73eea9bea4bb0c53b673&v=4 + url: https://github.com/eqsdxr +- login: sachinh35 + count: 4 + avatarUrl: https://avatars.githubusercontent.com/u/21972708?u=8560b97b8b41e175f476270b56de8a493b84f302&v=4 + url: https://github.com/sachinh35 +- login: tiangolo count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/34649527?u=943812f69e0d40adbd3fa1c9b8ef50dd971a2a45&v=4 - url: https://github.com/nbx3 -- login: XiaoXinYo + avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 + url: https://github.com/tiangolo +- login: Brikas count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/56395004?u=b3b7cb758997f283c271a581833e407229dab82c&v=4 - url: https://github.com/XiaoXinYo -- login: iloveitaly + avatarUrl: https://avatars.githubusercontent.com/u/80290187?v=4 + url: https://github.com/Brikas +- login: TaigoFr count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/150855?v=4 - url: https://github.com/iloveitaly + avatarUrl: https://avatars.githubusercontent.com/u/17792131?u=372b27056ec82f1ae03d8b3f37ef55b04a7cfdd1&v=4 + url: https://github.com/TaigoFr three_months_experts: -- login: luzzodev - count: 33 - avatarUrl: https://avatars.githubusercontent.com/u/27291415?v=4 - url: https://github.com/luzzodev - login: YuriiMotov - count: 31 + count: 732 avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 url: https://github.com/YuriiMotov -- login: Kludex - count: 24 - avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4 - url: https://github.com/Kludex -- login: sehraramiz - count: 11 - avatarUrl: https://avatars.githubusercontent.com/u/14166324?u=8fac65e84dfff24245d304a5b5b09f7b5bd69dc9&v=4 - url: https://github.com/sehraramiz -- login: estebanx64 - count: 7 - avatarUrl: https://avatars.githubusercontent.com/u/10840422?u=45f015f95e1c0f06df602be4ab688d4b854cc8a8&v=4 - url: https://github.com/estebanx64 -- login: yvallois +- login: luzzodev + count: 26 + avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4 + url: https://github.com/luzzodev +- login: valentinDruzhinin + count: 14 + avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4 + url: https://github.com/valentinDruzhinin +- login: sachinh35 + count: 8 + avatarUrl: https://avatars.githubusercontent.com/u/21972708?u=8560b97b8b41e175f476270b56de8a493b84f302&v=4 + url: https://github.com/sachinh35 +- login: raceychan count: 6 - avatarUrl: https://avatars.githubusercontent.com/u/36999744?v=4 - url: https://github.com/yvallois -- login: yokwejuste - count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/71908316?u=592c1e42aa0ee5cb94890e0b863e2acc78cc3bbc&v=4 - url: https://github.com/yokwejuste -- login: jgould22 + avatarUrl: https://avatars.githubusercontent.com/u/75417963?u=060c62870ec5a791765e63ac20d8885d11143786&v=4 + url: https://github.com/raceychan +- login: DoctorJohn + count: 5 + avatarUrl: https://avatars.githubusercontent.com/u/14076775?u=2913e70a6142772847e91e2aaa5b9152391715e9&v=4 + url: https://github.com/DoctorJohn +- login: eqsdxr count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 - url: https://github.com/jgould22 -- login: alv2017 - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 - url: https://github.com/alv2017 -- login: viniciusCalcantara - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/108818737?u=3d7ffe5808843ee4372f9cc5a559ff1674cf1792&v=4 - url: https://github.com/viniciusCalcantara -- login: Trinkes - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/9466879?v=4 - url: https://github.com/Trinkes -- login: PREPONDERANCE - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/112809059?u=30ab12dc9ddba2f94ab90e6ad4ad8bc5cfa7fccd&v=4 - url: https://github.com/PREPONDERANCE -- login: nbx3 - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/34649527?u=943812f69e0d40adbd3fa1c9b8ef50dd971a2a45&v=4 - url: https://github.com/nbx3 -- login: XiaoXinYo + avatarUrl: https://avatars.githubusercontent.com/u/157279130?u=58fddf77ed76966eaa8c73eea9bea4bb0c53b673&v=4 + url: https://github.com/eqsdxr +- login: tiangolo count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/56395004?u=b3b7cb758997f283c271a581833e407229dab82c&v=4 - url: https://github.com/XiaoXinYo + avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 + url: https://github.com/tiangolo - login: JavierSanchezCastro count: 2 avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 url: https://github.com/JavierSanchezCastro -- login: iloveitaly - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/150855?v=4 - url: https://github.com/iloveitaly -- login: LincolnPuzey - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/18750802?v=4 - url: https://github.com/LincolnPuzey -- login: Knighthawk-Leo +- login: henrymcl count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/72437494?u=27c68db94a3107b605e603cc136f4ba83f0106d5&v=4 - url: https://github.com/Knighthawk-Leo -- login: gelezo43 + avatarUrl: https://avatars.githubusercontent.com/u/26480299?v=4 + url: https://github.com/henrymcl +- login: jymchng count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/40732698?u=611f39d3c1d2f4207a590937a78c1f10eed6232c&v=4 - url: https://github.com/gelezo43 -- login: AliYmn + avatarUrl: https://avatars.githubusercontent.com/u/27895426?u=fb88c47775147d62a395fdb895d1af4148c7b566&v=4 + url: https://github.com/jymchng +- login: Brikas count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/18416653?u=98c1fca46c7e4dabe8c39d17b5e55d1511d41cf9&v=4 - url: https://github.com/AliYmn -- login: RichieB2B + avatarUrl: https://avatars.githubusercontent.com/u/80290187?v=4 + url: https://github.com/Brikas +- login: TaigoFr count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/1461970?u=edaa57d1077705244ea5c9244f4783d94ff11f12&v=4 - url: https://github.com/RichieB2B -- login: Synrom + avatarUrl: https://avatars.githubusercontent.com/u/17792131?u=372b27056ec82f1ae03d8b3f37ef55b04a7cfdd1&v=4 + url: https://github.com/TaigoFr +- login: davidhuser count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/30272537?v=4 - url: https://github.com/Synrom -- login: iiotsrc + avatarUrl: https://avatars.githubusercontent.com/u/4357648?u=6ed702f8f6d49a8b2a0ed33cbd8ab59c2d7db7f7&v=4 + url: https://github.com/davidhuser +- login: KianAnbarestani count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/131771119?u=bcaf2559ef6266af70b151b7fda31a1ee3dbecb3&v=4 - url: https://github.com/iiotsrc -- login: Kfir-G + avatarUrl: https://avatars.githubusercontent.com/u/145364424?u=dcc3d8fb4ca07d36fb52a17f38b6650565de40be&v=4 + url: https://github.com/KianAnbarestani +- login: Kludex count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/57500876?u=0cd29db046a17f12f382d398141319fca7ff230a&v=4 - url: https://github.com/Kfir-G + avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4 + url: https://github.com/Kludex six_months_experts: - login: YuriiMotov - count: 72 + count: 749 avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 url: https://github.com/YuriiMotov +- login: luzzodev + count: 51 + avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4 + url: https://github.com/luzzodev +- login: alv2017 + count: 26 + avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 + url: https://github.com/alv2017 - login: Kludex - count: 40 + count: 20 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4 url: https://github.com/Kludex -- login: luzzodev - count: 37 - avatarUrl: https://avatars.githubusercontent.com/u/27291415?v=4 - url: https://github.com/luzzodev -- login: sinisaos - count: 37 - avatarUrl: https://avatars.githubusercontent.com/u/30960668?v=4 - url: https://github.com/sinisaos +- login: valentinDruzhinin + count: 14 + avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4 + url: https://github.com/valentinDruzhinin +- login: jgould22 + count: 13 + avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 + url: https://github.com/jgould22 - login: JavierSanchezCastro - count: 16 + count: 10 avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 url: https://github.com/JavierSanchezCastro -- login: Kfir-G - count: 13 - avatarUrl: https://avatars.githubusercontent.com/u/57500876?u=0cd29db046a17f12f382d398141319fca7ff230a&v=4 - url: https://github.com/Kfir-G +- login: sachinh35 + count: 9 + avatarUrl: https://avatars.githubusercontent.com/u/21972708?u=8560b97b8b41e175f476270b56de8a493b84f302&v=4 + url: https://github.com/sachinh35 +- login: yauhen-sobaleu + count: 9 + avatarUrl: https://avatars.githubusercontent.com/u/51629535?u=fc1817060daf2df438bfca86c44f33da5cd667db&v=4 + url: https://github.com/yauhen-sobaleu - login: tiangolo - count: 12 + count: 8 avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 url: https://github.com/tiangolo +- login: raceychan + count: 6 + avatarUrl: https://avatars.githubusercontent.com/u/75417963?u=060c62870ec5a791765e63ac20d8885d11143786&v=4 + url: https://github.com/raceychan +- login: DoctorJohn + count: 5 + avatarUrl: https://avatars.githubusercontent.com/u/14076775?u=2913e70a6142772847e91e2aaa5b9152391715e9&v=4 + url: https://github.com/DoctorJohn - login: sehraramiz - count: 11 + count: 5 avatarUrl: https://avatars.githubusercontent.com/u/14166324?u=8fac65e84dfff24245d304a5b5b09f7b5bd69dc9&v=4 url: https://github.com/sehraramiz -- login: ceb10n - count: 10 - avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4 - url: https://github.com/ceb10n -- login: estebanx64 - count: 7 - avatarUrl: https://avatars.githubusercontent.com/u/10840422?u=45f015f95e1c0f06df602be4ab688d4b854cc8a8&v=4 - url: https://github.com/estebanx64 -- login: yvallois - count: 6 - avatarUrl: https://avatars.githubusercontent.com/u/36999744?v=4 - url: https://github.com/yvallois -- login: n8sty - count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4 - url: https://github.com/n8sty -- login: TomFaulkner - count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/14956620?v=4 - url: https://github.com/TomFaulkner -- login: yokwejuste +- login: eqsdxr count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/71908316?u=592c1e42aa0ee5cb94890e0b863e2acc78cc3bbc&v=4 - url: https://github.com/yokwejuste -- login: jgould22 - count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 - url: https://github.com/jgould22 -- login: alv2017 - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 - url: https://github.com/alv2017 -- login: viniciusCalcantara - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/108818737?u=3d7ffe5808843ee4372f9cc5a559ff1674cf1792&v=4 - url: https://github.com/viniciusCalcantara -- login: pawelad - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/7062874?u=d27dc220545a8401ad21840590a97d474d7101e6&v=4 - url: https://github.com/pawelad -- login: dbfreem - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/9778569?u=f2f1e9135b5e4f1b0c6821a548b17f97572720fc&v=4 - url: https://github.com/dbfreem -- login: Isuxiz - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/48672727?u=34d7b4ade252687d22a27cf53037b735b244bfc1&v=4 - url: https://github.com/Isuxiz -- login: bertomaniac - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/10235051?u=14484a96833228a7b29fee4a7916d411c242c4f6&v=4 - url: https://github.com/bertomaniac -- login: PhysicallyActive - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/160476156?u=7a8e44f4a43d3bba636f795bb7d9476c9233b4d8&v=4 - url: https://github.com/PhysicallyActive -- login: Minibrams - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/8108085?u=b028dbc308fa8485e0e2e9402b3d03d8deb22bf9&v=4 - url: https://github.com/Minibrams -- login: AIdjis + avatarUrl: https://avatars.githubusercontent.com/u/157279130?u=58fddf77ed76966eaa8c73eea9bea4bb0c53b673&v=4 + url: https://github.com/eqsdxr +- login: SobikXexe count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/88404339?u=2a80d80b054e9228391e32fb9bb39571509dab6a&v=4 - url: https://github.com/AIdjis -- login: svlandeg - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4 - url: https://github.com/svlandeg -- login: Trinkes - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/9466879?v=4 - url: https://github.com/Trinkes -- login: PREPONDERANCE - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/112809059?u=30ab12dc9ddba2f94ab90e6ad4ad8bc5cfa7fccd&v=4 - url: https://github.com/PREPONDERANCE -- login: nbx3 - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/34649527?u=943812f69e0d40adbd3fa1c9b8ef50dd971a2a45&v=4 - url: https://github.com/nbx3 -- login: yanggeorge - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/2434407?v=4 - url: https://github.com/yanggeorge -- login: XiaoXinYo - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/56395004?u=b3b7cb758997f283c271a581833e407229dab82c&v=4 - url: https://github.com/XiaoXinYo -- login: pythonweb2 - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/32141163?v=4 - url: https://github.com/pythonweb2 -- login: slafs - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/210173?v=4 - url: https://github.com/slafs -- login: AmirHmZz - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/38752106?u=07f80e451bda00a9492bbc764e49d24ad3ada8cc&v=4 - url: https://github.com/AmirHmZz -- login: iloveitaly - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/150855?v=4 - url: https://github.com/iloveitaly -- login: LincolnPuzey - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/18750802?v=4 - url: https://github.com/LincolnPuzey -- login: alejsdev + avatarUrl: https://avatars.githubusercontent.com/u/87701130?v=4 + url: https://github.com/SobikXexe +- login: EverStarck count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=356f39ff3f0211c720b06d3dbb060e98884085e3&v=4 - url: https://github.com/alejsdev -- login: Knighthawk-Leo - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/72437494?u=27c68db94a3107b605e603cc136f4ba83f0106d5&v=4 - url: https://github.com/Knighthawk-Leo -- login: gelezo43 + avatarUrl: https://avatars.githubusercontent.com/u/51029456?u=343409b7cb6b3ea6a59359f4e8370d9c3f140ecd&v=4 + url: https://github.com/EverStarck +- login: henrymcl count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/40732698?u=611f39d3c1d2f4207a590937a78c1f10eed6232c&v=4 - url: https://github.com/gelezo43 -- login: christiansicari + avatarUrl: https://avatars.githubusercontent.com/u/26480299?v=4 + url: https://github.com/henrymcl +- login: jymchng count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/29756552?v=4 - url: https://github.com/christiansicari -- login: 1001pepi + avatarUrl: https://avatars.githubusercontent.com/u/27895426?u=fb88c47775147d62a395fdb895d1af4148c7b566&v=4 + url: https://github.com/jymchng +- login: adsouza count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/82064861?u=8c6ffdf2275d6970a07294752c545cd2702c57d3&v=4 - url: https://github.com/1001pepi -- login: AliYmn + avatarUrl: https://avatars.githubusercontent.com/u/275832?v=4 + url: https://github.com/adsouza +- login: Brikas count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/18416653?u=98c1fca46c7e4dabe8c39d17b5e55d1511d41cf9&v=4 - url: https://github.com/AliYmn -- login: RichieB2B + avatarUrl: https://avatars.githubusercontent.com/u/80290187?v=4 + url: https://github.com/Brikas +- login: JacobHayes count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/1461970?u=edaa57d1077705244ea5c9244f4783d94ff11f12&v=4 - url: https://github.com/RichieB2B -- login: Synrom + avatarUrl: https://avatars.githubusercontent.com/u/2555532?u=354a525847a276bbb4426b0c95791a8ba5970f9b&v=4 + url: https://github.com/JacobHayes +- login: TaigoFr count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/30272537?v=4 - url: https://github.com/Synrom -- login: ecly + avatarUrl: https://avatars.githubusercontent.com/u/17792131?u=372b27056ec82f1ae03d8b3f37ef55b04a7cfdd1&v=4 + url: https://github.com/TaigoFr +- login: davidhuser count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/8410422?v=4 - url: https://github.com/ecly -- login: iiotsrc + avatarUrl: https://avatars.githubusercontent.com/u/4357648?u=6ed702f8f6d49a8b2a0ed33cbd8ab59c2d7db7f7&v=4 + url: https://github.com/davidhuser +- login: PidgeyBE count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/131771119?u=bcaf2559ef6266af70b151b7fda31a1ee3dbecb3&v=4 - url: https://github.com/iiotsrc -- login: simondale00 + avatarUrl: https://avatars.githubusercontent.com/u/19860056?u=47b584eb1c1ab45e31c1b474109a962d7e82be49&v=4 + url: https://github.com/PidgeyBE +- login: KianAnbarestani count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/33907262?u=2721fb37014d50daf473267c808aa678ecaefe09&v=4 - url: https://github.com/simondale00 -- login: jd-solanki + avatarUrl: https://avatars.githubusercontent.com/u/145364424?u=dcc3d8fb4ca07d36fb52a17f38b6650565de40be&v=4 + url: https://github.com/KianAnbarestani +- login: Ykaiqx count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/47495003?u=6e225cb42c688d0cd70e65c6baedb9f5922b1178&v=4 - url: https://github.com/jd-solanki -- login: AumGupta - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/86357151?u=7d05aa606c0611a18f4db16cf26361ce10a6e195&v=4 - url: https://github.com/AumGupta -- login: DeoLeung - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/3764720?u=4c222ef513814de4c7fb3736d0a7adf11d953d43&v=4 - url: https://github.com/DeoLeung -- login: Reemyos - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/44867003?v=4 - url: https://github.com/Reemyos -- login: deight93 - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/37678115?u=a608798b5bd0034183a9c430ebb42fb266db86ce&v=4 - url: https://github.com/deight93 -- login: Jkrox - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/83181939?u=d6a922d97129f7f3916d6a1c166bc011b3a72b7f&v=4 - url: https://github.com/Jkrox -- login: mmzeynalli - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/33568903?u=19efd0c0722730b83a70b7c86c36e5b7d83e07d2&v=4 - url: https://github.com/mmzeynalli -- login: ddahan - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/1933516?u=1d200a620e8d6841df017e9f2bb7efb58b580f40&v=4 - url: https://github.com/ddahan -- login: jfeaver + avatarUrl: https://avatars.githubusercontent.com/u/56395004?u=1eebf5ce25a8067f7bfa6251a24f667be492d9d6&v=4 + url: https://github.com/Ykaiqx +- login: sinisaos count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/1091338?u=0bcba366447d8fadad63f6705a52d128da4c7ec2&v=4 - url: https://github.com/jfeaver -- login: Wurstnase + avatarUrl: https://avatars.githubusercontent.com/u/30960668?v=4 + url: https://github.com/sinisaos +- login: Ale-Cas count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/8709415?u=f479af475a97aee9a1dab302cfc35d07e9ea245f&v=4 - url: https://github.com/Wurstnase -- login: tristan + avatarUrl: https://avatars.githubusercontent.com/u/64859146?u=d52a6ecf8d83d2927e2ae270bdfcc83495dba8c9&v=4 + url: https://github.com/Ale-Cas +- login: nbx3 count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/1412?u=aab8aaa4cc0f1210ac45fc93873a5909d314c965&v=4 - url: https://github.com/tristan -- login: chandanch + avatarUrl: https://avatars.githubusercontent.com/u/34649527?u=943812f69e0d40adbd3fa1c9b8ef50dd971a2a45&v=4 + url: https://github.com/nbx3 +- login: marsboy02 count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/8663552?u=afc484bc0a952c83f1fb6a1583cda443f807cd66&v=4 - url: https://github.com/chandanch -- login: rvishruth + avatarUrl: https://avatars.githubusercontent.com/u/86903678?u=efe3aa9e4b22689df7633a96328fb35bf4a23905&v=4 + url: https://github.com/marsboy02 +- login: vtgn count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/79176273?v=4 - url: https://github.com/rvishruth -- login: mattmess1221 + avatarUrl: https://avatars.githubusercontent.com/u/112889052?v=4 + url: https://github.com/vtgn +- login: Trinkes count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/3409962?u=723662989f2027755e67d200137c13c53ae154ac&v=4 - url: https://github.com/mattmess1221 + avatarUrl: https://avatars.githubusercontent.com/u/9466879?v=4 + url: https://github.com/Trinkes one_year_experts: - login: YuriiMotov - count: 223 + count: 831 avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 url: https://github.com/YuriiMotov +- login: luzzodev + count: 84 + avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4 + url: https://github.com/luzzodev - login: Kludex - count: 81 + count: 55 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4 url: https://github.com/Kludex -- login: JavierSanchezCastro - count: 47 - avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 - url: https://github.com/JavierSanchezCastro -- login: jgould22 - count: 42 - avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 - url: https://github.com/jgould22 - login: sinisaos - count: 39 + count: 41 avatarUrl: https://avatars.githubusercontent.com/u/30960668?v=4 url: https://github.com/sinisaos -- login: luzzodev - count: 37 - avatarUrl: https://avatars.githubusercontent.com/u/27291415?v=4 - url: https://github.com/luzzodev +- login: alv2017 + count: 26 + avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 + url: https://github.com/alv2017 +- login: JavierSanchezCastro + count: 25 + avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 + url: https://github.com/JavierSanchezCastro - login: tiangolo - count: 24 + count: 22 avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 url: https://github.com/tiangolo -- login: n8sty - count: 23 - avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4 - url: https://github.com/n8sty -- login: estebanx64 - count: 19 - avatarUrl: https://avatars.githubusercontent.com/u/10840422?u=45f015f95e1c0f06df602be4ab688d4b854cc8a8&v=4 - url: https://github.com/estebanx64 -- login: ceb10n - count: 15 - avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4 - url: https://github.com/ceb10n -- login: sehraramiz - count: 15 - avatarUrl: https://avatars.githubusercontent.com/u/14166324?u=8fac65e84dfff24245d304a5b5b09f7b5bd69dc9&v=4 - url: https://github.com/sehraramiz -- login: PhysicallyActive +- login: jgould22 + count: 17 + avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 + url: https://github.com/jgould22 +- login: valentinDruzhinin count: 14 - avatarUrl: https://avatars.githubusercontent.com/u/160476156?u=7a8e44f4a43d3bba636f795bb7d9476c9233b4d8&v=4 - url: https://github.com/PhysicallyActive + avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4 + url: https://github.com/valentinDruzhinin - login: Kfir-G count: 13 avatarUrl: https://avatars.githubusercontent.com/u/57500876?u=0cd29db046a17f12f382d398141319fca7ff230a&v=4 url: https://github.com/Kfir-G -- login: mattmess1221 +- login: estebanx64 count: 11 - avatarUrl: https://avatars.githubusercontent.com/u/3409962?u=723662989f2027755e67d200137c13c53ae154ac&v=4 - url: https://github.com/mattmess1221 -- login: hasansezertasan + avatarUrl: https://avatars.githubusercontent.com/u/10840422?u=45f015f95e1c0f06df602be4ab688d4b854cc8a8&v=4 + url: https://github.com/estebanx64 +- login: sehraramiz + count: 11 + avatarUrl: https://avatars.githubusercontent.com/u/14166324?u=8fac65e84dfff24245d304a5b5b09f7b5bd69dc9&v=4 + url: https://github.com/sehraramiz +- login: ceb10n count: 10 - avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 - url: https://github.com/hasansezertasan -- login: AIdjis + avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4 + url: https://github.com/ceb10n +- login: sachinh35 + count: 9 + avatarUrl: https://avatars.githubusercontent.com/u/21972708?u=8560b97b8b41e175f476270b56de8a493b84f302&v=4 + url: https://github.com/sachinh35 +- login: yauhen-sobaleu + count: 9 + avatarUrl: https://avatars.githubusercontent.com/u/51629535?u=fc1817060daf2df438bfca86c44f33da5cd667db&v=4 + url: https://github.com/yauhen-sobaleu +- login: n8sty count: 8 - avatarUrl: https://avatars.githubusercontent.com/u/88404339?u=2a80d80b054e9228391e32fb9bb39571509dab6a&v=4 - url: https://github.com/AIdjis + avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4 + url: https://github.com/n8sty - login: yvallois - count: 6 + count: 7 avatarUrl: https://avatars.githubusercontent.com/u/36999744?v=4 url: https://github.com/yvallois -- login: PREPONDERANCE - count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/112809059?u=30ab12dc9ddba2f94ab90e6ad4ad8bc5cfa7fccd&v=4 - url: https://github.com/PREPONDERANCE -- login: pythonweb2 - count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/32141163?v=4 - url: https://github.com/pythonweb2 -- login: acidjunk - count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4 - url: https://github.com/acidjunk -- login: gustavosett - count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/99373133?u=1739ca547c3d200f1b72450520bce46a97aab184&v=4 - url: https://github.com/gustavosett -- login: binbjz +- login: raceychan + count: 6 + avatarUrl: https://avatars.githubusercontent.com/u/75417963?u=060c62870ec5a791765e63ac20d8885d11143786&v=4 + url: https://github.com/raceychan +- login: DoctorJohn count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/8213913?u=22b68b7a0d5bf5e09c02084c0f5f53d7503114cd&v=4 - url: https://github.com/binbjz -- login: chyok + avatarUrl: https://avatars.githubusercontent.com/u/14076775?u=2913e70a6142772847e91e2aaa5b9152391715e9&v=4 + url: https://github.com/DoctorJohn +- login: AIdjis count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/32629225?u=3b7c30e8a09426a1b9284f6e8a0ae53a525596bf&v=4 - url: https://github.com/chyok + avatarUrl: https://avatars.githubusercontent.com/u/88404339?u=2a80d80b054e9228391e32fb9bb39571509dab6a&v=4 + url: https://github.com/AIdjis +- login: eqsdxr + count: 4 + avatarUrl: https://avatars.githubusercontent.com/u/157279130?u=58fddf77ed76966eaa8c73eea9bea4bb0c53b673&v=4 + url: https://github.com/eqsdxr - login: TomFaulkner count: 4 avatarUrl: https://avatars.githubusercontent.com/u/14956620?v=4 url: https://github.com/TomFaulkner - login: yokwejuste count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/71908316?u=592c1e42aa0ee5cb94890e0b863e2acc78cc3bbc&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/71908316?u=4ba43bd63c169b5c015137d8916752a44001445a&v=4 url: https://github.com/yokwejuste -- login: DeoLeung - count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/3764720?u=4c222ef513814de4c7fb3736d0a7adf11d953d43&v=4 - url: https://github.com/DeoLeung -- login: flo-at - count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/564288?v=4 - url: https://github.com/flo-at -- login: GodMoonGoodman +- login: PhysicallyActive count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/29688727?u=7b251da620d999644c37c1feeb292d033eed7ad6&v=4 - url: https://github.com/GodMoonGoodman -- login: bertomaniac + avatarUrl: https://avatars.githubusercontent.com/u/160476156?u=7a8e44f4a43d3bba636f795bb7d9476c9233b4d8&v=4 + url: https://github.com/PhysicallyActive +- login: svlandeg count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/10235051?u=14484a96833228a7b29fee4a7916d411c242c4f6&v=4 - url: https://github.com/bertomaniac -- login: alv2017 + avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4 + url: https://github.com/svlandeg +- login: mattmess1221 count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 - url: https://github.com/alv2017 -- login: msehnout + avatarUrl: https://avatars.githubusercontent.com/u/3409962?u=d22ea18aa8ea688af25a45df306134d593621a44&v=4 + url: https://github.com/mattmess1221 +- login: pythonweb2 count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/9369632?u=8c988f1b008a3f601385a3616f9327820f66e3a5&v=4 - url: https://github.com/msehnout + avatarUrl: https://avatars.githubusercontent.com/u/32141163?v=4 + url: https://github.com/pythonweb2 - login: viniciusCalcantara count: 3 avatarUrl: https://avatars.githubusercontent.com/u/108818737?u=3d7ffe5808843ee4372f9cc5a559ff1674cf1792&v=4 url: https://github.com/viniciusCalcantara -- login: pawelad +- login: davidhuser count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/7062874?u=d27dc220545a8401ad21840590a97d474d7101e6&v=4 - url: https://github.com/pawelad -- login: ThirVondukr + avatarUrl: https://avatars.githubusercontent.com/u/4357648?u=6ed702f8f6d49a8b2a0ed33cbd8ab59c2d7db7f7&v=4 + url: https://github.com/davidhuser +- login: bertomaniac count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/50728601?u=167c0bd655e52817082e50979a86d2f98f95b1a3&v=4 - url: https://github.com/ThirVondukr + avatarUrl: https://avatars.githubusercontent.com/u/10235051?u=14484a96833228a7b29fee4a7916d411c242c4f6&v=4 + url: https://github.com/bertomaniac - login: dbfreem count: 3 avatarUrl: https://avatars.githubusercontent.com/u/9778569?u=f2f1e9135b5e4f1b0c6821a548b17f97572720fc&v=4 url: https://github.com/dbfreem -- login: Isuxiz +- login: SobikXexe count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/48672727?u=34d7b4ade252687d22a27cf53037b735b244bfc1&v=4 - url: https://github.com/Isuxiz -- login: angely-dev + avatarUrl: https://avatars.githubusercontent.com/u/87701130?v=4 + url: https://github.com/SobikXexe +- login: DeoLeung count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/4362224?v=4 - url: https://github.com/angely-dev -- login: deight93 + avatarUrl: https://avatars.githubusercontent.com/u/3764720?u=4c222ef513814de4c7fb3736d0a7adf11d953d43&v=4 + url: https://github.com/DeoLeung +- login: pawelad count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/37678115?u=a608798b5bd0034183a9c430ebb42fb266db86ce&v=4 - url: https://github.com/deight93 -- login: mmzeynalli + avatarUrl: https://avatars.githubusercontent.com/u/7062874?u=d27dc220545a8401ad21840590a97d474d7101e6&v=4 + url: https://github.com/pawelad +- login: Isuxiz count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/33568903?u=19efd0c0722730b83a70b7c86c36e5b7d83e07d2&v=4 - url: https://github.com/mmzeynalli + avatarUrl: https://avatars.githubusercontent.com/u/48672727?u=34d7b4ade252687d22a27cf53037b735b244bfc1&v=4 + url: https://github.com/Isuxiz - login: Minibrams count: 3 avatarUrl: https://avatars.githubusercontent.com/u/8108085?u=b028dbc308fa8485e0e2e9402b3d03d8deb22bf9&v=4 url: https://github.com/Minibrams -- login: ryanisn - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/53449841?v=4 - url: https://github.com/ryanisn -- login: svlandeg - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4 - url: https://github.com/svlandeg -- login: alexandercronin - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/8014288?u=69580504c51a0cdd756fc47b23bb7f404bd694e7&v=4 - url: https://github.com/alexandercronin -- login: aanchlia - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/2835374?u=3c3ed29aa8b09ccaf8d66def0ce82bc2f7e5aab6&v=4 - url: https://github.com/aanchlia -- login: chrisK824 - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/79946379?u=03d85b22d696a58a9603e55fbbbe2de6b0f4face&v=4 - url: https://github.com/chrisK824 -- login: omarcruzpantoja - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/15116058?u=4b64c643fad49225d854e1aaecd1ffc6f9071a1b&v=4 - url: https://github.com/omarcruzpantoja -- login: ahmedabdou14 - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/104530599?u=d87b866e7c1db970d6f8e8031643818349b046d5&v=4 - url: https://github.com/ahmedabdou14 -- login: Trinkes - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/9466879?v=4 - url: https://github.com/Trinkes -- login: Leon0824 - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/1922026?v=4 - url: https://github.com/Leon0824 -- login: CarlosOliveira-23 - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/102637302?u=cf350a4db956f30cbb2c27d3be0d15c282e32b14&v=4 - url: https://github.com/CarlosOliveira-23 -- login: nbx3 - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/34649527?u=943812f69e0d40adbd3fa1c9b8ef50dd971a2a45&v=4 - url: https://github.com/nbx3 - login: yanggeorge count: 2 avatarUrl: https://avatars.githubusercontent.com/u/2434407?v=4 url: https://github.com/yanggeorge -- login: XiaoXinYo +- login: mmzeynalli count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/56395004?u=b3b7cb758997f283c271a581833e407229dab82c&v=4 - url: https://github.com/XiaoXinYo -- login: anantgupta129 + avatarUrl: https://avatars.githubusercontent.com/u/33568903?u=19efd0c0722730b83a70b7c86c36e5b7d83e07d2&v=4 + url: https://github.com/mmzeynalli +- login: jd-solanki count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/66518357?u=6e25dcd84638f17d2c6df5dc26f07fd7c6dc118e&v=4 - url: https://github.com/anantgupta129 + avatarUrl: https://avatars.githubusercontent.com/u/47495003?u=6e225cb42c688d0cd70e65c6baedb9f5922b1178&v=4 + url: https://github.com/jd-solanki +- login: EverStarck + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/51029456?u=343409b7cb6b3ea6a59359f4e8370d9c3f140ecd&v=4 + url: https://github.com/EverStarck - login: slafs count: 2 avatarUrl: https://avatars.githubusercontent.com/u/210173?v=4 url: https://github.com/slafs -- login: monchin +- login: henrymcl count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/18521800?v=4 - url: https://github.com/monchin -- login: AmirHmZz + avatarUrl: https://avatars.githubusercontent.com/u/26480299?v=4 + url: https://github.com/henrymcl +- login: jymchng count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/38752106?u=07f80e451bda00a9492bbc764e49d24ad3ada8cc&v=4 - url: https://github.com/AmirHmZz + avatarUrl: https://avatars.githubusercontent.com/u/27895426?u=fb88c47775147d62a395fdb895d1af4148c7b566&v=4 + url: https://github.com/jymchng +- login: adsouza + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/275832?v=4 + url: https://github.com/adsouza +- login: Synrom + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/30272537?v=4 + url: https://github.com/Synrom +- login: gaby + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/835733?u=8c72dec16fa560bdc81113354f2ffd79ad062bde&v=4 + url: https://github.com/gaby +- login: christiansicari + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/29756552?v=4 + url: https://github.com/christiansicari +- login: Brikas + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/80290187?v=4 + url: https://github.com/Brikas +- login: JacobHayes + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/2555532?u=354a525847a276bbb4426b0c95791a8ba5970f9b&v=4 + url: https://github.com/JacobHayes +- login: TaigoFr + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/17792131?u=372b27056ec82f1ae03d8b3f37ef55b04a7cfdd1&v=4 + url: https://github.com/TaigoFr +- login: rlimberger + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/4841242?u=6a13252caf3cedceb07b6e2775b6592445d13b70&v=4 + url: https://github.com/rlimberger - login: iloveitaly count: 2 avatarUrl: https://avatars.githubusercontent.com/u/150855?v=4 url: https://github.com/iloveitaly -- login: msukmanowsky +- login: iiotsrc + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/131771119?u=bcaf2559ef6266af70b151b7fda31a1ee3dbecb3&v=4 + url: https://github.com/iiotsrc +- login: AmirHmZz + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/38752106?u=07f80e451bda00a9492bbc764e49d24ad3ada8cc&v=4 + url: https://github.com/AmirHmZz +- login: PidgeyBE count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/362755?u=782e6bf5b9f0356c3f74b4d894fda9f179252086&v=4 - url: https://github.com/msukmanowsky -- login: shurshilov + avatarUrl: https://avatars.githubusercontent.com/u/19860056?u=47b584eb1c1ab45e31c1b474109a962d7e82be49&v=4 + url: https://github.com/PidgeyBE +- login: KianAnbarestani count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/11828278?u=6bcadc5ce4f2f56a514331c9f68eb987d4afe29a&v=4 - url: https://github.com/shurshilov + avatarUrl: https://avatars.githubusercontent.com/u/145364424?u=dcc3d8fb4ca07d36fb52a17f38b6650565de40be&v=4 + url: https://github.com/KianAnbarestani +- login: Ykaiqx + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/56395004?u=1eebf5ce25a8067f7bfa6251a24f667be492d9d6&v=4 + url: https://github.com/Ykaiqx +- login: AliYmn + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/18416653?u=a77e2605e3ce6aaf6fef8ad4a7b0d32954fba47a&v=4 + url: https://github.com/AliYmn +- login: dolfinus + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/4661021?u=ed5ddadcf36d9b943ebe61febe0b96ee34e5425d&v=4 + url: https://github.com/dolfinus +- login: gelezo43 + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/40732698?u=611f39d3c1d2f4207a590937a78c1f10eed6232c&v=4 + url: https://github.com/gelezo43 diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 5cbf05f9d..784fd6692 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -5,26 +5,14 @@ gold: - url: https://platform.sh/try-it-now/?utm_source=fastapi-signup&utm_medium=banner&utm_campaign=FastAPI-signup-June-2023 title: "Build, run and scale your apps on a modern, reliable, and secure PaaS." img: https://fastapi.tiangolo.com/img/sponsors/platform-sh.png - - url: https://www.porter.run - title: Deploy FastAPI on AWS with a few clicks - img: https://fastapi.tiangolo.com/img/sponsors/porter.png - - url: https://bump.sh/fastapi?utm_source=fastapi&utm_medium=referral&utm_campaign=sponsor - title: Automate FastAPI documentation generation with Bump.sh - img: https://fastapi.tiangolo.com/img/sponsors/bump-sh.svg - url: https://github.com/scalar/scalar/?utm_source=fastapi&utm_medium=website&utm_campaign=main-badge title: "Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files" img: https://fastapi.tiangolo.com/img/sponsors/scalar.svg - url: https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=mainbadge title: Auth, user management and more for your B2B product img: https://fastapi.tiangolo.com/img/sponsors/propelauth.png - - url: https://www.withcoherence.com/?utm_medium=advertising&utm_source=fastapi&utm_campaign=website - title: Coherence - img: https://fastapi.tiangolo.com/img/sponsors/coherence.png - - url: https://www.mongodb.com/developer/languages/python/python-quickstart-fastapi/?utm_campaign=fastapi_framework&utm_source=fastapi_sponsorship&utm_medium=web_referral - title: Simplify Full Stack Development with FastAPI & MongoDB - img: https://fastapi.tiangolo.com/img/sponsors/mongodb.png - url: https://zuplo.link/fastapi-gh - title: 'Zuplo: Scale, Protect, Document, and Monetize your FastAPI' + title: 'Zuplo: Deploy, Secure, Document, and Monetize your FastAPI' img: https://fastapi.tiangolo.com/img/sponsors/zuplo.png - url: https://liblab.com?utm_source=fastapi title: liblab - Generate SDKs from FastAPI @@ -35,14 +23,17 @@ gold: - url: https://www.coderabbit.ai/?utm_source=fastapi&utm_medium=badge&utm_campaign=fastapi title: Cut Code Review Time & Bugs in Half with CodeRabbit img: https://fastapi.tiangolo.com/img/sponsors/coderabbit.png + - url: https://subtotal.com/?utm_source=fastapi&utm_medium=sponsorship&utm_campaign=open-source + title: The Gold Standard in Retail Account Linking + img: https://fastapi.tiangolo.com/img/sponsors/subtotal.svg + - url: https://vibe.mobb.ai/?utm_source=Fast+APi&utm_medium=Image&utm_campaign=MVS + title: Secure Your AI-Generated Code to Unlock Dev Productivity + img: https://fastapi.tiangolo.com/img/sponsors/mobbai.png silver: - - url: https://github.com/deepset-ai/haystack/ - title: Build powerful search from composable, open source building blocks - img: https://fastapi.tiangolo.com/img/sponsors/haystack-fastapi.svg - url: https://databento.com/ title: Pay as you go for market data img: https://fastapi.tiangolo.com/img/sponsors/databento.svg - - url: https://speakeasy.com?utm_source=fastapi+repo&utm_medium=github+sponsorship + - url: https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship title: SDKs for your API | Speakeasy img: https://fastapi.tiangolo.com/img/sponsors/speakeasy.png - url: https://www.svix.com/ @@ -54,6 +45,12 @@ silver: - url: https://www.permit.io/blog/implement-authorization-in-fastapi?utm_source=github&utm_medium=referral&utm_campaign=fastapi title: Fine-Grained Authorization for FastAPI img: https://fastapi.tiangolo.com/img/sponsors/permit.png + - url: https://www.interviewpal.com/?utm_source=fastapi&utm_medium=open-source&utm_campaign=dev-hiring + title: InterviewPal - AI Interview Coach for Engineers and Devs + img: https://fastapi.tiangolo.com/img/sponsors/interviewpal.png + - url: https://dribia.com/en/ + title: Dribia - Data Science within your reach + img: https://fastapi.tiangolo.com/img/sponsors/dribia.png bronze: - url: https://www.exoflare.com/open-source/?utm_source=FastAPI&utm_campaign=open_source title: Biosecurity risk assessments made easy. diff --git a/docs/en/data/sponsors_badge.yml b/docs/en/data/sponsors_badge.yml index d507a500f..a8895c8ed 100644 --- a/docs/en/data/sponsors_badge.yml +++ b/docs/en/data/sponsors_badge.yml @@ -38,3 +38,9 @@ logins: - render-sponsorships - renderinc - stainless-api + - snapit-cypher + - coderabbitai + - permitio + - LambdaTest-Inc + - dribia + - madisonredtfeldt diff --git a/docs/en/data/topic_repos.yml b/docs/en/data/topic_repos.yml index 633b0aee3..ab9f21995 100644 --- a/docs/en/data/topic_repos.yml +++ b/docs/en/data/topic_repos.yml @@ -1,495 +1,495 @@ - name: full-stack-fastapi-template html_url: https://github.com/fastapi/full-stack-fastapi-template - stars: 30645 + stars: 34156 owner_login: fastapi owner_html_url: https://github.com/fastapi - name: Hello-Python html_url: https://github.com/mouredev/Hello-Python - stars: 28690 + stars: 30835 owner_login: mouredev owner_html_url: https://github.com/mouredev - name: serve html_url: https://github.com/jina-ai/serve - stars: 21356 + stars: 21631 owner_login: jina-ai owner_html_url: https://github.com/jina-ai -- name: sqlmodel - html_url: https://github.com/fastapi/sqlmodel - stars: 15312 - owner_login: fastapi - owner_html_url: https://github.com/fastapi - name: HivisionIDPhotos html_url: https://github.com/Zeyi-Lin/HivisionIDPhotos - stars: 14957 + stars: 18125 owner_login: Zeyi-Lin owner_html_url: https://github.com/Zeyi-Lin +- name: sqlmodel + html_url: https://github.com/fastapi/sqlmodel + stars: 16249 + owner_login: fastapi + owner_html_url: https://github.com/fastapi - name: Douyin_TikTok_Download_API html_url: https://github.com/Evil0ctal/Douyin_TikTok_Download_API - stars: 11192 + stars: 13279 owner_login: Evil0ctal owner_html_url: https://github.com/Evil0ctal - name: fastapi-best-practices html_url: https://github.com/zhanymkanov/fastapi-best-practices - stars: 10501 + stars: 12334 owner_login: zhanymkanov owner_html_url: https://github.com/zhanymkanov - name: awesome-fastapi html_url: https://github.com/mjhea0/awesome-fastapi - stars: 9193 + stars: 9934 owner_login: mjhea0 owner_html_url: https://github.com/mjhea0 - name: FastUI html_url: https://github.com/pydantic/FastUI - stars: 8721 + stars: 8838 owner_login: pydantic owner_html_url: https://github.com/pydantic +- name: XHS-Downloader + html_url: https://github.com/JoeanAmier/XHS-Downloader + stars: 7962 + owner_login: JoeanAmier + owner_html_url: https://github.com/JoeanAmier - name: nonebot2 html_url: https://github.com/nonebot/nonebot2 - stars: 6433 + stars: 6834 owner_login: nonebot owner_html_url: https://github.com/nonebot -- name: serge - html_url: https://github.com/serge-chat/serge - stars: 5699 - owner_login: serge-chat - owner_html_url: https://github.com/serge-chat - name: FileCodeBox html_url: https://github.com/vastsa/FileCodeBox - stars: 5534 + stars: 6783 owner_login: vastsa owner_html_url: https://github.com/vastsa -- name: fastapi-users - html_url: https://github.com/fastapi-users/fastapi-users - stars: 4921 - owner_login: fastapi-users - owner_html_url: https://github.com/fastapi-users -- name: polar - html_url: https://github.com/polarsource/polar - stars: 4598 - owner_login: polarsource - owner_html_url: https://github.com/polarsource +- name: fastapi_mcp + html_url: https://github.com/tadata-org/fastapi_mcp + stars: 5846 + owner_login: tadata-org + owner_html_url: https://github.com/tadata-org - name: hatchet html_url: https://github.com/hatchet-dev/hatchet - stars: 4585 + stars: 5773 owner_login: hatchet-dev owner_html_url: https://github.com/hatchet-dev -- name: chatgpt-web-share - html_url: https://github.com/chatpire/chatgpt-web-share - stars: 4318 - owner_login: chatpire - owner_html_url: https://github.com/chatpire +- name: serge + html_url: https://github.com/serge-chat/serge + stars: 5728 + owner_login: serge-chat + owner_html_url: https://github.com/serge-chat +- name: polar + html_url: https://github.com/polarsource/polar + stars: 5709 + owner_login: polarsource + owner_html_url: https://github.com/polarsource +- name: fastapi-users + html_url: https://github.com/fastapi-users/fastapi-users + stars: 5336 + owner_login: fastapi-users + owner_html_url: https://github.com/fastapi-users - name: strawberry html_url: https://github.com/strawberry-graphql/strawberry - stars: 4180 + stars: 4317 owner_login: strawberry-graphql owner_html_url: https://github.com/strawberry-graphql +- name: chatgpt-web-share + html_url: https://github.com/chatpire/chatgpt-web-share + stars: 4301 + owner_login: chatpire + owner_html_url: https://github.com/chatpire - name: atrilabs-engine html_url: https://github.com/Atri-Labs/atrilabs-engine - stars: 4114 + stars: 4106 owner_login: Atri-Labs owner_html_url: https://github.com/Atri-Labs - name: dynaconf html_url: https://github.com/dynaconf/dynaconf - stars: 3904 + stars: 4045 owner_login: dynaconf owner_html_url: https://github.com/dynaconf - name: poem html_url: https://github.com/poem-web/poem - stars: 3781 + stars: 4037 owner_login: poem-web owner_html_url: https://github.com/poem-web - name: farfalle html_url: https://github.com/rashadphz/farfalle - stars: 3190 + stars: 3348 owner_login: rashadphz owner_html_url: https://github.com/rashadphz -- name: opyrator - html_url: https://github.com/ml-tooling/opyrator - stars: 3119 - owner_login: ml-tooling - owner_html_url: https://github.com/ml-tooling +- name: LitServe + html_url: https://github.com/Lightning-AI/LitServe + stars: 3347 + owner_login: Lightning-AI + owner_html_url: https://github.com/Lightning-AI - name: fastapi-admin html_url: https://github.com/fastapi-admin/fastapi-admin - stars: 3086 + stars: 3309 owner_login: fastapi-admin owner_html_url: https://github.com/fastapi-admin -- name: docarray - html_url: https://github.com/docarray/docarray - stars: 3021 - owner_login: docarray - owner_html_url: https://github.com/docarray - name: datamodel-code-generator html_url: https://github.com/koxudaxi/datamodel-code-generator - stars: 2988 + stars: 3291 owner_login: koxudaxi owner_html_url: https://github.com/koxudaxi -- name: LitServe - html_url: https://github.com/Lightning-AI/LitServe - stars: 2863 - owner_login: Lightning-AI - owner_html_url: https://github.com/Lightning-AI -- name: fastapi-realworld-example-app - html_url: https://github.com/nsidnev/fastapi-realworld-example-app - stars: 2850 - owner_login: nsidnev - owner_html_url: https://github.com/nsidnev - name: logfire html_url: https://github.com/pydantic/logfire - stars: 2757 + stars: 3288 owner_login: pydantic owner_html_url: https://github.com/pydantic -- name: uvicorn-gunicorn-fastapi-docker - html_url: https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker - stars: 2731 - owner_login: tiangolo - owner_html_url: https://github.com/tiangolo - name: huma html_url: https://github.com/danielgtaylor/huma - stars: 2700 + stars: 3201 owner_login: danielgtaylor owner_html_url: https://github.com/danielgtaylor +- name: opyrator + html_url: https://github.com/ml-tooling/opyrator + stars: 3132 + owner_login: ml-tooling + owner_html_url: https://github.com/ml-tooling +- name: Kokoro-FastAPI + html_url: https://github.com/remsky/Kokoro-FastAPI + stars: 3099 + owner_login: remsky + owner_html_url: https://github.com/remsky +- name: docarray + html_url: https://github.com/docarray/docarray + stars: 3075 + owner_login: docarray + owner_html_url: https://github.com/docarray +- name: fastapi-realworld-example-app + html_url: https://github.com/nsidnev/fastapi-realworld-example-app + stars: 2902 + owner_login: nsidnev + owner_html_url: https://github.com/nsidnev - name: tracecat html_url: https://github.com/TracecatHQ/tracecat - stars: 2539 + stars: 2888 owner_login: TracecatHQ owner_html_url: https://github.com/TracecatHQ +- name: uvicorn-gunicorn-fastapi-docker + html_url: https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker + stars: 2775 + owner_login: tiangolo + owner_html_url: https://github.com/tiangolo - name: best-of-web-python html_url: https://github.com/ml-tooling/best-of-web-python - stars: 2460 + stars: 2537 owner_login: ml-tooling owner_html_url: https://github.com/ml-tooling - name: RasaGPT html_url: https://github.com/paulpierre/RasaGPT - stars: 2401 + stars: 2427 owner_login: paulpierre owner_html_url: https://github.com/paulpierre - name: fastapi-react html_url: https://github.com/Buuntu/fastapi-react - stars: 2315 + stars: 2397 owner_login: Buuntu owner_html_url: https://github.com/Buuntu -- name: nextpy - html_url: https://github.com/dot-agent/nextpy - stars: 2266 - owner_login: dot-agent - owner_html_url: https://github.com/dot-agent -- name: 30-Days-of-Python - html_url: https://github.com/codingforentrepreneurs/30-Days-of-Python - stars: 2163 - owner_login: codingforentrepreneurs - owner_html_url: https://github.com/codingforentrepreneurs - name: FastAPI-template html_url: https://github.com/s3rius/FastAPI-template - stars: 2156 + stars: 2334 owner_login: s3rius owner_html_url: https://github.com/s3rius +- name: nextpy + html_url: https://github.com/dot-agent/nextpy + stars: 2295 + owner_login: dot-agent + owner_html_url: https://github.com/dot-agent - name: sqladmin html_url: https://github.com/aminalaee/sqladmin - stars: 2051 + stars: 2235 owner_login: aminalaee owner_html_url: https://github.com/aminalaee +- name: 30-Days-of-Python + html_url: https://github.com/codingforentrepreneurs/30-Days-of-Python + stars: 2181 + owner_login: codingforentrepreneurs + owner_html_url: https://github.com/codingforentrepreneurs - name: langserve html_url: https://github.com/langchain-ai/langserve - stars: 2025 + stars: 2119 owner_login: langchain-ai owner_html_url: https://github.com/langchain-ai - name: fastapi-utils html_url: https://github.com/fastapiutils/fastapi-utils - stars: 2021 + stars: 2100 owner_login: fastapiutils owner_html_url: https://github.com/fastapiutils -- name: solara - html_url: https://github.com/widgetti/solara - stars: 1980 - owner_login: widgetti - owner_html_url: https://github.com/widgetti - name: supabase-py html_url: https://github.com/supabase/supabase-py - stars: 1874 + stars: 2084 owner_login: supabase owner_html_url: https://github.com/supabase -- name: python-week-2022 - html_url: https://github.com/rochacbruno/python-week-2022 - stars: 1829 - owner_login: rochacbruno - owner_html_url: https://github.com/rochacbruno +- name: solara + html_url: https://github.com/widgetti/solara + stars: 2056 + owner_login: widgetti + owner_html_url: https://github.com/widgetti - name: mangum html_url: https://github.com/Kludex/mangum - stars: 1820 + stars: 1923 owner_login: Kludex owner_html_url: https://github.com/Kludex -- name: Kokoro-FastAPI - html_url: https://github.com/remsky/Kokoro-FastAPI - stars: 1771 - owner_login: remsky - owner_html_url: https://github.com/remsky +- name: python-week-2022 + html_url: https://github.com/rochacbruno/python-week-2022 + stars: 1821 + owner_login: rochacbruno + owner_html_url: https://github.com/rochacbruno +- name: agentkit + html_url: https://github.com/BCG-X-Official/agentkit + stars: 1765 + owner_login: BCG-X-Official + owner_html_url: https://github.com/BCG-X-Official - name: manage-fastapi html_url: https://github.com/ycd/manage-fastapi - stars: 1719 + stars: 1756 owner_login: ycd owner_html_url: https://github.com/ycd - name: ormar html_url: https://github.com/collerek/ormar - stars: 1710 + stars: 1755 owner_login: collerek owner_html_url: https://github.com/collerek -- name: agentkit - html_url: https://github.com/BCG-X-Official/agentkit - stars: 1658 - owner_login: BCG-X-Official - owner_html_url: https://github.com/BCG-X-Official - name: langchain-serve html_url: https://github.com/jina-ai/langchain-serve - stars: 1618 + stars: 1631 owner_login: jina-ai owner_html_url: https://github.com/jina-ai -- name: termpair - html_url: https://github.com/cs01/termpair - stars: 1611 - owner_login: cs01 - owner_html_url: https://github.com/cs01 -- name: coronavirus-tracker-api - html_url: https://github.com/ExpDev07/coronavirus-tracker-api - stars: 1588 - owner_login: ExpDev07 - owner_html_url: https://github.com/ExpDev07 - name: piccolo html_url: https://github.com/piccolo-orm/piccolo - stars: 1546 + stars: 1629 owner_login: piccolo-orm owner_html_url: https://github.com/piccolo-orm -- name: fastapi-cache - html_url: https://github.com/long2ice/fastapi-cache - stars: 1478 - owner_login: long2ice - owner_html_url: https://github.com/long2ice +- name: termpair + html_url: https://github.com/cs01/termpair + stars: 1616 + owner_login: cs01 + owner_html_url: https://github.com/cs01 - name: openapi-python-client html_url: https://github.com/openapi-generators/openapi-python-client - stars: 1467 + stars: 1603 owner_login: openapi-generators owner_html_url: https://github.com/openapi-generators +- name: fastapi-cache + html_url: https://github.com/long2ice/fastapi-cache + stars: 1589 + owner_login: long2ice + owner_html_url: https://github.com/long2ice +- name: coronavirus-tracker-api + html_url: https://github.com/ExpDev07/coronavirus-tracker-api + stars: 1580 + owner_login: ExpDev07 + owner_html_url: https://github.com/ExpDev07 +- name: slowapi + html_url: https://github.com/laurentS/slowapi + stars: 1533 + owner_login: laurentS + owner_html_url: https://github.com/laurentS - name: fastapi-crudrouter html_url: https://github.com/awtkns/fastapi-crudrouter - stars: 1462 + stars: 1518 owner_login: awtkns owner_html_url: https://github.com/awtkns - name: awesome-fastapi-projects html_url: https://github.com/Kludex/awesome-fastapi-projects - stars: 1418 + stars: 1461 owner_login: Kludex owner_html_url: https://github.com/Kludex +- name: vue-fastapi-admin + html_url: https://github.com/mizhexiaoxiao/vue-fastapi-admin + stars: 1409 + owner_login: mizhexiaoxiao + owner_html_url: https://github.com/mizhexiaoxiao - name: awesome-python-resources html_url: https://github.com/DjangoEx/awesome-python-resources - stars: 1383 + stars: 1393 owner_login: DjangoEx owner_html_url: https://github.com/DjangoEx -- name: slowapi - html_url: https://github.com/laurentS/slowapi - stars: 1363 - owner_login: laurentS - owner_html_url: https://github.com/laurentS -- name: budgetml - html_url: https://github.com/ebhy/budgetml - stars: 1344 - owner_login: ebhy - owner_html_url: https://github.com/ebhy - name: fastapi-pagination html_url: https://github.com/uriyyo/fastapi-pagination - stars: 1284 + stars: 1378 owner_login: uriyyo owner_html_url: https://github.com/uriyyo - name: fastapi-boilerplate html_url: https://github.com/teamhide/fastapi-boilerplate - stars: 1234 + stars: 1348 owner_login: teamhide owner_html_url: https://github.com/teamhide -- name: fastapi-tutorial - html_url: https://github.com/liaogx/fastapi-tutorial - stars: 1181 - owner_login: liaogx - owner_html_url: https://github.com/liaogx +- name: budgetml + html_url: https://github.com/ebhy/budgetml + stars: 1344 + owner_login: ebhy + owner_html_url: https://github.com/ebhy - name: fastapi-amis-admin html_url: https://github.com/amisadmin/fastapi-amis-admin - stars: 1164 + stars: 1284 owner_login: amisadmin owner_html_url: https://github.com/amisadmin +- name: bracket + html_url: https://github.com/evroon/bracket + stars: 1274 + owner_login: evroon + owner_html_url: https://github.com/evroon +- name: fastapi-tutorial + html_url: https://github.com/liaogx/fastapi-tutorial + stars: 1265 + owner_login: liaogx + owner_html_url: https://github.com/liaogx - name: fastapi-code-generator html_url: https://github.com/koxudaxi/fastapi-code-generator - stars: 1132 + stars: 1216 owner_login: koxudaxi owner_html_url: https://github.com/koxudaxi - name: bolt-python html_url: https://github.com/slackapi/bolt-python - stars: 1130 + stars: 1190 owner_login: slackapi owner_html_url: https://github.com/slackapi +- name: fastcrud + html_url: https://github.com/benavlabs/fastcrud + stars: 1169 + owner_login: benavlabs + owner_html_url: https://github.com/benavlabs +- name: prometheus-fastapi-instrumentator + html_url: https://github.com/trallnag/prometheus-fastapi-instrumentator + stars: 1167 + owner_login: trallnag + owner_html_url: https://github.com/trallnag +- name: fastapi_production_template + html_url: https://github.com/zhanymkanov/fastapi_production_template + stars: 1165 + owner_login: zhanymkanov + owner_html_url: https://github.com/zhanymkanov +- name: bedrock-chat + html_url: https://github.com/aws-samples/bedrock-chat + stars: 1163 + owner_login: aws-samples + owner_html_url: https://github.com/aws-samples - name: langchain-extract html_url: https://github.com/langchain-ai/langchain-extract - stars: 1110 + stars: 1142 owner_login: langchain-ai owner_html_url: https://github.com/langchain-ai - name: odmantic html_url: https://github.com/art049/odmantic - stars: 1104 + stars: 1121 owner_login: art049 owner_html_url: https://github.com/art049 -- name: fastapi_production_template - html_url: https://github.com/zhanymkanov/fastapi_production_template - stars: 1093 - owner_login: zhanymkanov - owner_html_url: https://github.com/zhanymkanov -- name: SurfSense - html_url: https://github.com/MODSetter/SurfSense - stars: 1081 - owner_login: MODSetter - owner_html_url: https://github.com/MODSetter +- name: fastapi_best_architecture + html_url: https://github.com/fastapi-practices/fastapi_best_architecture + stars: 1118 + owner_login: fastapi-practices + owner_html_url: https://github.com/fastapi-practices - name: fastapi-alembic-sqlmodel-async html_url: https://github.com/jonra1993/fastapi-alembic-sqlmodel-async - stars: 1063 + stars: 1116 owner_login: jonra1993 owner_html_url: https://github.com/jonra1993 -- name: prometheus-fastapi-instrumentator - html_url: https://github.com/trallnag/prometheus-fastapi-instrumentator - stars: 1059 - owner_login: trallnag - owner_html_url: https://github.com/trallnag -- name: bedrock-claude-chat - html_url: https://github.com/aws-samples/bedrock-claude-chat - stars: 1039 - owner_login: aws-samples - owner_html_url: https://github.com/aws-samples +- name: FastAPI-boilerplate + html_url: https://github.com/benavlabs/FastAPI-boilerplate + stars: 1070 + owner_login: benavlabs + owner_html_url: https://github.com/benavlabs +- name: restish + html_url: https://github.com/rest-sh/restish + stars: 1069 + owner_login: rest-sh + owner_html_url: https://github.com/rest-sh - name: runhouse html_url: https://github.com/run-house/runhouse - stars: 1005 + stars: 1037 owner_login: run-house owner_html_url: https://github.com/run-house -- name: vue-fastapi-admin - html_url: https://github.com/mizhexiaoxiao/vue-fastapi-admin - stars: 987 - owner_login: mizhexiaoxiao - owner_html_url: https://github.com/mizhexiaoxiao -- name: lanarky - html_url: https://github.com/ajndkr/lanarky - stars: 986 - owner_login: ajndkr - owner_html_url: https://github.com/ajndkr - name: autollm html_url: https://github.com/viddexa/autollm - stars: 986 + stars: 994 owner_login: viddexa owner_html_url: https://github.com/viddexa -- name: restish - html_url: https://github.com/danielgtaylor/restish - stars: 984 - owner_login: danielgtaylor - owner_html_url: https://github.com/danielgtaylor -- name: fastcrud - html_url: https://github.com/igorbenav/fastcrud - stars: 964 - owner_login: igorbenav - owner_html_url: https://github.com/igorbenav +- name: lanarky + html_url: https://github.com/ajndkr/lanarky + stars: 992 + owner_login: ajndkr + owner_html_url: https://github.com/ajndkr +- name: authx + html_url: https://github.com/yezz123/authx + stars: 953 + owner_login: yezz123 + owner_html_url: https://github.com/yezz123 - name: secure html_url: https://github.com/TypeError/secure - stars: 928 + stars: 941 owner_login: TypeError owner_html_url: https://github.com/TypeError -- name: langcorn - html_url: https://github.com/msoedov/langcorn - stars: 916 - owner_login: msoedov - owner_html_url: https://github.com/msoedov - name: energy-forecasting html_url: https://github.com/iusztinpaul/energy-forecasting - stars: 898 + stars: 928 owner_login: iusztinpaul owner_html_url: https://github.com/iusztinpaul -- name: authx - html_url: https://github.com/yezz123/authx - stars: 874 - owner_login: yezz123 - owner_html_url: https://github.com/yezz123 +- name: langcorn + html_url: https://github.com/msoedov/langcorn + stars: 927 + owner_login: msoedov + owner_html_url: https://github.com/msoedov - name: titiler html_url: https://github.com/developmentseed/titiler - stars: 841 + stars: 901 owner_login: developmentseed owner_html_url: https://github.com/developmentseed -- name: FastAPI-boilerplate - html_url: https://github.com/igorbenav/FastAPI-boilerplate - stars: 820 - owner_login: igorbenav - owner_html_url: https://github.com/igorbenav +- name: flock + html_url: https://github.com/Onelevenvy/flock + stars: 896 + owner_login: Onelevenvy + owner_html_url: https://github.com/Onelevenvy +- name: fastapi-langgraph-agent-production-ready-template + html_url: https://github.com/wassim249/fastapi-langgraph-agent-production-ready-template + stars: 896 + owner_login: wassim249 + owner_html_url: https://github.com/wassim249 - name: marker-api html_url: https://github.com/adithya-s-k/marker-api - stars: 813 + stars: 875 owner_login: adithya-s-k owner_html_url: https://github.com/adithya-s-k -- name: fastapi_best_architecture - html_url: https://github.com/fastapi-practices/fastapi_best_architecture - stars: 802 - owner_login: fastapi-practices - owner_html_url: https://github.com/fastapi-practices +- name: httpdbg + html_url: https://github.com/cle-b/httpdbg + stars: 870 + owner_login: cle-b + owner_html_url: https://github.com/cle-b - name: fastapi-do-zero html_url: https://github.com/dunossauro/fastapi-do-zero - stars: 745 + stars: 855 owner_login: dunossauro owner_html_url: https://github.com/dunossauro -- name: fastapi-mail - html_url: https://github.com/sabuhish/fastapi-mail - stars: 744 - owner_login: sabuhish - owner_html_url: https://github.com/sabuhish +- name: ludic + html_url: https://github.com/getludic/ludic + stars: 849 + owner_login: getludic + owner_html_url: https://github.com/getludic - name: fastapi-observability html_url: https://github.com/blueswen/fastapi-observability - stars: 743 + stars: 837 owner_login: blueswen owner_html_url: https://github.com/blueswen -- name: lccn_predictor - html_url: https://github.com/baoliay2008/lccn_predictor - stars: 741 - owner_login: baoliay2008 - owner_html_url: https://github.com/baoliay2008 -- name: annotated-py-projects - html_url: https://github.com/hhstore/annotated-py-projects - stars: 727 - owner_login: hhstore - owner_html_url: https://github.com/hhstore -- name: learn-generative-ai - html_url: https://github.com/panaverse/learn-generative-ai - stars: 714 - owner_login: panaverse - owner_html_url: https://github.com/panaverse +- name: fastapi-scaf + html_url: https://github.com/atpuxiner/fastapi-scaf + stars: 821 + owner_login: atpuxiner + owner_html_url: https://github.com/atpuxiner - name: starlette-admin html_url: https://github.com/jowilf/starlette-admin - stars: 713 + stars: 808 owner_login: jowilf owner_html_url: https://github.com/jowilf -- name: chatGPT-web - html_url: https://github.com/mic1on/chatGPT-web - stars: 712 - owner_login: mic1on - owner_html_url: https://github.com/mic1on -- name: FastAPI-Backend-Template - html_url: https://github.com/Aeternalis-Ingenium/FastAPI-Backend-Template - stars: 709 - owner_login: Aeternalis-Ingenium - owner_html_url: https://github.com/Aeternalis-Ingenium -- name: linbing - html_url: https://github.com/taomujian/linbing - stars: 698 - owner_login: taomujian - owner_html_url: https://github.com/taomujian -- name: KonomiTV - html_url: https://github.com/tsukumijima/KonomiTV - stars: 687 - owner_login: tsukumijima - owner_html_url: https://github.com/tsukumijima -- name: fastapi-jwt-auth - html_url: https://github.com/IndominusByte/fastapi-jwt-auth - stars: 685 - owner_login: IndominusByte - owner_html_url: https://github.com/IndominusByte -- name: pity - html_url: https://github.com/wuranxu/pity - stars: 667 - owner_login: wuranxu - owner_html_url: https://github.com/wuranxu +- name: fastapi-mail + html_url: https://github.com/sabuhish/fastapi-mail + stars: 807 + owner_login: sabuhish + owner_html_url: https://github.com/sabuhish +- name: aktools + html_url: https://github.com/akfamily/aktools + stars: 796 + owner_login: akfamily + owner_html_url: https://github.com/akfamily +- name: RuoYi-Vue3-FastAPI + html_url: https://github.com/insistence/RuoYi-Vue3-FastAPI + stars: 782 + owner_login: insistence + owner_html_url: https://github.com/insistence diff --git a/docs/en/data/translation_reviewers.yml b/docs/en/data/translation_reviewers.yml index 1a3c12988..4f3c95b27 100644 --- a/docs/en/data/translation_reviewers.yml +++ b/docs/en/data/translation_reviewers.yml @@ -8,16 +8,16 @@ Xewus: count: 140 avatarUrl: https://avatars.githubusercontent.com/u/85196001?u=f8e2dc7e5104f109cef944af79050ea8d1b8f914&v=4 url: https://github.com/Xewus +sodaMelon: + login: sodaMelon + count: 126 + avatarUrl: https://avatars.githubusercontent.com/u/66295123?u=be939db90f1119efee9e6110cc05066ff1f40f00&v=4 + url: https://github.com/sodaMelon ceb10n: login: ceb10n count: 112 avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4 url: https://github.com/ceb10n -sodaMelon: - login: sodaMelon - count: 111 - avatarUrl: https://avatars.githubusercontent.com/u/66295123?u=be939db90f1119efee9e6110cc05066ff1f40f00&v=4 - url: https://github.com/sodaMelon tokusumi: login: tokusumi count: 104 @@ -30,9 +30,14 @@ hasansezertasan: url: https://github.com/hasansezertasan hard-coders: login: hard-coders - count: 92 + count: 93 avatarUrl: https://avatars.githubusercontent.com/u/9651103?u=95db33927bbff1ed1c07efddeb97ac2ff33068ed&v=4 url: https://github.com/hard-coders +alv2017: + login: alv2017 + count: 88 + avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 + url: https://github.com/alv2017 nazarepiedady: login: nazarepiedady count: 83 @@ -43,11 +48,6 @@ AlertRED: count: 81 avatarUrl: https://avatars.githubusercontent.com/u/15695000?u=f5a4944c6df443030409c88da7d7fa0b7ead985c&v=4 url: https://github.com/AlertRED -alv2017: - login: alv2017 - count: 81 - avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 - url: https://github.com/alv2017 Alexandrhub: login: Alexandrhub count: 68 @@ -65,12 +65,12 @@ cassiobotaro: url: https://github.com/cassiobotaro mattwang44: login: mattwang44 - count: 58 + count: 59 avatarUrl: https://avatars.githubusercontent.com/u/24987826?u=58e37fb3927b9124b458945ac4c97aa0f1062d85&v=4 url: https://github.com/mattwang44 tiangolo: login: tiangolo - count: 51 + count: 53 avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 url: https://github.com/tiangolo Laineyzhang55: @@ -88,16 +88,26 @@ komtaki: count: 45 avatarUrl: https://avatars.githubusercontent.com/u/39375566?u=260ad6b1a4b34c07dbfa728da5e586f16f6d1824&v=4 url: https://github.com/komtaki +rostik1410: + login: rostik1410 + count: 42 + avatarUrl: https://avatars.githubusercontent.com/u/11443899?u=e26a635c2ba220467b308a326a579b8ccf4a8701&v=4 + url: https://github.com/rostik1410 +svlandeg: + login: svlandeg + count: 42 + avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4 + url: https://github.com/svlandeg alperiox: login: alperiox count: 42 avatarUrl: https://avatars.githubusercontent.com/u/34214152?u=2c5acad3461d4dbc2d48371ba86cac56ae9b25cc&v=4 url: https://github.com/alperiox -rostik1410: - login: rostik1410 - count: 41 - avatarUrl: https://avatars.githubusercontent.com/u/11443899?u=e26a635c2ba220467b308a326a579b8ccf4a8701&v=4 - url: https://github.com/rostik1410 +Rishat-F: + login: Rishat-F + count: 42 + avatarUrl: https://avatars.githubusercontent.com/u/66554797?v=4 + url: https://github.com/Rishat-F Winand: login: Winand count: 40 @@ -126,7 +136,7 @@ SwftAlpc: alejsdev: login: alejsdev count: 36 - avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=356f39ff3f0211c720b06d3dbb060e98884085e3&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=638c65283ac9e9e2c3a0f9d1e3370db4b8a2c58d&v=4 url: https://github.com/alejsdev timothy-jeong: login: timothy-jeong @@ -138,16 +148,11 @@ nilslindemann: count: 35 avatarUrl: https://avatars.githubusercontent.com/u/6892179?u=1dca6a22195d6cd1ab20737c0e19a4c55d639472&v=4 url: https://github.com/nilslindemann -svlandeg: - login: svlandeg - count: 35 - avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4 - url: https://github.com/svlandeg -Rishat-F: - login: Rishat-F +mezgoodle: + login: mezgoodle count: 35 - avatarUrl: https://avatars.githubusercontent.com/u/66554797?v=4 - url: https://github.com/Rishat-F + avatarUrl: https://avatars.githubusercontent.com/u/41520940?u=4a9c765af688389d54296845d18b8f6cd6ddf09a&v=4 + url: https://github.com/mezgoodle rjNemo: login: rjNemo count: 34 @@ -168,16 +173,16 @@ romashevchenko: count: 32 avatarUrl: https://avatars.githubusercontent.com/u/132477732?v=4 url: https://github.com/romashevchenko -wdh99: - login: wdh99 - count: 31 - avatarUrl: https://avatars.githubusercontent.com/u/108172295?u=8a8fb95d5afe3e0fa33257b2aecae88d436249eb&v=4 - url: https://github.com/wdh99 LorhanSohaky: login: LorhanSohaky count: 30 avatarUrl: https://avatars.githubusercontent.com/u/16273730?u=095b66f243a2cd6a0aadba9a095009f8aaf18393&v=4 url: https://github.com/LorhanSohaky +Vincy1230: + login: Vincy1230 + count: 30 + avatarUrl: https://avatars.githubusercontent.com/u/81342412?u=ab5e256a4077a4a91f3f9cd2115ba80780454cbe&v=4 + url: https://github.com/Vincy1230 black-redoc: login: black-redoc count: 29 @@ -201,7 +206,7 @@ dedkot01: hsuanchi: login: hsuanchi count: 28 - avatarUrl: https://avatars.githubusercontent.com/u/24913710?u=0b094ae292292fee093818e37ceb645c114d2bff&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/24913710?u=7d25a398e478b6e63503bf6f26c54efa9e0da07b&v=4 url: https://github.com/hsuanchi dpinezich: login: dpinezich @@ -228,16 +233,6 @@ junah201: count: 26 avatarUrl: https://avatars.githubusercontent.com/u/75025529?u=2451c256e888fa2a06bcfc0646d09b87ddb6a945&v=4 url: https://github.com/junah201 -mezgoodle: - login: mezgoodle - count: 26 - avatarUrl: https://avatars.githubusercontent.com/u/41520940?u=e871bc26734eb2436d98c19c3fb57a4773e13c24&v=4 - url: https://github.com/mezgoodle -Vincy1230: - login: Vincy1230 - count: 26 - avatarUrl: https://avatars.githubusercontent.com/u/81342412?u=ab5e256a4077a4a91f3f9cd2115ba80780454cbe&v=4 - url: https://github.com/Vincy1230 zy7y: login: zy7y count: 25 @@ -248,11 +243,21 @@ mycaule: count: 25 avatarUrl: https://avatars.githubusercontent.com/u/6161385?u=e3cec75bd6d938a0d73fae0dc5534d1ab2ed1b0e&v=4 url: https://github.com/mycaule +YuriiMotov: + login: YuriiMotov + count: 24 + avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 + url: https://github.com/YuriiMotov Aruelius: login: Aruelius count: 24 avatarUrl: https://avatars.githubusercontent.com/u/25380989?u=574f8cfcda3ea77a3f81884f6b26a97068e36a9d&v=4 url: https://github.com/Aruelius +wisderfin: + login: wisderfin + count: 24 + avatarUrl: https://avatars.githubusercontent.com/u/77553770?u=9a23740d520d65dc0051cdc1ecd87f31cb900313&v=4 + url: https://github.com/wisderfin OzgunCaglarArslan: login: OzgunCaglarArslan count: 24 @@ -268,11 +273,11 @@ axel584: count: 23 avatarUrl: https://avatars.githubusercontent.com/u/1334088?u=9667041f5b15dc002b6f9665fda8c0412933ac04&v=4 url: https://github.com/axel584 -wisderfin: - login: wisderfin +DianaTrufanova: + login: DianaTrufanova count: 23 - avatarUrl: https://avatars.githubusercontent.com/u/77553770?u=f3b00a26736ba664e9927a1116c6e8088295e073&v=4 - url: https://github.com/wisderfin + avatarUrl: https://avatars.githubusercontent.com/u/119067607?u=1cd55f841b68b4a187fa6d06a7dafa5f070195aa&v=4 + url: https://github.com/DianaTrufanova AGolicyn: login: AGolicyn count: 21 @@ -328,6 +333,16 @@ ivan-abc: count: 18 avatarUrl: https://avatars.githubusercontent.com/u/36765187?u=c6e0ba571c1ccb6db9d94e62e4b8b5eda811a870&v=4 url: https://github.com/ivan-abc +Limsunoh: + login: Limsunoh + count: 18 + avatarUrl: https://avatars.githubusercontent.com/u/90311848?u=f456e0c5709fd50c8cd2898b551558eda14e5f21&v=4 + url: https://github.com/Limsunoh +SofiiaTrufanova: + login: SofiiaTrufanova + count: 18 + avatarUrl: https://avatars.githubusercontent.com/u/63260929?u=483e0b64fabc76343b3be39b7e1dcb930a95e1bb&v=4 + url: https://github.com/SofiiaTrufanova bezaca: login: bezaca count: 17 @@ -353,11 +368,6 @@ jeison-araya: count: 17 avatarUrl: https://avatars.githubusercontent.com/u/57369279?u=17001e68af7d8e5b8c343e5e9df4050f419998d5&v=4 url: https://github.com/jeison-araya -Limsunoh: - login: Limsunoh - count: 17 - avatarUrl: https://avatars.githubusercontent.com/u/90311848?u=f456e0c5709fd50c8cd2898b551558eda14e5f21&v=4 - url: https://github.com/Limsunoh yanever: login: yanever count: 16 @@ -376,7 +386,7 @@ Joao-Pedro-P-Holanda: JaeHyuckSa: login: JaeHyuckSa count: 16 - avatarUrl: https://avatars.githubusercontent.com/u/104830931?v=4 + avatarUrl: https://avatars.githubusercontent.com/u/104830931?u=6e352201714a05154e5d0ccf91b4715a951c622e&v=4 url: https://github.com/JaeHyuckSa Jedore: login: Jedore @@ -398,11 +408,6 @@ dukkee: count: 14 avatarUrl: https://avatars.githubusercontent.com/u/36825394?u=ccfd86e6a4f2d093dad6f7544cc875af67fa2df8&v=4 url: https://github.com/dukkee -mkdir700: - login: mkdir700 - count: 14 - avatarUrl: https://avatars.githubusercontent.com/u/56359329?u=3d6ea8714f5000829b60dcf7b13a75b1e73aaf47&v=4 - url: https://github.com/mkdir700 BORA040126: login: BORA040126 count: 14 @@ -411,7 +416,7 @@ BORA040126: mattkoehne: login: mattkoehne count: 14 - avatarUrl: https://avatars.githubusercontent.com/u/80362153?u=6e1439582715693407b86182eb66263bb578a761&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/80362153?v=4 url: https://github.com/mattkoehne jovicon: login: jovicon @@ -453,16 +458,16 @@ oandersonmagalhaes: count: 12 avatarUrl: https://avatars.githubusercontent.com/u/83456692?v=4 url: https://github.com/oandersonmagalhaes +mkdir700: + login: mkdir700 + count: 12 + avatarUrl: https://avatars.githubusercontent.com/u/56359329?u=3d6ea8714f5000829b60dcf7b13a75b1e73aaf47&v=4 + url: https://github.com/mkdir700 batlopes: login: batlopes count: 12 avatarUrl: https://avatars.githubusercontent.com/u/33462923?u=0fb3d7acb316764616f11e4947faf080e49ad8d9&v=4 url: https://github.com/batlopes -Lenclove: - login: Lenclove - count: 12 - avatarUrl: https://avatars.githubusercontent.com/u/32355298?u=d0065e01650c63c2b2413f42d983634b2ea85481&v=4 - url: https://github.com/Lenclove joonas-yoon: login: joonas-yoon count: 12 @@ -483,6 +488,11 @@ andersonrocha0: count: 12 avatarUrl: https://avatars.githubusercontent.com/u/22346169?u=93a1359c8c5461d894802c0cc65bcd09217e7a02&v=4 url: https://github.com/andersonrocha0 +gitgernit: + login: gitgernit + count: 12 + avatarUrl: https://avatars.githubusercontent.com/u/129539613?u=d04f10143ab32c93f563ea14bf242d1d2bc991b0&v=4 + url: https://github.com/gitgernit kwang1215: login: kwang1215 count: 12 @@ -528,16 +538,16 @@ Lufa1u: count: 11 avatarUrl: https://avatars.githubusercontent.com/u/112495876?u=087658920ed9e74311597bdd921d8d2de939d276&v=4 url: https://github.com/Lufa1u +waketzheng: + login: waketzheng + count: 11 + avatarUrl: https://avatars.githubusercontent.com/u/35413830?u=df19e4fd5bb928e7d086e053ef26a46aad23bf84&v=4 + url: https://github.com/waketzheng KNChiu: login: KNChiu count: 11 avatarUrl: https://avatars.githubusercontent.com/u/36751646?v=4 url: https://github.com/KNChiu -gitgernit: - login: gitgernit - count: 11 - avatarUrl: https://avatars.githubusercontent.com/u/129539613?u=d04f10143ab32c93f563ea14bf242d1d2bc991b0&v=4 - url: https://github.com/gitgernit mariacamilagl: login: mariacamilagl count: 10 @@ -593,16 +603,21 @@ nick-cjyx9: count: 10 avatarUrl: https://avatars.githubusercontent.com/u/119087246?u=c35aab03f082430be8a1edd80f5625b44819a0d8&v=4 url: https://github.com/nick-cjyx9 -waketzheng: - login: waketzheng - count: 10 - avatarUrl: https://avatars.githubusercontent.com/u/35413830?u=df19e4fd5bb928e7d086e053ef26a46aad23bf84&v=4 - url: https://github.com/waketzheng lucasbalieiro: login: lucasbalieiro count: 10 avatarUrl: https://avatars.githubusercontent.com/u/37416577?u=eabaf4aebbaa88a94a4886273edba689012cee70&v=4 url: https://github.com/lucasbalieiro +maru0123-2004: + login: maru0123-2004 + count: 10 + avatarUrl: https://avatars.githubusercontent.com/u/43961566?u=16ed8603a4d6a4665cb6c53a7aece6f31379b769&v=4 + url: https://github.com/maru0123-2004 +Zhongheng-Cheng: + login: Zhongheng-Cheng + count: 10 + avatarUrl: https://avatars.githubusercontent.com/u/95612344?u=a0f7730a3cc7486827965e01a119ad610bda4b0a&v=4 + url: https://github.com/Zhongheng-Cheng RunningIkkyu: login: RunningIkkyu count: 9 @@ -616,18 +631,18 @@ JulianMaurin: JeongHyeongKim: login: JeongHyeongKim count: 9 - avatarUrl: https://avatars.githubusercontent.com/u/26577800?u=fe653349051c0acf62cd984e74c4ff60ca8d2cb6&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/26577800?u=77f060f4686f32c248907b81b16ee2b3177ca44c&v=4 url: https://github.com/JeongHyeongKim arthurio: login: arthurio count: 9 avatarUrl: https://avatars.githubusercontent.com/u/950449?u=76b997138273ce5e1990b971c4f27c9aff979fd5&v=4 url: https://github.com/arthurio -mahone3297: - login: mahone3297 +Lenclove: + login: Lenclove count: 9 - avatarUrl: https://avatars.githubusercontent.com/u/1701379?u=20588ff0e456d13e8017333eb237595d11410234&v=4 - url: https://github.com/mahone3297 + avatarUrl: https://avatars.githubusercontent.com/u/32355298?u=d0065e01650c63c2b2413f42d983634b2ea85481&v=4 + url: https://github.com/Lenclove eVery1337: login: eVery1337 count: 9 @@ -643,6 +658,11 @@ riroan: count: 9 avatarUrl: https://avatars.githubusercontent.com/u/33053284?u=2d18e3771506ee874b66d6aa2b3b1107fd95c38f&v=4 url: https://github.com/riroan +MinLee0210: + login: MinLee0210 + count: 9 + avatarUrl: https://avatars.githubusercontent.com/u/57653278?u=8ca05a7efbc76048183da00da87d148b755a3ba8&v=4 + url: https://github.com/MinLee0210 yodai-yodai: login: yodai-yodai count: 9 @@ -658,11 +678,6 @@ JoaoGustavoRogel: count: 9 avatarUrl: https://avatars.githubusercontent.com/u/29525510?u=a0a91251f5e43e132608d55d28ccb8645c5ea405&v=4 url: https://github.com/JoaoGustavoRogel -Zhongheng-Cheng: - login: Zhongheng-Cheng - count: 9 - avatarUrl: https://avatars.githubusercontent.com/u/95612344?u=a0f7730a3cc7486827965e01a119ad610bda4b0a&v=4 - url: https://github.com/Zhongheng-Cheng Yarous: login: Yarous count: 9 @@ -683,11 +698,6 @@ bnzone: count: 8 avatarUrl: https://avatars.githubusercontent.com/u/39371503?u=c16f00c41d88479fa2d57b0d7d233b758eacce2d&v=4 url: https://github.com/bnzone -ChuyuChoyeon: - login: ChuyuChoyeon - count: 8 - avatarUrl: https://avatars.githubusercontent.com/u/129537877?u=f0c76f3327817a8b86b422d62e04a34bf2827f2b&v=4 - url: https://github.com/ChuyuChoyeon shamosishen: login: shamosishen count: 8 @@ -698,26 +708,31 @@ mertssmnoglu: count: 8 avatarUrl: https://avatars.githubusercontent.com/u/61623638?u=59dd885b68ff1832f9ab3b4a4446896358c23442&v=4 url: https://github.com/mertssmnoglu +mahone3297: + login: mahone3297 + count: 8 + avatarUrl: https://avatars.githubusercontent.com/u/1701379?u=20588ff0e456d13e8017333eb237595d11410234&v=4 + url: https://github.com/mahone3297 KimJoonSeo: login: KimJoonSeo count: 8 avatarUrl: https://avatars.githubusercontent.com/u/17760162?u=a58cdc77ae1c069a64166f7ecc4d42eecfd9a468&v=4 url: https://github.com/KimJoonSeo -MinLee0210: - login: MinLee0210 - count: 8 - avatarUrl: https://avatars.githubusercontent.com/u/57653278?u=7def7c0654ad82f43b46d6dfc3b51c4d2be15011&v=4 - url: https://github.com/MinLee0210 camigomezdev: login: camigomezdev count: 8 avatarUrl: https://avatars.githubusercontent.com/u/16061815?u=25b5ebc042fff53fa03dc107ded10e36b1b7a5b9&v=4 url: https://github.com/camigomezdev -maru0123-2004: - login: maru0123-2004 +minaton-ru: + login: minaton-ru count: 8 - avatarUrl: https://avatars.githubusercontent.com/u/43961566?u=16ed8603a4d6a4665cb6c53a7aece6f31379b769&v=4 - url: https://github.com/maru0123-2004 + avatarUrl: https://avatars.githubusercontent.com/u/53541518?u=67336ca11a85493f75031508aade588dad3b9910&v=4 + url: https://github.com/minaton-ru +sungchan1: + login: sungchan1 + count: 8 + avatarUrl: https://avatars.githubusercontent.com/u/28076127?u=a816d86ef3e60450a7225f128caf9a394c9320f9&v=4 + url: https://github.com/sungchan1 Serrones: login: Serrones count: 7 @@ -738,6 +753,11 @@ anthonycepeda: count: 7 avatarUrl: https://avatars.githubusercontent.com/u/72019805?u=60bdf46240cff8fca482ff0fc07d963fd5e1a27c&v=4 url: https://github.com/anthonycepeda +Muaytie666: + login: Muaytie666 + count: 7 + avatarUrl: https://avatars.githubusercontent.com/u/198508825?v=4 + url: https://github.com/Muaytie666 fabioueno: login: fabioueno count: 7 @@ -763,10 +783,20 @@ d2a-raudenaerde: count: 7 avatarUrl: https://avatars.githubusercontent.com/u/5213150?v=4 url: https://github.com/d2a-raudenaerde +valentinDruzhinin: + login: valentinDruzhinin + count: 7 + avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4 + url: https://github.com/valentinDruzhinin +Zerohertz: + login: Zerohertz + count: 7 + avatarUrl: https://avatars.githubusercontent.com/u/42334717?u=5ebf4d33e73b1ad373154f6cdee44f7cab4d05ba&v=4 + url: https://github.com/Zerohertz deniscapeto: login: deniscapeto count: 6 - avatarUrl: https://avatars.githubusercontent.com/u/12864353?u=dbc20c5c1171feab5df4db46488b675d53cb5b07&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/12864353?u=20c5b2300b264a585a8381acf3cef44bcfcc1ead&v=4 url: https://github.com/deniscapeto bsab: login: bsab @@ -838,11 +868,6 @@ Kirilex: count: 6 avatarUrl: https://avatars.githubusercontent.com/u/100281552?v=4 url: https://github.com/Kirilex -Mordson: - login: Mordson - count: 6 - avatarUrl: https://avatars.githubusercontent.com/u/39025897?u=b94ea96ef35bbe43bc85359cfb31d28ac16d470c&v=4 - url: https://github.com/Mordson arunppsg: login: arunppsg count: 6 @@ -853,11 +878,6 @@ dimastbk: count: 6 avatarUrl: https://avatars.githubusercontent.com/u/3132181?u=66587398d43466a1dc75c238df5f048e0afc77ed&v=4 url: https://github.com/dimastbk -lordqyxz: - login: lordqyxz - count: 6 - avatarUrl: https://avatars.githubusercontent.com/u/31722468?u=974553c0ba53526d9be7e9876544283291be3b0d&v=4 - url: https://github.com/lordqyxz dudyaosuplayer: login: dudyaosuplayer count: 6 @@ -873,16 +893,11 @@ bankofsardine: count: 6 avatarUrl: https://avatars.githubusercontent.com/u/44944207?u=0368e1b698ffab6bf29e202f9fd2dddd352429f1&v=4 url: https://github.com/bankofsardine -SofiiaTrufanova: - login: SofiiaTrufanova +Rekl0w: + login: Rekl0w count: 6 - avatarUrl: https://avatars.githubusercontent.com/u/63260929?v=4 - url: https://github.com/SofiiaTrufanova -DianaTrufanova: - login: DianaTrufanova - count: 6 - avatarUrl: https://avatars.githubusercontent.com/u/119067607?v=4 - url: https://github.com/DianaTrufanova + avatarUrl: https://avatars.githubusercontent.com/u/91488737?u=3b62b04a3e6699eab9b1eea4e88c09a39b753a17&v=4 + url: https://github.com/Rekl0w rsip22: login: rsip22 count: 5 @@ -911,7 +926,7 @@ TemaSpb: BugLight: login: BugLight count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/13618366?u=57572e544e40c2a491db5bf7255bd24886d2cb09&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/13618366?u=7d733749f80e5f7e66a434cf42aedcfc60340f43&v=4 url: https://github.com/BugLight 0x4Dark: login: 0x4Dark @@ -926,13 +941,18 @@ Wuerike: jvmazagao: login: jvmazagao count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/22477816?u=f3b2d503b53e6ec8c808f0601b756a063a07f06e&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/22477816?u=2b57addf5830906bf6ae5f25cd4c8c2fa5c2d68e&v=4 url: https://github.com/jvmazagao cun3yt: login: cun3yt count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/24409240?u=39f651cdcc4991fb9fef5bbd9e9503db2174ac13&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/24409240?u=06abfd77786db859b0602d5369d2ae18c932c17c&v=4 url: https://github.com/cun3yt +Mordson: + login: Mordson + count: 5 + avatarUrl: https://avatars.githubusercontent.com/u/39025897?u=b94ea96ef35bbe43bc85359cfb31d28ac16d470c&v=4 + url: https://github.com/Mordson aminkhani: login: aminkhani count: 5 @@ -953,10 +973,15 @@ Chushine: count: 5 avatarUrl: https://avatars.githubusercontent.com/u/135534400?v=4 url: https://github.com/Chushine +ChuyuChoyeon: + login: ChuyuChoyeon + count: 5 + avatarUrl: https://avatars.githubusercontent.com/u/129537877?u=f0c76f3327817a8b86b422d62e04a34bf2827f2b&v=4 + url: https://github.com/ChuyuChoyeon frwl404: login: frwl404 count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/42642656?u=572a5a33762e07eaa6ebd58d9d773abdb1de41c3&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/42642656?u=8395a3d991d9fac86901277d76f0f70857b56ec5&v=4 url: https://github.com/frwl404 esrefzeki: login: esrefzeki @@ -1033,6 +1058,11 @@ FelipeSilva93: count: 4 avatarUrl: https://avatars.githubusercontent.com/u/66804965?u=e7cb4b580e46f2e04ecb4cd4d7a12acdddd3c6c1&v=4 url: https://github.com/FelipeSilva93 +peacekimjapan: + login: peacekimjapan + count: 4 + avatarUrl: https://avatars.githubusercontent.com/u/33534175?u=e4219bcebc3773a7068cc34c3eb268ef77cec31b&v=4 + url: https://github.com/peacekimjapan bas-baskara: login: bas-baskara count: 4 @@ -1061,13 +1091,18 @@ aminalaee: erfan-rfmhr: login: erfan-rfmhr count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/98986056?u=6c4f9218fe5bb04780dd92bfced360c55e2009f0&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/98986056?u=0acda1ff1df0989f3f3eb79977baa35da4cb6c8c&v=4 url: https://github.com/erfan-rfmhr Scorpionchiques: login: Scorpionchiques count: 4 avatarUrl: https://avatars.githubusercontent.com/u/15703294?v=4 url: https://github.com/Scorpionchiques +lordqyxz: + login: lordqyxz + count: 4 + avatarUrl: https://avatars.githubusercontent.com/u/31722468?u=974553c0ba53526d9be7e9876544283291be3b0d&v=4 + url: https://github.com/lordqyxz heysaeid: login: heysaeid count: 4 @@ -1123,11 +1158,11 @@ gerry-sabar: count: 4 avatarUrl: https://avatars.githubusercontent.com/u/1120123?v=4 url: https://github.com/gerry-sabar -valentinDruzhinin: - login: valentinDruzhinin +cookie-byte217: + login: cookie-byte217 count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4 - url: https://github.com/valentinDruzhinin + avatarUrl: https://avatars.githubusercontent.com/u/57880178?v=4 + url: https://github.com/cookie-byte217 tyronedamasceno: login: tyronedamasceno count: 3 @@ -1206,7 +1241,7 @@ RuslanTer: FedorGN: login: FedorGN count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/66411909?u=1c6734e92f50c7d66f130ef7d394e72b53770fe6&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/66411909?u=22382380e7d66ee57ffbfc2ae6bd5efd0cdb672e&v=4 url: https://github.com/FedorGN rafsaf: login: rafsaf @@ -1308,6 +1343,11 @@ Sion99: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/82511301?v=4 url: https://github.com/Sion99 +nymous: + login: nymous + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/4216559?u=360a36fb602cded27273cbfc0afc296eece90662&v=4 + url: https://github.com/nymous EpsilonRationes: login: EpsilonRationes count: 3 @@ -1328,6 +1368,11 @@ kohiry: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/57669492?u=f6ab0a062740261e882879269a41a47788c84043&v=4 url: https://github.com/kohiry +ptt3199: + login: ptt3199 + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/51350651?u=2c3d947a80283e32bf616d4c3af139a6be69680f&v=4 + url: https://github.com/ptt3199 arynoot: login: arynoot count: 3 @@ -1341,7 +1386,7 @@ GDemay: maxscheijen: login: maxscheijen count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/47034840?u=eb98f37882528ea349ca4e5255fa64ac3fef0294&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/47034840?v=4 url: https://github.com/maxscheijen celestywang: login: celestywang @@ -1353,16 +1398,21 @@ RyaWcksn: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/42831964?u=0cb4265faf3e3425a89e59b6fddd3eb2de180af0&v=4 url: https://github.com/RyaWcksn -Zerohertz: - login: Zerohertz - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/42334717?u=c6acda352c866b1747921e0ff8782b58571d849e&v=4 - url: https://github.com/Zerohertz tienduong-21: login: tienduong-21 count: 3 avatarUrl: https://avatars.githubusercontent.com/u/80129618?v=4 url: https://github.com/tienduong-21 +soroushgh1: + login: soroushgh1 + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/178516095?u=5e26f6a5f66cdb32d7b56e6ab362bf18ba7858b9&v=4 + url: https://github.com/soroushgh1 +zbellos: + login: zbellos + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/204500646?v=4 + url: https://github.com/zbellos blaisep: login: blaisep count: 2 @@ -1436,7 +1486,7 @@ TimorChow: ataberkciftlikli: login: ataberkciftlikli count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/64265169?v=4 + avatarUrl: https://avatars.githubusercontent.com/u/64265169?u=ca7c1348242559f70bc1dc027a4be277c464676f&v=4 url: https://github.com/ataberkciftlikli leandrodesouzadev: login: leandrodesouzadev @@ -1468,26 +1518,21 @@ lindsayzhou: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/26602940?u=3c52ce6393bb547c97e6380ccdee03e0c64152c6&v=4 url: https://github.com/0xflotus -peacekimjapan: - login: peacekimjapan - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/33534175?u=e4219bcebc3773a7068cc34c3eb268ef77cec31b&v=4 - url: https://github.com/peacekimjapan jonatasoli: login: jonatasoli count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/26334101?u=071c062d2861d3dd127f6b4a5258cd8ef55d4c50&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/26334101?u=f601c3f111f2148bd9244c2cb3ebbd57b592e674&v=4 url: https://github.com/jonatasoli tyzh-dev: login: tyzh-dev count: 2 avatarUrl: https://avatars.githubusercontent.com/u/51972581?u=ba3882da7c009918a8e2d6b9ead31c89f09c922d&v=4 url: https://github.com/tyzh-dev -WaFeeAL: - login: WaFeeAL +yurkevich-dev: + login: yurkevich-dev count: 2 avatarUrl: https://avatars.githubusercontent.com/u/45145188?u=db2de8c186073d95693279dcf085fcebffab57d0&v=4 - url: https://github.com/WaFeeAL + url: https://github.com/yurkevich-dev emp7yhead: login: emp7yhead count: 2 @@ -1541,7 +1586,7 @@ raphaelauv: Fahad-Md-Kamal: login: Fahad-Md-Kamal count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/34704464?u=84abea85e59c30b2e3bc700ae42424f3fe704332&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/34704464?u=141086368c5557d5a1a533fe291f21f9fc584458&v=4 url: https://github.com/Fahad-Md-Kamal zxcq544: login: zxcq544 @@ -1656,7 +1701,7 @@ zhiquanchi: Jamim: login: Jamim count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/5607572?u=0cf3027bec78ba4f0b89802430c136bc69847d7a&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/5607572?u=9ce0b6a6d1a5124e28b3c04d8d26827ca328713a&v=4 url: https://github.com/Jamim alvinkhalil: login: alvinkhalil @@ -1666,7 +1711,7 @@ alvinkhalil: leylaeminova: login: leylaeminova count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/100516839?u=35a9ce14bb86d7d7faa25d432f61dec2984cb818&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/100516839?u=0b0dab9e31742076b22812b14a39b4e6d8f6de4a&v=4 url: https://github.com/leylaeminova UN-9BOT: login: UN-9BOT @@ -1678,11 +1723,6 @@ flasonme: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/30571019?v=4 url: https://github.com/flasonme -ptt3199: - login: ptt3199 - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/51350651?u=ccf51f8820787e17983954f26b06acf226cba293&v=4 - url: https://github.com/ptt3199 gustavoprezoto: login: gustavoprezoto count: 2 @@ -1706,13 +1746,18 @@ ZhibangYue: saeye: login: saeye count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/62229734?v=4 + avatarUrl: https://avatars.githubusercontent.com/u/62229734?u=312d619db2588b60d5d5bde65260a2f44fdc6c76&v=4 url: https://github.com/saeye Heumhub: login: Heumhub count: 2 avatarUrl: https://avatars.githubusercontent.com/u/173761521?v=4 url: https://github.com/Heumhub +manumolina: + login: manumolina + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/2404208?u=fdc5502910f8dec814b2477f89587b9e45fac846&v=4 + url: https://github.com/manumolina logan2d5: login: logan2d5 count: 2 @@ -1728,8 +1773,48 @@ kiharito: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/38311245?v=4 url: https://github.com/kiharito +t4f1d: + login: t4f1d + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/4054172?u=463d5ce0ec8ad8582f6e9351bb8c9a5105b39bb7&v=4 + url: https://github.com/t4f1d J-Fuji: login: J-Fuji count: 2 avatarUrl: https://avatars.githubusercontent.com/u/101452903?v=4 url: https://github.com/J-Fuji +MrL8199: + login: MrL8199 + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/39489075?u=3fc4f89c86973e40b5970d838c801bdbc13ac828&v=4 + url: https://github.com/MrL8199 +ivintoiu: + login: ivintoiu + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/1853336?u=5e3d0977f44661fb9712fa297cc8f7608ea6ce48&v=4 + url: https://github.com/ivintoiu +EgorOnishchuk: + login: EgorOnishchuk + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/120256301?v=4 + url: https://github.com/EgorOnishchuk +iamantonreznik: + login: iamantonreznik + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/112612414?u=bf6de9a1ab17326fe14de0709719fff3826526d0&v=4 + url: https://github.com/iamantonreznik +Azazul123: + login: Azazul123 + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/102759111?u=b48ce6e30a81a23467cc30e0c011bcc57f0326ab&v=4 + url: https://github.com/Azazul123 +ykertytsky: + login: ykertytsky + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/83857001?u=1172902656ee604cf37f5e36abe938cd34a97a32&v=4 + url: https://github.com/ykertytsky +NavesSapnis: + login: NavesSapnis + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/79222417?u=b5b10291b8e9130ca84fd20f0a641e04ed94b6b1&v=4 + url: https://github.com/NavesSapnis diff --git a/docs/en/data/translators.yml b/docs/en/data/translators.yml index 9874afa56..3cd6120d0 100644 --- a/docs/en/data/translators.yml +++ b/docs/en/data/translators.yml @@ -8,6 +8,11 @@ jaystone776: count: 46 avatarUrl: https://avatars.githubusercontent.com/u/11191137?u=299205a95e9b6817a43144a48b643346a5aac5cc&v=4 url: https://github.com/jaystone776 +valentinDruzhinin: + login: valentinDruzhinin + count: 29 + avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4 + url: https://github.com/valentinDruzhinin ceb10n: login: ceb10n count: 27 @@ -53,16 +58,16 @@ codingjenny: count: 14 avatarUrl: https://avatars.githubusercontent.com/u/103817302?u=3a042740dc0ff58615da0d8679230966fd7693e8&v=4 url: https://github.com/codingjenny -valentinDruzhinin: - login: valentinDruzhinin - count: 14 - avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4 - url: https://github.com/valentinDruzhinin Xewus: login: Xewus count: 13 avatarUrl: https://avatars.githubusercontent.com/u/85196001?u=f8e2dc7e5104f109cef944af79050ea8d1b8f914&v=4 url: https://github.com/Xewus +Zhongheng-Cheng: + login: Zhongheng-Cheng + count: 13 + avatarUrl: https://avatars.githubusercontent.com/u/95612344?u=a0f7730a3cc7486827965e01a119ad610bda4b0a&v=4 + url: https://github.com/Zhongheng-Cheng Smlep: login: Smlep count: 11 @@ -83,11 +88,6 @@ Vincy1230: count: 9 avatarUrl: https://avatars.githubusercontent.com/u/81342412?u=ab5e256a4077a4a91f3f9cd2115ba80780454cbe&v=4 url: https://github.com/Vincy1230 -Zhongheng-Cheng: - login: Zhongheng-Cheng - count: 9 - avatarUrl: https://avatars.githubusercontent.com/u/95612344?u=a0f7730a3cc7486827965e01a119ad610bda4b0a&v=4 - url: https://github.com/Zhongheng-Cheng rjNemo: login: rjNemo count: 8 @@ -103,6 +103,16 @@ pablocm83: count: 8 avatarUrl: https://avatars.githubusercontent.com/u/28315068?u=3310fbb05bb8bfc50d2c48b6cb64ac9ee4a14549&v=4 url: https://github.com/pablocm83 +ptt3199: + login: ptt3199 + count: 7 + avatarUrl: https://avatars.githubusercontent.com/u/51350651?u=2c3d947a80283e32bf616d4c3af139a6be69680f&v=4 + url: https://github.com/ptt3199 +NinaHwang: + login: NinaHwang + count: 6 + avatarUrl: https://avatars.githubusercontent.com/u/79563565?u=241f2cb6d38a2d379536608a8ea5a22ed4b1a3ea&v=4 + url: https://github.com/NinaHwang batlopes: login: batlopes count: 6 @@ -118,11 +128,6 @@ Alexandrhub: count: 6 avatarUrl: https://avatars.githubusercontent.com/u/119126536?u=9fc0d48f3307817bafecc5861eb2168401a6cb04&v=4 url: https://github.com/Alexandrhub -ptt3199: - login: ptt3199 - count: 6 - avatarUrl: https://avatars.githubusercontent.com/u/51350651?u=ccf51f8820787e17983954f26b06acf226cba293&v=4 - url: https://github.com/ptt3199 Serrones: login: Serrones count: 5 @@ -138,11 +143,6 @@ Attsun1031: count: 5 avatarUrl: https://avatars.githubusercontent.com/u/1175560?v=4 url: https://github.com/Attsun1031 -NinaHwang: - login: NinaHwang - count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/79563565?u=241f2cb6d38a2d379536608a8ea5a22ed4b1a3ea&v=4 - url: https://github.com/NinaHwang tiangolo: login: tiangolo count: 5 @@ -203,6 +203,11 @@ kwang1215: count: 4 avatarUrl: https://avatars.githubusercontent.com/u/74170199?u=2a63ff6692119dde3f5e5693365b9fcd6f977b08&v=4 url: https://github.com/kwang1215 +k94-ishi: + login: k94-ishi + count: 4 + avatarUrl: https://avatars.githubusercontent.com/u/32672580?u=bc7c5c07af0656be9fe4f1784a444af8d81ded89&v=4 + url: https://github.com/k94-ishi jfunez: login: jfunez count: 3 @@ -248,11 +253,6 @@ Zssaer: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/45691504?u=4c0c195f25cb5ac6af32acfb0ab35427682938d2&v=4 url: https://github.com/Zssaer -wdh99: - login: wdh99 - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/108172295?u=8a8fb95d5afe3e0fa33257b2aecae88d436249eb&v=4 - url: https://github.com/wdh99 ChuyuChoyeon: login: ChuyuChoyeon count: 3 @@ -271,12 +271,12 @@ mojtabapaso: hsuanchi: login: hsuanchi count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/24913710?u=0b094ae292292fee093818e37ceb645c114d2bff&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/24913710?u=7d25a398e478b6e63503bf6f26c54efa9e0da07b&v=4 url: https://github.com/hsuanchi alejsdev: login: alejsdev count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=356f39ff3f0211c720b06d3dbb060e98884085e3&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=638c65283ac9e9e2c3a0f9d1e3370db4b8a2c58d&v=4 url: https://github.com/alejsdev riroan: login: riroan @@ -296,7 +296,7 @@ pe-brian: maxscheijen: login: maxscheijen count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/47034840?u=eb98f37882528ea349ca4e5255fa64ac3fef0294&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/47034840?v=4 url: https://github.com/maxscheijen ilacftemp: login: ilacftemp @@ -328,21 +328,26 @@ nahyunkeem: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/174440096?u=e12401d492eee58570f8914d0872b52e421a776e&v=4 url: https://github.com/nahyunkeem +timothy-jeong: + login: timothy-jeong + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/53824764?u=db3d0cea2f5fab64d810113c5039a369699a2774&v=4 + url: https://github.com/timothy-jeong gerry-sabar: login: gerry-sabar count: 3 avatarUrl: https://avatars.githubusercontent.com/u/1120123?v=4 url: https://github.com/gerry-sabar -k94-ishi: - login: k94-ishi - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/32672580?u=bc7c5c07af0656be9fe4f1784a444af8d81ded89&v=4 - url: https://github.com/k94-ishi Rishat-F: login: Rishat-F count: 3 avatarUrl: https://avatars.githubusercontent.com/u/66554797?v=4 url: https://github.com/Rishat-F +ruzia: + login: ruzia + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/24503?v=4 + url: https://github.com/ruzia izaguerreiro: login: izaguerreiro count: 2 @@ -473,6 +478,11 @@ imtiaz101325: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/54007087?u=194d972b501b9ea9d2ddeaed757c492936e0121a&v=4 url: https://github.com/imtiaz101325 +fabianfalon: + login: fabianfalon + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/3700760?u=95f69e31280b17ac22299cdcd345323b142fe0af&v=4 + url: https://github.com/fabianfalon waketzheng: login: waketzheng count: 2 @@ -501,15 +511,25 @@ andersonrocha0: saeye: login: saeye count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/62229734?v=4 + avatarUrl: https://avatars.githubusercontent.com/u/62229734?u=312d619db2588b60d5d5bde65260a2f44fdc6c76&v=4 url: https://github.com/saeye -timothy-jeong: - login: timothy-jeong - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/53824764?u=db3d0cea2f5fab64d810113c5039a369699a2774&v=4 - url: https://github.com/timothy-jeong 11kkw: login: 11kkw count: 2 avatarUrl: https://avatars.githubusercontent.com/u/21125286?v=4 url: https://github.com/11kkw +yes0ng: + login: yes0ng + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/25501794?u=3aed18b0d491e0220a167a1e9e58bea3638c6707&v=4 + url: https://github.com/yes0ng +EgorOnishchuk: + login: EgorOnishchuk + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/120256301?v=4 + url: https://github.com/EgorOnishchuk +NavesSapnis: + login: NavesSapnis + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/79222417?u=b5b10291b8e9130ca84fd20f0a641e04ed94b6b1&v=4 + url: https://github.com/NavesSapnis diff --git a/docs/en/docs/advanced/generate-clients.md b/docs/en/docs/advanced/generate-clients.md index 3b9dc83f0..55e6a08b1 100644 --- a/docs/en/docs/advanced/generate-clients.md +++ b/docs/en/docs/advanced/generate-clients.md @@ -22,9 +22,9 @@ And it shows their true commitment to FastAPI and its **community** (you), as th For example, you might want to try: -* Speakeasy +* Speakeasy * Stainless -* liblab +* liblab There are also several other companies offering similar services that you can search and find online. 🤓 diff --git a/docs/en/docs/advanced/response-directly.md b/docs/en/docs/advanced/response-directly.md index 691b1e7cd..759b762b5 100644 --- a/docs/en/docs/advanced/response-directly.md +++ b/docs/en/docs/advanced/response-directly.md @@ -58,7 +58,7 @@ You could put your XML content in a string, put that in a `Response`, and return ## Notes -When you return a `Response` directly its data is not validated, converted (serialized), nor documented automatically. +When you return a `Response` directly its data is not validated, converted (serialized), or documented automatically. But you can still document it as described in [Additional Responses in OpenAPI](additional-responses.md){.internal-link target=_blank}. diff --git a/docs/en/docs/async.md b/docs/en/docs/async.md index 63bd8ca68..8207ec480 100644 --- a/docs/en/docs/async.md +++ b/docs/en/docs/async.md @@ -40,7 +40,7 @@ def results(): --- -If your application (somehow) doesn't have to communicate with anything else and wait for it to respond, use `async def`. +If your application (somehow) doesn't have to communicate with anything else and wait for it to respond, use `async def`, even if you don't need to use `await` inside. --- diff --git a/docs/en/docs/contributing.md b/docs/en/docs/contributing.md index 1b70a0ea9..2583fd1fb 100644 --- a/docs/en/docs/contributing.md +++ b/docs/en/docs/contributing.md @@ -181,6 +181,28 @@ as Uvicorn by default will use the port `8000`, the documentation on port `8008` ### Translations +/// warning | Attention + +**Update on Translations** + +We're updating the way we handle documentation translations. + +Until now, we invited community members to translate pages via pull requests, which were then reviewed by at least two native speakers. While this has helped bring FastAPI to many more users, we’ve also run into several challenges - some languages have only a few translated pages, others are outdated and hard to maintain over time. +To improve this, we’re working on automation tools 🤖 to manage translations more efficiently. Once ready, documentation will be machine-translated and still reviewed by at least two native speakers ✅ before publishing. This will allow us to keep translations up-to-date while reducing the review burden on maintainers. + +What’s changing now: + +* đŸšĢ We’re no longer accepting new community-submitted translation PRs. + +* âŗ Existing open PRs will be reviewed and can still be merged if completed within the next 3 weeks (since July 11 2025). + +* 🌐 In the future, we will only support languages where at least three active native speakers are available to review and maintain translations. + +This transition will help us keep translations more consistent and timely while better supporting our contributors 🙌. Thank you to everyone who has contributed so far — your help has been invaluable! 💖 + +/// + + Help with translations is VERY MUCH appreciated! And it can't be done without the help from the community. 🌎 🚀 Here are the steps to help with translations. @@ -293,30 +315,47 @@ Now you can translate it all and see how it looks as you save the file. Some of these files are updated very frequently and a translation would always be behind, or they include the main content from English source files, etc. +#### Request a New Language + +Let's say that you want to request translations for a language that is not yet translated, not even some pages. For example, Latin. + +If there is no discussion for that language, you can start by requesting the new language. For that, you can follow these steps: + +* Create a new discussion following the template. +* Get a few native speakers to comment on the discussion and commit to help review translations for that language. + +Once there are several people in the discussion, the FastAPI team can evaluate it and can make it an official translation. + +Then the docs will be automatically translated using AI, and the team of native speakers can review the translation, and help tweak the AI prompts. + +Once there's a new translation, for example if docs are updated or there's a new section, there will be a comment in the same discussion with the link to the new translation to review. + #### New Language -Let's say that you want to add translations for a language that is not yet translated, not even some pages. +/// note -Let's say you want to add translations for Creole, and it's not yet there in the docs. +These steps will be performed by the FastAPI team. + +/// -Checking the link from above, the code for "Creole" is `ht`. +Checking the link from above (List of ISO 639-1 codes), you can see that the 2-letter code for Latin is `la`. -The next step is to run the script to generate a new translation directory: +Now you can create a new directory for the new language, running the following script:
```console // Use the command new-lang, pass the language code as a CLI argument -$ python ./scripts/docs.py new-lang ht +$ python ./scripts/docs.py new-lang la -Successfully initialized: docs/ht +Successfully initialized: docs/la ```
-Now you can check in your code editor the newly created directory `docs/ht/`. +Now you can check in your code editor the newly created directory `docs/la/`. -That command created a file `docs/ht/mkdocs.yml` with a simple config that inherits everything from the `en` version: +That command created a file `docs/la/mkdocs.yml` with a simple config that inherits everything from the `en` version: ```yaml INHERIT: ../en/mkdocs.yml @@ -328,11 +367,11 @@ You could also simply create that file with those contents manually. /// -That command also created a dummy file `docs/ht/index.md` for the main page, you can start by translating that one. +That command also created a dummy file `docs/la/index.md` for the main page, you can start by translating that one. You can continue with the previous instructions for an "Existing Language" for that process. -You can make the first pull request with those two files, `docs/ht/mkdocs.yml` and `docs/ht/index.md`. 🎉 +You can make the first pull request with those two files, `docs/la/mkdocs.yml` and `docs/la/index.md`. 🎉 #### Preview the result diff --git a/docs/en/docs/deployment/cloud.md b/docs/en/docs/deployment/cloud.md index 471808851..d713379c3 100644 --- a/docs/en/docs/deployment/cloud.md +++ b/docs/en/docs/deployment/cloud.md @@ -14,5 +14,4 @@ You might want to try their services and follow their guides: * Platform.sh * Porter -* Coherence * Render diff --git a/docs/en/docs/deployment/concepts.md b/docs/en/docs/deployment/concepts.md index e71a7487a..ed635a920 100644 --- a/docs/en/docs/deployment/concepts.md +++ b/docs/en/docs/deployment/concepts.md @@ -65,7 +65,7 @@ The word **program** is commonly used to describe many things: * The **code** that you write, the **Python files**. * The **file** that can be **executed** by the operating system, for example: `python`, `python.exe` or `uvicorn`. -* A particular program while it is **running** on the operating system, using the CPU, and storing things on memory. This is also called a **process**. +* A particular program while it is **running** on the operating system, using the CPU, and storing things in memory. This is also called a **process**. ### What is a Process @@ -216,7 +216,7 @@ This Manager Process would probably be the one listening on the **port** in the Those worker processes would be the ones running your application, they would perform the main computations to receive a **request** and return a **response**, and they would load anything you put in variables in RAM. - + And of course, the same machine would probably have **other processes** running as well, apart from your application. diff --git a/docs/en/docs/deployment/https.md b/docs/en/docs/deployment/https.md index 46eda791e..8b4a08dbe 100644 --- a/docs/en/docs/deployment/https.md +++ b/docs/en/docs/deployment/https.md @@ -85,7 +85,7 @@ First, the browser would check with the **DNS servers** what is the **IP for the The DNS servers would tell the browser to use some specific **IP address**. That would be the public IP address used by your server, that you configured in the DNS servers. - + ### TLS Handshake Start @@ -93,7 +93,7 @@ The browser would then communicate with that IP address on **port 443** (the HTT The first part of the communication is just to establish the connection between the client and the server and to decide the cryptographic keys they will use, etc. - + This interaction between the client and the server to establish the TLS connection is called the **TLS handshake**. @@ -111,7 +111,7 @@ Using the **SNI extension** discussed above, the TLS Termination Proxy would che In this case, it would use the certificate for `someapp.example.com`. - + The client already **trusts** the entity that generated that TLS certificate (in this case Let's Encrypt, but we'll see about that later), so it can **verify** that the certificate is valid. @@ -133,19 +133,19 @@ Now that the client and server (specifically the browser and the TLS Termination So, the client sends an **HTTPS request**. This is just an HTTP request through an encrypted TLS connection. - + ### Decrypt the Request The TLS Termination Proxy would use the encryption agreed to **decrypt the request**, and would transmit the **plain (decrypted) HTTP request** to the process running the application (for example a process with Uvicorn running the FastAPI application). - + ### HTTP Response The application would process the request and send a **plain (unencrypted) HTTP response** to the TLS Termination Proxy. - + ### HTTPS Response @@ -153,7 +153,7 @@ The TLS Termination Proxy would then **encrypt the response** using the cryptogr Next, the browser would verify that the response is valid and encrypted with the right cryptographic key, etc. It would then **decrypt the response** and process it. - + The client (browser) will know that the response comes from the correct server because it is using the cryptography they agreed using the **HTTPS certificate** before. @@ -163,7 +163,7 @@ In the same server (or servers), there could be **multiple applications**, for e Only one process can be handling the specific IP and port (the TLS Termination Proxy in our example) but the other applications/processes can be running on the server(s) too, as long as they don't try to use the same **combination of public IP and port**. - + That way, the TLS Termination Proxy could handle HTTPS and certificates for **multiple domains**, for multiple applications, and then transmit the requests to the right application in each case. @@ -173,7 +173,7 @@ At some point in the future, each certificate would **expire** (about 3 months a And then, there would be another program (in some cases it's another program, in some cases it could be the same TLS Termination Proxy) that would talk to Let's Encrypt, and renew the certificate(s). - + The **TLS certificates** are **associated with a domain name**, not with an IP address. diff --git a/docs/en/docs/help-fastapi.md b/docs/en/docs/help-fastapi.md index 81151032f..35d2e7b84 100644 --- a/docs/en/docs/help-fastapi.md +++ b/docs/en/docs/help-fastapi.md @@ -249,20 +249,7 @@ On the other side, there are thousands of users in the chat systems, so there's ## Sponsor the author -You can also financially support the author (me) through GitHub sponsors. - -There you could buy me a coffee â˜•ī¸ to say thanks. 😄 - -And you can also become a Silver or Gold sponsor for FastAPI. 🏅🎉 - -## Sponsor the tools that power FastAPI - -As you have seen in the documentation, FastAPI stands on the shoulders of giants, Starlette and Pydantic. - -You can also sponsor: - -* Samuel Colvin (Pydantic) -* Encode (Starlette, Uvicorn) +If your **product/company** depends on or is related to **FastAPI** and you want to reach its users, you can sponsor the author (me) through GitHub sponsors. Depending on the tier, you could get some extra benefits, like a badge in the docs. 🎁 --- diff --git a/docs/en/docs/how-to/custom-docs-ui-assets.md b/docs/en/docs/how-to/custom-docs-ui-assets.md index f717c98fa..9d2238e4f 100644 --- a/docs/en/docs/how-to/custom-docs-ui-assets.md +++ b/docs/en/docs/how-to/custom-docs-ui-assets.md @@ -98,7 +98,7 @@ You can probably right-click each link and select an option similar to `Save lin And **ReDoc** uses the file: -* `redoc.standalone.js` +* `redoc.standalone.js` After that, your file structure could look like: @@ -129,14 +129,8 @@ You should see a very long JavaScript file for **ReDoc**. It could start with something like: ```JavaScript -/*! - * ReDoc - OpenAPI/Swagger-generated API Reference Documentation - * ------------------------------------------------------------- - * Version: "2.0.0-rc.18" - * Repo: https://github.com/Redocly/redoc - */ -!function(e,t){"object"==typeof exports&&"object"==typeof m - +/*! For license information please see redoc.standalone.js.LICENSE.txt */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("null")): ... ``` diff --git a/docs/en/docs/img/deployment/concepts/process-ram.drawio b/docs/en/docs/img/deployment/concepts/process-ram.drawio deleted file mode 100644 index b29c8a342..000000000 --- a/docs/en/docs/img/deployment/concepts/process-ram.drawio +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/en/docs/img/deployment/concepts/process-ram.drawio.svg b/docs/en/docs/img/deployment/concepts/process-ram.drawio.svg new file mode 100644 index 000000000..a6a5c81d0 --- /dev/null +++ b/docs/en/docs/img/deployment/concepts/process-ram.drawio.svg @@ -0,0 +1,297 @@ + + + + + + + + + + + + + +
+
+
+ + + Server + + +
+
+
+
+ + Server + +
+
+
+ + + + + + + + + + +
+
+
+ + + RAM + +
+
+
+
+
+
+ + RAM + +
+
+
+ + + + + + + + + + +
+
+
+ + + CPU + +
+
+
+
+
+
+ + CPU + +
+
+
+ + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + Process + + + + Manager + + +
+
+
+
+ + Process Manager + +
+
+
+ + + + + + + + + + +
+
+
+ + + Worker Process + + +
+
+
+
+ + Worker Process + +
+
+
+ + + + + + + + + + + + + +
+
+
+ + + Worker Process + + +
+
+
+
+ + Worker Process + +
+
+
+ + + + + + + + + + + + + +
+
+
+ + + Another Process + + +
+
+
+
+ + Another Process + +
+
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+ + 1 GB + +
+
+
+
+ + 1 GB + +
+
+
+ + + + + + + +
+
+
+ + 1 GB + +
+
+
+
+ + 1 GB + +
+
+
+ + + + + + +
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/en/docs/img/deployment/concepts/process-ram.svg b/docs/en/docs/img/deployment/concepts/process-ram.svg deleted file mode 100644 index c1bf0d589..000000000 --- a/docs/en/docs/img/deployment/concepts/process-ram.svg +++ /dev/null @@ -1,59 +0,0 @@ -
Server
Server
RAM
RAM -
CPU
CPU -
Process Manager
Process Manager
Worker Process
Worker Process
Worker Process
Worker Process
Another Process
Another Process
1 GB
1 GB
1 GB
1 GB
Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https.drawio b/docs/en/docs/img/deployment/https/https.drawio deleted file mode 100644 index c4c8a3628..000000000 --- a/docs/en/docs/img/deployment/https/https.drawio +++ /dev/null @@ -1,277 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/en/docs/img/deployment/https/https.drawio.svg b/docs/en/docs/img/deployment/https/https.drawio.svg new file mode 100644 index 000000000..c2a65b69f --- /dev/null +++ b/docs/en/docs/img/deployment/https/https.drawio.svg @@ -0,0 +1,907 @@ + + + + + + + + + + + + + + + + + + + +
+
+
+ + + Server(s) + + +
+
+
+
+ + Server(s) + +
+
+
+ + + + + + + + + + + +
+
+
+ + DNS Servers + +
+
+
+
+ + DNS Servers + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Termination Proxy + +
+
+
+
+
+
+ + TLS Termination Proxy + +
+
+
+ + + + + + + + + + + + + + + +
+
+
+ + Cert Renovation Program + +
+
+
+
+ + Cert Renovation Program + +
+
+
+ + + + + + + + + + + +
+
+
+ + Let's Encrypt + +
+
+
+
+ + Let's Encrypt + +
+
+
+ + + + + + + + + + + + + + + +
+
+
+ + + FastAPI + + + app for: someapp.example.com + + +
+
+
+
+ + FastAPI app for: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + Another app + + + : another.example.com + + +
+
+
+
+ + Another app: another.example.com + +
+
+
+ + + + + + + +
+
+
+ + + One more app + + + : onemore.example.com + + +
+
+
+
+ + One more app: onemore.example.com + +
+
+
+ + + + + + + +
+
+
+ + + A Database + + +
+
+
+
+ + A Database + +
+
+
+ + + + + + + + + + + + + +
+
+
+ + + Plain response from: someapp.example.com + + +
+
+
+
+ + Plain response from: someapp.example.com + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + Port 443 (HTTPS) + +
+
+
+
+ + Port 443 (HTTPS) + +
+
+
+ + + + + + + + + + + + + + +
+
+
+ + + Encrypted request for: someapp.example.com + + +
+
+
+
+ + Encrypted request for: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + Who is: someapp.example.com + + +
+
+
+
+ + Who is: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + +
+
+
+ + + Renew HTTPS cert for: someapp.example.com + + +
+
+
+
+ + Renew HTTPS cert for: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + New HTTPS cert for: someapp.example.com + + +
+
+
+
+ + New HTTPS cert for: someapp.example.com + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Handshake + + +
+
+
+
+ + TLS Handshake + +
+
+
+ + + + + + + + + + +
+
+
+ + + Encrypted response from: someapp.example.com + + +
+
+
+
+ + Encrypted response from: someapp.example.com + +
+
+
+ + + + + + + + + + + + + +
+
+
+ + + HTTPS certificates + +
+
+
+
+
+
+ + HTTPS certificates + +
+
+
+ + + + + + + +
+
+
+ + + + someapp.example.com + + +
+
+
+
+
+
+ + someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + + another.example.net + + +
+
+
+
+
+
+ + another.example.net + +
+
+
+ + + + + + + +
+
+
+ + + + onemore.example.org + + +
+
+
+
+
+
+ + onemore.example.org + +
+
+
+ + + + + + + +
+
+
+ + + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + +
+
+
+ + + Decrypted request for: someapp.example.com + + +
+
+
+
+ + Decrypted request for: someapp.example.com + +
+
+
+ + + + + + + + + + +
+
+
+ + https://someapp.example.com + +
+
+
+
+ + https://someapp.example.com + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/en/docs/img/deployment/https/https.svg b/docs/en/docs/img/deployment/https/https.svg deleted file mode 100644 index 69497518a..000000000 --- a/docs/en/docs/img/deployment/https/https.svg +++ /dev/null @@ -1,62 +0,0 @@ -
Server(s)
Server(s)
https://someapp.example.com
https://someapp.example.com
DNS Servers
DNS Servers
TLS Termination Proxy
TLS Termination Proxy -
Cert Renovation Program
Cert Renovation Program
Let's Encrypt
Let's Encrypt
FastAPI app for: someapp.example.com
FastAPI app for: someapp.example.com
Another app: another.example.com
Another app: another.example.com
One more app: onemore.example.com
One more app: onemore.example.com
A Database
A Database
Plain response from: someapp.example.com
Plain response from: someapp.example.com
Port 443 (HTTPS)
Port 443 (HTTPS)
Encrypted request for: someapp.example.com
Encrypted request for: someapp.example.com
Who is: someapp.example.com
Who is: someapp.example.com
IP:
123.124.125.126
IP:...
Renew HTTPS cert for: someapp.example.com
Renew HTTPS cert for: someapp.example.com
New HTTPS cert for: someapp.example.com
New HTTPS cert for: someapp.example.com
TLS Handshake
TLS Handshake
Encrypted response from: someapp.example.com
Encrypted response from: someapp.example.com
HTTPS certificates
HTTPS certificates -
someapp.example.com
someapp.example.com -
another.example.net
another.example.net -
onemore.example.org
onemore.example.org -
IP:
123.124.125.126
IP:...
Decrypted request for: someapp.example.com
Decrypted request for: someapp.example.com
Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https01.drawio b/docs/en/docs/img/deployment/https/https01.drawio deleted file mode 100644 index 181582f9b..000000000 --- a/docs/en/docs/img/deployment/https/https01.drawio +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/en/docs/img/deployment/https/https01.drawio.svg b/docs/en/docs/img/deployment/https/https01.drawio.svg new file mode 100644 index 000000000..ea128daf8 --- /dev/null +++ b/docs/en/docs/img/deployment/https/https01.drawio.svg @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + +
+
+
+ + DNS Servers + +
+
+
+
+ + DNS Servers + +
+
+
+ + + + + + + + + + + + + + + + + +
+
+
+ + + Who is: someapp.example.com + + +
+
+
+
+ + Who is: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + +
+
+
+ + https://someapp.example.com + +
+
+
+
+ + https://someapp.example.com + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/en/docs/img/deployment/https/https01.svg b/docs/en/docs/img/deployment/https/https01.svg deleted file mode 100644 index 2edbd0623..000000000 --- a/docs/en/docs/img/deployment/https/https01.svg +++ /dev/null @@ -1,57 +0,0 @@ -
https://someapp.example.com
https://someapp.example.com
DNS Servers
DNS Servers
Who is: someapp.example.com
Who is: someapp.example.com
IP:
123.124.125.126
IP:...
Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https02.drawio b/docs/en/docs/img/deployment/https/https02.drawio deleted file mode 100644 index 650c06d1e..000000000 --- a/docs/en/docs/img/deployment/https/https02.drawio +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/en/docs/img/deployment/https/https02.drawio.svg b/docs/en/docs/img/deployment/https/https02.drawio.svg new file mode 100644 index 000000000..c29d59356 --- /dev/null +++ b/docs/en/docs/img/deployment/https/https02.drawio.svg @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + +
+
+
+ + + Server(s) + + +
+
+
+
+ + Server(s) + +
+
+
+ + + + + + + + + + + +
+
+
+ + DNS Servers + +
+
+
+
+ + DNS Servers + +
+
+
+ + + + + + + + + + + + + + + + + +
+
+
+ + Port 443 (HTTPS) + +
+
+
+
+ + Port 443 (HTTPS) + +
+
+
+ + + + + + + +
+
+
+ + + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + +
+
+
+ + + Who is: someapp.example.com + + +
+
+
+
+ + Who is: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Handshake + + +
+
+
+
+ + TLS Handshake + +
+
+
+ + + + + + + + + + +
+
+
+ + https://someapp.example.com + +
+
+
+
+ + https://someapp.example.com + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/en/docs/img/deployment/https/https02.svg b/docs/en/docs/img/deployment/https/https02.svg deleted file mode 100644 index e16b7e94a..000000000 --- a/docs/en/docs/img/deployment/https/https02.svg +++ /dev/null @@ -1,57 +0,0 @@ -
Server(s)
Server(s)
https://someapp.example.com
https://someapp.example.com
DNS Servers
DNS Servers
Port 443 (HTTPS)
Port 443 (HTTPS)
IP:
123.124.125.126
IP:...
Who is: someapp.example.com
Who is: someapp.example.com
IP:
123.124.125.126
IP:...
TLS Handshake
TLS Handshake
Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https03.drawio b/docs/en/docs/img/deployment/https/https03.drawio deleted file mode 100644 index c178fd363..000000000 --- a/docs/en/docs/img/deployment/https/https03.drawio +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/en/docs/img/deployment/https/https03.drawio.svg b/docs/en/docs/img/deployment/https/https03.drawio.svg new file mode 100644 index 000000000..6971e4c9c --- /dev/null +++ b/docs/en/docs/img/deployment/https/https03.drawio.svg @@ -0,0 +1,715 @@ + + + + + + + + + + + + + + + + + + + +
+
+
+ + + Server(s) + + +
+
+
+
+ + Server(s) + +
+
+
+ + + + + + + + + + + +
+
+
+ + DNS Servers + +
+
+
+
+ + DNS Servers + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Termination Proxy + +
+
+
+
+
+
+ + TLS Termination Proxy + +
+
+
+ + + + + + + + + + + + + + + + + +
+
+
+ + Port 443 (HTTPS) + +
+
+
+
+ + Port 443 (HTTPS) + +
+
+
+ + + + + + + +
+
+
+ + + Who is: someapp.example.com + + +
+
+
+
+ + Who is: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Handshake + + +
+
+
+
+ + TLS Handshake + +
+
+
+ + + + + + + + + + + + + +
+
+
+ + + HTTPS certificates + +
+
+
+
+
+
+ + HTTPS certificates + +
+
+
+ + + + + + + +
+
+
+ + + + someapp.example.com + + +
+
+
+
+
+
+ + someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + + another.example.net + + +
+
+
+
+
+
+ + another.example.net + +
+
+
+ + + + + + + +
+
+
+ + + + onemore.example.org + + +
+
+
+
+
+
+ + onemore.example.org + +
+
+
+ + + + + + + +
+
+
+ + + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + +
+
+
+ + https://someapp.example.com + +
+
+
+
+ + https://someapp.example.com + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/en/docs/img/deployment/https/https03.svg b/docs/en/docs/img/deployment/https/https03.svg deleted file mode 100644 index 2badd1c7d..000000000 --- a/docs/en/docs/img/deployment/https/https03.svg +++ /dev/null @@ -1,62 +0,0 @@ -
Server(s)
Server(s)
https://someapp.example.com
https://someapp.example.com
DNS Servers
DNS Servers
TLS Termination Proxy
TLS Termination Proxy -
Port 443 (HTTPS)
Port 443 (HTTPS)
Who is: someapp.example.com
Who is: someapp.example.com
IP:
123.124.125.126
IP:...
TLS Handshake
TLS Handshake
HTTPS certificates
HTTPS certificates -
someapp.example.com
someapp.example.com -
another.example.net
another.example.net -
onemore.example.org
onemore.example.org -
IP:
123.124.125.126
IP:...
Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https04.drawio b/docs/en/docs/img/deployment/https/https04.drawio deleted file mode 100644 index 78a6e919a..000000000 --- a/docs/en/docs/img/deployment/https/https04.drawio +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/en/docs/img/deployment/https/https04.drawio.svg b/docs/en/docs/img/deployment/https/https04.drawio.svg new file mode 100644 index 000000000..7e32bcdfe --- /dev/null +++ b/docs/en/docs/img/deployment/https/https04.drawio.svg @@ -0,0 +1,419 @@ + + + + + + + + + + + + + + + + + +
+
+
+ + + Server(s) + + +
+
+
+
+ + Server(s) + +
+
+
+ + + + + + + + + + + +
+
+
+ + DNS Servers + +
+
+
+
+ + DNS Servers + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Termination Proxy + +
+
+
+
+
+
+ + TLS Termination Proxy + +
+
+
+ + + + + + + + + + + + + + + + + +
+
+
+ + Port 443 (HTTPS) + +
+
+
+
+ + Port 443 (HTTPS) + +
+
+
+ + + + + + + + + + + + + + +
+
+
+ + + Encrypted request for: someapp.example.com + + +
+
+
+
+ + Encrypted request for: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + Who is: someapp.example.com + + +
+
+
+
+ + Who is: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Handshake + + +
+
+
+
+ + TLS Handshake + +
+
+
+ + + + + + + + + + + + + +
+
+
+ + + HTTPS certificates + +
+
+
+
+
+
+ + HTTPS certificates + +
+
+
+ + + + + + + +
+
+
+ + + + someapp.example.com + + +
+
+
+
+
+
+ + someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + + another.example.net + + +
+
+
+
+
+
+ + another.example.net + +
+
+
+ + + + + + + +
+
+
+ + + + onemore.example.org + + +
+
+
+
+
+
+ + onemore.example.org + +
+
+
+ + + + + + + +
+
+
+ + + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + +
+
+
+ + https://someapp.example.com + +
+
+
+
+ + https://someapp.example.com + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/en/docs/img/deployment/https/https04.svg b/docs/en/docs/img/deployment/https/https04.svg deleted file mode 100644 index 4513ac76b..000000000 --- a/docs/en/docs/img/deployment/https/https04.svg +++ /dev/null @@ -1,62 +0,0 @@ -
Server(s)
Server(s)
https://someapp.example.com
https://someapp.example.com
DNS Servers
DNS Servers
TLS Termination Proxy
TLS Termination Proxy -
Port 443 (HTTPS)
Port 443 (HTTPS)
Encrypted request for: someapp.example.com
Encrypted request for: someapp.example.com
Who is: someapp.example.com
Who is: someapp.example.com
IP:
123.124.125.126
IP:...
TLS Handshake
TLS Handshake
HTTPS certificates
HTTPS certificates -
someapp.example.com
someapp.example.com -
another.example.net
another.example.net -
onemore.example.org
onemore.example.org -
IP:
123.124.125.126
IP:...
Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https05.drawio b/docs/en/docs/img/deployment/https/https05.drawio deleted file mode 100644 index 236ecd841..000000000 --- a/docs/en/docs/img/deployment/https/https05.drawio +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/en/docs/img/deployment/https/https05.drawio.svg b/docs/en/docs/img/deployment/https/https05.drawio.svg new file mode 100644 index 000000000..fed2fad16 --- /dev/null +++ b/docs/en/docs/img/deployment/https/https05.drawio.svg @@ -0,0 +1,641 @@ + + + + + + + + + + + + + + + + + + + +
+
+
+ + + Server(s) + + +
+
+
+
+ + Server(s) + +
+
+
+ + + + + + + + + + + +
+
+
+ + DNS Servers + +
+
+
+
+ + DNS Servers + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Termination Proxy + +
+
+
+
+
+
+ + TLS Termination Proxy + +
+
+
+ + + + + + + +
+
+
+ + + FastAPI + + + app for: someapp.example.com + + +
+
+
+
+ + FastAPI app for: someapp.example.com + +
+
+
+ + + + + + + + + + + +
+
+
+ + + Decrypted request for: someapp.example.com + + +
+
+
+
+ + Decrypted request for: someapp.example.com + +
+
+
+ + + + + + + + + + + + + + + + + +
+
+
+ + Port 443 (HTTPS) + +
+
+
+
+ + Port 443 (HTTPS) + +
+
+
+ + + + + + + + + + + + + + +
+
+
+ + + Encrypted request for: someapp.example.com + + +
+
+
+
+ + Encrypted request for: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + Who is: someapp.example.com + + +
+
+
+
+ + Who is: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Handshake + + +
+
+
+
+ + TLS Handshake + +
+
+
+ + + + + + + + + + + + + +
+
+
+ + + HTTPS certificates + +
+
+
+
+
+
+ + HTTPS certificates + +
+
+
+ + + + + + + +
+
+
+ + + + someapp.example.com + + +
+
+
+
+
+
+ + someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + + another.example.net + + +
+
+
+
+
+
+ + another.example.net + +
+
+
+ + + + + + + +
+
+
+ + + + onemore.example.org + + +
+
+
+
+
+
+ + onemore.example.org + +
+
+
+ + + + + + + +
+
+
+ + + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + +
+
+
+ + https://someapp.example.com + +
+
+
+
+ + https://someapp.example.com + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/en/docs/img/deployment/https/https05.svg b/docs/en/docs/img/deployment/https/https05.svg deleted file mode 100644 index ddcd2760a..000000000 --- a/docs/en/docs/img/deployment/https/https05.svg +++ /dev/null @@ -1,62 +0,0 @@ -
Server(s)
Server(s)
https://someapp.example.com
https://someapp.example.com
DNS Servers
DNS Servers
TLS Termination Proxy
TLS Termination Proxy -
FastAPI app for: someapp.example.com
FastAPI app for: someapp.example.com
Decrypted request for: someapp.example.com
Decrypted request for: someapp.example.com
Port 443 (HTTPS)
Port 443 (HTTPS)
Encrypted request for: someapp.example.com
Encrypted request for: someapp.example.com
Who is: someapp.example.com
Who is: someapp.example.com
IP:
123.124.125.126
IP:...
TLS Handshake
TLS Handshake
HTTPS certificates
HTTPS certificates -
someapp.example.com
someapp.example.com -
another.example.net
another.example.net -
onemore.example.org
onemore.example.org -
IP:
123.124.125.126
IP:...
Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https06.drawio b/docs/en/docs/img/deployment/https/https06.drawio deleted file mode 100644 index 9dec13184..000000000 --- a/docs/en/docs/img/deployment/https/https06.drawio +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/en/docs/img/deployment/https/https06.drawio.svg b/docs/en/docs/img/deployment/https/https06.drawio.svg new file mode 100644 index 000000000..e0bd9bc6e --- /dev/null +++ b/docs/en/docs/img/deployment/https/https06.drawio.svg @@ -0,0 +1,673 @@ + + + + + + + + + + + + + + + + + + + +
+
+
+ + + Server(s) + + +
+
+
+
+ + Server(s) + +
+
+
+ + + + + + + + + + + +
+
+
+ + DNS Servers + +
+
+
+
+ + DNS Servers + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Termination Proxy + +
+
+
+
+
+
+ + TLS Termination Proxy + +
+
+
+ + + + + + + + + + + +
+
+
+ + + FastAPI + + + app for: someapp.example.com + + +
+
+
+
+ + FastAPI app for: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + Plain response from: someapp.example.com + + +
+
+
+
+ + Plain response from: someapp.example.com + +
+
+
+ + + + + + + + + + + + + + +
+
+
+ + + Decrypted request for: someapp.example.com + + +
+
+
+
+ + Decrypted request for: someapp.example.com + +
+
+
+ + + + + + + + + + + + + + + + + +
+
+
+ + Port 443 (HTTPS) + +
+
+
+
+ + Port 443 (HTTPS) + +
+
+
+ + + + + + + + + + + + + + +
+
+
+ + + Encrypted request for: someapp.example.com + + +
+
+
+
+ + Encrypted request for: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + Who is: someapp.example.com + + +
+
+
+
+ + Who is: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Handshake + + +
+
+
+
+ + TLS Handshake + +
+
+
+ + + + + + + + + + + + + +
+
+
+ + + HTTPS certificates + +
+
+
+
+
+
+ + HTTPS certificates + +
+
+
+ + + + + + + +
+
+
+ + + + someapp.example.com + + +
+
+
+
+
+
+ + someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + + another.example.net + + +
+
+
+
+
+
+ + another.example.net + +
+
+
+ + + + + + + +
+
+
+ + + + onemore.example.org + + +
+
+
+
+
+
+ + onemore.example.org + +
+
+
+ + + + + + + +
+
+
+ + + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + +
+
+
+ + https://someapp.example.com + +
+
+
+
+ + https://someapp.example.com + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/en/docs/img/deployment/https/https06.svg b/docs/en/docs/img/deployment/https/https06.svg deleted file mode 100644 index 3695de40c..000000000 --- a/docs/en/docs/img/deployment/https/https06.svg +++ /dev/null @@ -1,62 +0,0 @@ -
Server(s)
Server(s)
https://someapp.example.com
https://someapp.example.com
DNS Servers
DNS Servers
TLS Termination Proxy
TLS Termination Proxy -
FastAPI app for: someapp.example.com
FastAPI app for: someapp.example.com
Plain response from: someapp.example.com
Plain response from: someapp.example.com
Decrypted request for: someapp.example.com
Decrypted request for: someapp.example.com
Port 443 (HTTPS)
Port 443 (HTTPS)
Encrypted request for: someapp.example.com
Encrypted request for: someapp.example.com
Who is: someapp.example.com
Who is: someapp.example.com
IP:
123.124.125.126
IP:...
TLS Handshake
TLS Handshake
HTTPS certificates
HTTPS certificates -
someapp.example.com
someapp.example.com -
another.example.net
another.example.net -
onemore.example.org
onemore.example.org -
IP:
123.124.125.126
IP:...
Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https07.drawio b/docs/en/docs/img/deployment/https/https07.drawio deleted file mode 100644 index aa8f4d6be..000000000 --- a/docs/en/docs/img/deployment/https/https07.drawio +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/en/docs/img/deployment/https/https07.drawio.svg b/docs/en/docs/img/deployment/https/https07.drawio.svg new file mode 100644 index 000000000..b74b33807 --- /dev/null +++ b/docs/en/docs/img/deployment/https/https07.drawio.svg @@ -0,0 +1,540 @@ + + + + + + + + + + + + + + + + + +
+
+
+ + + Server(s) + + +
+
+
+
+ + Server(s) + +
+
+
+ + + + + + + + + + + +
+
+
+ + DNS Servers + +
+
+
+
+ + DNS Servers + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Termination Proxy + +
+
+
+
+
+
+ + TLS Termination Proxy + +
+
+
+ + + + + + + + + + + +
+
+
+ + + FastAPI + + + app for: someapp.example.com + + +
+
+
+
+ + FastAPI app for: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + Plain response from: someapp.example.com + + +
+
+
+
+ + Plain response from: someapp.example.com + +
+
+
+ + + + + + + + + + + + + + +
+
+
+ + + Decrypted request for: someapp.example.com + + +
+
+
+
+ + Decrypted request for: someapp.example.com + +
+
+
+ + + + + + + + + + + + + + + + + + + + + +
+
+
+ + Port 443 (HTTPS) + +
+
+
+
+ + Port 443 (HTTPS) + +
+
+
+ + + + + + + + + + + + + + +
+
+
+ + + Encrypted request for: someapp.example.com + + +
+
+
+
+ + Encrypted request for: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + Who is: someapp.example.com + + +
+
+
+
+ + Who is: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Handshake + + +
+
+
+
+ + TLS Handshake + +
+
+
+ + + + + + + + + + +
+
+
+ + + Encrypted response from: someapp.example.com + + +
+
+
+
+ + Encrypted response from: someapp.example.com + +
+
+
+ + + + + + + + + + + + + +
+
+
+ + + HTTPS certificates + +
+
+
+
+
+
+ + HTTPS certificates + +
+
+
+ + + + + + + +
+
+
+ + + + someapp.example.com + + +
+
+
+
+
+
+ + someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + + another.example.net + + +
+
+
+
+
+
+ + another.example.net + +
+
+
+ + + + + + + +
+
+
+ + + + onemore.example.org + + +
+
+
+
+
+
+ + onemore.example.org + +
+
+
+ + + + + + + +
+
+
+ + + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + +
+
+
+ + https://someapp.example.com + +
+
+
+
+ + https://someapp.example.com + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/en/docs/img/deployment/https/https07.svg b/docs/en/docs/img/deployment/https/https07.svg deleted file mode 100644 index 551354cef..000000000 --- a/docs/en/docs/img/deployment/https/https07.svg +++ /dev/null @@ -1,62 +0,0 @@ -
Server(s)
Server(s)
https://someapp.example.com
https://someapp.example.com
DNS Servers
DNS Servers
TLS Termination Proxy
TLS Termination Proxy -
FastAPI app for: someapp.example.com
FastAPI app for: someapp.example.com
Plain response from: someapp.example.com
Plain response from: someapp.example.com
Decrypted request for: someapp.example.com
Decrypted request for: someapp.example.com
Port 443 (HTTPS)
Port 443 (HTTPS)
Encrypted request for: someapp.example.com
Encrypted request for: someapp.example.com
Who is: someapp.example.com
Who is: someapp.example.com
IP:
123.124.125.126
IP:...
TLS Handshake
TLS Handshake
Encrypted response from: someapp.example.com
Encrypted response from: someapp.example.com
HTTPS certificates
HTTPS certificates -
someapp.example.com
someapp.example.com -
another.example.net
another.example.net -
onemore.example.org
onemore.example.org -
IP:
123.124.125.126
IP:...
Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https08.drawio b/docs/en/docs/img/deployment/https/https08.drawio deleted file mode 100644 index 794b192df..000000000 --- a/docs/en/docs/img/deployment/https/https08.drawio +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/en/docs/img/deployment/https/https08.drawio.svg b/docs/en/docs/img/deployment/https/https08.drawio.svg new file mode 100644 index 000000000..8fc0b31ec --- /dev/null +++ b/docs/en/docs/img/deployment/https/https08.drawio.svg @@ -0,0 +1,625 @@ + + + + + + + + + + + + + + + + + +
+
+
+ + + Server(s) + + +
+
+
+
+ + Server(s) + +
+
+
+ + + + + + + + + + + +
+
+
+ + DNS Servers + +
+
+
+
+ + DNS Servers + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Termination Proxy + +
+
+
+
+
+
+ + TLS Termination Proxy + +
+
+
+ + + + + + + + + + + + + + + +
+
+
+ + + FastAPI + + + app for: someapp.example.com + + +
+
+
+
+ + FastAPI app for: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + Another app + + + : another.example.com + + +
+
+
+
+ + Another app: another.example.com + +
+
+
+ + + + + + + +
+
+
+ + + One more app + + + : onemore.example.com + + +
+
+
+
+ + One more app: onemore.example.com + +
+
+
+ + + + + + + +
+
+
+ + + A Database + + +
+
+
+
+ + A Database + +
+
+
+ + + + + + + +
+
+
+ + + Plain response from: someapp.example.com + + +
+
+
+
+ + Plain response from: someapp.example.com + +
+
+
+ + + + + + + + + + + + + + +
+
+
+ + + Decrypted request for: someapp.example.com + + +
+
+
+
+ + Decrypted request for: someapp.example.com + +
+
+
+ + + + + + + + + + + + + + + + + + + + + +
+
+
+ + Port 443 (HTTPS) + +
+
+
+
+ + Port 443 (HTTPS) + +
+
+
+ + + + + + + + + + + + + + +
+
+
+ + + Encrypted request for: someapp.example.com + + +
+
+
+
+ + Encrypted request for: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + Who is: someapp.example.com + + +
+
+
+
+ + Who is: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Handshake + + +
+
+
+
+ + TLS Handshake + +
+
+
+ + + + + + + + + + +
+
+
+ + + Encrypted response from: someapp.example.com + + +
+
+
+
+ + Encrypted response from: someapp.example.com + +
+
+
+ + + + + + + + + + + + + +
+
+
+ + + HTTPS certificates + +
+
+
+
+
+
+ + HTTPS certificates + +
+
+
+ + + + + + + +
+
+
+ + + + someapp.example.com + + +
+
+
+
+
+
+ + someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + + another.example.net + + +
+
+
+
+
+
+ + another.example.net + +
+
+
+ + + + + + + +
+
+
+ + + + onemore.example.org + + +
+
+
+
+
+
+ + onemore.example.org + +
+
+
+ + + + + + + +
+
+
+ + + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + +
+
+
+ + https://someapp.example.com + +
+
+
+
+ + https://someapp.example.com + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/en/docs/img/deployment/https/https08.svg b/docs/en/docs/img/deployment/https/https08.svg deleted file mode 100644 index 2d4680dcc..000000000 --- a/docs/en/docs/img/deployment/https/https08.svg +++ /dev/null @@ -1,62 +0,0 @@ -
Server(s)
Server(s)
https://someapp.example.com
https://someapp.example.com
DNS Servers
DNS Servers
TLS Termination Proxy
TLS Termination Proxy -
FastAPI app for: someapp.example.com
FastAPI app for: someapp.example.com
Another app: another.example.com
Another app: another.example.com
One more app: onemore.example.com
One more app: onemore.example.com
A Database
A Database
Plain response from: someapp.example.com
Plain response from: someapp.example.com
Decrypted request for: someapp.example.com
Decrypted request for: someapp.example.com
Port 443 (HTTPS)
Port 443 (HTTPS)
Encrypted request for: someapp.example.com
Encrypted request for: someapp.example.com
Who is: someapp.example.com
Who is: someapp.example.com
IP:
123.124.125.126
IP:...
TLS Handshake
TLS Handshake
Encrypted response from: someapp.example.com
Encrypted response from: someapp.example.com
HTTPS certificates
HTTPS certificates -
someapp.example.com
someapp.example.com -
another.example.net
another.example.net -
onemore.example.org
onemore.example.org -
IP:
123.124.125.126
IP:...
Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/sponsors/dribia.png b/docs/en/docs/img/sponsors/dribia.png new file mode 100644 index 000000000..f40e14086 Binary files /dev/null and b/docs/en/docs/img/sponsors/dribia.png differ diff --git a/docs/en/docs/img/sponsors/interviewpal.png b/docs/en/docs/img/sponsors/interviewpal.png new file mode 100644 index 000000000..e40ed01fd Binary files /dev/null and b/docs/en/docs/img/sponsors/interviewpal.png differ diff --git a/docs/en/docs/img/sponsors/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/subtotal-banner.svg b/docs/en/docs/img/sponsors/subtotal-banner.svg new file mode 100644 index 000000000..3d6c98dfc --- /dev/null +++ b/docs/en/docs/img/sponsors/subtotal-banner.svg @@ -0,0 +1,133 @@ + + + + + sponsorship-banner + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/en/docs/img/sponsors/subtotal.svg b/docs/en/docs/img/sponsors/subtotal.svg new file mode 100644 index 000000000..b944c1b2c --- /dev/null +++ b/docs/en/docs/img/sponsors/subtotal.svg @@ -0,0 +1,31 @@ + + + sponsorship-badge + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/en/docs/img/sponsors/zuplo.png b/docs/en/docs/img/sponsors/zuplo.png index 7a7c16862..6a4ed233e 100644 Binary files a/docs/en/docs/img/sponsors/zuplo.png and b/docs/en/docs/img/sponsors/zuplo.png differ diff --git a/docs/en/docs/img/tutorial/bigger-applications/package.drawio b/docs/en/docs/img/tutorial/bigger-applications/package.drawio deleted file mode 100644 index cab3de2ca..000000000 --- a/docs/en/docs/img/tutorial/bigger-applications/package.drawio +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/en/docs/img/tutorial/bigger-applications/package.drawio.svg b/docs/en/docs/img/tutorial/bigger-applications/package.drawio.svg new file mode 100644 index 000000000..7e28f4a68 --- /dev/null +++ b/docs/en/docs/img/tutorial/bigger-applications/package.drawio.svg @@ -0,0 +1,420 @@ + + + + + + + + + + + + + + + + +
+
+
+ + Package app +
+ app/__init__.py +
+
+
+
+
+ + Package app... + +
+
+
+ + + + + + + +
+
+
+ + + Module app.main + +
+ + app/main.py + +
+
+
+
+
+ + Module app.main... + +
+
+
+ + + + + + + +
+
+
+ + + Module app.dependencies + +
+ + app/dependencies.py + +
+
+
+
+
+ + Module app.dependencies... + +
+
+
+ + + + + + + + + + +
+
+
+ + + Subpackage app.internal +
+
+ + app/internal/__init__.py + +
+ +
+
+
+
+
+
+ + Subpackage app.internal... + +
+
+
+ + + + + + + +
+
+
+ + + Module app.internal.admin + +
+ + app/internal/admin.py + +
+
+
+
+
+ + Module app.internal.admin... + +
+
+
+ + + + + + + + + + +
+
+
+ + + Subpackage app.routers +
+ app/routers/__init__.py +
+
+
+
+
+
+
+ + Subpackage app.routers... + +
+
+
+ + + + + + + +
+
+
+ + + Module app.routers.items + +
+ + app/routers/items.py + +
+
+
+
+
+ + Module app.routers.items... + +
+
+
+ + + + + + + +
+
+
+ + + Module app.routers.users + +
+ + app/routers/users.py + +
+
+
+
+
+ + Module app.routers.users... + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/en/docs/img/tutorial/bigger-applications/package.svg b/docs/en/docs/img/tutorial/bigger-applications/package.svg deleted file mode 100644 index 44da1dc30..000000000 --- a/docs/en/docs/img/tutorial/bigger-applications/package.svg +++ /dev/null @@ -1 +0,0 @@ -
Package app
app/__init__.py
Package app...
Module app.main
app/main.py
Module app.main...
Module app.dependencies
app/dependencies.py
Module app.dependencies...
Subpackage app.internal
app/internal/__init__.py
Subpackage app.internal...
Module app.internal.admin
app/internal/admin.py
Module app.internal.admin...
Subpackage app.routers
app/routers/__init__.py
Subpackage app.routers...
Module app.routers.items
app/routers/items.py
Module app.routers.items...
Module app.routers.users
app/routers/users.py
Module app.routers.users...
Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/index.md b/docs/en/docs/index.md index 4a2777f25..938882d7d 100644 --- a/docs/en/docs/index.md +++ b/docs/en/docs/index.md @@ -146,7 +146,7 @@ $ pip install "fastapi[standard]" ### Create it -* Create a file `main.py` with: +Create a file `main.py` with: ```Python from typing import Union @@ -468,15 +468,20 @@ Used by Starlette: * jinja2 - Required if you want to use the default template configuration. * python-multipart - Required if you want to support form "parsing", with `request.form()`. -Used by FastAPI / Starlette: +Used by FastAPI: * uvicorn - for the server that loads and serves your application. This includes `uvicorn[standard]`, which includes some dependencies (e.g. `uvloop`) needed for high performance serving. -* `fastapi-cli` - to provide the `fastapi` command. +* `fastapi-cli[standard]` - to provide the `fastapi` command. + * This includes `fastapi-cloud-cli`, which allows you to deploy your FastAPI application to FastAPI Cloud. ### Without `standard` Dependencies If you don't want to include the `standard` optional dependencies, you can install with `pip install fastapi` instead of `pip install "fastapi[standard]"`. +### Without `fastapi-cloud-cli` + +If you want to install FastAPI with the standard dependencies but without the `fastapi-cloud-cli`, you can install with `pip install "fastapi[standard-no-fastapi-cloud-cli]"`. + ### Additional Optional Dependencies There are some additional dependencies you might want to install. diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index c900dc918..f3984fa9e 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,13 +7,225 @@ hide: ## Latest Changes +### Docs + +* 📝 Add discussion template for new language translation requests. PR [#13535](https://github.com/fastapi/fastapi/pull/13535) by [@alejsdev](https://github.com/alejsdev). + +### Translations + +* 🌐 Update Portuguese Translation for `docs/pt/docs/async.md`. PR [#13863](https://github.com/fastapi/fastapi/pull/13863) by [@EdmilsonRodrigues](https://github.com/EdmilsonRodrigues). +* 📝 Fix highlight line in `docs/ja/docs/tutorial/body.md`. PR [#13927](https://github.com/fastapi/fastapi/pull/13927) by [@KoyoMiyazaki](https://github.com/KoyoMiyazaki). +* 🌐 Add Persian translation for `docs/fa/docs/environment-variables.md`. PR [#13923](https://github.com/fastapi/fastapi/pull/13923) by [@Mohammad222PR](https://github.com/Mohammad222PR). +* 🌐 Add Persian translation for `docs/fa/docs/python-types.md`. PR [#13524](https://github.com/fastapi/fastapi/pull/13524) by [@Mohammad222PR](https://github.com/Mohammad222PR). +* 🌐 Update Portuguese Translation for `docs/pt/docs/project-generation.md`. PR [#13875](https://github.com/fastapi/fastapi/pull/13875) by [@EdmilsonRodrigues](https://github.com/EdmilsonRodrigues). +* 🌐 Add Persian translation for `docs/fa/docs/async.md`. PR [#13541](https://github.com/fastapi/fastapi/pull/13541) by [@Mohammad222PR](https://github.com/Mohammad222PR). +* 🌐 Add Bangali translation for `docs/bn/about/index.md`. PR [#13882](https://github.com/fastapi/fastapi/pull/13882) by [@sajjadrahman56](https://github.com/sajjadrahman56). + +### Internal + +* âš’ī¸ Update translate script, show and update outdated translations. PR [#13933](https://github.com/fastapi/fastapi/pull/13933) by [@tiangolo](https://github.com/tiangolo). +* 🔨 Refactor translate script with extra feedback (prints). PR [#13932](https://github.com/fastapi/fastapi/pull/13932) by [@tiangolo](https://github.com/tiangolo). +* 🔨 Update translations script to remove old (removed) files. PR [#13928](https://github.com/fastapi/fastapi/pull/13928) by [@tiangolo](https://github.com/tiangolo). +* âŦ† [pre-commit.ci] pre-commit autoupdate. PR [#13894](https://github.com/fastapi/fastapi/pull/13894) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). +* âŦ† Update httpx requirement to >=0.23.0,<0.29.0. PR [#13114](https://github.com/fastapi/fastapi/pull/13114) by [@yan12125](https://github.com/yan12125). +* 🔧 Update sponsors: Add Mobb. PR [#13916](https://github.com/fastapi/fastapi/pull/13916) by [@tiangolo](https://github.com/tiangolo). +* đŸ‘Ĩ Update FastAPI People - Experts. PR [#13889](https://github.com/fastapi/fastapi/pull/13889) by [@tiangolo](https://github.com/tiangolo). +* 🔨 Update FastAPI People sleep interval, use external settings. PR [#13888](https://github.com/fastapi/fastapi/pull/13888) by [@tiangolo](https://github.com/tiangolo). + +## 0.116.1 + +### Upgrades + +* âŦ†ī¸ Upgrade Starlette supported version range to `>=0.40.0,<0.48.0`. PR [#13884](https://github.com/fastapi/fastapi/pull/13884) by [@tiangolo](https://github.com/tiangolo). + +### Docs + +* 📝 Add notification about impending changes in Translations to `docs/en/docs/contributing.md`. PR [#13886](https://github.com/fastapi/fastapi/pull/13886) by [@YuriiMotov](https://github.com/YuriiMotov). + +### Internal + +* âŦ† [pre-commit.ci] pre-commit autoupdate. PR [#13871](https://github.com/fastapi/fastapi/pull/13871) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). + +## 0.116.0 + +### Features + +* ✨ Add support for deploying to FastAPI Cloud with `fastapi deploy`. PR [#13870](https://github.com/fastapi/fastapi/pull/13870) by [@tiangolo](https://github.com/tiangolo). + +Installing `fastapi[standard]` now includes `fastapi-cloud-cli`. + +This will allow you to deploy to [FastAPI Cloud](https://fastapicloud.com) with the `fastapi deploy` command. + +If you want to install `fastapi` with the standard dependencies but without `fastapi-cloud-cli`, you can install instead `fastapi[standard-no-fastapi-cloud-cli]`. + +### Translations + +* 🌐 Add Russian translation for `docs/ru/docs/advanced/response-directly.md`. PR [#13801](https://github.com/fastapi/fastapi/pull/13801) by [@NavesSapnis](https://github.com/NavesSapnis). +* 🌐 Add Russian translation for `docs/ru/docs/advanced/additional-status-codes.md`. PR [#13799](https://github.com/fastapi/fastapi/pull/13799) by [@NavesSapnis](https://github.com/NavesSapnis). +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/body-updates.md`. PR [#13804](https://github.com/fastapi/fastapi/pull/13804) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). + +### Internal + +* âŦ† Bump pillow from 11.1.0 to 11.3.0. PR [#13852](https://github.com/fastapi/fastapi/pull/13852) by [@dependabot[bot]](https://github.com/apps/dependabot). +* đŸ‘Ĩ Update FastAPI People - Sponsors. PR [#13846](https://github.com/fastapi/fastapi/pull/13846) by [@tiangolo](https://github.com/tiangolo). +* đŸ‘Ĩ Update FastAPI GitHub topic repositories. PR [#13848](https://github.com/fastapi/fastapi/pull/13848) by [@tiangolo](https://github.com/tiangolo). +* âŦ† Bump mkdocs-material from 9.6.1 to 9.6.15. PR [#13849](https://github.com/fastapi/fastapi/pull/13849) by [@dependabot[bot]](https://github.com/apps/dependabot). +* âŦ† [pre-commit.ci] pre-commit autoupdate. PR [#13843](https://github.com/fastapi/fastapi/pull/13843) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). +* đŸ‘Ĩ Update FastAPI People - Contributors and Translators. PR [#13845](https://github.com/fastapi/fastapi/pull/13845) by [@tiangolo](https://github.com/tiangolo). + +## 0.115.14 + +### Fixes + +* 🐛 Fix support for unions when using `Form`. PR [#13827](https://github.com/fastapi/fastapi/pull/13827) by [@patrick91](https://github.com/patrick91). + +### Docs + +* âœī¸ Fix grammar mistake in `docs/en/docs/advanced/response-directly.md`. PR [#13800](https://github.com/fastapi/fastapi/pull/13800) by [@NavesSapnis](https://github.com/NavesSapnis). +* 📝 Update Speakeasy URL to Speakeasy Sandbox. PR [#13697](https://github.com/fastapi/fastapi/pull/13697) by [@ndimares](https://github.com/ndimares). + +### Translations + +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/response-model.md`. PR [#13792](https://github.com/fastapi/fastapi/pull/13792) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/security/index.md`. PR [#13805](https://github.com/fastapi/fastapi/pull/13805) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). +* âœī¸ Fix typo in `docs/ja/docs/tutorial/encoder.md`. PR [#13815](https://github.com/fastapi/fastapi/pull/13815) by [@ruzia](https://github.com/ruzia). +* âœī¸ Fix typo in `docs/ja/docs/tutorial/handling-errors.md`. PR [#13814](https://github.com/fastapi/fastapi/pull/13814) by [@ruzia](https://github.com/ruzia). +* âœī¸ Fix typo in `docs/ja/docs/tutorial/body-fields.md`. PR [#13802](https://github.com/fastapi/fastapi/pull/13802) by [@ruzia](https://github.com/ruzia). +* 🌐 Add Russian translation for `docs/ru/docs/advanced/index.md`. PR [#13797](https://github.com/fastapi/fastapi/pull/13797) by [@NavesSapnis](https://github.com/NavesSapnis). + +### Internal + +* âŦ† [pre-commit.ci] pre-commit autoupdate. PR [#13823](https://github.com/fastapi/fastapi/pull/13823) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). + +## 0.115.13 + +### Fixes + +* 🐛 Fix truncating the model's description with form feed (`\f`) character for Pydantic V2. PR [#13698](https://github.com/fastapi/fastapi/pull/13698) by [@YuriiMotov](https://github.com/YuriiMotov). + +### Refactors + +* ✨ Add `refreshUrl` parameter in `OAuth2PasswordBearer`. PR [#11460](https://github.com/fastapi/fastapi/pull/11460) by [@snosratiershad](https://github.com/snosratiershad). +* 🚸 Set format to password for fields `password` and `client_secret` in `OAuth2PasswordRequestForm`, make docs show password fields for passwords. PR [#11032](https://github.com/fastapi/fastapi/pull/11032) by [@Thodoris1999](https://github.com/Thodoris1999). +* ✅ Simplify tests for `settings`. PR [#13505](https://github.com/fastapi/fastapi/pull/13505) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). +* ✅ Simplify tests for `validate_response_recursive`. PR [#13507](https://github.com/fastapi/fastapi/pull/13507) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). + +### Upgrades + +* âŦ†ī¸ Update ReDoc to version 2.x. PR [#9700](https://github.com/fastapi/fastapi/pull/9700) by [@joakimnordling](https://github.com/joakimnordling). + +### Docs + +* 📝 Add annotations to HTTP middleware example. PR [#11530](https://github.com/fastapi/fastapi/pull/11530) by [@Kilo59](https://github.com/Kilo59). +* 📝 Clarify in CORS docs that wildcards and credentials are mutually exclusive. PR [#9829](https://github.com/fastapi/fastapi/pull/9829) by [@dfioravanti](https://github.com/dfioravanti). +* âœī¸ Fix typo in docstring. PR [#13532](https://github.com/fastapi/fastapi/pull/13532) by [@comp64](https://github.com/comp64). +* 📝 Clarify guidance on using `async def` without `await`. PR [#13642](https://github.com/fastapi/fastapi/pull/13642) by [@swastikpradhan1999](https://github.com/swastikpradhan1999). +* 📝 Update exclude-parameters-from-openapi documentation links. PR [#13600](https://github.com/fastapi/fastapi/pull/13600) by [@timonrieger](https://github.com/timonrieger). +* 📝 Clarify the middleware execution order in docs. PR [#13699](https://github.com/fastapi/fastapi/pull/13699) by [@YuriiMotov](https://github.com/YuriiMotov). +* 🍱 Update Drawio diagrams SVGs, single file per diagram, sans-serif font. PR [#13706](https://github.com/fastapi/fastapi/pull/13706) by [@tiangolo](https://github.com/tiangolo). +* 📝 Update docs for "Help FastAPI", simplify and reduce "sponsor" section. PR [#13670](https://github.com/fastapi/fastapi/pull/13670) by [@tiangolo](https://github.com/tiangolo). +* 📝 Remove unnecessary bullet from docs. PR [#13641](https://github.com/fastapi/fastapi/pull/13641) by [@Adamowoc](https://github.com/Adamowoc). +* âœī¸ Fix syntax error in `docs/en/docs/tutorial/handling-errors.md`. PR [#13623](https://github.com/fastapi/fastapi/pull/13623) by [@gsheni](https://github.com/gsheni). +* 📝 Fix typo in documentation. PR [#13599](https://github.com/fastapi/fastapi/pull/13599) by [@Taoup](https://github.com/Taoup). +* 📝 Fix liblab client generation doc link. PR [#13571](https://github.com/fastapi/fastapi/pull/13571) by [@EFord36](https://github.com/EFord36). +* âœī¸ Fix talk information typo. PR [#13544](https://github.com/fastapi/fastapi/pull/13544) by [@blueswen](https://github.com/blueswen). +* 📝 Add External Link: Taiwanese talk on FastAPI with observability . PR [#13527](https://github.com/fastapi/fastapi/pull/13527) by [@blueswen](https://github.com/blueswen). + +### Translations + +* 🌐 Add Russian Translation for `docs/ru/docs/advanced/response-change-status-code.md`. PR [#13791](https://github.com/fastapi/fastapi/pull/13791) by [@NavesSapnis](https://github.com/NavesSapnis). +* 🌐 Add Persian translation for `docs/fa/docs/learn/index.md`. PR [#13518](https://github.com/fastapi/fastapi/pull/13518) by [@Mohammad222PR](https://github.com/Mohammad222PR). +* 🌐 Add Korean translation for `docs/ko/docs/advanced/sub-applications.md`. PR [#4543](https://github.com/fastapi/fastapi/pull/4543) by [@NinaHwang](https://github.com/NinaHwang). +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/schema-extra-example.md`. PR [#13769](https://github.com/fastapi/fastapi/pull/13769) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). +* âœī¸ Remove redundant words in docs/zh/docs/python-types.md. PR [#13774](https://github.com/fastapi/fastapi/pull/13774) by [@CharleeWa](https://github.com/CharleeWa). +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/query-param-models.md`. PR [#13748](https://github.com/fastapi/fastapi/pull/13748) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). +* 🌐 Add Bengali translation for `docs/bn/docs/environment-variables.md`. PR [#13629](https://github.com/fastapi/fastapi/pull/13629) by [@SakibSibly](https://github.com/SakibSibly). +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/query-params-str-validations.md` page. PR [#13546](https://github.com/fastapi/fastapi/pull/13546) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). +* 🌐 Add Russian translation for `docs/ru/docs/tutorial/cookie-param-models.md`. PR [#13616](https://github.com/fastapi/fastapi/pull/13616) by [@EgorOnishchuk](https://github.com/EgorOnishchuk). +* 🌐 Add Korean translation for `docs/ko/docs/tutorial/extra-models.md`. PR [#13063](https://github.com/fastapi/fastapi/pull/13063) by [@timothy-jeong](https://github.com/timothy-jeong). +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/path-params-numeric-validations.md` page. PR [#13548](https://github.com/fastapi/fastapi/pull/13548) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/middleware.md` page. PR [#13520](https://github.com/fastapi/fastapi/pull/13520) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/background-tasks.md` page. PR [#13502](https://github.com/fastapi/fastapi/pull/13502) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/cors.md` page. PR [#13519](https://github.com/fastapi/fastapi/pull/13519) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). +* 🌐 Update Korean translation for `docs/ko/docs/advanced/events.md`. PR [#13487](https://github.com/fastapi/fastapi/pull/13487) by [@bom1215](https://github.com/bom1215). +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/handling-errors.md` page. PR [#13420](https://github.com/fastapi/fastapi/pull/13420) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). +* 🌐 Add Russian translation for `docs/ru/docs/tutorial/request-form-models.md`. PR [#13552](https://github.com/fastapi/fastapi/pull/13552) by [@EgorOnishchuk](https://github.com/EgorOnishchuk). +* 📝 Fix internal anchor link in Spanish deployment docs. PR [#13737](https://github.com/fastapi/fastapi/pull/13737) by [@fabianfalon](https://github.com/fabianfalon). +* 🌐 Update Korean translation for `docs/ko/docs/virtual-environments.md`. PR [#13630](https://github.com/fastapi/fastapi/pull/13630) by [@sungchan1](https://github.com/sungchan1). +* 🌐 Add Russian translation for `docs/ru/docs/tutorial/header-param-models.md`. PR [#13526](https://github.com/fastapi/fastapi/pull/13526) by [@minaton-ru](https://github.com/minaton-ru). +* 🌐 Update Chinese translation for `docs/zh/docs/tutorial/index.md`. PR [#13374](https://github.com/fastapi/fastapi/pull/13374) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng). +* 🌐 Update Chinese translation for `docs/zh/docs/deployment/manually.md`. PR [#13324](https://github.com/fastapi/fastapi/pull/13324) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng). +* 🌐 Update Chinese translation for `docs/zh/docs/deployment/server-workers.md`. PR [#13292](https://github.com/fastapi/fastapi/pull/13292) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng). +* 🌐 Update Chinese translation for `docs/zh/docs/tutorial/first-steps.md`. PR [#13348](https://github.com/fastapi/fastapi/pull/13348) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng). + +### Internal + +* 🔨 Resolve Pydantic deprecation warnings in internal script. PR [#13696](https://github.com/fastapi/fastapi/pull/13696) by [@emmanuel-ferdman](https://github.com/emmanuel-ferdman). +* 🔧 Update sponsors: remove Porter. PR [#13783](https://github.com/fastapi/fastapi/pull/13783) by [@tiangolo](https://github.com/tiangolo). +* âŦ† [pre-commit.ci] pre-commit autoupdate. PR [#13781](https://github.com/fastapi/fastapi/pull/13781) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). +* âŦ† [pre-commit.ci] pre-commit autoupdate. PR [#13757](https://github.com/fastapi/fastapi/pull/13757) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). +* âŦ† Bump griffe-typingdoc from 0.2.7 to 0.2.8. PR [#13751](https://github.com/fastapi/fastapi/pull/13751) by [@dependabot[bot]](https://github.com/apps/dependabot). +* 🍱 Update sponsors: Dribia badge size. PR [#13773](https://github.com/fastapi/fastapi/pull/13773) by [@tiangolo](https://github.com/tiangolo). +* 🔧 Update sponsors: add Dribia. PR [#13771](https://github.com/fastapi/fastapi/pull/13771) by [@tiangolo](https://github.com/tiangolo). +* âŦ† Bump typer from 0.15.3 to 0.16.0. PR [#13752](https://github.com/fastapi/fastapi/pull/13752) by [@dependabot[bot]](https://github.com/apps/dependabot). +* đŸ‘Ĩ Update FastAPI GitHub topic repositories. PR [#13754](https://github.com/fastapi/fastapi/pull/13754) by [@tiangolo](https://github.com/tiangolo). +* đŸ‘Ĩ Update FastAPI People - Sponsors. PR [#13750](https://github.com/fastapi/fastapi/pull/13750) by [@tiangolo](https://github.com/tiangolo). +* đŸ‘Ĩ Update FastAPI People - Contributors and Translators. PR [#13749](https://github.com/fastapi/fastapi/pull/13749) by [@tiangolo](https://github.com/tiangolo). +* âŦ† [pre-commit.ci] pre-commit autoupdate. PR [#13736](https://github.com/fastapi/fastapi/pull/13736) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). +* 🔧 Update sponsors: Add InterviewPal. PR [#13728](https://github.com/fastapi/fastapi/pull/13728) by [@tiangolo](https://github.com/tiangolo). +* 🔧 Remove Google Analytics. PR [#13727](https://github.com/fastapi/fastapi/pull/13727) by [@tiangolo](https://github.com/tiangolo). +* 🔧 Update sponsors: remove MongoDB. PR [#13725](https://github.com/fastapi/fastapi/pull/13725) by [@tiangolo](https://github.com/tiangolo). +* âŦ† [pre-commit.ci] pre-commit autoupdate. PR [#13711](https://github.com/fastapi/fastapi/pull/13711) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). +* 🔧 Update sponsors: add Subtotal. PR [#13701](https://github.com/fastapi/fastapi/pull/13701) by [@tiangolo](https://github.com/tiangolo). +* 🔧 Update sponsors: remove deepset / Haystack. PR [#13700](https://github.com/fastapi/fastapi/pull/13700) by [@tiangolo](https://github.com/tiangolo). +* âŦ† [pre-commit.ci] pre-commit autoupdate. PR [#13688](https://github.com/fastapi/fastapi/pull/13688) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). +* đŸ‘Ĩ Update FastAPI People - Experts. PR [#13671](https://github.com/fastapi/fastapi/pull/13671) by [@tiangolo](https://github.com/tiangolo). +* âŦ† Bump typer from 0.12.5 to 0.15.3. PR [#13666](https://github.com/fastapi/fastapi/pull/13666) by [@dependabot[bot]](https://github.com/apps/dependabot). +* âŦ† Bump sqlmodel from 0.0.23 to 0.0.24. PR [#13665](https://github.com/fastapi/fastapi/pull/13665) by [@dependabot[bot]](https://github.com/apps/dependabot). +* 🔧 Update Sponsors: Zuplo logo and alt text. PR [#13645](https://github.com/fastapi/fastapi/pull/13645) by [@martyndavies](https://github.com/martyndavies). +* đŸ‘Ĩ Update FastAPI GitHub topic repositories. PR [#13667](https://github.com/fastapi/fastapi/pull/13667) by [@tiangolo](https://github.com/tiangolo). +* 🔧 Update links for LinkedIn and bottom. PR [#13669](https://github.com/fastapi/fastapi/pull/13669) by [@tiangolo](https://github.com/tiangolo). +* 🔧 Update sponsors: remove Bump.sh and Coherence. PR [#13668](https://github.com/fastapi/fastapi/pull/13668) by [@tiangolo](https://github.com/tiangolo). +* đŸ‘Ĩ Update FastAPI People - Sponsors. PR [#13664](https://github.com/fastapi/fastapi/pull/13664) by [@tiangolo](https://github.com/tiangolo). +* đŸ‘Ĩ Update FastAPI People - Contributors and Translators. PR [#13662](https://github.com/fastapi/fastapi/pull/13662) by [@tiangolo](https://github.com/tiangolo). +* âŦ† [pre-commit.ci] pre-commit autoupdate. PR [#13656](https://github.com/fastapi/fastapi/pull/13656) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). +* ✅ Use `inline-snapshot` to support different Pydantic versions in the test suite. PR [#12534](https://github.com/fastapi/fastapi/pull/12534) by [@15r10nk](https://github.com/15r10nk). +* âŦ† Bump astral-sh/setup-uv from 5 to 6. PR [#13648](https://github.com/fastapi/fastapi/pull/13648) by [@dependabot[bot]](https://github.com/apps/dependabot). +* âŦ† [pre-commit.ci] pre-commit autoupdate. PR [#13634](https://github.com/fastapi/fastapi/pull/13634) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). +* âŦ† [pre-commit.ci] pre-commit autoupdate. PR [#13619](https://github.com/fastapi/fastapi/pull/13619) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). +* âŦ† [pre-commit.ci] pre-commit autoupdate. PR [#13594](https://github.com/fastapi/fastapi/pull/13594) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). +* đŸ‘Ĩ Update FastAPI People - Experts. PR [#13568](https://github.com/fastapi/fastapi/pull/13568) by [@tiangolo](https://github.com/tiangolo). +* đŸ‘Ĩ Update FastAPI GitHub topic repositories. PR [#13565](https://github.com/fastapi/fastapi/pull/13565) by [@tiangolo](https://github.com/tiangolo). +* đŸ‘Ĩ Update FastAPI People - Sponsors. PR [#13559](https://github.com/fastapi/fastapi/pull/13559) by [@tiangolo](https://github.com/tiangolo). +* đŸ‘Ĩ Update FastAPI People - Contributors and Translators. PR [#13558](https://github.com/fastapi/fastapi/pull/13558) by [@tiangolo](https://github.com/tiangolo). +* âŦ† Bump dirty-equals from 0.8.0 to 0.9.0. PR [#13561](https://github.com/fastapi/fastapi/pull/13561) by [@dependabot[bot]](https://github.com/apps/dependabot). +* 🔧 Clean up `docs/en/mkdocs.yml` configuration file. PR [#13542](https://github.com/fastapi/fastapi/pull/13542) by [@svlandeg](https://github.com/svlandeg). +* âŦ† [pre-commit.ci] pre-commit autoupdate. PR [#12986](https://github.com/fastapi/fastapi/pull/12986) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). + +## 0.115.12 + +### Fixes + +* 🐛 Fix `convert_underscores=False` for header Pydantic models. PR [#13515](https://github.com/fastapi/fastapi/pull/13515) by [@tiangolo](https://github.com/tiangolo). + +### Docs + +* 📝 Update `docs/en/docs/tutorial/middleware.md`. PR [#13444](https://github.com/fastapi/fastapi/pull/13444) by [@Rishat-F](https://github.com/Rishat-F). +* đŸ‘Ĩ Update FastAPI People - Experts. PR [#13493](https://github.com/fastapi/fastapi/pull/13493) by [@tiangolo](https://github.com/tiangolo). + ### Translations +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/metadata.md` page. PR [#13459](https://github.com/fastapi/fastapi/pull/13459) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/response-status-code.md` page. PR [#13462](https://github.com/fastapi/fastapi/pull/13462) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/cookie-param-models.md` page. PR [#13460](https://github.com/fastapi/fastapi/pull/13460) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/header-param-models.md` page. PR [#13461](https://github.com/fastapi/fastapi/pull/13461) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). +* 🌐 Add Japanese translation for `docs/ja/docs/virtual-environments.md`. PR [#13304](https://github.com/fastapi/fastapi/pull/13304) by [@k94-ishi](https://github.com/k94-ishi). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/security/oauth2-jwt.md`. PR [#13333](https://github.com/fastapi/fastapi/pull/13333) by [@yes0ng](https://github.com/yes0ng). * 🌐 Add Vietnamese translation for `docs/vi/docs/deployment/cloud.md`. PR [#13407](https://github.com/fastapi/fastapi/pull/13407) by [@ptt3199](https://github.com/ptt3199). ### Internal +* âŦ† Bump pydantic-ai from 0.0.15 to 0.0.30. PR [#13438](https://github.com/fastapi/fastapi/pull/13438) by [@dependabot[bot]](https://github.com/apps/dependabot). * âŦ† Bump sqlmodel from 0.0.22 to 0.0.23. PR [#13437](https://github.com/fastapi/fastapi/pull/13437) by [@dependabot[bot]](https://github.com/apps/dependabot). * âŦ† Bump black from 24.10.0 to 25.1.0. PR [#13436](https://github.com/fastapi/fastapi/pull/13436) by [@dependabot[bot]](https://github.com/apps/dependabot). * âŦ† Bump ruff to 0.9.4. PR [#13299](https://github.com/fastapi/fastapi/pull/13299) by [@dependabot[bot]](https://github.com/apps/dependabot). diff --git a/docs/en/docs/tutorial/bigger-applications.md b/docs/en/docs/tutorial/bigger-applications.md index 605ced0d3..f5f29a173 100644 --- a/docs/en/docs/tutorial/bigger-applications.md +++ b/docs/en/docs/tutorial/bigger-applications.md @@ -52,7 +52,7 @@ from app.routers import items * There's also a subdirectory `app/internal/` with another file `__init__.py`, so it's another "Python subpackage": `app.internal`. * And the file `app/internal/admin.py` is another submodule: `app.internal.admin`. - + The same file structure with comments: @@ -270,7 +270,7 @@ But that file doesn't exist, our dependencies are in a file at `app/dependencies Remember how our app/file structure looks like: - + --- diff --git a/docs/en/docs/tutorial/cors.md b/docs/en/docs/tutorial/cors.md index cf31cfcf5..5ca4437b3 100644 --- a/docs/en/docs/tutorial/cors.md +++ b/docs/en/docs/tutorial/cors.md @@ -57,7 +57,10 @@ The following arguments are supported: * `allow_origin_regex` - A regex string to match against origins that should be permitted to make cross-origin requests. e.g. `'https://.*\.example\.org'`. * `allow_methods` - A list of HTTP methods that should be allowed for cross-origin requests. Defaults to `['GET']`. You can use `['*']` to allow all standard methods. * `allow_headers` - A list of HTTP request headers that should be supported for cross-origin requests. Defaults to `[]`. You can use `['*']` to allow all headers. The `Accept`, `Accept-Language`, `Content-Language` and `Content-Type` headers are always allowed for simple CORS requests. -* `allow_credentials` - Indicate that cookies should be supported for cross-origin requests. Defaults to `False`. Also, `allow_origins` cannot be set to `['*']` for credentials to be allowed, origins must be specified. +* `allow_credentials` - Indicate that cookies should be supported for cross-origin requests. Defaults to `False`. + + None of `allow_origins`, `allow_methods` and `allow_headers` can be set to `['*']` if `allow_credentials` is set to `True`. All of them must be explicitly specified. + * `expose_headers` - Indicate any response headers that should be made accessible to the browser. Defaults to `[]`. * `max_age` - Sets a maximum time in seconds for browsers to cache CORS responses. Defaults to `600`. diff --git a/docs/en/docs/tutorial/handling-errors.md b/docs/en/docs/tutorial/handling-errors.md index 4d969747f..5b8e677e4 100644 --- a/docs/en/docs/tutorial/handling-errors.md +++ b/docs/en/docs/tutorial/handling-errors.md @@ -35,7 +35,7 @@ Because it's a Python exception, you don't `return` it, you `raise` it. This also means that if you are inside a utility function that you are calling inside of your *path operation function*, and you raise the `HTTPException` from inside of that utility function, it won't run the rest of the code in the *path operation function*, it will terminate that request right away and send the HTTP error from the `HTTPException` to the client. -The benefit of raising an exception over `return`ing a value will be more evident in the section about Dependencies and Security. +The benefit of raising an exception over returning a value will be more evident in the section about Dependencies and Security. In this example, when the client requests an item by an ID that doesn't exist, raise an exception with a status code of `404`: @@ -252,4 +252,4 @@ If you want to use the exception along with the same default exception handlers {* ../../docs_src/handling_errors/tutorial006.py hl[2:5,15,21] *} -In this example you are just `print`ing the error with a very expressive message, but you get the idea. You can use the exception and then just reuse the default exception handlers. +In this example you are just printing the error with a very expressive message, but you get the idea. You can use the exception and then just reuse the default exception handlers. diff --git a/docs/en/docs/tutorial/header-param-models.md b/docs/en/docs/tutorial/header-param-models.md index 73950a668..4cdf09705 100644 --- a/docs/en/docs/tutorial/header-param-models.md +++ b/docs/en/docs/tutorial/header-param-models.md @@ -51,6 +51,22 @@ For example, if the client tries to send a `tool` header with a value of `plumbu } ``` +## Disable Convert Underscores + +The same way as with regular header parameters, when you have underscore characters in the parameter names, they are **automatically converted to hyphens**. + +For example, if you have a header parameter `save_data` in the code, the expected HTTP header will be `save-data`, and it will show up like that in the docs. + +If for some reason you need to disable this automatic conversion, you can do it as well for Pydantic models for header parameters. + +{* ../../docs_src/header_param_models/tutorial003_an_py310.py hl[19] *} + +/// warning + +Before setting `convert_underscores` to `False`, bear in mind that some HTTP proxies and servers disallow the usage of headers with underscores. + +/// + ## Summary You can use **Pydantic models** to declare **headers** in **FastAPI**. 😎 diff --git a/docs/en/docs/tutorial/index.md b/docs/en/docs/tutorial/index.md index 4fe38256c..17f6fb685 100644 --- a/docs/en/docs/tutorial/index.md +++ b/docs/en/docs/tutorial/index.md @@ -76,10 +76,12 @@ $ pip install "fastapi[standard]" /// note -When you install with `pip install "fastapi[standard]"` it comes with some default optional standard dependencies. +When you install with `pip install "fastapi[standard]"` it comes with some default optional standard dependencies, including `fastapi-cloud-cli`, which allows you to deploy to FastAPI Cloud. If you don't want to have those optional dependencies, you can instead install `pip install fastapi`. +If you want to install the standard dependencies but without the `fastapi-cloud-cli`, you can install with `pip install "fastapi[standard-no-fastapi-cloud-cli]"`. + /// ## Advanced User Guide diff --git a/docs/en/docs/tutorial/middleware.md b/docs/en/docs/tutorial/middleware.md index 53c47a085..b7c03a319 100644 --- a/docs/en/docs/tutorial/middleware.md +++ b/docs/en/docs/tutorial/middleware.md @@ -15,7 +15,7 @@ A "middleware" is a function that works with every **request** before it is proc If you have dependencies with `yield`, the exit code will run *after* the middleware. -If there were any background tasks (documented later), they will run *after* all the middleware. +If there were any background tasks (covered in the [Background Tasks](background-tasks.md){.internal-link target=_blank} section, you will see it later), they will run *after* all the middleware. /// @@ -65,6 +65,29 @@ Here we use - - Thanks for your feedback! - - icon: material/emoticon-sad-outline - name: This page could be improved - data: 0 - note: >- - Thanks for your feedback! social: - icon: fontawesome/brands/github-alt link: https://github.com/fastapi/fastapi @@ -331,14 +297,9 @@ extra: - icon: fontawesome/brands/twitter link: https://twitter.com/fastapi - icon: fontawesome/brands/linkedin - link: https://www.linkedin.com/in/tiangolo - - icon: fontawesome/brands/dev - link: https://dev.to/tiangolo - - icon: fontawesome/brands/medium - link: https://medium.com/@tiangolo + link: https://www.linkedin.com/company/fastapi - icon: fontawesome/solid/globe link: https://tiangolo.com - alternate: - link: / name: en - English @@ -390,14 +351,11 @@ extra: name: zh-hant - įšéĢ”ä¸­æ–‡ - link: /em/ name: 😉 - extra_css: - css/termynal.css - css/custom.css - extra_javascript: - js/termynal.js - js/custom.js - hooks: - ../../scripts/mkdocs_hooks.py diff --git a/docs/en/overrides/main.html b/docs/en/overrides/main.html index 30973bfcb..22630e188 100644 --- a/docs/en/overrides/main.html +++ b/docs/en/overrides/main.html @@ -10,6 +10,13 @@ Follow @fastapi on Twitter to stay updated +
+ + + {% include ".icons/fontawesome/brands/linkedin.svg" %} + Follow FastAPI on LinkedIn to stay updated + +
@@ -17,9 +24,6 @@ Subscribe to the FastAPI and friends newsletter 🎉
-
- You can now sponsor FastAPI 🍰 -
@@ -34,18 +38,6 @@
-
- - - - -
-
- - - - -
@@ -58,18 +50,6 @@
-
- - - - -
-
- - - - -
@@ -94,6 +74,18 @@
+
+ + + + +
+
+ + + + +
{% endblock %} diff --git a/docs/es/docs/advanced/generate-clients.md b/docs/es/docs/advanced/generate-clients.md index bf2e5cb4f..b664bceac 100644 --- a/docs/es/docs/advanced/generate-clients.md +++ b/docs/es/docs/advanced/generate-clients.md @@ -22,7 +22,7 @@ Y muestra su verdadero compromiso con FastAPI y su **comunidad** (tÃē), ya que n Por ejemplo, podrías querer probar: -* Speakeasy +* Speakeasy * Stainless * liblab diff --git a/docs/es/docs/deployment/concepts.md b/docs/es/docs/deployment/concepts.md index f5725c5dc..bcc7948bc 100644 --- a/docs/es/docs/deployment/concepts.md +++ b/docs/es/docs/deployment/concepts.md @@ -216,7 +216,7 @@ Este Proceso Administrador probablemente sería el que escuche en el **puerto** Esos worker processes serían los que ejecutan tu aplicaciÃŗn, realizarían los cÃĄlculos principales para recibir un **request** y devolver un **response**, y cargarían cualquier cosa que pongas en variables en RAM. - + Y por supuesto, la misma mÃĄquina probablemente tendría **otros procesos** ejecutÃĄndose tambiÊn, aparte de tu aplicaciÃŗn. diff --git a/docs/es/docs/deployment/docker.md b/docs/es/docs/deployment/docker.md index ff204f078..3a39d3661 100644 --- a/docs/es/docs/deployment/docker.md +++ b/docs/es/docs/deployment/docker.md @@ -6,7 +6,7 @@ Usar contenedores de Linux tiene varias ventajas, incluyendo **seguridad**, **re /// tip | Consejo -ÂŋTienes prisa y ya conoces esto? Salta al [`Dockerfile` mÃĄs abajo 👇](#build-a-docker-image-for-fastapi). +ÂŋTienes prisa y ya conoces esto? Salta al [`Dockerfile` mÃĄs abajo 👇](#construir-una-imagen-de-docker-para-fastapi). /// diff --git a/docs/es/docs/deployment/https.md b/docs/es/docs/deployment/https.md index f2871ac03..3ccb5dc47 100644 --- a/docs/es/docs/deployment/https.md +++ b/docs/es/docs/deployment/https.md @@ -85,7 +85,7 @@ Primero, el navegador consultaría con los **servidores DNS** cuÃĄl es la **IP d Los servidores DNS le dirían al navegador que use una **direcciÃŗn IP** específica. Esa sería la direcciÃŗn IP pÃēblica utilizada por tu servidor, que configuraste en los servidores DNS. - + ### Inicio del Handshake TLS @@ -93,7 +93,7 @@ El navegador luego se comunicaría con esa direcciÃŗn IP en el **puerto 443** (e La primera parte de la comunicaciÃŗn es solo para establecer la conexiÃŗn entre el cliente y el servidor y decidir las claves criptogrÃĄficas que usarÃĄn, etc. - + Esta interacciÃŗn entre el cliente y el servidor para establecer la conexiÃŗn TLS se llama **handshake TLS**. @@ -111,7 +111,7 @@ Usando la **extensiÃŗn SNI** discutida anteriormente, el TLS Termination Proxy v En este caso, usaría el certificado para `someapp.example.com`. - + El cliente ya **confía** en la entidad que generÃŗ ese certificado TLS (en este caso Let's Encrypt, pero lo veremos mÃĄs adelante), por lo que puede **verificar** que el certificado sea vÃĄlido. @@ -133,19 +133,19 @@ Ahora que el cliente y el servidor (específicamente el navegador y el TLS Termi Así que, el cliente envía un **request HTTPS**. Esto es simplemente un request HTTP a travÊs de una conexiÃŗn TLS encriptada. - + ### Desencriptar el Request El TLS Termination Proxy usaría la encriptaciÃŗn acordada para **desencriptar el request**, y transmitiría el **request HTTP simple (desencriptado)** al proceso que ejecuta la aplicaciÃŗn (por ejemplo, un proceso con Uvicorn ejecutando la aplicaciÃŗn FastAPI). - + ### Response HTTP La aplicaciÃŗn procesaría el request y enviaría un **response HTTP simple (sin encriptar)** al TLS Termination Proxy. - + ### Response HTTPS @@ -153,7 +153,7 @@ El TLS Termination Proxy entonces **encriptaría el response** usando la criptog Luego, el navegador verificaría que el response sea vÃĄlido y encriptado con la clave criptogrÃĄfica correcta, etc. Entonces **desencriptaría el response** y lo procesaría. - + El cliente (navegador) sabrÃĄ que el response proviene del servidor correcto porque estÃĄ utilizando la criptografía que acordaron usando el **certificado HTTPS** anteriormente. @@ -163,7 +163,7 @@ En el mismo servidor (o servidores), podrían haber **mÃēltiples aplicaciones**, Solo un proceso puede estar gestionando la IP y puerto específica (el TLS Termination Proxy en nuestro ejemplo) pero las otras aplicaciones/procesos pueden estar ejecutÃĄndose en el/los servidor(es) tambiÊn, siempre y cuando no intenten usar la misma **combinaciÃŗn de IP pÃēblica y puerto**. - + De esa manera, el TLS Termination Proxy podría gestionar HTTPS y certificados para **mÃēltiples dominios**, para mÃēltiples aplicaciones, y luego transmitir los requests a la aplicaciÃŗn correcta en cada caso. @@ -173,7 +173,7 @@ En algÃēn momento en el futuro, cada certificado **expiraría** (alrededor de 3 Y entonces, habría otro programa (en algunos casos es otro programa, en algunos casos podría ser el mismo TLS Termination Proxy) que hablaría con Let's Encrypt y renovaría el/los certificado(s). - + Los **certificados TLS** estÃĄn **asociados con un nombre de dominio**, no con una direcciÃŗn IP. diff --git a/docs/es/docs/how-to/custom-docs-ui-assets.md b/docs/es/docs/how-to/custom-docs-ui-assets.md index 444cf167e..0a03ff330 100644 --- a/docs/es/docs/how-to/custom-docs-ui-assets.md +++ b/docs/es/docs/how-to/custom-docs-ui-assets.md @@ -98,7 +98,7 @@ Probablemente puedas hacer clic derecho en cada enlace y seleccionar una opciÃŗn Y **ReDoc** utiliza el archivo: -* `redoc.standalone.js` +* `redoc.standalone.js` DespuÊs de eso, tu estructura de archivos podría verse así: @@ -129,14 +129,8 @@ Deberías ver un archivo JavaScript muy largo de **ReDoc**. Podría comenzar con algo como: ```JavaScript -/*! - * ReDoc - OpenAPI/Swagger-generated API Reference Documentation - * ------------------------------------------------------------- - * Version: "2.0.0-rc.18" - * Repo: https://github.com/Redocly/redoc - */ -!function(e,t){"object"==typeof exports&&"object"==typeof m - +/*! For license information please see redoc.standalone.js.LICENSE.txt */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("null")): ... ``` diff --git a/docs/es/docs/tutorial/bigger-applications.md b/docs/es/docs/tutorial/bigger-applications.md index 78165ef05..c3d8f0686 100644 --- a/docs/es/docs/tutorial/bigger-applications.md +++ b/docs/es/docs/tutorial/bigger-applications.md @@ -52,7 +52,7 @@ from app.routers import items * TambiÊn hay un subdirectorio `app/internal/` con otro archivo `__init__.py`, por lo que es otro "subpaquete de Python": `app.internal`. * Y el archivo `app/internal/admin.py` es otro submÃŗdulo: `app.internal.admin`. - + La misma estructura de archivos con comentarios: @@ -270,7 +270,7 @@ Pero ese archivo no existe, nuestras dependencias estÃĄn en un archivo en `app/d Recuerda cÃŗmo se ve nuestra estructura de aplicaciÃŗn/archivo: - + --- diff --git a/docs/es/llm-prompt.md b/docs/es/llm-prompt.md index 3340dbc99..936ed9bba 100644 --- a/docs/es/llm-prompt.md +++ b/docs/es/llm-prompt.md @@ -4,56 +4,6 @@ Use the informal grammar (use "tÃē" instead of "usted"). For instructions or titles in imperative, keep them in imperative, for example "Edit it" to "Edítalo". -There are special blocks of notes, tips and others that look like: - -/// note - -To translate it, keep the same line and add the translation after a vertical bar: - -/// note | Nota - -Some examples: - -Source: - -/// tip - -Result: - -/// tip | Consejo - -Source: - -/// details | Preview - -Result: - -/// details | Vista previa - -Source: - -/// warning - -Result: - -/// warning | Advertencia - -Source: - -/// info - -Result: - -/// info | InformaciÃŗn - -Source: - -/// note | Technical Details - -Result: - -/// note | Detalles TÊcnicos - --- For the next terms, use the following translations: diff --git a/docs/fa/docs/async.md b/docs/fa/docs/async.md new file mode 100644 index 000000000..e07374862 --- /dev/null +++ b/docs/fa/docs/async.md @@ -0,0 +1,444 @@ +# Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†ÛŒ ؈ async / await + +ØŦØ˛ØĻیاØĒ Ø¯Øą Ų…ŲˆØąØ¯ ØŗÛŒŲ†ØĒÚŠØŗ `async def` Ø¨ØąØ§ÛŒ *ØĒŲˆØ§Ø¨Øš ØšŲ…Ų„ÛŒØ§ØĒ Ų…ØŗÛŒØą* ؈ ÛŒŲ‡ ÚŠŲ… ŲžÛŒØ´â€ŒØ˛Ų…ÛŒŲ†Ų‡ Ø¯Øą Ų…ŲˆØąØ¯ ڊد Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†ØŒ Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†ÛŒ ؈ Ų…ŲˆØ§Ø˛ÛŒâ€ŒØŗØ§Ø˛ÛŒ. + +## ØšØŦŲ„Ų‡ Ø¯Ø§ØąÛŒØŸ + +TL;DR: + +Ø§Ú¯Ų‡ Ø§Ø˛ ÚŠØĒØ§Ø¨ØŽŲˆŲ†Ų‡â€ŒŲ‡Ø§ÛŒ ØŗŲˆŲ…â€ŒØ´ØŽØĩی Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒÚŠŲ†ÛŒ ÚŠŲ‡ Ø¨Ų‡ØĒ Ų…ÛŒâ€ŒÚ¯Ų† با `await` ØĩØ¯Ø§Ø´ŲˆŲ† ÚŠŲ†ÛŒØŒ Ų…ØĢŲ„: + +```Python +results = await some_library() +``` + +Ø§ŲˆŲ† ŲˆŲ‚ØĒ، *ØĒŲˆØ§Ø¨Øš ØšŲ…Ų„ÛŒØ§ØĒ Ų…ØŗÛŒØąØĒ* ØąŲˆ با `async def` ØĒØšØąÛŒŲ ÚŠŲ†ØŒ Ø§ÛŒŲ†ØŦŲˆØąÛŒ: + +```Python hl_lines="2" +@app.get('/') +async def read_results(): + results = await some_library() + return results +``` + +/// note + +ŲŲ‚Øˇ ØĒŲˆÛŒ ØĒŲˆØ§Ø¨ØšÛŒ ÚŠŲ‡ با `async def` ØŗØ§ØŽØĒŲ‡ Ø´Ø¯Ų† Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ø§Ø˛ `await` Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒ. + +/// + +--- + +Ø§Ú¯Ų‡ Ø§Ø˛ ÛŒŲ‡ ÚŠØĒØ§Ø¨ØŽŲˆŲ†Ų‡ ØŗŲˆŲ…â€ŒØ´ØŽØĩ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒÚŠŲ†ÛŒ ÚŠŲ‡ با ÛŒŲ‡ Ú†ÛŒØ˛ÛŒ (Ų…ØĢŲ„ دیØĒØ§Ø¨ÛŒØŗØŒ API، ØŗÛŒØŗØĒŲ… ŲØ§ÛŒŲ„ ؈ ØēÛŒØąŲ‡) Ø§ØąØĒØ¨Ø§Øˇ Ø¯Ø§ØąŲ‡ ؈ Ø§Ø˛ `await` ŲžØ´ØĒÛŒØ¨Ø§Ų†ÛŒ Ų†Ų…ÛŒâ€ŒÚŠŲ†Ų‡ (ÚŠŲ‡ Ø§Ų„Ø§Ų† Ø¨ØąØ§ÛŒ بیشØĒØą ÚŠØĒØ§Ø¨ØŽŲˆŲ†Ų‡â€ŒŲ‡Ø§ÛŒ دیØĒØ§Ø¨ÛŒØŗ Ø§ÛŒŲ†ØŦŲˆØąÛŒŲ‡)، Ø§ŲˆŲ† ŲˆŲ‚ØĒ *ØĒŲˆØ§Ø¨Øš ØšŲ…Ų„ÛŒØ§ØĒ Ų…ØŗÛŒØąØĒ* ØąŲˆ ؚادی، ŲŲ‚Øˇ با `def` ØĒØšØąÛŒŲ ÚŠŲ†ØŒ Ø§ÛŒŲ†ØŦŲˆØąÛŒ: + +```Python hl_lines="2" +@app.get('/') +def results(): + results = some_library() + return results +``` + +--- + +Ø§Ú¯Ų‡ Ø¨ØąŲ†Ø§Ų…Ų‡â€ŒØ§ØĒ (Ø¨Ų‡ Ų‡Øą Ø¯Ų„ÛŒŲ„ÛŒ) Ų„Ø§Ø˛Ų… Ų†ÛŒØŗØĒ با Ú†ÛŒØ˛ Ø¯ÛŒÚ¯Ų‡â€ŒØ§ÛŒ Ø§ØąØĒØ¨Ø§Øˇ Ø¨ØąŲ‚ØąØ§Øą ÚŠŲ†Ų‡ ؈ Ų…Ų†ØĒØ¸Øą ØŦŲˆØ§Ø¨Ø´ Ø¨Ų…ŲˆŲ†Ų‡ØŒ Ø§Ø˛ `async def` Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†. + +--- + +Ø§Ú¯Ų‡ Ų†Ų…ÛŒâ€ŒØ¯ŲˆŲ†ÛŒ Ú†ÛŒÚŠØ§Øą ÚŠŲ†ÛŒØŒ Ø§Ø˛ `def` Ų…ØšŲ…ŲˆŲ„ÛŒ Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†. + +--- + +**ØĒ؈ØŦŲ‡**: Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ ØĒŲˆÛŒ *ØĒŲˆØ§Ø¨Øš ØšŲ…Ų„ÛŒØ§ØĒ Ų…ØŗÛŒØąØĒ* Ų‡Øą Ú†Ų‚Ø¯Øą ÚŠŲ‡ Ų„Ø§Ø˛Ų… Ø¯Ø§ØąÛŒ `def` ؈ `async def` ØąŲˆ Ų‚Ø§ØˇÛŒ ÚŠŲ†ÛŒ ؈ Ų‡Øą ÚŠØ¯ŲˆŲ… ØąŲˆ با Ø¨Ų‡ØĒØąÛŒŲ† Ú¯Ø˛ÛŒŲ†Ų‡ Ø¨ØąØ§ØĒ ØĒØšØąÛŒŲ ÚŠŲ†ÛŒ. FastAPI ØŽŲˆØ¯Ø´ ÚŠØ§Øą Ø¯ØąØŗØĒ ØąŲˆ Ø¨Ø§Ų‡Ø§Ø´ŲˆŲ† Ø§Ų†ØŦØ§Ų… Ų…ÛŒâ€ŒØ¯Ų‡. + +Ø¨Ų‡ Ų‡Øą Ø­Ø§Ų„ØŒ ØĒŲˆÛŒ Ų‡Øą ÚŠØ¯ŲˆŲ… Ø§Ø˛ Ų…ŲˆŲ‚ØšÛŒØĒâ€ŒŲ‡Ø§ÛŒ Ø¨Ø§Ų„Ø§ØŒ FastAPI Ų‡Ų†ŲˆØ˛ Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų† ÚŠØ§Øą Ų…ÛŒâ€ŒÚŠŲ†Ų‡ ؈ ØŽÛŒŲ„ÛŒ ØŽÛŒŲ„ÛŒ ØŗØąÛŒØš Ų‡ØŗØĒ. + +ŲˆŲ„ÛŒ با Ø¯Ų†Ø¨Ø§Ų„ ÚŠØąØ¯Ų† Ų…ØąØ§Ø­Ų„ Ø¨Ø§Ų„Ø§ØŒ Ų…ÛŒâ€ŒØĒŲˆŲ†Ų‡ ÛŒŲ‡ ØŗØąÛŒ Ø¨Ų‡ÛŒŲ†Ų‡â€ŒØŗØ§Ø˛ÛŒ ØšŲ…Ų„ÚŠØąØ¯ Ų‡Ų… Ø¨ÚŠŲ†Ų‡. + +## ØŦØ˛ØĻیاØĒ ŲŲ†ÛŒ + +Ų†ØŗØŽŲ‡â€ŒŲ‡Ø§ÛŒ Ų…Ø¯ØąŲ† ŲžØ§ÛŒØĒŲˆŲ† Ø§Ø˛ **"ڊد Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†"** با Ú†ÛŒØ˛ÛŒ ÚŠŲ‡ Ø¨Ų‡Ø´ **"ÚŠØąŲˆØĒÛŒŲ†"** Ų…ÛŒâ€ŒÚ¯Ų† ŲžØ´ØĒÛŒØ¨Ø§Ų†ÛŒ Ų…ÛŒâ€ŒÚŠŲ†Ų†ØŒ با ØŗÛŒŲ†ØĒÚŠØŗ **`async` ؈ `await`**. + +بیاید Ø§ÛŒŲ† ØŦŲ…Ų„Ų‡ ØąŲˆ ØĒÚŠŲ‡â€ŒØĒÚŠŲ‡ ØĒŲˆÛŒ Ø¨ØŽØ´â€ŒŲ‡Ø§ÛŒ Ø˛ÛŒØą Ø¨Ø¨ÛŒŲ†ÛŒŲ…: + +* **ڊد Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†** +* **`async` ؈ `await`** +* **ÚŠØąŲˆØĒÛŒŲ†â€ŒŲ‡Ø§** + +## ڊد Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų† + +ڊد Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų† ÛŒØšŲ†ÛŒ Ø˛Ø¨ŲˆŲ† đŸ’Ŧ ÛŒŲ‡ ØąØ§Ų‡ÛŒ Ø¯Ø§ØąŲ‡ ÚŠŲ‡ Ø¨Ų‡ ÚŠØ§Ų…ŲžÛŒŲˆØĒØą / Ø¨ØąŲ†Ø§Ų…Ų‡ 🤖 Ø¨Ú¯Ų‡ ØĒŲˆÛŒ ÛŒŲ‡ ØŦای ڊد، باید Ų…Ų†ØĒØ¸Øą Ø¨Ų…ŲˆŲ†Ų‡ ØĒا *ÛŒŲ‡ Ú†ÛŒØ˛ Ø¯ÛŒÚ¯Ų‡* ÛŒŲ‡ ØŦای Ø¯ÛŒÚ¯Ų‡ ØĒŲ…ŲˆŲ… Ø¨Ø´Ų‡. ŲØąØļ ÚŠŲ† Ø§ŲˆŲ† *ÛŒŲ‡ Ú†ÛŒØ˛ Ø¯ÛŒÚ¯Ų‡* Ø§ØŗŲ…Ø´ "ŲØ§ÛŒŲ„-ØĸØąŲˆŲ…" 📝 Ø¨Ø§Ø´Ų‡. + +ŲžØŗØŒ ØĒŲˆÛŒ Ø§ŲˆŲ† Ų…Ø¯ØĒ، ÚŠØ§Ų…ŲžÛŒŲˆØĒØą Ų…ÛŒâ€ŒØĒŲˆŲ†Ų‡ Ø¨ØąŲ‡ ÛŒŲ‡ ÚŠØ§Øą Ø¯ÛŒÚ¯Ų‡ Ø¨ÚŠŲ†Ų‡ØŒ ØĒا ŲˆŲ‚ØĒی "ŲØ§ÛŒŲ„-ØĸØąŲˆŲ…" 📝 ØĒŲ…ŲˆŲ… Ø¨Ø´Ų‡. + +بؚدش ÚŠØ§Ų…ŲžÛŒŲˆØĒØą / Ø¨ØąŲ†Ø§Ų…Ų‡ 🤖 Ų‡Øą ŲˆŲ‚ØĒ ŲØąØĩØĒی داشØĒŲ‡ Ø¨Ø§Ø´Ų‡ Ø¨ØąŲ…ÛŒâ€ŒÚ¯ØąØ¯Ų‡ØŒ Ú†ŲˆŲ† Ø¯ŲˆØ¨Ø§ØąŲ‡ Ų…Ų†ØĒØ¸ØąŲ‡ØŒ یا Ų‡Øą ŲˆŲ‚ØĒ Ų‡Ų…Ų‡ ÚŠØ§ØąÛŒ ÚŠŲ‡ Ø§ŲˆŲ† Ų„Ø­Ø¸Ų‡ داشØĒŲ‡ ØĒŲ…ŲˆŲ… ÚŠØąØ¯Ų‡. ؈ Ų…ÛŒâ€ŒØ¨ÛŒŲ†Ų‡ Øĸیا ÚŠØ§ØąØ§ÛŒÛŒ ÚŠŲ‡ Ų…Ų†ØĒØ¸ØąØ´ŲˆŲ† Ø¨ŲˆØ¯Ų‡ ØĒŲ…ŲˆŲ… Ø´Ø¯Ų† یا Ų†Ų‡ØŒ ؈ Ų‡Øą ÚŠØ§ØąÛŒ ÚŠŲ‡ باید Ø¨ÚŠŲ†Ų‡ ØąŲˆ Ø§Ų†ØŦØ§Ų… Ų…ÛŒâ€ŒØ¯Ų‡. + +بؚد، Ø§ŲˆŲ† 🤖 Ø§ŲˆŲ„ÛŒŲ† ÚŠØ§ØąÛŒ ÚŠŲ‡ ØĒŲ…ŲˆŲ… Ø´Ø¯Ų‡ (Ų…ØĢŲ„Ø§Ų‹ "ŲØ§ÛŒŲ„-ØĸØąŲˆŲ…" 📝 Ų…Ø§) ØąŲˆ Ø¨ØąŲ…ÛŒâ€ŒØ¯Ø§ØąŲ‡ ؈ Ų‡Øą ÚŠØ§ØąÛŒ ÚŠŲ‡ باید Ø¨Ø§Ų‡Ø§Ø´ Ø¨ÚŠŲ†Ų‡ ØąŲˆ Ø§Ø¯Ø§Ų…Ų‡ Ų…ÛŒâ€ŒØ¯Ų‡. + +Ø§ÛŒŲ† "Ų…Ų†ØĒØ¸Øą ÛŒŲ‡ Ú†ÛŒØ˛ Ø¯ÛŒÚ¯Ų‡ Ø¨ŲˆØ¯Ų†" Ų…ØšŲ…ŲˆŲ„Ø§Ų‹ Ø¨Ų‡ ØšŲ…Ų„ÛŒØ§ØĒ I/O Ø§Ø´Ø§ØąŲ‡ Ø¯Ø§ØąŲ‡ ÚŠŲ‡ Ų†ØŗØ¨ØĒØ§Ų‹ "ØĸØąŲˆŲ…" Ų‡ØŗØĒŲ† (Ų†ØŗØ¨ØĒ Ø¨Ų‡ ØŗØąØšØĒ ŲžØąØ¯Ø§Ø˛Ų†Ø¯Ų‡ ؈ Ø­Ø§ŲØ¸Ų‡ RAM)، Ų…ØĢŲ„ Ų…Ų†ØĒØ¸Øą Ų…ŲˆŲ†Ø¯Ų† Ø¨ØąØ§ÛŒ: + +* Ø¯Ø§Ø¯Ų‡â€ŒŲ‡Ø§ÛŒÛŒ ÚŠŲ‡ Ø§Ø˛ ÚŠŲ„Ø§ÛŒŲ†ØĒ Ø§Ø˛ ØˇØąÛŒŲ‚ Ø´Ø¨ÚŠŲ‡ ŲØąØŗØĒØ§Ø¯Ų‡ Ų…ÛŒâ€ŒØ´Ų† +* Ø¯Ø§Ø¯Ų‡â€ŒŲ‡Ø§ÛŒÛŒ ÚŠŲ‡ Ø¨ØąŲ†Ø§Ų…Ų‡â€ŒØ§ØĒ ŲØąØŗØĒØ§Ø¯Ų‡ ØĒا Ø§Ø˛ ØˇØąÛŒŲ‚ Ø´Ø¨ÚŠŲ‡ Ø¨Ų‡ ÚŠŲ„Ø§ÛŒŲ†ØĒ Ø¨ØąØŗŲ‡ +* Ų…Ø­ØĒŲˆØ§ÛŒ ÛŒŲ‡ ŲØ§ÛŒŲ„ ØĒŲˆÛŒ Ø¯ÛŒØŗÚŠ ÚŠŲ‡ ØŗÛŒØŗØĒŲ… Ø¨ØŽŲˆŲ†Ø¯Ø´ ؈ Ø¨Ų‡ Ø¨ØąŲ†Ø§Ų…Ų‡â€ŒØ§ØĒ Ø¨Ø¯Ų‡ +* Ų…Ø­ØĒŲˆØ§ÛŒÛŒ ÚŠŲ‡ Ø¨ØąŲ†Ø§Ų…Ų‡â€ŒØ§ØĒ Ø¨Ų‡ ØŗÛŒØŗØĒŲ… Ø¯Ø§Ø¯Ų‡ ØĒا ØĒŲˆÛŒ Ø¯ÛŒØŗÚŠ Ø¨Ų†ŲˆÛŒØŗŲ‡ +* ÛŒŲ‡ ØšŲ…Ų„ÛŒØ§ØĒ API Ø§Ø˛ ØąØ§Ų‡ Ø¯ŲˆØą +* ÛŒŲ‡ ØšŲ…Ų„ÛŒØ§ØĒ دیØĒØ§Ø¨ÛŒØŗ ÚŠŲ‡ ØĒŲ…ŲˆŲ… Ø¨Ø´Ų‡ +* ÛŒŲ‡ ÚŠŲˆØĻØąÛŒ دیØĒØ§Ø¨ÛŒØŗ ÚŠŲ‡ Ų†ØĒایØŦØ´ Ø¨ØąÚ¯ØąØ¯Ų‡ +* ؈ ØēÛŒØąŲ‡. + +Ú†ŲˆŲ† Ø˛Ų…Ø§Ų† اØŦØąØ§ بیشØĒØą ØĩØąŲ Ø§Ų†ØĒØ¸Ø§Øą Ø¨ØąØ§ÛŒ ØšŲ…Ų„ÛŒØ§ØĒ I/O Ų…ÛŒâ€ŒØ´Ų‡ØŒ Ø¨Ų‡Ø´ŲˆŲ† Ų…ÛŒâ€ŒÚ¯Ų† ØšŲ…Ų„ÛŒØ§ØĒ "I/O bound". + +Ø¨Ų‡Ø´ "Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†" Ų…ÛŒâ€ŒÚ¯Ų† Ú†ŲˆŲ† ÚŠØ§Ų…ŲžÛŒŲˆØĒØą / Ø¨ØąŲ†Ø§Ų…Ų‡ Ų„Ø§Ø˛Ų… Ų†ÛŒØŗØĒ با ÚŠØ§Øą ØĸØąŲˆŲ… "Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†" Ø¨Ø§Ø´Ų‡ØŒ Ų…Ų†ØĒØ¸Øą Ų„Ø­Ø¸Ų‡ Ø¯Ų‚ÛŒŲ‚ ØĒŲ…ŲˆŲ… Ø´Ø¯Ų† ÚŠØ§Øą Ø¨Ų…ŲˆŲ†Ų‡ØŒ Ø¯Øą Ø­Ø§Ų„ÛŒ ÚŠŲ‡ Ų‡ÛŒÚ† ÚŠØ§ØąÛŒ Ų†Ų…ÛŒâ€ŒÚŠŲ†Ų‡ØŒ ØĒا Ų†ØĒیØŦŲ‡ ØąŲˆ Ø¨Ú¯ÛŒØąŲ‡ ؈ ÚŠØ§ØąØ´ ØąŲˆ Ø§Ø¯Ø§Ų…Ų‡ Ø¨Ø¯Ų‡. + +Ø¨Ų‡ ØŦاش، Ú†ŲˆŲ† ÛŒŲ‡ ØŗÛŒØŗØĒŲ… "Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†" Ų‡ØŗØĒ، ŲˆŲ‚ØĒی ÚŠØ§Øą ØĒŲ…ŲˆŲ… شد، Ų…ÛŒâ€ŒØĒŲˆŲ†Ų‡ ÛŒŲ‡ ÚŠŲ… ØĒŲˆÛŒ Øĩ؁ Ų…Ų†ØĒØ¸Øą Ø¨Ų…ŲˆŲ†Ų‡ (Ú†Ų†Ø¯ Ų…ÛŒÚŠØąŲˆØĢØ§Ų†ÛŒŲ‡) ØĒا ÚŠØ§Ų…ŲžÛŒŲˆØĒØą / Ø¨ØąŲ†Ø§Ų…Ų‡ Ų‡Øą ÚŠØ§ØąÛŒ ÚŠŲ‡ ØąŲØĒŲ‡ Ø¨ÚŠŲ†Ų‡ ØąŲˆ ØĒŲ…ŲˆŲ… ÚŠŲ†Ų‡ØŒ ؈ بؚد Ø¨ØąÚ¯ØąØ¯Ų‡ Ų†ØĒیØŦŲ‡ ØąŲˆ Ø¨Ú¯ÛŒØąŲ‡ ؈ Ø¨Ø§Ų‡Ø§Ø´ ÚŠØ§Øą ÚŠŲ†Ų‡. + +Ø¨ØąØ§ÛŒ "Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†" (Ø¨ØąØŽŲ„Ø§Ų "Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†") Ų…ØšŲ…ŲˆŲ„Ø§Ų‹ Ø§Ø˛ اØĩØˇŲ„Ø§Ø­ "ØĒØąØĒیبی" Ų‡Ų… Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒÚŠŲ†Ų†ØŒ Ú†ŲˆŲ† ÚŠØ§Ų…ŲžÛŒŲˆØĒØą / Ø¨ØąŲ†Ø§Ų…Ų‡ Ų‡Ų…Ų‡ Ų…ØąØ§Ø­Ų„ ØąŲˆ Ø¨Ų‡ ØĒØąØĒیب Ø¯Ų†Ø¨Ø§Ų„ Ų…ÛŒâ€ŒÚŠŲ†Ų‡ Ų‚Ø¨Ų„ Ø§Ø˛ Ø§ÛŒŲ†ÚŠŲ‡ Ø¨ØąŲ‡ ØŗØąØ§Øē ÛŒŲ‡ ÚŠØ§Øą Ø¯ÛŒÚ¯Ų‡ØŒ Ø­ØĒی Ø§Ú¯Ų‡ Ø§ŲˆŲ† Ų…ØąØ§Ø­Ų„ Ø´Ø§Ų…Ų„ Ø§Ų†ØĒØ¸Ø§Øą Ø¨Ø§Ø´Ų†. + +### Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†ÛŒ ؈ Ø¨ØąÚ¯ØąŲ‡Ø§ + +Ø§ÛŒŲ† Ø§ÛŒØ¯Ų‡ **Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†** ÚŠŲ‡ Ø¨Ø§Ų„Ø§ ØĒ؈Øļیح Ø¯Ø§Ø¯Ų… Ú¯Ø§Ų‡ÛŒ Ø¨Ų‡Ø´ **"Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†ÛŒ"** Ų‡Ų… Ų…ÛŒâ€ŒÚ¯Ų†. با **"Ų…ŲˆØ§Ø˛ÛŒâ€ŒØŗØ§Ø˛ÛŒ"** ŲØąŲ‚ Ø¯Ø§ØąŲ‡. + +**Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†ÛŒ** ؈ **Ų…ŲˆØ§Ø˛ÛŒâ€ŒØŗØ§Ø˛ÛŒ** Ų‡Øą Ø¯Ųˆ Ø¨Ų‡ "اØĒŲØ§Ų‚ Ø§ŲØĒØ§Ø¯Ų† Ú†ÛŒØ˛Ø§ÛŒ Ų…ØŽØĒ؄؁ ÚŠŲ…â€ŒŲˆØ¨ÛŒØ´ Ų‡Ų…Ø˛Ų…Ø§Ų†" ØąØ¨Øˇ Ø¯Ø§ØąŲ†. + +ŲˆŲ„ÛŒ ØŦØ˛ØĻیاØĒ Ø¨ÛŒŲ† *Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†ÛŒ* ؈ *Ų…ŲˆØ§Ø˛ÛŒâ€ŒØŗØ§Ø˛ÛŒ* ØŽÛŒŲ„ÛŒ Ų…ØĒŲØ§ŲˆØĒŲ‡. + +Ø¨ØąØ§ÛŒ Ø¯ÛŒØ¯Ų† ŲØąŲ‚Ø´ØŒ Ø§ÛŒŲ† Ø¯Ø§ØŗØĒØ§Ų† Ø¯Øą Ų…ŲˆØąØ¯ Ø¨ØąÚ¯ØąŲ‡Ø§ ØąŲˆ ØĒØĩŲˆØą ÚŠŲ†: + +### Ø¨ØąÚ¯ØąŲ‡Ø§ÛŒ Ų‡Ų…â€ŒØ˛Ų…Ø§Ų† + +با ØšØ´Ų‚ØĒ Ų…ÛŒâ€ŒØąÛŒ ŲØŗØĒâ€ŒŲŲˆØ¯ Ø¨Ú¯ÛŒØąÛŒŲ†ØŒ ØĒŲˆÛŒ Øĩ؁ ŲˆØ§ÛŒŲ…ÛŒØŗØĒی Ø¯Øą Ø­Ø§Ų„ÛŒ ÚŠŲ‡ ØĩŲ†Ø¯ŲˆŲ‚Ø¯Ø§Øą ØŗŲØ§ØąØ´ ØĸØ¯Ų…Ø§ÛŒ ØŦŲ„ŲˆÛŒ ØĒ؈ ØąŲˆ Ų…ÛŒâ€ŒÚ¯ÛŒØąŲ‡. 😍 + + + +بؚد Ų†ŲˆØ¨ØĒ ØĒ؈ Ų…ÛŒâ€ŒØ´Ų‡ØŒ ØŗŲØ§ØąØ´ Ø¯Ųˆ ØĒا Ø¨ØąÚ¯Øą ØŽÛŒŲ„ÛŒ شیڊ Ø¨ØąØ§ÛŒ ØŽŲˆØ¯ØĒ ؈ ØšØ´Ų‚ØĒ Ų…ÛŒâ€ŒØ¯ÛŒ. 🍔🍔 + + + +ØĩŲ†Ø¯ŲˆŲ‚Ø¯Ø§Øą ÛŒŲ‡ Ú†ÛŒØ˛ÛŒ Ø¨Ų‡ ØĸØ´ŲžØ˛ ØĒŲˆÛŒ ØĸØ´ŲžØ˛ØŽŲˆŲ†Ų‡ Ų…ÛŒâ€ŒÚ¯Ų‡ ØĒا Ø¨Ø¯ŲˆŲ†Ų† باید Ø¨ØąÚ¯ØąŲ‡Ø§ÛŒ ØĒ؈ ØąŲˆ ØĸŲ…Ø§Ø¯Ų‡ ÚŠŲ†Ų† (Ú¯ØąÚ†Ų‡ Ø§Ų„Ø§Ų† Ø¯Ø§ØąŲ† Ø¨ØąÚ¯ØąŲ‡Ø§ÛŒ Ų…Ø´ØĒØąÛŒØ§ÛŒ Ų‚Ø¨Ų„ÛŒ ØąŲˆ Ø¯ØąØŗØĒ Ų…ÛŒâ€ŒÚŠŲ†Ų†). + + + +ŲžŲˆŲ„ ØąŲˆ Ų…ÛŒâ€ŒØ¯ÛŒ. 💸 + +ØĩŲ†Ø¯ŲˆŲ‚Ø¯Ø§Øą Ø´Ų…Ø§ØąŲ‡ Ų†ŲˆØ¨ØĒØĒ ØąŲˆ Ø¨Ų‡ØĒ Ų…ÛŒâ€ŒØ¯Ų‡. + + + +ŲˆŲ‚ØĒی Ų…Ų†ØĒØ¸ØąÛŒØŒ با ØšØ´Ų‚ØĒ Ų…ÛŒâ€ŒØąÛŒ ÛŒŲ‡ Ų…ÛŒØ˛ Ø§Ų†ØĒ؎اب Ų…ÛŒâ€ŒÚŠŲ†ÛŒØŒ Ų…ÛŒâ€ŒØ´ÛŒŲ†ÛŒ ؈ ÚŠŲ„ÛŒ با ØšØ´Ų‚ØĒ Ø­ØąŲ Ų…ÛŒâ€ŒØ˛Ų†ÛŒ (Ú†ŲˆŲ† Ø¨ØąÚ¯ØąŲ‡Ø§ØĒ ØŽÛŒŲ„ÛŒ Ø´ÛŒÚŠŲ† ؈ ØĸŲ…Ø§Ø¯Ų‡ ÚŠØąØ¯Ų†Ø´ŲˆŲ† ÛŒŲ‡ ÚŠŲ… ØˇŲˆŲ„ Ų…ÛŒâ€ŒÚŠØ´Ų‡). + +ŲˆŲ‚ØĒی ŲžØ´ØĒ Ų…ÛŒØ˛ با ØšØ´Ų‚ØĒ Ų†Ø´ØŗØĒی، Ø¯Øą Ø­Ø§Ų„ÛŒ ÚŠŲ‡ Ų…Ų†ØĒØ¸Øą Ø¨ØąÚ¯ØąŲ‡Ø§ÛŒÛŒØŒ Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ø§ŲˆŲ† Ø˛Ų…Ø§Ų† ØąŲˆ ØĩØąŲ ØĒØ­ØŗÛŒŲ† Ø§ÛŒŲ† ÚŠŲ†ÛŒ ÚŠŲ‡ ØšØ´Ų‚ØĒ Ú†Ų‚Ø¯Øą Ø¨Ø§Ø­Ø§Ų„ØŒ Ų†Ø§Ø˛ ؈ Ø¨Ø§Ų‡ŲˆØ´Ų‡ ✨😍✨. + + + +ŲˆŲ‚ØĒی Ų…Ų†ØĒØ¸ØąÛŒ ؈ با ØšØ´Ų‚ØĒ Ø­ØąŲ Ų…ÛŒâ€ŒØ˛Ų†ÛŒØŒ Ų‡Øą Ø§Ø˛ Ú¯Ø§Ų‡ÛŒ Ø´Ų…Ø§ØąŲ‡â€ŒØ§ÛŒ ÚŠŲ‡ ØąŲˆ ŲžÛŒØ´ØŽŲˆŲ† Ų†Ø´ŲˆŲ† Ø¯Ø§Ø¯Ų‡ Ų…ÛŒâ€ŒØ´Ų‡ ØąŲˆ چک Ų…ÛŒâ€ŒÚŠŲ†ÛŒ ÚŠŲ‡ Ø¨Ø¨ÛŒŲ†ÛŒ Ų†ŲˆØ¨ØĒØĒ Ø´Ø¯Ų‡ یا Ų†Ų‡. + +بؚد ÛŒŲ‡ ØŦایی Ø¨Ø§Ų„Ø§ØŽØąŲ‡ Ų†ŲˆØ¨ØĒØĒ Ų…ÛŒâ€ŒØ´Ų‡. Ų…ÛŒâ€ŒØąÛŒ ŲžÛŒØ´ØŽŲˆŲ†ØŒ Ø¨ØąÚ¯ØąŲ‡Ø§ØĒ ØąŲˆ Ų…ÛŒâ€ŒÚ¯ÛŒØąÛŒ ؈ Ø¨ØąŲ…ÛŒâ€ŒÚ¯ØąØ¯ÛŒ ØŗØą Ų…ÛŒØ˛. + + + +ØĒ؈ ؈ ØšØ´Ų‚ØĒ Ø¨ØąÚ¯ØąŲ‡Ø§ ØąŲˆ Ų…ÛŒâ€ŒØŽŲˆØąÛŒŲ† ؈ ÛŒŲ‡ ŲˆŲ‚ØĒ ØŽŲˆØ¨ Ø¨Ø§Ų‡Ų… Ø¯Ø§ØąÛŒŲ†. ✨ + + + +/// info + +ØĒØĩØ§ŲˆÛŒØą Ų‚Ø´Ų†Ú¯ Ø§Ø˛ ÚŠØĒØąÛŒŲ†Ø§ ØĒØ§Ų…ŲžØŗŲˆŲ†. 🎨 + +/// + +--- + +ØĒØĩŲˆØą ÚŠŲ† ØĒ؈ ØĒŲˆÛŒ Ø§ÛŒŲ† Ø¯Ø§ØŗØĒØ§Ų† ÚŠØ§Ų…ŲžÛŒŲˆØĒØą / Ø¨ØąŲ†Ø§Ų…Ų‡ 🤖 Ų‡ØŗØĒی. + +ŲˆŲ‚ØĒی ØĒŲˆÛŒ Øĩ؁ Ų‡ØŗØĒی، ŲŲ‚Øˇ Ø¨ÛŒÚŠØ§ØąÛŒ đŸ˜´ØŒ Ų…Ų†ØĒØ¸Øą Ų†ŲˆØ¨ØĒØĒ Ų‡ØŗØĒی، ÚŠØ§Øą ØŽÛŒŲ„ÛŒ "Ų…ŲÛŒØ¯ÛŒ" Ų†Ų…ÛŒâ€ŒÚŠŲ†ÛŒ. ŲˆŲ„ÛŒ Øĩ؁ ØŗØąÛŒØš ŲžÛŒØ´ Ų…ÛŒâ€ŒØąŲ‡ Ú†ŲˆŲ† ØĩŲ†Ø¯ŲˆŲ‚Ø¯Ø§Øą ŲŲ‚Øˇ ØŗŲØ§ØąØ´ Ų…ÛŒâ€ŒÚ¯ÛŒØąŲ‡ (ØĸŲ…Ø§Ø¯Ø´ŲˆŲ† Ų†Ų…ÛŒâ€ŒÚŠŲ†Ų‡)، ŲžØŗ Ø§ÛŒŲ† ØŽŲˆØ¨Ų‡. + +بؚد، ŲˆŲ‚ØĒی Ų†ŲˆØ¨ØĒØĒ Ų…ÛŒâ€ŒØ´Ų‡ØŒ ÚŠØ§Øą "Ų…ŲÛŒØ¯" ŲˆØ§Ų‚ØšÛŒ Ų…ÛŒâ€ŒÚŠŲ†ÛŒØŒ Ų…Ų†Ųˆ ØąŲˆ ŲžØąØ¯Ø§Ø˛Ø´ Ų…ÛŒâ€ŒÚŠŲ†ÛŒØŒ ØĒØĩŲ…ÛŒŲ… Ų…ÛŒâ€ŒÚ¯ÛŒØąÛŒ چی Ų…ÛŒâ€ŒØŽŲˆØ§ÛŒØŒ Ø§Ų†ØĒ؎اب ØšØ´Ų‚ØĒ ØąŲˆ Ų…ÛŒâ€ŒÚ¯ÛŒØąÛŒØŒ ŲžŲˆŲ„ Ų…ÛŒâ€ŒØ¯ÛŒØŒ چک Ų…ÛŒâ€ŒÚŠŲ†ÛŒ Ø§ØŗÚŠŲ†Ø§Øŗ یا ÚŠØ§ØąØĒ Ø¯ØąØŗØĒ ØąŲˆ دادی، چک Ų…ÛŒâ€ŒÚŠŲ†ÛŒ Ø¯ØąØŗØĒ Ø­ØŗØ§Ø¨ Ø´Ø¯Ų‡ØŒ چک Ų…ÛŒâ€ŒÚŠŲ†ÛŒ ØŗŲØ§ØąØ´ ØĸیØĒŲ…Ø§ÛŒ Ø¯ØąØŗØĒ ØąŲˆ Ø¯Ø§ØąŲ‡ ؈ ØēÛŒØąŲ‡. + +ŲˆŲ„ÛŒ بؚد، Ú¯ØąÚ†Ų‡ Ų‡Ų†ŲˆØ˛ Ø¨ØąÚ¯ØąŲ‡Ø§ØĒ ØąŲˆ Ų†Ø¯Ø§ØąÛŒØŒ ÚŠØ§ØąØĒ با ØĩŲ†Ø¯ŲˆŲ‚Ø¯Ø§Øą "Ų…ŲˆŲ‚ØĒØ§Ų‹ Ų…ØĒŲˆŲ‚Ų" ⏸ Ų…ÛŒâ€ŒØ´Ų‡ØŒ Ú†ŲˆŲ† باید Ų…Ų†ØĒØ¸Øą Ø¨Ų…ŲˆŲ†ÛŒ 🕙 ØĒا Ø¨ØąÚ¯ØąŲ‡Ø§ØĒ ØĸŲ…Ø§Ø¯Ų‡ Ø¨Ø´Ų†. + +ŲˆŲ„ÛŒ ŲˆŲ‚ØĒی Ø§Ø˛ ŲžÛŒØ´ØŽŲˆŲ† Ø¯ŲˆØą Ų…ÛŒâ€ŒØ´ÛŒ ؈ با Ø´Ų…Ø§ØąŲ‡ Ų†ŲˆØ¨ØĒØĒ ØŗØą Ų…ÛŒØ˛ Ų…ÛŒâ€ŒØ´ÛŒŲ†ÛŒØŒ Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ ØĒ؈ØŦŲ‡ØĒ ØąŲˆ 🔀 Ø¨Ų‡ ØšØ´Ų‚ØĒ بدی ؈ "ÚŠØ§Øą" ⏯ 🤓 ØąŲˆ Ø§ŲˆŲ† Ø¨ÚŠŲ†ÛŒ. بؚدش Ø¯ŲˆØ¨Ø§ØąŲ‡ Ø¯Ø§ØąÛŒ ÛŒŲ‡ Ú†ÛŒØ˛ ØŽÛŒŲ„ÛŒ "Ų…ŲÛŒØ¯" Ø§Ų†ØŦØ§Ų… Ų…ÛŒâ€ŒØ¯ÛŒØŒ Ų…ØĢŲ„ Ų„Ø§Øŗ Ø˛Ø¯Ų† با ØšØ´Ų‚ØĒ 😍. + +بؚد ØĩŲ†Ø¯ŲˆŲ‚Ø¯Ø§Øą 💁 با گذاشØĒŲ† Ø´Ų…Ø§ØąŲ‡â€ŒØ§ØĒ ØąŲˆ Ų†Ų…Ø§ÛŒØ´Ú¯Øą ŲžÛŒØ´ØŽŲˆŲ† Ų…ÛŒâ€ŒÚ¯Ų‡ "Ų…Ų† با Ø¯ØąØŗØĒ ÚŠØąØ¯Ų† Ø¨ØąÚ¯ØąŲ‡Ø§ ØĒŲ…ŲˆŲ… ÚŠØąØ¯Ų…"، ŲˆŲ„ÛŒ ØĒ؈ Ų…ØĢŲ„ Ø¯ÛŒŲˆŲˆŲ†Ų‡â€ŒŲ‡Ø§ ŲˆŲ‚ØĒی Ø´Ų…Ø§ØąŲ‡â€ŒØ§ØĒ ØąŲˆ Ų†Ų…Ø§ÛŒØ´Ú¯Øą Ų…ÛŒØ§Ø¯ ŲŲˆØąÛŒ Ų†Ų…ÛŒâ€ŒŲžØąÛŒ. Ų…ÛŒâ€ŒØ¯ŲˆŲ†ÛŒ ÚŠØŗÛŒ Ø¨ØąÚ¯ØąŲ‡Ø§ØĒ ØąŲˆ Ų†Ų…ÛŒâ€ŒØ¯Ø˛Ø¯Ų‡ Ú†ŲˆŲ† Ø´Ų…Ø§ØąŲ‡ Ų†ŲˆØ¨ØĒØĒ ØąŲˆ Ø¯Ø§ØąÛŒØŒ ؈ Ø§ŲˆŲ†Ø§ Ų‡Ų… Ų…Ø§Ų„ ØŽŲˆØ¯Ø´ŲˆŲ† ØąŲˆ Ø¯Ø§ØąŲ†. + +ŲžØŗ Ų…Ų†ØĒØ¸Øą Ų…ÛŒâ€ŒŲ…ŲˆŲ†ÛŒ ØĒا ØšØ´Ų‚ØĒ Ø¯Ø§ØŗØĒØ§Ų†Ø´ ØąŲˆ ØĒŲ…ŲˆŲ… ÚŠŲ†Ų‡ (ÚŠØ§Øą ŲØšŲ„ÛŒ ⏯ / ŲˆØ¸ÛŒŲŲ‡â€ŒØ§ÛŒ ÚŠŲ‡ Ø¯Ø§ØąŲ‡ ŲžØąØ¯Ø§Ø˛Ø´ Ų…ÛŒâ€ŒØ´Ų‡ 🤓)، ØĸØąŲˆŲ… Ų„Ø¨ØŽŲ†Ø¯ Ų…ÛŒâ€ŒØ˛Ų†ÛŒ ؈ Ų…ÛŒâ€ŒÚ¯ÛŒ ÚŠŲ‡ Ų…ÛŒâ€ŒØąÛŒ Ø¨ØąÚ¯ØąŲ‡Ø§ ØąŲˆ Ø¨ÛŒØ§ØąÛŒ ⏸. + +بؚد Ų…ÛŒâ€ŒØąÛŒ ŲžÛŒØ´ØŽŲˆŲ† đŸ”€ØŒ Ø¨Ų‡ ÚŠØ§Øą Ø§ŲˆŲ„ÛŒŲ‡ ÚŠŲ‡ Ø­Ø§Ų„Ø§ ØĒŲ…ŲˆŲ… Ø´Ø¯Ų‡ ⏯، Ø¨ØąÚ¯ØąŲ‡Ø§ ØąŲˆ Ų…ÛŒâ€ŒÚ¯ÛŒØąÛŒØŒ ØĒØ´ÚŠØą Ų…ÛŒâ€ŒÚŠŲ†ÛŒ ؈ Ų…ÛŒâ€ŒØ¨ØąØ´ŲˆŲ† ØŗØą Ų…ÛŒØ˛. Ø§ÛŒŲ† Ų…ØąØ­Ų„Ų‡ / ŲˆØ¸ÛŒŲŲ‡ ØĒØšØ§Ų…Ų„ با ŲžÛŒØ´ØŽŲˆŲ† ØąŲˆ ØĒŲ…ŲˆŲ… Ų…ÛŒâ€ŒÚŠŲ†Ų‡ ⏚. Ø§ÛŒŲ† Ø¨Ų‡ Ų†ŲˆØ¨Ų‡ ØŽŲˆØ¯Ø´ ÛŒŲ‡ ŲˆØ¸ÛŒŲŲ‡ ØŦدید، "ØŽŲˆØąØ¯Ų† Ø¨ØąÚ¯ØąŲ‡Ø§" 🔀 ⏯، Ų…ÛŒâ€ŒØŗØ§Ø˛Ų‡ØŒ ŲˆŲ„ÛŒ Ø§ŲˆŲ† Ų‚Ø¨Ų„ÛŒ ÚŠŲ‡ "Ú¯ØąŲØĒŲ† Ø¨ØąÚ¯ØąŲ‡Ø§" Ø¨ŲˆØ¯ ØĒŲ…ŲˆŲ… Ø´Ø¯Ų‡ ⏚. + +### Ø¨ØąÚ¯ØąŲ‡Ø§ÛŒ Ų…ŲˆØ§Ø˛ÛŒ + +Ø­Ø§Ų„Ø§ ŲØąØļ ÚŠŲ† Ø§ÛŒŲ†Ø§ "Ø¨ØąÚ¯ØąŲ‡Ø§ÛŒ Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†" Ų†ÛŒØŗØĒŲ†ØŒ Ø¨Ų„ÚŠŲ‡ "Ø¨ØąÚ¯ØąŲ‡Ø§ÛŒ Ų…ŲˆØ§Ø˛ÛŒ" Ų‡ØŗØĒŲ†. + +با ØšØ´Ų‚ØĒ Ų…ÛŒâ€ŒØąÛŒ ŲØŗØĒâ€ŒŲŲˆØ¯ Ų…ŲˆØ§Ø˛ÛŒ Ø¨Ú¯ÛŒØąÛŒ. + +ØĒŲˆÛŒ Øĩ؁ ŲˆØ§ÛŒŲ…ÛŒØŗØĒی Ø¯Øą Ø­Ø§Ų„ÛŒ ÚŠŲ‡ Ú†Ų†Ø¯ ØĒا (Ų…ØĢŲ„Ø§Ų‹ 8 ØĒا) ØĩŲ†Ø¯ŲˆŲ‚Ø¯Ø§Øą ÚŠŲ‡ Ų‡Ų…Ø˛Ų…Ø§Ų† ØĸØ´ŲžØ˛ Ų‡Ų… Ų‡ØŗØĒŲ† ØŗŲØ§ØąØ´ ØĸØ¯Ų…Ø§ÛŒ ØŦŲ„ŲˆÛŒ ØĒ؈ ØąŲˆ Ų…ÛŒâ€ŒÚ¯ÛŒØąŲ†. + +Ų‡Ų…Ų‡ Ų‚Ø¨Ų„ ØĒ؈ Ų…Ų†ØĒØ¸ØąŲ† Ø¨ØąÚ¯ØąŲ‡Ø§Ø´ŲˆŲ† ØĸŲ…Ø§Ø¯Ų‡ Ø¨Ø´Ų‡ Ų‚Ø¨Ų„ Ø§Ø˛ Ø§ÛŒŲ†ÚŠŲ‡ ŲžÛŒØ´ØŽŲˆŲ† ØąŲˆ ØĒØąÚŠ ÚŠŲ†Ų†ØŒ Ú†ŲˆŲ† Ų‡Øą ÚŠØ¯ŲˆŲ… Ø§Ø˛ 8 ØĒا ØĩŲ†Ø¯ŲˆŲ‚Ø¯Ø§Øą Ų…ÛŒâ€ŒØąŲ‡ ؈ Ø¨ØąÚ¯Øą ØąŲˆ Ų‡Ų…ŲˆŲ† Ų…ŲˆŲ‚Øš Ø¯ØąØŗØĒ Ų…ÛŒâ€ŒÚŠŲ†Ų‡ Ų‚Ø¨Ų„ Ø§Ø˛ Ø§ÛŒŲ†ÚŠŲ‡ ØŗŲØ§ØąØ´ بؚدی ØąŲˆ Ø¨Ú¯ÛŒØąŲ‡. + + + +Ø¨Ø§Ų„Ø§ØŽØąŲ‡ Ų†ŲˆØ¨ØĒ ØĒ؈ Ų…ÛŒâ€ŒØ´Ų‡ØŒ ØŗŲØ§ØąØ´ Ø¯Ųˆ ØĒا Ø¨ØąÚ¯Øą ØŽÛŒŲ„ÛŒ شیڊ Ø¨ØąØ§ÛŒ ØŽŲˆØ¯ØĒ ؈ ØšØ´Ų‚ØĒ Ų…ÛŒâ€ŒØ¯ÛŒ. + +ŲžŲˆŲ„ ØąŲˆ Ų…ÛŒâ€ŒØ¯ÛŒ 💸. + + + +ØĩŲ†Ø¯ŲˆŲ‚Ø¯Ø§Øą Ų…ÛŒâ€ŒØąŲ‡ ØĸØ´ŲžØ˛ØŽŲˆŲ†Ų‡. + +Ų…Ų†ØĒØ¸Øą Ų…ÛŒâ€ŒŲ…ŲˆŲ†ÛŒØŒ ØŦŲ„ŲˆÛŒ ŲžÛŒØ´ØŽŲˆŲ† ŲˆØ§ÛŒØŗØĒادی đŸ•™ØŒ ÚŠŲ‡ ÚŠØŗÛŒ Ų‚Ø¨Ų„ Ø§Ø˛ ØĒ؈ Ø¨ØąÚ¯ØąŲ‡Ø§ØĒ ØąŲˆ Ų†Ú¯ÛŒØąŲ‡ØŒ Ú†ŲˆŲ† Ø´Ų…Ø§ØąŲ‡ Ų†ŲˆØ¨ØĒ Ų†ÛŒØŗØĒ. + + + +Ú†ŲˆŲ† ØĒ؈ ؈ ØšØ´Ų‚ØĒ Ų…Ø´ØēŲˆŲ„ Ø§ÛŒŲ† Ų‡ØŗØĒÛŒŲ† ÚŠŲ‡ Ų†Ø°Ø§ØąÛŒŲ† ÚŠØŗÛŒ ØŦŲ„ŲˆØĒŲˆŲ† بیاد ؈ Ų‡Øą ŲˆŲ‚ØĒ Ø¨ØąÚ¯ØąŲ‡Ø§ ØąØŗÛŒØ¯Ų† Ø§ŲˆŲ†Ø§ ØąŲˆ Ø¨Ú¯ÛŒØąŲ‡ØŒ Ų†Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ø¨Ų‡ ØšØ´Ų‚ØĒ ØĒ؈ØŦŲ‡ ÚŠŲ†ÛŒ. 😞 + +Ø§ÛŒŲ† ÚŠØ§Øą "Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†" Ų‡ØŗØĒ، ØĒ؈ با ØĩŲ†Ø¯ŲˆŲ‚Ø¯Ø§Øą/ØĸØ´ŲžØ˛ đŸ‘¨â€đŸŗ "Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†" Ų‡ØŗØĒی. باید Ų…Ų†ØĒØ¸Øą Ø¨Ų…ŲˆŲ†ÛŒ 🕙 ؈ Ø¯ØąØŗØĒ Ų‡Ų…ŲˆŲ† Ų„Ø­Ø¸Ų‡ ÚŠŲ‡ ØĩŲ†Ø¯ŲˆŲ‚Ø¯Ø§Øą/ØĸØ´ŲžØ˛ đŸ‘¨â€đŸŗ Ø¨ØąÚ¯ØąŲ‡Ø§ ØąŲˆ ØĒŲ…ŲˆŲ… Ų…ÛŒâ€ŒÚŠŲ†Ų‡ ؈ Ø¨Ų‡ØĒ Ų…ÛŒâ€ŒØ¯Ų‡ Ø§ŲˆŲ†ØŦا باشی، ŲˆÚ¯ØąŲ†Ų‡ Ų…Ų…ÚŠŲ†Ų‡ یڊی Ø¯ÛŒÚ¯Ų‡ Ø§ŲˆŲ†Ø§ ØąŲˆ Ø¨Ú¯ÛŒØąŲ‡. + + + +بؚد ØĩŲ†Ø¯ŲˆŲ‚Ø¯Ø§Øą/ØĸØ´ŲžØ˛ØĒ đŸ‘¨â€đŸŗ Ø¨Ø§Ų„Ø§ØŽØąŲ‡ بؚد Ø§Ø˛ ÛŒŲ‡ Ų…Ø¯ØĒ ØˇŲˆŲ„Ø§Ų†ÛŒ Ø§Ų†ØĒØ¸Ø§Øą 🕙 ØŦŲ„ŲˆÛŒ ŲžÛŒØ´ØŽŲˆŲ† با Ø¨ØąÚ¯ØąŲ‡Ø§ØĒ Ø¨ØąŲ…ÛŒâ€ŒÚ¯ØąØ¯Ų‡. + + + +Ø¨ØąÚ¯ØąŲ‡Ø§ØĒ ØąŲˆ Ų…ÛŒâ€ŒÚ¯ÛŒØąÛŒ ؈ با ØšØ´Ų‚ØĒ Ų…ÛŒâ€ŒØąÛŒ ØŗØą Ų…ÛŒØ˛. + +ŲŲ‚Øˇ Ų…ÛŒâ€ŒØŽŲˆØąÛŒŲ†Ø´ŲˆŲ†ØŒ ؈ ØĒŲ…ŲˆŲ…Ų‡. ⏚ + + + +Ø­ØąŲ Ø˛Ø¯Ų† یا Ų„Ø§Øŗ Ø˛Ø¯Ų† Ø˛ÛŒØ§Ø¯ Ų†Ø¨ŲˆØ¯ Ú†ŲˆŲ† بیشØĒØą ŲˆŲ‚ØĒ ØĩØąŲ Ø§Ų†ØĒØ¸Ø§Øą 🕙 ØŦŲ„ŲˆÛŒ ŲžÛŒØ´ØŽŲˆŲ† شد. 😞 + +/// info + +ØĒØĩØ§ŲˆÛŒØą Ų‚Ø´Ų†Ú¯ Ø§Ø˛ ÚŠØĒØąÛŒŲ†Ø§ ØĒØ§Ų…ŲžØŗŲˆŲ†. 🎨 + +/// + +--- + +ØĒŲˆÛŒ Ø§ÛŒŲ† ØŗŲ†Ø§ØąÛŒŲˆÛŒ Ø¨ØąÚ¯ØąŲ‡Ø§ÛŒ Ų…ŲˆØ§Ø˛ÛŒØŒ ØĒ؈ ÛŒŲ‡ ÚŠØ§Ų…ŲžÛŒŲˆØĒØą / Ø¨ØąŲ†Ø§Ų…Ų‡ 🤖 با Ø¯Ųˆ ØĒا ŲžØąØ¯Ø§Ø˛Ų†Ø¯Ų‡ (ØĒ؈ ؈ ØšØ´Ų‚ØĒ) Ų‡ØŗØĒی، Ų‡Øą Ø¯Ųˆ Ų…Ų†ØĒØ¸Øą 🕙 ؈ ØĒ؈ØŦŲ‡Ø´ŲˆŲ† ⏯ ØąŲˆ Ø¨ØąØ§ÛŒ Ų…Ø¯ØĒ ØˇŲˆŲ„Ø§Ų†ÛŒ "Ø§Ų†ØĒØ¸Ø§Øą ØŦŲ„ŲˆÛŒ ŲžÛŒØ´ØŽŲˆŲ†" 🕙 گذاشØĒŲ†. + +ŲØŗØĒâ€ŒŲŲˆØ¯ 8 ØĒا ŲžØąØ¯Ø§Ø˛Ų†Ø¯Ų‡ (ØĩŲ†Ø¯ŲˆŲ‚Ø¯Ø§Øą/ØĸØ´ŲžØ˛) Ø¯Ø§ØąŲ‡. Ø¯Øą Ø­Ø§Ų„ÛŒ ÚŠŲ‡ ŲØŗØĒâ€ŒŲŲˆØ¯ Ø¨ØąÚ¯ØąŲ‡Ø§ÛŒ Ų‡Ų…â€ŒØ˛Ų…Ø§Ų† شاید ŲŲ‚Øˇ 2 ØĒا داشØĒŲ‡ (ÛŒŲ‡ ØĩŲ†Ø¯ŲˆŲ‚Ø¯Ø§Øą ؈ ÛŒŲ‡ ØĸØ´ŲžØ˛). + +ŲˆŲ„ÛŒ با Ø§ÛŒŲ† Ø­Ø§Ų„ØŒ ØĒØŦØąØ¨Ų‡ Ų†Ų‡Ø§ÛŒÛŒ Ø¨Ų‡ØĒØąÛŒŲ† Ų†ÛŒØŗØĒ. 😞 + +--- + +Ø§ÛŒŲ† Ų…ØšØ§Ø¯Ų„ Ų…ŲˆØ§Ø˛ÛŒ Ø¯Ø§ØŗØĒØ§Ų† Ø¨ØąÚ¯ØąŲ‡Ø§ Ø¨ŲˆØ¯. 🍔 + +Ø¨ØąØ§ÛŒ ÛŒŲ‡ Ų…ØĢØ§Ų„ "ŲˆØ§Ų‚ØšÛŒâ€ŒØĒØą" Ø§Ø˛ Ø˛Ų†Ø¯Ú¯ÛŒØŒ ÛŒŲ‡ Ø¨Ø§Ų†ÚŠ ØąŲˆ ØĒØĩŲˆØą ÚŠŲ†. + +ØĒا Ų‡Ų…ÛŒŲ† Ú†Ų†Ø¯ ŲˆŲ‚ØĒ ŲžÛŒØ´ØŒ بیشØĒØą Ø¨Ø§Ų†ÚŠâ€ŒŲ‡Ø§ Ú†Ų†Ø¯ ØĒا ØĩŲ†Ø¯ŲˆŲ‚Ø¯Ø§Øą 👨‍đŸ’ŧ👨‍đŸ’ŧ👨‍đŸ’ŧ👨‍đŸ’ŧ داشØĒŲ† ؈ ÛŒŲ‡ Øĩ؁ Ø¨Ø˛ØąÚ¯ 🕙🕙🕙🕙🕙🕙🕙🕙. + +Ų‡Ų…Ų‡ ØĩŲ†Ø¯ŲˆŲ‚Ø¯Ø§ØąŲ‡Ø§ ÚŠØ§Øą ØąŲˆ با ÛŒŲ‡ Ų…Ø´ØĒØąÛŒ بؚد Ø§Ø˛ Ø§ŲˆŲ† یڊی 👨‍đŸ’ŧ⏯ Ø§Ų†ØŦØ§Ų… Ų…ÛŒâ€ŒØ¯Ø§Ø¯Ų†. + +؈ باید ØĒŲˆÛŒ Øĩ؁ 🕙 Ų…Ø¯ØĒ Ø˛ÛŒØ§Ø¯ÛŒ Ų…Ų†ØĒØ¸Øą Ø¨Ų…ŲˆŲ†ÛŒ ŲˆÚ¯ØąŲ†Ų‡ Ų†ŲˆØ¨ØĒØĒ ØąŲˆ Ø§Ø˛ Ø¯ØŗØĒ Ų…ÛŒâ€ŒØ¯ÛŒ. + +احØĒŲ…Ø§Ų„Ø§Ų‹ Ų†Ų…ÛŒâ€ŒØŽŲˆØ§ÛŒ ØšØ´Ų‚ØĒ 😍 ØąŲˆ با ØŽŲˆØ¯ØĒ Ø¨Ø¨ØąÛŒ Ø¨Ø§Ų†ÚŠ đŸĻ Ø¨ØąØ§ÛŒ ÚŠØ§ØąØ§ÛŒ ØąŲˆØ˛Ų…ØąŲ‡. + +### Ų†ØĒیØŦŲ‡â€ŒÚ¯ÛŒØąÛŒ Ø¨ØąÚ¯ØąŲ‡Ø§ + +ØĒŲˆÛŒ Ø§ÛŒŲ† ØŗŲ†Ø§ØąÛŒŲˆÛŒ "Ø¨ØąÚ¯ØąŲ‡Ø§ÛŒ ŲØŗØĒâ€ŒŲŲˆØ¯ با ØšØ´Ų‚ØĒ"، Ú†ŲˆŲ† ÚŠŲ„ÛŒ Ø§Ų†ØĒØ¸Ø§Øą 🕙 Ų‡ØŗØĒ، ØŽÛŒŲ„ÛŒ Ų…Ų†ØˇŲ‚ÛŒâ€ŒØĒØąŲ‡ ÚŠŲ‡ ÛŒŲ‡ ØŗÛŒØŗØĒŲ… Ų‡Ų…â€ŒØ˛Ų…Ø§Ų† â¸đŸ”€â¯ داشØĒŲ‡ باشی. + +Ø§ÛŒŲ† Ø¨ØąØ§ÛŒ بیشØĒØą Ø¨ØąŲ†Ø§Ų…Ų‡â€ŒŲ‡Ø§ÛŒ ŲˆØ¨ Ų‡Ų… ØĩØ¯Ų‚ Ų…ÛŒâ€ŒÚŠŲ†Ų‡. + +ØŽÛŒŲ„ÛŒ ØŽÛŒŲ„ÛŒ ÚŠØ§ØąØ¨ØąØŒ ŲˆŲ„ÛŒ ØŗØąŲˆØąØĒ Ų…Ų†ØĒØ¸Øą 🕙 اØĒØĩØ§Ų„ Ų†Ų‡â€ŒÚ†Ų†Ø¯Ø§Ų† ØŽŲˆØ¨Ø´ŲˆŲ† Ų‡ØŗØĒ ØĒا Ø¯ØąØŽŲˆØ§ØŗØĒâ€ŒŲ‡Ø§Ø´ŲˆŲ† ØąŲˆ Ø¨ŲØąØŗØĒŲ†. + +؈ بؚد Ø¯ŲˆØ¨Ø§ØąŲ‡ Ų…Ų†ØĒØ¸Øą 🕙 ÚŠŲ‡ ØŦŲˆØ§Ø¨â€ŒŲ‡Ø§ Ø¨ØąÚ¯ØąØ¯Ų†. + +Ø§ÛŒŲ† "Ø§Ų†ØĒØ¸Ø§Øą" 🕙 ØĒŲˆÛŒ Ų…ÛŒÚŠØąŲˆØĢØ§Ų†ÛŒŲ‡â€ŒŲ‡Ø§ Ø§Ų†Ø¯Ø§Ø˛Ų‡â€ŒÚ¯ÛŒØąÛŒ Ų…ÛŒâ€ŒØ´Ų‡ØŒ ŲˆŲ„ÛŒ با Ø§ÛŒŲ† Ø­Ø§Ų„ØŒ ØŦŲ…ØšØ´ ÚŠŲ‡ Ø¨ÚŠŲ†ÛŒ ØĸØŽØąØ´ ÚŠŲ„ÛŒ Ø§Ų†ØĒØ¸Ø§Øą Ų…ÛŒâ€ŒØ´Ų‡. + +Ø¨ØąØ§ÛŒ Ų‡Ų…ÛŒŲ† Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ ڊد Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų† â¸đŸ”€â¯ Ø¨ØąØ§ÛŒ APIŲ‡Ø§ÛŒ ŲˆØ¨ ØŽÛŒŲ„ÛŒ Ų…Ų†ØˇŲ‚ÛŒŲ‡. + +Ø§ÛŒŲ† Ų†ŲˆØš Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†ÛŒ Ú†ÛŒØ˛ÛŒŲ‡ ÚŠŲ‡ NodeJS ØąŲˆ Ų…Ø­Ø¨ŲˆØ¨ ÚŠØąØ¯ (Ú¯ØąÚ†Ų‡ NodeJS Ų…ŲˆØ§Ø˛ÛŒ Ų†ÛŒØŗØĒ) ؈ Ų†Ų‚ØˇŲ‡ Ų‚ŲˆØĒ Go Ø¨Ų‡â€ŒØšŲ†ŲˆØ§Ų† ÛŒŲ‡ Ø˛Ø¨ŲˆŲ† Ø¨ØąŲ†Ø§Ų…Ų‡â€ŒŲ†ŲˆÛŒØŗÛŒŲ‡. + +؈ Ų‡Ų…ŲˆŲ† ØŗØˇØ­ ØšŲ…Ų„ÚŠØąØ¯ÛŒ Ų‡ØŗØĒ ÚŠŲ‡ با **FastAPI** Ų…ÛŒâ€ŒÚ¯ÛŒØąÛŒ. + +؈ Ú†ŲˆŲ† Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†ÛŒ ؈ Ų…ŲˆØ§Ø˛ÛŒâ€ŒØŗØ§Ø˛ÛŒ ØąŲˆ Ų‡Ų…Ø˛Ų…Ø§Ų† داشØĒŲ‡ باشی، ØšŲ…Ų„ÚŠØąØ¯ Ø¨Ø§Ų„Ø§ØĒØąÛŒ Ø§Ø˛ بیشØĒØą ŲØąÛŒŲ…â€ŒŲˆØąÚŠâ€ŒŲ‡Ø§ÛŒ ØĒØŗØĒâ€ŒØ´Ø¯Ų‡ NodeJS Ų…ÛŒâ€ŒÚ¯ÛŒØąÛŒ ؈ Ų‡Ų…â€ŒØĒØąØ§Ø˛ با Go، ÚŠŲ‡ ÛŒŲ‡ Ø˛Ø¨ŲˆŲ† ÚŠØ§Ų…ŲžØ§ÛŒŲ„â€ŒØ´Ø¯Ų‡ Ų†Ø˛Ø¯ÛŒÚŠ Ø¨Ų‡ C Ų‡ØŗØĒ (Ų‡Ų…Ų‡ Ø§ÛŒŲ†Ø§ Ø¨Ų‡ Ų„ØˇŲ Starlette). + +### Øĸیا Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†ÛŒ Ø§Ø˛ Ų…ŲˆØ§Ø˛ÛŒâ€ŒØŗØ§Ø˛ÛŒ Ø¨Ų‡ØĒØąŲ‡ØŸ + +Ų†Ų‡! Ø§ÛŒŲ† Ų†ØĒیØŦŲ‡ Ø¯Ø§ØŗØĒØ§Ų† Ų†ÛŒØŗØĒ. + +Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†ÛŒ با Ų…ŲˆØ§Ø˛ÛŒâ€ŒØŗØ§Ø˛ÛŒ ŲØąŲ‚ Ø¯Ø§ØąŲ‡. ؈ ØĒŲˆÛŒ **ØŗŲ†Ø§ØąÛŒŲˆŲ‡Ø§ÛŒ ؎اØĩ** ÚŠŲ‡ ÚŠŲ„ÛŒ Ø§Ų†ØĒØ¸Ø§Øą Ø¯Ø§ØąŲ† Ø¨Ų‡ØĒØąŲ‡. Ø¨Ų‡ Ų‡Ų…ÛŒŲ† ØŽØ§ØˇØąØŒ Ų…ØšŲ…ŲˆŲ„Ø§Ų‹ Ø¨ØąØ§ÛŒ ØĒŲˆØŗØšŲ‡ Ø¨ØąŲ†Ø§Ų…Ų‡â€ŒŲ‡Ø§ÛŒ ŲˆØ¨ ØŽÛŒŲ„ÛŒ Ø§Ø˛ Ų…ŲˆØ§Ø˛ÛŒâ€ŒØŗØ§Ø˛ÛŒ Ø¨Ų‡ØĒØąŲ‡. ŲˆŲ„ÛŒ Ų†Ų‡ Ø¨ØąØ§ÛŒ Ų‡Ų…Ų‡â€ŒÚ†ÛŒØ˛. + +Ø¨ØąØ§ÛŒ Ø§ÛŒŲ†ÚŠŲ‡ ÛŒŲ‡ ØĒØšØ§Ø¯Ų„ Ø¨Ø°Ø§ØąÛŒŲ…ØŒ Ø§ÛŒŲ† Ø¯Ø§ØŗØĒØ§Ų† ÚŠŲˆØĒØ§Ų‡ ØąŲˆ ØĒØĩŲˆØą ÚŠŲ†: + +> باید ÛŒŲ‡ ØŽŲˆŲ†Ų‡ Ø¨Ø˛ØąÚ¯ ؈ ÚŠØĢÛŒŲ ØąŲˆ ØĒŲ…ÛŒØ˛ ÚŠŲ†ÛŒ. + +*ØĸØąŲ‡ØŒ ÚŠŲ„ Ø¯Ø§ØŗØĒØ§Ų† Ų‡Ų…ÛŒŲ†Ų‡*. + +--- + +Ų‡ÛŒÚ† Ø§Ų†ØĒØ¸Ø§ØąÛŒ 🕙 Ø§ŲˆŲ†ØŦا Ų†ÛŒØŗØĒ، ŲŲ‚Øˇ ÚŠŲ„ÛŒ ÚŠØ§Øą Ø¨ØąØ§ÛŒ Ø§Ų†ØŦØ§Ų… Ø¯Ø§Ø¯Ų† ØĒŲˆÛŒ ØŦØ§Ų‡Ø§ÛŒ Ų…ØŽØĒ؄؁ ØŽŲˆŲ†Ų‡. + +Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ų…ØĢŲ„ Ų…ØĢØ§Ų„ Ø¨ØąÚ¯ØąŲ‡Ø§ Ų†ŲˆØ¨ØĒ Ø¨Ø°Ø§ØąÛŒØŒ Ø§ŲˆŲ„ ŲžØ°ÛŒØąØ§ÛŒÛŒØŒ بؚد ØĸØ´ŲžØ˛ØŽŲˆŲ†Ų‡ØŒ ŲˆŲ„ÛŒ Ú†ŲˆŲ† Ų…Ų†ØĒØ¸Øą Ú†ÛŒØ˛ÛŒ Ų†ÛŒØŗØĒی đŸ•™ØŒ ŲŲ‚Øˇ Ø¯Ø§ØąÛŒ ØĒŲ…ÛŒØ˛ Ų…ÛŒâ€ŒÚŠŲ†ÛŒ ؈ ØĒŲ…ÛŒØ˛ Ų…ÛŒâ€ŒÚŠŲ†ÛŒØŒ Ų†ŲˆØ¨ØĒâ€ŒŲ‡Ø§ Ų‡ÛŒÚ† ØĒØŖØĢÛŒØąÛŒ Ų†Ø¯Ø§ØąŲ‡. + +با Ų†ŲˆØ¨ØĒ یا Ø¨Ø¯ŲˆŲ† Ų†ŲˆØ¨ØĒ (Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†ÛŒ) Ų‡Ų…ŲˆŲ† Ų‚Ø¯Øą ØˇŲˆŲ„ Ų…ÛŒâ€ŒÚŠØ´Ų‡ ØĒا ØĒŲ…ŲˆŲ…Ø´ ÚŠŲ†ÛŒ ؈ Ų‡Ų…ŲˆŲ† Ų…Ų‚Ø¯Ø§Øą ÚŠØ§Øą ØąŲˆ ÚŠØąØ¯ÛŒ. + +ŲˆŲ„ÛŒ ØĒŲˆÛŒ Ø§ÛŒŲ† Ų…ŲˆŲ‚ØšÛŒØĒ، Ø§Ú¯Ų‡ بØĒŲˆŲ†ÛŒ Ø§ŲˆŲ† 8 ØĒا ØĩŲ†Ø¯ŲˆŲ‚Ø¯Ø§Øą/ØĸØ´ŲžØ˛/Ø­Ø§Ų„Ø§-ØĒŲ…ÛŒØ˛ÚŠØ§Øą ØąŲˆ Ø¨ÛŒØ§ØąÛŒØŒ ؈ Ų‡Øą ÚŠØ¯ŲˆŲ…Ø´ŲˆŲ† (Ø¨Ų‡â€ŒØšŲ„Ø§ŲˆŲ‡ ØŽŲˆØ¯ØĒ) ÛŒŲ‡ Ų‚ØŗŲ…ØĒ Ø§Ø˛ ØŽŲˆŲ†Ų‡ ØąŲˆ ØĒŲ…ÛŒØ˛ ÚŠŲ†Ų†ØŒ Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ų‡Ų…Ų‡ ÚŠØ§Øą ØąŲˆ **Ų…ŲˆØ§Ø˛ÛŒ** Ø§Ų†ØŦØ§Ų… بدی، با ÚŠŲ…ÚŠ اØļØ§ŲÛŒØŒ ؈ ØŽÛŒŲ„ÛŒ Ø˛ŲˆØ¯ØĒØą ØĒŲ…ŲˆŲ…Ø´ ÚŠŲ†ÛŒ. + +ØĒŲˆÛŒ Ø§ÛŒŲ† ØŗŲ†Ø§ØąÛŒŲˆØŒ Ų‡Øą ÚŠØ¯ŲˆŲ… Ø§Ø˛ ØĒŲ…ÛŒØ˛ÚŠØ§ØąŲ‡Ø§ (Ø§Ø˛ ØŦŲ…Ų„Ų‡ ØŽŲˆØ¯ØĒ) ÛŒŲ‡ ŲžØąØ¯Ø§Ø˛Ų†Ø¯Ų‡â€ŒØŗØĒ ÚŠŲ‡ ÚŠØ§Øą ØŽŲˆØ¯Ø´ ØąŲˆ Ų…ÛŒâ€ŒÚŠŲ†Ų‡. + +؈ Ú†ŲˆŲ† بیشØĒØą Ø˛Ų…Ø§Ų† اØŦØąØ§ ØĩØąŲ ÚŠØ§Øą ŲˆØ§Ų‚ØšÛŒ Ų…ÛŒâ€ŒØ´Ų‡ (Ø¨Ų‡ ØŦای Ø§Ų†ØĒØ¸Ø§Øą)، ؈ ÚŠØ§Øą ØĒŲˆÛŒ ÚŠØ§Ų…ŲžÛŒŲˆØĒØą با CPU Ø§Ų†ØŦØ§Ų… Ų…ÛŒâ€ŒØ´Ų‡ØŒ Ø¨Ų‡ Ø§ÛŒŲ† Ų…Ø´ÚŠŲ„Ø§ØĒ Ų…ÛŒâ€ŒÚ¯Ų† "CPU bound". + +--- + +Ų…ØĢØ§Ų„â€ŒŲ‡Ø§ÛŒ ØąØ§ÛŒØŦ ØšŲ…Ų„ÛŒØ§ØĒ CPU bound Ú†ÛŒØ˛Ø§ÛŒÛŒ Ų‡ØŗØĒŲ† ÚŠŲ‡ Ų†ÛŒØ§Ø˛ Ø¨Ų‡ ŲžØąØ¯Ø§Ø˛Ø´ ØąÛŒØ§Øļی ŲžÛŒÚ†ÛŒØ¯Ų‡ Ø¯Ø§ØąŲ†. + +Ų…ØĢŲ„Ø§Ų‹: + +* ŲžØąØ¯Ø§Ø˛Ø´ **Øĩدا** یا **ØĒØĩŲˆÛŒØą**. +* **Ø¨ÛŒŲ†Ø§ÛŒÛŒ ÚŠØ§Ų…ŲžÛŒŲˆØĒØąÛŒ**: ÛŒŲ‡ ØĒØĩŲˆÛŒØą Ø§Ø˛ Ų…ÛŒŲ„ÛŒŲˆŲ†â€ŒŲ‡Ø§ ŲžÛŒÚŠØŗŲ„ ØĒØ´ÚŠÛŒŲ„ Ø´Ø¯Ų‡ØŒ Ų‡Øą ŲžÛŒÚŠØŗŲ„ 3 ØĒا Ų…Ų‚Ø¯Ø§Øą / ØąŲ†Ú¯ Ø¯Ø§ØąŲ‡ØŒ ŲžØąØ¯Ø§Ø˛Ø´Ø´ Ų…ØšŲ…ŲˆŲ„Ø§Ų‹ Ų†ÛŒØ§Ø˛ Ø¯Ø§ØąŲ‡ Ú†ÛŒØ˛ÛŒ ØąŲˆ ØąŲˆ Ø§ŲˆŲ† ŲžÛŒÚŠØŗŲ„â€ŒŲ‡Ø§ Ų‡Ų…Ø˛Ų…Ø§Ų† Ø­ØŗØ§Ø¨ ÚŠŲ†ÛŒ. +* **ÛŒØ§Ø¯Ú¯ÛŒØąÛŒ Ų…Ø§Ø´ÛŒŲ†**: Ų…ØšŲ…ŲˆŲ„Ø§Ų‹ ÚŠŲ„ÛŒ ØļØąØ¨ "Ų…Ø§ØĒØąÛŒØŗ" ؈ "Ø¨ØąØ¯Ø§Øą" Ų„Ø§Ø˛Ų… Ø¯Ø§ØąŲ‡. ÛŒŲ‡ ØŦØ¯ŲˆŲ„ Ø¨Ø˛ØąÚ¯ ŲžØą Ø§Ø˛ ؚدد ØąŲˆ ØĒØĩŲˆØą ÚŠŲ† ÚŠŲ‡ Ų‡Ų…Ų‡â€ŒØ´ŲˆŲ† ØąŲˆ Ų‡Ų…Ø˛Ų…Ø§Ų† ØļØąØ¨ Ų…ÛŒâ€ŒÚŠŲ†ÛŒ. +* **ÛŒØ§Ø¯Ú¯ÛŒØąÛŒ ØšŲ…ÛŒŲ‚**: Ø§ÛŒŲ† ÛŒŲ‡ Ø˛ÛŒØąØ´Ø§ØŽŲ‡ Ø§Ø˛ ÛŒØ§Ø¯Ú¯ÛŒØąÛŒ Ų…Ø§Ø´ÛŒŲ†Ų‡ØŒ ŲžØŗ Ų‡Ų…ŲˆŲ† Ų‚ØļÛŒŲ‡ ØĩØ¯Ų‚ Ų…ÛŒâ€ŒÚŠŲ†Ų‡. ŲŲ‚Øˇ Ø§ÛŒŲ† ÚŠŲ‡ ÛŒŲ‡ ØŦØ¯ŲˆŲ„ ؚدد Ø¨ØąØ§ÛŒ ØļØąØ¨ ÚŠØąØ¯Ų† Ų†ÛŒØŗØĒ، Ø¨Ų„ÚŠŲ‡ ÛŒŲ‡ Ų…ØŦŲ…ŲˆØšŲ‡ Ø¨Ø˛ØąÚ¯ Ø§Ø˛ Ø§ŲˆŲ†Ø§ Ų‡ØŗØĒ، ؈ ØĒŲˆÛŒ ØŽÛŒŲ„ÛŒ Ų…ŲˆØ§ØąØ¯ Ø§Ø˛ ÛŒŲ‡ ŲžØąØ¯Ø§Ø˛Ų†Ø¯Ų‡ ؎اØĩ Ø¨ØąØ§ÛŒ ØŗØ§ØŽØĒ ؈ / یا Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ Ø§ÛŒŲ† Ų…Ø¯Ų„â€ŒŲ‡Ø§ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒÚŠŲ†ÛŒ. + +### Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†ÛŒ + Ų…ŲˆØ§Ø˛ÛŒâ€ŒØŗØ§Ø˛ÛŒ: ŲˆØ¨ + ÛŒØ§Ø¯Ú¯ÛŒØąÛŒ Ų…Ø§Ø´ÛŒŲ† + +با **FastAPI** Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ø§Ø˛ Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†ÛŒ ÚŠŲ‡ Ø¨ØąØ§ÛŒ ØĒŲˆØŗØšŲ‡ ŲˆØ¨ ØŽÛŒŲ„ÛŒ ØąØ§ÛŒØŦŲ‡ (Ų‡Ų…ŲˆŲ† ØŦذابیØĒ اØĩŲ„ÛŒ NodeJS) Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒ. + +ŲˆŲ„ÛŒ Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ø§Ø˛ ŲŲˆØ§ÛŒØ¯ Ų…ŲˆØ§Ø˛ÛŒâ€ŒØŗØ§Ø˛ÛŒ ؈ Ú†Ų†Ø¯ŲžØąØ¯Ø§Ø˛Ø´ÛŒ (اØŦØąØ§ÛŒ Ú†Ų†Ø¯ ŲžØąŲˆØŗŲ‡ Ø¨Ų‡â€ŒØĩŲˆØąØĒ Ų…ŲˆØ§Ø˛ÛŒ) Ø¨ØąØ§ÛŒ ÚŠØ§ØąØ§ÛŒ **CPU bound** Ų…ØĢŲ„ ØŗÛŒØŗØĒŲ…â€ŒŲ‡Ø§ÛŒ ÛŒØ§Ø¯Ú¯ÛŒØąÛŒ Ų…Ø§Ø´ÛŒŲ† Ų‡Ų… Ø¨Ų‡ØąŲ‡ Ø¨Ø¨ØąÛŒ. + +Ø§ÛŒŲ†ØŒ Ø¨Ų‡â€ŒØšŲ„Ø§ŲˆŲ‡ Ø§ÛŒŲ† ŲˆØ§Ų‚ØšÛŒØĒ ØŗØ§Ø¯Ų‡ ÚŠŲ‡ ŲžØ§ÛŒØĒŲˆŲ† Ø˛Ø¨ŲˆŲ† اØĩŲ„ÛŒ Ø¨ØąØ§ÛŒ **ØšŲ„Ų… Ø¯Ø§Ø¯Ų‡**، ÛŒØ§Ø¯Ú¯ÛŒØąÛŒ Ų…Ø§Ø´ÛŒŲ† ؈ Ø¨Ų‡â€ŒØŽØĩ؈Øĩ ÛŒØ§Ø¯Ú¯ÛŒØąÛŒ ØšŲ…ÛŒŲ‚Ų‡ØŒ باؚØĢ Ų…ÛŒâ€ŒØ´Ų‡ FastAPI ÛŒŲ‡ Ø§Ų†ØĒ؎اب ØŽÛŒŲ„ÛŒ ØŽŲˆØ¨ Ø¨ØąØ§ÛŒ APIŲ‡Ø§ ؈ Ø¨ØąŲ†Ø§Ų…Ų‡â€ŒŲ‡Ø§ÛŒ ŲˆØ¨ ØšŲ„Ų… Ø¯Ø§Ø¯Ų‡ / ÛŒØ§Ø¯Ú¯ÛŒØąÛŒ Ų…Ø§Ø´ÛŒŲ† Ø¨Ø§Ø´Ų‡ (Ø¨ÛŒŲ† ØŽÛŒŲ„ÛŒ Ú†ÛŒØ˛Ø§ÛŒ Ø¯ÛŒÚ¯Ų‡). + +Ø¨ØąØ§ÛŒ Ø¯ÛŒØ¯Ų† Ø§ÛŒŲ†ÚŠŲ‡ Ú†ØˇŲˆØą ØĒŲˆÛŒ Ų…Ø­ÛŒØˇ ŲˆØ§Ų‚ØšÛŒ Ø¨Ų‡ Ø§ÛŒŲ† Ų…ŲˆØ§Ø˛ÛŒâ€ŒØŗØ§Ø˛ÛŒ Ø¨ØąØŗÛŒØŒ ب؎ش [Ø§ØŗØĒŲ‚ØąØ§Øą](deployment/index.md){.internal-link target=_blank} ØąŲˆ Ø¨Ø¨ÛŒŲ†. + +## `async` ؈ `await` + +Ų†ØŗØŽŲ‡â€ŒŲ‡Ø§ÛŒ Ų…Ø¯ØąŲ† ŲžØ§ÛŒØĒŲˆŲ† ÛŒŲ‡ ØąØ§Ų‡ ØŽÛŒŲ„ÛŒ ØŗØ§Ø¯Ų‡ ؈ Ų‚Ø§Ø¨Ų„â€ŒŲŲ‡Ų… Ø¨ØąØ§ÛŒ ØĒØšØąÛŒŲ ڊد Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų† Ø¯Ø§ØąŲ†. Ø§ÛŒŲ† باؚØĢ Ų…ÛŒâ€ŒØ´Ų‡ Ų…ØĢŲ„ ڊد "ØĒØąØĒیبی" Ų…ØšŲ…ŲˆŲ„ÛŒ Ø¨Ų‡ Ų†Ø¸Øą بیاد ؈ ØĒŲˆÛŒ Ų„Ø­Ø¸Ų‡â€ŒŲ‡Ø§ÛŒ Ø¯ØąØŗØĒ "Ø§Ų†ØĒØ¸Ø§Øą" ØąŲˆ Ø¨ØąØ§ØĒ Ø§Ų†ØŦØ§Ų… Ø¨Ø¯Ų‡. + +ŲˆŲ‚ØĒی ÛŒŲ‡ ØšŲ…Ų„ÛŒØ§ØĒی Ų‡ØŗØĒ ÚŠŲ‡ Ų‚Ø¨Ų„ Ø§Ø˛ Ø¯Ø§Ø¯Ų† Ų†ØĒیØŦŲ‡â€ŒŲ‡Ø§ Ų†ÛŒØ§Ø˛ Ø¨Ų‡ Ø§Ų†ØĒØ¸Ø§Øą Ø¯Ø§ØąŲ‡ ؈ Ø§Ø˛ Ø§ÛŒŲ† Ų‚Ø§Ø¨Ų„ÛŒØĒâ€ŒŲ‡Ø§ÛŒ ØŦدید ŲžØ§ÛŒØĒŲˆŲ† ŲžØ´ØĒÛŒØ¨Ø§Ų†ÛŒ Ų…ÛŒâ€ŒÚŠŲ†Ų‡ØŒ Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ø§ÛŒŲ†ØŦŲˆØąÛŒ ÚŠØ¯Ų†ŲˆÛŒØŗÛŒØ´ ÚŠŲ†ÛŒ: + +```Python +burgers = await get_burgers(2) +``` + +Ų†ÚŠØĒŲ‡ ÚŠŲ„ÛŒØ¯ÛŒ Ø§ÛŒŲ†ØŦا `await` Ų‡ØŗØĒ. Ø¨Ų‡ ŲžØ§ÛŒØĒŲˆŲ† Ų…ÛŒâ€ŒÚ¯Ų‡ ÚŠŲ‡ باید ⏸ Ų…Ų†ØĒØ¸Øą Ø¨Ų…ŲˆŲ†Ų‡ ØĒا `get_burgers(2)` ÚŠØ§ØąØ´ 🕙 ØĒŲ…ŲˆŲ… Ø¨Ø´Ų‡ Ų‚Ø¨Ų„ Ø§Ø˛ Ø§ÛŒŲ†ÚŠŲ‡ Ų†ØĒیØŦŲ‡â€ŒŲ‡Ø§ ØąŲˆ ØĒŲˆÛŒ `burgers` Ø°ØŽÛŒØąŲ‡ ÚŠŲ†Ų‡. با Ø§ÛŒŲ†ØŒ ŲžØ§ÛŒØĒŲˆŲ† Ų…ÛŒâ€ŒØ¯ŲˆŲ†Ų‡ ÚŠŲ‡ Ų…ÛŒâ€ŒØĒŲˆŲ†Ų‡ Ø¨ØąŲ‡ ÛŒŲ‡ ÚŠØ§Øą Ø¯ÛŒÚ¯Ų‡ 🔀 ⏯ ØĒŲˆÛŒ Ø§ÛŒŲ† Ų…Ø¯ØĒ Ø¨ÚŠŲ†Ų‡ (Ų…ØĢŲ„ Ú¯ØąŲØĒŲ† ÛŒŲ‡ Ø¯ØąØŽŲˆØ§ØŗØĒ Ø¯ÛŒÚ¯Ų‡). + +Ø¨ØąØ§ÛŒ Ø§ÛŒŲ†ÚŠŲ‡ `await` ÚŠØ§Øą ÚŠŲ†Ų‡ØŒ باید ØĒŲˆÛŒ ÛŒŲ‡ ØĒابؚ Ø¨Ø§Ø´Ų‡ ÚŠŲ‡ Ø§Ø˛ Ø§ÛŒŲ† Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†ÛŒ ŲžØ´ØĒÛŒØ¨Ø§Ų†ÛŒ ÚŠŲ†Ų‡. Ø¨ØąØ§ÛŒ Ø§ÛŒŲ† ÚŠØ§ØąØŒ ŲŲ‚Øˇ با `async def` ØĒØšØąÛŒŲØ´ Ų…ÛŒâ€ŒÚŠŲ†ÛŒ: + +```Python hl_lines="1" +async def get_burgers(number: int): + # ÛŒŲ‡ ØŗØąÛŒ ÚŠØ§Øą Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų† Ø¨ØąØ§ÛŒ ØŗØ§ØŽØĒŲ† Ø¨ØąÚ¯ØąŲ‡Ø§ Ø§Ų†ØŦØ§Ų… Ø¨Ø¯Ų‡ + return burgers +``` + +...Ø¨Ų‡ ØŦای `def`: + +```Python hl_lines="2" +# Ø§ÛŒŲ† Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų† Ų†ÛŒØŗØĒ +def get_sequential_burgers(number: int): + # ÛŒŲ‡ ØŗØąÛŒ ÚŠØ§Øą ØĒØąØĒیبی Ø¨ØąØ§ÛŒ ØŗØ§ØŽØĒŲ† Ø¨ØąÚ¯ØąŲ‡Ø§ Ø§Ų†ØŦØ§Ų… Ø¨Ø¯Ų‡ + return burgers +``` + +با `async def`، ŲžØ§ÛŒØĒŲˆŲ† Ų…ÛŒâ€ŒØ¯ŲˆŲ†Ų‡ ÚŠŲ‡ ØĒŲˆÛŒ Ø§ŲˆŲ† ØĒابؚ باید Ø­ŲˆØ§ØŗØ´ Ø¨Ų‡ ØšØ¨Ø§ØąØĒâ€ŒŲ‡Ø§ÛŒ `await` Ø¨Ø§Ø´Ų‡ØŒ ؈ Ų…ÛŒâ€ŒØĒŲˆŲ†Ų‡ اØŦØąØ§ÛŒ Ø§ŲˆŲ† ØĒابؚ ØąŲˆ "Ų…ŲˆŲ‚ØĒØ§Ų‹ Ų…ØĒŲˆŲ‚Ų" ⏸ ÚŠŲ†Ų‡ ؈ Ø¨ØąŲ‡ ÛŒŲ‡ ÚŠØ§Øą Ø¯ÛŒÚ¯Ų‡ 🔀 Ų‚Ø¨Ų„ Ø§Ø˛ Ø¨ØąÚ¯Ø´ØĒŲ† Ø¨ÚŠŲ†Ų‡. + +ŲˆŲ‚ØĒی Ų…ÛŒâ€ŒØŽŲˆØ§ÛŒ ÛŒŲ‡ ØĒابؚ `async def` ØąŲˆ Øĩدا ÚŠŲ†ÛŒØŒ باید "Ų…Ų†ØĒØ¸ØąØ´" Ø¨Ų…ŲˆŲ†ÛŒ. ŲžØŗ Ø§ÛŒŲ† ÚŠØ§Øą Ų†Ų…ÛŒâ€ŒÚŠŲ†Ų‡: + +```Python +# Ø§ÛŒŲ† ÚŠØ§Øą Ų†Ų…ÛŒâ€ŒÚŠŲ†Ų‡ØŒ Ú†ŲˆŲ† get_burgers با async def ØĒØšØąÛŒŲ Ø´Ø¯Ų‡ +burgers = get_burgers(2) +``` + +--- + +ŲžØŗØŒ Ø§Ú¯Ų‡ Ø§Ø˛ ÛŒŲ‡ ÚŠØĒØ§Ø¨ØŽŲˆŲ†Ų‡ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒÚŠŲ†ÛŒ ÚŠŲ‡ Ø¨Ų‡ØĒ Ų…ÛŒâ€ŒÚ¯Ų‡ Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ با `await` Øĩداش ÚŠŲ†ÛŒØŒ باید *ØĒŲˆØ§Ø¨Øš ØšŲ…Ų„ÛŒØ§ØĒ Ų…ØŗÛŒØąØĒ* ÚŠŲ‡ Ø§Ø˛Ø´ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒÚŠŲ†Ų† ØąŲˆ با `async def` Ø¨ØŗØ§Ø˛ÛŒØŒ Ų…ØĢŲ„: + +```Python hl_lines="2-3" +@app.get('/burgers') +async def read_burgers(): + burgers = await get_burgers(2) + return burgers +``` + +### ØŦØ˛ØĻیاØĒ ŲŲ†ÛŒâ€ŒØĒØą + +شاید Ų…ØĒ؈ØŦŲ‡ Ø´Ø¯Ų‡ باشی ÚŠŲ‡ `await` ŲŲ‚Øˇ ØĒŲˆÛŒ ØĒŲˆØ§Ø¨ØšÛŒ ÚŠŲ‡ با `async def` ØĒØšØąÛŒŲ Ø´Ø¯Ų† Ų…ÛŒâ€ŒØĒŲˆŲ†Ų‡ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø¨Ø´Ų‡. + +ŲˆŲ„ÛŒ Ø¯Øą ØšÛŒŲ† Ø­Ø§Ų„ØŒ ØĒŲˆØ§Ø¨ØšÛŒ ÚŠŲ‡ با `async def` ØĒØšØąÛŒŲ Ø´Ø¯Ų† باید "Ų…Ų†ØĒØ¸Øą"Ø´ŲˆŲ† Ø¨Ų…ŲˆŲ†ÛŒ. ŲžØŗ ØĒŲˆØ§Ø¨Øš با `async def` ŲŲ‚Øˇ ØĒŲˆÛŒ ØĒŲˆØ§Ø¨ØšÛŒ ÚŠŲ‡ با `async def` ØĒØšØąÛŒŲ Ø´Ø¯Ų† Ų…ÛŒâ€ŒØĒŲˆŲ†Ų† Øĩدا Ø˛Ø¯Ų‡ Ø¨Ø´Ų†. + +Ø­Ø§Ų„Ø§ØŒ Ų‚ØļÛŒŲ‡ Ų…ØąØē ؈ ØĒØŽŲ…â€ŒŲ…ØąØē Ú†ÛŒŲ‡ØŒ Ú†ØˇŲˆØą Ø§ŲˆŲ„ÛŒŲ† ØĒابؚ `async` ØąŲˆ Øĩدا Ų…ÛŒâ€ŒÚŠŲ†ÛŒØŸ + +Ø§Ú¯Ų‡ با **FastAPI** ÚŠØ§Øą Ų…ÛŒâ€ŒÚŠŲ†ÛŒØŒ Ų„Ø§Ø˛Ų… Ų†ÛŒØŗØĒ Ų†Ú¯ØąØ§Ų† Ø§ÛŒŲ† باشی، Ú†ŲˆŲ† Ø§ŲˆŲ† "Ø§ŲˆŲ„ÛŒŲ†" ØĒابؚ، *ØĒابؚ ØšŲ…Ų„ÛŒØ§ØĒ Ų…ØŗÛŒØąØĒ* Ų‡ØŗØĒ، ؈ FastAPI Ų…ÛŒâ€ŒØ¯ŲˆŲ†Ų‡ Ú†ØˇŲˆØą ÚŠØ§Øą Ø¯ØąØŗØĒ ØąŲˆ Ø¨ÚŠŲ†Ų‡. + +ŲˆŲ„ÛŒ Ø§Ú¯Ų‡ Ø¨ØŽŲˆØ§ÛŒ Ø¨Ø¯ŲˆŲ† FastAPI Ø§Ø˛ `async` / `await` Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒØŒ Ø§ÛŒŲ†Ų… Ų…Ų…ÚŠŲ†Ų‡. + +### ڊد Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų† ØŽŲˆØ¯ØĒ ØąŲˆ Ø¨Ų†ŲˆÛŒØŗ + +Starlette (؈ **FastAPI**) Ø¨Øą ŲžØ§ÛŒŲ‡ AnyIO Ų‡ØŗØĒŲ†ØŒ ÚŠŲ‡ باؚØĢ Ų…ÛŒâ€ŒØ´Ų‡ با ÚŠØĒØ§Ø¨ØŽŲˆŲ†Ų‡ Ø§ØŗØĒØ§Ų†Ø¯Ø§ØąØ¯ ŲžØ§ÛŒØĒŲˆŲ† asyncio ؈ Trio ØŗØ§Ø˛Ú¯Ø§Øą Ø¨Ø§Ø´Ų‡. + +Ø¨Ų‡â€ŒØŽØĩ؈Øĩ، Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ų…ØŗØĒŲ‚ÛŒŲ…Ø§Ų‹ Ø§Ø˛ AnyIO Ø¨ØąØ§ÛŒ Ų…ŲˆØ§ØąØ¯ Ø§ØŗØĒŲØ§Ø¯Ų‡ ŲžÛŒØ´ØąŲØĒŲ‡ Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†ÛŒ ÚŠŲ‡ Ų†ÛŒØ§Ø˛ Ø¨Ų‡ Ø§Ų„Ú¯ŲˆŲ‡Ø§ÛŒ ŲžÛŒÚ†ÛŒØ¯Ų‡â€ŒØĒØą ØĒŲˆÛŒ ڊد ØŽŲˆØ¯ØĒ Ø¯Ø§ØąŲ† Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒ. + +؈ Ø­ØĒی Ø§Ú¯Ų‡ Ø§Ø˛ FastAPI Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų†ÚŠŲ†ÛŒØŒ Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ø¨ØąŲ†Ø§Ų…Ų‡â€ŒŲ‡Ø§ÛŒ Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų† ØŽŲˆØ¯ØĒ ØąŲˆ با AnyIO Ø¨Ų†ŲˆÛŒØŗÛŒ ØĒا ØŽÛŒŲ„ÛŒ ØŗØ§Ø˛Ú¯Ø§Øą Ø¨Ø§Ø´Ų‡ ؈ ŲŲˆØ§ÛŒØ¯Ø´ ØąŲˆ Ø¨Ú¯ÛŒØąÛŒ (Ų…ØĢŲ„ *Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†ÛŒ ØŗØ§ØŽØĒØ§ØąÛŒØ§ŲØĒŲ‡*). + +Ų…Ų† ÛŒŲ‡ ÚŠØĒØ§Ø¨ØŽŲˆŲ†Ų‡ Ø¯ÛŒÚ¯Ų‡ ØąŲˆÛŒ AnyIO ØŗØ§ØŽØĒŲ…ØŒ ÛŒŲ‡ Ų„Ø§ÛŒŲ‡ Ų†Ø§Ø˛ÚŠ ØąŲˆØ´ØŒ ØĒا ÛŒŲ‡ ÚŠŲ… annotationŲ‡Ø§ÛŒ Ų†ŲˆØš ØąŲˆ Ø¨Ų‡ØĒØą ÚŠŲ†Ų… ؈ **ØĒÚŠŲ…ÛŒŲ„ ØŽŲˆØ¯ÚŠØ§Øą** Ø¨Ų‡ØĒØąØŒ **ØŽØˇØ§Ų‡Ø§ÛŒ Ø¯ØąŲˆŲ†â€ŒØŽØˇÛŒ** ؈ ØēÛŒØąŲ‡ Ø¨Ú¯ÛŒØąŲ…. ÛŒŲ‡ Ų…Ų‚Ø¯Ų…Ų‡ ؈ ØĸŲ…ŲˆØ˛Ø´ ØŗØ§Ø¯Ų‡ Ų‡Ų… Ø¯Ø§ØąŲ‡ ÚŠŲ‡ Ø¨Ų‡ØĒ ÚŠŲ…ÚŠ Ų…ÛŒâ€ŒÚŠŲ†Ų‡ **Ø¨ŲŲ‡Ų…ÛŒ** ؈ **ڊد Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų† ØŽŲˆØ¯ØĒ ØąŲˆ Ø¨Ų†ŲˆÛŒØŗÛŒ**: Asyncer. Ø§Ú¯Ų‡ Ø¨ØŽŲˆØ§ÛŒ **ڊد Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų† ØąŲˆ با ڊد Ų…ØšŲ…ŲˆŲ„ÛŒ** (Ø¨Ų„Ø§ÚŠâ€ŒÚŠŲ†Ų†Ø¯Ų‡/Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†) ØĒØąÚŠÛŒØ¨ ÚŠŲ†ÛŒ ØŽÛŒŲ„ÛŒ Ø¨Ų‡â€ŒØ¯ØąØ¯ØĒ Ų…ÛŒâ€ŒØŽŲˆØąŲ‡. + +### Ø´ÚŠŲ„â€ŒŲ‡Ø§ÛŒ Ø¯ÛŒÚ¯Ų‡ ڊد Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų† + +Ø§ÛŒŲ† ØŗØ¨ÚŠ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ `async` ؈ `await` ØĒŲˆÛŒ Ø˛Ø¨ŲˆŲ† Ų†ØŗØ¨ØĒØ§Ų‹ ØŦØ¯ÛŒØ¯Ų‡. + +ŲˆŲ„ÛŒ ÚŠØ§Øą با ڊد Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų† ØąŲˆ ØŽÛŒŲ„ÛŒ ØŗØ§Ø¯Ų‡â€ŒØĒØą Ų…ÛŒâ€ŒÚŠŲ†Ų‡. + +Ų‡Ų…ÛŒŲ† ØŗÛŒŲ†ØĒÚŠØŗ (یا ØĒŲ‚ØąÛŒØ¨Ø§Ų‹ ÛŒÚŠØŗØ§Ų†) Ø§ØŽÛŒØąØ§Ų‹ ØĒŲˆÛŒ Ų†ØŗØŽŲ‡â€ŒŲ‡Ø§ÛŒ Ų…Ø¯ØąŲ† ØŦØ§ŲˆØ§Ø§ØŗÚŠØąÛŒŲžØĒ (ØĒŲˆÛŒ Ų…ØąŲˆØąÚ¯Øą ؈ NodeJS) Ų‡Ų… اØļØ§ŲŲ‡ Ø´Ø¯Ų‡. + +ŲˆŲ„ÛŒ Ų‚Ø¨Ų„ Ø§Ø˛ Ø§ŲˆŲ†ØŒ Ų…Ø¯ÛŒØąÛŒØĒ ڊد Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų† ØŽÛŒŲ„ÛŒ ŲžÛŒÚ†ÛŒØ¯Ų‡â€ŒØĒØą ؈ ØŗØŽØĒ‌ØĒØą Ø¨ŲˆØ¯. + +ØĒŲˆÛŒ Ų†ØŗØŽŲ‡â€ŒŲ‡Ø§ÛŒ Ų‚Ø¨Ų„ÛŒ ŲžØ§ÛŒØĒŲˆŲ†ØŒ Ų…ÛŒâ€ŒØĒŲˆŲ†ØŗØĒی Ø§Ø˛ Ų†ØŽâ€ŒŲ‡Ø§ یا Gevent Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒ. ŲˆŲ„ÛŒ ڊد ØŽÛŒŲ„ÛŒ ŲžÛŒÚ†ÛŒØ¯Ų‡â€ŒØĒØą Ų…ÛŒâ€ŒØ´Ų‡ Ø¨ØąØ§ÛŒ ŲŲ‡Ų…ÛŒØ¯Ų†ØŒ دیباگ ÚŠØąØ¯Ų† ؈ ŲÚŠØą ÚŠØąØ¯Ų† Ø¨Ų‡Ø´. + +ØĒŲˆÛŒ Ų†ØŗØŽŲ‡â€ŒŲ‡Ø§ÛŒ Ų‚Ø¨Ų„ÛŒ NodeJS / ØŦØ§ŲˆØ§Ø§ØŗÚŠØąÛŒŲžØĒ Ų…ØąŲˆØąÚ¯ØąØŒ Ø§Ø˛ "ÚŠØ§Ų„â€ŒØ¨ÚŠâ€ŒŲ‡Ø§" Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒÚŠØąØ¯ÛŒ. ÚŠŲ‡ Ų…ÛŒâ€ŒØąØŗÛŒØ¯ Ø¨Ų‡ ØŦŲ‡Ø§Ų† ÚŠØ§Ų„â€ŒØ¨ÚŠâ€ŒŲ‡Ø§. + +## ÚŠØąŲˆØĒÛŒŲ†â€ŒŲ‡Ø§ + +**ÚŠØąŲˆØĒÛŒŲ†** ŲŲ‚Øˇ ÛŒŲ‡ اØĩØˇŲ„Ø§Ø­ ØŽÛŒŲ„ÛŒ شیڊ Ø¨ØąØ§ÛŒ Ú†ÛŒØ˛ÛŒŲ‡ ÚŠŲ‡ ÛŒŲ‡ ØĒابؚ `async def` Ø¨ØąŲ…ÛŒâ€ŒÚ¯ØąØ¯ŲˆŲ†Ų‡. ŲžØ§ÛŒØĒŲˆŲ† Ų…ÛŒâ€ŒØ¯ŲˆŲ†Ų‡ ÚŠŲ‡ Ø§ÛŒŲ† ÛŒŲ‡ Ú†ÛŒØ˛ÛŒ Ų…ØĢŲ„ ØĒابؚ Ų‡ØŗØĒ، Ų…ÛŒâ€ŒØĒŲˆŲ†Ų‡ Ø´ØąŲˆØš Ø¨Ø´Ų‡ ؈ ÛŒŲ‡ ØŦایی ØĒŲ…ŲˆŲ… Ø¨Ø´Ų‡ØŒ ŲˆŲ„ÛŒ Ų…Ų…ÚŠŲ†Ų‡ Ø¯Ø§ØŽŲ„Ø´ Ų‡Ų… Ų…ŲˆŲ‚Ų ⏸ Ø¨Ø´Ų‡ØŒ Ų‡Øą ŲˆŲ‚ØĒ ÛŒŲ‡ `await` ØĒŲˆØ´ Ø¨Ø§Ø´Ų‡. + +ŲˆŲ„ÛŒ Ų‡Ų…Ų‡ Ø§ÛŒŲ† Ų‚Ø§Ø¨Ų„ÛŒØĒ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ ڊد Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų† با `async` ؈ `await` ØŽÛŒŲ„ÛŒ ŲˆŲ‚ØĒا ØŽŲ„Ø§ØĩŲ‡ Ų…ÛŒâ€ŒØ´Ų‡ Ø¨Ų‡ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ "ÚŠØąŲˆØĒÛŒŲ†â€ŒŲ‡Ø§". Ø§ÛŒŲ† Ų‚Ø§Ø¨Ų„ Ų…Ų‚Ø§ÛŒØŗŲ‡ با ŲˆÛŒÚ˜Ú¯ÛŒ اØĩŲ„ÛŒ Go، ÛŒØšŲ†ÛŒ "GoroutineŲ‡Ø§" Ų‡ØŗØĒ. + +## Ų†ØĒیØŦŲ‡â€ŒÚ¯ÛŒØąÛŒ + +بیاید Ų‡Ų…ŲˆŲ† ØŦŲ…Ų„Ų‡ Ø§Ø˛ Ø¨Ø§Ų„Ø§ ØąŲˆ Ø¨Ø¨ÛŒŲ†ÛŒŲ…: + +> Ų†ØŗØŽŲ‡â€ŒŲ‡Ø§ÛŒ Ų…Ø¯ØąŲ† ŲžØ§ÛŒØĒŲˆŲ† Ø§Ø˛ **"ڊد Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų†"** با Ú†ÛŒØ˛ÛŒ ÚŠŲ‡ Ø¨Ų‡Ø´ **"ÚŠØąŲˆØĒÛŒŲ†"** Ų…ÛŒâ€ŒÚ¯Ų† ŲžØ´ØĒÛŒØ¨Ø§Ų†ÛŒ Ų…ÛŒâ€ŒÚŠŲ†Ų†ØŒ با ØŗÛŒŲ†ØĒÚŠØŗ **`async` ؈ `await`**. + +Ø­Ø§Ų„Ø§ باید بیشØĒØą Ø¨ØąØ§ØĒ Ų…ØšŲ†ÛŒ Ø¨Ø¯Ų‡. ✨ + +Ų‡Ų…Ų‡ Ø§ÛŒŲ†Ø§ Ú†ÛŒØ˛ÛŒŲ‡ ÚŠŲ‡ Ø¨Ų‡ FastAPI (Ø§Ø˛ ØˇØąÛŒŲ‚ Starlette) Ų‚Ø¯ØąØĒ Ų…ÛŒâ€ŒØ¯Ų‡ ؈ باؚØĢ Ų…ÛŒâ€ŒØ´Ų‡ ØšŲ…Ų„ÚŠØąØ¯ Ú†Ø´Ų…Ú¯ÛŒØąÛŒ داشØĒŲ‡ Ø¨Ø§Ø´Ų‡. + +## ØŦØ˛ØĻیاØĒ ØŽÛŒŲ„ÛŒ ŲŲ†ÛŒ + +/// warning + +احØĒŲ…Ø§Ų„Ø§Ų‹ Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ø§ÛŒŲ†Ųˆ ØąØ¯ ÚŠŲ†ÛŒ. + +Ø§ÛŒŲ†Ø§ ØŦØ˛ØĻیاØĒ ØŽÛŒŲ„ÛŒ ŲŲ†ÛŒ Ø§Ø˛ Ų†Ø­ŲˆŲ‡ ÚŠØ§Øą **FastAPI** Ø˛ÛŒØą ŲžŲˆØŗØĒŲ‡â€ŒØŗØĒ. + +Ø§Ú¯Ų‡ ÛŒŲ‡ ÚŠŲ… Ø¯Ø§Ų†Ø´ ŲŲ†ÛŒ (ÚŠØąŲˆØĒÛŒŲ†â€ŒŲ‡Ø§ØŒ Ų†ØŽâ€ŒŲ‡Ø§ØŒ Ø¨Ų„Ø§ÚŠ ÚŠØąØ¯Ų† ؈ ØēÛŒØąŲ‡) Ø¯Ø§ØąÛŒ ؈ ÚŠŲ†ØŦÚŠØ§ŲˆÛŒ ÚŠŲ‡ FastAPI Ú†ØˇŲˆØą `async def` ØąŲˆ Ø¯Øą Ų…Ų‚Ø§Ø¨Ų„ `def` Ų…ØšŲ…ŲˆŲ„ÛŒ Ų…Ø¯ÛŒØąÛŒØĒ Ų…ÛŒâ€ŒÚŠŲ†Ų‡ØŒ Ø§Ø¯Ø§Ų…Ų‡ Ø¨Ø¯Ų‡. + +/// + +### ØĒŲˆØ§Ø¨Øš ØšŲ…Ų„ÛŒØ§ØĒ Ų…ØŗÛŒØą + +ŲˆŲ‚ØĒی ÛŒŲ‡ *ØĒابؚ ØšŲ…Ų„ÛŒØ§ØĒ Ų…ØŗÛŒØą* ØąŲˆ با `def` Ų…ØšŲ…ŲˆŲ„ÛŒ Ø¨Ų‡ ØŦای `async def` ØĒØšØąÛŒŲ Ų…ÛŒâ€ŒÚŠŲ†ÛŒØŒ ØĒŲˆÛŒ ÛŒŲ‡ Ø§ØŗØĒØŽØą Ų†ØŽ ØŽØ§ØąØŦی اØŦØąØ§ Ų…ÛŒâ€ŒØ´Ų‡ ÚŠŲ‡ بؚدش Ų…Ų†ØĒØ¸ØąØ´ Ų…ÛŒâ€ŒŲ…ŲˆŲ†Ų†ØŒ Ø¨Ų‡ ØŦای Ø§ÛŒŲ†ÚŠŲ‡ Ų…ØŗØĒŲ‚ÛŒŲ… Øĩداش ÚŠŲ†Ų† (Ú†ŲˆŲ† ØŗØąŲˆØą ØąŲˆ Ø¨Ų„Ø§ÚŠ Ų…ÛŒâ€ŒÚŠŲ†Ų‡). + +Ø§Ú¯Ų‡ Ø§Ø˛ ÛŒŲ‡ ŲØąÛŒŲ…â€ŒŲˆØąÚŠ Ų†Ø§Ų‡Ų…â€ŒØ˛Ų…Ø§Ų† Ø¯ÛŒÚ¯Ų‡ Ų…ÛŒØ§ÛŒ ÚŠŲ‡ Ø¨Ų‡ ØąŲˆØ´ Ø¨Ø§Ų„Ø§ ÚŠØ§Øą Ų†Ų…ÛŒâ€ŒÚŠŲ†Ų‡ ؈ ؚادØĒ Ø¯Ø§ØąÛŒ *ØĒŲˆØ§Ø¨Øš ØšŲ…Ų„ÛŒØ§ØĒ Ų…ØŗÛŒØą* ØŗØ§Ø¯Ų‡ ŲŲ‚Øˇ Ų…Ø­Ø§ØŗØ¨Ø§ØĒی ØąŲˆ با `def` Ų…ØšŲ…ŲˆŲ„ÛŒ Ø¨ØąØ§ÛŒ ÛŒŲ‡ ØŗŲˆØ¯ ÚŠŲˆÚ†ÛŒÚŠ ØšŲ…Ų„ÚŠØąØ¯ (Ø­Ø¯ŲˆØ¯ 100 Ų†Ø§Ų†ŲˆØĢØ§Ų†ÛŒŲ‡) ØĒØšØąÛŒŲ ÚŠŲ†ÛŒØŒ ØĒ؈ØŦŲ‡ ÚŠŲ† ÚŠŲ‡ ØĒŲˆÛŒ **FastAPI** اØĢØąØ´ ÚŠØ§Ų…Ų„Ø§Ų‹ Ø¨ØąØšÚŠØŗŲ‡. ØĒŲˆÛŒ Ø§ÛŒŲ† Ų…ŲˆØ§ØąØ¯ØŒ Ø¨Ų‡ØĒØąŲ‡ Ø§Ø˛ `async def` Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒ Ų…Ú¯Ų‡ Ø§ÛŒŲ†ÚŠŲ‡ *ØĒŲˆØ§Ø¨Øš ØšŲ…Ų„ÛŒØ§ØĒ Ų…ØŗÛŒØąØĒ* ڊدی داشØĒŲ‡ Ø¨Ø§Ø´Ų† ÚŠŲ‡ ØšŲ…Ų„ÛŒØ§ØĒ I/O Ø¨Ų„Ø§ÚŠâ€ŒÚŠŲ†Ų†Ø¯Ų‡ Ø§Ų†ØŦØ§Ų… Ø¨Ø¯Ų‡. + +با Ø§ÛŒŲ† Ø­Ø§Ų„ØŒ ØĒŲˆÛŒ Ų‡Øą Ø¯Ųˆ Ų…ŲˆŲ‚ØšÛŒØĒ، احØĒŲ…Ø§Ų„Ø´ Ø˛ÛŒØ§Ø¯Ų‡ ÚŠŲ‡ **FastAPI** Ų‡Ų†ŲˆØ˛ [ØŗØąÛŒØšâ€ŒØĒØą](index.md#performance){.internal-link target=_blank} Ø§Ø˛ ŲØąÛŒŲ…â€ŒŲˆØąÚŠ Ų‚Ø¨Ų„ÛŒâ€ŒØ§ØĒ Ø¨Ø§Ø´Ų‡ (یا Ø­Ø¯Ø§Ų‚Ų„ Ų‚Ø§Ø¨Ų„ Ų…Ų‚Ø§ÛŒØŗŲ‡ Ø¨Ø§Ų‡Ø§Ø´). + +### ŲˆØ§Ø¨ØŗØĒÚ¯ÛŒâ€ŒŲ‡Ø§ + +Ų‡Ų…ÛŒŲ† Ø¨ØąØ§ÛŒ [ŲˆØ§Ø¨ØŗØĒÚ¯ÛŒâ€ŒŲ‡Ø§](tutorial/dependencies/index.md){.internal-link target=_blank} Ų‡Ų… ØĩØ¯Ų‚ Ų…ÛŒâ€ŒÚŠŲ†Ų‡. Ø§Ú¯Ų‡ ÛŒŲ‡ ŲˆØ§Ø¨ØŗØĒگی ÛŒŲ‡ ØĒابؚ `def` Ų…ØšŲ…ŲˆŲ„ÛŒ Ø¨Ų‡ ØŦای `async def` Ø¨Ø§Ø´Ų‡ØŒ ØĒŲˆÛŒ Ø§ØŗØĒØŽØą Ų†ØŽ ØŽØ§ØąØŦی اØŦØąØ§ Ų…ÛŒâ€ŒØ´Ų‡. + +### Ø˛ÛŒØąŲˆØ§Ø¨ØŗØĒÚ¯ÛŒâ€ŒŲ‡Ø§ + +Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ú†Ų†Ø¯ ØĒا ŲˆØ§Ø¨ØŗØĒگی ؈ [Ø˛ÛŒØąŲˆØ§Ø¨ØŗØĒگی](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank} داشØĒŲ‡ باشی ÚŠŲ‡ Ų‡Ų…Ø¯ÛŒÚ¯Ų‡ ØąŲˆ Ų†ÛŒØ§Ø˛ Ø¯Ø§ØąŲ† (Ø¨Ų‡â€ŒØšŲ†ŲˆØ§Ų† ŲžØ§ØąØ§Ų…ØĒØąŲ‡Ø§ÛŒ ØĒØšØąÛŒŲ ØĒابؚ)، بؚØļÛŒâ€ŒŲ‡Ø§Ø´ŲˆŲ† Ų…Ų…ÚŠŲ†Ų‡ با `async def` ØŗØ§ØŽØĒŲ‡ Ø¨Ø´Ų† ؈ بؚØļÛŒâ€ŒŲ‡Ø§ با `def` Ų…ØšŲ…ŲˆŲ„ÛŒ. Ø¨Ø§Ø˛Ų… ÚŠØ§Øą Ų…ÛŒâ€ŒÚŠŲ†Ų‡ØŒ ؈ Ø§ŲˆŲ†Ø§ÛŒÛŒ ÚŠŲ‡ با `def` Ų…ØšŲ…ŲˆŲ„ÛŒ ØŗØ§ØŽØĒŲ‡ Ø´Ø¯Ų† ØĒŲˆÛŒ ÛŒŲ‡ Ų†ØŽ ØŽØ§ØąØŦی (Ø§Ø˛ Ø§ØŗØĒØŽØą Ų†ØŽ) Øĩدا Ø˛Ø¯Ų‡ Ų…ÛŒâ€ŒØ´Ų† Ø¨Ų‡ ØŦای Ø§ÛŒŲ†ÚŠŲ‡ "Ų…Ų†ØĒØ¸ØąØ´ŲˆŲ†" Ø¨Ų…ŲˆŲ†Ų†. + +### ØĒŲˆØ§Ø¨Øš ÚŠØ§ØąØ¨ØąØ¯ÛŒ Ø¯ÛŒÚ¯Ų‡ + +Ų‡Øą ØĒابؚ ÚŠØ§ØąØ¨ØąØ¯ÛŒ Ø¯ÛŒÚ¯Ų‡â€ŒØ§ÛŒ ÚŠŲ‡ Ų…ØŗØĒŲ‚ÛŒŲ… ØŽŲˆØ¯ØĒ Øĩداش Ų…ÛŒâ€ŒÚŠŲ†ÛŒ Ų…ÛŒâ€ŒØĒŲˆŲ†Ų‡ با `def` Ų…ØšŲ…ŲˆŲ„ÛŒ یا `async def` ØŗØ§ØŽØĒŲ‡ Ø¨Ø´Ų‡ ؈ FastAPI ØąŲˆ Ų†Ø­ŲˆŲ‡ ØĩØ¯Ø§Ø˛Ø¯Ų†Ø´ ØĒØŖØĢÛŒØą Ų†Ų…ÛŒâ€ŒØ°Ø§ØąŲ‡. + +Ø§ÛŒŲ† Ø¨ØąØŽŲ„Ø§Ų ØĒŲˆØ§Ø¨ØšÛŒ Ų‡ØŗØĒ ÚŠŲ‡ FastAPI Ø¨ØąØ§ØĒ ØĩØ¯Ø§Ø´ŲˆŲ† Ų…ÛŒâ€ŒÚŠŲ†Ų‡: *ØĒŲˆØ§Ø¨Øš ØšŲ…Ų„ÛŒØ§ØĒ Ų…ØŗÛŒØą* ؈ ŲˆØ§Ø¨ØŗØĒÚ¯ÛŒâ€ŒŲ‡Ø§. + +Ø§Ú¯Ų‡ ØĒابؚ ÚŠØ§ØąØ¨ØąØ¯ÛŒØĒ ÛŒŲ‡ ØĒابؚ Ų…ØšŲ…ŲˆŲ„ÛŒ با `def` Ø¨Ø§Ø´Ų‡ØŒ Ų…ØŗØĒŲ‚ÛŒŲ… Øĩداش Ų…ÛŒâ€ŒÚŠŲ†Ų† (Ų‡Ų…ŲˆŲ†â€ŒØˇŲˆØą ÚŠŲ‡ ØĒŲˆÛŒ ڊدØĒ Ų†ŲˆØ´ØĒی)، Ų†Ų‡ ØĒŲˆÛŒ Ø§ØŗØĒØŽØą Ų†ØŽØŒ Ø§Ú¯Ų‡ ØĒابؚ با `async def` ØŗØ§ØŽØĒŲ‡ Ø´Ø¯Ų‡ Ø¨Ø§Ø´Ų‡ØŒ باید ŲˆŲ‚ØĒی ØĒŲˆÛŒ ڊدØĒ Øĩداش Ų…ÛŒâ€ŒÚŠŲ†ÛŒ `await`Ø´ ÚŠŲ†ÛŒ. + +--- + +Ø¯ŲˆØ¨Ø§ØąŲ‡ØŒ Ø§ÛŒŲ†Ø§ ØŦØ˛ØĻیاØĒ ØŽÛŒŲ„ÛŒ ŲŲ†ÛŒ Ų‡ØŗØĒŲ† ÚŠŲ‡ احØĒŲ…Ø§Ų„Ø§Ų‹ Ø§Ú¯Ų‡ Ø¯Ų†Ø¨Ø§Ų„Ø´ŲˆŲ† Ø§ŲˆŲ…Ø¯Ų‡ باشی Ø¨ØąØ§ØĒ Ų…ŲÛŒØ¯ Ø¨Ø§Ø´Ų†. + +ŲˆÚ¯ØąŲ†Ų‡ØŒ با ØąØ§Ų‡Ų†Ų…Ø§ÛŒÛŒâ€ŒŲ‡Ø§ÛŒ ب؎ش Ø¨Ø§Ų„Ø§ باید ØŽŲˆØ¨ باشی: ØšØŦŲ„Ų‡ Ø¯Ø§ØąÛŒØŸ. diff --git a/docs/fa/docs/environment-variables.md b/docs/fa/docs/environment-variables.md new file mode 100644 index 000000000..75309ce1f --- /dev/null +++ b/docs/fa/docs/environment-variables.md @@ -0,0 +1,298 @@ +# Ų…ØĒØēÛŒØąŲ‡Ø§ÛŒ Ų…Ø­ÛŒØˇÛŒ + +/// tip + +Ø§Ú¯Ų‡ Ø§Ø˛ Ų‚Ø¨Ų„ Ų…ÛŒâ€ŒØ¯ŲˆŲ†ÛŒ Ų…ØĒØēÛŒØąŲ‡Ø§ÛŒ Ų…Ø­ÛŒØˇÛŒ چی Ų‡ØŗØĒŲ† ؈ Ú†ØˇŲˆØą Ø§Ø˛Ø´ŲˆŲ† Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒØ´Ų‡ØŒ Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ø§ÛŒŲ† ب؎ش ØąŲˆ ØąØ¯ ÚŠŲ†ÛŒ. + +/// + +ÛŒŲ‡ Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ (ÚŠŲ‡ Ø¨Ų‡Ø´ "**env var**" Ų‡Ų… Ų…ÛŒâ€ŒÚ¯Ų†) ÛŒŲ‡ Ų…ØĒØēÛŒØąÛŒŲ‡ ÚŠŲ‡ **ØŽØ§ØąØŦ** Ø§Ø˛ ڊد ŲžØ§ÛŒØĒŲˆŲ†ØŒ ØĒŲˆÛŒ **ØŗÛŒØŗØĒŲ…â€ŒØšØ§Ų…Ų„** Ø˛Ų†Ø¯Ú¯ÛŒ Ų…ÛŒâ€ŒÚŠŲ†Ų‡ ؈ Ų…ÛŒâ€ŒØĒŲˆŲ†Ų‡ ØĒŲˆØŗØˇ ڊد ŲžØ§ÛŒØĒŲˆŲ†ØĒ (یا Ø¨ØąŲ†Ø§Ų…Ų‡â€ŒŲ‡Ø§ÛŒ Ø¯ÛŒÚ¯Ų‡) ØŽŲˆŲ†Ø¯Ų‡ Ø¨Ø´Ų‡. + +Ų…ØĒØēÛŒØąŲ‡Ø§ÛŒ Ų…Ø­ÛŒØˇÛŒ Ų…ÛŒâ€ŒØĒŲˆŲ†Ų† Ø¨ØąØ§ÛŒ Ų…Ø¯ÛŒØąÛŒØĒ **ØĒŲ†Ø¸ÛŒŲ…Ø§ØĒ** Ø¨ØąŲ†Ø§Ų…Ų‡ØŒ Ø¨Ų‡â€ŒØšŲ†ŲˆØ§Ų† ب؎شی Ø§Ø˛ **Ų†Øĩب** ŲžØ§ÛŒØĒŲˆŲ† ؈ ØēÛŒØąŲ‡ Ų…ŲÛŒØ¯ Ø¨Ø§Ø´Ų†. + +## ØŗØ§ØŽØĒ ؈ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ Ų…ØĒØēÛŒØąŲ‡Ø§ÛŒ Ų…Ø­ÛŒØˇÛŒ + +Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ų…ØĒØēÛŒØąŲ‡Ø§ÛŒ Ų…Ø­ÛŒØˇÛŒ ØąŲˆ ØĒŲˆÛŒ **Ø´Ų„ (ØĒØąŲ…ÛŒŲ†Ø§Ų„)** **Ø¨ØŗØ§Ø˛ÛŒ** ؈ Ø§Ø˛Ø´ŲˆŲ† Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒØŒ Ø¨Ø¯ŲˆŲ† Ø§ÛŒŲ†ÚŠŲ‡ Ø¨Ų‡ ŲžØ§ÛŒØĒŲˆŲ† Ų†ÛŒØ§Ø˛ داشØĒŲ‡ باشی: + +//// tab | Ų„ÛŒŲ†ŲˆÚŠØŗØŒ Ų…ÚŠâ€ŒØ§ŲˆØ§ØŗØŒ ŲˆÛŒŲ†Ø¯ŲˆØ˛ بش + +
+ +```console +// Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ ÛŒŲ‡ Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ Ø¨Ų‡ Ø§ØŗŲ… MY_NAME Ø¨ØŗØ§Ø˛ÛŒ با +$ export MY_NAME="Wade Wilson" + +// بؚد Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ با Ø¨ØąŲ†Ø§Ų…Ų‡â€ŒŲ‡Ø§ÛŒ Ø¯ÛŒÚ¯Ų‡ Ø§Ø˛Ø´ Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒØŒ Ų…ØĢŲ„ +$ echo "Hello $MY_NAME" + +Hello Wade Wilson +``` + +
+ +//// + +//// tab | ŲˆÛŒŲ†Ø¯ŲˆØ˛ ŲžØ§ŲˆØąØ´Ų„ + +
+ +```console +// ÛŒŲ‡ Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ Ø¨Ų‡ Ø§ØŗŲ… MY_NAME Ø¨ØŗØ§Ø˛ +$ $Env:MY_NAME = "Wade Wilson" + +// با Ø¨ØąŲ†Ø§Ų…Ų‡â€ŒŲ‡Ø§ÛŒ Ø¯ÛŒÚ¯Ų‡ Ø§Ø˛Ø´ Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ØŒ Ų…ØĢŲ„ +$ echo "Hello $Env:MY_NAME" + +Hello Wade Wilson +``` + +
+ +//// + +## ØŽŲˆŲ†Ø¯Ų† Ų…ØĒØēÛŒØąŲ‡Ø§ÛŒ Ų…Ø­ÛŒØˇÛŒ ØĒŲˆÛŒ ŲžØ§ÛŒØĒŲˆŲ† + +Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ų…ØĒØēÛŒØąŲ‡Ø§ÛŒ Ų…Ø­ÛŒØˇÛŒ ØąŲˆ **ØŽØ§ØąØŦ** Ø§Ø˛ ŲžØ§ÛŒØĒŲˆŲ†ØŒ ØĒŲˆÛŒ ØĒØąŲ…ÛŒŲ†Ø§Ų„ (یا با Ų‡Øą ØąŲˆØ´ Ø¯ÛŒÚ¯Ų‡) Ø¨ØŗØ§Ø˛ÛŒØŒ ؈ بؚد ØĒŲˆÛŒ **ŲžØ§ÛŒØĒŲˆŲ†** Ø§ŲˆŲ†Ø§ ØąŲˆ Ø¨ØŽŲˆŲ†ÛŒ. + +Ų…ØĢŲ„Ø§Ų‹ Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ ÛŒŲ‡ ŲØ§ÛŒŲ„ `main.py` داشØĒŲ‡ باشی با: + +```Python hl_lines="3" +import os + +name = os.getenv("MY_NAME", "World") +print(f"Hello {name} from Python") +``` + +/// tip + +ØĸØąÚ¯ŲˆŲ…Ø§Ų† Ø¯ŲˆŲ… `os.getenv()` Ų…Ų‚Ø¯Ø§Øą ŲžÛŒØ´â€ŒŲØąØļÛŒŲ‡ ÚŠŲ‡ Ø¨ØąŲ…ÛŒâ€ŒÚ¯ØąØ¯ŲˆŲ†Ų‡. + +Ø§Ú¯Ų‡ Ų†Ø¯ÛŒØŒ Ø¨Ų‡â€ŒØĩŲˆØąØĒ ŲžÛŒØ´â€ŒŲØąØļ `None` Ų‡ØŗØĒ، Ø§ÛŒŲ†ØŦا Ų…Ø§ `"World"` ØąŲˆ Ø¨Ų‡â€ŒØšŲ†ŲˆØ§Ų† Ų…Ų‚Ø¯Ø§Øą ŲžÛŒØ´â€ŒŲØąØļ گذاشØĒÛŒŲ…. + +/// + +بؚد Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ø§ŲˆŲ† Ø¨ØąŲ†Ø§Ų…Ų‡ ŲžØ§ÛŒØĒŲˆŲ† ØąŲˆ Øĩدا ÚŠŲ†ÛŒ: + +//// tab | Ų„ÛŒŲ†ŲˆÚŠØŗØŒ Ų…ÚŠâ€ŒØ§ŲˆØ§ØŗØŒ ŲˆÛŒŲ†Ø¯ŲˆØ˛ بش + +
+ +```console +// Ø§ÛŒŲ†ØŦا Ų‡Ų†ŲˆØ˛ Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ ØąŲˆ ØĒŲ†Ø¸ÛŒŲ… Ų†ÚŠØąØ¯ÛŒŲ… +$ python main.py + +// Ú†ŲˆŲ† Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ ØąŲˆ ØĒŲ†Ø¸ÛŒŲ… Ų†ÚŠØąØ¯ÛŒŲ…ØŒ Ų…Ų‚Ø¯Ø§Øą ŲžÛŒØ´â€ŒŲØąØļ ØąŲˆ Ų…ÛŒâ€ŒÚ¯ÛŒØąÛŒŲ… + +Hello World from Python + +// ŲˆŲ„ÛŒ Ø§Ú¯Ų‡ Ø§ŲˆŲ„ ÛŒŲ‡ Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ Ø¨ØŗØ§Ø˛ÛŒŲ… +$ export MY_NAME="Wade Wilson" + +// ؈ بؚد Ø¯ŲˆØ¨Ø§ØąŲ‡ Ø¨ØąŲ†Ø§Ų…Ų‡ ØąŲˆ Øĩدا ÚŠŲ†ÛŒŲ… +$ python main.py + +// Ø­Ø§Ų„Ø§ Ų…ÛŒâ€ŒØĒŲˆŲ†Ų‡ Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ ØąŲˆ Ø¨ØŽŲˆŲ†Ų‡ + +Hello Wade Wilson from Python +``` + +
+ +//// + +//// tab | ŲˆÛŒŲ†Ø¯ŲˆØ˛ ŲžØ§ŲˆØąØ´Ų„ + +
+ +```console +// Ø§ÛŒŲ†ØŦا Ų‡Ų†ŲˆØ˛ Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ ØąŲˆ ØĒŲ†Ø¸ÛŒŲ… Ų†ÚŠØąØ¯ÛŒŲ… +$ python main.py + +// Ú†ŲˆŲ† Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ ØąŲˆ ØĒŲ†Ø¸ÛŒŲ… Ų†ÚŠØąØ¯ÛŒŲ…ØŒ Ų…Ų‚Ø¯Ø§Øą ŲžÛŒØ´â€ŒŲØąØļ ØąŲˆ Ų…ÛŒâ€ŒÚ¯ÛŒØąÛŒŲ… + +Hello World from Python + +// ŲˆŲ„ÛŒ Ø§Ú¯Ų‡ Ø§ŲˆŲ„ ÛŒŲ‡ Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ Ø¨ØŗØ§Ø˛ÛŒŲ… +$ $Env:MY_NAME = "Wade Wilson" + +// ؈ بؚد Ø¯ŲˆØ¨Ø§ØąŲ‡ Ø¨ØąŲ†Ø§Ų…Ų‡ ØąŲˆ Øĩدا ÚŠŲ†ÛŒŲ… +$ python main.py + +// Ø­Ø§Ų„Ø§ Ų…ÛŒâ€ŒØĒŲˆŲ†Ų‡ Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ ØąŲˆ Ø¨ØŽŲˆŲ†Ų‡ + +Hello Wade Wilson from Python +``` + +
+ +//// + +Ú†ŲˆŲ† Ų…ØĒØēÛŒØąŲ‡Ø§ÛŒ Ų…Ø­ÛŒØˇÛŒ Ų…ÛŒâ€ŒØĒŲˆŲ†Ų† ØŽØ§ØąØŦ Ø§Ø˛ ڊد ØĒŲ†Ø¸ÛŒŲ… Ø¨Ø´Ų†ØŒ ŲˆŲ„ÛŒ ڊد Ų…ÛŒâ€ŒØĒŲˆŲ†Ų‡ Ø§ŲˆŲ†Ø§ ØąŲˆ Ø¨ØŽŲˆŲ†Ų‡ØŒ ؈ Ų„Ø§Ø˛Ų… Ų†ÛŒØŗØĒ با Ø¨Ų‚ÛŒŲ‡ ŲØ§ÛŒŲ„â€ŒŲ‡Ø§ Ø°ØŽÛŒØąŲ‡ (ÚŠŲ…ÛŒØĒی Ø¨Ų‡ `git`) Ø¨Ø´Ų†ØŒ Ų…ØšŲ…ŲˆŲ„Ø§Ų‹ Ø¨ØąØ§ÛŒ ŲžÛŒÚŠØąØ¨Ų†Ø¯ÛŒ یا **ØĒŲ†Ø¸ÛŒŲ…Ø§ØĒ** Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒØ´Ų†. + +Ų‡Ų…Ú†Ų†ÛŒŲ† Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ ÛŒŲ‡ Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ ØąŲˆ ŲŲ‚Øˇ Ø¨ØąØ§ÛŒ **ÛŒŲ‡ اØŦØąØ§ÛŒ ؎اØĩ Ø¨ØąŲ†Ø§Ų…Ų‡** Ø¨ØŗØ§Ø˛ÛŒØŒ ÚŠŲ‡ ŲŲ‚Øˇ Ø¨ØąØ§ÛŒ Ø§ŲˆŲ† Ø¨ØąŲ†Ø§Ų…Ų‡ ؈ ŲŲ‚Øˇ Ø¨ØąØ§ÛŒ Ų…Ø¯ØĒ Ø˛Ų…Ø§Ų† اØŦØąØ§Ø´ Ø¯Øą Ø¯ØŗØĒØąØŗŲ‡. + +Ø¨ØąØ§ÛŒ Ø§ÛŒŲ† ÚŠØ§ØąØŒ Ø¯ØąØŗØĒ Ų‚Ø¨Ų„ Ø§Ø˛ ØŽŲˆØ¯ Ø¨ØąŲ†Ø§Ų…Ų‡ØŒ ØĒŲˆÛŒ Ų‡Ų…ŲˆŲ† ØŽØˇ Ø¨ØŗØ§Ø˛Ø´: + +
+ +```console +// ÛŒŲ‡ Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ MY_NAME ØąŲˆ ØĒŲˆÛŒ ØŽØˇ Ø¨ØąØ§ÛŒ Ø§ÛŒŲ† اØŦØąØ§ÛŒ Ø¨ØąŲ†Ø§Ų…Ų‡ Ø¨ØŗØ§Ø˛ +$ MY_NAME="Wade Wilson" python main.py + +// Ø­Ø§Ų„Ø§ Ų…ÛŒâ€ŒØĒŲˆŲ†Ų‡ Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ ØąŲˆ Ø¨ØŽŲˆŲ†Ų‡ + +Hello Wade Wilson from Python + +// Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ بؚدش Ø¯ÛŒÚ¯Ų‡ ؈ØŦŲˆØ¯ Ų†Ø¯Ø§ØąŲ‡ +$ python main.py + +Hello World from Python +``` + +
+ +/// tip + +Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ بیشØĒØą Ø¯Øą Ų…ŲˆØąØ¯Ø´ ØĒŲˆÛŒ Ø¨ØąŲ†Ø§Ų…Ų‡ Ø¯ŲˆØ§Ø˛Ø¯Ų‡â€ŒŲØ§ÚŠØĒŲˆØąÛŒ: ŲžÛŒÚŠØąØ¨Ų†Ø¯ÛŒ Ø¨ØŽŲˆŲ†ÛŒ. + +/// + +## Ų†ŲˆØšâ€ŒŲ‡Ø§ ؈ اؚØĒØ¨Ø§ØąØŗŲ†ØŦی + +Ø§ÛŒŲ† Ų…ØĒØēÛŒØąŲ‡Ø§ÛŒ Ų…Ø­ÛŒØˇÛŒ ŲŲ‚Øˇ Ų…ÛŒâ€ŒØĒŲˆŲ†Ų† **ØąØ´ØĒŲ‡â€ŒŲ‡Ø§ÛŒ Ų…ØĒŲ†ÛŒ** ØąŲˆ Ų†Ú¯Ų‡ Ø¯Ø§ØąŲ†ØŒ Ú†ŲˆŲ† ØŽØ§ØąØŦ Ø§Ø˛ ŲžØ§ÛŒØĒŲˆŲ† Ų‡ØŗØĒŲ† ؈ باید با Ø¨ØąŲ†Ø§Ų…Ų‡â€ŒŲ‡Ø§ÛŒ Ø¯ÛŒÚ¯Ų‡ ؈ Ø¨Ų‚ÛŒŲ‡ ØŗÛŒØŗØĒŲ… (؈ Ø­ØĒی ØŗÛŒØŗØĒŲ…â€ŒØšØ§Ų…Ų„â€ŒŲ‡Ø§ÛŒ Ų…ØŽØĒ؄؁ Ų…ØĢŲ„ Ų„ÛŒŲ†ŲˆÚŠØŗØŒ ŲˆÛŒŲ†Ø¯ŲˆØ˛ØŒ Ų…ÚŠâ€ŒØ§ŲˆØ§Øŗ) ØŗØ§Ø˛Ú¯Ø§Øą Ø¨Ø§Ø´Ų†. + +ÛŒØšŲ†ÛŒ **Ų‡Øą Ų…Ų‚Ø¯Ø§ØąÛŒ** ÚŠŲ‡ ØĒŲˆÛŒ ŲžØ§ÛŒØĒŲˆŲ† Ø§Ø˛ ÛŒŲ‡ Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ ØŽŲˆŲ†Ø¯Ų‡ Ų…ÛŒâ€ŒØ´Ų‡ ÛŒŲ‡ `str` Ų‡ØŗØĒ، ؈ Ų‡Øą ØĒØ¨Ø¯ÛŒŲ„ Ø¨Ų‡ Ų†ŲˆØš Ø¯ÛŒÚ¯Ų‡ یا Ų‡Øą اؚØĒØ¨Ø§ØąØŗŲ†ØŦی باید ØĒŲˆÛŒ ڊد Ø§Ų†ØŦØ§Ų… Ø¨Ø´Ų‡. + +ØĒŲˆÛŒ [ØąØ§Ų‡Ų†Ų…Ø§ÛŒ ÚŠØ§ØąØ¨Øą ŲžÛŒØ´ØąŲØĒŲ‡ - ØĒŲ†Ø¸ÛŒŲ…Ø§ØĒ ؈ Ų…ØĒØēÛŒØąŲ‡Ø§ÛŒ Ų…Ø­ÛŒØˇÛŒ](./advanced/settings.md){.internal-link target=_blank} بیشØĒØą Ø¯Øą Ų…ŲˆØąØ¯ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ Ų…ØĒØēÛŒØąŲ‡Ø§ÛŒ Ų…Ø­ÛŒØˇÛŒ Ø¨ØąØ§ÛŒ Ų…Ø¯ÛŒØąÛŒØĒ **ØĒŲ†Ø¸ÛŒŲ…Ø§ØĒ Ø¨ØąŲ†Ø§Ų…Ų‡** یاد Ų…ÛŒâ€ŒÚ¯ÛŒØąÛŒ. + +## Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ `PATH` + +ÛŒŲ‡ Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ **؎اØĩ** Ø¨Ų‡ Ø§ØŗŲ… **`PATH`** ؈ØŦŲˆØ¯ Ø¯Ø§ØąŲ‡ ÚŠŲ‡ ØŗÛŒØŗØĒŲ…â€ŒØšØ§Ų…Ų„â€ŒŲ‡Ø§ (Ų„ÛŒŲ†ŲˆÚŠØŗØŒ Ų…ÚŠâ€ŒØ§ŲˆØ§ØŗØŒ ŲˆÛŒŲ†Ø¯ŲˆØ˛) Ø§Ø˛Ø´ Ø¨ØąØ§ÛŒ ŲžÛŒØ¯Ø§ ÚŠØąØ¯Ų† Ø¨ØąŲ†Ø§Ų…Ų‡â€ŒŲ‡Ø§ÛŒÛŒ ÚŠŲ‡ Ų‚ØąØ§ØąŲ‡ اØŦØąØ§ Ø¨Ø´Ų† Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒÚŠŲ†Ų†. + +Ų…Ų‚Ø¯Ø§Øą Ų…ØĒØēÛŒØą `PATH` ÛŒŲ‡ ØąØ´ØĒŲ‡ ØˇŲˆŲ„Ø§Ų†ÛŒ Ø§Ø˛ ŲžŲˆØ´Ų‡â€ŒŲ‡Ø§ØŗØĒ ÚŠŲ‡ ØĒŲˆÛŒ Ų„ÛŒŲ†ŲˆÚŠØŗ ؈ Ų…ÚŠâ€ŒØ§ŲˆØ§Øŗ با Ø¯ŲˆŲ†Ų‚ØˇŲ‡ `:` ؈ ØĒŲˆÛŒ ŲˆÛŒŲ†Ø¯ŲˆØ˛ با Ų†Ų‚ØˇŲ‡â€ŒŲˆÛŒØąÚ¯ŲˆŲ„ `;` Ø§Ø˛ Ų‡Ų… ØŦدا Ø´Ø¯Ų†. + +Ų…ØĢŲ„Ø§Ų‹ØŒ Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ `PATH` Ų…ÛŒâ€ŒØĒŲˆŲ†Ų‡ Ø§ÛŒŲ†ØŦŲˆØąÛŒ Ø¨Ø§Ø´Ų‡: + +//// tab | Ų„ÛŒŲ†ŲˆÚŠØŗØŒ Ų…ÚŠâ€ŒØ§ŲˆØ§Øŗ + +```plaintext +/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin +``` + +ÛŒØšŲ†ÛŒ ØŗÛŒØŗØĒŲ… باید Ø¯Ų†Ø¨Ø§Ų„ Ø¨ØąŲ†Ø§Ų…Ų‡â€ŒŲ‡Ø§ ØĒŲˆÛŒ Ø§ÛŒŲ† ŲžŲˆØ´Ų‡â€ŒŲ‡Ø§ Ø¨Ú¯ØąØ¯Ų‡: + +* `/usr/local/bin` +* `/usr/bin` +* `/bin` +* `/usr/sbin` +* `/sbin` + +//// + +//// tab | ŲˆÛŒŲ†Ø¯ŲˆØ˛ + +```plaintext +C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32 +``` + +ÛŒØšŲ†ÛŒ ØŗÛŒØŗØĒŲ… باید Ø¯Ų†Ø¨Ø§Ų„ Ø¨ØąŲ†Ø§Ų…Ų‡â€ŒŲ‡Ø§ ØĒŲˆÛŒ Ø§ÛŒŲ† ŲžŲˆØ´Ų‡â€ŒŲ‡Ø§ Ø¨Ú¯ØąØ¯Ų‡: + +* `C:\Program Files\Python312\Scripts` +* `C:\Program Files\Python312` +* `C:\Windows\System32` + +//// + +ŲˆŲ‚ØĒی ÛŒŲ‡ **Ø¯ØŗØĒŲˆØą** ØĒŲˆÛŒ ØĒØąŲ…ÛŒŲ†Ø§Ų„ ØĒØ§ÛŒŲž Ų…ÛŒâ€ŒÚŠŲ†ÛŒØŒ ØŗÛŒØŗØĒŲ…â€ŒØšØ§Ų…Ų„ **Ø¯Ų†Ø¨Ø§Ų„** Ø¨ØąŲ†Ø§Ų…Ų‡ ØĒŲˆÛŒ **Ų‡Øą ÚŠØ¯ŲˆŲ… Ø§Ø˛ Ø§ÛŒŲ† ŲžŲˆØ´Ų‡â€ŒŲ‡Ø§** ÚŠŲ‡ ØĒŲˆÛŒ Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ `PATH` Ų„ÛŒØŗØĒ Ø´Ø¯Ų† Ų…ÛŒâ€ŒÚ¯ØąØ¯Ų‡. + +Ų…ØĢŲ„Ø§Ų‹ØŒ ŲˆŲ‚ØĒی ØĒŲˆÛŒ ØĒØąŲ…ÛŒŲ†Ø§Ų„ `python` ØĒØ§ÛŒŲž Ų…ÛŒâ€ŒÚŠŲ†ÛŒØŒ ØŗÛŒØŗØĒŲ…â€ŒØšØ§Ų…Ų„ Ø¯Ų†Ø¨Ø§Ų„ ÛŒŲ‡ Ø¨ØąŲ†Ø§Ų…Ų‡ Ø¨Ų‡ Ø§ØŗŲ… `python` ØĒŲˆÛŒ **Ø§ŲˆŲ„ÛŒŲ† ŲžŲˆØ´Ų‡** ØĒŲˆÛŒ Ø§ŲˆŲ† Ų„ÛŒØŗØĒ Ų…ÛŒâ€ŒÚ¯ØąØ¯Ų‡. + +Ø§Ú¯Ų‡ ŲžÛŒØ¯Ø§Ø´ ÚŠŲ†Ų‡ØŒ **Ø§ØŗØĒŲØ§Ø¯Ų‡â€ŒØ´ Ų…ÛŒâ€ŒÚŠŲ†Ų‡**. ŲˆÚ¯ØąŲ†Ų‡ ØĒŲˆÛŒ **ŲžŲˆØ´Ų‡â€ŒŲ‡Ø§ÛŒ بؚدی** Ø¯Ų†Ø¨Ø§Ų„Ø´ Ų…ÛŒâ€ŒÚ¯ØąØ¯Ų‡. + +### Ų†Øĩب ŲžØ§ÛŒØĒŲˆŲ† ؈ Ø¨Ų‡â€ŒØąŲˆØ˛ØąØŗØ§Ų†ÛŒ `PATH` + +ŲˆŲ‚ØĒی ŲžØ§ÛŒØĒŲˆŲ† ØąŲˆ Ų†Øĩب Ų…ÛŒâ€ŒÚŠŲ†ÛŒØŒ Ų…Ų…ÚŠŲ†Ų‡ Ø§Ø˛ØĒ Ø¨ŲžØąØŗŲ† Øĸیا Ų…ÛŒâ€ŒØŽŲˆØ§ÛŒ Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ `PATH` ØąŲˆ Ø¨Ų‡â€ŒØąŲˆØ˛ØąØŗØ§Ų†ÛŒ ÚŠŲ†ÛŒ. + +//// tab | Ų„ÛŒŲ†ŲˆÚŠØŗØŒ Ų…ÚŠâ€ŒØ§ŲˆØ§Øŗ + +ŲØąØļ ÚŠŲ† ŲžØ§ÛŒØĒŲˆŲ† ØąŲˆ Ų†Øĩب ÚŠØąØ¯ÛŒ ؈ ØĒŲˆÛŒ ÛŒŲ‡ ŲžŲˆØ´Ų‡ `/opt/custompython/bin` Ų‚ØąØ§Øą Ú¯ØąŲØĒŲ‡. + +Ø§Ú¯Ų‡ بگی Ø¨Ų„Ų‡ Ø¨ØąØ§ÛŒ Ø¨Ų‡â€ŒØąŲˆØ˛ØąØŗØ§Ų†ÛŒ Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ `PATH`، Ų†Øĩاب `/opt/custompython/bin` ØąŲˆ Ø¨Ų‡ Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ `PATH` اØļØ§ŲŲ‡ Ų…ÛŒâ€ŒÚŠŲ†Ų‡. + +Ų…Ų…ÚŠŲ†Ų‡ Ø§ÛŒŲ†ØŦŲˆØąÛŒ Ø¨Ø´Ų‡: + +```plaintext +/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/custompython/bin +``` + +Ø§ÛŒŲ†â€ŒØŦŲˆØąÛŒØŒ ŲˆŲ‚ØĒی ØĒŲˆÛŒ ØĒØąŲ…ÛŒŲ†Ø§Ų„ `python` ØĒØ§ÛŒŲž Ų…ÛŒâ€ŒÚŠŲ†ÛŒØŒ ØŗÛŒØŗØĒŲ… Ø¨ØąŲ†Ø§Ų…Ų‡ ŲžØ§ÛŒØĒŲˆŲ† ØąŲˆ ØĒŲˆÛŒ `/opt/custompython/bin` (ØĸØŽØąÛŒŲ† ŲžŲˆØ´Ų‡) ŲžÛŒØ¯Ø§ Ų…ÛŒâ€ŒÚŠŲ†Ų‡ ؈ Ø§Ø˛ Ø§ŲˆŲ† Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒÚŠŲ†Ų‡. + +//// + +//// tab | ŲˆÛŒŲ†Ø¯ŲˆØ˛ + +ŲØąØļ ÚŠŲ† ŲžØ§ÛŒØĒŲˆŲ† ØąŲˆ Ų†Øĩب ÚŠØąØ¯ÛŒ ؈ ØĒŲˆÛŒ ÛŒŲ‡ ŲžŲˆØ´Ų‡ `C:\opt\custompython\bin` Ų‚ØąØ§Øą Ú¯ØąŲØĒŲ‡. + +Ø§Ú¯Ų‡ بگی Ø¨Ų„Ų‡ Ø¨ØąØ§ÛŒ Ø¨Ų‡â€ŒØąŲˆØ˛ØąØŗØ§Ų†ÛŒ Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ `PATH`، Ų†Øĩاب `C:\opt\custompython\bin` ØąŲˆ Ø¨Ų‡ Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ `PATH` اØļØ§ŲŲ‡ Ų…ÛŒâ€ŒÚŠŲ†Ų‡. + +```plaintext +C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32;C:\opt\custompython\bin +``` + +Ø§ÛŒŲ†â€ŒØŦŲˆØąÛŒØŒ ŲˆŲ‚ØĒی ØĒŲˆÛŒ ØĒØąŲ…ÛŒŲ†Ø§Ų„ `python` ØĒØ§ÛŒŲž Ų…ÛŒâ€ŒÚŠŲ†ÛŒØŒ ØŗÛŒØŗØĒŲ… Ø¨ØąŲ†Ø§Ų…Ų‡ ŲžØ§ÛŒØĒŲˆŲ† ØąŲˆ ØĒŲˆÛŒ `C:\opt\custompython\bin` (ØĸØŽØąÛŒŲ† ŲžŲˆØ´Ų‡) ŲžÛŒØ¯Ø§ Ų…ÛŒâ€ŒÚŠŲ†Ų‡ ؈ Ø§Ø˛ Ø§ŲˆŲ† Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒÚŠŲ†Ų‡. + +//// + +ŲžØŗØŒ Ø§Ú¯Ų‡ ØĒØ§ÛŒŲž ÚŠŲ†ÛŒ: + +
+ +```console +$ python +``` + +
+ +//// tab | Ų„ÛŒŲ†ŲˆÚŠØŗØŒ Ų…ÚŠâ€ŒØ§ŲˆØ§Øŗ + +ØŗÛŒØŗØĒŲ… Ø¨ØąŲ†Ø§Ų…Ų‡ `python` ØąŲˆ ØĒŲˆÛŒ `/opt/custompython/bin` **ŲžÛŒØ¯Ø§** Ų…ÛŒâ€ŒÚŠŲ†Ų‡ ؈ اØŦØąØ§Ø´ Ų…ÛŒâ€ŒÚŠŲ†Ų‡. + +ØĒŲ‚ØąÛŒØ¨Ø§Ų‹ Ų…ØšØ§Ø¯Ų„ Ø§ÛŒŲ†Ų‡ ÚŠŲ‡ ØĒØ§ÛŒŲž ÚŠŲ†ÛŒ: + +
+ +```console +$ /opt/custompython/bin/python +``` + +
+ +//// + +//// tab | ŲˆÛŒŲ†Ø¯ŲˆØ˛ + +ØŗÛŒØŗØĒŲ… Ø¨ØąŲ†Ø§Ų…Ų‡ `python` ØąŲˆ ØĒŲˆÛŒ `C:\opt\custompython\bin\python` **ŲžÛŒØ¯Ø§** Ų…ÛŒâ€ŒÚŠŲ†Ų‡ ؈ اØŦØąØ§Ø´ Ų…ÛŒâ€ŒÚŠŲ†Ų‡. + +ØĒŲ‚ØąÛŒØ¨Ø§Ų‹ Ų…ØšØ§Ø¯Ų„ Ø§ÛŒŲ†Ų‡ ÚŠŲ‡ ØĒØ§ÛŒŲž ÚŠŲ†ÛŒ: + +
+ +```console +$ C:\opt\custompython\bin\python +``` + +
+ +//// + +Ø§ÛŒŲ† Ø§ØˇŲ„Ø§ØšØ§ØĒ ŲˆŲ‚ØĒی Ø¯Øą Ų…ŲˆØąØ¯ [Ų…Ø­ÛŒØˇâ€ŒŲ‡Ø§ÛŒ Ų…ØŦØ§Ø˛ÛŒ](virtual-environments.md){.internal-link target=_blank} یاد Ų…ÛŒâ€ŒÚ¯ÛŒØąÛŒ Ø¨Ų‡â€ŒØ¯ØąØ¯ØĒ Ų…ÛŒâ€ŒØŽŲˆØąŲ‡. + +## Ų†ØĒیØŦŲ‡â€ŒÚ¯ÛŒØąÛŒ + +با Ø§ÛŒŲ† باید ÛŒŲ‡ Ø¯ØąÚŠ ŲžØ§ÛŒŲ‡â€ŒØ§ÛŒ Ø§Ø˛ **Ų…ØĒØēÛŒØąŲ‡Ø§ÛŒ Ų…Ø­ÛŒØˇÛŒ** ؈ Ų†Ø­ŲˆŲ‡ Ø§ØŗØĒŲØ§Ø¯Ų‡â€ŒØ´ŲˆŲ† ØĒŲˆÛŒ ŲžØ§ÛŒØĒŲˆŲ† داشØĒŲ‡ باشی. + +Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ بیشØĒØą Ø¯Øą Ų…ŲˆØąØ¯Ø´ŲˆŲ† ØĒŲˆÛŒ ŲˆÛŒÚŠÛŒâ€ŒŲžØ¯ÛŒØ§ Ø¨ØąØ§ÛŒ Ų…ØĒØēÛŒØą Ų…Ø­ÛŒØˇÛŒ Ø¨ØŽŲˆŲ†ÛŒ. + +ØĒŲˆÛŒ ØŽÛŒŲ„ÛŒ Ų…ŲˆØ§ØąØ¯ Ų…Ø´ØŽØĩ Ų†ÛŒØŗØĒ ÚŠŲ‡ Ų…ØĒØēÛŒØąŲ‡Ø§ÛŒ Ų…Ø­ÛŒØˇÛŒ Ú†ØˇŲˆØą Ų…ÛŒâ€ŒØĒŲˆŲ†Ų† ŲŲˆØąÛŒ Ų…ŲÛŒØ¯ ؈ ÚŠØ§ØąØ¨ØąØ¯ÛŒ Ø¨Ø§Ø´Ų†. ŲˆŲ„ÛŒ ØĒŲˆÛŒ Ų…ŲˆŲ‚ØšÛŒØĒâ€ŒŲ‡Ø§ÛŒ Ų…ØŽØĒ؄؁ ØĒŲˆØŗØšŲ‡ Ų…Ø¯Ø§Ų… ŲžÛŒØ¯Ø§Ø´ŲˆŲ† Ų…ÛŒâ€ŒØ´Ų‡ØŒ ŲžØŗ ØŽŲˆØ¨Ų‡ ÚŠŲ‡ Ø¯Øą Ų…ŲˆØąØ¯Ø´ŲˆŲ† Ø¨Ø¯ŲˆŲ†ÛŒ. + +Ų…ØĢŲ„Ø§Ų‹ØŒ ØĒŲˆÛŒ ب؎ش بؚدی Ø¯Øą Ų…ŲˆØąØ¯ [Ų…Ø­ÛŒØˇâ€ŒŲ‡Ø§ÛŒ Ų…ØŦØ§Ø˛ÛŒ](virtual-environments.md) Ø¨Ų‡ Ø§ÛŒŲ† Ø§ØˇŲ„Ø§ØšØ§ØĒ Ų†ÛŒØ§Ø˛ Ø¯Ø§ØąÛŒ. diff --git a/docs/fa/docs/learn/index.md b/docs/fa/docs/learn/index.md new file mode 100644 index 000000000..06aa7f00e --- /dev/null +++ b/docs/fa/docs/learn/index.md @@ -0,0 +1,5 @@ +# ÛŒØ§Ø¯Ú¯ÛŒØąÛŒ + +Ø§ÛŒŲ†ØŦا Ø¨ØŽØ´â€ŒŲ‡Ø§ÛŒ Ų…Ų‚Ø¯Ų…Ø§ØĒی ؈ ØĸŲ…ŲˆØ˛Ø´â€ŒŲ‡Ø§ÛŒÛŒ Ų‡ØŗØĒŲ† ÚŠŲ‡ Ø¨ØąØ§ÛŒ ÛŒØ§Ø¯Ú¯ÛŒØąÛŒ **FastAPI** Ø¨Ų‡ØĒ ÚŠŲ…ÚŠ Ų…ÛŒâ€ŒÚŠŲ†Ų†. + +Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ø§ÛŒŲ†Ųˆ ÛŒŲ‡ **ÚŠØĒاب**، ÛŒŲ‡ **Ø¯ŲˆØąŲ‡ ØĸŲ…ŲˆØ˛Ø´ÛŒ**، یا ØąØ§Ų‡ **ØąØŗŲ…ÛŒ** ؈ ŲžÛŒØ´Ų†Ų‡Ø§Ø¯ÛŒ Ø¨ØąØ§ÛŒ ÛŒØ§Ø¯Ú¯ÛŒØąÛŒ FastAPI Ø¯Øą Ų†Ø¸Øą Ø¨Ú¯ÛŒØąÛŒ. 😎 diff --git a/docs/fa/docs/python-types.md b/docs/fa/docs/python-types.md new file mode 100644 index 000000000..c428acbf7 --- /dev/null +++ b/docs/fa/docs/python-types.md @@ -0,0 +1,578 @@ +# Ų…Ų‚Ø¯Ų…Ų‡â€ŒØ§ÛŒ Ø¨Øą Ø§Ų†ŲˆØ§Øš Ų†ŲˆØš Ø¯Øą ŲžØ§ÛŒØĒŲˆŲ† + +ŲžØ§ÛŒØĒŲˆŲ† Ø§Ø˛ "Ų†ŲˆØšâ€ŒŲ†Ų…Ø§"Ų‡Ø§ÛŒ ا؎ØĒÛŒØ§ØąÛŒ (ÚŠŲ‡ Ø¨Ų‡Ø´ŲˆŲ† "type hints" یا "type annotations" Ų‡Ų… Ų…ÛŒâ€ŒÚ¯Ų†) ŲžØ´ØĒÛŒØ¨Ø§Ų†ÛŒ Ų…ÛŒâ€ŒÚŠŲ†Ų‡. + +Ø§ÛŒŲ† **"Ų†ŲˆØšâ€ŒŲ†Ų…Ø§Ų‡Ø§"** یا annotationŲ‡Ø§ ÛŒŲ‡ ØŗÛŒŲ†ØĒÚŠØŗ ؎اØĩ Ų‡ØŗØĒŲ† ÚŠŲ‡ Ø¨Ų‡ØĒ اØŦØ§Ø˛Ų‡ Ų…ÛŒâ€ŒØ¯Ų† Ų†ŲˆØš ÛŒŲ‡ Ų…ØĒØēÛŒØą ØąŲˆ Ų…Ø´ØŽØĩ ÚŠŲ†ÛŒ. + +با Ų…Ø´ØŽØĩ ÚŠØąØ¯Ų† Ų†ŲˆØš Ų…ØĒØēÛŒØąŲ‡Ø§ØŒ ŲˆÛŒØąØ§ÛŒØ´Ú¯ØąŲ‡Ø§ ؈ Ø§Ø¨Ø˛Ø§ØąŲ‡Ø§ Ų…ÛŒâ€ŒØĒŲˆŲ†Ų† ŲžØ´ØĒÛŒØ¨Ø§Ų†ÛŒ Ø¨Ų‡ØĒØąÛŒ Ø¨Ų‡ØĒ Ø¨Ø¯Ų†. + +Ø§ÛŒŲ† ŲŲ‚Øˇ ÛŒŲ‡ **ØĸŲ…ŲˆØ˛Ø´ ØŗØąÛŒØš / یادØĸŲˆØąÛŒ** Ø¯Øą Ų…ŲˆØąØ¯ Ų†ŲˆØšâ€ŒŲ†Ų…Ø§Ų‡Ø§ÛŒ ŲžØ§ÛŒØĒŲˆŲ†Ų‡. ŲŲ‚Øˇ Ø­Ø¯Ø§Ų‚Ų„ Ú†ÛŒØ˛Ø§ÛŒÛŒ ÚŠŲ‡ Ø¨ØąØ§ÛŒ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛Ø´ŲˆŲ† با **FastAPI** Ų„Ø§Ø˛Ų…Ų‡ ØąŲˆ ŲžŲˆØ´Ø´ Ų…ÛŒâ€ŒØ¯Ų‡... ÚŠŲ‡ Ø¯Øą ŲˆØ§Ų‚Øš ØŽÛŒŲ„ÛŒ ÚŠŲ…Ų‡. + +**FastAPI** ÚŠØ§Ų…Ų„Ø§Ų‹ Ø¨Øą ŲžØ§ÛŒŲ‡ Ø§ÛŒŲ† Ų†ŲˆØšâ€ŒŲ†Ų…Ø§Ų‡Ø§ØŗØĒ ؈ Ø§ÛŒŲ† Ø¨Ų‡Ø´ ÚŠŲ„ÛŒ Ų…Ø˛ÛŒØĒ ؈ ŲØ§ÛŒØ¯Ų‡ Ų…ÛŒâ€ŒØ¯Ų‡. + +ŲˆŲ„ÛŒ Ø­ØĒی Ø§Ú¯Ų‡ Ų‡ÛŒÚ†â€ŒŲˆŲ‚ØĒ Ø§Ø˛ **FastAPI** Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų†ÚŠŲ†ÛŒØŒ Ø¨Ø§Ø˛Ų… ÛŒØ§Ø¯Ú¯ÛŒØąÛŒ ÛŒŲ‡ ÚŠŲ… Ø¯Øą Ų…ŲˆØąØ¯Ø´ŲˆŲ† Ø¨Ų‡ Ų†ŲØšØĒŲ‡. + +/// note + +Ø§Ú¯Ų‡ Ø­ØąŲŲ‡â€ŒØ§ÛŒ ŲžØ§ÛŒØĒŲˆŲ†ÛŒ ؈ Ų‡Ų…Ų‡â€ŒÚ†ÛŒØ˛ ØąŲˆ Ø¯Øą Ų…ŲˆØąØ¯ Ų†ŲˆØšâ€ŒŲ†Ų…Ø§Ų‡Ø§ Ų…ÛŒâ€ŒØ¯ŲˆŲ†ÛŒØŒ Ø¨ØąŲˆ ØŗØąØ§Øē ؁ØĩŲ„ بؚدی. + +/// + +## Ø§Ų†Ú¯ÛŒØ˛Ų‡ + +بیاید با ÛŒŲ‡ Ų…ØĢØ§Ų„ ØŗØ§Ø¯Ų‡ Ø´ØąŲˆØš ÚŠŲ†ÛŒŲ…: + +{* ../../docs_src/python_types/tutorial001.py *} + +ŲˆŲ‚ØĒی Ø§ÛŒŲ† Ø¨ØąŲ†Ø§Ų…Ų‡ ØąŲˆ اØŦØąØ§ ÚŠŲ†ÛŒØŒ ØŽØąŲˆØŦی Ø§ÛŒŲ†Ų‡: + +``` +John Doe +``` + +Ø§ÛŒŲ† ØĒابؚ Ø§ÛŒŲ† ÚŠØ§ØąØ§ ØąŲˆ Ų…ÛŒâ€ŒÚŠŲ†Ų‡: + +* ÛŒŲ‡ `first_name` ؈ `last_name` Ų…ÛŒâ€ŒÚ¯ÛŒØąŲ‡. +* Ø­ØąŲ Ø§ŲˆŲ„ Ų‡Øą ÚŠØ¯ŲˆŲ… ØąŲˆ با `title()` Ø¨Ø˛ØąÚ¯ Ų…ÛŒâ€ŒÚŠŲ†Ų‡. +* ØĒØąÚŠÛŒØ¨Ø´ŲˆŲ† Ų…ÛŒâ€ŒÚŠŲ†Ų‡ با ÛŒŲ‡ ŲØ§ØĩŲ„Ų‡ ŲˆØŗØˇØ´ŲˆŲ†. + +{* ../../docs_src/python_types/tutorial001.py hl[2] *} + +### ŲˆÛŒØąØ§ÛŒØ´Ø´ ÚŠŲ† + +Ø§ÛŒŲ† ÛŒŲ‡ Ø¨ØąŲ†Ø§Ų…Ų‡ ØŽÛŒŲ„ÛŒ ØŗØ§Ø¯Ų‡â€ŒØŗØĒ. + +ŲˆŲ„ÛŒ Ø­Ø§Ų„Ø§ ØĒØĩŲˆØą ÚŠŲ† Ø¯Ø§ØąÛŒ Ø§Ø˛ ØĩŲØą Ų…ÛŒâ€ŒŲ†ŲˆÛŒØŗÛŒØ´. + +ÛŒŲ‡ ØŦایی Ø´ØąŲˆØš ÚŠØąØ¯ÛŒ Ø¨Ų‡ ØĒØšØąÛŒŲ ØĒابؚ، ŲžØ§ØąØ§Ų…ØĒØąŲ‡Ø§ØĒ ØĸŲ…Ø§Ø¯Ų‡â€ŒØŗØĒ... + +ŲˆŲ„ÛŒ بؚد باید "Ø§ŲˆŲ† Ų…ØĒدی ÚŠŲ‡ Ø­ØąŲ Ø§ŲˆŲ„ ØąŲˆ Ø¨Ø˛ØąÚ¯ Ų…ÛŒâ€ŒÚŠŲ†Ų‡" ØąŲˆ Øĩدا ÚŠŲ†ÛŒ. + +Øĸیا Ø§ØŗŲ…Ø´ `upper` Ø¨ŲˆØ¯ØŸ یا `uppercase`؟ شاید `first_uppercase`؟ یا `capitalize`؟ + +بؚد، با Ø¯ŲˆØŗØĒ Ų‚Ø¯ÛŒŲ…ÛŒ Ø¨ØąŲ†Ø§Ų…Ų‡â€ŒŲ†ŲˆÛŒØŗØ§ØŒ ØĒÚŠŲ…ÛŒŲ„ ØŽŲˆØ¯ÚŠØ§Øą ŲˆÛŒØąØ§ÛŒØ´Ú¯ØąØŒ Ø§Ų…ØĒØ­Ø§Ų† Ų…ÛŒâ€ŒÚŠŲ†ÛŒ. + +ŲžØ§ØąØ§Ų…ØĒØą Ø§ŲˆŲ„ ØĒابؚ، `first_name` ØąŲˆ ØĒØ§ÛŒŲž Ų…ÛŒâ€ŒÚŠŲ†ÛŒØŒ بؚد ÛŒŲ‡ Ų†Ų‚ØˇŲ‡ (`.`) Ų…ÛŒâ€ŒØ°Ø§ØąÛŒ ؈ `Ctrl+Space` ØąŲˆ Ų…ÛŒâ€ŒØ˛Ų†ÛŒ ØĒا ØĒÚŠŲ…ÛŒŲ„ ØŽŲˆØ¯ÚŠØ§Øą بیاد. + +ŲˆŲ„ÛŒ Ų…ØĒØŖØŗŲØ§Ų†Ų‡ØŒ Ú†ÛŒØ˛ Ų…ŲÛŒØ¯ÛŒ Ų†Ų…ÛŒâ€ŒÚ¯ÛŒØąÛŒ: + + + +### Ų†ŲˆØš اØļØ§ŲŲ‡ ÚŠŲ† + +بیا ŲŲ‚Øˇ ÛŒŲ‡ ØŽØˇ Ø§Ø˛ Ų†ØŗØŽŲ‡ Ų‚Ø¨Ų„ÛŒ ØąŲˆ ØĒØēÛŒÛŒØą Ø¨Ø¯ÛŒŲ…. + +Ø¯Ų‚ÛŒŲ‚Ø§Ų‹ Ø§ÛŒŲ† ب؎ش، ŲžØ§ØąØ§Ų…ØĒØąŲ‡Ø§ÛŒ ØĒابؚ ØąŲˆØŒ Ø§Ø˛: + +```Python + first_name, last_name +``` + +Ø¨Ų‡: + +```Python + first_name: str, last_name: str +``` + +ØšŲˆØļ Ų…ÛŒâ€ŒÚŠŲ†ÛŒŲ…. + +Ų‡Ų…ÛŒŲ†Ų‡. + +Ø§ÛŒŲ†Ø§ Ų‡Ų…ŲˆŲ† "Ų†ŲˆØšâ€ŒŲ†Ų…Ø§Ų‡Ø§" Ų‡ØŗØĒŲ†: + +{* ../../docs_src/python_types/tutorial002.py hl[1] *} + +Ø§ÛŒŲ† با ØĒØšØąÛŒŲ Ų…Ų‚Ø¯Ø§Øą ŲžÛŒØ´â€ŒŲØąØļ ŲØąŲ‚ Ø¯Ø§ØąŲ‡ØŒ Ų…ØĢŲ„: + +```Python + first_name="john", last_name="doe" +``` + +ÛŒŲ‡ Ú†ÛŒØ˛ Ų…ØĒŲØ§ŲˆØĒŲ‡. + +Ų…Ø§ Ø§Ø˛ Ø¯ŲˆŲ†Ų‚ØˇŲ‡ (`:`) Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒÚŠŲ†ÛŒŲ…ØŒ Ų†Ų‡ ØšŲ„Ø§Ų…ØĒ Ų…ØŗØ§ŲˆÛŒ (`=`)‌. + +؈ اØļØ§ŲŲ‡ ÚŠØąØ¯Ų† Ų†ŲˆØšâ€ŒŲ†Ų…Ø§Ų‡Ø§ Ų…ØšŲ…ŲˆŲ„Ø§Ų‹ Ú†ÛŒØ˛ÛŒ ÚŠŲ‡ اØĒŲØ§Ų‚ Ų…ÛŒâ€ŒØ§ŲØĒŲ‡ ØąŲˆ Ø§Ø˛ Ú†ÛŒØ˛ÛŒ ÚŠŲ‡ Ø¨Ø¯ŲˆŲ† Ø§ŲˆŲ†Ø§ Ų…ÛŒâ€ŒØ§ŲØĒاد ØĒØēÛŒÛŒØą Ų†Ų…ÛŒâ€ŒØ¯Ų‡. + +ŲˆŲ„ÛŒ Ø­Ø§Ų„Ø§ØŒ Ø¯ŲˆØ¨Ø§ØąŲ‡ ØĒØĩŲˆØą ÚŠŲ† ŲˆØŗØˇ ØŗØ§ØŽØĒŲ† Ø§ŲˆŲ† ØĒابؚ Ų‡ØŗØĒی، ŲˆŲ„ÛŒ Ø§ÛŒŲ† Ø¨Ø§Øą با Ų†ŲˆØšâ€ŒŲ†Ų…Ø§Ų‡Ø§. + +ØĒŲˆÛŒ Ų‡Ų…ŲˆŲ† Ų†Ų‚ØˇŲ‡ØŒ ØŗØšÛŒ Ų…ÛŒâ€ŒÚŠŲ†ÛŒ ØĒÚŠŲ…ÛŒŲ„ ØŽŲˆØ¯ÚŠØ§Øą ØąŲˆ با `Ctrl+Space` ŲØšØ§Ų„ ÚŠŲ†ÛŒ ؈ Ø§ÛŒŲ†Ųˆ Ų…ÛŒâ€ŒØ¨ÛŒŲ†ÛŒ: + + + +با Ø§ÛŒŲ†ØŒ Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ø§ØŗÚŠØąŲˆŲ„ ÚŠŲ†ÛŒØŒ Ú¯Ø˛ÛŒŲ†Ų‡â€ŒŲ‡Ø§ ØąŲˆ Ø¨Ø¨ÛŒŲ†ÛŒØŒ ØĒا ŲˆŲ‚ØĒی ÚŠŲ‡ Ø§ŲˆŲ† Ú†ÛŒØ˛ÛŒ ÚŠŲ‡ "Ø¨Ų‡ Ų†Ø¸ØąØĒ ØĸØ´Ų†Ø§ Ų…ÛŒØ§Ø¯" ØąŲˆ ŲžÛŒØ¯Ø§ ÚŠŲ†ÛŒ: + + + +## Ø§Ų†Ú¯ÛŒØ˛Ų‡ بیشØĒØą + +Ø§ÛŒŲ† ØĒابؚ ØąŲˆ چک ÚŠŲ†ØŒ Ø§Ų„Ø§Ų† Ų†ŲˆØšâ€ŒŲ†Ų…Ø§ Ø¯Ø§ØąŲ‡: + +{* ../../docs_src/python_types/tutorial003.py hl[1] *} + +Ú†ŲˆŲ† ŲˆÛŒØąØ§ÛŒØ´Ú¯Øą Ų†ŲˆØš Ų…ØĒØēÛŒØąŲ‡Ø§ ØąŲˆ Ų…ÛŒâ€ŒØ¯ŲˆŲ†Ų‡ØŒ ŲŲ‚Øˇ ØĒÚŠŲ…ÛŒŲ„ ØŽŲˆØ¯ÚŠØ§Øą Ų†Ų…ÛŒâ€ŒÚ¯ÛŒØąÛŒØŒ Ø¨Ų„ÚŠŲ‡ چک ØŽØˇØ§Ų‡Ø§ Ų‡Ų… Ø¯Ø§ØąÛŒ: + + + +Ø­Ø§Ų„Ø§ Ų…ÛŒâ€ŒØ¯ŲˆŲ†ÛŒ ÚŠŲ‡ باید Ø¯ØąØŗØĒØ´ ÚŠŲ†ÛŒØŒ `age` ØąŲˆ با `str(age)` Ø¨Ų‡ ÛŒŲ‡ ØąØ´ØĒŲ‡ ØĒØ¨Ø¯ÛŒŲ„ ÚŠŲ†ÛŒ: + +{* ../../docs_src/python_types/tutorial004.py hl[2] *} + +## ØĒØšØąÛŒŲ Ų†ŲˆØšâ€ŒŲ‡Ø§ + +ØĒØ§Ø˛Ų‡ اØĩŲ„ÛŒâ€ŒØĒØąÛŒŲ† ØŦا Ø¨ØąØ§ÛŒ ØĒØšØąÛŒŲ Ų†ŲˆØšâ€ŒŲ†Ų…Ø§Ų‡Ø§ ØąŲˆ دیدی. Ø¨Ų‡â€ŒØšŲ†ŲˆØ§Ų† ŲžØ§ØąØ§Ų…ØĒØąŲ‡Ø§ÛŒ ØĒابؚ. + +Ø§ÛŒŲ† Ų‡Ų… اØĩŲ„ÛŒâ€ŒØĒØąÛŒŲ† ØŦØ§ÛŒÛŒŲ‡ ÚŠŲ‡ با **FastAPI** Ø§Ø˛Ø´ŲˆŲ† Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒÚŠŲ†ÛŒ. + +### Ų†ŲˆØšâ€ŒŲ‡Ø§ÛŒ ØŗØ§Ø¯Ų‡ + +Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ų‡Ų…Ų‡ Ų†ŲˆØšâ€ŒŲ‡Ø§ÛŒ Ø§ØŗØĒØ§Ų†Ø¯Ø§ØąØ¯ ŲžØ§ÛŒØĒŲˆŲ† ØąŲˆ ØĒØšØąÛŒŲ ÚŠŲ†ÛŒØŒ Ų†Ų‡ ŲŲ‚Øˇ `str`. + +Ų…ØĢŲ„Ø§Ų‹ Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ø§Ø˛ Ø§ÛŒŲ†Ø§ Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒ: + +* `int` +* `float` +* `bool` +* `bytes` + +{* ../../docs_src/python_types/tutorial005.py hl[1] *} + +### Ų†ŲˆØšâ€ŒŲ‡Ø§ÛŒ ØšŲ…ŲˆŲ…ÛŒ با ŲžØ§ØąØ§Ų…ØĒØąŲ‡Ø§ÛŒ Ų†ŲˆØš + +ÛŒŲ‡ ØŗØąÛŒ ØŗØ§ØŽØĒØ§Øą Ø¯Ø§Ø¯Ų‡ Ų‡ØŗØĒŲ† ÚŠŲ‡ Ų…ÛŒâ€ŒØĒŲˆŲ†Ų† Ų…Ų‚Ø¯Ø§ØąŲ‡Ø§ÛŒ Ø¯ÛŒÚ¯Ų‡ ØąŲˆ Ų†Ú¯Ų‡ Ø¯Ø§ØąŲ†ØŒ Ų…ØĢŲ„ `dict`، `list`، `set` ؈ `tuple`. ؈ Ų…Ų‚Ø¯Ø§ØąŲ‡Ø§ÛŒ Ø¯Ø§ØŽŲ„ÛŒØ´ŲˆŲ† Ų‡Ų… Ų…ÛŒâ€ŒØĒŲˆŲ†Ų† Ų†ŲˆØš ØŽŲˆØ¯Ø´ŲˆŲ† ØąŲˆ داشØĒŲ‡ Ø¨Ø§Ø´Ų†. + +Ø¨Ų‡ Ø§ÛŒŲ† Ų†ŲˆØšâ€ŒŲ‡Ø§ ÚŠŲ‡ Ų†ŲˆØšâ€ŒŲ‡Ø§ÛŒ Ø¯Ø§ØŽŲ„ÛŒ Ø¯Ø§ØąŲ† Ų…ÛŒâ€ŒÚ¯Ų† "**ØšŲ…ŲˆŲ…ÛŒ**" یا "generic". ؈ Ų…ÛŒâ€ŒØ´Ų‡ Ø§ŲˆŲ†Ø§ ØąŲˆ ØĒØšØąÛŒŲ ÚŠØąØ¯ØŒ Ø­ØĒی با Ų†ŲˆØšâ€ŒŲ‡Ø§ÛŒ Ø¯Ø§ØŽŲ„ÛŒØ´ŲˆŲ†. + +Ø¨ØąØ§ÛŒ ØĒØšØąÛŒŲ Ø§ÛŒŲ† Ų†ŲˆØšâ€ŒŲ‡Ø§ ؈ Ų†ŲˆØšâ€ŒŲ‡Ø§ÛŒ Ø¯Ø§ØŽŲ„ÛŒØ´ŲˆŲ†ØŒ Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ø§Ø˛ Ų…Ø§Ú˜ŲˆŲ„ Ø§ØŗØĒØ§Ų†Ø¯Ø§ØąØ¯ ŲžØ§ÛŒØĒŲˆŲ† `typing` Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒ. Ø§ÛŒŲ† Ų…Ø§Ú˜ŲˆŲ„ Ų…ØŽØĩ؈Øĩ ŲžØ´ØĒÛŒØ¨Ø§Ų†ÛŒ Ø§Ø˛ Ų†ŲˆØšâ€ŒŲ†Ų…Ø§Ų‡Ø§ØŗØĒ. + +#### Ų†ØŗØŽŲ‡â€ŒŲ‡Ø§ÛŒ ØŦدیدØĒØą ŲžØ§ÛŒØĒŲˆŲ† + +ØŗÛŒŲ†ØĒÚŠØŗ با Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ `typing` با Ų‡Ų…Ų‡ Ų†ØŗØŽŲ‡â€ŒŲ‡Ø§ØŒ Ø§Ø˛ ŲžØ§ÛŒØĒŲˆŲ† 3.6 ØĒا ØŦدیدØĒØąÛŒŲ†â€ŒŲ‡Ø§ØŒ Ø§Ø˛ ØŦŲ…Ų„Ų‡ ŲžØ§ÛŒØĒŲˆŲ† 3.9، 3.10 ؈ ØēÛŒØąŲ‡ **ØŗØ§Ø˛Ú¯Ø§ØąŲ‡**. + +با ŲžÛŒØ´ØąŲØĒ ŲžØ§ÛŒØĒŲˆŲ†ØŒ **Ų†ØŗØŽŲ‡â€ŒŲ‡Ø§ÛŒ ØŦدیدØĒØą** ŲžØ´ØĒÛŒØ¨Ø§Ų†ÛŒ Ø¨Ų‡ØĒØąÛŒ Ø¨ØąØ§ÛŒ Ø§ÛŒŲ† Ų†ŲˆØšâ€ŒŲ†Ų…Ø§Ų‡Ø§ Ø¯Ø§ØąŲ† ؈ ØĒŲˆÛŒ ØŽÛŒŲ„ÛŒ Ų…ŲˆØ§ØąØ¯ Ø­ØĒی Ų„Ø§Ø˛Ų… Ų†ÛŒØŗØĒ Ų…Ø§Ú˜ŲˆŲ„ `typing` ØąŲˆ ŲˆØ§ØąØ¯ ÚŠŲ†ÛŒ ؈ Ø§Ø˛Ø´ Ø¨ØąØ§ÛŒ ØĒØšØąÛŒŲ Ų†ŲˆØšâ€ŒŲ†Ų…Ø§Ų‡Ø§ Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒ. + +Ø§Ú¯Ų‡ بØĒŲˆŲ†ÛŒ Ø¨ØąØ§ÛŒ ŲžØąŲˆÚ˜Ų‡â€ŒØ§ØĒ Ø§Ø˛ ÛŒŲ‡ Ų†ØŗØŽŲ‡ ØŦدیدØĒØą ŲžØ§ÛŒØĒŲˆŲ† Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒØŒ Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ø§Ø˛ Ø§ÛŒŲ† ØŗØ§Ø¯Ú¯ÛŒ اØļØ§ŲŲ‡ Ø¨Ų‡ØąŲ‡ Ø¨Ø¨ØąÛŒ. + +ØĒŲˆÛŒ Ų‡Ų…Ų‡ Ų…ØŗØĒŲ†Ø¯Ø§ØĒ، Ų…ØĢØ§Ų„â€ŒŲ‡Ø§ÛŒÛŒ Ų‡ØŗØĒŲ† ÚŠŲ‡ با Ų‡Øą Ų†ØŗØŽŲ‡ ŲžØ§ÛŒØĒŲˆŲ† ØŗØ§Ø˛Ú¯Ø§ØąŲ† (ŲˆŲ‚ØĒی ØĒŲØ§ŲˆØĒی Ų‡ØŗØĒ). + +Ų…ØĢŲ„Ø§Ų‹ "**Python 3.6+**" ÛŒØšŲ†ÛŒ با ŲžØ§ÛŒØĒŲˆŲ† 3.6 یا Ø¨Ø§Ų„Ø§ØĒØą (Ų…ØĢŲ„ 3.7، 3.8، 3.9، 3.10 ؈ ØēÛŒØąŲ‡) ØŗØ§Ø˛Ú¯Ø§ØąŲ‡. ؈ "**Python 3.9+**" ÛŒØšŲ†ÛŒ با ŲžØ§ÛŒØĒŲˆŲ† 3.9 یا Ø¨Ø§Ų„Ø§ØĒØą (Ų…ØĢŲ„ 3.10 ؈ ØēÛŒØąŲ‡) ØŗØ§Ø˛Ú¯Ø§ØąŲ‡. + +Ø§Ú¯Ų‡ بØĒŲˆŲ†ÛŒ Ø§Ø˛ **ØŦدیدØĒØąÛŒŲ† Ų†ØŗØŽŲ‡â€ŒŲ‡Ø§ÛŒ ŲžØ§ÛŒØĒŲˆŲ†** Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒØŒ Ø§Ø˛ Ų…ØĢØ§Ų„â€ŒŲ‡Ø§ÛŒ Ų†ØŗØŽŲ‡ ØĸØŽØą Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ØŒ Ú†ŲˆŲ† Ø§ŲˆŲ†Ø§ **Ø¨Ų‡ØĒØąÛŒŲ† ؈ ØŗØ§Ø¯Ų‡â€ŒØĒØąÛŒŲ† ØŗÛŒŲ†ØĒÚŠØŗ** ØąŲˆ Ø¯Ø§ØąŲ†ØŒ Ų…ØĢŲ„Ø§Ų‹ "**Python 3.10+**". + +#### Ų„ÛŒØŗØĒ + +Ų…ØĢŲ„Ø§Ų‹ØŒ Ø¨ÛŒØ§ÛŒŲ… ÛŒŲ‡ Ų…ØĒØēÛŒØą ØĒØšØąÛŒŲ ÚŠŲ†ÛŒŲ… ÚŠŲ‡ ÛŒŲ‡ `list` Ø§Ø˛ `str` Ø¨Ø§Ø´Ų‡. + +//// tab | Python 3.9+ + +Ų…ØĒØēÛŒØą ØąŲˆ با Ų‡Ų…ŲˆŲ† ØŗÛŒŲ†ØĒÚŠØŗ Ø¯ŲˆŲ†Ų‚ØˇŲ‡ (`:`) ØĒØšØąÛŒŲ ÚŠŲ†. + +Ø¨Ų‡â€ŒØšŲ†ŲˆØ§Ų† Ų†ŲˆØšØŒ `list` ØąŲˆ Ø¨Ø°Ø§Øą. + +Ú†ŲˆŲ† Ų„ÛŒØŗØĒ ÛŒŲ‡ Ų†ŲˆØšŲ‡ ÚŠŲ‡ Ų†ŲˆØšâ€ŒŲ‡Ø§ÛŒ Ø¯Ø§ØŽŲ„ÛŒ Ø¯Ø§ØąŲ‡ØŒ Ø§ŲˆŲ†Ø§ ØąŲˆ ØĒŲˆÛŒ ÚŠØąŲˆØ´Ų‡â€ŒŲ‡Ø§ Ų…ÛŒâ€ŒØ°Ø§ØąÛŒ: + +```Python hl_lines="1" +{!> ../../docs_src/python_types/tutorial006_py39.py!} +``` + +//// + +//// tab | Python 3.8+ + +Ø§Ø˛ `typing`، `List` ØąŲˆ (با `L` Ø¨Ø˛ØąÚ¯) ŲˆØ§ØąØ¯ ÚŠŲ†: + +```Python hl_lines="1" +{!> ../../docs_src/python_types/tutorial006.py!} +``` + +Ų…ØĒØēÛŒØą ØąŲˆ با Ų‡Ų…ŲˆŲ† ØŗÛŒŲ†ØĒÚŠØŗ Ø¯ŲˆŲ†Ų‚ØˇŲ‡ (`:`) ØĒØšØąÛŒŲ ÚŠŲ†. + +Ø¨Ų‡â€ŒØšŲ†ŲˆØ§Ų† Ų†ŲˆØšØŒ `List` ØąŲˆ ÚŠŲ‡ Ø§Ø˛ `typing` ŲˆØ§ØąØ¯ ÚŠØąØ¯ÛŒ Ø¨Ø°Ø§Øą. + +Ú†ŲˆŲ† Ų„ÛŒØŗØĒ ÛŒŲ‡ Ų†ŲˆØšŲ‡ ÚŠŲ‡ Ų†ŲˆØšâ€ŒŲ‡Ø§ÛŒ Ø¯Ø§ØŽŲ„ÛŒ Ø¯Ø§ØąŲ‡ØŒ Ø§ŲˆŲ†Ø§ ØąŲˆ ØĒŲˆÛŒ ÚŠØąŲˆØ´Ų‡â€ŒŲ‡Ø§ Ų…ÛŒâ€ŒØ°Ø§ØąÛŒ: + +```Python hl_lines="4" +{!> ../../docs_src/python_types/tutorial006.py!} +``` + +//// + +/// info + +Ø§ŲˆŲ† Ų†ŲˆØšâ€ŒŲ‡Ø§ÛŒ Ø¯Ø§ØŽŲ„ÛŒ ØĒŲˆÛŒ ÚŠØąŲˆØ´Ų‡â€ŒŲ‡Ø§ Ø¨Ų‡Ø´ŲˆŲ† "ŲžØ§ØąØ§Ų…ØĒØąŲ‡Ø§ÛŒ Ų†ŲˆØš" Ų…ÛŒâ€ŒÚ¯Ų†. + +ØĒŲˆÛŒ Ø§ÛŒŲ† Ų…ŲˆØąØ¯ØŒ `str` ŲžØ§ØąØ§Ų…ØĒØą Ų†ŲˆØšÛŒŲ‡ ÚŠŲ‡ Ø¨Ų‡ `List` (یا `list` ØĒŲˆÛŒ ŲžØ§ÛŒØĒŲˆŲ† 3.9 ؈ Ø¨Ø§Ų„Ø§ØĒØą) ŲžØ§Øŗ Ø¯Ø§Ø¯Ų‡ Ø´Ø¯Ų‡. + +/// + +ÛŒØšŲ†ÛŒ: "Ų…ØĒØēÛŒØą `items` ÛŒŲ‡ `list` Ų‡ØŗØĒ، ؈ Ų‡Øą ÚŠØ¯ŲˆŲ… Ø§Ø˛ ØĸیØĒŲ…â€ŒŲ‡Ø§ÛŒ Ø§ÛŒŲ† Ų„ÛŒØŗØĒ ÛŒŲ‡ `str` Ų‡ØŗØĒŲ†". + +/// tip + +Ø§Ú¯Ų‡ Ø§Ø˛ ŲžØ§ÛŒØĒŲˆŲ† 3.9 یا Ø¨Ø§Ų„Ø§ØĒØą Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒÚŠŲ†ÛŒØŒ Ų„Ø§Ø˛Ų… Ų†ÛŒØŗØĒ `List` ØąŲˆ Ø§Ø˛ `typing` ŲˆØ§ØąØ¯ ÚŠŲ†ÛŒØŒ Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ų‡Ų…ŲˆŲ† Ų†ŲˆØš Ų…ØšŲ…ŲˆŲ„ÛŒ `list` ØąŲˆ Ø¨Ų‡ ØŦاش Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒ. + +/// + +با Ø§ÛŒŲ† ÚŠØ§ØąØŒ ŲˆÛŒØąØ§ÛŒØ´Ú¯ØąØĒ Ø­ØĒی ŲˆŲ‚ØĒی Ø¯Ø§ØąÛŒ ØĸیØĒŲ…â€ŒŲ‡Ø§ÛŒ Ų„ÛŒØŗØĒ ØąŲˆ ŲžØąØ¯Ø§Ø˛Ø´ Ų…ÛŒâ€ŒÚŠŲ†ÛŒ Ø¨Ų‡ØĒ ÚŠŲ…ÚŠ Ų…ÛŒâ€ŒÚŠŲ†Ų‡: + + + +Ø¨Ø¯ŲˆŲ† Ų†ŲˆØšâ€ŒŲ‡Ø§ØŒ ØąØŗÛŒØ¯Ų† Ø¨Ų‡ Ø§ÛŒŲ† ØĒŲ‚ØąÛŒØ¨Ø§Ų‹ ØēÛŒØąŲ…Ų…ÚŠŲ†Ų‡. + +ØĒ؈ØŦŲ‡ ÚŠŲ† ÚŠŲ‡ Ų…ØĒØēÛŒØą `item` یڊی Ø§Ø˛ ØšŲ†Ø§ØĩØą ØĒŲˆÛŒ Ų„ÛŒØŗØĒ `items` Ų‡ØŗØĒ. + +؈ با Ø§ÛŒŲ† Ø­Ø§Ų„ØŒ ŲˆÛŒØąØ§ÛŒØ´Ú¯Øą Ų…ÛŒâ€ŒØ¯ŲˆŲ†Ų‡ ÚŠŲ‡ ÛŒŲ‡ `str` Ų‡ØŗØĒ ؈ Ø¨ØąØ§Ø´ ŲžØ´ØĒÛŒØ¨Ø§Ų†ÛŒ Ų…ÛŒâ€ŒØ¯Ų‡. + +#### ØĒØ§ŲžŲ„ ؈ ØŗØĒ + +Ø¨ØąØ§ÛŒ ØĒØšØąÛŒŲ `tuple`Ų‡Ø§ ؈ `set`Ų‡Ø§ Ų‡Ų… Ų‡Ų…ÛŒŲ† ÚŠØ§Øą ØąŲˆ Ų…ÛŒâ€ŒÚŠŲ†ÛŒ: + +//// tab | Python 3.9+ + +```Python hl_lines="1" +{!> ../../docs_src/python_types/tutorial007_py39.py!} +``` + +//// + +//// tab | Python 3.8+ + +```Python hl_lines="1 4" +{!> ../../docs_src/python_types/tutorial007.py!} +``` + +//// + +ÛŒØšŲ†ÛŒ: + +* Ų…ØĒØēÛŒØą `items_t` ÛŒŲ‡ `tuple` با 3 ØĒا ØĸیØĒŲ…Ų‡ØŒ ÛŒŲ‡ `int`، ÛŒŲ‡ `int` Ø¯ÛŒÚ¯Ų‡ØŒ ؈ ÛŒŲ‡ `str`. +* Ų…ØĒØēÛŒØą `items_s` ÛŒŲ‡ `set` Ų‡ØŗØĒ، ؈ Ų‡Øą ÚŠØ¯ŲˆŲ… Ø§Ø˛ ØĸیØĒŲ…â€ŒŲ‡Ø§Ø´ Ø§Ø˛ Ų†ŲˆØš `bytes` Ų‡ØŗØĒŲ†. + +#### Ø¯ÛŒÚŠØ´Ų†ØąÛŒ + +Ø¨ØąØ§ÛŒ ØĒØšØąÛŒŲ ÛŒŲ‡ `dict`، 2 ØĒا ŲžØ§ØąØ§Ų…ØĒØą Ų†ŲˆØš Ų…ÛŒâ€ŒØ¯ÛŒØŒ ÚŠŲ‡ با ÚŠØ§Ų…Ø§ Ø§Ø˛ Ų‡Ų… ØŦدا Ø´Ø¯Ų†. + +ŲžØ§ØąØ§Ų…ØĒØą Ų†ŲˆØš Ø§ŲˆŲ„ Ø¨ØąØ§ÛŒ ÚŠŲ„ÛŒØ¯Ų‡Ø§ÛŒ `dict` Ų‡ØŗØĒ. + +ŲžØ§ØąØ§Ų…ØĒØą Ų†ŲˆØš Ø¯ŲˆŲ… Ø¨ØąØ§ÛŒ Ų…Ų‚Ø¯Ø§ØąŲ‡Ø§ÛŒ `dict` Ų‡ØŗØĒ: + +//// tab | Python 3.9+ + +```Python hl_lines="1" +{!> ../../docs_src/python_types/tutorial008_py39.py!} +``` + +//// + +//// tab | Python 3.8+ + +```Python hl_lines="1 4" +{!> ../../docs_src/python_types/tutorial008.py!} +``` + +//// + +ÛŒØšŲ†ÛŒ: + +* Ų…ØĒØēÛŒØą `prices` ÛŒŲ‡ `dict` Ų‡ØŗØĒ: + * ÚŠŲ„ÛŒØ¯Ų‡Ø§ÛŒ Ø§ÛŒŲ† `dict` Ø§Ø˛ Ų†ŲˆØš `str` Ų‡ØŗØĒŲ† (Ų…ØĢŲ„Ø§Ų‹ Ø§ØŗŲ… Ų‡Øą ØĸیØĒŲ…). + * Ų…Ų‚Ø¯Ø§ØąŲ‡Ø§ÛŒ Ø§ÛŒŲ† `dict` Ø§Ø˛ Ų†ŲˆØš `float` Ų‡ØŗØĒŲ† (Ų…ØĢŲ„Ø§Ų‹ Ų‚ÛŒŲ…ØĒ Ų‡Øą ØĸیØĒŲ…). + +#### اØĒØ­Ø§Ø¯ÛŒŲ‡ + +Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ ØĒØšØąÛŒŲ ÚŠŲ†ÛŒ ÚŠŲ‡ ÛŒŲ‡ Ų…ØĒØēÛŒØą Ų…ÛŒâ€ŒØĒŲˆŲ†Ų‡ Ų‡Øą ÚŠØ¯ŲˆŲ… Ø§Ø˛ **Ú†Ų†Ø¯ ØĒا Ų†ŲˆØš** Ø¨Ø§Ø´Ų‡ØŒ Ų…ØĢŲ„Ø§Ų‹ ÛŒŲ‡ `int` یا ÛŒŲ‡ `str`. + +ØĒŲˆÛŒ ŲžØ§ÛŒØĒŲˆŲ† 3.6 ؈ Ø¨Ø§Ų„Ø§ØĒØą (Ø§Ø˛ ØŦŲ…Ų„Ų‡ ŲžØ§ÛŒØĒŲˆŲ† 3.10) Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ø§Ø˛ Ų†ŲˆØš `Union` ØĒŲˆÛŒ `typing` Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒ ؈ Ų†ŲˆØšâ€ŒŲ‡Ø§ÛŒ Ų…Ų…ÚŠŲ† ØąŲˆ ØĒŲˆÛŒ ÚŠØąŲˆØ´Ų‡â€ŒŲ‡Ø§ Ø¨Ø°Ø§ØąÛŒ. + +ØĒŲˆÛŒ ŲžØ§ÛŒØĒŲˆŲ† 3.10 ÛŒŲ‡ **ØŗÛŒŲ†ØĒÚŠØŗ ØŦدید** Ų‡Ų… Ų‡ØŗØĒ ÚŠŲ‡ Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ų†ŲˆØšâ€ŒŲ‡Ø§ÛŒ Ų…Ų…ÚŠŲ† ØąŲˆ با ÛŒŲ‡ ØŽØˇ ØšŲ…ŲˆØ¯ÛŒ (`|`) ØŦدا ÚŠŲ†ÛŒ. + +//// tab | Python 3.10+ + +```Python hl_lines="1" +{!> ../../docs_src/python_types/tutorial008b_py310.py!} +``` + +//// + +//// tab | Python 3.8+ + +```Python hl_lines="1 4" +{!> ../../docs_src/python_types/tutorial008b.py!} +``` + +//// + +ØĒŲˆÛŒ Ų‡Øą Ø¯Ųˆ Ø­Ø§Ų„ØĒ ÛŒØšŲ†ÛŒ `item` Ų…ÛŒâ€ŒØĒŲˆŲ†Ų‡ ÛŒŲ‡ `int` یا ÛŒŲ‡ `str` Ø¨Ø§Ø´Ų‡. + +#### شاید `None` + +Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ ØĒØšØąÛŒŲ ÚŠŲ†ÛŒ ÚŠŲ‡ ÛŒŲ‡ Ų…Ų‚Ø¯Ø§Øą Ų…ÛŒâ€ŒØĒŲˆŲ†Ų‡ ÛŒŲ‡ Ų†ŲˆØš Ø¨Ø§Ø´Ų‡ØŒ Ų…ØĢŲ„Ø§Ų‹ `str`، ŲˆŲ„ÛŒ Ų…ÛŒâ€ŒØĒŲˆŲ†Ų‡ `None` Ų‡Ų… Ø¨Ø§Ø´Ų‡. + +ØĒŲˆÛŒ ŲžØ§ÛŒØĒŲˆŲ† 3.6 ؈ Ø¨Ø§Ų„Ø§ØĒØą (Ø§Ø˛ ØŦŲ…Ų„Ų‡ ŲžØ§ÛŒØĒŲˆŲ† 3.10) Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ با ŲˆØ§ØąØ¯ ÚŠØąØ¯Ų† ؈ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ `Optional` Ø§Ø˛ Ų…Ø§Ú˜ŲˆŲ„ `typing` Ø§ÛŒŲ†Ųˆ ØĒØšØąÛŒŲ ÚŠŲ†ÛŒ. + +```Python hl_lines="1 4" +{!../../docs_src/python_types/tutorial009.py!} +``` + +Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ `Optional[str]` Ø¨Ų‡ ØŦای ŲŲ‚Øˇ `str` Ø¨Ų‡ ŲˆÛŒØąØ§ÛŒØ´Ú¯Øą ÚŠŲ…ÚŠ Ų…ÛŒâ€ŒÚŠŲ†Ų‡ ØŽØˇØ§Ų‡Ø§ÛŒÛŒ ÚŠŲ‡ Ų…Ų…ÚŠŲ†Ų‡ ŲÚŠØą ÚŠŲ†ÛŒ ÛŒŲ‡ Ų…Ų‚Ø¯Ø§Øą Ų‡Ų…ÛŒØ´Ų‡ `str` Ų‡ØŗØĒ ØąŲˆ ŲžÛŒØ¯Ø§ ÚŠŲ†Ų‡ØŒ Ø¯Øą Ø­Ø§Ų„ÛŒ ÚŠŲ‡ Ų…ÛŒâ€ŒØĒŲˆŲ†Ų‡ `None` Ų‡Ų… Ø¨Ø§Ø´Ų‡. + +`Optional[Something]` Ø¯Øą ŲˆØ§Ų‚Øš Ų…ÛŒØ§Ų†â€ŒØ¨Øą Ø¨ØąØ§ÛŒ `Union[Something, None]` Ų‡ØŗØĒ، Ø§ÛŒŲ† Ø¯Ųˆ ØĒا Ų…ØšØ§Ø¯Ų„Ų†. + +ÛŒØšŲ†ÛŒ ØĒŲˆÛŒ ŲžØ§ÛŒØĒŲˆŲ† 3.10، Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ø§Ø˛ `Something | None` Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒ: + +//// tab | Python 3.10+ + +```Python hl_lines="1" +{!> ../../docs_src/python_types/tutorial009_py310.py!} +``` + +//// + +//// tab | Python 3.8+ + +```Python hl_lines="1 4" +{!> ../../docs_src/python_types/tutorial009.py!} +``` + +//// + +//// tab | Python 3.8+ ØŦØ§ÛŒÚ¯Ø˛ÛŒŲ† + +```Python hl_lines="1 4" +{!> ../../docs_src/python_types/tutorial009b.py!} +``` + +//// + +#### Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ `Union` یا `Optional` + +Ø§Ú¯Ų‡ Ø§Ø˛ Ų†ØŗØŽŲ‡ ŲžØ§ÛŒØĒŲˆŲ† Ø˛ÛŒØą 3.10 Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒÚŠŲ†ÛŒØŒ ÛŒŲ‡ Ų†ÚŠØĒŲ‡ Ø§Ø˛ دید ØŽÛŒŲ„ÛŒ **Ø´ØŽØĩی** ØŽŲˆØ¯Ų…: + +* 🚨 Ø§Ø˛ `Optional[SomeType]` Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų†ÚŠŲ† +* Ø¨Ų‡ ØŦاش ✨ **Ø§Ø˛ `Union[SomeType, None]` Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†** ✨. + +Ų‡Øą Ø¯Ųˆ Ų…ØšØ§Ø¯Ų„Ų† ؈ Ø˛ÛŒØą ŲžŲˆØŗØĒŲ‡ ÛŒÚŠÛŒâ€ŒØ§Ų†ØŒ ŲˆŲ„ÛŒ Ų…Ų† `Union` ØąŲˆ Ø¨Ų‡ `Optional` ØĒØąØŦیح Ų…ÛŒâ€ŒØ¯Ų… Ú†ŲˆŲ† ÚŠŲ„Ų…Ų‡ "**ا؎ØĒÛŒØ§ØąÛŒ**" Ø§Ų†Ú¯Ø§Øąæš—į¤ē Ų…ÛŒâ€ŒÚŠŲ†Ų‡ ÚŠŲ‡ Ų…Ų‚Ø¯Ø§Øą ا؎ØĒÛŒØ§ØąÛŒŲ‡ØŒ Ø¯Øą Ø­Ø§Ų„ÛŒ ÚŠŲ‡ Ø¯Øą ŲˆØ§Ų‚Øš ÛŒØšŲ†ÛŒ "Ų…ÛŒâ€ŒØĒŲˆŲ†Ų‡ `None` Ø¨Ø§Ø´Ų‡"، Ø­ØĒی Ø§Ú¯Ų‡ ا؎ØĒÛŒØ§ØąÛŒ Ų†Ø¨Ø§Ø´Ų‡ ؈ Ų‡Ų†ŲˆØ˛ Ų„Ø§Ø˛Ų… Ø¨Ø§Ø´Ų‡. + +ŲÚŠØą Ų…ÛŒâ€ŒÚŠŲ†Ų… `Union[SomeType, None]` ŲˆØ§Øļح‌ØĒØą Ų†Ø´ŲˆŲ† Ų…ÛŒâ€ŒØ¯Ų‡ چی Ų…ØšŲ†ÛŒ Ų…ÛŒâ€ŒØ¯Ų‡. + +ŲŲ‚Øˇ بحØĢ ÚŠŲ„Ų…Ø§ØĒ ؈ Ø§ØŗŲ…â€ŒŲ‡Ø§ØŗØĒ. ŲˆŲ„ÛŒ Ø§ÛŒŲ† ÚŠŲ„Ų…Ø§ØĒ Ų…ÛŒâ€ŒØĒŲˆŲ†Ų† ØąŲˆ ØˇØąØ˛ ŲÚŠØą ØĒ؈ ؈ ØĒÛŒŲ…ØĒ Ų†ØŗØ¨ØĒ Ø¨Ų‡ ڊد ØĒØŖØĢÛŒØą Ø¨Ø°Ø§ØąŲ†. + +Ø¨Ų‡â€ŒØšŲ†ŲˆØ§Ų† Ų…ØĢØ§Ų„ØŒ Ø§ÛŒŲ† ØĒابؚ ØąŲˆ Ø¨Ø¨ÛŒŲ†: + +{* ../../docs_src/python_types/tutorial009c.py hl[1,4] *} + +ŲžØ§ØąØ§Ų…ØĒØą `name` Ø¨Ų‡â€ŒØšŲ†ŲˆØ§Ų† `Optional[str]` ØĒØšØąÛŒŲ Ø´Ø¯Ų‡ØŒ ŲˆŲ„ÛŒ **ا؎ØĒÛŒØ§ØąÛŒ Ų†ÛŒØŗØĒ**، Ų†Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ ØĒابؚ ØąŲˆ Ø¨Ø¯ŲˆŲ† ŲžØ§ØąØ§Ų…ØĒØą Øĩدا ÚŠŲ†ÛŒ: + +```Python +say_hi() # Ø§ŲˆŲ‡ Ų†Ų‡ØŒ Ø§ÛŒŲ† ØŽØˇØ§ Ų…ÛŒâ€ŒØ¯Ų‡! 😱 +``` + +ŲžØ§ØąØ§Ų…ØĒØą `name` **Ų‡Ų†ŲˆØ˛ Ų„Ø§Ø˛Ų…Ų‡** (Ų†Ų‡ *ا؎ØĒÛŒØ§ØąÛŒ*) Ú†ŲˆŲ† Ų…Ų‚Ø¯Ø§Øą ŲžÛŒØ´â€ŒŲØąØļ Ų†Ø¯Ø§ØąŲ‡. با Ø§ÛŒŲ† Ø­Ø§Ų„ØŒ `name` Ų…Ų‚Ø¯Ø§Øą `None` ØąŲˆ Ų‚Ø¨ŲˆŲ„ Ų…ÛŒâ€ŒÚŠŲ†Ų‡: + +```Python +say_hi(name=None) # Ø§ÛŒŲ† ÚŠØ§Øą Ų…ÛŒâ€ŒÚŠŲ†Ų‡ØŒ None Ų…ØšØĒØ¨ØąŲ‡ 🎉 +``` + +ØŽØ¨Øą ØŽŲˆØ¨ Ø§ÛŒŲ†Ų‡ ÚŠŲ‡ ŲˆŲ‚ØĒی ØąŲˆ ŲžØ§ÛŒØĒŲˆŲ† 3.10 باشی، Ų„Ø§Ø˛Ų… Ų†ÛŒØŗØĒ Ų†Ú¯ØąØ§Ų† Ø§ÛŒŲ† باشی، Ú†ŲˆŲ† Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ø¨Ų‡â€ŒØŗØ§Ø¯Ú¯ÛŒ Ø§Ø˛ `|` Ø¨ØąØ§ÛŒ ØĒØšØąÛŒŲ اØĒØ­Ø§Ø¯ÛŒŲ‡ Ų†ŲˆØšâ€ŒŲ‡Ø§ Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒ: + +{* ../../docs_src/python_types/tutorial009c_py310.py hl[1,4] *} + +Ø§ŲˆŲ† Ų…ŲˆŲ‚Øš Ø¯ÛŒÚ¯Ų‡ Ų„Ø§Ø˛Ų… Ų†ÛŒØŗØĒ Ų†Ú¯ØąØ§Ų† Ø§ØŗŲ…â€ŒŲ‡Ø§ÛŒÛŒ Ų…ØĢŲ„ `Optional` ؈ `Union` باشی. 😎 + +#### Ų†ŲˆØšâ€ŒŲ‡Ø§ÛŒ ØšŲ…ŲˆŲ…ÛŒ + +Ø§ÛŒŲ† Ų†ŲˆØšâ€ŒŲ‡Ø§ÛŒÛŒ ÚŠŲ‡ ŲžØ§ØąØ§Ų…ØĒØąŲ‡Ø§ÛŒ Ų†ŲˆØš ØąŲˆ ØĒŲˆÛŒ ÚŠØąŲˆØ´Ų‡â€ŒŲ‡Ø§ Ų…ÛŒâ€ŒÚ¯ÛŒØąŲ† Ø¨Ų‡Ø´ŲˆŲ† **Ų†ŲˆØšâ€ŒŲ‡Ø§ÛŒ ØšŲ…ŲˆŲ…ÛŒ** یا **Generics** Ų…ÛŒâ€ŒÚ¯Ų†ØŒ Ų…ØĢŲ„Ø§Ų‹: + +//// tab | Python 3.10+ + +Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ø§Ø˛ Ų‡Ų…ŲˆŲ† Ų†ŲˆØšâ€ŒŲ‡Ø§ÛŒ Ø¯Ø§ØŽŲ„ÛŒ Ø¨Ų‡â€ŒØšŲ†ŲˆØ§Ų† Ų†ŲˆØšâ€ŒŲ‡Ø§ÛŒ ØšŲ…ŲˆŲ…ÛŒ Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒ (با ÚŠØąŲˆØ´Ų‡â€ŒŲ‡Ø§ ؈ Ų†ŲˆØšâ€ŒŲ‡Ø§ Ø¯Ø§ØŽŲ„Ø´ŲˆŲ†): + +* `list` +* `tuple` +* `set` +* `dict` + +؈ Ų‡Ų…ŲˆŲ†â€ŒØˇŲˆØą ÚŠŲ‡ ØĒŲˆÛŒ ŲžØ§ÛŒØĒŲˆŲ† 3.8 Ø¨ŲˆØ¯ØŒ Ø§Ø˛ Ų…Ø§Ú˜ŲˆŲ„ `typing`: + +* `Union` +* `Optional` (Ų‡Ų…ŲˆŲ†â€ŒØˇŲˆØą ÚŠŲ‡ ØĒŲˆÛŒ ŲžØ§ÛŒØĒŲˆŲ† 3.8 Ø¨ŲˆØ¯) +* ...؈ Ø¨Ų‚ÛŒŲ‡. + +ØĒŲˆÛŒ ŲžØ§ÛŒØĒŲˆŲ† 3.10، Ø¨Ų‡â€ŒØšŲ†ŲˆØ§Ų† ØŦØ§ÛŒÚ¯Ø˛ÛŒŲ† Ø¨ØąØ§ÛŒ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ Ų†ŲˆØšâ€ŒŲ‡Ø§ÛŒ ØšŲ…ŲˆŲ…ÛŒ `Union` ؈ `Optional`، Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ø§Ø˛ ØŽØˇ ØšŲ…ŲˆØ¯ÛŒ (`|`) Ø¨ØąØ§ÛŒ ØĒØšØąÛŒŲ اØĒØ­Ø§Ø¯ÛŒŲ‡ Ų†ŲˆØšâ€ŒŲ‡Ø§ Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒØŒ ÚŠŲ‡ ØŽÛŒŲ„ÛŒ Ø¨Ų‡ØĒØą ؈ ØŗØ§Ø¯Ų‡â€ŒØĒØąŲ‡. + +//// + +//// tab | Python 3.9+ + +Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ø§Ø˛ Ų‡Ų…ŲˆŲ† Ų†ŲˆØšâ€ŒŲ‡Ø§ÛŒ Ø¯Ø§ØŽŲ„ÛŒ Ø¨Ų‡â€ŒØšŲ†ŲˆØ§Ų† Ų†ŲˆØšâ€ŒŲ‡Ø§ÛŒ ØšŲ…ŲˆŲ…ÛŒ Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒ (با ÚŠØąŲˆØ´Ų‡â€ŒŲ‡Ø§ ؈ Ų†ŲˆØšâ€ŒŲ‡Ø§ Ø¯Ø§ØŽŲ„Ø´ŲˆŲ†): + +* `list` +* `tuple` +* `set` +* `dict` + +؈ Ų‡Ų…ŲˆŲ†â€ŒØˇŲˆØą ÚŠŲ‡ ØĒŲˆÛŒ ŲžØ§ÛŒØĒŲˆŲ† 3.8 Ø¨ŲˆØ¯ØŒ Ø§Ø˛ Ų…Ø§Ú˜ŲˆŲ„ `typing`: + +* `Union` +* `Optional` +* ...؈ Ø¨Ų‚ÛŒŲ‡. + +//// + +//// tab | Python 3.8+ + +* `List` +* `Tuple` +* `Set` +* `Dict` +* `Union` +* `Optional` +* ...؈ Ø¨Ų‚ÛŒŲ‡. + +//// + +### ÚŠŲ„Ø§Øŗâ€ŒŲ‡Ø§ Ø¨Ų‡â€ŒØšŲ†ŲˆØ§Ų† Ų†ŲˆØš + +Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ ÛŒŲ‡ ÚŠŲ„Ø§Øŗ ØąŲˆ Ų‡Ų… Ø¨Ų‡â€ŒØšŲ†ŲˆØ§Ų† Ų†ŲˆØš ÛŒŲ‡ Ų…ØĒØēÛŒØą ØĒØšØąÛŒŲ ÚŠŲ†ÛŒ. + +ŲØąØļ ÚŠŲ† ÛŒŲ‡ ÚŠŲ„Ø§Øŗ `Person` Ø¯Ø§ØąÛŒØŒ با ÛŒŲ‡ Ų†Ø§Ų…: + +{* ../../docs_src/python_types/tutorial010.py hl[1:3] *} + +بؚد Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ ÛŒŲ‡ Ų…ØĒØēÛŒØą ØąŲˆ Ø§Ø˛ Ų†ŲˆØš `Person` ØĒØšØąÛŒŲ ÚŠŲ†ÛŒ: + +{* ../../docs_src/python_types/tutorial010.py hl[6] *} + +؈ بؚد، Ø¯ŲˆØ¨Ø§ØąŲ‡ØŒ Ų‡Ų…Ų‡ ŲžØ´ØĒÛŒØ¨Ø§Ų†ÛŒ ŲˆÛŒØąØ§ÛŒØ´Ú¯Øą ØąŲˆ Ø¯Ø§ØąÛŒ: + + + +ØĒ؈ØŦŲ‡ ÚŠŲ† ÚŠŲ‡ Ø§ÛŒŲ† ÛŒØšŲ†ÛŒ "`one_person` ÛŒŲ‡ **Ų†Ų…ŲˆŲ†Ų‡** Ø§Ø˛ ÚŠŲ„Ø§Øŗ `Person` Ų‡ØŗØĒ". + +ÛŒØšŲ†ÛŒ "`one_person` ØŽŲˆØ¯ **ÚŠŲ„Ø§Øŗ** Ø¨Ų‡ Ø§ØŗŲ… `Person` Ų†ÛŒØŗØĒ". + +## Ų…Ø¯Ų„â€ŒŲ‡Ø§ÛŒ Pydantic + +Pydantic ÛŒŲ‡ ÚŠØĒØ§Ø¨ØŽŲˆŲ†Ų‡ ŲžØ§ÛŒØĒŲˆŲ†Ų‡ Ø¨ØąØ§ÛŒ اؚØĒØ¨Ø§ØąØŗŲ†ØŦی Ø¯Ø§Ø¯Ų‡â€ŒŲ‡Ø§. + +"Ø´ÚŠŲ„" Ø¯Ø§Ø¯Ų‡â€ŒŲ‡Ø§ ØąŲˆ Ø¨Ų‡â€ŒØšŲ†ŲˆØ§Ų† ÚŠŲ„Ø§Øŗâ€ŒŲ‡Ø§ÛŒÛŒ با ŲˆÛŒÚ˜Ú¯ÛŒâ€ŒŲ‡Ø§ ØĒØšØąÛŒŲ Ų…ÛŒâ€ŒÚŠŲ†ÛŒ. + +؈ Ų‡Øą ŲˆÛŒÚ˜Ú¯ÛŒ ÛŒŲ‡ Ų†ŲˆØš Ø¯Ø§ØąŲ‡. + +بؚد ÛŒŲ‡ Ų†Ų…ŲˆŲ†Ų‡ Ø§Ø˛ Ø§ŲˆŲ† ÚŠŲ„Ø§Øŗ ØąŲˆ با ÛŒŲ‡ ØŗØąÛŒ Ų…Ų‚Ø¯Ø§Øą Ų…ÛŒâ€ŒØŗØ§Ø˛ÛŒ ؈ Ø§ŲˆŲ† Ų…Ų‚Ø¯Ø§ØąŲ‡Ø§ ØąŲˆ اؚØĒØ¨Ø§ØąØŗŲ†ØŦی Ų…ÛŒâ€ŒÚŠŲ†Ų‡ØŒ Ø¨Ų‡ Ų†ŲˆØš Ų…Ų†Ø§ØŗØ¨ ØĒØ¨Ø¯ÛŒŲ„Ø´ŲˆŲ† Ų…ÛŒâ€ŒÚŠŲ†Ų‡ (Ø§Ú¯Ų‡ Ų„Ø§Ø˛Ų… Ø¨Ø§Ø´Ų‡) ؈ ÛŒŲ‡ Ø´ÛŒØĄ با Ų‡Ų…Ų‡ Ø¯Ø§Ø¯Ų‡â€ŒŲ‡Ø§ Ø¨Ų‡ØĒ Ų…ÛŒâ€ŒØ¯Ų‡. + +؈ با Ø§ŲˆŲ† Ø´ÛŒØĄ Ų†Ų‡Ø§ÛŒÛŒ Ų‡Ų…Ų‡ ŲžØ´ØĒÛŒØ¨Ø§Ų†ÛŒ ŲˆÛŒØąØ§ÛŒØ´Ú¯Øą ØąŲˆ Ų…ÛŒâ€ŒÚ¯ÛŒØąÛŒ. + +ÛŒŲ‡ Ų…ØĢØ§Ų„ Ø§Ø˛ Ų…ØŗØĒŲ†Ø¯Ø§ØĒ ØąØŗŲ…ÛŒ Pydantic: + +//// tab | Python 3.10+ + +```Python +{!> ../../docs_src/python_types/tutorial011_py310.py!} +``` + +//// + +//// tab | Python 3.9+ + +```Python +{!> ../../docs_src/python_types/tutorial011_py39.py!} +``` + +//// + +//// tab | Python 3.8+ + +```Python +{!> ../../docs_src/python_types/tutorial011.py!} +``` + +//// + +/// info + +Ø¨ØąØ§ÛŒ Ø§ØˇŲ„Ø§ØšØ§ØĒ بیشØĒØą Ø¯Øą Ų…ŲˆØąØ¯ Pydantic، Ų…ØŗØĒŲ†Ø¯Ø§ØĒØ´ ØąŲˆ چک ÚŠŲ†. + +/// + +**FastAPI** ÚŠØ§Ų…Ų„Ø§Ų‹ Ø¨Øą ŲžØ§ÛŒŲ‡ Pydantic Ų‡ØŗØĒ. + +ØĒŲˆÛŒ [ØĸŲ…ŲˆØ˛Ø´ - ØąØ§Ų‡Ų†Ų…Ø§ÛŒ ÚŠØ§ØąØ¨Øą](tutorial/index.md){.internal-link target=_blank} ØŽÛŒŲ„ÛŒ بیشØĒØą Ø§Ø˛ Ø§ÛŒŲ†Ø§ ØąŲˆ ØĒŲˆÛŒ ØšŲ…Ų„ Ų…ÛŒâ€ŒØ¨ÛŒŲ†ÛŒ. + +/// tip + +Pydantic ÛŒŲ‡ ØąŲØĒØ§Øą ؎اØĩ Ø¯Ø§ØąŲ‡ ŲˆŲ‚ØĒی Ø§Ø˛ `Optional` یا `Union[Something, None]` Ø¨Ø¯ŲˆŲ† Ų…Ų‚Ø¯Ø§Øą ŲžÛŒØ´â€ŒŲØąØļ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒÚŠŲ†ÛŒØŒ Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ ØĒŲˆÛŒ Ų…ØŗØĒŲ†Ø¯Ø§ØĒ Pydantic Ø¯Øą Ų…ŲˆØąØ¯ ŲÛŒŲ„Ø¯Ų‡Ø§ÛŒ ا؎ØĒÛŒØ§ØąÛŒ Ų„Ø§Ø˛Ų… بیشØĒØą Ø¨ØŽŲˆŲ†ÛŒ. + +/// + +## Ų†ŲˆØšâ€ŒŲ†Ų…Ø§Ų‡Ø§ با AnnotationŲ‡Ø§ÛŒ Ų…ØĒادیØĒا + +ŲžØ§ÛŒØĒŲˆŲ† ÛŒŲ‡ Ų‚Ø§Ø¨Ų„ÛŒØĒ Ų‡Ų… Ø¯Ø§ØąŲ‡ ÚŠŲ‡ Ø¨Ų‡ØĒ اØŦØ§Ø˛Ų‡ Ų…ÛŒâ€ŒØ¯Ų‡ **Ų…ØĒادیØĒا اØļØ§ŲÛŒ** ØąŲˆ ØĒŲˆÛŒ Ø§ÛŒŲ† Ų†ŲˆØšâ€ŒŲ†Ų…Ø§Ų‡Ø§ Ø¨Ø°Ø§ØąÛŒ با Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ `Annotated`. + +//// tab | Python 3.9+ + +ØĒŲˆÛŒ ŲžØ§ÛŒØĒŲˆŲ† 3.9، `Annotated` ب؎شی Ø§Ø˛ ÚŠØĒØ§Ø¨ØŽŲˆŲ†Ų‡ Ø§ØŗØĒØ§Ų†Ø¯Ø§ØąØ¯Ų‡ØŒ ŲžØŗ Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ø§Ø˛ `typing` ŲˆØ§ØąØ¯Ø´ ÚŠŲ†ÛŒ. + +```Python hl_lines="1 4" +{!> ../../docs_src/python_types/tutorial013_py39.py!} +``` + +//// + +//// tab | Python 3.8+ + +ØĒŲˆÛŒ Ų†ØŗØŽŲ‡â€ŒŲ‡Ø§ÛŒ Ø˛ÛŒØą ŲžØ§ÛŒØĒŲˆŲ† 3.9، `Annotated` ØąŲˆ Ø§Ø˛ `typing_extensions` ŲˆØ§ØąØ¯ Ų…ÛŒâ€ŒÚŠŲ†ÛŒ. + +با **FastAPI** Ø§Ø˛ Ų‚Ø¨Ų„ Ų†Øĩب Ø´Ø¯Ų‡. + +```Python hl_lines="1 4" +{!> ../../docs_src/python_types/tutorial013.py!} +``` + +//// + +ØŽŲˆØ¯ ŲžØ§ÛŒØĒŲˆŲ† با Ø§ÛŒŲ† `Annotated` ÚŠØ§ØąÛŒ Ų†Ų…ÛŒâ€ŒÚŠŲ†Ų‡. ؈ Ø¨ØąØ§ÛŒ ŲˆÛŒØąØ§ÛŒØ´Ú¯ØąŲ‡Ø§ ؈ Ø§Ø¨Ø˛Ø§ØąŲ‡Ø§ÛŒ Ø¯ÛŒÚ¯Ų‡ØŒ Ų†ŲˆØš Ų‡Ų†ŲˆØ˛ `str` Ų‡ØŗØĒ. + +ŲˆŲ„ÛŒ Ų…ÛŒâ€ŒØĒŲˆŲ†ÛŒ Ø§Ø˛ Ø§ÛŒŲ† ؁Øļا ØĒŲˆÛŒ `Annotated` Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒ ØĒا Ø¨Ų‡ **FastAPI** Ų…ØĒادیØĒای اØļØ§ŲÛŒ Ø¯Øą Ų…ŲˆØąØ¯ Ø§ÛŒŲ†ÚŠŲ‡ Ú†ØˇŲˆØą Ų…ÛŒâ€ŒØŽŲˆØ§ÛŒ Ø¨ØąŲ†Ø§Ų…Ų‡â€ŒØ§ØĒ ØąŲØĒØ§Øą ÚŠŲ†Ų‡ بدی. + +Ų†ÚŠØĒŲ‡ Ų…Ų‡Ų… Ø§ÛŒŲ†Ų‡ ÚŠŲ‡ **Ø§ŲˆŲ„ÛŒŲ† *ŲžØ§ØąØ§Ų…ØĒØą Ų†ŲˆØš*** ÚŠŲ‡ Ø¨Ų‡ `Annotated` Ų…ÛŒâ€ŒØ¯ÛŒØŒ **Ų†ŲˆØš ŲˆØ§Ų‚ØšÛŒ** Ų‡ØŗØĒ. Ø¨Ų‚ÛŒØ´ ŲŲ‚Øˇ Ų…ØĒادیØĒا Ø¨ØąØ§ÛŒ Ø§Ø¨Ø˛Ø§ØąŲ‡Ø§ÛŒ Ø¯ÛŒÚ¯Ų‡â€ŒØŗØĒ. + +Ø§Ų„Ø§Ų† ŲŲ‚Øˇ باید Ø¨Ø¯ŲˆŲ†ÛŒ ÚŠŲ‡ `Annotated` ؈ØŦŲˆØ¯ Ø¯Ø§ØąŲ‡ØŒ ؈ Ø§ÛŒŲ†ÚŠŲ‡ ŲžØ§ÛŒØĒŲˆŲ† Ø§ØŗØĒØ§Ų†Ø¯Ø§ØąØ¯Ų‡. 😎 + +Ø¨ØšØ¯Ø§Ų‹ Ų…ÛŒâ€ŒØ¨ÛŒŲ†ÛŒ ÚŠŲ‡ Ú†Ų‚Ø¯Øą **Ų‚ŲˆÛŒ** Ų…ÛŒâ€ŒØĒŲˆŲ†Ų‡ Ø¨Ø§Ø´Ų‡. + +/// tip + +Ø§ÛŒŲ†ÚŠŲ‡ Ø§ÛŒŲ† **ŲžØ§ÛŒØĒŲˆŲ† Ø§ØŗØĒØ§Ų†Ø¯Ø§ØąØ¯Ų‡** ÛŒØšŲ†ÛŒ Ų‡Ų†ŲˆØ˛ **Ø¨Ų‡ØĒØąÛŒŲ† ØĒØŦØąØ¨Ų‡ ØĒŲˆØŗØšŲ‡â€ŒØ¯Ų‡Ų†Ø¯Ų‡** ØąŲˆ ØĒŲˆÛŒ ŲˆÛŒØąØ§ÛŒØ´Ú¯ØąØĒ، با Ø§Ø¨Ø˛Ø§ØąŲ‡Ø§ÛŒÛŒ ÚŠŲ‡ Ø¨ØąØ§ÛŒ ØĒØ­Ų„ÛŒŲ„ ؈ Ø¨Ø§Ø˛ØŗØ§Ø˛ÛŒ ڊدØĒ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒÚŠŲ†ÛŒ ؈ ØēÛŒØąŲ‡ Ų…ÛŒâ€ŒÚ¯ÛŒØąÛŒ. ✨ + +؈ Ų‡Ų…ÛŒŲ†â€ŒØˇŲˆØą ڊدØĒ با ØŽÛŒŲ„ÛŒ Ø§Ø˛ Ø§Ø¨Ø˛Ø§ØąŲ‡Ø§ ؈ ÚŠØĒØ§Ø¨ØŽŲˆŲ†Ų‡â€ŒŲ‡Ø§ÛŒ Ø¯ÛŒÚ¯Ų‡ ŲžØ§ÛŒØĒŲˆŲ† ØŽÛŒŲ„ÛŒ ØŗØ§Ø˛Ú¯Ø§Øą Ų…ÛŒâ€ŒŲ…ŲˆŲ†Ų‡. 🚀 + +/// + +## Ų†ŲˆØšâ€ŒŲ†Ų…Ø§Ų‡Ø§ ØĒŲˆÛŒ **FastAPI** + +**FastAPI** Ø§Ø˛ Ø§ÛŒŲ† Ų†ŲˆØšâ€ŒŲ†Ų…Ø§Ų‡Ø§ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒÚŠŲ†Ų‡ ØĒا Ú†Ų†Ø¯ ØĒا ÚŠØ§Øą Ø¨ÚŠŲ†Ų‡. + +با **FastAPI** ŲžØ§ØąØ§Ų…ØĒØąŲ‡Ø§ ØąŲˆ با Ų†ŲˆØšâ€ŒŲ†Ų…Ø§Ų‡Ø§ ØĒØšØąÛŒŲ Ų…ÛŒâ€ŒÚŠŲ†ÛŒ ؈ Ø§ÛŒŲ†Ø§ ØąŲˆ Ų…ÛŒâ€ŒÚ¯ÛŒØąÛŒ: + +* **ŲžØ´ØĒÛŒØ¨Ø§Ų†ÛŒ ŲˆÛŒØąØ§ÛŒØ´Ú¯Øą**. +* **چک Ų†ŲˆØšâ€ŒŲ‡Ø§**. + +...؈ **FastAPI** Ø§Ø˛ Ų‡Ų…ŲˆŲ† ØĒØšØąÛŒŲâ€ŒŲ‡Ø§ Ø¨ØąØ§ÛŒ Ø§ÛŒŲ†Ø§ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒÚŠŲ†Ų‡: + +* **ØĒØšØąÛŒŲ Ų†ÛŒØ§Ø˛Ų‡Ø§**: Ø§Ø˛ ŲžØ§ØąØ§Ų…ØĒØąŲ‡Ø§ÛŒ Ų…ØŗÛŒØą Ø¯ØąØŽŲˆØ§ØŗØĒ، ŲžØ§ØąØ§Ų…ØĒØąŲ‡Ø§ÛŒ ÚŠŲˆØĻØąÛŒØŒ Ų‡Ø¯ØąŲ‡Ø§ØŒ Ø¨Ø¯Ų†Ų‡â€ŒŲ‡Ø§ØŒ ŲˆØ§Ø¨ØŗØĒÚ¯ÛŒâ€ŒŲ‡Ø§ ؈ ØēÛŒØąŲ‡. +* **ØĒØ¨Ø¯ÛŒŲ„ Ø¯Ø§Ø¯Ų‡**: Ø§Ø˛ Ø¯ØąØŽŲˆØ§ØŗØĒ Ø¨Ų‡ Ų†ŲˆØš Ų…ŲˆØąØ¯ Ų†ÛŒØ§Ø˛. +* **اؚØĒØ¨Ø§ØąØŗŲ†ØŦی Ø¯Ø§Ø¯Ų‡**: ÚŠŲ‡ Ø§Ø˛ Ų‡Øą Ø¯ØąØŽŲˆØ§ØŗØĒ Ų…ÛŒØ§Ø¯: + * ØĒŲˆŲ„ÛŒØ¯ **ØŽØˇØ§Ų‡Ø§ÛŒ ØŽŲˆØ¯ÚŠØ§Øą** ÚŠŲ‡ Ø¨Ų‡ ÚŠŲ„Ø§ÛŒŲ†ØĒ Ø¨ØąŲ…ÛŒâ€ŒÚ¯ØąØ¯Ų‡ ŲˆŲ‚ØĒی Ø¯Ø§Ø¯Ų‡ Ų†Ø§Ų…ØšØĒØ¨ØąŲ‡. +* **Ų…ØŗØĒŲ†Ø¯ØŗØ§Ø˛ÛŒ** API با Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ OpenAPI: + * ÚŠŲ‡ بؚدش ØĒŲˆØŗØˇ ØąØ§Ø¨Øˇâ€ŒŲ‡Ø§ÛŒ ÚŠØ§ØąØ¨ØąÛŒ Ų…ØŗØĒŲ†Ø¯Ø§ØĒ ØĒØšØ§Ų…Ų„ÛŒ ØŽŲˆØ¯ÚŠØ§Øą Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒØ´Ų‡. + +Ø§ÛŒŲ†Ø§ شاید Ų‡Ų…Ų‡â€ŒØ´ Ø§Ų†ØĒØ˛Ø§ØšÛŒ Ø¨Ų‡ Ų†Ø¸Øą بیاد. Ų†Ú¯ØąØ§Ų† Ų†Ø¨Ø§Ø´. Ų‡Ų…Ų‡ Ø§ÛŒŲ†Ø§ ØąŲˆ ØĒŲˆÛŒ ØšŲ…Ų„ ØĒŲˆÛŒ [ØĸŲ…ŲˆØ˛Ø´ - ØąØ§Ų‡Ų†Ų…Ø§ÛŒ ÚŠØ§ØąØ¨Øą](tutorial/index.md){.internal-link target=_blank} Ų…ÛŒâ€ŒØ¨ÛŒŲ†ÛŒ. + +Ų†ÚŠØĒŲ‡ Ų…Ų‡Ų… Ø§ÛŒŲ†Ų‡ ÚŠŲ‡ با Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ Ų†ŲˆØšâ€ŒŲ‡Ø§ÛŒ Ø§ØŗØĒØ§Ų†Ø¯Ø§ØąØ¯ ŲžØ§ÛŒØĒŲˆŲ†ØŒ ØĒŲˆÛŒ ÛŒŲ‡ ØŦا (Ø¨Ų‡ ØŦای اØļØ§ŲŲ‡ ÚŠØąØ¯Ų† ÚŠŲ„Ø§Øŗâ€ŒŲ‡Ø§ÛŒ بیشØĒØąØŒ Ø¯ÚŠŲˆØąØ§ØĒŲˆØąŲ‡Ø§ ؈ ØēÛŒØąŲ‡)، **FastAPI** ÚŠŲ„ÛŒ Ø§Ø˛ ÚŠØ§Øą ØąŲˆ Ø¨ØąØ§ØĒ Ø§Ų†ØŦØ§Ų… Ų…ÛŒâ€ŒØ¯Ų‡. + +/// info + +Ø§Ú¯Ų‡ Ų‡Ų…Ų‡ ØĸŲ…ŲˆØ˛Ø´ ØąŲˆ Ú¯Ø°ØąŲˆŲ†Ø¯ÛŒ ؈ Ø¨ØąÚ¯Ø´ØĒی ÚŠŲ‡ بیشØĒØą Ø¯Øą Ų…ŲˆØąØ¯ Ų†ŲˆØšâ€ŒŲ‡Ø§ Ø¨Ø¨ÛŒŲ†ÛŒØŒ ÛŒŲ‡ Ų…Ų†Ø¨Øš ØŽŲˆØ¨ "ØĒŲ‚Ų„Ø¨â€ŒŲ†Ø§Ų…Ų‡" Ø§Ø˛ `mypy` Ų‡ØŗØĒ. + +/// diff --git a/docs/ja/docs/deployment/concepts.md b/docs/ja/docs/deployment/concepts.md index c6b21fd1b..a0d4fb35b 100644 --- a/docs/ja/docs/deployment/concepts.md +++ b/docs/ja/docs/deployment/concepts.md @@ -219,7 +219,7 @@ FastAPI ã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗã§ã¯ã€Uvicorn ぎようãĒã‚ĩãƒŧバãƒŧプロ これらぎワãƒŧã‚Ģãƒŧãƒģプロã‚ģ゚は、ã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗã‚’åŽŸčĄŒã™ã‚‹ã‚‚ãŽã§ã‚ã‚Šã€**ãƒĒクエ゚ト**を受けãĻ**ãƒŦã‚šãƒãƒŗã‚š**をčŋ”すためぎä¸ģčρãĒč¨ˆįŽ—ã‚’čĄŒã„ã€ã‚ãĒたが変数ãĢå…ĨれたもぎはäŊ•でもRAMãĢロãƒŧドしぞす。 - + そしãĻã‚‚ãĄã‚ã‚“ã€åŒã˜ãƒžã‚ˇãƒŗã§ã¯ã€ã‚ãĒたぎã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗã¨ã¯åˆĨãĢ、**äģ–ぎプロã‚ģ゚**ã‚‚åŽŸčĄŒã•ã‚ŒãĻいるでしょう。 diff --git a/docs/ja/docs/deployment/https.md b/docs/ja/docs/deployment/https.md index ac40b0982..7b0f567aa 100644 --- a/docs/ja/docs/deployment/https.md +++ b/docs/ja/docs/deployment/https.md @@ -92,7 +92,7 @@ DNSã‚ĩãƒŧバãƒŧでは、**å–åž—ã—ãŸãƒ‰ãƒĄã‚¤ãƒŗ**をあãĒたぎã‚ĩãƒŧバãƒŧ DNSã‚ĩãƒŧバãƒŧは、ブナã‚Ļã‚ļãĢį‰šåŽšãŽ**IPã‚ĸドãƒŦ゚**をäŊŋį”¨ã™ã‚‹ã‚ˆã†ãĢ指į¤ēしぞす。こぎIPã‚ĸドãƒŦ゚は、DNSã‚ĩãƒŧバãƒŧã§č¨­åŽšã—ãŸã€ã‚ãĒたぎã‚ĩãƒŧバãƒŧがäŊŋį”¨ã™ã‚‹ãƒ‘ãƒ–ãƒĒックIPã‚ĸドãƒŦ゚ãĢãĒりぞす。 - + ### TLS Handshake ぎ開始 @@ -100,7 +100,7 @@ DNSã‚ĩãƒŧバãƒŧは、ブナã‚Ļã‚ļãĢį‰šåŽšãŽ**IPã‚ĸドãƒŦ゚**をäŊŋį”¨ã™ã‚‹ 通äŋĄãŽæœ€åˆãŽéƒ¨åˆ†ã¯ã€ã‚¯ãƒŠã‚¤ã‚ĸãƒŗãƒˆã¨ã‚ĩãƒŧバãƒŧ間ぎæŽĨįļšã‚’įĸēįĢ‹ã—ã€äŊŋį”¨ã™ã‚‹æš—åˇéĩãĒおをæąēめるだけです。 - + TLSæŽĨįļšã‚’įĸēįĢ‹ã™ã‚‹ãŸã‚ãŽã‚¯ãƒŠã‚¤ã‚ĸãƒŗãƒˆã¨ã‚ĩãƒŧバãƒŧ間ぎこぎやりとりは、**TLSãƒãƒŗãƒ‰ã‚ˇã‚§ã‚¤ã‚¯**とå‘ŧばれぞす。 @@ -120,7 +120,7 @@ TLS Termination Proxyは、1つäģĨ上ぎ**TLSč¨ŧ明書**īŧˆHTTPSč¨ŧ明書īŧ‰ãĢ äģŠå›žã¯ã€`someapp.example.com`ぎč¨ŧ明書をäŊŋうことãĢãĒりぞす。 - + クナイã‚ĸãƒŗãƒˆã¯ã€ããŽTLSč¨ŧæ˜Žæ›¸ã‚’į”Ÿæˆã—ãŸã‚¨ãƒŗãƒ†ã‚Ŗãƒ†ã‚Ŗīŧˆã“ぎ場合はLet's Encryptですが、これãĢついãĻは垌čŋ°ã—ぞすīŧ‰ã‚’すでãĢ**äŋĄé ŧ**しãĻいるため、そぎč¨ŧ明書が有劚であることを**検č¨ŧ**することができぞす。 @@ -142,19 +142,19 @@ TLS Termination Proxyは、1つäģĨ上ぎ**TLSč¨ŧ明書**īŧˆHTTPSč¨ŧ明書īŧ‰ãĢ そこで、クナイã‚ĸãƒŗãƒˆã¯**HTTPSãƒĒクエ゚ト**を送äŋĄã—ãžã™ã€‚ã“ã‚Œã¯ã€æš—åˇåŒ–ã•ã‚ŒãŸTLSã‚ŗãƒã‚¯ã‚ˇãƒ§ãƒŗã‚’äģ‹ã—た単ãĒるHTTPãƒĒクエ゚トです。 - + ### ãƒĒã‚¯ã‚¨ã‚šãƒˆãŽåžŠåˇåŒ– TLS Termination Proxy は、合意が取れãĻã„ã‚‹æš—åˇåŒ–ã‚’äŊŋį”¨ã—ãĻ、**ãƒĒã‚¯ã‚¨ã‚šãƒˆã‚’åžŠåˇåŒ–**し、**プãƒŦãƒŧãƒŗ (åžŠåˇåŒ–ã•ã‚ŒãŸ) HTTP ãƒĒクエ゚ト** をã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗã‚’åŽŸčĄŒã—ãĻいるプロã‚ģ゚ (䞋えば、FastAPI ã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗã‚’åŽŸčĄŒã—ãĻいる Uvicorn を持つプロã‚ģ゚) ãĢ送äŋĄã—ぞす。 - + ### HTTP ãƒŦã‚šãƒãƒŗã‚š ã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗã¯ãƒĒクエ゚トをå‡Ļį†ã—ã€**プãƒŦãƒŧãƒŗ(æš—åˇåŒ–ã•ã‚ŒãĻいãĒい)HTTPãƒŦã‚šãƒãƒŗã‚š** をTLS Termination ProxyãĢ送äŋĄã—ぞす。 - + ### HTTPS ãƒŦã‚šãƒãƒŗã‚š @@ -162,7 +162,7 @@ TLS Termination ProxyはæŦĄãĢ、äē‹å‰ãĢ合意が取れãĻã„ã‚‹æš—åˇ(`someap そぎ垌ブナã‚Ļã‚ļでは、ãƒŦã‚šãƒãƒŗã‚šãŒæœ‰åŠšã§æ­Ŗã—ã„æš—åˇã‚­ãƒŧã§æš—åˇåŒ–ã•ã‚ŒãĻいることãĒおを検č¨ŧしぞす。そしãĻ、ブナã‚Ļã‚ļはãƒŦã‚šãƒãƒŗã‚šã‚’**åžŠåˇåŒ–**しãĻå‡Ļį†ã—ãžã™ã€‚ - + クナイã‚ĸãƒŗãƒˆīŧˆãƒ–ナã‚Ļã‚ļīŧ‰ã¯ã€ãƒŦã‚šãƒãƒŗã‚šãŒæ­Ŗã—ã„ã‚ĩãƒŧバãƒŧからæĨたことをįŸĨることができぞす。 ãĒぜãĒら、そぎã‚ĩãƒŧバãƒŧは、äģĨ前ãĢ**HTTPSč¨ŧ明書**をäŊŋãŖãĻåˆæ„ã—ãŸæš—åˇã‚’äŊŋãŖãĻいるからです。 @@ -172,7 +172,7 @@ TLS Termination ProxyはæŦĄãĢ、äē‹å‰ãĢ合意が取れãĻã„ã‚‹æš—åˇ(`someap į‰šåŽšãŽIPとポãƒŧトīŧˆã“ぎ䞋ではTLS Termination Proxyīŧ‰ã‚’æ‰ąã†ã“ã¨ãŒã§ãã‚‹ãŽã¯1つぎプロã‚ģ゚だけですが、äģ–ぎã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗ/プロã‚ģ゚も、同じ**パブãƒĒックIPとポãƒŧト**ぎįĩ„ãŋ合わせをäŊŋį”¨ã—ã‚ˆã†ã¨ã—ãĒい限り、ã‚ĩãƒŧバãƒŧä¸Šã§åŽŸčĄŒã™ã‚‹ã“ã¨ãŒã§ããžã™ã€‚ - + そうすれば、TLS Termination Proxy は、**č¤‡æ•°ãŽãƒ‰ãƒĄã‚¤ãƒŗ**ã‚„č¤‡æ•°ãŽã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗãŽHTTPSとč¨ŧ明書をå‡Ļį†ã—ã€ãã‚Œãžã‚ŒãŽã‚ąãƒŧ゚で遊切ãĒã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗãĢãƒĒクエ゚トを送äŋĄã™ã‚‹ã“とができぞす。 @@ -182,7 +182,7 @@ TLS Termination ProxyはæŦĄãĢ、äē‹å‰ãĢ合意が取れãĻã„ã‚‹æš—åˇ(`someap そぎ垌、Let's Encryptと通äŋĄã™ã‚‹åˆĨぎプログナムīŧˆåˆĨぎプログナムである場合もあれば、同じTLS Termination Proxyである場合もあるīŧ‰ãĢã‚ˆãŖãĻ、č¨ŧ明書を更新しぞす。 - + **TLSč¨ŧ明書**は、IPã‚ĸドãƒŦ゚ではãĒく、**ãƒ‰ãƒĄã‚¤ãƒŗåãĢé–ĸ逪äģ˜ã‘られãĻ**いぞす。 diff --git a/docs/ja/docs/tutorial/body-fields.md b/docs/ja/docs/tutorial/body-fields.md index 0466320f1..ce5630351 100644 --- a/docs/ja/docs/tutorial/body-fields.md +++ b/docs/ja/docs/tutorial/body-fields.md @@ -44,7 +44,7 @@ čŋŊåŠ æƒ…å ąã¯`Field`や`Query`、`Body`ãĒãŠã§åŽŖč¨€ã™ã‚‹ã“ã¨ãŒã§ããžã™ã€‚ãã—ãĻãã‚Œã¯į”Ÿæˆã•ã‚ŒãŸJSON゚キãƒŧマãĢåĢぞれぞす。 -垌ãĢäž‹ã‚’į”¨ã„ãĻåŽŖč¨€ã‚’å­Ļãļ際ãĢ、čŋŊåŠ æƒ…å ąã‚’åĨæ‚Ēæ–šæŗ•ã‚’å­Ļずぞす。 +垌ãĢäž‹ã‚’į”¨ã„ãĻåŽŖč¨€ã‚’å­Ļãļ際ãĢ、čŋŊåŠ æƒ…å ąã‚’čŋŊåŠ ã™ã‚‹æ–šæŗ•ã‚’å­Ļずぞす。 ## ぞとめ diff --git a/docs/ja/docs/tutorial/body.md b/docs/ja/docs/tutorial/body.md index 8376959d5..1298eec7e 100644 --- a/docs/ja/docs/tutorial/body.md +++ b/docs/ja/docs/tutorial/body.md @@ -22,7 +22,7 @@ GET ãƒĒã‚¯ã‚¨ã‚šãƒˆã§ãƒœãƒ‡ã‚Ŗã‚’é€äŋĄã™ã‚‹ã“とは、ä앿§˜ã§ã¯æœĒåŽšįžŠ ぞす初めãĢ、 `pydantic` から `BaseModel` ã‚’ã‚¤ãƒŗãƒãƒŧトするåŋ…čĻãŒã‚ã‚Šãžã™: -{* ../../docs_src/body/tutorial001.py hl[2] *} +{* ../../docs_src/body/tutorial001.py hl[4] *} ## デãƒŧã‚ŋãƒĸデãƒĢぎäŊœæˆ @@ -30,7 +30,7 @@ GET ãƒĒã‚¯ã‚¨ã‚šãƒˆã§ãƒœãƒ‡ã‚Ŗã‚’é€äŋĄã™ã‚‹ã“とは、ä앿§˜ã§ã¯æœĒåŽšįžŠ すずãĻãŽåąžæ€§ãĢpython標æē–ぎ型をäŊŋį”¨ã—ãžã™: -{* ../../docs_src/body/tutorial001.py hl[5:9] *} +{* ../../docs_src/body/tutorial001.py hl[7:11] *} クエãƒĒãƒ‘ãƒŠãƒĄãƒŧã‚ŋãŽåŽŖč¨€ã¨åŒæ§˜ãĢ、ãƒĸデãƒĢåąžæ€§ãŒãƒ‡ãƒ•ã‚ŠãƒĢト値をもつとき、åŋ…é ˆãĒåąžæ€§ã§ã¯ãĒくãĒりぞす。それäģĨ外はåŋ…é ˆãĢãĒりぞす。ã‚Ēãƒ—ã‚ˇãƒ§ãƒŠãƒĢãĒåąžæ€§ãĢしたい場合は `None` をäŊŋį”¨ã—ãĻください。 @@ -58,7 +58,7 @@ GET ãƒĒã‚¯ã‚¨ã‚šãƒˆã§ãƒœãƒ‡ã‚Ŗã‚’é€äŋĄã™ã‚‹ã“とは、ä앿§˜ã§ã¯æœĒåŽšįžŠ *パ゚ã‚ĒペãƒŦãƒŧã‚ˇãƒ§ãƒŗ* ãĢ加えるためãĢã€ãƒ‘ã‚šãƒ‘ãƒŠãƒĄãƒŧã‚ŋやクエãƒĒãƒ‘ãƒŠãƒĄãƒŧã‚ŋと同じ様ãĢåŽŖč¨€ã—ãžã™: -{* ../../docs_src/body/tutorial001.py hl[16] *} +{* ../../docs_src/body/tutorial001.py hl[18] *} ...そしãĻ、äŊœæˆã—たãƒĸデãƒĢ `Item` ã§åž‹ã‚’åŽŖč¨€ã—ãžã™ã€‚ @@ -125,7 +125,7 @@ GET ãƒĒã‚¯ã‚¨ã‚šãƒˆã§ãƒœãƒ‡ã‚Ŗã‚’é€äŋĄã™ã‚‹ã“とは、ä앿§˜ã§ã¯æœĒåŽšįžŠ é–ĸ数内部で、ãƒĸデãƒĢぎ全ãĻãŽåąžæ€§ãĢį›´æŽĨã‚ĸクã‚ģ゚できぞす: -{* ../../docs_src/body/tutorial002.py hl[19] *} +{* ../../docs_src/body/tutorial002.py hl[21] *} ## ãƒĒã‚¯ã‚¨ã‚šãƒˆãƒœãƒ‡ã‚Ŗ + ãƒ‘ã‚šãƒ‘ãƒŠãƒĄãƒŧã‚ŋ @@ -133,7 +133,7 @@ GET ãƒĒã‚¯ã‚¨ã‚šãƒˆã§ãƒœãƒ‡ã‚Ŗã‚’é€äŋĄã™ã‚‹ã“とは、ä앿§˜ã§ã¯æœĒåŽšįžŠ **FastAPI** ã¯ãƒ‘ã‚šãƒ‘ãƒŠãƒĄãƒŧã‚ŋであるé–ĸæ•°ãƒ‘ãƒŠãƒĄãƒŧã‚ŋは**パ゚から受け取り**、PydanticãƒĸデãƒĢãĢã‚ˆãŖãĻåŽŖč¨€ã•ã‚ŒãŸé–ĸæ•°ãƒ‘ãƒŠãƒĄãƒŧã‚ŋは**ãƒĒã‚¯ã‚¨ã‚šãƒˆãƒœãƒ‡ã‚Ŗã‹ã‚‰å—ã‘å–ã‚‹**ということをčĒč­˜ã—ãžã™ã€‚ -{* ../../docs_src/body/tutorial003.py hl[15:16] *} +{* ../../docs_src/body/tutorial003.py hl[17:18] *} ## ãƒĒã‚¯ã‚¨ã‚šãƒˆãƒœãƒ‡ã‚Ŗ + ãƒ‘ã‚šãƒ‘ãƒŠãƒĄãƒŧã‚ŋ + クエãƒĒãƒ‘ãƒŠãƒĄãƒŧã‚ŋ @@ -141,7 +141,7 @@ GET ãƒĒã‚¯ã‚¨ã‚šãƒˆã§ãƒœãƒ‡ã‚Ŗã‚’é€äŋĄã™ã‚‹ã“とは、ä앿§˜ã§ã¯æœĒåŽšįžŠ **FastAPI** はそれぞれをčĒč­˜ã—ã€éŠåˆ‡ãĒ場所からデãƒŧã‚ŋを取垗しぞす。 -{* ../../docs_src/body/tutorial004.py hl[16] *} +{* ../../docs_src/body/tutorial004.py hl[18] *} é–ĸæ•°ãƒ‘ãƒŠãƒĄãƒŧã‚ŋはäģĨ下ぎ様ãĢčĒč­˜ã•ã‚Œãžã™: diff --git a/docs/ja/docs/tutorial/encoder.md b/docs/ja/docs/tutorial/encoder.md index 409ebeec6..309cf8857 100644 --- a/docs/ja/docs/tutorial/encoder.md +++ b/docs/ja/docs/tutorial/encoder.md @@ -8,7 +8,7 @@ ## `jsonable_encoder`ぎäŊŋᔍ -JSONäē’æ›ãŽãƒ‡ãƒŧã‚ŋぎãŋを受äŋĄã™ã‚‹ãƒ‡ãƒŧã‚ŋベãƒŧ゚`fase_db`があるとしぞしょう。 +JSONäē’æ›ãŽãƒ‡ãƒŧã‚ŋぎãŋを受äŋĄã™ã‚‹ãƒ‡ãƒŧã‚ŋベãƒŧ゚`fake_db`があるとしぞしょう。 䞋えば、`datetime`ã‚ĒブジェクトはJSONとäē’æ›æ€§ãŒãĒいぎで、こぎデãƒŧã‚ŋãƒŧベãƒŧ゚ãĢは受け取られぞせん。 diff --git a/docs/ja/docs/tutorial/handling-errors.md b/docs/ja/docs/tutorial/handling-errors.md index 9a46cc738..37315b087 100644 --- a/docs/ja/docs/tutorial/handling-errors.md +++ b/docs/ja/docs/tutorial/handling-errors.md @@ -63,7 +63,7 @@ Pythonぎ䞋外ãĒぎで、`return`ではãĒく、`raise`です。 `HTTPException`をį™ēį”Ÿã•ã›ã‚‹éš›ãĢは、`str`だけでãĒく、JSONãĢ変換できるäģģæ„ãŽå€¤ã‚’`detail`ãƒ‘ãƒŠãƒĄãƒŧã‚ŋとしãĻæ¸Ąã™ã“ã¨ãŒã§ããžã™ã€‚ -`dist`や`list`ãĒãŠã‚’æ¸Ąã™ã“ã¨ãŒã§ããžã™ã€‚ +`dict`や`list`ãĒãŠã‚’æ¸Ąã™ã“ã¨ãŒã§ããžã™ã€‚ これらは **FastAPI** ãĢã‚ˆãŖãĻč‡Ēå‹•įš„ãĢå‡Ļį†ã•ã‚Œã€JSONãĢ変換されぞす。 diff --git a/docs/ja/docs/virtual-environments.md b/docs/ja/docs/virtual-environments.md new file mode 100644 index 000000000..791cf64a8 --- /dev/null +++ b/docs/ja/docs/virtual-environments.md @@ -0,0 +1,831 @@ +# äģŽæƒŗį’°åĸƒ + +PythonプロジェクトぎäŊœæĨ­ã§ã¯ã€**äģŽæƒŗį’°åĸƒ**īŧˆãžãŸã¯éĄžäŧŧぎäģ•įĩ„ãŋīŧ‰ã‚’äŊŋį”¨ã—ã€ãƒ—ãƒ­ã‚¸ã‚§ã‚¯ãƒˆã”ã¨ãĢã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢã™ã‚‹ãƒ‘ãƒƒã‚ąãƒŧジを分é›ĸするずきでしょう。 + +/// info | æƒ…å ą + +もし、äģŽæƒŗį’°åĸƒãŽæĻ‚čĻã‚„äŊœæˆæ–šæŗ•ã€äŊŋį”¨æ–šæŗ•ãĢついãĻæ—ĸãĢご存įŸĨãĒら、こぎã‚ģã‚¯ã‚ˇãƒ§ãƒŗã‚’ã‚šã‚­ãƒƒãƒ—ã™ã‚‹ã“ã¨ãŒã§ããžã™ã€‚đŸ¤“ + +/// + +/// tip | 豆įŸĨ識 + +**äģŽæƒŗį’°åĸƒ**は、**į’°åĸƒå¤‰æ•°**ã¨ã¯į•°ãĒりぞす。 + +**į’°åĸƒå¤‰æ•°**は、プログナムがäŊŋį”¨ã§ãã‚‹ã‚ˇã‚šãƒ†ãƒ å†…ãŽå¤‰æ•°ã§ã™ã€‚ + +**äģŽæƒŗį’°åĸƒ**ã¯ã€ãƒ•ã‚Ąã‚¤ãƒĢã‚’ãžã¨ã‚ãŸãƒ‡ã‚ŖãƒŦクトãƒĒぎことです。 + +/// + +/// info | æƒ…å ą +こぎペãƒŧジでは、**äģŽæƒŗį’°åĸƒ**ぎäŊŋį”¨æ–šæŗ•ã¨ã€ããŽã¯ãŸã‚‰ããĢついãĻčĒŦ明しぞす。 + +もし**すずãĻã‚’įŽĄį†ã™ã‚‹ãƒ„ãƒŧãƒĢ**īŧˆPythonãŽã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢもåĢむīŧ‰ã‚’å°Žå…Ĩするæē–備ができãĻいるãĒら、uv をおčŠĻしください。 + +/// + +## プロジェクトぎäŊœæˆ + +ãžãšã€ãƒ—ãƒ­ã‚¸ã‚§ã‚¯ãƒˆį”¨ãŽãƒ‡ã‚ŖãƒŦクトãƒĒをäŊœæˆã—ぞす。 + +į§ã¯é€šå¸¸ home/user ãƒ‡ã‚ŖãƒŦクトãƒĒぎ中ãĢ `code` ã¨ã„ã†ãƒ‡ã‚ŖãƒŦクトãƒĒã‚’į”¨æ„ã—ãĻいãĻ、プロジェクトごとãĢ1ã¤ãŽãƒ‡ã‚ŖãƒŦクトãƒĒをそぎ中ãĢäŊœæˆã—ãĻいぞす。 + +
+ +```console +// Go to the home directory +$ cd +// Create a directory for all your code projects +$ mkdir code +// Enter into that code directory +$ cd code +// Create a directory for this project +$ mkdir awesome-project +// Enter into that project directory +$ cd awesome-project +``` + +
+ +## äģŽæƒŗį’°åĸƒãŽäŊœæˆ + +Pythonプロジェクトでぎ**初めãĻぎ**äŊœæĨ­ã‚’開始する際ãĢは、**プロジェクト内**ãĢäģŽæƒŗį’°åĸƒã‚’äŊœæˆã—ãĻください。 + +/// tip | 豆įŸĨ識 + +ã“ã‚Œã‚’čĄŒã†ãŽã¯ã€**プロジェクトごとãĢ1回だけ**です。äŊœæĨ­ãŽãŸãŗãĢčĄŒã†åŋ…čĻã¯ã‚ã‚Šãžã›ã‚“ã€‚ + +/// + +//// tab | `venv` + +äģŽæƒŗį’°åĸƒã‚’äŊœæˆã™ã‚‹ãĢは、PythonãĢäģ˜åąžã—ãĻいる `venv` ãƒĸジãƒĨãƒŧãƒĢをäŊŋį”¨ã§ããžã™ã€‚ + +
+ +```console +$ python -m venv .venv +``` + +
+ +/// details | ã“ãŽã‚ŗãƒžãƒŗãƒ‰ãŽæ„å‘ŗ + +- `python` : `python` というプログナムをå‘ŧãŗå‡ēしぞす +- `-m` : ãƒĸジãƒĨãƒŧãƒĢを゚クãƒĒプトとしãĻå‘ŧãŗå‡ēしぞす。おぎãƒĸジãƒĨãƒŧãƒĢをå‘ŧãŗå‡ēすぎか、こぎæŦĄãĢ指厚しぞす +- `venv` : 通常PythonãĢäģ˜éšã—ãĻã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢされる `venv`ãƒĸジãƒĨãƒŧãƒĢをäŊŋį”¨ã—ãžã™ +- `.venv` : äģŽæƒŗį’°åĸƒã‚’`.venv`ã¨ã„ã†æ–°ã—ã„ãƒ‡ã‚ŖãƒŦクトãƒĒãĢäŊœæˆã—ぞす + +/// + +//// + +//// tab | `uv` + +もし `uv` ã‚’ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢ済ãŋãĒら、äģŽæƒŗį’°åĸƒã‚’äŊœæˆã™ã‚‹ãŸã‚ãĢ `uv` をäŊŋうこともできぞす。 + +
+ +```console +$ uv venv +``` + +
+ +/// tip | 豆įŸĨ識 + +デフりãƒĢトでは、 `uv` は `.venv` ã¨ã„ã†ãƒ‡ã‚ŖãƒŦクトãƒĒãĢäģŽæƒŗį’°åĸƒã‚’äŊœæˆã—ぞす。 + +ただし、čŋŊ加ぎåŧ•æ•°ãĢãƒ‡ã‚ŖãƒŦクトãƒĒ名を与えãĻã‚Ģ゚ã‚ŋマイã‚ēすることもできぞす。 + +/// + +//// + +ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ `.venv` ã¨ã„ã†ãƒ‡ã‚ŖãƒŦクトãƒĒãĢ新しいäģŽæƒŗį’°åĸƒã‚’äŊœæˆã—ぞす。 + +/// details | `.venv` ぞたはそぎäģ–ぎ名前 + +äģŽæƒŗį’°åĸƒã‚’åˆĨãŽãƒ‡ã‚ŖãƒŦクトãƒĒãĢäŊœæˆã™ã‚‹ã“とも可čƒŊですが、 `.venv` と名äģ˜ã‘るぎが一čˆŦįš„ãĒæ…Ŗįŋ’です。 + +/// + +## äģŽæƒŗį’°åĸƒãŽæœ‰åŠšåŒ– + +åŽŸčĄŒã•ã‚Œã‚‹Pythonã‚ŗãƒžãƒŗãƒ‰ã‚„ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢã•ã‚Œã‚‹ãƒ‘ãƒƒã‚ąãƒŧジが新しくäŊœæˆã—たäģŽæƒŗį’°åĸƒã‚’äŊŋį”¨ã™ã‚‹ã‚ˆã†ã€ããŽäģŽæƒŗį’°åĸƒã‚’有劚化しぞしょう。 + +/// tip | 豆įŸĨ識 + +そぎプロジェクトぎäŊœæĨ­ã§**新しいã‚ŋãƒŧミナãƒĢã‚ģãƒƒã‚ˇãƒ§ãƒŗ**を開始する際ãĢは、**毎回**有劚化がåŋ…čĻã§ã™ã€‚ + +/// + +//// tab | Linux, macOS + +
+ +```console +$ source .venv/bin/activate +``` + +
+ +//// + +//// tab | Windows PowerShell + +
+ +```console +$ .venv\Scripts\Activate.ps1 +``` + +
+ +//// + +//// tab | Windows Bash + +もしWindowsでBashをäŊŋį”¨ã—ãĻいる場合 (Git BashãĒお): + +
+ +```console +$ source .venv/Scripts/activate +``` + +
+ +//// + +/// tip | 豆įŸĨ識 + +**æ–°ã—ã„ãƒ‘ãƒƒã‚ąãƒŧジ**をäģŽæƒŗį’°åĸƒãĢã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢするときãĢは、再åēĻ**有劚化**しãĻください。 + +ã“ã†ã™ã‚‹ã“ã¨ã§ã€ããŽãƒ‘ãƒƒã‚ąãƒŧã‚¸ãŒã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢした**ã‚ŋãƒŧミナãƒĢīŧˆCLIīŧ‰ãƒ—ログナム**をäŊŋį”¨ã™ã‚‹å ´åˆãĢ、äģŽæƒŗį’°åĸƒå†…ぎもぎがįĸē原ãĢäŊŋわれ、グロãƒŧバãƒĢį’°åĸƒãĢã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢされãĻいるåˆĨぎもぎīŧˆãŠãã‚‰ãåŋ…čρãĒã‚‚ãŽã¨ã¯į•°ãĒるバãƒŧã‚¸ãƒ§ãƒŗīŧ‰ã‚’čĒ¤ãŖãĻäŊŋį”¨ã™ã‚‹ã“ã¨ã‚’é˜˛ãŽãžã™ã€‚ + +/// + +## äģŽæƒŗį’°åĸƒãŒæœ‰åŠšã§ã‚ã‚‹ã“ã¨ã‚’įĸēčĒã™ã‚‹ + +äģŽæƒŗį’°åĸƒãŒæœ‰åŠšã§ã‚ã‚‹īŧˆå‰ãŽã‚ŗãƒžãƒŗãƒ‰ãŒæ­Ŗå¸¸ãĢ抟čƒŊしたīŧ‰ã“とをįĸēčĒã—ãžã™ã€‚ + +/// tip | 豆įŸĨ識 + +これは**äģģæ„**ですが、すずãĻが期垅通りãĢ抟čƒŊã—ã€æ„å›ŗã—ãŸäģŽæƒŗį’°åĸƒã‚’äŊŋį”¨ã—ãĻいることを**įĸēčĒã™ã‚‹**č‰¯ã„æ–šæŗ•ã§ã™ã€‚ + +/// + +//// tab | Linux, macOS, Windows Bash + +
+ +```console +$ which python + +/home/user/code/awesome-project/.venv/bin/python +``` + +
+ +`.venv/bin/python` ãĢある `python` バイナãƒĒが、プロジェクトīŧˆã“ぎ場合は `awesome-project` īŧ‰å†…ãĢ襨į¤ēされãĻã„ã‚Œã°ã€æ­Ŗå¸¸ãĢ動äŊœã—ãĻいぞす đŸŽ‰ã€‚ + +//// + +//// tab | Windows PowerShell + +
+ +``` console +$ Get-Command python + +C:\Users\user\code\awesome-project\.venv\Scripts\python +``` + +
+ +`.venv\Scripts\python` ãĢある `python` バイナãƒĒが、プロジェクトīŧˆã“ぎ場合は `awesome-project` īŧ‰å†…ãĢ襨į¤ēされãĻã„ã‚Œã°ã€æ­Ŗå¸¸ãĢ動äŊœã—ãĻいぞす đŸŽ‰ã€‚ + +//// + +## `pip` をã‚ĸップグãƒŦãƒŧドする + +/// tip | 豆įŸĨ識 + +もし `uv` をäŊŋį”¨ã—ãĻいる場合は、 `pip` ぎäģŖã‚ã‚ŠãĢ `uv` をäŊŋãŖãĻã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢã‚’čĄŒã†ãŸã‚ã€ `pip` をã‚ĸップグãƒŦãƒŧドするåŋ…čĻã¯ã‚ã‚Šãžã›ã‚“ đŸ˜Žã€‚ + +/// + +ã‚‚ã—ãƒ‘ãƒƒã‚ąãƒŧã‚¸ãŽã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢãĢ `pip`īŧˆPythonãĢ標æē–でäģ˜åąžã—ãĻいぞすīŧ‰ã‚’äŊŋį”¨ã—ãĻいるãĒら、 `pip` を最新バãƒŧã‚¸ãƒ§ãƒŗãĢ**ã‚ĸップグãƒŦãƒŧド**しぞしょう。 + +ãƒ‘ãƒƒã‚ąãƒŧã‚¸ãŽã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢ中ãĢį™ēį”Ÿã™ã‚‹æƒŗåŽšå¤–ãŽã‚¨ãƒŠãƒŧぎ多くは、最初ãĢ `pip` をã‚ĸップグãƒŦãƒŧドしãĻãŠãã ã‘ã§č§Ŗæąēされぞす。 + +/// tip | 豆įŸĨ識 + +通常、これはäģŽæƒŗį’°åĸƒã‚’äŊœæˆã—ãŸį›´åžŒãĢ**一åēĻだけ**åŽŸčĄŒã—ãžã™ã€‚ + +/// + +äģŽæƒŗį’°åĸƒãŒæœ‰åŠšã§ã‚ã‚‹ã“ã¨ã‚’īŧˆä¸Šã§čĒŦæ˜Žã—ãŸã‚ŗãƒžãƒŗãƒ‰ã§īŧ‰įĸēčĒã—ã€ã‚ĸップグãƒŦãƒŧãƒ‰ã‚’åŽŸčĄŒã—ãžã—ã‚‡ã†īŧš + +
+ +```console +$ python -m pip install --upgrade pip + +---> 100% +``` + +
+ +## `.gitignore` をčŋŊ加する + +**Git**をäŊŋį”¨ã—ãĻいる場合īŧˆäŊŋį”¨ã™ã‚‹ãšãã§ã—ã‚‡ã†īŧ‰ã€ `.gitignore` ãƒ•ã‚Ąã‚¤ãƒĢをčŋŊ加しãĻ、 `.venv` å†…ãŽã‚ã‚‰ã‚†ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢをGitãŽįŽĄį†å¯žčąĄã‹ã‚‰é™¤å¤–ã—ãžã™ã€‚ + +/// tip | 豆įŸĨ識 + +もし `uv` をäŊŋį”¨ã—ãĻäģŽæƒŗį’°åĸƒã‚’äŊœæˆã—た場合、すでãĢこぎäŊœæĨ­ã¯æ¸ˆã‚“でいるぎで、こぎ手順を゚キップできぞす đŸ˜Žã€‚ + +/// + +/// tip | 豆įŸĨ識 + +これも、äģŽæƒŗį’°åĸƒã‚’äŊœæˆã—ãŸį›´åžŒãĢ**一åēĻだけ**åŽŸčĄŒã—ãžã™ã€‚ + +/// + +
+ +```console +$ echo "*" > .venv/.gitignore +``` + +
+ +/// details | ã“ãŽã‚ŗãƒžãƒŗãƒ‰ãŽæ„å‘ŗ + +- `echo "*"` : ã‚ŋãƒŧミナãƒĢãĢ `*` ã¨ã„ã†ãƒ†ã‚­ã‚šãƒˆã‚’ã€ŒčĄ¨į¤ē」しようとしぞす。īŧˆæŦĄãŽéƒ¨åˆ†ãĢã‚ˆãŖãĻそぎ動äŊœãŒå°‘し変わりぞすīŧ‰ +- `>` : `>` ぎåˇĻå´ãŽã‚ŗãƒžãƒŗãƒ‰ãŒã‚ŋãƒŧミナãƒĢãĢ襨į¤ēしようとする内厚を、ã‚ŋãƒŧミナãƒĢãĢã¯čĄ¨į¤ēせず、 `>` ãŽåŗå´ãŽãƒ•ã‚Ąã‚¤ãƒĢãĢ書きčžŧãŋぞす。 +- `.gitignore` : `*` を書きčžŧã‚€ãƒ•ã‚Ąã‚¤ãƒĢ名。 + +ここで、GitãĢおける `*` は「すずãĻã€ã‚’æ„å‘ŗã™ã‚‹ãŽã§ã€ã“ãŽã‚ŗãƒžãƒŗãƒ‰ãĢã‚ˆãŖãĻ `.venv` ãƒ‡ã‚ŖãƒŦクトãƒĒ内ぎすずãĻがGitãĢį„ĄčĻ–ã•ã‚Œã‚‹ã‚ˆã†ãĢãĒりぞす。 + +ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯äģĨ下ぎテキ゚トを持つ `.gitignore` ãƒ•ã‚Ąã‚¤ãƒĢをäŊœæˆã—ぞすīŧš + +```gitignore +* +``` + +/// + +## ãƒ‘ãƒƒã‚ąãƒŧã‚¸ãŽã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢ + +äģŽæƒŗį’°åĸƒã‚’æœ‰åŠšåŒ–ã—ãŸåžŒã€ããŽä¸­ã§ãƒ‘ãƒƒã‚ąãƒŧã‚¸ã‚’ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢできぞす。 + +/// tip | 豆įŸĨ識 + +プロジェクトãĢåŋ…čρãĒãƒ‘ãƒƒã‚ąãƒŧã‚¸ã‚’ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢぞたはã‚ĸップグãƒŦãƒŧドする場合、これを**一åēĻ**åŽŸčĄŒã—ãžã™ã€‚ + +ã‚‚ã—æ–°ã—ã„ãƒ‘ãƒƒã‚ąãƒŧジをčŋŊ加したり、バãƒŧã‚¸ãƒ§ãƒŗã‚’ã‚ĸップグãƒŦãƒŧドするåŋ…čĻãŒã‚ã‚‹å ´åˆã¯ã€ã‚‚ã†**一åēĻã“ãŽæ‰‹é †ã‚’įš°ã‚Ščŋ”し**ぞす。 + +/// + +### ãƒ‘ãƒƒã‚ąãƒŧã‚¸ã‚’į›´æŽĨã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢする + +æ€ĨいでいãĻã€ãƒ—ãƒ­ã‚¸ã‚§ã‚¯ãƒˆãŽãƒ‘ãƒƒã‚ąãƒŧジčρäģļã‚’åŽŖč¨€ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢをäŊŋいたくãĒã„å ´åˆã€ãƒ‘ãƒƒã‚ąãƒŧã‚¸ã‚’į›´æŽĨã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢできぞす。 + +/// tip | 豆įŸĨ識 + +プログナムがåŋ…čĻã¨ã™ã‚‹ãƒ‘ãƒƒã‚ąãƒŧジとバãƒŧã‚¸ãƒ§ãƒŗã‚’ãƒ•ã‚Ąã‚¤ãƒĢīŧˆäž‹ãˆã° `requirements.txt` や `pyproject.toml` īŧ‰ãĢ記čŧ‰ã—ãĻおくぎは、īŧˆã¨ãĻもīŧ‰č‰¯ã„č€ƒãˆã§ã™ã€‚ + +/// + +//// tab | `pip` + +
+ +```console +$ pip install "fastapi[standard]" + +---> 100% +``` + +
+ +//// + +//// tab | `uv` + +もし `uv` をäŊŋį”¨ã§ãã‚‹ãĒら: + +
+ +```console +$ uv pip install "fastapi[standard]" +---> 100% +``` + +
+ +//// + +### `requirements.txt` ã‹ã‚‰ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢする + +もし `requirements.txt` があるãĒã‚‰ã€ãƒ‘ãƒƒã‚ąãƒŧã‚¸ãŽã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢãĢäŊŋį”¨ã§ããžã™ã€‚ + +//// tab | `pip` + +
+ +```console +$ pip install -r requirements.txt +---> 100% +``` + +
+ +//// + +//// tab | `uv` + +もし `uv` をäŊŋį”¨ã§ãã‚‹ãĒら: + +
+ +```console +$ uv pip install -r requirements.txt +---> 100% +``` + +
+ +//// + +/// details | `requirements.txt` + +ãƒ‘ãƒƒã‚ąãƒŧã‚¸ãŒč¨˜čŧ‰ã•れた `requirements.txt` はäģĨ下ぎようãĢãĒãŖãĻいぞす: + +```requirements.txt +fastapi[standard]==0.113.0 +pydantic==2.8.0 +``` + +/// + +## ãƒ—ãƒ­ã‚°ãƒŠãƒ ã‚’åŽŸčĄŒã™ã‚‹ + +äģŽæƒŗį’°åĸƒã‚’æœ‰åŠšåŒ–ã—ãŸåžŒã€ãƒ—ãƒ­ã‚°ãƒŠãƒ ã‚’åŽŸčĄŒã§ããžã™ã€‚ã“ãŽéš›ã€äģŽæƒŗį’°åĸƒå†…ぎPythonと、そこãĢã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢã—ãŸãƒ‘ãƒƒã‚ąãƒŧジがäŊŋį”¨ã•ã‚Œãžã™ã€‚ + +
+ +```console +$ python main.py + +Hello World +``` + +
+ +## ã‚¨ãƒ‡ã‚Ŗã‚ŋãŽč¨­åŽš + +ãƒ—ãƒ­ã‚¸ã‚§ã‚¯ãƒˆã§ã¯ãŠãã‚‰ãã‚¨ãƒ‡ã‚Ŗã‚ŋをäŊŋį”¨ã™ã‚‹ã§ã—ã‚‡ã†ã€‚ã‚ŗãƒŧãƒ‰čŖœåŽŒã‚„ã‚¤ãƒŗãƒŠã‚¤ãƒŗã‚¨ãƒŠãƒŧãŽčĄ¨į¤ēができるようãĢ、äŊœæˆã—たäģŽæƒŗį’°åĸƒã‚’ã‚¨ãƒ‡ã‚Ŗã‚ŋでもäŊŋãˆã‚‹ã‚ˆã†č¨­åŽšã—ãĻください。īŧˆå¤šããŽå ´åˆã€č‡Ē動検å‡ēされぞすīŧ‰ + +č¨­åŽšäž‹: + +* VS Code +* PyCharm + +/// tip | 豆įŸĨ識 + +ã“ãŽč¨­åŽšã¯é€šå¸¸ã€äģŽæƒŗį’°åĸƒã‚’äŊœæˆã—た際ãĢ**一åēĻだけ**čĄŒã„ãžã™ã€‚ + +/// + +## äģŽæƒŗį’°åĸƒãŽį„ĄåŠšåŒ– + +プロジェクトぎäŊœæĨ­ãŒįĩ‚äē†ã—たら、そぎäģŽæƒŗį’°åĸƒã‚’**į„ĄåŠšåŒ–**できぞす。 + +
+ +```console +$ deactivate +``` + +
+ +これãĢより、 `python` ã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã—ãĻã‚‚ã€ããŽãƒ—ãƒ­ã‚¸ã‚§ã‚¯ãƒˆį”¨īŧˆãŽãƒ‘ãƒƒã‚ąãƒŧã‚¸ãŒã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢされたīŧ‰äģŽæƒŗį’°åĸƒã‹ã‚‰ `python` プログナムをå‘ŧãŗå‡ēそうとはしãĒくãĒりぞす。 + +## äŊœæĨ­æē–å‚™åތäē† + +ここぞでで、プロジェクトぎäŊœæĨ­ã‚’始めるæē–備が整いぞした。 + +/// tip | 豆įŸĨ識 + +ä¸Šč¨˜ãŽå†…åŽšã‚’į†č§Ŗã—ãŸã„ã§ã™ã‹īŧŸ + +もしそうãĒら、äģĨ下をčĒ­ãŋé€˛ã‚ãĻãã ã•ã„ã€‚đŸ‘‡đŸ¤“ + +/// + +## ãĒぜäģŽæƒŗį’°åĸƒīŧŸ + +FastAPIをäŊŋãŖãŸäŊœæĨ­ã‚’するãĢは、 [Python](https://www.python.org/) ãŽã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢがåŋ…čĻã§ã™ã€‚ + +それから、FastAPIや、äŊŋį”¨ã—ãŸã„ããŽäģ–ぎ**ãƒ‘ãƒƒã‚ąãƒŧジ**を**ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢ**するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ + +ãƒ‘ãƒƒã‚ąãƒŧã‚¸ã‚’ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢするãĢは、通常、Python ãĢäģ˜åąžã™ã‚‹ `pip` ã‚ŗãƒžãƒŗãƒ‰ (ぞたは同様ぎäģŖæ›ŋã‚ŗãƒžãƒŗãƒ‰) をäŊŋį”¨ã—ãžã™ã€‚ + +ただし、`pip` ã‚’į›´æŽĨäŊŋį”¨ã™ã‚‹ã¨ã€ãƒ‘ãƒƒã‚ąãƒŧジは**グロãƒŧバãƒĢãĒPythonį’°åĸƒ**īŧˆOS全äŊ“ãĢã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢされたPythonį’°åĸƒīŧ‰ãĢã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢされぞす。 + +### å•éĄŒį‚š + +では、グロãƒŧバãƒĢPythonį’°åĸƒãĢãƒ‘ãƒƒã‚ąãƒŧã‚¸ã‚’ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢã™ã‚‹ã“ã¨ãŽå•éĄŒį‚šã¯äŊ•でしょうかīŧŸ + +ã‚ã‚‹æ™‚į‚šã§ã€ã‚ãĒたは**į•°ãĒã‚‹ãƒ‘ãƒƒã‚ąãƒŧジ**ãĢ䞝存する多くぎプログナムを書くことãĢãĒるでしょう。そしãĻ、これらぎ中ãĢã¯åŒã˜ãƒ‘ãƒƒã‚ąãƒŧジぎ**į•°ãĒるバãƒŧã‚¸ãƒ§ãƒŗ**ãĢ䞝存するもぎもå‡ēãĻãã‚‹ã§ã—ã‚‡ã†ã€‚đŸ˜ą + +䞋えば、 `philosophers-stone` īŧˆčŗĸč€…ãŽįŸŗīŧ‰ã¨ã„うプロジェクトをäŊœæˆã™ã‚‹ã¨ã—ぞす。こぎプログナムは **`harry` īŧˆãƒãƒĒãƒŧīŧ‰ã¨ã„ã†ãƒ‘ãƒƒã‚ąãƒŧジぎバãƒŧã‚¸ãƒ§ãƒŗ `1`**ãĢ䞝存しãĻいぞす。そぎため、 `harry` īŧˆãƒãƒĒãƒŧīŧ‰ã‚’ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢするåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ + +```mermaid +flowchart LR + stone(philosophers-stone) -->|requires| harry-1[harry v1] +``` + +それから、 `prisoner-of-azkaban` īŧˆã‚ĸã‚ēã‚ĢãƒãƒŗãŽå›šäēēīŧ‰ã¨ã„うåˆĨぎプロジェクトをäŊœæˆã—たとしぞす。こぎプロジェクトも `harry` īŧˆãƒãƒĒãƒŧīŧ‰ãĢ䞝存しãĻいぞすが、**`harry` īŧˆãƒãƒĒãƒŧīŧ‰ãŽãƒãƒŧã‚¸ãƒ§ãƒŗ `3`**がåŋ…čĻã§ã™ã€‚ + +```mermaid +flowchart LR + azkaban(prisoner-of-azkaban) --> |requires| harry-3[harry v3] +``` + +ã—ã‹ã—ã€ã“ã“ã§å•éĄŒãĢãĒるぎは、もしロãƒŧã‚ĢãƒĢぎ**äģŽæƒŗį’°åĸƒ**ではãĒくグロãƒŧバãƒĢīŧˆį’°åĸƒīŧ‰ãĢãƒ‘ãƒƒã‚ąãƒŧã‚¸ã‚’ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢするãĒら、 `harry` īŧˆãƒãƒĒãƒŧīŧ‰ãŽãŠãŽãƒãƒŧã‚¸ãƒ§ãƒŗã‚’ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢするか選ばãĒいといけãĒいことです。 + +䞋えば、 `philosophers-stone` īŧˆčŗĸč€…ãŽįŸŗīŧ‰ã‚’åŽŸčĄŒã™ã‚‹ãĢは、ぞず `harry` īŧˆãƒãƒĒãƒŧīŧ‰ãŽãƒãƒŧã‚¸ãƒ§ãƒŗ `1` ã‚’ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢするåŋ…čĻãŒã‚ã‚Šãžã™īŧš + +
+ +```console +$ pip install "harry==1" +``` + +
+ +これãĢより、`harry` īŧˆãƒãƒĒãƒŧīŧ‰ãƒãƒŧã‚¸ãƒ§ãƒŗ1がグロãƒŧバãƒĢãĒPythonį’°åĸƒãĢã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢされぞす。 + +```mermaid +flowchart LR + subgraph global[global env] + harry-1[harry v1] + end + subgraph stone-project[philosophers-stone project] + stone(philosophers-stone) -->|requires| harry-1 + end +``` + +しかし、 `prisoner-of-azkaban` īŧˆã‚ĸã‚ēã‚ĢãƒãƒŗãŽå›šäēēīŧ‰ã‚’åŽŸčĄŒã—ãŸã„å ´åˆã¯ã€`harry` īŧˆãƒãƒĒãƒŧīŧ‰ãŽãƒãƒŧã‚¸ãƒ§ãƒŗ `1` をã‚ĸãƒŗã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢし、`harry` īŧˆãƒãƒĒãƒŧīŧ‰ãŽãƒãƒŧã‚¸ãƒ§ãƒŗ `3` ã‚’ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢã—į›´ã™åŋ…čĻãŒã‚ã‚Šãžã™ã€‚īŧˆã‚るいは、単ãĢ`harry` īŧˆãƒãƒĒãƒŧīŧ‰ãŽãƒãƒŧã‚¸ãƒ§ãƒŗ `3` ã‚’ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢすることで、č‡Ēå‹•įš„ãĢバãƒŧã‚¸ãƒ§ãƒŗ `1` がã‚ĸãƒŗã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢされぞすīŧ‰ + +
+ +```console +$ pip install "harry==3" +``` + +
+ +こぎようãĢしãĻ、グロãƒŧバãƒĢį’°åĸƒã¸ãŽ `harry` īŧˆãƒãƒĒãƒŧīŧ‰ãŽãƒãƒŧã‚¸ãƒ§ãƒŗ `3` ãŽã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢが厌äē†ã—ぞす。 + +それから、 `philosophers-stone` īŧˆčŗĸč€…ãŽįŸŗīŧ‰ã‚’å†ãŗåŽŸčĄŒã—ã‚ˆã†ã¨ã™ã‚‹ã¨ã€ã“ãŽãƒ—ãƒ­ã‚°ãƒŠãƒ ã¯ `harry` īŧˆãƒãƒĒãƒŧīŧ‰ãŽãƒãƒŧã‚¸ãƒ§ãƒŗ `1` がåŋ…čρãĒため、**動äŊœã—ãĒくãĒる**可čƒŊ性がありぞす。 + +```mermaid +flowchart LR + subgraph global[global env] + harry-1[harry v1] + style harry-1 fill:#ccc,stroke-dasharray: 5 5 + harry-3[harry v3] + end + subgraph stone-project[philosophers-stone project] + stone(philosophers-stone) -.-x|â›”ī¸| harry-1 + end + subgraph azkaban-project[prisoner-of-azkaban project] + azkaban(prisoner-of-azkaban) --> |requires| harry-3 + end +``` + +/// tip | 豆įŸĨ識 + +PythonãŽãƒ‘ãƒƒã‚ąãƒŧジでは、**新しいバãƒŧã‚¸ãƒ§ãƒŗ**で**äē’æ›æ€§ã‚’損ãĒう変更をéŋける**ようåŠĒめるぎが一čˆŦįš„ã§ã™ãŒã€ãã‚Œã§ã‚‚æŗ¨æ„ãŒåŋ…čĻã§ã™ã€‚ã™ãšãĻãŒæ­Ŗå¸¸ãĢ動äŊœã™ã‚‹ã“とをテ゚トでįĸēčĒã—ãĻã‹ã‚‰ã€æ„å›ŗįš„ãĢ指厚しãĻ新しいバãƒŧã‚¸ãƒ§ãƒŗã‚’ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢã™ã‚‹ãŽãŒč‰¯ã„ã§ã—ã‚‡ã†ã€‚ + +/// + +あãĒたぎすずãĻぎ**プロジェクトが䞝存しãĻいる**、**多数ぎ**äģ–ぎ**ãƒ‘ãƒƒã‚ąãƒŧジ**ãŒä¸Šč¨˜ãŽå•éĄŒã‚’æŠąãˆãĻã„ã‚‹ã¨æƒŗåƒã—ãĻãã ã•ã„ã€‚ã“ã‚Œã¯įŽĄį†ãŒéžå¸¸ãĢå›°é›Ŗã§ã™ã€‚ãã—ãĻ、**äē’æ›æ€§ãŽãĒいバãƒŧã‚¸ãƒ§ãƒŗ**ãŽãƒ‘ãƒƒã‚ąãƒŧジをäŊŋãŖãĻãƒ—ãƒ­ã‚¸ã‚§ã‚¯ãƒˆã‚’åŽŸčĄŒã—ã€ãĒぜ動äŊœã—ãĒいぎか分からãĒくãĒるでしょう。 + +ぞた、äŊŋį”¨ã—ãĻいるOSīŧˆLinux、Windows、macOS ãĒおīŧ‰ãĢã‚ˆãŖãĻは、PythonがすでãĢã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢされãĻã„ã‚‹ã“ã¨ãŒã‚ã‚Šãžã™ã€‚ã“ãŽå ´åˆã€į‰šåŽšãŽãƒãƒŧã‚¸ãƒ§ãƒŗãŽãƒ‘ãƒƒã‚ąãƒŧジが**OSぎ動äŊœãĢåŋ…čĻã§ã‚ã‚‹**ことがありぞす。グロãƒŧバãƒĢį’°åĸƒãĢãƒ‘ãƒƒã‚ąãƒŧã‚¸ã‚’ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢすると、OSãĢäģ˜åąžã™ã‚‹ãƒ—ログナムを**åŖŠã—ãĻしぞう**可čƒŊ性がありぞす。 + +## ãƒ‘ãƒƒã‚ąãƒŧã‚¸ãŽã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢ先 + +Pythonã‚’ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢã—ãŸã¨ãã€ãƒ•ã‚Ąã‚¤ãƒĢをåĢã‚“ã ã„ãã¤ã‹ãŽãƒ‡ã‚ŖãƒŦクトãƒĒがäŊœæˆã•れぞす。 + +これらぎ中ãĢã¯ã€ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢã•ã‚ŒãŸãƒ‘ãƒƒã‚ąãƒŧジをäŋå­˜ã™ã‚‹ãŸã‚ãŽã‚‚ぎもありぞす。 + +äģĨä¸‹ãŽã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã—ãŸã¨ãīŧš + +
+ +```console +// Don't run this now, it's just an example 🤓 +$ pip install "fastapi[standard]" +---> 100% +``` + +
+ +FastAPIãŽã‚ŗãƒŧドをåĢã‚€åœ§į¸Žãƒ•ã‚Ąã‚¤ãƒĢが、通常は [PyPI](https://pypi.org/project/fastapi/) からダã‚Ļãƒŗãƒ­ãƒŧドされぞす。 + +ぞた、FastAPIが䞝存するäģ–ãŽãƒ‘ãƒƒã‚ąãƒŧジも**ダã‚Ļãƒŗãƒ­ãƒŧド**されぞす。 + +ãã‚Œã‹ã‚‰ã€ã“ã‚Œã‚‰ãŽãƒ•ã‚Ąã‚¤ãƒĢは**č§Ŗå‡**ã•ã‚Œã€ã‚ŗãƒŗãƒ”ãƒĨãƒŧã‚ŋãŽã‚ã‚‹ãƒ‡ã‚ŖãƒŦクトãƒĒãĢ配įŊŽã•れぞす。 + +デフりãƒĢãƒˆã§ã¯ã€ã“ã‚Œã‚‰ãŽãƒ•ã‚Ąã‚¤ãƒĢはPythonãŽã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢ時ãĢäŊœæˆã•ã‚Œã‚‹ãƒ‡ã‚ŖãƒŦクトãƒĒ、つぞり**グロãƒŧバãƒĢį’°åĸƒ**ãĢ配įŊŽã•れぞす。 + +## äģŽæƒŗį’°åĸƒã¨ã¯ + +すずãĻãŽãƒ‘ãƒƒã‚ąãƒŧジをグロãƒŧバãƒĢį’°åĸƒãĢ配įŊŽã™ã‚‹ã“とãĢã‚ˆãŖãĻį”Ÿã˜ã‚‹å•éĄŒãŽč§Ŗæąēį­–ã¯ã€äŊœæĨ­ã™ã‚‹**プロジェクトごとぎäģŽæƒŗį’°åĸƒ**をäŊŋį”¨ã™ã‚‹ã“ã¨ã§ã™ã€‚ + +äģŽæƒŗį’°åĸƒã¯**ãƒ‡ã‚ŖãƒŦクトãƒĒ**であり、グロãƒŧバãƒĢį’°åĸƒã¨éžå¸¸ãĢäŧŧãĻいãĻ、一つぎプロジェクトでäŊŋã†į‰šåŽšãŽãƒ‘ãƒƒã‚ąãƒŧã‚¸įž¤ã‚’ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢできる場所です。 + +こぎようãĢしãĻ、それぞれぎプロジェクトがį‹Ŧč‡ĒぎäģŽæƒŗį’°åĸƒīŧˆ`.venv` ãƒ‡ã‚ŖãƒŦクトãƒĒīŧ‰ãĢį‹Ŧč‡ĒãŽãƒ‘ãƒƒã‚ąãƒŧã‚¸įž¤ã‚’æŒã¤ã“ã¨ãŒã§ããžã™ã€‚ + +```mermaid +flowchart TB + subgraph stone-project[philosophers-stone project] + stone(philosophers-stone) --->|requires| harry-1 + subgraph venv1[.venv] + harry-1[harry v1] + end + end + subgraph azkaban-project[prisoner-of-azkaban project] + azkaban(prisoner-of-azkaban) --->|requires| harry-3 + subgraph venv2[.venv] + harry-3[harry v3] + end + end + stone-project ~~~ azkaban-project +``` + +## äģŽæƒŗį’°åĸƒãŽæœ‰åŠšåŒ–ã¨ã¯ + +äģŽæƒŗį’°åĸƒã‚’有劚ãĢしたとき、䞋えばæŦĄãŽã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã—ãŸå ´åˆã‚’č€ƒãˆãžã™īŧš + +//// tab | Linux, macOS + +
+ +```console +$ source .venv/bin/activate +``` + +
+ +//// + +//// tab | Windows PowerShell + +
+ +```console +$ .venv\Scripts\Activate.ps1 +``` + +
+ +//// + +//// tab | Windows Bash + +あるいは、WindowsでBashをäŊŋį”¨ã—ãĻいる場合 (Git BashãĒお): + +
+ +```console +$ source .venv/Scripts/activate +``` + +
+ +//// + +これãĢã‚ˆãŖãĻ、いくつかぎ [į’°åĸƒå¤‰æ•°](environment-variables.md){.internal-link target=_blank} がäŊœæˆãƒģäŋŽæ­Ŗã•れ、æŦĄãĢåŽŸčĄŒã•ã‚Œã‚‹ã‚ŗãƒžãƒŗãƒ‰ã§äŊŋį”¨ã§ãã‚‹ã‚ˆã†ãĢãĒりぞす。 + +ã“ã‚Œã‚‰ãŽį’°åĸƒå¤‰æ•°ãŽã˛ã¨ã¤ãĢ、 `PATH` 変数がありぞす。 + +/// tip | 豆įŸĨ識 + +`PATH` 変数ãĢついãĻãŽčŠŗį´°ã¯ [į’°åĸƒå¤‰æ•°](environment-variables.md#pathį’°åĸƒå¤‰æ•°){.internal-link target=_blank} ã‚’å‚į…§ã—ãĻください。 + +/// + +äģŽæƒŗį’°åĸƒã‚’有劚ãĢすると、そぎäģŽæƒŗį’°åĸƒãŽãƒ‘゚ `.venv/bin` īŧˆLinuxとmacOSīŧ‰ã€ã‚るいは `.venv\Scripts` īŧˆWindowsīŧ‰ãŒ `PATH` 変数ãĢčŋŊ加されぞす。 + +ããŽį’°åĸƒã‚’有劚ãĢする前ぎ `PATH` 変数がæŦĄãŽã‚ˆã†ãĢãĒãŖãĻいるとしぞす。 + +//// tab | Linux, macOS + +```plaintext +/usr/bin:/bin:/usr/sbin:/sbin +``` + +これは、OSがäģĨä¸‹ãŽãƒ‡ã‚ŖãƒŦクトãƒĒ中でプログナムをæŽĸã™ã“ã¨ã‚’æ„å‘ŗã—ãžã™īŧš + +* `/usr/bin` +* `/bin` +* `/usr/sbin` +* `/sbin` + +//// + +//// tab | Windows + +```plaintext +C:\Windows\System32 +``` + +これは、OSがäģĨä¸‹ãŽãƒ‡ã‚ŖãƒŦクトãƒĒ中でプログナムをæŽĸã™ã“ã¨ã‚’æ„å‘ŗã—ãžã™īŧš + +* `C:\Windows\System32` + +//// + +äģŽæƒŗį’°åĸƒã‚’有劚ãĢすると、 `PATH` 変数はæŦĄãŽã‚ˆã†ãĢãĒりぞす。 + +//// tab | Linux, macOS + +```plaintext +/home/user/code/awesome-project/.venv/bin:/usr/bin:/bin:/usr/sbin:/sbin +``` + +これは、OSがäģ–ãŽãƒ‡ã‚ŖãƒŦクトãƒĒをæŽĸすより前ãĢ、最初ãĢäģĨä¸‹ãŽãƒ‡ã‚ŖãƒŦクトãƒĒ中でプログナムをæŽĸã—å§‹ã‚ã‚‹ã“ã¨ã‚’æ„å‘ŗã—ãžã™īŧš + +```plaintext +/home/user/code/awesome-project/.venv/bin +``` + +そぎため、ã‚ŋãƒŧミナãƒĢで `python` とå…Ĩ力した際ãĢ、OSはPythonプログナムをäģĨ下ぎパ゚でį™ēčĻ‹ã—ã€äŊŋį”¨ã—ãžã™ã€‚ + +```plaintext +/home/user/code/awesome-project/.venv/bin/python +``` + +//// + +//// tab | Windows + +```plaintext +C:\Users\user\code\awesome-project\.venv\Scripts;C:\Windows\System32 +``` + +これは、OSがäģ–ãŽãƒ‡ã‚ŖãƒŦクトãƒĒをæŽĸすより前ãĢ、最初ãĢäģĨä¸‹ãŽãƒ‡ã‚ŖãƒŦクトãƒĒ中でプログナムをæŽĸã—å§‹ã‚ã‚‹ã“ã¨ã‚’æ„å‘ŗã—ãžã™īŧš + +```plaintext +C:\Users\user\code\awesome-project\.venv\Scripts +``` + +そぎため、ã‚ŋãƒŧミナãƒĢで `python` とå…Ĩ力した際ãĢ、OSはPythonプログナムをäģĨ下ぎパ゚でį™ēčĻ‹ã—ã€äŊŋį”¨ã—ãžã™ã€‚ + +```plaintext +C:\Users\user\code\awesome-project\.venv\Scripts\python +``` + +//// + +重čρãĒį‚šã¯ã€äģŽæƒŗį’°åĸƒãŽãƒ‘゚を `PATH` 変数ぎ**先頭**ãĢ配įŊŽã™ã‚‹ã“とです。OSã¯åˆŠį”¨å¯čƒŊãĒäģ–ぎPythonをčĻ‹ã¤ã‘ã‚‹ã‚ˆã‚Š**前ãĢ**、こぎäģŽæƒŗį’°åĸƒãŽPythonをčĻ‹ã¤ã‘ã‚‹ã‚ˆã†ãĢãĒりぞす。こぎようãĢしãĻ、 `python` ã‚’åŽŸčĄŒã—ãŸã¨ããĢ、äģ–ぎ `python` īŧˆäž‹ãˆã°ã‚°ãƒ­ãƒŧバãƒĢį’°åĸƒãŽ `python` īŧ‰ã§ã¯ãĒく、**そぎäģŽæƒŗį’°åĸƒãŽ**PythonをäŊŋį”¨ã™ã‚‹ã‚ˆã†ãĢãĒりぞす。 + +äģŽæƒŗį’°åĸƒã‚’有劚ãĢしãĻ変更されることはäģ–ãĢもありぞすが、これが最も重čρãĒå¤‰æ›´ãŽã˛ã¨ã¤ã§ã™ã€‚ + +## äģŽæƒŗį’°åĸƒãŽįĸēčĒ + +äģŽæƒŗį’°åĸƒãŒæœ‰åŠšã‹ãŠã†ã‹ã€äž‹ãˆã°æŦĄãŽã‚ˆã†ãĢįĸēčĒã§ããžã™ã€‚īŧš + +//// tab | Linux, macOS, Windows Bash + +
+ +```console +$ which python + +/home/user/code/awesome-project/.venv/bin/python +``` + +
+ +//// + +//// tab | Windows PowerShell + +
+ +```console +$ Get-Command python + +C:\Users\user\code\awesome-project\.venv\Scripts\python +``` + +
+ +//// + +これは、äŊŋį”¨ã•ã‚Œã‚‹ `python` プログナムが**そぎäģŽæƒŗį’°åĸƒãŽ**ã‚‚ãŽã§ã‚ã‚‹ã“ã¨ã‚’æ„å‘ŗã—ãžã™ã€‚ + +LinuxやmacOSでは `which` を、Windows PowerShellでは `Get-Command` をäŊŋį”¨ã—ãžã™ã€‚ + +ã“ãŽã‚ŗãƒžãƒŗãƒ‰ãŽå‹•äŊœã¯ã€ `PATH`変数ãĢč¨­åŽšã•ã‚ŒãŸ**それぞれぎパ゚を順ãĢ**įĸēčĒã—ãĻいき、å‘ŧばれãĻいる `python` プログナムをæŽĸしぞす。そしãĻ、čĻ‹ã¤ã‹ã‚ŠæŦĄįŦŦそぎプログナムへぎ**ãƒ‘ã‚šã‚’čĄ¨į¤ēしぞす**。 + +最も重čρãĒことは、 `python` がå‘ŧばれたときãĢ、ぞさãĢã“ãŽã‚ŗãƒžãƒŗãƒ‰ã§įĸēčĒã—ãŸ "`python`" ãŒåŽŸčĄŒã•ã‚Œã‚‹ã“ã¨ã§ã™ã€‚ + +こうしãĻ、č‡Ēåˆ†ãŒæƒŗåŽšé€šã‚ŠãŽäģŽæƒŗį’°åĸƒãĢいるかをįĸēčĒã§ããžã™ã€‚ + +/// tip | 豆įŸĨ識 + +あるäģŽæƒŗį’°åĸƒã‚’有劚ãĢし、そぎPythonをäŊŋį”¨ã—ãŸãžãž**äģ–ぎプロジェクトãĢį§ģ動しãĻ**ã—ãžã†ã“ã¨ã¯į°Ąå˜ãĢčĩˇã“り垗ぞす。 + +そしãĻ、そぎįŦŦäēŒãŽãƒ—ロジェクトは動äŊœã—ãĒいでしょう。ãĒぜãĒらåˆĨぎプロジェクトぎäģŽæƒŗį’°åĸƒãŽ**čĒ¤ãŖãŸPython**をäŊŋį”¨ã—ãĻいるからです。 + +そぎため、おぎ `python` がäŊŋį”¨ã•ã‚ŒãĻいるぎかįĸēčĒã§ãã‚‹ã“ã¨ã¯åŊšįĢ‹ãĄãžã™ã€‚đŸ¤“ + +/// + +## ãĒぜäģŽæƒŗį’°åĸƒã‚’į„ĄåŠšåŒ–ã™ã‚‹ãŽã‹ + +䞋えば、`philosophers-stone` īŧˆčŗĸč€…ãŽįŸŗīŧ‰ã¨ã„うプロジェクトでäŊœæĨ­ã‚’しãĻいãĻ、**そぎäģŽæƒŗį’°åĸƒã‚’有劚ãĢし**、åŋ…čρãĒãƒ‘ãƒƒã‚ąãƒŧã‚¸ã‚’ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢしãĻããŽį’°åĸƒå†…でäŊœæĨ­ã‚’é€˛ã‚ãĻいるとしぞす。 + +それから、**åˆĨぎプロジェクト**、 `prisoner-of-azkaban` īŧˆã‚ĸã‚ēã‚ĢãƒãƒŗãŽå›šäēēīŧ‰ãĢ取り掛かろうとしぞす。 + +ããŽãƒ—ãƒ­ã‚¸ã‚§ã‚¯ãƒˆãƒ‡ã‚ŖãƒŦクトãƒĒへį§ģ動しぞすīŧš + +
+ +```console +$ cd ~/code/prisoner-of-azkaban +``` + +
+ +もし `philosophers-stone` īŧˆčŗĸč€…ãŽįŸŗīŧ‰ãŽäģŽæƒŗį’°åĸƒã‚’į„ĄåŠšåŒ–ã—ãĻいãĒいと、`python` ã‚’åŽŸčĄŒã—ãŸã¨ãã€ ã‚ŋãƒŧミナãƒĢは `philosophers-stone` īŧˆčŗĸč€…ãŽįŸŗīŧ‰ãŽPythonをäŊŋį”¨ã—ã‚ˆã†ã¨ã—ãžã™ã€‚ + +
+ +```console +$ cd ~/code/prisoner-of-azkaban + +$ python main.py + +// Error importing sirius, it's not installed 😱 +Traceback (most recent call last): + File "main.py", line 1, in + import sirius +``` + +
+ +しかし、そぎäģŽæƒŗį’°åĸƒã‚’į„ĄåŠšåŒ–ã—ã€ `prisoner-of-azkaban` īŧˆã‚ĸã‚ēã‚ĢãƒãƒŗãŽå›šäēēīŧ‰ãŽãŸã‚ãŽæ–°ã—いäģŽæƒŗį’°åĸƒã‚’有劚ãĢすれば、 `python` ã‚’åŽŸčĄŒã—ãŸã¨ããĢ `prisoner-of-azkaban` īŧˆã‚ĸã‚ēã‚ĢãƒãƒŗãŽå›šäēēīŧ‰ãŽäģŽæƒŗį’°åĸƒãŽ Python がäŊŋį”¨ã•ã‚Œã‚‹ã‚ˆã†ãĢãĒりぞす。 + +
+ +```console +$ cd ~/code/prisoner-of-azkaban + +// You don't need to be in the old directory to deactivate, you can do it wherever you are, even after going to the other project 😎 +$ deactivate + +// Activate the virtual environment in prisoner-of-azkaban/.venv 🚀 +$ source .venv/bin/activate + +// Now when you run python, it will find the package sirius installed in this virtual environment ✨ +$ python main.py + +I solemnly swear đŸē +``` + +
+ +## äģŖæ›ŋ手æŽĩ + +これは、あらゆるäģ•įĩ„ãŋを**æ šæœŦから**å­ĻãļãŸã‚ãŽã‚ˇãƒŗãƒ—ãƒĢãĒå…Ĩ門ã‚Ŧイドです。 + +äģŽæƒŗį’°åĸƒã€ãƒ‘ãƒƒã‚ąãƒŧジぎ䞝存é–ĸäŋ‚īŧˆrequirementsīŧ‰ã€ãƒ—ãƒ­ã‚¸ã‚§ã‚¯ãƒˆãŽįŽĄį†ãĢは、多くぎ**äģŖæ›ŋ手æŽĩ**がありぞす。 + +æē–å‚™ãŒæ•´ã„ã€ãƒ‘ãƒƒã‚ąãƒŧジぎ䞝存é–ĸäŋ‚、äģŽæƒŗį’°åĸƒãĒお**プロジェクト全äŊ“ãŽįŽĄį†**ツãƒŧãƒĢをäŊŋã„ãŸã„ã¨č€ƒãˆãŸã‚‰ã€uv をčŠĻしãĻãŋることをおすすめしぞす。 + +`uv` ではäģĨ下ぎようãĒ多くぎことができぞすīŧš + +* į•°ãĒるバãƒŧã‚¸ãƒ§ãƒŗã‚‚åĢめた**Python ãŽã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢ** +* プロジェクトごとぎ**äģŽæƒŗį’°åĸƒ**ãŽįŽĄį† +* **ãƒ‘ãƒƒã‚ąãƒŧジ**ãŽã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢ +* ãƒ—ãƒ­ã‚¸ã‚§ã‚¯ãƒˆãŽãƒ‘ãƒƒã‚ąãƒŧジぎ**䞝存é–ĸäŋ‚やバãƒŧã‚¸ãƒ§ãƒŗ**ãŽįŽĄį† +* ãƒ‘ãƒƒã‚ąãƒŧジとそぎバãƒŧã‚¸ãƒ§ãƒŗãŽã€äžå­˜é–ĸäŋ‚ã‚’åĢめた**åŽŗå¯†ãĒ**įĩ„ãŋ合わせをäŋæŒã—、これãĢã‚ˆãŖãĻ、æœŦį•Ēį’°åĸƒã§ã€é–‹į™ēį’°åĸƒã¨å…¨ãåŒã˜ã‚ˆã†ãĢãƒ—ãƒ­ã‚¸ã‚§ã‚¯ãƒˆã‚’åŽŸčĄŒã§ãã‚‹īŧˆã“れは**locking**とå‘ŧばれぞすīŧ‰ +* そぎäģ–ぎさぞざぞãĒ抟čƒŊ + +## ぞとめ + +ここぞでčĒ­ãŋすずãĻį†č§Ŗã—ãŸãĒら、世間ぎ多くぎ開į™ēč€…ã¨æ¯”ãšãĻ、äģŽæƒŗį’°åĸƒãĢついãĻ**あãĒたはより多くぎことをįŸĨãŖãĻいぞす**ã€‚đŸ¤“ + +ã“ã‚Œã‚‰ãŽčŠŗį´°ã‚’įŸĨることは、将æĨã€č¤‡é›‘ãĢčĻ‹ãˆã‚‹äŊ•かぎデバッグãĢããŖã¨åŊšįĢ‹ã¤ã§ã—ã‚‡ã†ã€‚ã—ã‹ã—ã€ããŽé ƒãĢは、あãĒたは**そぎすずãĻぎ動äŊœã‚’æ šæœŦから**į†č§Ŗã—ãĻã„ã‚‹ã§ã—ã‚‡ã†ã€‚đŸ˜Ž diff --git a/docs/ko/docs/advanced/events.md b/docs/ko/docs/advanced/events.md index ae349e7be..5f8fe0f1e 100644 --- a/docs/ko/docs/advanced/events.md +++ b/docs/ko/docs/advanced/events.md @@ -1,53 +1,165 @@ -# ė´ë˛¤íŠ¸: startupęŗŧ shutdown +# Lifespan ė´ë˛¤íŠ¸ -í•„ėš”ė— 따ëŧ ė‘ėšŠ í”„ëĄœęˇ¸ëž¨ė´ ė‹œėž‘ë˜ę¸° ė „ė´ë‚˜ ėĸ…ëŖŒë  때 ė‹¤í–‰ë˜ëŠ” ė´ë˛¤íŠ¸ 핸들ëŸŦ(í•¨ėˆ˜)ëĨŧ ė •ė˜í•  눘 ėžˆėŠĩ니다. +ė• í”ŒëĻŦėŧ€ė´ė…˜ **ė‹œėž‘ ė „**뗐 ė‹¤í–‰ë˜ė–´ė•ŧ 하는 ëĄœė§(ėŊ”드)ė„ ė •ė˜í•  눘 ėžˆėŠĩ니다. ė´ëŠ” ė´ ėŊ”ë“œę°€ **한 번**만 ė‹¤í–‰ë˜ëŠ°, **ė• í”ŒëĻŦėŧ€ė´ė…˜ė´ ėš”ė˛­ė„ 받기 ė‹œėž‘í•˜ę¸° ė „**뗐 ė‹¤í–‰ëœë‹¤ëŠ” ė˜ë¯¸ėž…ë‹ˆë‹¤. -ė´ í•¨ėˆ˜ë“¤ė€ `async def` 또는 평범하게 `def`ėœŧ로 ė„ ė–¸í•  눘 ėžˆėŠĩ니다. +마ė°Ŧę°€ė§€ëĄœ, ė• í”ŒëĻŦėŧ€ė´ė…˜ė´ **ėĸ…ëŖŒë  때** ė‹¤í–‰ë˜ė–´ė•ŧ 하는 ëĄœė§(ėŊ”드)ė„ ė •ė˜í•  눘 ėžˆėŠĩ니다. ė´ ę˛Ŋ뚰, ė´ ėŊ”드는 **한 번**만 ė‹¤í–‰ë˜ëŠ°, **ė—ŦëŸŦ ėš”ė˛­ė„ 래ëĻŦ한 후**뗐 ė‹¤í–‰ëŠë‹ˆë‹¤. + +ė´ ėŊ”ë“œę°€ ė• í”ŒëĻŦėŧ€ė´ė…˜ė´ **ėš”ė˛­ė„ 받기 ė‹œėž‘í•˜ę¸° 렄뗐** ė‹¤í–‰ë˜ęŗ , ėš”ė˛­ 래ëĻŦ가 끝난 후 **ėĸ…ëŖŒ 링렄뗐** ė‹¤í–‰ë˜ę¸° 때ëŦ¸ė— 렄랴 ė• í”ŒëĻŦėŧ€ė´ė…˜ė˜ **눘ëĒ…(Lifespan)**ė„ ë‹¤ëŖšë‹ˆë‹¤. (ėž ė‹œ 후 "눘ëĒ…"ė´ëŧ는 ë‹¨ė–´ę°€ ė¤‘ėš”í•´ė§‘ë‹ˆë‹¤ 😉) + +ė´ ë°Šë˛•ė€ 렄랴 ė• í”ŒëĻŦėŧ€ė´ė…˜ė—ė„œ ė‚ŦėšŠí•´ė•ŧ 하는 **ėžė›**ė„ ė„¤ė •í•˜ęą°ë‚˜ ėš”ė˛­ 氄뗐 **ęŗĩėœ ë˜ëŠ”** ėžė›ė„ ė„¤ė •í•˜ęŗ , 또는 ꡸ í›„ė— **ė •ëĻŦ**하는 데 ë§¤ėš° ėœ ėšŠí•  눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´, ë°ė´í„°ë˛ ė´ėŠ¤ 뗰枰 풀 또는 ęŗĩėœ ë˜ëŠ” ë¨¸ė‹ ëŸŦ닝 ëĒ¨ë¸ė„ 로드하는 ę˛Ŋėš°ėž…ë‹ˆë‹¤. + + +## ė‚ŦėšŠ ė‚Ŧ례 + +ë¨ŧė € **ė‚ŦėšŠ ė‚Ŧ례**ëĨŧ ė˜ˆëĄœ ë“¤ė–´ëŗ´ęŗ , ė´ëĨŧ ė–´ë–ģ枌 해결할 눘 ėžˆëŠ”ė§€ ė‚´íŽ´ëŗ´ę˛ ėŠĩ니다. + +뚰ëĻŦ가 ėš”ė˛­ė„ 래ëĻŦ하기 ėœ„í•´ ė‚ŦėšŠí•˜ęŗ  ė‹ļė€ **ë¨¸ė‹ ëŸŦ닝 ëĒ¨ë¸**ė´ ėžˆë‹¤ęŗ  ėƒėƒí•´ ë´…ė‹œë‹¤. 🤖 + +ė´ ëĒ¨ë¸ë“¤ė€ ėš”ė˛­ 氄뗐 ęŗĩėœ ë˜ë¯€ëĄœ, ėš”ė˛­ë§ˆë‹¤ ëĒ¨ë¸ė´ í•˜ë‚˜ė”Š ėžˆëŠ” ę˛ƒė´ ė•„ë‹ˆëŧ, ė—ŦëŸŦ ėš”ė˛­ė—ė„œ 동ėŧ한 ëĒ¨ë¸ė„ ė‚ŦėšŠí•Šë‹ˆë‹¤. + +ëĒ¨ë¸ė„ 로드하는 데 **ėƒë‹ší•œ ė‹œę°„ė´ 깸ëĻ°ë‹¤ęŗ  ėƒėƒí•´ ë´…ė‹œë‹¤**, ė™œëƒí•˜ëŠ´ ëĒ¨ë¸ė´ **ë””ėŠ¤íŦė—ė„œ ë§Žė€ ë°ė´í„°ëĨŧ ėŊė–´ė•ŧ** 하기 때ëŦ¸ėž…니다. 따ëŧė„œ ëĒ¨ë“  ėš”ė˛­ė— 대해 ëĒ¨ë¸ė„ 매번 ëĄœë“œí•˜ęŗ  ė‹ļė§€ ė•ŠėŠĩ니다. + +ëĒ¨ë“ˆ/파ėŧė˜ ėĩœėƒėœ„ė—ė„œ ëĒ¨ë¸ė„ 로드할 ėˆ˜ë„ ėžˆė§€ë§Œ, ꡸ëŸŦ늴 **ëĒ¨ë¸ė„ 로드하는데** ė‹œę°„ė´ 깸ëĻŦ기 때ëŦ¸ė—, ë‹¨ėˆœí•œ ėžë™í™”ëœ í…ŒėŠ¤íŠ¸ëĨŧ ė‹¤í–‰í•  때도 ëĒ¨ë¸ė´ 로드될 ë•ŒęšŒė§€ 기다려ė•ŧ í•´ė„œ **í…ŒėŠ¤íŠ¸ ė†ë„ę°€ ëŠë ¤ė§‘ë‹ˆë‹¤**. + +ė´ ëŦ¸ė œëĨŧ í•´ę˛°í•˜ë ¤ęŗ  하는 ę˛ƒėž…ë‹ˆë‹¤. ėš”ė˛­ė„ 래ëĻŦ하기 렄뗐 ëĒ¨ë¸ė„ 로드하되, ė• í”ŒëĻŦėŧ€ė´ė…˜ė´ ėš”ė˛­ė„ 받기 ė‹œėž‘í•˜ę¸° ė§ė „ė—ë§Œ ëĄœë“œí•˜ęŗ , ėŊ”ë“œę°€ 로드되는 ë™ė•ˆė€ ëĄœë“œí•˜ė§€ ė•Šë„ëĄ 하겠ėŠĩ니다. + +## Lifespan + +`FastAPI` ė• í”ŒëĻŦėŧ€ė´ė…˜ė˜ `lifespan` ë§¤ę°œëŗ€ėˆ˜ė™€ "ėģ¨í…ėŠ¤íŠ¸ ë§¤ë‹ˆė €"ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ *ė‹œėž‘*ęŗŧ *ėĸ…ëŖŒ* ëĄœė§ė„ ė •ė˜í•  눘 ėžˆėŠĩ니다. (ėģ¨í…ėŠ¤íŠ¸ ë§¤ë‹ˆė €ę°€ ëŦ´ė—‡ė¸ė§€ ėž ė‹œ í›„ė— 네ëĒ…ë“œëĻŦ겠ėŠĩ니다.) + +똈렜ëĨŧ í†ĩ해 ė‹œėž‘í•˜ęŗ , ꡸ í›„ė— ėžė„¸ížˆ ė‚´íŽ´ëŗ´ę˛ ėŠĩ니다. + +뚰ëĻŦ는 `yield`ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ 비동기 í•¨ėˆ˜ `lifespan()`ė„ ë‹¤ėŒęŗŧ ę°™ė´ ėƒė„ąí•Šë‹ˆë‹¤: + +{* ../../docs_src/events/tutorial003.py hl[16,19] *} + +ė—Ŧę¸°ė„œ 뚰ëĻŦ는 ëĒ¨ë¸ė„ 로드하는 비ė‹ŧ *ė‹œėž‘* ėž‘ė—…ė„ ė‹œëŽŦë ˆė´ė…˜í•˜ęŗ  ėžˆėŠĩ니다. `yield` ė•žė—ė„œ (ę°€ė§œ) ëĒ¨ë¸ í•¨ėˆ˜ëĨŧ ë¨¸ė‹ ëŸŦ닝 ëĒ¨ë¸ė´ 담긴 ë”•ė…”ë„ˆëĻŦ뗐 ë„ŖėŠĩ니다. ė´ ėŊ”드는 **ė• í”ŒëĻŦėŧ€ė´ė…˜ė´ ėš”ė˛­ė„ 받기 ė‹œėž‘í•˜ę¸° ė „**, *ė‹œėž‘* ë™ė•ˆė— ė‹¤í–‰ëŠë‹ˆë‹¤. + +꡸ëĻŦęŗ  `yield` ė§í›„ė—ëŠ” ëĒ¨ë¸ė„ ė–¸ëĄœë“œí•Šë‹ˆë‹¤. ė´ ėŊ”드는 **ė• í”ŒëĻŦėŧ€ė´ė…˜ė´ ėš”ė˛­ 래ëĻŦ ė™„ëŖŒ 후**, *ėĸ…ëŖŒ* 링렄뗐 ė‹¤í–‰ëŠë‹ˆë‹¤. 똈ëĨŧ ë“¤ė–´, 메ëǍëĻŦ나 GPU뙀 ę°™ė€ ėžė›ė„ í•´ė œí•˜ëŠ” ėž‘ė—…ė„ 할 눘 ėžˆėŠĩ니다. + +/// tip | 팁 + +`shutdown`ė€ ė• í”ŒëĻŦėŧ€ė´ė…˜ė„ **ėĸ…ëŖŒ**할 때 ë°œėƒí•Šë‹ˆë‹¤. + +ėƒˆëĄœėš´ ë˛„ė „ė„ ė‹œėž‘í•´ė•ŧ 하거나, ꡸ëƒĨ ė‹¤í–‰ė„ 늈ėļ”ęŗ  ė‹ļė„ ėˆ˜ë„ ėžˆėŠĩ니다. 🤷 + +/// + +### Lifespan í•¨ėˆ˜ + +ë¨ŧė € ėŖŧëĒŠí•  ė ė€, `yield`ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ 비동기 í•¨ėˆ˜(async function)ëĨŧ ė •ė˜í•˜ęŗ  ėžˆë‹¤ëŠ” ę˛ƒėž…ë‹ˆë‹¤. ė´ëŠ” `yield`ëĨŧ ė‚ŦėšŠí•œ ė˜ėĄ´ė„ąęŗŧ ë§¤ėš° 뜠ė‚Ŧ합니다. + +{* ../../docs_src/events/tutorial003.py hl[14:19] *} + +í•¨ėˆ˜ė˜ ė˛Ģ ë˛ˆė§¸ ëļ€ëļ„, ėω `yield` ė´ė „ė˜ ėŊ”드는 ė• í”ŒëĻŦėŧ€ė´ė…˜ė´ ė‹œėž‘ë˜ę¸° **렄뗐** ė‹¤í–‰ëŠë‹ˆë‹¤. + +꡸ëĻŦęŗ  `yield` ė´í›„ė˜ ëļ€ëļ„ė€ ė• í”ŒëĻŦėŧ€ė´ė…˜ė´ ė™„ëŖŒëœ 후 **ë‚˜ė¤‘ė—** ė‹¤í–‰ëŠë‹ˆë‹¤. + +### 비동기 ėģ¨í…ėŠ¤íŠ¸ ë§¤ë‹ˆė € + +í•¨ėˆ˜ëĨŧ í™•ė¸í•´ëŗ´ëŠ´, `@asynccontextmanager`로 ėžĨė‹ë˜ė–´ ėžˆėŠĩ니다. + +ė´ę˛ƒė€ í•¨ėˆ˜ëĨŧ "**비동기 ėģ¨í…ėŠ¤íŠ¸ ë§¤ë‹ˆė €**"ëŧęŗ  ëļˆëĻŦ는 것ėœŧ로 ëŗ€í™˜ė‹œí‚ĩ니다. + +{* ../../docs_src/events/tutorial003.py hl[1,13] *} + +íŒŒė´ėŦė—ė„œ **ėģ¨í…ėŠ¤íŠ¸ ë§¤ë‹ˆė €**는 `with` ëŦ¸ė—ė„œ ė‚ŦėšŠí•  눘 ėžˆëŠ” ę˛ƒėž…ë‹ˆë‹¤. 똈ëĨŧ ë“¤ė–´, `open()`ė€ ėģ¨í…ėŠ¤íŠ¸ ë§¤ë‹ˆė €ëĄœ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다: + +```Python +with open("file.txt") as file: + file.read() +``` +ėĩœęˇŧ ë˛„ė „ė˜ íŒŒė´ėŦė—ė„œëŠ” **비동기 ėģ¨í…ėŠ¤íŠ¸ ë§¤ë‹ˆė €**도 ėžˆėŠĩ니다. ė´ëĨŧ `async with`뙀 함ęģ˜ ė‚ŦėšŠí•Šë‹ˆë‹¤: + +```Python +async with lifespan(app): + await do_stuff() +``` + +ėģ¨í…ėŠ¤íŠ¸ ë§¤ë‹ˆė €ë‚˜ ėœ„ė™€ ę°™ė€ 비동기 ėģ¨í…ėŠ¤íŠ¸ ë§¤ë‹ˆė €ëĨŧ 만들면, `with` ë¸”ëĄė— ë“¤ė–´ę°€ę¸° 렄뗐 `yield` ė´ė „ė˜ ėŊ”ë“œę°€ ė‹¤í–‰ë˜ęŗ , `with` ë¸”ëĄė„ ë˛—ė–´ë‚œ í›„ė—ëŠ” `yield` ė´í›„ė˜ ėŊ”ë“œę°€ ė‹¤í–‰ëŠë‹ˆë‹¤. + +ėœ„ė˜ ėŊ”드 ė˜ˆė œė—ė„œëŠ” 링렑 ė‚ŦėšŠí•˜ė§€ ė•Šęŗ , FastAPI뗐 ė „ë‹Ŧ하ė—Ŧ ė‚ŦėšŠí•˜ë„ëĄ 합니다. + +`FastAPI` ė• í”ŒëĻŦėŧ€ė´ė…˜ė˜ `lifespan` ë§¤ę°œëŗ€ėˆ˜ëŠ” **비동기 ėģ¨í…ėŠ¤íŠ¸ ë§¤ë‹ˆė €**ëĨŧ 받기 때ëŦ¸ė—, ėƒˆëĄœėš´ `lifespan` 비동기 ėģ¨í…ėŠ¤íŠ¸ ë§¤ë‹ˆė €ëĨŧ FastAPI뗐 ė „ë‹Ŧ할 눘 ėžˆėŠĩ니다. + +{* ../../docs_src/events/tutorial003.py hl[22] *} + +## ëŒ€ė˛´ ė´ë˛¤íŠ¸ (ė‚ŦėšŠ ė¤‘ë‹¨) /// warning | ę˛Ŋęŗ  -ė´ë˛¤íŠ¸ 핸들ëŸŦ는 ėŖŧ ė‘ėšŠ í”„ëĄœęˇ¸ëž¨ė—ė„œë§Œ ėž‘ë™í•Šë‹ˆë‹¤. [í•˜ėœ„ ė‘ėšŠ 프로그램 - ë§ˆėš´íŠ¸](./sub-applications.md){.internal-link target=_blank}ė—ė„œëŠ” ėž‘ë™í•˜ė§€ ė•ŠėŠĩ니다. +*ė‹œėž‘*ęŗŧ *ėĸ…ëŖŒ*ëĨŧ 래ëĻŦ하는 ęļŒėžĨ ë°Šë˛•ė€ ėœ„ė—ė„œ 네ëĒ…í•œ 대로 `FastAPI` ė• í”ŒëĻŦėŧ€ė´ė…˜ė˜ `lifespan` ë§¤ę°œëŗ€ėˆ˜ëĨŧ ė‚ŦėšŠí•˜ëŠ” ę˛ƒėž…ë‹ˆë‹¤. `lifespan` ë§¤ę°œëŗ€ėˆ˜ëĨŧ 렜ęŗĩ하면 `startup`ęŗŧ `shutdown` ė´ë˛¤íŠ¸ 핸들ëŸŦ는 더 ė´ėƒ 호ėļœë˜ė§€ ė•ŠėŠĩ니다. `lifespan`ė„ ė‚ŦėšŠí• ė§€, ëĒ¨ë“  ė´ë˛¤íŠ¸ëĨŧ ė‚ŦėšŠí• ė§€ ė„ íƒí•´ė•ŧ 하며 둘 다 ė‚ŦėšŠí•  ėˆ˜ëŠ” ė—†ėŠĩ니다. + +ė´ ëļ€ëļ„ė€ ęą´ë„ˆë›°ė…”ë„ ėĸ‹ėŠĩ니다. /// -## `startup` ė´ë˛¤íŠ¸ +*ė‹œėž‘*ęŗŧ *ėĸ…ëŖŒ* ë™ė•ˆ ė‹¤í–‰ë  ė´ ëĄœė§ė„ ė •ė˜í•˜ëŠ” ëŒ€ė˛´ ë°Šë˛•ė´ ėžˆėŠĩ니다. + +ė• í”ŒëĻŦėŧ€ė´ė…˜ė´ ė‹œėž‘ë˜ę¸° 렄뗐 또는 ėĸ…ëŖŒë  때 ė‹¤í–‰í•´ė•ŧ 하는 ė´ë˛¤íŠ¸ 핸들ëŸŦ(í•¨ėˆ˜)ëĨŧ ė •ė˜í•  눘 ėžˆėŠĩ니다. -ė‘ėšŠ í”„ëĄœęˇ¸ëž¨ė„ ė‹œėž‘í•˜ę¸° 렄뗐 ė‹¤í–‰í•˜ë ¤ëŠ” í•¨ėˆ˜ëĨŧ "startup" ė´ë˛¤íŠ¸ëĄœ ė„ ė–¸í•Šë‹ˆë‹¤: +ė´ í•¨ėˆ˜ë“¤ė€ `async def` 또는 ėŧ반 `def`로 ė„ ė–¸í•  눘 ėžˆėŠĩ니다. + +### `startup` ė´ë˛¤íŠ¸ + +ė• í”ŒëĻŦėŧ€ė´ė…˜ė´ ė‹œėž‘ë˜ę¸° 렄뗐 ė‹¤í–‰ë˜ė–´ė•ŧ 하는 í•¨ėˆ˜ëĨŧ ėļ”ę°€í•˜ë ¤ëŠ´, `"startup"` ė´ë˛¤íŠ¸ëĄœ ė„ ė–¸í•Šë‹ˆë‹¤: {* ../../docs_src/events/tutorial001.py hl[8] *} -ė´ ę˛Ŋ뚰 `startup` ė´ë˛¤íŠ¸ 핸들ëŸŦ í•¨ėˆ˜ëŠ” ë‹¨ėˆœížˆ ëLJ 氀맀 값ėœŧ로 ęĩŦė„ąëœ `dict` í˜•ė‹ė˜ "ë°ė´í„°ë˛ ė´ėŠ¤"ëĨŧ ė´ˆę¸°í™”í•Šë‹ˆë‹¤. +ė´ ę˛Ŋ뚰, `startup` ė´ë˛¤íŠ¸ 핸들ëŸŦ í•¨ėˆ˜ëŠ” "database"ëŧ는 항ëĒŠ(ë‹¨ė§€ `dict`)ė„ ėŧëļ€ ę°’ėœŧ로 ė´ˆę¸°í™”í•Šë‹ˆë‹¤. -하나 ė´ėƒė˜ ė´ë˛¤íŠ¸ 핸들ëŸŦ í•¨ėˆ˜ëĨŧ ėļ”가할 ėˆ˜ë„ ėžˆėŠĩ니다. +ė—ŦëŸŦ ę°œė˜ ė´ë˛¤íŠ¸ 핸들ëŸŦ í•¨ėˆ˜ëĨŧ ėļ”가할 눘 ėžˆėŠĩ니다. -꡸ëĻŦęŗ  ė‘ėšŠ í”„ëĄœęˇ¸ëž¨ė€ ëĒ¨ë“  `startup` ė´ë˛¤íŠ¸ 핸들ëŸŦ가 ė™„ëŖŒë  ë•ŒęšŒė§€ ėš”ė˛­ė„ ë°›ė§€ ė•ŠėŠĩ니다. +ė• í”ŒëĻŦėŧ€ė´ė…˜ė€ ëĒ¨ë“  `startup` ė´ë˛¤íŠ¸ 핸들ëŸŦ가 ė™„ëŖŒë  ë•ŒęšŒė§€ ėš”ė˛­ė„ 받기 ė‹œėž‘í•˜ė§€ ė•ŠėŠĩ니다. -## `shutdown` ė´ë˛¤íŠ¸ +### `shutdown` ė´ë˛¤íŠ¸ -ė‘ėšŠ í”„ëĄœęˇ¸ëž¨ė´ ėĸ…ëŖŒë  때 ė‹¤í–‰í•˜ë ¤ëŠ” í•¨ėˆ˜ëĨŧ ėļ”ę°€í•˜ë ¤ëŠ´ `"shutdown"` ė´ë˛¤íŠ¸ëĄœ ė„ ė–¸í•Šë‹ˆë‹¤: +ė• í”ŒëĻŦėŧ€ė´ė…˜ė´ ėĸ…ëŖŒë  때 ė‹¤í–‰ë˜ė–´ė•ŧ 하는 í•¨ėˆ˜ëĨŧ ėļ”ę°€í•˜ë ¤ëŠ´, `"shutdown"` ė´ë˛¤íŠ¸ëĄœ ė„ ė–¸í•Šë‹ˆë‹¤: {* ../../docs_src/events/tutorial002.py hl[6] *} -ė´ ė˜ˆė œė—ė„œ `shutdown` ė´ë˛¤íŠ¸ 핸들ëŸŦ í•¨ėˆ˜ëŠ” `"Application shutdown"`ė´ëŧ는 í…ėŠ¤íŠ¸ę°€ ė ížŒ `log.txt` 파ėŧė„ ėļ”가할 ę˛ƒėž…ë‹ˆë‹¤. +ė—Ŧę¸°ė„œ, `shutdown` ė´ë˛¤íŠ¸ 핸들ëŸŦ í•¨ėˆ˜ëŠ” `"Application shutdown"`ė´ëŧ는 í…ėŠ¤íŠ¸ëĨŧ `log.txt` 파ėŧ뗐 기록합니다. /// info | ė •ëŗ´ -`open()` í•¨ėˆ˜ė—ė„œ `mode="a"`는 "ėļ”ę°€"ëĨŧ ė˜ë¯¸í•Šë‹ˆë‹¤. 따ëŧė„œ ė´ë¯¸ ėĄ´ėžŦ하는 파ėŧė˜ ë‚´ėšŠė„ ëŽė–´ė“°ė§€ ė•Šęŗ  ėƒˆëĄœėš´ ė¤„ė„ ėļ”ę°€í•Šë‹ˆë‹¤. +`open()` í•¨ėˆ˜ė—ė„œ `mode="a"`는 "ėļ”ę°€"ëĨŧ ė˜ë¯¸í•˜ë¯€ëĄœ, 파ėŧ뗐 ėžˆëŠ” ę¸°ėĄ´ ë‚´ėšŠė€ ëŽė–´ė“°ė§€ ė•Šęŗ  ėƒˆëĄœėš´ ė¤„ė´ ėļ”ę°€ëŠë‹ˆë‹¤. /// /// tip | 팁 -ė´ ė˜ˆė œė—ė„œëŠ” 파ėŧęŗŧ ėƒí˜¸ėž‘ėšŠ 하기 ėœ„í•´ íŒŒė´ėŦ í‘œė¤€ í•¨ėˆ˜ė¸ `open()`ė„ ė‚ŦėšŠí•˜ęŗ  ėžˆėŠĩ니다. +ė´ ę˛Ŋ뚰, 뚰ëĻŦ는 í‘œė¤€ íŒŒė´ėŦ `open()` í•¨ėˆ˜ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ 파ėŧęŗŧ ėƒí˜¸ėž‘ėšŠí•˜ęŗ  ėžˆėŠĩ니다. -따ëŧė„œ ë””ėŠ¤íŦ뗐 ë°ė´í„°ëĨŧ 듰揰 ėœ„í•´ "대기"가 í•„ėš”í•œ I/O (ėž…ë Ĩ/ėļœë Ĩ) ėž‘ė—…ė„ ėˆ˜í–‰í•Šë‹ˆë‹¤. +따ëŧė„œ I/O(ėž…ėļœë Ĩ) ėž‘ė—…ė´ íŦí•¨ë˜ė–´ ėžˆė–´ ë””ėŠ¤íŦ뗐 기록되는 ę˛ƒė„ "기다ëĻŦ는" ęŗŧė •ė´ í•„ėš”í•Šë‹ˆë‹¤. -꡸ëŸŦ나 `open()`ė€ `async`뙀 `await`ė„ ė‚ŦėšŠí•˜ė§€ ė•Šę¸° 때ëŦ¸ė— ė´ë˛¤íŠ¸ 핸들ëŸŦ í•¨ėˆ˜ëŠ” `async def`가 ė•„ë‹Œ í‘œė¤€ `def`로 ė„ ė–¸í•˜ęŗ  ėžˆėŠĩ니다. +í•˜ė§€ë§Œ `open()`ė€ `async`뙀 `await`ëĨŧ ė‚ŦėšŠí•˜ė§€ ė•ŠėŠĩ니다. + +ęˇ¸ëž˜ė„œ 뚰ëĻŦ는 ė´ë˛¤íŠ¸ 핸들ëŸŦ í•¨ėˆ˜ëĨŧ `async def` ëŒ€ė‹  ėŧ반 `def`로 ė„ ė–¸í•Šë‹ˆë‹¤. /// +### `startup`ęŗŧ `shutdown`ė„ 함ęģ˜ ė‚ŦėšŠ + +*ė‹œėž‘*ęŗŧ *ėĸ…ëŖŒ* ëĄœė§ė´ ė—°ę˛°ë  가ëŠĨė„ąė´ 높ėŠĩ니다. 똈ëĨŧ ë“¤ė–´, ëŦ´ė–¸ę°€ëĨŧ ė‹œėž‘í•œ 후 끝내거나, ėžė›ė„ 획득한 후 í•´ė œí•˜ëŠ” ë“ąė˜ ėž‘ė—…ė„ 할 눘 ėžˆėŠĩ니다. + +ė´ëŸŦ한 ėž‘ė—…ė„ ëŗ„ë„ė˜ í•¨ėˆ˜ëĄœ 래ëĻŦ하면 ė„œëĄœ ëĄœė§ė´ë‚˜ ëŗ€ėˆ˜ëĨŧ ęŗĩėœ í•˜ė§€ ė•Šę¸° 때ëŦ¸ė— 더 ė–´ë ¤ė›Œė§‘ë‹ˆë‹¤. ę°’ë“¤ė„ ė „ė—­ ëŗ€ėˆ˜ė— ė €ėžĨ하거나 ëš„ėŠˇí•œ 트ëĻ­ė„ ė‚ŦėšŠí•´ė•ŧ 할 눘 ėžˆėŠĩ니다. + +그렇기 때ëŦ¸ė— ėœ„ė—ė„œ 네ëĒ…í•œ 대로 `lifespan`ė„ ė‚ŦėšŠí•˜ëŠ” ę˛ƒė´ ęļŒėžĨ됩니다. + +## 揰눠렁 넏ëļ€ė‚Ŧ항 + +호기ė‹Ŧ ë§Žė€ ëļ„ë“¤ė„ ėœ„í•œ ę¸°ėˆ ė ė¸ 넏ëļ€ė‚Ŧí•­ėž…ë‹ˆë‹¤. 🤓 + +ASGI 揰눠 ė‚Ŧ떑뗐 따ëĨ´ëŠ´, ė´ëŠ” Lifespan Protocolė˜ ėŧëļ€ė´ëа, `startup`ęŗŧ `shutdown`ė´ëŧ는 ė´ë˛¤íŠ¸ëĨŧ ė •ė˜í•Šë‹ˆë‹¤. + /// info | ė •ëŗ´ -ė´ë˛¤íŠ¸ 핸들ëŸŦ뗐 관한 ë‚´ėšŠė€ Starlette ė´ë˛¤íŠ¸ ëŦ¸ė„œė—ė„œ ėļ”ę°€ëĄœ í™•ė¸í•  눘 ėžˆėŠĩ니다. +Starletteė˜ `lifespan` 핸들ëŸŦ뗐 대해 더 ėŊęŗ  ė‹ļ다면 Starletteė˜ Lifespan ëŦ¸ė„œė—ė„œ í™•ė¸í•  눘 ėžˆėŠĩ니다. + +ė´ ëŦ¸ė„œė—ëŠ” ėŊ”ë“œė˜ 다ëĨ¸ ė˜ė—­ė—ė„œ ė‚ŦėšŠí•  눘 ėžˆëŠ” lifespan ėƒíƒœëĨŧ 래ëĻŦ하는 방법도 íŦí•¨ë˜ė–´ ėžˆėŠĩ니다. /// + +## ė„œë¸Œ ė• í”ŒëĻŦėŧ€ė´ė…˜ + +🚨 ė´ lifespan ė´ë˛¤íŠ¸(`startup`ęŗŧ `shutdown`)는 ëŠ”ė¸ ė• í”ŒëĻŦėŧ€ė´ė…˜ė— ëŒ€í•´ė„œë§Œ ė‹¤í–‰ë˜ëŠ°, [ė„œë¸Œ ė• í”ŒëĻŦėŧ€ė´ė…˜ - Mounts](sub-applications.md){.internal-link target=_blank}ė—ëŠ” ė‹¤í–‰ë˜ė§€ ė•ŠėŒė„ ėœ ė˜í•˜ė„¸ėš”. diff --git a/docs/ko/docs/advanced/sub-applications.md b/docs/ko/docs/advanced/sub-applications.md new file mode 100644 index 000000000..c5835de15 --- /dev/null +++ b/docs/ko/docs/advanced/sub-applications.md @@ -0,0 +1,67 @@ +# í•˜ėœ„ ė‘ėšŠí”„ëĄœęˇ¸ëž¨ - ë§ˆėš´íŠ¸ + +만ė•Ŋ ę°ę°ė˜ 독ëĻŊė ė¸ OpenAPI뙀 ëŦ¸ė„œ UIëĨŧ 갖는 두 ę°œė˜ 독ëĻŊė ė¸ FastAPI ė‘ėšŠí”„ëĄœęˇ¸ëž¨ė´ í•„ėš”í•˜ë‹¤ëŠ´, ëŠ”ė¸ ė–´í”ŒëĻŦėŧ€ė´ė…˜ė— 하나 (또는 ꡸ ė´ėƒė˜) í•˜ėœ„-ė‘ėšŠí”„ëĄœęˇ¸ëž¨(들)ė„ â€œë§ˆėš´íŠ¸"í•´ė„œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. + +## **FastAPI** ė‘ėšŠí”„ëĄœęˇ¸ëž¨ ë§ˆėš´íŠ¸ + +â€œë§ˆėš´íŠ¸"ė´ëž€ ė™„ė „ížˆ “독ëĻŊė ė¸" ė‘ėšŠí”„ëĄœęˇ¸ëž¨ė„ íŠšė • ę˛ŊëĄœė— ėļ”ę°€í•˜ė—Ŧ 해당 í•˜ėœ„ ė‘ėšŠí”„ëĄœęˇ¸ëž¨ė—ė„œ ė„ ė–¸ëœ *ę˛Ŋ로 ë™ėž‘*ė„ í†ĩ해 해당 ę˛Ŋ로 ė•„ëž˜ė— ėžˆëŠ” ëĒ¨ë“  ėž‘ė—…ë“¤ė„ 래ëĻŦ할 눘 ėžˆë„ëĄ 하는 ę˛ƒė„ ė˜ë¯¸í•Šë‹ˆë‹¤. + +### ėĩœėƒë‹¨ ė‘ėšŠí”„ëĄœęˇ¸ëž¨ + +ë¨ŧė €, ëŠ”ė¸, ėĩœėƒë‹¨ė˜ **FastAPI** ė‘ėšŠí”„ëĄœęˇ¸ëž¨ęŗŧ ė´ę˛ƒė˜ *ę˛Ŋ로 ë™ėž‘*ė„ ėƒė„ąí•Šë‹ˆë‹¤: + +{* ../../docs_src/sub_applications/tutorial001.py hl[3, 6:8] *} + +### í•˜ėœ„ ė‘ėšŠí”„ëĄœęˇ¸ëž¨ + +ë‹¤ėŒėœŧ로, í•˜ėœ„ ė‘ėšŠí”„ëĄœęˇ¸ëž¨ęŗŧ ė´ę˛ƒė˜ *ę˛Ŋ로 ë™ėž‘*ė„ ėƒė„ąí•Šë‹ˆë‹¤: + +ė´ í•˜ėœ„ ė‘ėšŠí”„ëĄœęˇ¸ëž¨ė€ 또 다ëĨ¸ í‘œė¤€ FastAPI ė‘ėšŠí”„ëĄœęˇ¸ëž¨ėž…ë‹ˆë‹¤. 다만 ė´ę˛ƒė€ â€œë§ˆėš´íŠ¸â€ë  ę˛ƒėž…ë‹ˆë‹¤: + +{* ../../docs_src/sub_applications/tutorial001.py hl[11, 14:16] *} + +### í•˜ėœ„ ė‘ėšŠí”„ëĄœęˇ¸ëž¨ ë§ˆėš´íŠ¸ + +ėĩœėƒë‹¨ ė‘ėšŠí”„ëĄœęˇ¸ëž¨, `app`뗐 í•˜ėœ„ ė‘ėšŠí”„ëĄœęˇ¸ëž¨, `subapi`ëĨŧ ë§ˆėš´íŠ¸í•Šë‹ˆë‹¤. + +ė´ ė˜ˆė‹œė—ė„œ, í•˜ėœ„ ė‘ėšŠí”„ëĄœęˇ¸ëž¨ė…˜ė€ `/subapi` ę˛ŊëĄœė— ë§ˆėš´íŠ¸ 될 ę˛ƒėž…ë‹ˆë‹¤: + +{* ../../docs_src/sub_applications/tutorial001.py hl[11, 19] *} + +### ėžë™ėœŧ로 ėƒė„ąëœ API ëŦ¸ė„œ í™•ė¸ + +ė´ė œ, `uvicorn`ėœŧ로 ëŠ”ė¸ ė‘ėšŠí”„ëĄœęˇ¸ëž¨ė„ ė‹¤í–‰í•˜ė‹­ė‹œė˜¤. ë‹šė‹ ė˜ 파ėŧė´ `main.py`ëŧ늴, ė´ë ‡ę˛Œ ė‹¤í–‰í•Šë‹ˆë‹¤: + +
+ +```console +$ uvicorn main:app --reload + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +
+ +꡸ëĻŦęŗ  http://127.0.0.1:8000/docsė—ė„œ ëŦ¸ė„œëĨŧ ė—Ŧė‹­ė‹œė˜¤. + +ëŠ”ė¸ ė‘ėšŠí”„ëĄœęˇ¸ëž¨ė˜ *ę˛Ŋ로 ë™ėž‘*ë§Œė„ íŦ함하는, ëŠ”ė¸ ė‘ėšŠí”„ëĄœęˇ¸ëž¨ė— 대한 ėžë™ API ëŦ¸ė„œëĨŧ í™•ė¸í•  눘 ėžˆėŠĩ니다: + + + +ë‹¤ėŒėœŧ로, http://127.0.0.1:8000/subapi/docsė—ė„œ í•˜ėœ„ ė‘ėšŠí”„ëĄœęˇ¸ëž¨ė˜ ëŦ¸ė„œëĨŧ ė—Ŧė‹­ė‹œė˜¤. + +í•˜ėœ„ ę˛Ŋ로 ė ‘ë‘ė‚Ŧ `/subapi` ė•„ëž˜ė— ė„ ė–¸ëœ *ę˛Ŋ로 ë™ėž‘* ė„ íŦ함하는, í•˜ėœ„ ė‘ėšŠí”„ëĄœęˇ¸ëž¨ė— 대한 ėžë™ API ëŦ¸ė„œëĨŧ í™•ė¸í•  눘 ėžˆėŠĩ니다: + + + +두 ė‚ŦėšŠėž ė¸í„°íŽ˜ė´ėŠ¤ 뤑 ė–´ëŠ 하나ëĨŧ ė‚ŦėšŠí•´ė•ŧ하는 ę˛Ŋ뚰, 브ëŧėš°ė €ëŠ” íŠšė • ė‘ėšŠí”„ëĄœęˇ¸ëž¨ 또는 í•˜ėœ„ ė‘ėšŠí”„ëĄœęˇ¸ëž¨ęŗŧ 각각 í†ĩė‹ í•  눘 ėžˆę¸° 때ëŦ¸ė— ė˜Ŧ바ëĨ´ę˛Œ ë™ėž‘í•  ę˛ƒėž…ë‹ˆë‹¤. + +### 揰눠렁 넏ëļ€ė‚Ŧ항: `root_path` + +ėœ„ė— 네ëĒ…ëœ 것ęŗŧ ę°™ė´ í•˜ėœ„ ė‘ėšŠí”„ëĄœęˇ¸ëž¨ė„ ë§ˆėš´íŠ¸í•˜ëŠ” ę˛Ŋ뚰, FastAPI는 `root_path`ëŧęŗ  하는 ASGI ëĒ…ė„¸ė˜ 매ėģ¤ë‹ˆėĻ˜ė„ ė‚ŦėšŠí•˜ė—Ŧ í•˜ėœ„ ė‘ėšŠí”„ëĄœęˇ¸ëž¨ė— 대한 ë§ˆėš´íŠ¸ ę˛Ŋ로 í†ĩė‹ ė„ 래ëĻŦ합니다. + +ė´ëĨŧ í†ĩ해, í•˜ėœ„ ė‘ėšŠí”„ëĄœęˇ¸ëž¨ė€ ëŦ¸ė„œ UIëĨŧ ėœ„í•´ ę˛Ŋ로 ė ‘ë‘ė‚ŦëĨŧ ė‚ŦėšŠí•´ė•ŧ 한다는 ė‚Ŧė‹¤ė„ ė¸ė§€í•Šë‹ˆë‹¤. + +í•˜ėœ„ ė‘ėšŠí”„ëĄœęˇ¸ëž¨ė—ë„ ė—­ė‹œ 다ëĨ¸ í•˜ėœ„ ė‘ėšŠí”„ëĄœęˇ¸ëž¨ė„ ë§ˆėš´íŠ¸í•˜ëŠ” ę˛ƒė´ 가ëŠĨ하며 FastAPI가 ëĒ¨ë“  `root_path` ë“¤ė„ ėžë™ė ėœŧ로 래ëĻŦ하기 때ëŦ¸ė— ëĒ¨ë“  ę˛ƒė€ ė˜Ŧ바ëĨ´ę˛Œ ë™ėž‘í•  ę˛ƒėž…ë‹ˆë‹¤. + +`root_path`뙀 ė´ę˛ƒė„ ė‚ŦėšŠí•˜ëŠ” ë°Šë˛•ė— ëŒ€í•´ė„œëŠ” [í”„ëĄė‹œė˜ 뒷단](./behind-a-proxy.md){.internal-link target=_blank} ė„šė…˜ė—ė„œ ë°°ėš¸ 눘 ėžˆėŠĩ니다. diff --git a/docs/ko/docs/tutorial/extra-models.md b/docs/ko/docs/tutorial/extra-models.md new file mode 100644 index 000000000..8e4559061 --- /dev/null +++ b/docs/ko/docs/tutorial/extra-models.md @@ -0,0 +1,223 @@ +# ėļ”ę°€ ëĒ¨ë¸ + +ė§€ë‚œ ė˜ˆė œė— ė´ė–´ė„œ, ė—°ę´€ëœ ëĒ¨ë¸ė„ ė—ŦëŸŦ氜 갖는 ę˛ƒė€ 흔한 ėŧėž…ë‹ˆë‹¤. + +특히 ė‚ŦėšŠėž ëĒ¨ë¸ė˜ ę˛Ŋėš°ė— ꡸ëŸŦ한데, ė™œëƒí•˜ëŠ´: + +* **ėž…ë Ĩ ëĒ¨ë¸** ė€ 비밀번호ëĨŧ 氀렏ė•ŧ 합니다. +* **ėļœë Ĩ ëĒ¨ë¸** ė€ 비밀번호ëĨŧ ę°€ė§€ëŠ´ ė•ˆëŠë‹ˆë‹¤. +* **ë°ė´í„°ë˛ ė´ėŠ¤ ëĒ¨ë¸** ė€ í•´ė‹œė˛˜ëĻŦ된 비밀번호ëĨŧ ę°€ė§ˆ ę˛ƒėž…ë‹ˆë‹¤. + +/// danger | ėœ„í—˜ + +ė ˆëŒ€ ė‚ŦėšŠėžė˜ 비밀번호ëĨŧ 평ëŦ¸ėœŧ로 ė €ėžĨí•˜ė§€ ë§ˆė„¸ėš”. í•­ėƒ ė´í›„ė— 검ėĻ 가ëŠĨ한 "ė•ˆė „í•œ í•´ė‹œ(secure hash)"로 ė €ėžĨí•˜ė„¸ėš”. + +만ė•Ŋ ė´ę˛Œ ëŦ´ė—‡ė¸ė§€ ëǍëĨ´ę˛ ë‹¤ëŠ´, [security chapters](security/simple-oauth2.md#password-hashing){.internal-link target=_blank}.ė—ė„œ 비밀번호 í•´ė‹œė— 대해 ë°°ėš¸ 눘 ėžˆėŠĩ니다. + +/// + +## ë‹¤ė¤‘ ëĒ¨ë¸ + +ė•„ëž˜ëŠ” 비밀번호 í•„ë“œė™€ 해당 필드가 ė‚ŦėšŠë˜ëŠ” ėœ„ėš˜ëĨŧ íŦ함하ė—Ŧ, 각 ëĒ¨ë¸ë“¤ė´ ė–´ë–¤ 형태ëĨŧ ę°€ė§ˆ 눘 ėžˆëŠ”ė§€ ė „ë°˜ė ė¸ ė˜ˆė‹œėž…ë‹ˆë‹¤: + +{* ../../docs_src/extra_models/tutorial001_py310.py hl[7,9,14,20,22,27:28,31:33,38:39] *} + + +/// info | ė •ëŗ´ + +Pydantic v1ė—ė„œëŠ” 해당 ëŠ”ė„œë“œę°€ `.dict()`로 ëļˆë ¸ėœŧ늰, Pydantic v2ė—ė„œëŠ” `.model_dump()`로 ė´ëĻ„ė´ ëŗ€ę˛Ŋë˜ė—ˆėŠĩ니다. `.dict()`는 ė—Ŧė „ížˆ ė§€ė›ë˜ė§€ë§Œ 더 ė´ėƒ ęļŒėžĨë˜ė§€ ė•ŠėŠĩ니다. + +ė—Ŧę¸°ė—ė„œ ė‚ŦėšŠí•˜ëŠ” ė˜ˆė œëŠ” Pydantic v1ęŗŧė˜ í˜¸í™˜ė„ąė„ ėœ„í•´ `.dict()`ëĨŧ ė‚ŦėšŠí•˜ė§€ë§Œ, Pydantic v2ëĨŧ ė‚ŦėšŠí•  눘 ėžˆë‹¤ëŠ´ `.model_dump()`ëĨŧ ė‚ŦėšŠí•˜ëŠ” ę˛ƒė´ ėĸ‹ėŠĩ니다. + +/// + +### `**user_in.dict()` 뗐 대하ė—Ŧ + +#### Pydanticė˜ `.dict()` + +`user_in`ė€ Pydantic ëĒ¨ë¸ í´ëž˜ėŠ¤ė¸ `UserIn`ėž…ë‹ˆë‹¤. + +Pydantic ëĒ¨ë¸ė€ ëĒ¨ë¸ ë°ė´í„°ëĨŧ íŦ함한 `dict`ëĨŧ 반환하는 `.dict()` ëŠ”ė„œë“œëĨŧ 렜ęŗĩ합니다. + +따ëŧė„œ, ë‹¤ėŒęŗŧ ę°™ė´ Pydantic ę°ė˛´ `user_in`ė„ ėƒė„ąí•  눘 ėžˆėŠĩ니다: + +```Python +user_in = UserIn(username="john", password="secret", email="john.doe@example.com") +``` + +꡸ ë‹¤ėŒ, ë‹¤ėŒęŗŧ ę°™ė´ 호ėļœí•Šë‹ˆë‹¤: + +```Python +user_dict = user_in.dict() +``` + +ė´ė œ ëŗ€ėˆ˜ `user_dict`뗐 ë°ė´í„°ę°€ íŦ함된 `dict`ëĨŧ ę°€ė§€ę˛Œ 됩니다(ė´ëŠ” Pydantic ëĒ¨ë¸ ę°ė˛´ę°€ ė•„ë‹Œ `dict`ėž…ë‹ˆë‹¤). + +꡸ëĻŦęŗ  ë‹¤ėŒęŗŧ ę°™ė´ 호ėļœí•˜ëŠ´: + +```Python +print(user_dict) +``` + +Pythonė˜ `dict`가 ë‹¤ėŒęŗŧ ę°™ė´ ėļœë Ĩ됩니다: + +```Python +{ + 'username': 'john', + 'password': 'secret', + 'email': 'john.doe@example.com', + 'full_name': None, +} +``` + +#### `dict` ė–¸íŒ¨í‚š(Unpacking) + +`user_dict`뙀 ę°™ė€ `dict`ëĨŧ í•¨ėˆ˜(또는 í´ëž˜ėŠ¤)뗐 `**user_dict`로 ė „ë‹Ŧ하면, Pythonė€ ė´ëĨŧ "ė–¸íŒŠ(unpack)"합니다. ė´ ęŗŧė •ė—ė„œ `user_dict`ė˜ í‚¤ė™€ ę°’ė„ 각각 키-값 ė¸ėžëĄœ 링렑 ė „ë‹Ŧ합니다. + +따ëŧė„œ, ėœ„ė—ė„œ ėƒė„ąí•œ `user_dict`ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ë‹¤ėŒęŗŧ ę°™ė´ ėž‘ė„ąí•˜ëŠ´: + +```Python +UserInDB(**user_dict) +``` + +ë‹¤ėŒęŗŧ ę°™ė€ 결ęŗŧëĨŧ ėƒė„ąí•Šë‹ˆë‹¤: + +```Python +UserInDB( + username="john", + password="secret", + email="john.doe@example.com", + full_name=None, +) +``` + +í˜šė€ 더 ė •í™•ížˆ ë§í•˜ėžëŠ´, `user_dict`ëĨŧ 링렑 ė‚ŦėšŠí•˜ëŠ” ę˛ƒė€, ë‚˜ė¤‘ė— ė–´ë–¤ ę°’ė´ ėļ”ę°€ë˜ë”ëŧ도 ė•„ëž˜ė™€ 동ėŧ한 효ęŗŧëĨŧ 냅니다: + +```Python +UserInDB( + username = user_dict["username"], + password = user_dict["password"], + email = user_dict["email"], + full_name = user_dict["full_name"], +) +``` + +#### 다ëĨ¸ ëĒ¨ë¸ ë°ė´í„°ëĄœ 냈 Pydantic ëĒ¨ë¸ ėƒė„ą + +ėœ„ė˜ ė˜ˆė œė—ė„œ `user_in.dict()`로ëļ€í„° `user_dict`ëĨŧ ėƒė„ąí•œ 枃래ëŸŧ, ė•„ëž˜ ėŊ”드는: + +```Python +user_dict = user_in.dict() +UserInDB(**user_dict) +``` + +ë‹¤ėŒęŗŧ 동ėŧ합니다: + +```Python +UserInDB(**user_in.dict()) +``` + +...ė™œëƒí•˜ëŠ´ `user_in.dict()`는 `dict`ė´ëŠ°, ė´ëĨŧ `**`로 Pythonė´ "ė–¸íŒŠ(unpack)"하도록 하ė—Ŧ `UserInDB`뗐 ė „ë‹Ŧ하기 때ëŦ¸ėž…니다. + +따ëŧė„œ, 다ëĨ¸ Pydantic ëĒ¨ë¸ė˜ ë°ė´í„°ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ėƒˆëĄœėš´ Pydantic ëĒ¨ë¸ė„ ėƒė„ąí•  눘 ėžˆėŠĩ니다. + +#### `dict` ė–¸íŒ¨í‚š(Unpacking)ęŗŧ ėļ”ę°€ í‚¤ė›Œë“œ + +꡸ëĻŦęŗ  ë‹¤ėŒęŗŧ ę°™ė´ ėļ”ę°€ í‚¤ė›Œë“œ ė¸ėž `hashed_password=hashed_password`ëĨŧ ėļ”ę°€í•˜ëŠ´: + +```Python +UserInDB(**user_in.dict(), hashed_password=hashed_password) +``` + +ë‹¤ėŒęŗŧ ę°™ė€ 결ęŗŧëĨŧ ėƒė„ąí•Šë‹ˆë‹¤: + +```Python +UserInDB( + username = user_dict["username"], + password = user_dict["password"], + email = user_dict["email"], + full_name = user_dict["full_name"], + hashed_password = hashed_password, +) +``` + +/// warning | ę˛Ŋęŗ  + +ėļ”氀렁ėœŧ로 렜ęŗĩ된 í•¨ėˆ˜ `fake_password_hasher`뙀 `fake_save_user`는 ë°ė´í„° 흐ëĻ„ė„ ė‹œė—°í•˜ę¸° ėœ„í•œ 똈렜ėŧ ëŋė´ëа, ė‹¤ė œ ëŗ´ė•ˆė„ 렜ęŗĩí•˜ė§€ ė•ŠėŠĩ니다. + +/// + +## 뤑ëŗĩ ė¤„ė´ę¸° + +ėŊ”드 뤑ëŗĩė„ ė¤„ė´ëŠ” ę˛ƒė€ **FastAPI**ė˜ í•ĩė‹Ŧ ė•„ė´ë””ė–´ 뤑 í•˜ë‚˜ėž…ë‹ˆë‹¤. + +ėŊ”드 뤑ëŗĩė€ 버그, ëŗ´ė•ˆ ëŦ¸ė œ, ėŊ”드 비동기화 ëŦ¸ė œ(한 ęŗŗė€ ė—…ë°ė´íŠ¸ë˜ė—ˆė§€ë§Œ 다ëĨ¸ ęŗŗė€ ė—…ë°ė´íŠ¸ë˜ė§€ ė•ŠëŠ” ëŦ¸ė œ) ë“ąė˜ 가ëŠĨė„ąė„ ėĻę°€ė‹œí‚ĩ니다. + +꡸ëĻŦęŗ  ė´ ëĒ¨ë¸ë“¤ė€ ë§Žė€ ë°ė´í„°ëĨŧ ęŗĩėœ í•˜ëŠ´ė„œ ė†ė„ą ė´ëĻ„ęŗŧ íƒ€ėž…ė„ 뤑ëŗĩí•˜ęŗ  ėžˆėŠĩ니다. + +더 ë‚˜ė€ ë°Šë˛•ė´ ėžˆėŠĩ니다. + +`UserBase` ëĒ¨ë¸ė„ ė„ ė–¸í•˜ė—Ŧ 다ëĨ¸ ëĒ¨ë¸ë“¤ė˜ ę¸°ëŗ¸(base)ėœŧ로 ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. 그런 ë‹¤ėŒ ė´ ëĒ¨ë¸ė„ ėƒė†ë°›ė•„ ė†ė„ąęŗŧ íƒ€ėž… ė„ ė–¸(ėœ í˜• ė„ ė–¸, 검ėĻ 등)ė„ ėƒė†í•˜ëŠ” ė„œë¸Œí´ëž˜ėŠ¤ëĨŧ 만들 눘 ėžˆėŠĩ니다. + +ëĒ¨ë“  ë°ė´í„° ëŗ€í™˜, 검ėĻ, ëŦ¸ė„œí™” ë“ąė€ ė •ėƒė ėœŧ로 ėž‘ë™í•  ę˛ƒėž…ë‹ˆë‹¤. + +ė´ë ‡ę˛Œ 하면 각 ëĒ¨ë¸ ę°„ė˜ ė°¨ė´ė ë§Œ ė„ ė–¸í•  눘 ėžˆėŠĩ니다(평ëŦ¸ `password`가 ėžˆëŠ” ę˛Ŋ뚰, `hashed_password`만 ėžˆëŠ” ę˛Ŋ뚰, í˜šė€ 비밀번호가 ė—†ëŠ” ę˛Ŋ뚰): + +{* ../../docs_src/extra_models/tutorial002_py310.py hl[7,13:14,17:18,21:22] *} + +## `Union` 또는 `anyOf` + +두 氀맀 ė´ėƒė˜ íƒ€ėž…ė„ íŦ함하는 `Union`ėœŧ로 ė‘ë‹ĩė„ ė„ ė–¸í•  눘 ėžˆėŠĩ니다. ė´ëŠ” ė‘ë‹ĩė´ ꡸ 뤑 í•˜ë‚˜ė˜ íƒ€ėž…ėŧ 눘 ėžˆėŒė„ ė˜ë¯¸í•Šë‹ˆë‹¤. + +OpenAPIė—ė„œëŠ” ė´ëĨŧ `anyOf`로 ė •ė˜í•Šë‹ˆë‹¤. + +ė´ëĨŧ ėœ„í•´ í‘œė¤€ Python íƒ€ėž… ížŒíŠ¸ė¸ `typing.Union`ė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다: + +/// note | 및溠 + +`Union`ė„ ė •ė˜í• ë•ŒëŠ” 더 ęĩŦė˛´ė ė¸ íƒ€ėž…ė„ ë¨ŧė € íŦí•¨í•˜ęŗ , 덜 ęĩŦė˛´ė ė¸ íƒ€ėž…ė„ ꡸ ë’¤ė— ë‚˜ė—´í•´ė•ŧ합니다. ė•„ëž˜ ė˜ˆė œė—ė„œëŠ” `Union[PlaneItem, CarItem]` ëĨŧ ëŗ´ëŠ´, 더 ęĩŦė˛´ė ė¸ `PlaneItem`ė´ `CarItem`ëŗ´ë‹¤ ė•žė— ėœ„ėš˜í•Šë‹ˆë‹¤. + +/// + +{* ../../docs_src/extra_models/tutorial003_py310.py hl[1,14:15,18:20,33] *} + + +### Python 3.10ė—ė„œ `Union` + +ėœ„ė˜ ė˜ˆė œė—ė„œëŠ” `response_model` ė¸ėž 값ėœŧ로 `Union[PlaneItem, CarItem]`ė„ ė „ë‹Ŧ합니다. + +ė´ ę˛Ŋ뚰, ė´ëĨŧ **íƒ€ėž… ė–´ë…¸í…Œė´ė…˜(type annotation)** ė´ ė•„ë‹Œ **ė¸ėž 값(argument value)** ėœŧ로 ė „ë‹Ŧí•˜ęŗ  ėžˆę¸° 때ëŦ¸ė— Python 3.10ė—ė„œë„ `Union`ė„ ė‚ŦėšŠí•´ė•ŧ 합니다. + +만ė•Ŋ íƒ€ėž… ė–´ë…¸í…Œė´ė…˜ė— ė‚ŦėšŠí•œë‹¤ëŠ´, ë‹¤ėŒęŗŧ ę°™ė´ 눘링 막대(|)ëĨŧ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다: + +```Python +some_variable: PlaneItem | CarItem +``` + +í•˜ė§€ë§Œ ė´ëĨŧ `response_model=PlaneItem | CarItem`ęŗŧ ę°™ė´ 할당하면 뗐ëŸŦ가 ë°œėƒí•Šë‹ˆë‹¤. ė´ëŠ” Pythonė´ ė´ëĨŧ íƒ€ėž… ė–´ë…¸í…Œė´ė…˜ėœŧ로 í•´ė„í•˜ė§€ ė•Šęŗ , `PlaneItem`ęŗŧ `CarItem` ė‚Ŧė´ė˜ **ėž˜ëĒģ된 ė—°ė‚°(invalid operation)**ė„ ė‹œë„í•˜ę¸° 때ëŦ¸ėž…니다 + +## ëĒ¨ë¸ ëĻŦėŠ¤íŠ¸ + +마ė°Ŧę°€ė§€ëĄœ, ę°ė˛´ ëĻŦėŠ¤íŠ¸ í˜•íƒœė˜ ė‘ë‹ĩė„ ė„ ė–¸í•  ėˆ˜ë„ ėžˆėŠĩ니다. + +ė´ëĨŧ ėœ„í•´ í‘œė¤€ Pythonė˜ `typing.List`ëĨŧ ė‚ŦėšŠí•˜ė„¸ėš”(또는 Python 3.9 ė´ėƒė—ė„œëŠ” ë‹¨ėˆœížˆ `list`ëĨŧ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다): + +{* ../../docs_src/extra_models/tutorial004_py39.py hl[18] *} + + +## ėž„ė˜ė˜ `dict` ė‘ë‹ĩ + +Pydantic ëĒ¨ë¸ė„ ė‚ŦėšŠí•˜ė§€ ė•Šęŗ , í‚¤ė™€ ę°’ė˜ íƒ€ėž…ë§Œ ė„ ė–¸í•˜ė—Ŧ 평범한 ėž„ė˜ė˜ `dict`로 ė‘ë‹ĩė„ ė„ ė–¸í•  ėˆ˜ë„ ėžˆėŠĩ니다. + +ė´ëŠ” Pydantic ëĒ¨ë¸ė— í•„ėš”í•œ ėœ íš¨í•œ 필드/ė†ė„ą ė´ëĻ„ė„ ė‚Ŧ렄뗐 ė•Œ 눘 ė—†ëŠ” ę˛Ŋėš°ė— ėœ ėšŠí•Šë‹ˆë‹¤. + +ė´ ę˛Ŋ뚰, `typing.Dict`ëĨŧ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다(또는 Python 3.9 ė´ėƒė—ė„œëŠ” ë‹¨ėˆœížˆ `dict`ëĨŧ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다): + +{* ../../docs_src/extra_models/tutorial005_py39.py hl[6] *} + + +## ėš”ė•Ŋ + +ė—ŦëŸŦ Pydantic ëĒ¨ë¸ė„ ė‚ŦėšŠí•˜ęŗ , 각 ę˛Ŋėš°ė— 맞게 ėžėœ ëĄ­ę˛Œ ėƒė†í•˜ė„¸ėš”. + +ė—”í„°í‹°ę°€ ė„œëĄœ 다ëĨ¸ "ėƒíƒœ"ëĨŧ 氀렏ė•ŧ 하는 ę˛Ŋ뚰, ė—”í„°í‹°ë‹š 단ėŧ ë°ė´í„° ëĒ¨ë¸ė„ ė‚ŦėšŠí•  í•„ėš”ëŠ” ė—†ėŠĩ니다. 똈ëĨŧ ë“¤ė–´, ė‚ŦėšŠėž "ė—”í„°í‹°"가 `password`, `password_hash`, 또는 비밀번호가 ė—†ëŠ” ėƒíƒœëĨŧ íŦ함할 눘 ėžˆëŠ” ę˛Ŋ뚰래ëŸŧ ë§ėž…ë‹ˆë‹¤. diff --git a/docs/ko/docs/virtual-environments.md b/docs/ko/docs/virtual-environments.md new file mode 100644 index 000000000..0d10c3200 --- /dev/null +++ b/docs/ko/docs/virtual-environments.md @@ -0,0 +1,846 @@ +# ę°€ėƒ 환ę˛Ŋ + +Python í”„ëĄœė íŠ¸ëĨŧ ėž‘ė—…í•  때는 **ę°€ėƒ 환ę˛Ŋ** (또는 ė´ė™€ 뜠ė‚Ŧ한 도ęĩŦ)ė„ ė‚ŦėšŠí•˜ëŠ” ę˛ƒė´ ėĸ‹ėŠĩ니다. 각 í”„ëĄœė íŠ¸ 마다 ė„¤ėš˜í•˜ëŠ” íŒ¨í‚¤ė§€ëĨŧ ëļ„ëĻŦ하ė—Ŧ 관ëĻŦ할 눘 ėžˆėŠĩ니다. + +/// info | ė •ëŗ´ + +ė´ë¯¸ ę°€ėƒ 환ę˛Ŋ뗐 대해 ėž˜ ė•Œęŗ  ėžˆë‹¤ëŠ´, ė´ ė„šė…˜ė€ 건너 ë›°ė–´ë„ ę´œė°ŽėŠĩ니다. 🤓 + +/// + +/// tip | 팁 + +**ę°€ėƒ 환ę˛Ŋ(Virtual Environment)** ė€ **환ę˛Ŋ ëŗ€ėˆ˜(Environment Variable)** 뙀 다ëĻ…ë‹ˆë‹¤. + +**환ę˛Ŋ ëŗ€ėˆ˜**는 ė‹œėŠ¤í…œė— ėĄ´ėžŦ하며, í”„ëĄœęˇ¸ëž¨ė´ ė‚ŦėšŠí•  눘 ėžˆëŠ” ëŗ€ėˆ˜ėž…ë‹ˆë‹¤. + +**ę°€ėƒ 환ę˛Ŋ**ė€ ëLJëLJ 파ėŧ로 ęĩŦė„ąëœ í•˜ë‚˜ė˜ 디렉터ëĻŦėž…ë‹ˆë‹¤. + +/// + +/// info | ė •ëŗ´ + +ė´ íŽ˜ė´ė§€ė—ė„œëŠ” **ę°€ėƒ 환ę˛Ŋ**ė˜ ė‚ŦėšŠ 방법ęŗŧ ėž‘ë™ ë°Šė‹ė„ 네ëĒ…í•Šë‹ˆë‹¤. + +만ė•Ŋ **ëĒ¨ë“  ę˛ƒė„ 관ëĻŦ해ėŖŧ는 도ęĩŦ** (Python ė„¤ėš˜ęšŒė§€ íŦ함)ëĨŧ ė‚ŦėšŠí•˜ęŗ  ė‹ļ다면 uvëĨŧ ė‚ŦėšŠí•´ëŗ´ė„¸ėš”. + +/// + +## í”„ëĄœė íŠ¸ ėƒė„ą + +ë¨ŧė €, í”„ëĄœė íŠ¸ëĨŧ ėœ„í•œ 디렉터ëĻŦëĨŧ 하나 ėƒė„ąí•Šë‹ˆë‹¤. + +ëŗ´í†ĩ ė‚ŦėšŠėž 홈 디렉터ëĻŦ ė•ˆė— `code`ëŧ는 디렉터ëĻŦëĨŧ ë§Œë“¤ęŗ , ꡸ ė•ˆė— í”„ëĄœė íŠ¸ë§ˆë‹¤ í•˜ë‚˜ė”Š 디렉터ëĻŦëĨŧ ë§Œë“¤ė–´ 관ëĻŦ합니다. + +
+ +```console +// 홈 디렉터ëĻŦ로 ė´ë™ +$ cd +// ëĒ¨ë“  ėŊ”드 í”„ëĄœė íŠ¸ëĨŧ ėœ„í•œ 디렉터ëĻŦ ėƒė„ą +$ mkdir code +// code 디렉터ëĻŦ로 ė´ë™ +$ cd code +// ė´ë˛ˆ í”„ëĄœė íŠ¸ëĨŧ ėœ„í•œ 디렉터ëĻŦ ėƒė„ą +$ mkdir awesome-project +// 해당 í”„ëĄœė íŠ¸ 디렉터ëĻŦ로 ė´ë™ +$ cd awesome-project +``` + +
+ +## ę°€ėƒ 환ę˛Ŋ ėƒė„ą + +Python í”„ëĄœė íŠ¸ëĨŧ **ė˛˜ėŒ ė‹œėž‘í•  때**, ę°€ėƒ 환ę˛Ŋė„ **í”„ëĄœė íŠ¸ 내ëļ€**뗐 ėƒė„ąí•Šë‹ˆë‹¤. + +/// tip | 팁 + +ė´ ėž‘ė—…ė€ **í”„ëĄœė íŠ¸ëĨŧ ė˛˜ėŒ ė„¤ė •í•  때 한번만** 해ėŖŧ늴 됩니다. ė´í›„ ėž‘ė—…í•  때 반ëŗĩ할 í•„ėš”ëŠ” ė—†ėŠĩ니다. + +/// + +//// tab | `venv` + +Python í‘œė¤€ ëŧė´ë¸ŒëŸŦëĻŦ뗐 íŦ함된 venv ëĒ¨ë“ˆė„ ė‚ŦėšŠí•´ ę°€ėƒ 환ę˛Ŋė„ ėƒė„ąí•  눘 ėžˆėŠĩ니다. + +
+ +```console +$ python -m venv .venv +``` + +
+ +/// details | ëĒ…ë šė–´ ėƒė„¸ 네ëĒ… + +* `python`: `python` í”„ëĄœęˇ¸ëž¨ė„ ė‹¤í–‰í•Šë‹ˆë‹¤. +* `-m`: íŠšė • ëĒ¨ë“ˆė„ 늤íŦëĻŊíŠ¸ė˛˜ëŸŧ ė‹¤í–‰í•Šë‹ˆë‹¤. ëŒ€ėƒ ëĒ¨ë“ˆė„ 바로 ë’¤ė— ė§€ė •í•Šë‹ˆë‹¤. +* `venv`: Python í‘œė¤€ ëŧė´ë¸ŒëŸŦëĻŦ뗐 íŦ함된 `venv` ëĒ¨ë“ˆė„ ė‹¤í–‰í•Šë‹ˆë‹¤. +* `.venv`: ę°€ėƒ 환ę˛Ŋė„ `.venv` 디렉터ëĻŦ뗐 ėƒė„ąí•Šë‹ˆë‹¤. + +/// + +//// + +//// tab | `uv` + +`uv`가 ė„¤ėš˜ë˜ė–´ ėžˆë‹¤ëŠ´, uvëĨŧ í†ĩ해 ę°€ėƒ 환ę˛Ŋė„ ėƒė„ąí•  눘 ėžˆėŠĩ니다. + +
+ +```console +$ uv venv +``` + +
+ +/// tip | 팁 + +`uv`는 ę¸°ëŗ¸ė ėœŧ로 `.venv` 디렉터ëĻŦ뗐 ę°€ėƒ 환ę˛Ŋė„ ėƒė„ąí•Šë‹ˆë‹¤. + +ëŗ„ë„ëĄœ 디렉터ëĻŦ ė´ëĻ„ė„ ėļ”ę°€ ė¸ėžëĄœ 넘겨 ėŖŧ늴 ę˛Ŋ로ëĨŧ 맀렕 할 눘 ėžˆėŠĩ니다. + +/// + +//// + +해당 ëĒ…ë šė–´ëŠ” `.venv` 디렉터ëĻŦ뗐 ėƒˆëĄœėš´ ę°€ėƒ 환ę˛Ŋė„ ėƒė„ąí•Šë‹ˆë‹¤. + +/// details | `.venv` 또는 다ëĨ¸ ė´ëĻ„ + +ę°€ėƒ 환ę˛Ŋė„ 다ëĨ¸ 디렉터ëĻŦ뗐 ėƒė„ąí•  ėˆ˜ë„ ėžˆė§€ë§Œ, ę´€ëĄ€ė ėœŧ로 `.venv` 디렉터ëĻŦ ė´ëĻ„ė„ ė‚ŦėšŠí•Šë‹ˆë‹¤. + +/// + +## ę°€ėƒ 환ę˛Ŋ í™œė„ąí™” + +ė´í›„ ė‹¤í–‰í•˜ëŠ” Python ëĒ…ë šė–´ė™€ íŒ¨í‚¤ė§€ ė„¤ėš˜ę°€ ę°€ėƒ 환ę˛Ŋė„ 따ëĨ´ë„록, ę°€ėƒ 환ę˛Ŋė„ í™œė„ąí™”í•˜ė„¸ėš”. + +/// tip | 팁 + +**í„°ë¯¸ë„ė„ ėƒˆëĄœ ė—´ęŗ ** í”„ëĄœė íŠ¸ ėž‘ė—…ė„ ė‹œėž‘í•  때는, **í•­ėƒ ė´ ėž‘ė—…ė„** 해ėŖŧė„¸ėš”. + +/// + +//// tab | Linux, macOS + +
+ +```console +$ source .venv/bin/activate +``` + +
+ +//// + +//// tab | Windows PowerShell + +
+ +```console +$ .venv\Scripts\Activate.ps1 +``` + +
+ +//// + +//// tab | Windows Bash + +Windowsė—ė„œ Bash(똈: Git Bash)ëĨŧ ė‚ŦėšŠí•˜ëŠ” ę˛Ŋ뚰: + +
+ +```console +$ source .venv/Scripts/activate +``` + +
+ +//// + +/// tip | 팁 + +ę°€ėƒ 환ę˛Ŋ뗐 ėƒˆëĄœėš´ íŒ¨í‚¤ė§€ëĨŧ ė„¤ėš˜í•  때마다, 해당 환ę˛Ŋė„ ë‹¤ė‹œ í™œė„ąí™”í•˜ė„¸ėš”. + +ė´ë ‡ę˛Œ 하면 해당 íŒ¨í‚¤ė§€ëĄœ ė„¤ėš˜ëœ **터미널(CLI) 프로그램**ė„ ė‚ŦėšŠí•  때, 렄뗭뗐 ė„¤ėš˜ëœ 다ëĨ¸ ë˛„ė „ė´ ė•„ë‹ˆëŧ, ę°€ėƒ 환ę˛Ŋ ė•ˆė— ė„¤ėš˜ëœ ė •í™•í•œ ë˛„ė „ė„ ė‚ŦėšŠí•Šë‹ˆë‹¤. + +/// + +## ę°€ėƒ 환ę˛Ŋė´ í™œė„ąí™” ė—Ŧëļ€ í™•ė¸ + +ę°€ėƒ 환ę˛Ŋė´ í™œė„ąí™”ë˜ė—ˆëŠ”ė§€ í™•ė¸í•Šë‹ˆë‹¤. (ė´ė „ ëĒ…ë šė–´ę°€ ė œëŒ€ëĄœ ėž‘ë™í–ˆëŠ”ė§€ í™•ė¸í•Šë‹ˆë‹¤). + +/// tip | 팁 + +ė´ ë‹¨ęŗ„ëŠ” **ė„ íƒ ė‚Ŧ항**ė´ė§€ë§Œ, ëĒ¨ë“  ę˛ƒė´ ė˜ˆėƒëŒ€ëĄœ ėž‘ë™í•˜ęŗ  ėžˆëŠ”ė§€, ꡸ëĻŦęŗ  ė˜ë„í•œ ę°€ėƒ 환ę˛Ŋė´ í™œė„ąí™” ë˜ė—ˆëŠ” ė§€ **í™•ė¸**하는 ėĸ‹ė€ ë°Šë˛•ėž…ë‹ˆë‹¤. + +/// + +//// tab | Linux, macOS, Windows Bash + +
+ +```console +$ which python + +/home/user/code/awesome-project/.venv/bin/python +``` + +
+ +`python` ėœ„ėš˜ę°€ í”„ëĄœė íŠ¸ 내ëļ€(ė´ ė˜ˆė‹œė—ė„œëŠ” `awesome-project`)ė˜ `.venv/bin/python` ę˛Ŋ로로 í‘œė‹œëœë‹¤ëŠ´ ė„ąęŗĩėž…ë‹ˆë‹¤. 🎉 + +//// + +//// tab | Windows PowerShell + +
+ +```console +$ Get-Command python + +C:\Users\user\code\awesome-project\.venv\Scripts\python +``` + +
+ +`python` ėœ„ėš˜ę°€ í”„ëĄœė íŠ¸ 내ëļ€(ė´ ė˜ˆė‹œė—ė„œëŠ” `awesome-project`)ė˜ `.venv\bin\python` ę˛Ŋ로로 í‘œė‹œëœë‹¤ëŠ´ ė„ąęŗĩėž…ë‹ˆë‹¤. 🎉 + +//// + +## pip ė—…ęˇ¸ë ˆė´ë“œ + +/// tip | 팁 + +`uv`ëĨŧ ė‚ŦėšŠí•œë‹¤ëŠ´, `pip` ëŒ€ė‹  `uv`로 íŒ¨í‚¤ė§€ëĨŧ ė„¤ėš˜í•˜ę˛Œ ë˜ë¯€ëĄœ `pip`ė„ ė—…ęˇ¸ë ˆė´ë“œí•  í•„ėš”ę°€ ė—†ėŠĩ니다. 😎 + +/// + +`pip`ė„ ė‚ŦėšŠí•˜ė—Ŧ íŒ¨í‚¤ė§€ëĨŧ ė„¤ėš˜í•˜ëŠ” ę˛Ŋ뚰 (Python í‘œė¤€ ëŧė´ë¸ŒëŸŦëĻŦ뗐 íŦí•¨ë˜ė–´ ėžˆėŠĩ니다), **ėĩœė‹  ë˛„ė „ėœŧ로 ė—…ęˇ¸ë ˆė´ë“œ**하는 ę˛ƒė´ ėĸ‹ėŠĩ니다. + +íŒ¨í‚¤ė§€ ė„¤ėš˜ 뤑 ë°œėƒí•˜ëŠ” ë‹¤ė–‘í•˜ęŗ  íŠšė´í•œ 뗐ëŸŦë“¤ė€ `pip` ė—…ęˇ¸ë ˆė´ë“œëĄœ ė‰Ŋ枌 해결되는 ę˛Ŋėš°ę°€ 많ėŠĩ니다. + +/// tip | 팁 + +ė´ ėž‘ė—…ė€ ëŗ´í†ĩ ę°€ėƒ 환ę˛Ŋė„ ėƒė„ąí•œ **ė§í›„ 한 번만** 하면 됩니다. + +/// + +ę°€ėƒ 환ę˛Ŋė´ í™œė„ąí™”ëœ ėƒíƒœė¸ė§€ í™•ė¸í•œ 후(ė•žė„œ 네ëĒ…í•œ ëĒ…ë šė–´ ė‚ŦėšŠ), ė•„ëž˜ ëĒ…ë šė–´ëĨŧ ė‹¤í–‰í•˜ė„¸ėš”: + +
+ +```console +$ python -m pip install --upgrade pip + +---> 100% +``` + +
+ +## `.gitignore` ėļ”ę°€í•˜ę¸° + +**Git**ė„ ė‚ŦėšŠí•˜ęŗ  ėžˆë‹¤ëŠ´ (ė‚ŦėšŠí•˜ëŠ” ę˛ƒė´ ėĸ‹ėŠĩ니다), `.gitignore` 파ėŧė„ ėļ”ę°€í•´ė„œ `.venv` 디렉터ëĻŦ 렄랴ëĨŧ Gitė—ė„œ ė œė™¸í•˜ė„¸ėš”. + +/// tip | 팁 + +`uv`ëĨŧ ė‚ŦėšŠí•´ ę°€ėƒ 환ę˛Ŋė„ ėƒė„ąí–ˆë‹¤ëŠ´, ė´ë¯¸ ė´ ėž‘ė—…ė´ ėžë™ėœŧ로 래ëĻŦë˜ė–´ ėžˆėœŧë¯€ëĄœ ė´ ë‹¨ęŗ„ëŠ” ęą´ë„ˆë›°ė–´ë„ 됩니다. 😎 + +/// + +/// tip | 팁 + +ė´ ėž‘ė—…ë„ 마ė°Ŧę°€ė§€ëĄœ, ę°€ėƒ 환ę˛Ŋė„ ėƒė„ąí•œ **ė§í›„ 한 번만** 하면 됩니다. + +/// + +
+ +```console +$ echo "*" > .venv/.gitignore +``` + +
+ +/// details | ëĒ…ë šė–´ ėƒė„¸ 네ëĒ… + +* `echo "*"`: í„°ë¯¸ë„ė— `*` í…ėŠ¤íŠ¸ëĨŧ "ėļœë Ĩ"합니다 (ë‹¤ėŒ 네ëĒ…ė—ė„œ ėĄ°ę¸ˆ 바뀝니다) +* `>`: ė™ŧėĒŊ ëĒ…ë šė–´ė˜ ėļœë Ĩ ë‚´ėšŠė„ í„°ë¯¸ë„ė— ėļœë Ĩí•˜ė§€ ė•Šęŗ , 똤ëĨ¸ėĒŊ뗐 ė§€ė •ëœ 파ėŧ로 **기록(write)** 하ëŧ는 ė˜ë¯¸ėž…ë‹ˆë‹¤. +* `.gitignore`: ėļœë Ĩ된 í…ėŠ¤íŠ¸ę°€ 기록될 파ėŧ ė´ëĻ„ėž…ë‹ˆë‹¤. + +꡸ëĻŦęŗ  Gitė—ė„œ `*`는 "ëĒ¨ë“  것"ė„ ė˜ë¯¸í•Šë‹ˆë‹¤. 따ëŧė„œ `.venv` 디렉터ëĻŦ ė•ˆė˜ ëĒ¨ë“  ę˛ƒė„ ëŦ´ė‹œí•˜ę˛Œ 됩니다. + +ė´ ëĒ…ë šė–´ëŠ” ë‹¤ėŒęŗŧ ę°™ė€ ë‚´ėšŠė„ 氀맄 `.gitignore` 파ėŧė„ ėƒė„ąí•Šë‹ˆë‹¤: + + +```gitignore +* +``` + +/// + +## íŒ¨í‚¤ė§€ ė„¤ėš˜ + +ę°€ėƒ 환ę˛Ŋė„ í™œė„ąí™”í•œ 후, ꡸ ė•ˆė— í•„ėš”í•œ íŒ¨í‚¤ė§€ë“¤ė„ ė„¤ėš˜í•  눘 ėžˆėŠĩ니다. + +/// tip | 팁 + +í”„ëĄœė íŠ¸ė—ė„œ í•„ėš”í•œ íŒ¨í‚¤ė§€ëĨŧ ė„¤ėš˜í•˜ęą°ë‚˜ ė—…ęˇ¸ë ˆė´ë“œí•  때는 ė´ ėž‘ė—…ė„ **한 번만** 하면 됩니다. + +만ė•Ŋ íŠšė • íŒ¨í‚¤ė§€ė˜ ë˛„ė „ė„ ė—…ęˇ¸ë ˆė´ë“œí•˜ęą°ë‚˜, ėƒˆëĄœėš´ íŒ¨í‚¤ė§€ëĨŧ ėļ”가할 í•„ėš”ę°€ ėƒę¸°ëŠ´ **ë‹¤ė‹œ ė´ ėž‘ė—…ė„ 반ëŗĩ**하면 됩니다. + +/// + +### íŒ¨í‚¤ė§€ 링렑 ė„¤ėš˜ + +급하게 ėž‘ė—…í•˜ęą°ë‚˜, í”„ëĄœė íŠ¸ė— í•„ėš”í•œ íŒ¨í‚¤ė§€ ëĒŠëĄė„ 따로 파ėŧ로 관ëĻŦí•˜ęŗ  ė‹ļė§€ ė•Šė€ ę˛Ŋ뚰, íŒ¨í‚¤ė§€ëĨŧ 링렑 ė„¤ėš˜í•  ėˆ˜ë„ ėžˆėŠĩ니다. + +/// tip | 팁 + +íŒ¨í‚¤ė§€ ė´ëĻ„ęŗŧ ë˛„ė „ ė •ëŗ´ëĨŧ 파ėŧ뗐 ė •ëĻŦ해두는 것(똈: `requirements.txt` 또는 `pyproject.toml`)ė€ (ë§¤ėš°) ėĸ‹ė€ ėƒę°ėž…ë‹ˆë‹¤. + +/// + +//// tab | `pip` + +
+ +```console +$ pip install "fastapi[standard]" + +---> 100% +``` + +
+ +//// + +//// tab | `uv` + +`uv`ëĨŧ ė‚ŦėšŠí•˜ëŠ” ę˛Ŋ뚰: + +
+ +```console +$ uv pip install "fastapi[standard]" +---> 100% +``` + +
+ +//// + +### `requirements.txt`ė—ė„œ ė„¤ėš˜ + +`requirements.txt` 파ėŧė´ ėžˆë‹¤ëŠ´, ꡸ ė•ˆė— ëĒ…ė‹œëœ íŒ¨í‚¤ė§€ë“¤ė„ 한 ë˛ˆė— ė„¤ėš˜í•  눘 ėžˆėŠĩ니다. + +//// tab | `pip` + +
+ +```console +$ pip install -r requirements.txt +---> 100% +``` + +
+ +//// + +//// tab | `uv` + +`uv`ëĨŧ ė‚ŦėšŠí•˜ëŠ” ę˛Ŋ뚰: + +
+ +```console +$ uv pip install -r requirements.txt +---> 100% +``` + +
+ +//// + +/// details | `requirements.txt` + +ë‹¤ėŒė€ ëLJ 氀맀 íŒ¨í‚¤ė§€ëĨŧ íŦ함한 `requirements.txt`ė˜ ė˜ˆė‹œėž…ë‹ˆë‹¤: + +```requirements.txt +fastapi[standard]==0.113.0 +pydantic==2.8.0 +``` + +/// + +## 프로그램 ė‹¤í–‰ + +ę°€ėƒ 환ę˛Ŋė„ í™œė„ąí™”í•œ í›„ė—ëŠ” í”„ëĄœęˇ¸ëž¨ė„ ė‹¤í–‰í•  눘 ėžˆėŠĩ니다. ė´ë•Œ 해당 ę°€ėƒ 환ę˛Ŋ뗐 ė„¤ėš˜ëœ Pythonęŗŧ íŒ¨í‚¤ė§€ë“¤ė´ ė‚ŦėšŠëŠë‹ˆë‹¤. + +
+ +```console +$ python main.py + +Hello World +``` + +
+ +## ė—ë””í„° 네렕 + +ė—ë””í„°ëĨŧ ė‚ŦėšŠí•  ę˛Ŋ뚰, ė•žė„œ 만든 ę°€ėƒ 환ę˛Ŋė„ ė‚ŦėšŠí•˜ë„ëĄ ė„¤ė •í•˜ëŠ” ę˛ƒė´ ėĸ‹ėŠĩ니다. (대ëļ€ëļ„ė˜ ė—ë””í„°ëŠ” ėžë™ėœŧ로 ę°ė§€í•˜ę¸°ë„ 합니다.) +ė´ë ‡ę˛Œ 하면 ėžë™ ė™„ė„ą 기ëŠĨė´ë‚˜ ėŊ”드 내 똤ëĨ˜ í‘œė‹œ 기ëŠĨė„ ė œëŒ€ëĄœ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. + +ė˜ˆė‹œ: + +* VS Code +* PyCharm + +/// tip | 팁 + +ė´ ė„¤ė •ė€ ëŗ´í†ĩ ę°€ėƒ 환ę˛Ŋė„ **ė˛˜ėŒ ë§Œë“¤ė—ˆė„ 때 한 번만** 해ėŖŧ늴 됩니다. + +/// + +## ę°€ėƒ 환ę˛Ŋ ëš„í™œė„ąí™” + +í”„ëĄœė íŠ¸ ėž‘ė—…ė´ 끝ë‚Ŧ다면, ę°€ėƒ 환ę˛Ŋė„ **ëš„í™œė„ąí™”**할 눘 ėžˆėŠĩ니다. + +
+ +```console +$ deactivate +``` + +
+ +ė´ë ‡ę˛Œ 하면 ė´í›„ė— `python` ëĒ…ë šė–´ëĨŧ ė‹¤í–‰í–ˆė„ 때, ę°€ėƒ 환ę˛Ŋė˜ Pythonė´ë‚˜ ꡸ ė•ˆė— ė„¤ėš˜ëœ íŒ¨í‚¤ė§€ë“¤ė„ ė‚ŦėšŠí•˜ė§€ ė•Šę˛Œ 됩니다. + +## ė´ė œ ėž‘ė—…í•  ė¤€ëš„ę°€ ë˜ė—ˆėŠĩ니다 + +ė´ė œ í”„ëĄœė íŠ¸ ėž‘ė—…ė„ ė‹œėž‘í•  ė¤€ëš„ę°€ ė™„ëŖŒë˜ė—ˆėŠĩ니다. + + +/// tip | 팁 + +ėœ„ ë‚´ėšŠė„ 더 ęšŠė´ ė´í•´í•˜ęŗ  ė‹ļėœŧė‹ ę°€ėš”? + +그렇다면 ęŗ„ė† ėŊė–´ ėŖŧė„¸ėš”. 👇🤓 + +/// + +## ę°€ėƒ 환ę˛Ŋė„ ė™œ ė‚ŦėšŠí•˜ëŠ”ę°€ + +FastAPIëĨŧ ė‚ŦėšŠí•˜ë ¤ëŠ´ ë¨ŧė € Pythonė„ ė„¤ėš˜í•´ė•ŧ 합니다. + +꡸ í›„ė—ëŠ” FastAPI뙀 함ęģ˜ ė‚ŦėšŠí•  **기타 íŒ¨í‚¤ė§€ë“¤**ė„ **ė„¤ėš˜**해ė•ŧ 합니다. + +íŒ¨í‚¤ė§€ëĨŧ ė„¤ėš˜í•  때 ëŗ´í†ĩ Python뗐 ę¸°ëŗ¸ íŦ함된 `pip` ëĒ…ë šė–´(또는 뜠ė‚Ŧ한 도ęĩŦ)ëĨŧ ė‚ŦėšŠí•Šë‹ˆë‹¤. + +í•˜ė§€ë§Œ `pip`ė„ ꡸ëƒĨ 링렑 ė‚ŦėšŠí•˜ëŠ´, 해당 íŒ¨í‚¤ė§€ë“¤ė€ **ė „ė—­ Python 환ę˛Ŋ**(ė‹œėŠ¤í…œ 렄랴뗐 ė„¤ėš˜ëœ Python)뗐 ė„¤ėš˜ëŠë‹ˆë‹¤. + +### ëŦ¸ė œė  + +그렇다면, ė „ė—­ Python 환ę˛Ŋ뗐 íŒ¨í‚¤ė§€ëĨŧ ė„¤ėš˜í•˜ëŠ´ ė–´ë–¤ ëŦ¸ė œę°€ ë°œėƒí• ęšŒėš”? + +ė–´ëŠ ė‹œė ė´ 되늴, **ė„œëĄœ 다ëĨ¸ íŒ¨í‚¤ė§€ë“¤**뗐 ė˜ėĄ´í•˜ëŠ” ė—ŦëŸŦ ę°œė˜ í”„ëĄœęˇ¸ëž¨ė„ ėž‘ė„ąí•˜ę˛Œ 될 ę˛ƒėž…ë‹ˆë‹¤. ꡸ëĻŦęŗ  ė´ë“¤ 뤑 ėŧëļ€ëŠ” **ę°™ė€ íŒ¨í‚¤ė§€ė˜ ė„œëĄœ 다ëĨ¸ ë˛„ė „**ė„ í•„ėš”ëĄœ 할 눘 ėžˆėŠĩ니다. 😱 + +똈ëĨŧ ë“¤ė–´, `마법ė‚Ŧė˜ 돌(philosophers-stone)` í”„ëĄœė íŠ¸ëĨŧ ë§Œë“¤ė—ˆë‹¤ęŗ  ę°€ė •í•´ë´…ė‹œë‹¤. ė´ í”„ëĄœęˇ¸ëž¨ė€ `해ëĻŦ íŦ터(harry)`ëŧ는 íŒ¨í‚¤ė§€ė˜ `v1` ë˛„ė „ė„ **ė˜ėĄ´**합니다. 따ëŧė„œ `harry`ëĨŧ ė„¤ėš˜í•´ė•ŧ 합니다. + +```mermaid +flowchart LR + stone(philosophers-stone) -->|requires| harry-1[harry v1] +``` + +그런데 ë‚˜ė¤‘ė— `ė•„ėĻˆėš´ë°˜ė˜ ėŖ„ėˆ˜(prisoner-of-azkaban)`ė´ëŧ는 또 다ëĨ¸ í”„ëĄœė íŠ¸ëĨŧ 만들게 ë˜ė—ˆęŗ , ė´ í”„ëĄœė íŠ¸ë„ ė—­ė‹œ `harry` íŒ¨í‚¤ė§€ëĨŧ ė‚ŦėšŠí•Šë‹ˆë‹¤. 그런데 ė´ í”„ëĄœė íŠ¸ëŠ” `harry`ė˜ `v3` ë˛„ė „ė´ í•„ėš”í•Šë‹ˆë‹¤. + +```mermaid +flowchart LR + azkaban(prisoner-of-azkaban) --> |requires| harry-3[harry v3] +``` + +í•˜ė§€ë§Œ ė´ė œ ëŦ¸ė œę°€ ėƒęšë‹ˆë‹¤. 로ėģŦ ę°€ėƒ 환ę˛Ŋ ëŒ€ė‹ ė— ė „ė—­ 환ę˛Ŋ뗐 íŒ¨í‚¤ė§€ëĨŧ ė„¤ėš˜í•˜ę˛Œ 되늴, ė–´ë–¤ ë˛„ė „ė˜ `harry`ëĨŧ ė„¤ėš˜í• ė§€ëĨŧ ė„ íƒí•´ė•ŧ 하기 때ëŦ¸ėž…니다. + +똈ëĨŧ ë“¤ė–´, `마법ė‚Ŧė˜ 돌(philosophers-stone)`ė„ ė‹¤í–‰í•˜ęŗ  ė‹ļ다면 ë¨ŧė € `harry` `v1` ë˛„ė „ė„ ë‹¤ėŒęŗŧ ę°™ė´ ė„¤ėš˜ 해ė•ŧ 합니다: + +
+ +```console +$ pip install "harry==1" +``` + +
+ +꡸ëŸŦ늴 결ęĩ­ ė „ė—­ Python 환ę˛Ŋė—ëŠ” `harry` `v1`ë˛„ė „ė´ ė„¤ėš˜ëœ ėƒíƒœę°€ 됩니다. + +```mermaid +flowchart LR + subgraph global[global env] + harry-1[harry v1] + end + subgraph stone-project[philosophers-stone project] + stone(philosophers-stone) -->|requires| harry-1 + end +``` + +í•˜ė§€ë§Œ ė´ė œ `ė•„ėĻˆėš´ë°˜ė˜ ėŖ„ėˆ˜(prisoner-of-azkaban)`ė„ ė‹¤í–‰í•˜ęŗ  ė‹ļ다면, `harry` `v1`ë˛„ė „ė„ ė œęą°í•˜ęŗ  `harry` `v3`ë˛„ė „ė„ ė„¤ėš˜í•´ė•ŧ 합니다. (또는 ë‹¨ėˆœížˆ `v3`ë˛„ė „ė„ ė„¤ėš˜í•˜ëŠ” 것만ėœŧ로도 ę¸°ėĄ´ė˜ `v1`ë˛„ė „ė´ ėžë™ėœŧ로 ė œęą°ëŠë‹ˆë‹¤.) + +
+ +```console +$ pip install "harry==3" +``` + +
+ +그렇게 하면 ė´ė œ ė „ė—­ Python 환ę˛Ŋė—ëŠ” `harry` `v3`ë˛„ė „ė´ ė„¤ėš˜ëœ ėƒíƒœę°€ 됩니다. + +꡸ëĻŦęŗ  ë‹¤ė‹œ `마법ė‚Ŧė˜ 돌(philosophers-stone)`ė„ ė‹¤í–‰í•˜ë ¤ęŗ  하면, **ėž‘ë™í•˜ė§€** ė•Šė„ 눘 ėžˆėŠĩ니다. ė™œëƒí•˜ëŠ´ ė´ í”„ëĄœęˇ¸ëž¨ė€ `harry` `v1`ë˛„ė „ė„ í•„ėš”ëĄœ 하기 때ëŦ¸ėž…니다. + +```mermaid +flowchart LR + subgraph global[global env] + harry-1[harry v1] + style harry-1 fill:#ccc,stroke-dasharray: 5 5 + harry-3[harry v3] + end + subgraph stone-project[philosophers-stone project] + stone(philosophers-stone) -.-x|â›”ī¸| harry-1 + end + subgraph azkaban-project[prisoner-of-azkaban project] + azkaban(prisoner-of-azkaban) --> |requires| harry-3 + end +``` + +/// tip | 팁 + +Python íŒ¨í‚¤ė§€ë“¤ė€ **냈 ë˛„ė „**ė—ė„œ **í˜¸í™˜ė„ą ëŦ¸ė œ(breaking changes)**가 ë°œėƒí•˜ė§€ ė•Šë„ëĄ ėĩœëŒ€í•œ 노ë Ĩ하는 ę˛ƒė´ ėŧë°˜ė ėž…ë‹ˆë‹¤. í•˜ė§€ë§Œ 그래도 ė•ˆė „í•˜ę˛Œ ėž‘ė—…í•˜ë ¤ëŠ´, í…ŒėŠ¤íŠ¸ëĨŧ ė‹¤í–‰í•´ëŗ´ëŠ´ė„œ 냈 ë˛„ė „ė„ ė˜ë„ė ėœŧ로 ė„¤ėš˜í•˜ëŠ” ę˛ƒė´ ėĸ‹ėŠĩ니다. + +/// + +ė´ė œ, ė´ëŸ° ėŧė´ ė—ŦëŸŦëļ„ė˜ **ëĒ¨ë“  í”„ëĄœė íŠ¸**가 ė‚ŦėšŠí•˜ëŠ” **ėˆ˜ë§Žė€ íŒ¨í‚¤ė§€ë“¤**ė—ė„œ ë™ė‹œė— ë°œėƒí•œë‹¤ęŗ  ėƒėƒí•´ëŗ´ė„¸ėš”. ė´ëŠ” ë§¤ėš° 관ëĻŦ하기 ė–´ë ¤ėš°ëŠ°, 결ęĩ­ **ė„œëĄœ í˜¸í™˜ë˜ė§€ ė•ŠëŠ” ë˛„ė „**ė˜ íŒ¨í‚¤ė§€ëĄœ í”„ëĄœė íŠ¸ëĨŧ ė‹¤í–‰í•˜ę˛Œ 될 가ëŠĨė„ąė´ ë†’ęŗ , 그로 ė¸í•´ ė–´ë–¤ ëŦ¸ė œę°€ ė™œ ë°œėƒí•˜ëŠ”ė§€ ė•Œ 눘 ė—†ę˛Œ 될 눘 ėžˆėŠĩ니다. + +또한 ė‚ŦėšŠí•˜ëŠ” 뚴똁랴렜(Linux, Windows, macOS 등)뗐 따ëŧ Pythonė´ **미ëĻŦ ė„¤ėš˜ë˜ė–´ ėžˆė„ ėˆ˜ë„** ėžˆėŠĩ니다. ė´ëŸ° ę˛Ŋėš°ė—ëŠ” ėš´ė˜ė˛´ė œė˜ ë™ėž‘ė— í•„ėš”í•œ íŠšė • ë˛„ė „ė˜ íŒ¨í‚¤ė§€ë“¤ė´ 함ęģ˜ ė„¤ėš˜ë˜ė–´ ėžˆė„ 눘 ėžˆėŠĩ니다. ė´ ėƒíƒœė—ė„œ ė „ė—­ Python 환ę˛Ŋ뗐 ėž„ė˜ė˜ íŒ¨í‚¤ė§€ëĨŧ ė„¤ėš˜í•˜ëŠ´, ėš´ė˜ė˛´ė œė— íŦ함된 프로그램 ėŧëļ€ę°€ **ęš¨ė§ˆ ėœ„í—˜**도 ėžˆėŠĩ니다. + +## íŒ¨í‚¤ė§€ë“¤ė€ ė–´ë””ė— ė„¤ėš˜ë˜ëŠ”ę°€ + +Pythonė„ ė„¤ėš˜í•˜ëŠ´, ėģ´í“¨í„°ė— ė—ŦëŸŦ 디렉터ëĻŦ뙀 파ėŧë“¤ė´ ėƒė„ąëŠë‹ˆë‹¤. + +ė´ 뤑 ėŧëļ€ ë””ë ‰í„°ëĻŦ는 ė‚ŦėšŠėžę°€ ė„¤ėš˜í•œ íŒ¨í‚¤ė§€ë“¤ė„ ëŗ´ę´€í•˜ëŠ” ė—­í• ė„ 합니다. + +똈ëĨŧ ë“¤ė–´, ė•„ëž˜ ëĒ…ë šė–´ëĨŧ ė‹¤í–‰í•˜ëŠ´: + +
+ +```console +// ė§€ę¸ˆ ė‹¤í–‰í•˜ė§€ ė•Šė•„ë„ 됩니다, ꡸ëƒĨ 똈렜ėŧ ëŋė´ė—ėš” 🤓 +$ pip install "fastapi[standard]" +---> 100% +``` + +
+ +해당 ëĒ…ë šė–´ëŠ” FastAPI ėŊ”드ëĨŧ íŦ함한 ė••ėļ• íŒŒėŧė„ ë‹¤ėš´ëĄœë“œí•Šë‹ˆë‹¤. ė´ 파ėŧė€ ëŗ´í†ĩ PyPIė—ė„œ ë°›ė•„ė˜ĩ니다. + +또한 FastAPI가 ė˜ėĄ´í•˜ëŠ” 다ëĨ¸ íŒ¨í‚¤ė§€ë“¤ë„ 함ęģ˜ **ë‹¤ėš´ëĄœë“œ**됩니다. + +꡸ëĻŦęŗ  ꡸ ëĒ¨ë“  파ėŧë“¤ė„ **ė••ėļ• í•´ė œ**한 뒤, ėģ´í“¨í„°ė˜ íŠšė • 디렉터ëĻŦ뗐 ė €ėžĨ합니다. + +ę¸°ëŗ¸ė ėœŧ로 ė´ 파ėŧë“¤ė€ Pythonė´ ė„¤ėš˜ëœ 디렉터ëĻŦ ė•ˆ, ėω **ė „ė—­ 환ę˛Ŋ**뗐 ë‚´ė˜ 디렉터ëĻŦ뗐 ė €ėžĨ됩니다. + +## ę°€ėƒ 환ę˛Ŋė´ëž€ + +ė „ė—­ 환ę˛Ŋ뗐 ëĒ¨ë“  íŒ¨í‚¤ė§€ëĨŧ ė„¤ėš˜í•˜ëŠ´ė„œ ë°œėƒí•˜ëŠ” ëŦ¸ė œė— 대한 í•´ę˛°ėą…ė€, ėž‘ė—…í•˜ëŠ” **각 í”„ëĄœė íŠ¸ë§ˆë‹¤ ę°€ėƒ 환ę˛Ŋ**ė„ ė‚ŦėšŠí•˜ëŠ” ę˛ƒėž…ë‹ˆë‹¤. + +ę°€ėƒ 환ę˛Ŋė€ ė „ė—­ 환ę˛Ŋęŗŧ ë§¤ėš° 뜠ė‚Ŧ한 í•˜ë‚˜ė˜ **디렉터ëĻŦ**ė´ëŠ°, ꡸ ė•ˆė— 해당 í”„ëĄœė íŠ¸ëĨŧ ėœ„í•œ íŒ¨í‚¤ė§€ë“¤ė„ ė„¤ėš˜í•  눘 ėžˆėŠĩ니다. + +ė´ë ‡ę˛Œ 하면 각 í”„ëĄœė íŠ¸ëŠ” ėžė˛´ė ė¸ ę°€ėƒ 환ę˛Ŋ(`.venv` 디렉터ëĻŦ)ė„ ę°€ė§€ę˛Œ 되늰, ꡸ ė•ˆė— 해당 í”„ëĄœė íŠ¸ ė „ėšŠ íŒ¨í‚¤ė§€ë“¤ė„ ëŗ´ėœ í•˜ę˛Œ 됩니다. + + +```mermaid +flowchart TB + subgraph stone-project[philosophers-stone project] + stone(philosophers-stone) --->|requires| harry-1 + subgraph venv1[.venv] + harry-1[harry v1] + end + end + subgraph azkaban-project[prisoner-of-azkaban project] + azkaban(prisoner-of-azkaban) --->|requires| harry-3 + subgraph venv2[.venv] + harry-3[harry v3] + end + end + stone-project ~~~ azkaban-project +``` + +## ę°€ėƒ 환ę˛Ŋ í™œė„ąí™” ė˜ë¯¸ + +ę°€ėƒ 환ę˛Ŋė„ í™œė„ąí™”í•œë‹¤ëŠ” ę˛ƒė€, 똈ëĨŧ ë“¤ė–´ ë‹¤ėŒęŗŧ ę°™ė€ ëĒ…ë šė–´ëĨŧ ė‹¤í–‰í•˜ëŠ” ę˛ƒė„ ė˜ë¯¸í•Šë‹ˆë‹¤: + +//// tab | Linux, macOS + +
+ +```console +$ source .venv/bin/activate +``` + +
+ +//// + +//// tab | Windows PowerShell + +
+ +```console +$ .venv\Scripts\Activate.ps1 +``` + +
+ +//// + +//// tab | Windows Bash + +Windowsė—ė„œ Bash(똈: Git Bash)ëĨŧ ė‚ŦėšŠí•˜ëŠ” ę˛Ŋ뚰: + +
+ +```console +$ source .venv/Scripts/activate +``` + +
+ +//// + +ė´ ëĒ…ë šė–´ëŠ” ė´í›„ė— ė‹¤í–‰ë  ëĒ…ë šė–´ė—ė„œ ė‚ŦėšŠë  [환ę˛Ŋ ëŗ€ėˆ˜](environment-variables.md){.internal-link target=_blank} ëLJ 氜ëĨŧ ėƒė„ąí•˜ęą°ë‚˜ ėˆ˜ė •í•Šë‹ˆë‹¤. + +ė´ ëŗ€ėˆ˜ë“¤ 뤑 하나가 바로 `PATH` ëŗ€ėˆ˜ėž…ë‹ˆë‹¤. + +/// tip | 팁 + +`PATH` 환ę˛Ŋ ëŗ€ėˆ˜ė— 대해 더 ė•Œęŗ  ė‹ļ다면 [환ę˛Ŋ ëŗ€ėˆ˜ ëŦ¸ė„œė˜ PATH 환ę˛Ŋ ëŗ€ėˆ˜ ė„šė…˜](environment-variables.md#path-environment-variable){.internal-link target=_blank}ė„ ė°¸ęŗ í•˜ė„¸ėš”. + +/// + +ę°€ėƒ 환ę˛Ŋė„ í™œė„ąí™”í•˜ëŠ´, ę°€ėƒ 환ę˛Ŋė˜ ę˛ŊëĄœė¸ `.venv/bin` (Linux뙀 macOS) 또는 `.venv\Scripts`(Windows)ëĨŧ `PATH` 환ę˛Ŋ ëŗ€ėˆ˜ė— ėļ”ę°€ëŠë‹ˆë‹¤. + +똈ëĨŧ ë“¤ė–´, ę°€ėƒ 환ę˛Ŋė„ í™œė„ąí™”í•˜ę¸° ė „ė˜ `PATH` ëŗ€ėˆ˜ëŠ” ë‹¤ėŒęŗŧ ę°™ė•˜ë‹¤ęŗ  ę°€ė •í•´ë´…ė‹œë‹¤: + +//// tab | Linux, macOS + +```plaintext +/usr/bin:/bin:/usr/sbin:/sbin +``` + +ė‹œėŠ¤í…œė€ ë‹¤ėŒ ę˛ŊëĄœë“¤ė—ė„œ í”„ëĄœęˇ¸ëž¨ė„ ė°žę˛Œ 됩니다: + +* `/usr/bin` +* `/bin` +* `/usr/sbin` +* `/sbin` + +//// + +//// tab | Windows + +```plaintext +C:\Windows\System32 +``` + +ė‹œėŠ¤í…œė€ ë‹¤ėŒ ę˛ŊëĄœë“¤ė—ė„œ í”„ëĄœęˇ¸ëž¨ė„ ė°žę˛Œ 됩니다: + +* `C:\Windows\System32` + +//// + +ę°€ėƒ 환ę˛Ŋė„ í™œė„ąí™”í•œ í›„ė—ëŠ”, `PATH` ëŗ€ėˆ˜ëŠ” ë‹¤ėŒęŗŧ ę°™ė€ 형태가 됩니다: + +//// tab | Linux, macOS + +```plaintext +/home/user/code/awesome-project/.venv/bin:/usr/bin:/bin:/usr/sbin:/sbin +``` + +ė‹œėŠ¤í…œė€ 가ėžĨ ë¨ŧė € ë‹¤ėŒ ę˛ŊëĄœė—ė„œ í”„ëĄœęˇ¸ëž¨ė„ ė°žę¸° ė‹œėž‘í•Šë‹ˆë‹¤: + +```plaintext +/home/user/code/awesome-project/.venv/bin +``` + +꡸ í›„ė— 다ëĨ¸ 디렉터ëĻŦë“¤ė„ íƒėƒ‰í•Šë‹ˆë‹¤. + +따ëŧė„œ í„°ë¯¸ë„ė— `python`ė„ ėž…ë Ĩ하면, ė‹œėŠ¤í…œė€ ë‹¤ėŒ ėœ„ėš˜ė— ėžˆëŠ” Python í”„ëĄœęˇ¸ëž¨ė„ ė°žę˛Œ 됩니다: + +```plaintext +/home/user/code/awesome-project/.venv/bin/python +``` + +꡸ëĻŦęŗ  해당 Pythonė„ ė‚ŦėšŠí•˜ę˛Œ 됩니다. + +//// + +//// tab | Windows + +```plaintext +C:\Users\user\code\awesome-project\.venv\Scripts;C:\Windows\System32 +``` + +ė‹œėŠ¤í…œė€ 가ėžĨ ë¨ŧė € ë‹¤ėŒ ę˛ŊëĄœė—ė„œ í”„ëĄœęˇ¸ëž¨ė„ ė°žę¸° ė‹œėž‘í•Šë‹ˆë‹¤: + +```plaintext +C:\Users\user\code\awesome-project\.venv\Scripts +``` + +꡸ í›„ė— 다ëĨ¸ 디렉터ëĻŦë“¤ė„ íƒėƒ‰í•Šë‹ˆë‹¤. + +따ëŧė„œ í„°ë¯¸ë„ė— `python`ė„ ėž…ë Ĩ하면, ė‹œėŠ¤í…œė€ ë‹¤ėŒ ę˛ŊëĄœė— ėžˆëŠ” Python í”„ëĄœęˇ¸ëž¨ė„ ė°žę˛Œ 됩니다: + +```plaintext +C:\Users\user\code\awesome-project\.venv\Scripts\python +``` + +꡸ëĻŦęŗ  해당 Pythonė„ ė‚ŦėšŠí•˜ę˛Œ 됩니다. + +//// + +ė¤‘ėš”í•œ 넏ëļ€ ė‚Ŧ항 뤑 하나는, ę°€ėƒ 환ę˛Ŋė˜ ę˛Ŋ로가 `PATH` ëŗ€ėˆ˜ė˜ 가ėžĨ **ė•ž**뗐 ėļ”ę°€ëœë‹¤ëŠ” ė ėž…ë‹ˆë‹¤. ė‹œėŠ¤í…œė€ ė‚ŦėšŠ 가ëŠĨ한 다ëĨ¸ Pythonë“¤ëŗ´ë‹¤ **ë¨ŧė €** ė´ ę˛Ŋ로ëĨŧ ė°žėŠĩ니다. ęˇ¸ëž˜ė„œ í„°ë¯¸ë„ė—ė„œ `python`ė„ ė‹¤í–‰í•˜ëŠ´, ė „ė—­ 환ę˛Ŋė˜ Pythonė´ ė•„ë‹Œ **ę°€ėƒ 환ę˛Ŋ뗐 ėžˆëŠ”** Pythonė´ ė‚ŦėšŠëŠë‹ˆë‹¤. (똈: ė „ė—­ 환ę˛Ŋ뗐 ė„¤ėš˜ëœ `python`ė´ ėžˆë”ëŧ도 ęˇ¸ëŗ´ë‹¤ ėš°ė„ í•Šë‹ˆë‹¤.) + +ę°€ėƒ 환ę˛Ŋė„ í™œė„ąí™”í•˜ëŠ´ ė´ ė™¸ė—ë„ ëLJ 氀맀 다ëĨ¸ ę˛ƒë“¤ė´ ëŗ€ę˛Ŋë˜ė§€ë§Œ, ė´ëŠ” ęˇ¸ė¤‘ė—ė„œë„ 가ėžĨ ė¤‘ėš”í•œ ëŗ€í™” 뤑 í•˜ë‚˜ėž…ë‹ˆë‹¤. + +## ę°€ėƒ 환ę˛Ŋ í™•ė¸í•˜ę¸° + +ę°€ėƒ 환ę˛Ŋė´ í™œė„ąí™” ë˜ė—ˆëŠ”ė§€ í™•ė¸í•˜ë ¤ëŠ´, ė•„ëž˜ ëĒ…ë šė–´ëĨŧ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다: + +//// tab | Linux, macOS, Windows Bash + +
+ +```console +$ which python + +/home/user/code/awesome-project/.venv/bin/python +``` + +
+ +//// + +//// tab | Windows PowerShell + +
+ +```console +$ Get-Command python + +C:\Users\user\code\awesome-project\.venv\Scripts\python +``` + +
+ +//// + +ėω, 현ėžŦ ė‚ŦėšŠë˜ëŠ” `python` í”„ëĄœęˇ¸ëž¨ė€ **ę°€ėƒ 환ę˛Ŋ 내ëļ€ė— ėžˆëŠ” 것**ėž…ë‹ˆë‹¤. + +Linux뙀 macOSė—ė„œëŠ” `which`, Windows PowerShellė—ė„œëŠ” `Get-Command` ëĒ…ë šė–´ëĨŧ ė‚ŦėšŠí•Šë‹ˆë‹¤. + +ė´ ëĒ…ë šė–´ëŠ” `PATH` 환ę˛Ŋ ëŗ€ėˆ˜ė— ė§€ė •ëœ ę˛ŊëĄœë“¤ė„ **ėˆœė„œëŒ€ëĄœ íƒėƒ‰**í•˜ëŠ´ė„œ `python`ė´ëŧ는 ė´ëĻ„ė˜ í”„ëĄœęˇ¸ëž¨ė„ ė°žėŠĩ니다. +ė°žëŠ” ėĻ‰ė‹œ, 해당 í”„ëĄœęˇ¸ëž¨ė˜ **ę˛Ŋ로ëĨŧ ėļœë Ĩ**합니다. + +ė¤‘ėš”í•œ ė ė€ í„°ë¯¸ë„ė—ė„œ `python`ė„ ė‹¤í–‰í–ˆė„ 때, ė‹¤ė œëĄœ ė‹¤í–‰ë˜ëŠ” "`python`"ė´ ė–´ë–¤ ę˛ƒė¸ė§€ ė •í™•ížˆ ė•Œ 눘 ėžˆë‹¤ëŠ” ę˛ƒėž…ë‹ˆë‹¤. + +따ëŧė„œ 현ėžŦ ė˜Ŧ바ëĨ¸ ę°€ėƒ 환ę˛Ŋ뗐 ėžˆëŠ”ė§€ í™•ė¸í•  눘 ėžˆėŠĩ니다. + +/// tip | 팁 + +í•˜ë‚˜ė˜ ę°€ėƒ 환ę˛Ŋė„ í™œė„ąí™”í•œ 뒤, 해당 Pythonė„ 氀맄 ėƒíƒœė—ė„œ **또 다ëĨ¸ í”„ëĄœė íŠ¸**로 ė´ë™í•˜ëŠ” ę˛ƒė€ 흔히 ë°œėƒí•Šë‹ˆë‹¤. + +í•˜ė§€ë§Œ ė´ë•Œ ė´ė „ í”„ëĄœė íŠ¸ė˜ ę°€ėƒ 환ę˛Ŋ뗐 ėžˆëŠ” **ėž˜ëĒģ된 Python ė‹¤í–‰ 파ėŧ**ė„ ė‚ŦėšŠí•˜ę˛Œ ë˜ė–´ 냈 í”„ëĄœė íŠ¸ę°€ **ė •ėƒ ėž‘ë™í•˜ė§€ ė•Šė„ 눘 ėžˆėŠĩ니다.** + +ęˇ¸ëž˜ė„œ 현ėžŦ ė–´ë–¤ `python`ė´ ė‚ŦėšŠë˜ęŗ  ėžˆëŠ”ė§€ í™•ė¸í•  눘 ėžˆëŠ” ëŠĨë Ĩė€ ë§¤ėš° ėœ ėšŠí•Šë‹ˆë‹¤. 🤓 + +/// + +## ę°€ėƒ 환ę˛Ŋė„ ëš„í™œė„ąí™”í•˜ëŠ” ė´ėœ  + +똈ëĨŧ ë“¤ė–´ `마법ė‚Ŧė˜ 돌(philosophers-stone)`ė´ëŧ는 í”„ëĄœė íŠ¸ė—ė„œ ėž‘ė—… ė¤‘ė´ëŧęŗ  í•´ëŗ´ę˛ ėŠĩ니다. ė´ë•Œ 해당 **ę°€ėƒ 환ę˛Ŋė„ í™œė„ąí™”**í•˜ęŗ , í•„ėš”í•œ íŒ¨í‚¤ė§€ëĨŧ ė„¤ėš˜í•˜ëŠ° ėž‘ė—…ė„ ė§„í–‰í•Šë‹ˆë‹¤. + +그런데 ė´ė œëŠ” **다ëĨ¸ í”„ëĄœė íŠ¸**ė¸ `ė•„ėĻˆėš´ë°˜ė˜ ėŖ„ėˆ˜(prisoner-of-azkaban)`ė„ ėž‘ė—…í•˜ęŗ  ė‹ļė–´ėĄŒėŠĩ니다. + +ęˇ¸ëž˜ė„œ ꡸ í”„ëĄœė íŠ¸ 디렉터ëĻŦ로 ė´ë™í•Šë‹ˆë‹¤: + +
+ +```console +$ cd ~/code/prisoner-of-azkaban +``` + +
+ +만ė•Ŋ `마법ė‚Ŧė˜ 돌(philosophers-stone)`ė˜ ę°€ėƒ 환ę˛Ŋė„ ëš„í™œė„ąí™”í•˜ė§€ ė•Šė•˜ë‹¤ëŠ´, í„°ë¯¸ë„ė—ė„œ `python`ė„ ė‹¤í–‰í•  때 ė—Ŧė „ížˆ `마법ė‚Ŧė˜ 돌(philosophers-stone)` ę°€ėƒ 환ę˛Ŋė˜ Pythonė„ ė‚ŦėšŠí•˜ę˛Œ 됩니다. + +
+ +```console +$ cd ~/code/prisoner-of-azkaban + +$ python main.py + +// siriusëĨŧ ėž„íŦ트하는 데 ė‹¤íŒ¨í–ˆėŠĩ니다. ė„¤ėš˜ë˜ė–´ ėžˆė§€ ė•Šė•„ėš” 😱 +Traceback (most recent call last): + File "main.py", line 1, in + import sirius +``` + +
+ +í•˜ė§€ë§Œ `마법ė‚Ŧė˜ 돌(philosophers-stone)`ė˜ ę°€ėƒ 환ę˛Ŋė„ ëš„í™œė„ąí™”í•œ ë‹¤ėŒ, `ė•„ėĻˆėš´ë°˜ė˜ ėŖ„ėˆ˜(prisoner-of-azkaban)` í”„ëĄœė íŠ¸ė˜ ę°€ėƒ 환ę˛Ŋė„ í™œė„ąí™”í•˜ëŠ´, ė´ė œ `python` ëĒ…ë šė–´ëŠ” `ė•„ėĻˆėš´ë°˜ė˜ ėŖ„ėˆ˜(prisoner-of-azkaban)` ę°€ėƒ 환ę˛Ŋė˜ Pythonė„ ė‚ŦėšŠí•˜ę˛Œ 됩니다. + +
+ +```console +$ cd ~/code/prisoner-of-azkaban + +// ė´ė „ 디렉터ëĻŦ뗐 ėžˆė„ í•„ėš” ė—†ė´, ė–´ë””ė„œë“  ę°€ėƒ 환ę˛Ŋė„ ëš„í™œė„ąí™”í•  눘 ėžˆėŠĩ니다. 다ëĨ¸ í”„ëĄœė íŠ¸ 디렉터ëĻŦ로 ė´ë™í•œ í›„ė—ë„ ę´œė°Žė•„ėš” 😎 +$ deactivate + +// prisoner-of-azkaban/.venv ę°€ėƒ 환ę˛Ŋė„ í™œė„ąí™”í•Šë‹ˆë‹¤ 🚀 +$ source .venv/bin/activate + +// ė´ė œ pythonė„ ė‹¤í–‰í•˜ëŠ´, ė´ ę°€ėƒ 환ę˛Ŋ뗐 ė„¤ėš˜ëœ sirius íŒ¨í‚¤ė§€ëĨŧ ė°žę˛Œ 됩니다 ✨ +$ python main.py + +ëĒģ된 ė§“ė„ ęž¸ë¯¸ęŗ  ėžˆėŒė„ ė—„ėˆ™ížˆ ë§šė„¸í•Šë‹ˆë‹¤.🧙 +ImportError는 ė´ė œ ė—†ėŠĩ니다. đŸē +``` + +
+ +## ëŒ€ė•ˆë“¤ + +ė´ ëŦ¸ė„œëŠ” ė—ŦëŸŦëļ„ė´ Python í”„ëĄœė íŠ¸ëĨŧ ė‹œėž‘í•˜ęŗ , **꡸ 내ëļ€ė—ė„œ** ė–´ë–ģ枌 ëŒė•„ę°€ëŠ”ė§€ ė•Œë ¤ėŖŧ는 간단한 ę°€ė´ë“œėž…ë‹ˆë‹¤. + +ę°€ėƒ 환ę˛Ŋ, íŒ¨í‚¤ė§€ ė˜ėĄ´ė„ą(Requirements), í”„ëĄœė íŠ¸ëĨŧ 관ëĻŦ하는 ë°Šë˛•ė—ëŠ” ė´ ė™¸ė—ë„ ë‹¤ė–‘í•œ **ëŒ€ė•ˆ**ë“¤ė´ ėĄ´ėžŦ합니다. + +만ė•Ŋ ė¤€ëš„ę°€ ë˜ė—ˆë‹¤ëŠ´, **í”„ëĄœė íŠ¸ 렄랴**, íŒ¨í‚¤ė§€ ė˜ėĄ´ė„ą, ę°€ėƒ 환ę˛Ŋ ë“ąė„ í†ĩí•Šė ėœŧ로 **관ëĻŦ**할 눘 ėžˆëŠ” 도ęĩŦëĨŧ ė¨ëŗ´ëŠ” 것도 ėĸ‹ėŠĩ니다. 그럴 때 ėļ”ė˛œí•˜ëŠ” 도ęĩŦ가 바로 uvėž…ë‹ˆë‹¤. + +`uv`는 ë‹¤ė–‘í•œ 기ëŠĨė„ ė§€ė›í•Šë‹ˆë‹¤: + +* ë‹¤ė–‘í•œ ë˛„ė „ė˜ **Python ė„¤ėš˜** +* 각 í”„ëĄœė íŠ¸ ëŗ„ **ę°€ėƒ 환ę˛Ŋ 관ëĻŦ** +* **íŒ¨í‚¤ė§€ ė„¤ėš˜** +* í”„ëĄœė íŠ¸ė˜ **ė˜ėĄ´ė„ąęŗŧ ë˛„ė „** 관ëĻŦ +* ė„¤ėš˜ëœ íŒ¨í‚¤ė§€ë“¤ęŗŧ ꡸ ë˛„ė „ė„ **ė •í™•ížˆ ęŗ ė •(lock)**í•´ė„œ,개발 환ę˛Ŋęŗŧ 뚴똁 환ę˛Ŋė´ ė™„ė „ížˆ 동ėŧ하게 ėž‘ë™í•  눘 ėžˆë„ëĄ ëŗ´ėžĨ +* ė´ ė™¸ė—ë„ ë‹¤ė–‘í•œ 기ëŠĨė„ 맀뛐 + +## 결률 + +ė—Ŧę¸°ęšŒė§€ ëĒ¨ë‘ ėŊęŗ  ė´í•´í–ˆë‹¤ëŠ´, ė´ė œ ë§Žė€ ę°œë°œėžë“¤ëŗ´ë‹¤ ę°€ėƒ 환ę˛Ŋė„ **훨ė”Ŧ 더 ęšŠė´ ėžˆę˛Œ ė´í•´**하게 ë˜ė…¨ėŠĩ니다. 🤓 + +ė´ëŸ° 넏ëļ€ė ė¸ ë‚´ėšŠė„ ė•Œęŗ  ėžˆėœŧ늴, 떏렠氀 ëŗĩėžĄí•´ ëŗ´ė´ëŠ” ëŦ¸ė œëĨŧ 디버깅할 때 ëļ„ëĒ…ížˆ 큰 ë„ė›€ė´ 될 ę˛ƒėž…ë‹ˆë‹¤. ė´ė œëŠ” **ė´ ëĒ¨ë“  ę˛ƒë“¤ė´ 내ëļ€ė—ė„œ ė–´ë–ģ枌 ėž‘ë™í•˜ëŠ”ė§€** ė•Œęŗ  ėžˆę¸° 때ëŦ¸ėž…니다. 😎 diff --git a/docs/pt/docs/advanced/generate-clients.md b/docs/pt/docs/advanced/generate-clients.md index 04d7c0071..dc6b29511 100644 --- a/docs/pt/docs/advanced/generate-clients.md +++ b/docs/pt/docs/advanced/generate-clients.md @@ -22,7 +22,7 @@ E isso mostra o verdadeiro compromisso deles com o FastAPI e sua **comunidade** Por exemplo, vocÃĒ pode querer experimentar: -* Speakeasy +* Speakeasy * Stainless * liblab diff --git a/docs/pt/docs/async.md b/docs/pt/docs/async.md index 0d6bdbf0e..4425eba77 100644 --- a/docs/pt/docs/async.md +++ b/docs/pt/docs/async.md @@ -40,7 +40,7 @@ def results(): --- -Se sua aplicaÃ§ÃŖo (de alguma forma) nÃŖo tem que se comunicar com nada mais e tem que esperar que o respondam, use `async def`. +Se sua aplicaÃ§ÃŖo (de alguma forma) nÃŖo tem que se comunicar com nada mais e esperar que o respondam, use `async def`. --- @@ -52,7 +52,7 @@ Se vocÃĒ simplesmente nÃŖo sabe, use apenas `def`. De qualquer forma, em ambos os casos acima, FastAPI irÃĄ trabalhar assincronamente e ser extremamente rÃĄpido. -Seguindo os passos acima, ele serÃĄ capaz de fazer algumas otimizaçÃĩes de performance. +Mas, seguindo os passos acima, ele serÃĄ capaz de fazer algumas otimizaçÃĩes de performance. ## Detalhes TÊcnicos @@ -66,36 +66,36 @@ Vamos ver aquela frase por partes na seÃ§ÃŖo abaixo: ## CÃŗdigo assíncrono -CÃŗdigo assíncrono apenas significa que a linguagem đŸ’Ŧ tem um jeito de dizer para o computador / programa 🤖 que em certo ponto, ele 🤖 terÃĄ que esperar por *algo* para finalizar em outro lugar. Vamos dizer que esse *algo* seja chamado "arquivo lento" 📝. +CÃŗdigo assíncrono apenas significa que a linguagem đŸ’Ŧ tem um jeito de dizer para o computador / programa 🤖 que em certo ponto do cÃŗdigo, ele 🤖 terÃĄ que esperar *algo* finalizar em outro lugar. Vamos dizer que esse *algo* seja chamado "arquivo lento" 📝. -EntÃŖo, durante esse tempo, o computador pode ir e fazer outro trabalho, enquanto o "arquivo lento" 📝 termine. +EntÃŖo, durante esse tempo, o computador pode ir e fazer outro trabalho, enquanto o "arquivo lento" 📝 termina. -EntÃŖo o computador / programa 🤖 irÃĄ voltar toda hora que tiver uma chance porquÃĒ ele ainda estÃĄ esperando o "arquivo lento", ou ele 🤖 nunca irÃĄ terminar todo o trabalho que tem atÊ esse ponto. E ele 🤖 irÃĄ ver se alguma das tarefas que estava esperando jÃĄ terminaram, fazendo o que quer que tinham que fazer. +EntÃŖo o computador / programa 🤖 irÃĄ voltar sempre que tiver uma chance, seja porque ele estÃĄ esperando novamente, ou quando ele 🤖 terminar todo o trabalho que tem atÊ esse ponto. E ele 🤖 irÃĄ ver se alguma das tarefas que estava esperando jÃĄ terminaram de fazer o que quer que tinham que fazer. -Depois, ele 🤖 pega a primeira tarefa para finalizar (vamos dizer, nosso "arquivo lento" 📝) e continua o que ele tem que fazer com isso. +Depois, ele 🤖 pega a primeira tarefa para finalizar (vamos dizer, nosso "arquivo lento" 📝) e continua o que tem que fazer com ela. -Esse "esperar por algo" normalmente se refere a operaçÃĩes I/O que sÃŖo relativamente "lentas" (comparadas a velocidade do processador e da memÃŗria RAM), como esperar por: +Esse "esperar por algo" normalmente se refere a operaçÃĩes I/O que sÃŖo relativamente "lentas" (comparadas à velocidade do processador e da memÃŗria RAM), como esperar por: * dados do cliente para serem enviados atravÊs da rede -* dados enviados pelo seu programa para serem recebidos pelo clente atravÊs da rede -* conteÃēdo de um arquivo no disco pra ser lido pelo sistema e entregar ao seu programa +* dados enviados pelo seu programa serem recebidos pelo clente atravÊs da rede +* conteÃēdo de um arquivo no disco ser lido pelo sistema e entregue ao seu programa * conteÃēdo que seu programa deu ao sistema para ser escrito no disco -* uma operaÃ§ÃŖo remota API -* uma operaÃ§ÃŖo no banco de dados para finalizar -* uma solicitaÃ§ÃŖo no banco de dados esperando o retorno do resultado +* uma operaÃ§ÃŖo em uma API remota +* uma operaÃ§ÃŖo no banco de dados finalizar +* uma solicitaÃ§ÃŖo no banco de dados retornar o resultado * etc. -Enquanto o tempo de execuÃ§ÃŖo Ê consumido mais pela espera das operaçÃĩes I/O, essas operaçÃĩes sÃŖo chamadas de operaçÃĩes "limitadas por I/O". +Quanto o tempo de execuÃ§ÃŖo Ê consumido majoritariamente pela espera de operaçÃĩes I/O, essas operaçÃĩes sÃŖo chamadas operaçÃĩes "limitadas por I/O". -Isso Ê chamado de "assíncrono" porquÃĒ o computador / programa nÃŖo tem que ser "sincronizado" com a tarefa lenta, esperando pelo exato momento que a tarefa finalize, enquanto nÃŖo faz nada, para ser capaz de pegar o resultado da tarefa e dar continuidade ao trabalho. +Isso Ê chamado de "assíncrono" porque o computador / programa nÃŖo tem que ser "sincronizado" com a tarefa lenta, esperando pelo momento exato em que a tarefa finaliza, enquanto nÃŖo faz nada, para ser capaz de pegar o resultado da tarefa e dar continuidade ao trabalho. -Ao invÊs disso, sendo um sistema "assíncrono", uma vez finalizada, a tarefa pode esperar um pouco (alguns microssegundos) para que o computador / programa finalize o que quer que esteja fazendo,e entÃŖo volte para pegar o resultado e continue trabalhando com ele. +Ao invÊs disso, sendo um sistema "assíncrono", uma vez finalizada, a tarefa pode esperar na fila um pouco (alguns microssegundos) para que o computador / programa finalize o que quer que esteja fazendo, e entÃŖo volte para pegar o resultado e continue trabalhando com ele. -Para "síncrono" (contrÃĄrio de "assíncrono") tambÊm Ê utilizado o termo "sequencial", porquÃĒ o computador / programa segue todos os passos, na sequÃĒncia, antes de trocar para uma tarefa diferente, mesmo se alguns passos envolvam esperar. +Para "síncrono" (contrÃĄrio de "assíncrono") tambÊm Ê utilizado o termo "sequencial", porquÃĒ o computador / programa segue todos os passos, em sequÃĒncia, antes de trocar para uma tarefa diferente, mesmo se alguns passos envolvam esperar. ### ConcorrÃĒncia e hambÃērgueres -Essa idÊia de cÃŗdigo **assíncrono** descrito acima Ê algo às vezes chamado de **"concorrÃĒncia"**. E Ê diferente de **"paralelismo"**. +Essa idÊia de cÃŗdigo **assíncrono** descrita acima Ê às vezes chamado de **"concorrÃĒncia"**. Isso Ê diferente de **"paralelismo"**. **ConcorrÃĒncia** e **paralelismo** ambos sÃŖo relacionados a "diferentes coisas acontecendo mais ou menos ao mesmo tempo". @@ -105,117 +105,115 @@ Para ver essa diferença, imagine a seguinte histÃŗria sobre hambÃērgueres: ### HambÃērgueres concorrentes -VocÃĒ vai com seu _crush_ :heart_eyes: na lanchonete, fica na fila enquanto o caixa pega os pedidos das pessoas na sua frente. +VocÃĒ vai com seu _crush_ na lanchonete, e fica na fila enquanto o caixa pega os pedidos das pessoas na sua frente. 😍 -EntÃŖo chega a sua vez, vocÃĒ pede dois saborosos hambÃērgueres para vocÃĒ e seu _crush_ :heart_eyes:. +EntÃŖo chega a sua vez, vocÃĒ pede dois saborosos hambÃērgueres para vocÃĒ e seu _crush_. 🍔🍔 -VocÃĒ paga. +O caixa diz alguma coisa para o cozinheiro na cozinha para que eles saivam que tÃĒm que preparar seus hambÃērgueres (mesmo que ele esteja atualmente preparando os lanches dos outros clientes). -O caixa diz alguma coisa para o cara na cozinha para que ele tenha que preparar seus hambÃērgueres (mesmo embora ele esteja preparando os lanches dos outros clientes). +VocÃĒ paga. 💸 O caixa te entrega seu nÃēmero de chamada. -Enquanto vocÃĒ espera, vocÃĒ vai com seu _crush_ :heart_eyes: e pega uma mesa, senta e conversa com seu _crush_ :heart_eyes: por um bom tempo (como seus hambÃērgueres sÃŖo muito saborosos, leva um tempo para serem preparados). +Enquanto vocÃĒ espera, vocÃĒ vai com seu _crush_ e pega uma mesa, senta e conversa com seu _crush_ por um bom tempo (jÃĄ que seus hambÃērgueres sÃŖo muito saborosos, e leva um tempo para serem preparados). -Enquanto vocÃĒ estÃĄ sentado na mesa com seu _crush_ :heart_eyes:, esperando os hambÃērgueres, vocÃĒ pode gastar o tempo admirando como lindo, maravilhoso e esperto Ê seu _crush_ :heart_eyes:. +JÃĄ que vocÃĒ estÃĄ sentado na mesa com seu _crush_, esperando os hambÃērgueres, vocÃĒ pode passar esse tempo admirando o quÃŖo lindo, maravilhoso e esperto Ê seu _crush_ ✨😍✨. -Enquanto espera e conversa com seu _crush_ :heart_eyes:, de tempos em tempos, vocÃĒ verifica o nÃēmero de chamada exibido no balcÃŖo para ver se jÃĄ Ê sua vez. +Enquanto espera e conversa com seu _crush_, de tempos em tempos, vocÃĒ verifica o nÃēmero da chamada exibido no balcÃŖo para ver se jÃĄ Ê sua vez. -EntÃŖo a certo ponto, Ê finalmente sua vez. VocÃĒ vai no balcÃŖo, pega seus hambÃērgueres e volta para a mesa. +EntÃŖo em algum momento, Ê finalmente sua vez. VocÃĒ vai ao balcÃŖo, pega seus hambÃērgueres e volta para a mesa. -VocÃĒ e seu _crush_ :heart_eyes: comem os hambÃērgueres e aproveitam o tempo. +VocÃĒ e seu _crush_ comem os hambÃērgueres e aproveitam o tempo. ✨ --- -Imagine que vocÃĒ seja o computador / programa nessa histÃŗria. +Imagine que vocÃĒ seja o computador / programa nessa histÃŗria. -Enquanto vocÃĒ estÃĄ na fila, tranquilo, esperando por sua vez, nÃŖo estÃĄ fazendo nada "produtivo". Mas a fila Ê rÃĄpida porquÃĒ o caixa sÃŗ estÃĄ pegando os pedidos, entÃŖo estÃĄ tudo bem. +Enquanto vocÃĒ estÃĄ na fila, vocÃĒ estÃĄ somente ocioso 😴, esperando por sua vez, sem fazer nada muito "produtivo". Mas a fila Ê rÃĄpida porque o caixa sÃŗ estÃĄ pegando os pedidos (nÃŖo os preparando), entÃŖo estÃĄ tudo bem. -EntÃŖo, quando Ê sua vez, vocÃĒ faz o trabalho "produtivo" de verdade, vocÃĒ processa o menu, decide o que quer, pega a escolha de seu _crush_ :heart_eyes:, paga, verifica se entregou o valor correto em dinheiro ou cartÃŖo de crÊdito, verifica se foi cobrado corretamente, verifica se seu pedido estÃĄ correto etc. +EntÃŖo, quando Ê sua vez, vocÃĒ faz trabalho realmente "produtivo", vocÃĒ processa o menu, decide o que quer, pega a escolha de seu _crush_, paga, verifica se entregou o cartÃŖo ou a cÊdula correta, verifica se foi cobrado corretamente, verifica se seu pedido estÃĄ correto etc. -Mas entÃŖo, embora vocÃĒ ainda nÃŖo tenha os hambÃērgueres, seu trabalho no caixa estÃĄ "pausado", porquÃĒ vocÃĒ tem que esperar seus hambÃērgueres estarem prontos. +Mas entÃŖo, embora vocÃĒ ainda nÃŖo tenha os hambÃērgueres, seu trabalho no caixa estÃĄ "pausado" ⏸, porque vocÃĒ tem que esperar 🕙 seus hambÃērgueres ficarem prontos. -Mas enquanto vocÃĒ se afasta do balcÃŖo e senta na mesa com o nÃēmero da sua chamada, vocÃĒ pode trocar sua atenÃ§ÃŖo para seu _crush_ :heart_eyes:, e "trabalhar" nisso. EntÃŖo vocÃĒ estÃĄ novamente fazendo algo muito "produtivo", como flertar com seu _crush_ :heart_eyes:. +Contudo, à medida que vocÃĒ se afasta do balcÃŖo e senta na mesa, com um nÃēmero para sua chamada, vocÃĒ pode trocar 🔀 sua atenÃ§ÃŖo para seu _crush_, e "trabalhar" ⏯ 🤓 nisso. EntÃŖo vocÃĒ estÃĄ novamente fazendo algo muito "produtivo", como flertar com seu _crush_ 😍. -EntÃŖo o caixa diz que "seus hambÃērgueres estÃŖo prontos" colocando seu nÃēmero no balcÃŖo, mas vocÃĒ nÃŖo corre que nem um maluco imediatamente quando o nÃēmero exibido Ê o seu. VocÃĒ sabe que ninguÊm irÃĄ roubar seus hambÃērgueres porquÃĒ vocÃĒ tem o nÃēmero de chamada, e os outros tem os nÃēmeros deles. +EntÃŖo o caixa 💁 diz que "seus hambÃērgueres estÃŖo prontos" colocando seu nÃēmero no balcÃŖo, mas vocÃĒ nÃŖo corre que nem um maluco imediatamente quando o nÃēmero exibido Ê o seu. VocÃĒ sabe que ninguÊm irÃĄ roubar seus hambÃērgueres porque vocÃĒ tem o seu nÃēmero da chamada, e os outros tÃĒm os deles. -EntÃŖo vocÃĒ espera que seu _crush_ :heart_eyes: termine a histÃŗria que estava contando (terminar o trabalho atual / tarefa sendo processada), sorri gentilmente e diz que vocÃĒ estÃĄ indo buscar os hambÃērgueres. +EntÃŖo vocÃĒ espera seu _crush_ terminar a histÃŗria que estava contando (terminar o trabalho atual ⏯ / tarefa sendo processada 🤓), sorri gentilmente e diz que vocÃĒ estÃĄ indo buscar os hambÃērgueres. -EntÃŖo vocÃĒ vai no balcÃŖo, para a tarefa inicial que agora estÃĄ finalizada, pega os hambÃērgueres, e leva para a mesa. Isso finaliza esse passo / tarefa da interaÃ§ÃŖo com o balcÃŖo. Agora Ê criada uma nova tarefa, "comer hambÃērgueres", mas a tarefa anterior, "pegar os hambÃērgueres" jÃĄ estÃĄ finalizada. +EntÃŖo vocÃĒ vai ao balcÃŖo 🔀, para a tarefa inicial que agora estÃĄ finalizada⏯, pega os hambÃērgueres, agradece, e leva-os para a mesa. Isso finaliza esse passo / tarefa da interaÃ§ÃŖo com o balcÃŖo ⏚. Isso, por sua vez, cria uma nova tarefa, a de "comer hambÃērgueres" 🔀 ⏯, mas a tarefa anterior de "pegar os hambÃērgueres" jÃĄ estÃĄ finalizada ⏚. ### HambÃērgueres paralelos -VocÃĒ vai com seu _crush_ :heart_eyes: em uma lanchonete paralela. +Agora vamos imaginar que esses nÃŖo sÃŖo "HambÃērgueres Concorrentes", e sim "HambÃērgueres Paralelos" -VocÃĒ fica na fila enquanto alguns (vamos dizer 8) caixas pegam os pedidos das pessoas na sua frente. +VocÃĒ vai com seu _crush_ na lanchonete paralela. -Todo mundo antes de vocÃĒ estÃĄ esperando pelos hambÃērgueres estarem prontos antes de deixar o caixa porquÃĒ cada um dos 8 caixas vai e prepara o hambÃērguer antes de pegar o prÃŗximo pedido. +VocÃĒ fica na fila enquanto vÃĄrios (vamos dizer 8) caixas que tambÊm sÃŖo cozinheiros pegam os pedidos das pessoas na sua frente. -EntÃŖo Ê finalmente sua vez, e pede 2 hambÃērgueres muito saborosos para vocÃĒ e seu _crush_ :heart_eyes:. +Todo mundo na sua frente estÃĄ esperando seus hambÃērgueres ficarem prontos antes de deixar o caixa porque cada um dos 8 caixas vai e prepara o hambÃērguer logo apÃŗs receber o pedido, antes de pegar o prÃŗximo pedido. -VocÃĒ paga. +EntÃŖo Ê finalmente sua vez, vocÃĒ pede 2 hambÃērgueres muito saborosos para vocÃĒ e seu _crush_. + +VocÃĒ paga 💸. O caixa vai para a cozinha. -VocÃĒ espera, na frente do balcÃŖo, para que ninguÊm pegue seus hambÃērgueres antes de vocÃĒ, jÃĄ que nÃŖo tem nÃēmeros de chamadas. +VocÃĒ espera, na frente do balcÃŖo 🕙, para que ninguÊm pegue seus hambÃērgueres antes de vocÃĒ, jÃĄ que nÃŖo tem nÃēmeros de chamadas. -Enquanto vocÃĒ e seu _crush_ :heart_eyes: estÃŖo ocupados nÃŖo permitindo que ninguÊm passe a frente e pegue seus hambÃērgueres assim que estiverem prontos, vocÃĒ nÃŖo pode dar atenÃ§ÃŖo ao seu _crush_ :heart_eyes:. +Como vocÃĒ e seu _crush_ estÃŖo ocupados nÃŖo permitindo que ninguÊm passe na frente e pegue seus hambÃērgueres assim que estiverem prontos, vocÃĒ nÃŖo pode dar atenÃ§ÃŖo ao seu _crush_. 😞 -Isso Ê trabalho "síncrono", vocÃĒ estÃĄ "sincronizado" com o caixa / cozinheiro. VocÃĒ tem que esperar e estar lÃĄ no exato momento que o caixa / cozinheiro terminar os hambÃērgueres e dÃĄ-los a vocÃĒ, ou entÃŖo, outro alguÊm pode pegÃĄ-los. +Isso Ê trabalho "síncrono", vocÃĒ estÃĄ "sincronizado" com o caixa / cozinheirođŸ‘¨â€đŸŗ. VocÃĒ tem que esperar 🕙 e estar lÃĄ no exato momento que o caixa / cozinheiro đŸ‘¨â€đŸŗ terminar os hambÃērgueres e os der a vocÃĒ, ou entÃŖo, outro alguÊm pode pegÃĄ-los. -EntÃŖo seu caixa / cozinheiro finalmente volta com seus hambÃērgueres, depois de um longo tempo esperando por eles em frente ao balcÃŖo. +EntÃŖo seu caixa / cozinheiro đŸ‘¨â€đŸŗ finalmente volta com seus hambÃērgueres, depois de um longo tempo esperando 🕙 por eles em frente ao balcÃŖo. -VocÃĒ pega seus hambÃērgueres e vai para a mesa com seu _crush_ :heart_eyes:. +VocÃĒ pega seus hambÃērgueres e vai para a mesa com seu _crush_. -VocÃĒs comem os hambÃērgueres, e o trabalho estÃĄ terminado. +VocÃĒs comem os hambÃērgueres, e o trabalho estÃĄ terminado. ⏚ -NÃŖo houve muita conversa ou flerte jÃĄ que a maior parte do tempo foi gasto esperando os lanches na frente do balcÃŖo. +NÃŖo houve muita conversa ou flerte jÃĄ que a maior parte do tempo foi gasto esperando 🕙 na frente do balcÃŖo. 😞 --- -Nesse cenÃĄrio dos hambÃērgueres paralelos, vocÃĒ ÃŠ um computador / programa com dois processadores (vocÃĒ e seu _crush_ :heart_eyes:), ambos esperando e dedicando a atenÃ§ÃŖo de estar "esperando no balcÃŖo" por um bom tempo. +Nesse cenÃĄrio dos hambÃērgueres paralelos, vocÃĒ ÃŠ um computador / programa com dois processadores (vocÃĒ e seu _crush_), ambos esperando 🕙 e dedicando sua atenÃ§ÃŖo ⏯ "esperando no balcÃŖo" 🕙 por um bom tempo. -A lanchonete paralela tem 8 processadores (caixas / cozinheiros). Enquanto a lanchonete dos hambÃērgueres concorrentes tinham apenas 2 (um caixa e um cozinheiro). +A lanchonete paralela tem 8 processadores (caixas / cozinheiros), enquanto a lanchonete dos hambÃērgueres concorrentes tinha apenas 2 (um caixa e um cozinheiro). -Ainda assim, a Ãēltima experiÃĒncia nÃŖo foi a melhor. +Ainda assim, a experiÃĒncia final nÃŖo foi a melhor. 😞 --- -Essa poderia ser a histÃŗria paralela equivalente aos hambÃērgueres. +Essa seria o equivalente paralelo à histÃŗrio dos hambÃērgueres. 🍔 Para um exemplo "mais real", imagine um banco. -AtÊ recentemente, a maioria dos bancos tinha muitos caixas e uma grande fila. +AtÊ recentemente, a maioria dos bancos tinham muitos caixas 👨‍đŸ’ŧ👨‍đŸ’ŧ👨‍đŸ’ŧ👨‍đŸ’ŧ e uma grande fila 🕙🕙🕙🕙🕙🕙🕙🕙. -Todos os caixas fazendo todo o trabalho, um cliente apÃŗs o outro. +Todos os caixas fazendo todo o trabalho, um cliente apÃŗs o outro 👨‍đŸ’ŧ⏯. -E vocÃĒ tinha que esperar na fila por um longo tempo ou poderia perder a vez. +E vocÃĒ tinha que esperar 🕙 na fila por um longo tempo ou poderia perder a vez. -VocÃĒ provavelmente nÃŖo gostaria de levar seu _crush_ :heart_eyes: com vocÃĒ para um rolezinho no banco. +VocÃĒ provavelmente nÃŖo gostaria de levar seu _crush_ 😍 com vocÃĒ para um rolezinho no banco đŸĻ. ### ConclusÃŖo dos hambÃērgueres -Nesse cenÃĄrio dos "hambÃērgueres com seu _crush_ :heart_eyes:", como tem muita espera, faz mais sentido ter um sistema concorrente. +Nesse cenÃĄrio dos "hambÃērgueres com seu _crush_", como tem muita espera, faz mais sentido ter um sistema concorrente â¸đŸ”€â¯. Esse Ê o caso da maioria das aplicaçÃĩes web. -Geralmente sÃŖo muitos usuÃĄrios, e seu servidor estÃĄ esperando pelas suas conexÃĩes nÃŖo tÃŖo boas para enviar as requisiçÃĩes. - -E entÃŖo esperando novamente pelas respostas voltarem. - -Essa "espera" Ê medida em microssegundos, e ainda assim, somando tudo, Ê um monte de espera no final. +Muitos, muitos usuÃĄrios, mas seu servidor estÃĄ esperando 🕙 pela sua conexÃŖo nÃŖo tÃŖo boa enviar suas requisiçÃĩes. -Por isso que faz muito mais sentido utilizar cÃŗdigo assíncrono para APIs web. +E entÃŖo esperando 🕙 novamente as respostas voltarem. -A maioria dos frameworks Python existentes mais populares (incluindo Flask e Django) foram criados antes que os novos recursos assíncronos existissem em Python. EntÃŖo, os meios que eles podem ser colocados em produÃ§ÃŖo para suportar execuÃ§ÃŖo paralela mais a forma antiga de execuÃ§ÃŖo assíncrona nÃŖo sÃŖo tÃŖo poderosos quanto as novas capacidades. +Essa "espera" 🕙 Ê medida em microssegundos, mas ainda assim, somando tudo, Ê um monte de espera no final. -Mesmo embora a especificaÃ§ÃŖo principal para web assíncrono em Python (ASGI) foi desenvolvida no Django, para adicionar suporte para WebSockets. +Por isso que faz bastante sentido utilizar cÃŗdigo assíncrono â¸đŸ”€â¯ para APIs web. -Esse tipo de assincronicidade Ê o que fez NodeJS popular (embora NodeJS nÃŖo seja paralelo) e que essa seja a força do Go como uma linguagem de programa. +Esse tipo de assincronicidade Ê o que fez NodeJS popular (embora NodeJS nÃŖo seja paralelo) e essa Ê a força do Go como uma linguagem de programaÃ§ÃŖo. E esse Ê o mesmo nível de performance que vocÃĒ tem com o **FastAPI**. -E como vocÃĒ pode ter paralelismo e sincronicidade ao mesmo tempo, vocÃĒ tem uma maior performance do que a maioria dos frameworks NodeJS testados e lado a lado com Go, que Ê uma linguagem compilada prÃŗxima ao C (tudo graças ao Starlette). +E como vocÃĒ pode ter paralelismo e assincronicidade ao mesmo tempo, vocÃĒ tem uma maior performance do que a maioria dos frameworks NodeJS testados e lado a lado com Go, que Ê uma linguagem compilada, mais prÃŗxima ao C (tudo graças ao Starlette). ### ConcorrÃĒncia Ê melhor que paralelismo? @@ -225,64 +223,64 @@ ConcorrÃĒncia Ê diferente de paralelismo. E Ê melhor em cenÃĄrios **específic EntÃŖo, para equilibrar tudo, imagine a seguinte historinha: -> VocÃĒ tem que limpar uma grande casa suja. +> VocÃĒ tem que limpar uma casa grande e suja. *Sim, essa Ê toda a histÃŗria*. --- -NÃŖo hÃĄ espera em lugar algum, apenas um monte de trabalho para ser feito, em mÃēltiplos cômodos da casa. +NÃŖo hÃĄ espera 🕙 em lugar algum, apenas um monte de trabalho para ser feito, em mÃēltiplos cômodos da casa. -VocÃĒ poderia ter chamadas como no exemplo dos hambÃērgueres, primeiro a sala de estar, entÃŖo a cozinha, mas vocÃĒ nÃŖo estÃĄ esperando por nada, apenas limpar e limpar, as chamadas nÃŖo afetariam em nada. +VocÃĒ poderia ter turnos como no exemplo dos hambÃērgueres, primeiro a sala de estar, entÃŖo a cozinha, mas como vocÃĒ nÃŖo estÃĄ esperando por nada, apenas limpando e limpando, as chamadas nÃŖo afetariam em nada. -Levaria o mesmo tempo para finalizar com ou sem chamadas (concorrÃĒncia) e vocÃĒ teria feito o mesmo tanto de trabalho. +Levaria o mesmo tempo para finalizar com ou sem turnos (concorrÃĒncia) e vocÃĒ teria feito o mesmo tanto de trabalho. Mas nesse caso, se vocÃĒ trouxesse os 8 ex-caixas / cozinheiros / agora-faxineiros, e cada um deles (mais vocÃĒ) pudessem dividir a casa para limpÃĄ-la, vocÃĒs fariam toda a limpeza em **paralelo**, com a ajuda extra, e terminariam muito mais cedo. Nesse cenÃĄrio, cada um dos faxineiros (incluindo vocÃĒ) poderia ser um processador, fazendo a sua parte do trabalho. -E a maior parte do tempo de execuÃ§ÃŖo Ê tomada por trabalho (ao invÊs de ficar esperando), e o trabalho em um computador Ê feito pela CPU, que podem gerar problemas que sÃŖo chamados de "limite de CPU". +E a maior parte do tempo de execuÃ§ÃŖo Ê tomada por trabalho real (ao invÊs de ficar esperando), e o trabalho em um computador Ê feito pela CPU. Eles chamam esses problemas de "limitados por CPU". --- -Exemplos comuns de limite de CPU sÃŖo coisas que exigem processamento matemÃĄtico complexo. +Exemplos comuns de operaçÃĩes limitadas por CPU sÃŖo coisas que exigem processamento matemÃĄtico complexo. Por exemplo: * **Processamento de ÃĄudio** ou **imagem** -* **VisÃŖo do Computador**: uma imagem Ê composta por milhÃĩes de pixels, cada pixel tem 3 valores (cores, processamento que normalmente exige alguma computaÃ§ÃŖo em todos esses pixels ao mesmo tempo) +* **VisÃŖo Computacional**: uma imagem Ê composta por milhÃĩes de pixels, cada pixel tem 3 valores / cores, processar isso normalmente exige alguma computaÃ§ÃŖo em todos esses pixels ao mesmo tempo -* **Machine Learning**: Normalmente exige muita multiplicaÃ§ÃŖo de matrizes e vetores. Pense numa grande folha de papel com nÃēmeros e multiplicando todos eles juntos e ao mesmo tempo. +* **Machine Learning**: Normalmente exige muita multiplicaÃ§ÃŖo de matrizes e vetores. Pense numa grande planilha com nÃēmeros e em multiplicar todos eles juntos e ao mesmo tempo. -* **Deep Learning**: Esse Ê um subcampo do Machine Learning, entÃŖo o mesmo se aplica. A diferença Ê que nÃŖo hÃĄ apenas uma grande folha de papel com nÃēmeros para multiplicar, mas um grande conjunto de folhas de papel, e em muitos casos, vocÃĒ utiliza um processador especial para construir e/ou usar modelos. +* **Deep Learning**: Esse Ê um subcampo do Machine Learning, entÃŖo, o mesmo se aplica. A diferença Ê que nÃŖo hÃĄ apenas uma grande planilha com nÃēmeros para multiplicar, mas um grande conjunto delas, e em muitos casos, vocÃĒ utiliza um processador especial para construir e/ou usar esses modelos. ### ConcorrÃĒncia + Paralelismo: Web + Machine learning Com **FastAPI** vocÃĒ pode levar a vantagem da concorrÃĒncia que Ê muito comum para desenvolvimento web (o mesmo atrativo de NodeJS). -Mas vocÃĒ tambÊm pode explorar os benefícios do paralelismo e multiprocessamento (tendo mÃēltiplos processadores rodando em paralelo) para trabalhos pesados que geram **limite de CPU** como aqueles em sistemas de Machine Learning. +Mas vocÃĒ tambÊm pode explorar os benefícios do paralelismo e multiprocessamento (tendo mÃēltiplos processadores rodando em paralelo) para trabalhos **limitados por CPU** como aqueles em sistemas de Machine Learning. -Isso, mais o simples fato que Python Ê a principal linguagem para **Data Science**, Machine Learning e especialmente Deep Learning, faz do FastAPI uma Ãŗtima escolha para APIs web e aplicaçÃĩes com Data Science / Machine Learning (entre muitas outras). +Isso, somado ao simples fato que Python Ê a principal linguagem para **Data Science**, Machine Learning e especialmente Deep Learning, faz do FastAPI uma Ãŗtima escolha para APIs web e aplicaçÃĩes com Data Science / Machine Learning (entre muitas outras). Para ver como alcançar esse paralelismo em produÃ§ÃŖo veja a seÃ§ÃŖo sobre [Deployment](deployment/index.md){.internal-link target=_blank}. ## `async` e `await` -VersÃĩes modernas do Python tem um modo muito intuitivo para definir cÃŗdigo assíncrono. Isso faz parecer normal o cÃŗdigo "sequencial" e fazer o "esperar" para vocÃĒ nos momentos certos. +VersÃĩes modernas do Python tÃĒm um modo muito intuitivo para definir cÃŗdigo assíncrono. Isso faz parecer do mesmo jeito do cÃŗdigo normal "sequencial" e fazer a "espera" para vocÃĒ nos momentos certos. -Quando tem uma operaÃ§ÃŖo que exigirÃĄ espera antes de dar os resultados e tem suporte para esses recursos Python, vocÃĒ pode escrever assim: +Quando tem uma operaÃ§ÃŖo que exigirÃĄ espera antes de dar os resultados e tem suporte para esses novos recursos do Python, vocÃĒ pode escrever assim: ```Python burgers = await get_burgers(2) ``` -A chave aqui Ê o `await`. Ele diz ao Python que ele tem que esperar por `get_burgers(2)` para finalizar suas coisas antes de armazenar os resultados em `burgers`. Com isso, o Python saberÃĄ que ele pode ir e fazer outras coisas nesse meio tempo (como receber outra requisiÃ§ÃŖo). +A chave aqui Ê o `await`. Ele diz ao Python que ele tem que esperar por `get_burgers(2)` finalizar suas coisas 🕙 antes de armazenar os resultados em `burgers`. Com isso, o Python saberÃĄ que ele pode ir e fazer outras coisas 🔀 ⏯ nesse meio tempo (como receber outra requisiÃ§ÃŖo). Para o `await` funcionar, tem que estar dentro de uma funÃ§ÃŖo que suporte essa assincronicidade. Para fazer isso, apenas declare a funÃ§ÃŖo com `async def`: ```Python hl_lines="1" async def get_burgers(number: int): - # Fazer alguma coisa assíncrona para criar os hambÃērgueres + # Faz alguma coisa assíncrona para criar os hambÃērgueres return burgers ``` @@ -295,9 +293,9 @@ def get_sequential_burgers(number: int): return burgers ``` -Com `async def`, o Python sabe que, dentro dessa funÃ§ÃŖo, tem que estar ciente das expressÃĩes `await`, e que isso pode "pausar" a execuÃ§ÃŖo dessa funÃ§ÃŖo, e poderÃĄ fazer outra coisa antes de voltar. +Com `async def`, o Python sabe que, dentro dessa funÃ§ÃŖo, ele deve estar ciente das expressÃĩes `await`, e que isso poderÃĄ "pausar" ⏸ a execuÃ§ÃŖo dessa funÃ§ÃŖo, e ir fazer outra coisa 🔀 antes de voltar. -Quando vocÃĒ quiser chamar uma funÃ§ÃŖo `async def`, vocÃĒ tem que "esperar". EntÃŖo, isso nÃŖo funcionarÃĄ: +Quando vocÃĒ quiser chamar uma funÃ§ÃŖo `async def`, vocÃĒ tem que "esperar" ela. EntÃŖo, isso nÃŖo funcionarÃĄ: ```Python # Isso nÃŖo irÃĄ funcionar, porquÃĒ get_burgers foi definido com: async def @@ -319,13 +317,24 @@ async def read_burgers(): VocÃĒ deve ter observado que `await` pode ser usado somente dentro de funçÃĩes definidas com `async def`. -Mas ao mesmo tempo, funçÃĩes definidas com `async def` tem que ser aguardadas. EntÃŖo, funçÃĩes com `async def` pdem ser chamadas somente dentro de funçÃĩes definidas com `async def` tambÊm. +Mas ao mesmo tempo, funçÃĩes definidas com `async def` tÃĒm que ser "aguardadas". EntÃŖo, funçÃĩes com `async def` pdem ser chamadas somente dentro de funçÃĩes definidas com `async def` tambÊm. EntÃŖo, sobre o ovo e a galinha, como vocÃĒ chama a primeira funÃ§ÃŖo async? Se vocÃĒ estivar trabalhando com **FastAPI** nÃŖo terÃĄ que se preocupar com isso, porquÃĒ essa "primeira" funÃ§ÃŖo serÃĄ a sua *funÃ§ÃŖo de operaÃ§ÃŖo de rota*, e o FastAPI saberÃĄ como fazer a coisa certa. -Mas se vocÃĒ quiser usar `async` / `await` sem FastAPI, verifique a documentaÃ§ÃŖo oficial Python. +Mas se vocÃĒ quiser usar `async` / `await` sem FastAPI, vocÃĒ tambÊm pode fazÃĒ-lo. + +### Escreva seu prÃŗprio cÃŗdigo assíncrono + +Starlette (e **FastAPI**) sÃŖo baseados no AnyIO, o que o torna compatível com ambos o asyncio da biblioteca padrÃŖo do Python, e o Trio. + +Em particular, vocÃĒ pode usar diretamente o AnyIO para seus casos de uso avançados de concorrÃĒncia que requerem padrÃĩes mais avançados no seu prÃŗprio cÃŗdigo. + +E atÊ se vocÃĒ nÃŖo estiver utilizando FastAPI, vocÃĒ tambÊm pode escrever suas prÃŗprias aplicaçÃĩes assíncronas com o AnyIO por ser altamente compatível e ganhar seus benefícios (e.g. *concorrÃĒncia estruturada*). + +Eu criei outra biblioteca em cima do AnyIO, como uma fina camada acima, para melhorar um pouco as anotaçÃĩes de tipo e obter melhor **autocompletar**, **erros de linha**, etc. Ela tambÊm possui uma introduÃ§ÃŖo amigÃĄvel e um tutorial para ajudar vocÃĒ a **entender** e escrever **seu prÃŗprio cÃŗdigo async**: Asyncer. Seria particularmente Ãētil se vocÃĒ precisar **combinar cÃŗdigo async com cÃŗdigo regular** (bloqueador/síncrono). + ### Outras formas de cÃŗdigo assíncrono @@ -337,25 +346,25 @@ Essa mesma sintaxe (ou quase a mesma) foi tambÊm incluída recentemente em vers Mas antes disso, controlar cÃŗdigo assíncrono era bem mais complexo e difícil. -Nas versÃĩes anteriores do Python, vocÃĒ poderia utilizar threads ou Gevent. Mas o cÃŗdigo Ê um pouco mais complexo de entender, debugar, e pensar sobre. +Nas versÃĩes anteriores do Python, vocÃĒ poderia utilizar threads ou Gevent. Mas o cÃŗdigo Ê bem mais complexo de entender, debugar, e pensar sobre. -Nas versÃĩes anteriores do NodeJS / Navegador JavaScript, vocÃĒ poderia utilizar "callbacks". O que leva ao inferno do callback. +Nas versÃĩes anteriores do NodeJS / Navegador JavaScript, vocÃĒ utilizaria "callbacks". O que leva ao inferno do callback. ## Corrotinas -**Corrotina** Ê apenas um jeito bonitinho para a coisa que Ê retornada de uma funÃ§ÃŖo `async def`. O Python sabe que Ê uma funÃ§ÃŖo que pode começar e terminar em algum ponto, mas que pode ser pausada internamente tambÊm, sempre que tiver um `await` dentro dela. +**Corrotina** Ê apenas um jeito bonitinho para a coisa que Ê retornada de uma funÃ§ÃŖo `async def`. O Python sabe que Ê algo como uma funÃ§ÃŖo, que pode começar e que vai terminar em algum ponto, mas que pode ser pausada ⏸ internamente tambÊm, sempre que tiver um `await` dentro dela. -Mas toda essa funcionalidade de cÃŗdigo assíncrono com `async` e `await` Ê muitas vezes resumida como "corrotina". É comparÃĄvel ao principal recurso chave do Go, a "Gorotina". +Mas toda essa funcionalidade de cÃŗdigo assíncrono com `async` e `await` Ê muitas vezes resumida como usando "corrotinas". É comparÃĄvel ao principal recurso chave do Go, a "Gorrotina". ## ConclusÃŖo -Vamos ver a mesma frase com o conteÃēdo cima: +Vamos ver a mesma frase de cima: -> VersÃĩes modernas do Python tem suporte para **"cÃŗdigo assíncrono"** usando algo chamado **"corrotinas"**, com sintaxe **`async` e `await`**. +> VersÃĩes modernas do Python tÃĒm suporte para **"cÃŗdigo assíncrono"** usando algo chamado **"corrotinas"**, com sintaxe **`async` e `await`**. -Isso pode fazer mais sentido agora. +Isso pode fazer mais sentido agora. ✨ -Tudo isso Ê o que deixa o FastAPI poderoso (atravÊs do Starlette) e que o faz ter uma performance impressionante. +Tudo isso Ê o que empodera o FastAPI (atravÊs do Starlette) e que o faz ter uma performance tÃŖo impressionante. ## Detalhes muito tÊcnicos @@ -365,25 +374,25 @@ VocÃĒ pode provavelmente pular isso. Esses sÃŖo detalhes muito tÊcnicos de como **FastAPI** funciona por baixo do capô. -Se vocÃĒ tem algum conhecimento tÊcnico (corrotinas, threads, blocking etc) e estÃĄ curioso sobre como o FastAPI controla o `async def` vs normal `def`, vÃĄ em frente. +Se vocÃĒ tem certo conhecimento tÊcnico (corrotinas, threads, blocking etc) e estÃĄ curioso sobre como o FastAPI controla o `async def` vs normal `def`, vÃĄ em frente. /// ### FunçÃĩes de operaÃ§ÃŖo de rota -Quando vocÃĒ declara uma *funÃ§ÃŖo de operaÃ§ÃŖo de rota* com `def` normal ao invÊs de `async def`, ela Ê rodada em uma threadpool externa que entÃŖo Ê aguardada, ao invÊs de ser chamada diretamente (ela poderia bloquear o servidor). +Quando vocÃĒ declara uma *funÃ§ÃŖo de operaÃ§ÃŖo de rota* com `def` normal ao invÊs de `async def`, ela Ê rodada em uma threadpool externa que Ê entÃŖo aguardada, ao invÊs de ser chamada diretamente (jÃĄ que ela bloquearia o servidor). -Se vocÃĒ estÃĄ chegando de outro framework assíncrono que nÃŖo faz o trabalho descrito acima e vocÃĒ estÃĄ acostumado a definir triviais *funçÃĩes de operaÃ§ÃŖo de rota* com simples `def` para ter um mínimo ganho de performance (cerca de 100 nanosegundos), por favor observe que no **FastAPI** o efeito pode ser bem o oposto. Nesses casos, Ê melhor usar `async def` a menos que suas *funçÃĩes de operaÃ§ÃŖo de rota* utilizem cÃŗdigo que performem bloqueamento IO. +Se vocÃĒ estÃĄ chegando de outro framework assíncrono que nÃŖo funciona como descrito acima e vocÃĒ estÃĄ acostumado a definir *funçÃĩes de operaÃ§ÃŖo de rota* triviais somente de computaÃ§ÃŖo com simples `def` para ter um mínimo ganho de performance (cerca de 100 nanosegundos), por favor observe que no **FastAPI** o efeito pode ser bem o oposto. Nesses casos, Ê melhor usar `async def` a menos que suas *funçÃĩes de operaÃ§ÃŖo de rota* utilizem cÃŗdigo que performe bloqueamento IO. -Ainda, em ambas as situaçÃĩes, as chances sÃŖo que o **FastAPI** serÃĄ [ainda mais rÃĄpido](index.md#performance){.internal-link target=_blank} do que (ou ao menos comparÃĄvel a) seus frameworks antecessores. +Ainda, em ambas as situaçÃĩes, as chances sÃŖo que o **FastAPI** [ainda serÃĄ mais rÃĄpido](index.md#performance){.internal-link target=_blank} do que (ou ao menos comparÃĄvel a) seu framework anterior. ### DependÃĒncias -O mesmo se aplica para as dependÃĒncias. Se uma dependÃĒncia tem as funçÃĩes com padrÃŖo `def` ao invÊs de `async def`, ela Ê rodada no threadpool externo. +O mesmo se aplica para as [dependÃĒncias](tutorial/dependencies/index.md){.internal-link target=_blank}. Se uma dependÃĒncia tem as funçÃĩes com padrÃŖo `def` ao invÊs de `async def`, ela Ê rodada no threadpool externo. ### Sub-dependÃĒncias -VocÃĒ pode ter mÃēltiplas dependÃĒncias e sub-dependÃĒncias exigindo uma a outra (como parÃĸmetros de definiçÃĩes de funçÃĩes), algumas delas podem ser criadas com `async def` e algumas com `def` normal. Isso ainda poderia funcionar, e aquelas criadas com `def` podem ser chamadas em uma thread externa ao invÊs de serem "aguardadas". +VocÃĒ pode ter mÃēltiplas dependÃĒncias e [sub-dependÃĒncias](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank} requisitando uma à outra (como parÃĸmetros de definiçÃĩes de funçÃĩes), algumas delas podem ser criadas com `async def` e algumas com `def` normal. Isso ainda funcionaria, e aquelas criadas com `def` normal seriam chamadas em uma thread externa (do threadpool) ao invÊs de serem "aguardadas". ### Outras funçÃĩes de utilidade @@ -395,6 +404,6 @@ Se sua funÃ§ÃŖo de utilidade Ê uma funÃ§ÃŖo normal com `def`, ela serÃĄ chamada --- -Novamente, esses sÃŖo detalhes muito tÊcnicos que provavelmente possam ser Ãēteis caso vocÃĒ esteja procurando por eles. +Novamente, esses sÃŖo detalhes muito tÊcnicos que provavelmente seriam Ãēteis caso vocÃĒ esteja procurando por eles. Caso contrÃĄrio, vocÃĒ deve ficar bem com as dicas da seÃ§ÃŖo acima: Com pressa?. diff --git a/docs/pt/docs/deployment/concepts.md b/docs/pt/docs/deployment/concepts.md index 8cf70d0b4..014ca3797 100644 --- a/docs/pt/docs/deployment/concepts.md +++ b/docs/pt/docs/deployment/concepts.md @@ -216,7 +216,7 @@ Este Processo de Gerenciador provavelmente seria o que escutaria na **porta** no Esses processos de trabalho seriam aqueles que executariam seu aplicativo, eles executariam os cÃĄlculos principais para receber uma **solicitaÃ§ÃŖo** e retornar uma **resposta**, e carregariam qualquer coisa que vocÃĒ colocasse em variÃĄveis ​​na RAM. - + E, claro, a mesma mÃĄquina provavelmente teria **outros processos** em execuÃ§ÃŖo, alÊm do seu aplicativo. diff --git a/docs/pt/docs/deployment/https.md b/docs/pt/docs/deployment/https.md index 9ad419934..904d04eaa 100644 --- a/docs/pt/docs/deployment/https.md +++ b/docs/pt/docs/deployment/https.md @@ -85,7 +85,7 @@ Primeiro, o navegador iria verificar com os **servidores DNS** qual o **IP do do Os servidores DNS iriam informar o navegador para utilizar algum **endereço IP** específico. Esse seria o endereço IP pÃēblico em uso no seu servidor, que vocÃĒ configurou nos servidores DNS. - + ### Início do Handshake TLS @@ -93,7 +93,7 @@ O navegador entÃŖo irÃĄ comunicar-se com esse endereço IP na **porta 443** (a p A primeira parte dessa comunicaÃ§ÃŖo Ê apenas para estabelecer a conexÃŖo entre o cliente e o servidor e para decidir as chaves criptogrÃĄficas a serem utilizadas, etc. - + Esse interaÃ§ÃŖo entre o cliente e o servidor para estabelecer uma conexÃŖo TLS Ê chamada de **Handshake TLS**. @@ -111,7 +111,7 @@ Utilizando a **extensÃŖo SNI** discutida acima, o Proxy de TerminaÃ§ÃŖo TLS iria Nesse caso, ele usaria o certificado para `someapp.example.com`. - + O cliente jÃĄ **confia** na entidade que gerou o certificado TLS (nesse caso, o Let's Encrypt, mas veremos sobre isso mais tarde), entÃŖo ele pode **verificar** que o certificado Ê vÃĄlido. @@ -133,19 +133,19 @@ Agora que o cliente e servidor (especialmente o navegador e o Proxy de Terminaç EntÃŖo, o cliente envia uma **solicitaÃ§ÃŖo HTTPS**. Que Ê apenas uma solicitaÃ§ÃŖo HTTP sobre uma conexÃŖo TLS encriptada. - + ### Desencriptando a SolicitaÃ§ÃŖo O Proxy de TerminaÃ§ÃŖo TLS entÃŖo usaria a encriptaÃ§ÃŖo combinada para **desencriptar a solicitaÃ§ÃŖo**, e transmitiria a **solicitaÃ§ÃŖo bÃĄsica (desencriptada)** para o processo executando a aplicaÃ§ÃŖo (por exemplo, um processo com Uvicorn executando a aplicaÃ§ÃŖo FastAPI). - + ### Resposta HTTP A aplicaÃ§ÃŖo processaria a solicitaÃ§ÃŖo e retornaria uma **resposta HTTP bÃĄsica (nÃŖo encriptada)** para o Proxy de TerminaÃ§ÃŖo TLS. - + ### Resposta HTTPS @@ -153,7 +153,7 @@ O Proxy de TerminaÃ§ÃŖo TLS iria **encriptar a resposta** utilizando a criptogra No prÃŗximo passo, o navegador verifica que a resposta Ê vÃĄlida e encriptada com a chave criptogrÃĄfica correta, etc. E depois **desencripta a resposta** e a processa. - + O cliente (navegador) saberÃĄ que a resposta vem do servidor correto por que ela usa a criptografia que foi combinada entre eles usando o **certificado HTTPS** anterior. @@ -163,7 +163,7 @@ Podem existir **mÃēltiplas aplicaçÃĩes** em execuÃ§ÃŖo no mesmo servidor (ou se Apenas um processo pode estar vinculado a um IP e porta (o Proxy de TerminaÃ§ÃŖo TLS, por exemplo), mas outras aplicaçÃĩes/processos tambÊm podem estar em execuÃ§ÃŖo no(s) servidor(es), desde que nÃŖo tentem usar a mesma **combinaÃ§ÃŖo de IP pÃēblico e porta**. - + Dessa forma, o Proxy de TerminaÃ§ÃŖo TLS pode gerenciar o HTTPS e os certificados de **mÃēltiplos domínios**, para mÃēltiplas aplicaçÃĩes, e entÃŖo transmitir as requisiçÃĩes para a aplicaÃ§ÃŖo correta em cada caso. @@ -173,7 +173,7 @@ Em algum momento futuro, cada certificado irÃĄ **expirar** (aproximadamente 3 me E entÃŖo, haverÃĄ outro programa (em alguns casos pode ser o prÃŗprio Proxy de TerminaÃ§ÃŖo TLS) que irÃĄ interagir com o Let's Encrypt e renovar o(s) certificado(s). - + Os **certificados TLS** sÃŖo **associados com um nome de domínio**, e nÃŖo a um endereço IP. diff --git a/docs/pt/docs/how-to/custom-docs-ui-assets.md b/docs/pt/docs/how-to/custom-docs-ui-assets.md index 3adc7529e..b7de6c8bd 100644 --- a/docs/pt/docs/how-to/custom-docs-ui-assets.md +++ b/docs/pt/docs/how-to/custom-docs-ui-assets.md @@ -98,7 +98,7 @@ VocÃĒ provavelmente pode clicar com o botÃŖo direito em cada link e selecionar u E o **ReDoc** usa os arquivos: -* `redoc.standalone.js` +* `redoc.standalone.js` Depois disso, sua estrutura de arquivos deve se parecer com: @@ -129,14 +129,8 @@ VocÃĒ deverÃĄ ver um arquivo JavaScript muito longo para o **ReDoc**. Esse arquivo pode começar com algo como: ```JavaScript -/*! - * ReDoc - OpenAPI/Swagger-generated API Reference Documentation - * ------------------------------------------------------------- - * Version: "2.0.0-rc.18" - * Repo: https://github.com/Redocly/redoc - */ -!function(e,t){"object"==typeof exports&&"object"==typeof m - +/*! For license information please see redoc.standalone.js.LICENSE.txt */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("null")): ... ``` diff --git a/docs/pt/docs/project-generation.md b/docs/pt/docs/project-generation.md index e5c935fd2..e337ad762 100644 --- a/docs/pt/docs/project-generation.md +++ b/docs/pt/docs/project-generation.md @@ -1,84 +1,28 @@ -# GeraÃ§ÃŖo de Projetos - Modelo - -VocÃĒ pode usar um gerador de projetos para começar, por jÃĄ incluir configuraçÃĩes iniciais, segurança, banco de dados e os primeiros _endpoints_ API jÃĄ feitos para vocÃĒ. - -Um gerador de projetos sempre terÃĄ uma prÊ-configuraÃ§ÃŖo que vocÃĒ pode atualizar e adaptar para suas prÃŗprias necessidades, mas pode ser um bom ponto de partida para seu projeto. - -## Full Stack FastAPI PostgreSQL - -GitHub: https://github.com/tiangolo/full-stack-fastapi-postgresql - -### Full Stack FastAPI PostgreSQL - Recursos - -* IntegraÃ§ÃŖo completa **Docker**. -* Modo de implantaÃ§ÃŖo Docker Swarm. -* IntegraÃ§ÃŖo e otimizaÃ§ÃŖo **Docker Compose** para desenvolvimento local. -* **Pronto para ProduÃ§ÃŖo** com servidor _web_ usando Uvicorn e Gunicorn. -* _Backend_ **FastAPI** Python: - * **RÃĄpido**: Alta performance, no nível de **NodeJS** e **Go** (graças ao Starlette e Pydantic). - * **Intuitivo**: Ótimo suporte de editor. _Auto-Complete_ em todo lugar. Menos tempo _debugando_. - * **FÃĄcil**: Projetado para ser fÃĄcil de usar e aprender. Menos tempo lendo documentaçÃĩes. - * **Curto**: Minimize duplicaÃ§ÃŖo de cÃŗdigo. MÃēltiplos recursos para cada declaraÃ§ÃŖo de parÃĸmetro. - * **Robusto**: Tenha cÃŗdigo pronto para produÃ§ÃŖo. Com documentaÃ§ÃŖo interativa automÃĄtica. - * **Baseado em PadrÃĩes**: Baseado em (e completamente compatível com) padrÃĩes abertos para APIs: OpenAPI e JSON Schema. - * **Muitos outros recursos** incluindo validaÃ§ÃŖo automÃĄtica, serializaÃ§ÃŖo, documentaÃ§ÃŖo interativa, autenticaÃ§ÃŖo com _tokens_ OAuth2 JWT etc. -* **Senha segura** _hashing_ por padrÃŖo. -* AutenticaÃ§ÃŖo **Token JWT**. -* Modelos **SQLAlchemy** (independente de extensÃĩes Flask, para que eles possam ser usados com _workers_ Celery diretamente). -* Modelos bÃĄsicos para usuÃĄrios (modifique e remova conforme suas necessidades). -* MigraçÃĩes **Alembic**. -* **CORS** (_Cross Origin Resource Sharing_ - Compartilhamento de Recursos Entre Origens). -* _Worker_ **Celery** que pode importar e usar modelos e cÃŗdigos do resto do _backend_ seletivamente. -* Testes _backend_ _REST_ baseados no **Pytest**, integrados com Docker, entÃŖo vocÃĒ pode testar a interaÃ§ÃŖo completa da API, independente do banco de dados. Como roda no Docker, ele pode construir um novo repositÃŗrio de dados do zero toda vez (assim vocÃĒ pode usar ElasticSearch, MongoDB, CouchDB, ou o que quiser, e apenas testar que a API esteja funcionando). -* FÃĄcil integraÃ§ÃŖo com Python atravÊs dos **Kernels Jupyter** para desenvolvimento remoto ou no Docker com extensÃĩes como Atom Hydrogen ou Visual Studio Code Jupyter. -* _Frontend_ **Vue**: - * Gerado com Vue CLI. - * Controle de **AutenticaÃ§ÃŖo JWT**. - * VisualizaÃ§ÃŖo de _login_. - * ApÃŗs o _login_, visualizaÃ§ÃŖo do painel de controle principal. - * Painel de controle principal com criaÃ§ÃŖo e ediÃ§ÃŖo de usuÃĄrio. - * EdiÃ§ÃŖo do prÃŗprio usuÃĄrio. - * **Vuex**. - * **Vue-router**. - * **Vuetify** para belos componentes _material design_. - * **TypeScript**. - * Servidor Docker baseado em **Nginx** (configurado para rodar "lindamente" com Vue-router). - * ConstruÃ§ÃŖo multi-estÃĄgio Docker, entÃŖo vocÃĒ nÃŖo precisa salvar ou _commitar_ cÃŗdigo compilado. - * Testes _frontend_ rodados na hora da construÃ§ÃŖo (pode ser desabilitado tambÊm). - * Feito tÃŖo modular quanto possível, entÃŖo ele funciona fora da caixa, mas vocÃĒ pode gerar novamente com Vue CLI ou criar conforme vocÃĒ queira, e reutilizar o que quiser. -* **PGAdmin** para banco de dados PostgreSQL, vocÃĒ pode modificar para usar PHPMyAdmin e MySQL facilmente. -* **Flower** para monitoraÃ§ÃŖo de tarefas Celery. -* Balanceamento de carga entre _frontend_ e _backend_ com **Traefik**, entÃŖo vocÃĒ pode ter ambos sob o mesmo domínio, separados por rota, mas servidos por diferentes containers. -* IntegraÃ§ÃŖo Traefik, incluindo geraÃ§ÃŖo automÃĄtica de certificados **HTTPS** Let's Encrypt. -* GitLab **CI** (integraÃ§ÃŖo contínua), incluindo testes _frontend_ e _backend_. - -## Full Stack FastAPI Couchbase - -GitHub: https://github.com/tiangolo/full-stack-fastapi-couchbase - -âš ī¸ **WARNING** âš ī¸ - -Se vocÃĒ estÃĄ iniciando um novo projeto do zero, verifique as alternativas aqui. - -Por exemplo, o gerador de projetos Full Stack FastAPI PostgreSQL pode ser uma alternativa melhor, como ele Ê ativamente mantido e utilizado. E ele inclui todos os novos recursos e melhorias. - -VocÃĒ ainda Ê livre para utilizar o gerador baseado em Couchbase se quiser, ele provavelmente ainda funciona bem, e vocÃĒ jÃĄ tem um projeto gerado com ele que roda bem tambÊm (e vocÃĒ provavelmente jÃĄ atualizou ele para encaixar nas suas necessidades). - -VocÃĒ pode ler mais sobre nas documentaÃ§ÃŖoes do repositÃŗrio. - -## Full Stack FastAPI MongoDB - -...pode demorar, dependendo do meu tempo disponível e outros fatores. 😅 🎉 - -## Modelos de Aprendizado de MÃĄquina com spaCy e FastAPI - -GitHub: https://github.com/microsoft/cookiecutter-spacy-fastapi - -### Modelos de Aprendizado de MÃĄquina com spaCy e FastAPI - Recursos - -* IntegraÃ§ÃŖo com modelo NER **spaCy**. -* Formato de requisiÃ§ÃŖo **Busca Cognitiva Azure** acoplado. -* Servidor Python _web_ **Pronto para ProduÃ§ÃŖo** usando Uvicorn e Gunicorn. -* ImplantaÃ§ÃŖo **Azure DevOps** Kubernetes (AKS) CI/CD acoplada. -* **Multilingual** facilmente escolhido como uma das linguagens spaCy acopladas durante a configuraÃ§ÃŖo do projeto. -* **Facilmente extensível** para outros modelos de _frameworks_ (Pytorch, Tensorflow), nÃŖo apenas spaCy. +# Full Stack FastAPI Template + +_Templates_, embora tipicamente venham com alguma configuraÃ§ÃŖo específica, sÃŖo desenhados para serem flexíveis e customizÃĄveis. Isso permite que vocÃĒ os modifique e adapte para as especificaçÃĩes do seu projeto, fazendo-os um excelente ponto de partida. 🏁 + +VocÃĒ pode usar esse _template_ para começar, jÃĄ que ele inclui vÃĄrias configuraçÃĩes iniciais, segurança, banco de dados, e alguns _endpoints_ de API jÃĄ feitos para vocÃĒ. + +RepositÃŗrio GitHub: Full Stack FastAPI Template + +## Full Stack FastAPI Template - Pilha de Tecnologias e Recursos + +- ⚡ [**FastAPI**](https://fastapi.tiangolo.com) para a API do backend em Python. + - 🧰 [SQLModel](https://sqlmodel.tiangolo.com) para as interaçÃĩes do Python com bancos de dados SQL (ORM). + - 🔍 [Pydantic](https://docs.pydantic.dev), usado pelo FastAPI, para validaÃ§ÃŖo de dados e gerenciamento de configuraçÃĩes. + - 💾 [PostgreSQL](https://www.postgresql.org) como banco de dados SQL. +- 🚀 [React](https://react.dev) para o frontend. + - 💃 Usando TypeScript, hooks, [Vite](https://vitejs.dev), e outras partes de uma _stack_ frontend moderna. + - 🎨 [Chakra UI](https://chakra-ui.com) para os componentes de frontend. + - 🤖 Um cliente frontend automaticamente gerado. + - đŸ§Ē [Playwright](https://playwright.dev) para testes Ponta-a-Ponta. + - đŸĻ‡ Suporte para modo escuro. +- 🐋 [Docker Compose](https://www.docker.com) para desenvolvimento e produÃ§ÃŖo. +- 🔒 _Hash_ seguro de senhas por padrÃŖo. +- 🔑 AutenticaÃ§ÃŖo por token JWT. +- đŸ“Ģ RecuperaÃ§ÃŖo de senhas baseada em email. +- ✅ Testes com [Pytest](https://pytest.org). +- 📞 [Traefik](https://traefik.io) como proxy reverso / balanceador de carga. +- đŸšĸ InstruçÃĩes de _deployment_ usando Docker Compose, incluindo como configurar um proxy frontend com Traefik para gerenciar automaticamente certificados HTTPS. +- 🏭 CI (IntegraÃ§ÃŖo Contínua) e CD (_Deploy_ Contínuo) baseado em GitHub Actions. diff --git a/docs/pt/docs/tutorial/bigger-applications.md b/docs/pt/docs/tutorial/bigger-applications.md index a094005fd..b621f3c72 100644 --- a/docs/pt/docs/tutorial/bigger-applications.md +++ b/docs/pt/docs/tutorial/bigger-applications.md @@ -52,7 +52,7 @@ from app.routers import items * HÃĄ tambÊm um subdiretÃŗrio `app/internal/` com outro arquivo `__init__.py`, entÃŖo ele Ê outro "subpacote Python":`app.internal`. * E o arquivo `app/internal/admin.py` Ê outro submÃŗdulo: `app.internal.admin`. - + A mesma estrutura de arquivos com comentÃĄrios: @@ -270,7 +270,7 @@ Mas esse arquivo nÃŖo existe, nossas dependÃĒncias estÃŖo em um arquivo em `app/ Lembre-se de como nossa estrutura app/file se parece: - + --- diff --git a/docs/ru/docs/advanced/additional-status-codes.md b/docs/ru/docs/advanced/additional-status-codes.md new file mode 100644 index 000000000..aab1f8ee3 --- /dev/null +++ b/docs/ru/docs/advanced/additional-status-codes.md @@ -0,0 +1,41 @@ +# ДоĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ ŅŅ‚Đ°Ņ‚ŅƒŅ ĐēĐžĐ´Ņ‹ + +По ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ **FastAPI** Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚ ĐžŅ‚Đ˛Đĩ҂ҋ, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ `JSONResponse`, ĐŋĐžĐŧĐĩŅ‰Đ°Ņ ŅĐžĐ´ĐĩŅ€ĐļиĐŧĐžĐĩ, ĐēĐžŅ‚ĐžŅ€ĐžĐĩ Đ˛Ņ‹ Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚Đĩ иС Đ˛Đ°ŅˆĐĩĐš *ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ ĐŋŅƒŅ‚Đ¸*, вĐŊŅƒŅ‚Ņ€ŅŒ ŅŅ‚ĐžĐŗĐž `JSONResponse`. + +ОĐŊ ĐąŅƒĐ´ĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐēОд ŅŅ‚Đ°Ņ‚ŅƒŅĐ° ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ иĐģи Ņ‚ĐžŅ‚, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš Đ˛Ņ‹ ҃ĐēаĐļĐĩŅ‚Đĩ в Đ˛Đ°ŅˆĐĩĐš *ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ ĐŋŅƒŅ‚Đ¸*. + +## ДоĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ ŅŅ‚Đ°Ņ‚ŅƒŅ ĐēĐžĐ´Ņ‹ + +Đ•ŅĐģи Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°Ņ‚ŅŒ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đš ŅŅ‚Đ°Ņ‚ŅƒŅ ĐēОд ĐŋĐžĐŧиĐŧĐž ĐžŅĐŊОвĐŊĐžĐŗĐž, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ŅĐ´ĐĩĐģĐ°Ņ‚ŅŒ ŅŅ‚Đž, Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°Ņ ĐžĐąŅŠĐĩĐēŅ‚ `Response` ĐŊаĐŋŅ€ŅĐŧŅƒŅŽ, ĐēаĐē `JSONResponse`, и ŅƒŅŅ‚Đ°ĐŊавĐģĐ¸Đ˛Đ°Ņ ĐŊ҃ĐļĐŊŅ‹Đš ŅŅ‚Đ°Ņ‚ŅƒŅ ĐēОд ĐŊаĐŋŅ€ŅĐŧŅƒŅŽ. + +НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ҁĐēаĐļĐĩĐŧ, Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅĐžĐˇĐ´Đ°Ņ‚ŅŒ *ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅŽ ĐŋŅƒŅ‚Đ¸*, ĐēĐžŅ‚ĐžŅ€Đ°Ņ ĐŋОСвОĐģŅĐĩŅ‚ ОйĐŊОвĐģŅŅ‚ŅŒ ŅĐģĐĩĐŧĐĩĐŊ҂ҋ и Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚ HTTP-ĐēОд 200 "OK" ĐŋŅ€Đ¸ ҃ҁĐŋĐĩ҈ĐŊĐžĐŧ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊии. + +Но Đ˛Ņ‹ Ņ‚Đ°ĐēĐļĐĩ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ, Ņ‡Ņ‚ĐžĐąŅ‹ ĐžĐŊа ĐŋŅ€Đ¸ĐŊиĐŧаĐģа ĐŊĐžĐ˛Ņ‹Đĩ ŅĐģĐĩĐŧĐĩĐŊ҂ҋ. И ĐĩҁĐģи ŅĐģĐĩĐŧĐĩĐŊŅ‚ Ņ€Đ°ĐŊĐĩĐĩ ĐŊĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ĐžĐ˛Đ°Đģ, ĐžĐŊ ŅĐžĐˇĐ´Đ°Ņ‘Ņ‚ŅŅ, и Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°ĐģŅŅ HTTP-ĐēОд 201 "Created". + +Đ§Ņ‚ĐžĐąŅ‹ Ņ€ĐĩаĐģĐ¸ĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅŅ‚Đž, иĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ŅƒĐšŅ‚Đĩ `JSONResponse` и Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°ĐšŅ‚Đĩ Đ˛Đ°Ņˆ ĐēĐžĐŊŅ‚ĐĩĐŊŅ‚ ĐŊаĐŋŅ€ŅĐŧŅƒŅŽ, ŅƒŅŅ‚Đ°ĐŊавĐģĐ¸Đ˛Đ°Ņ ĐŊ҃ĐļĐŊŅ‹Đš `status_code`: + +{* ../../docs_src/additional_status_codes/tutorial001_an_py310.py hl[4,25] *} + +/// warning | ВĐŊиĐŧаĐŊиĐĩ + +ĐšĐžĐŗĐ´Đ° Đ˛Ņ‹ Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚Đĩ ĐžĐąŅŠĐĩĐēŅ‚ `Response` ĐŊаĐŋŅ€ŅĐŧŅƒŅŽ, ĐēаĐē в ĐŋŅ€Đ¸ĐŧĐĩŅ€Đĩ Đ˛Ņ‹ŅˆĐĩ, ĐžĐŊ ĐąŅƒĐ´ĐĩŅ‚ Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Ņ‘ĐŊ ĐēаĐē ĐĩŅŅ‚ŅŒ. + +ОĐŊ ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚ ҁĐĩŅ€Đ¸Đ°ĐģиСОваĐŊ ĐŋŅ€Đ¸ ĐŋĐžĐŧĐžŅ‰Đ¸ ĐŧОдĐĩĐģи и Ņ‚.Đ´. + +ĐŖĐąĐĩĐ´Đ¸Ņ‚ĐĩҁҌ, Ņ‡Ņ‚Đž в ĐŊŅ‘Đŧ ŅĐžĐ´ĐĩŅ€ĐļĐ°Ņ‚ŅŅ иĐŧĐĩĐŊĐŊĐž Ņ‚Đĩ даĐŊĐŊŅ‹Đĩ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ, и Ņ‡Ņ‚Đž СĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ ŅĐ˛ĐģŅŅŽŅ‚ŅŅ ваĐģидĐŊŅ‹Đŧ JSON (ĐĩҁĐģи Đ˛Ņ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚Đĩ `JSONResponse`). + +/// + +/// note | ĐĸĐĩŅ…ĐŊĐ¸Ņ‡ĐĩҁĐēиĐĩ Đ´ĐĩŅ‚Đ°Đģи + +Đ’Ņ‹ Ņ‚Đ°ĐēĐļĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ `from starlette.responses import JSONResponse`. + +**FastAPI** ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ Ņ‚ĐžŅ‚ ĐļĐĩ `starlette.responses` ҇ĐĩŅ€ĐĩС `fastapi.responses` ĐŋŅ€ĐžŅŅ‚Đž Đ´ĐģŅ Đ˛Đ°ŅˆĐĩĐŗĐž ŅƒĐ´ĐžĐąŅŅ‚Đ˛Đ°, ĐēаĐē Ņ€Đ°ĐˇŅ€Đ°ĐąĐžŅ‚Ņ‡Đ¸Đēа. Но йОĐģŅŒŅˆĐ¸ĐŊŅŅ‚Đ˛Đž Đ´ĐžŅŅ‚ŅƒĐŋĐŊҋ҅ Response-ĐēĐģĐ°ŅŅĐžĐ˛ ĐŋĐžŅŅ‚ŅƒĐŋĐ°ŅŽŅ‚ ĐŊаĐŋŅ€ŅĐŧŅƒŅŽ иС Starlette. ĐĸĐž ĐļĐĩ ŅĐ°ĐŧĐžĐĩ ĐēĐ°ŅĐ°ĐĩŅ‚ŅŅ и `status`. + +/// + +## OpenAPI и Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Ņ API + +Đ•ŅĐģи Đ˛Ņ‹ Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚Đĩ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ ĐēĐžĐ´Ņ‹ ŅŅ‚Đ°Ņ‚ŅƒŅĐžĐ˛ и ĐžŅ‚Đ˛Đĩ҂ҋ ĐŊаĐŋŅ€ŅĐŧŅƒŅŽ, ĐžĐŊи ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ‚ вĐēĐģŅŽŅ‡ĐĩĐŊŅ‹ в ҁ҅ĐĩĐŧ҃ OpenAPI (Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸ŅŽ API), ĐŋĐžŅ‚ĐžĐŧ҃ Ņ‡Ņ‚Đž FastAPI ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ĐˇĐ°Ņ€Đ°ĐŊĐĩĐĩ СĐŊĐ°Ņ‚ŅŒ, Ņ‡Ņ‚Đž Đ˛Ņ‹ ŅĐžĐąĐ¸Ņ€Đ°ĐĩŅ‚ĐĩҁҌ вĐĩŅ€ĐŊŅƒŅ‚ŅŒ. + +Но Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ СадОĐē҃ĐŧĐĩĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ŅŅ‚Đž в Đ˛Đ°ŅˆĐĩĐŧ ĐēОдĐĩ, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ: [ДоĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ ĐžŅ‚Đ˛Đĩ҂ҋ в OpenAPI](additional-responses.md){.internal-link target=_blank}. diff --git a/docs/ru/docs/advanced/index.md b/docs/ru/docs/advanced/index.md new file mode 100644 index 000000000..b5cb733e7 --- /dev/null +++ b/docs/ru/docs/advanced/index.md @@ -0,0 +1,21 @@ +# Đ Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐŊĐžĐĩ Ņ€ŅƒĐēĐžĐ˛ĐžĐ´ŅŅ‚Đ˛Đž ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ + +## ДоĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ вОСĐŧĐžĐļĐŊĐžŅŅ‚Đ¸ + +ĐžŅĐŊОвĐŊĐžĐĩ [ĐŖŅ‡ĐĩĐąĐŊиĐē - Đ ŅƒĐēĐžĐ˛ĐžĐ´ŅŅ‚Đ˛Đž ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ](../tutorial/index.md){.internal-link target=_blank} Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ Đ´ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋОСĐŊаĐēĐžĐŧĐ¸Ņ‚ŅŒ Đ˛Đ°Ņ ŅĐž Đ˛ŅĐĩĐŧи ĐžŅĐŊОвĐŊŅ‹Đŧи Ņ„ŅƒĐŊĐēŅ†Đ¸ŅĐŧи **FastAPI**. + +В ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Ņ… Ņ€Đ°ĐˇĐ´ĐĩĐģĐ°Ņ… Đ˛Ņ‹ ŅƒĐ˛Đ¸Đ´Đ¸Ņ‚Đĩ Đ´Ņ€ŅƒĐŗĐ¸Đĩ Đ˛Đ°Ņ€Đ¸Đ°ĐŊ҂ҋ, ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ и Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ вОСĐŧĐžĐļĐŊĐžŅŅ‚Đ¸. + +/// tip + +ĐĄĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đĩ Ņ€Đ°ĐˇĐ´ĐĩĐģŅ‹ **ĐŊĐĩ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž ŅĐ˛ĐģŅŅŽŅ‚ŅŅ "ĐŋŅ€ĐžĐ´Đ˛Đ¸ĐŊŅƒŅ‚Ņ‹Đŧи"**. + +И вĐŋĐžĐģĐŊĐĩ вОСĐŧĐžĐļĐŊĐž, Ņ‡Ņ‚Đž Đ´ĐģŅ Đ˛Đ°ŅˆĐĩĐŗĐž ҁĐģŅƒŅ‡Đ°Ņ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ Ņ€Đĩ҈ĐĩĐŊиĐĩ ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŅ в ОдĐŊĐžĐŧ иС ĐŊĐ¸Ņ…. + +/// + +## ĐĄĐŊĐ°Ņ‡Đ°Đģа ĐŋŅ€ĐžŅ‡Đ¸Ņ‚Đ°ĐšŅ‚Đĩ ĐŖŅ‡ĐĩĐąĐŊиĐē - Đ ŅƒĐēĐžĐ˛ĐžĐ´ŅŅ‚Đ˛Đž ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ + +Đ’Ņ‹ Đ˛ŅĐĩ Đĩ҉Đĩ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ йОĐģŅŒŅˆĐ¸ĐŊŅŅ‚Đ˛Đž Ņ„ŅƒĐŊĐēŅ†Đ¸Đš **FastAPI** ŅĐž СĐŊаĐŊĐ¸ŅĐŧи иС [ĐŖŅ‡ĐĩĐąĐŊиĐē - Đ ŅƒĐēĐžĐ˛ĐžĐ´ŅŅ‚Đ˛Đž ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ](../tutorial/index.md){.internal-link target=_blank}. + +И ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đĩ Ņ€Đ°ĐˇĐ´ĐĩĐģŅ‹ ĐŋŅ€ĐĩĐ´ĐŋĐžĐģĐ°ĐŗĐ°ŅŽŅ‚, Ņ‡Ņ‚Đž Đ˛Ņ‹ ҃ĐļĐĩ ĐŋŅ€ĐžŅ‡Đ¸Ņ‚Đ°Đģи ĐĩĐŗĐž, и ĐŋŅ€ĐĩĐ´ĐŋĐžĐģĐ°ĐŗĐ°ŅŽŅ‚, Ņ‡Ņ‚Đž Đ˛Ņ‹ СĐŊаĐĩŅ‚Đĩ ŅŅ‚Đ¸ ĐžŅĐŊОвĐŊŅ‹Đĩ идĐĩи. diff --git a/docs/ru/docs/advanced/response-change-status-code.md b/docs/ru/docs/advanced/response-change-status-code.md new file mode 100644 index 000000000..37dade99f --- /dev/null +++ b/docs/ru/docs/advanced/response-change-status-code.md @@ -0,0 +1,31 @@ +# Response - ИСĐŧĐĩĐŊĐĩĐŊиĐĩ cŅ‚Đ°Ņ‚ŅƒŅ ĐēОда + +Đ’Ņ‹, вĐĩŅ€ĐžŅŅ‚ĐŊĐž, ҃ĐļĐĩ Ņ‡Đ¸Ņ‚Đ°Đģи Đž Ņ‚ĐžĐŧ, Ņ‡Ņ‚Đž ĐŧĐžĐļĐŊĐž ŅƒŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ [ĐĄĐžŅŅ‚ĐžŅĐŊиĐĩ ĐžŅ‚Đ˛ĐĩŅ‚Đ° ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ](../tutorial/response-status-code.md){.internal-link target=_blank}. + +Но в ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… ҁĐģŅƒŅ‡Đ°ŅŅ… ваĐŧ ĐŊ҃ĐļĐŊĐž вĐĩŅ€ĐŊŅƒŅ‚ŅŒ ĐēОд ŅĐžŅŅ‚ĐžŅĐŊĐ¸Ņ, ĐžŅ‚ĐģĐ¸Ņ‡ĐŊŅ‹Đš ĐžŅ‚ ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊĐžĐŗĐž ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ. + +## ĐŸŅ€Đ¸ĐŧĐĩŅ€ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ + +НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ŅŒŅ‚Đĩ, Ņ‡Ņ‚Đž Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°Ņ‚ŅŒ HTTP ĐēОд ŅĐžŅŅ‚ĐžŅĐŊĐ¸Ņ "OK" `200` ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ. + +Но ĐĩҁĐģи даĐŊĐŊŅ‹Đĩ ĐŊĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ĐžĐ˛Đ°Đģи, Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅĐžĐˇĐ´Đ°Ņ‚ŅŒ Đ¸Ņ… и вĐĩŅ€ĐŊŅƒŅ‚ŅŒ HTTP ĐēОд ŅĐžŅŅ‚ĐžŅĐŊĐ¸Ņ "CREATED" `201`. + +ĐŸŅ€Đ¸ ŅŅ‚ĐžĐŧ Đ˛Ņ‹ Đ˛ŅŅ‘ Đĩ҉ґ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ иĐŧĐĩŅ‚ŅŒ вОСĐŧĐžĐļĐŊĐžŅŅ‚ŅŒ Ņ„Đ¸ĐģŅŒŅ‚Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ и ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇĐžĐ˛Ņ‹Đ˛Đ°Ņ‚ŅŒ Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°ĐĩĐŧŅ‹Đĩ даĐŊĐŊŅ‹Đĩ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ `response_model`. + +ДĐģŅ Ņ‚Đ°ĐēĐ¸Ņ… ҁĐģŅƒŅ‡Đ°Đĩв Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `Response`. + +## Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° `Response` + +Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐžĐąŅŠŅĐ˛Đ¸Ņ‚ŅŒ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ Ņ‚Đ¸Đŋа `Response` в Đ˛Đ°ŅˆĐĩĐš *Ņ„ŅƒĐŊĐēŅ†Đ¸Đ¸ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēи ĐŋŅƒŅ‚Đ¸* (Ņ‚Đ°Đē ĐļĐĩ ĐēаĐē Đ´ĐģŅ cookies и headers). + +И ĐˇĐ°Ņ‚ĐĩĐŧ Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ŅƒŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ `status_code` в ŅŅ‚ĐžĐŧ *Đ˛Ņ€ĐĩĐŧĐĩĐŊĐŊĐžĐŧ* ĐžĐąŅŠĐĩĐēŅ‚Đĩ ĐžŅ‚Đ˛ĐĩŅ‚Đ°. + +{* ../../docs_src/response_change_status_code/tutorial001.py hl[1,9,12] *} + +ĐŸĐžŅĐģĐĩ ŅŅ‚ĐžĐŗĐž Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ вĐĩŅ€ĐŊŅƒŅ‚ŅŒ ĐģŅŽĐąĐžĐš ĐžĐąŅŠĐĩĐēŅ‚, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš ваĐŧ ĐŊ҃ĐļĐĩĐŊ, ĐēаĐē ĐžĐąŅ‹Ņ‡ĐŊĐž (`dict`, ĐŧОдĐĩĐģҌ ĐąĐ°ĐˇŅ‹ даĐŊĐŊҋ҅ и Ņ‚.Đ´.). + +И ĐĩҁĐģи Đ˛Ņ‹ ĐžĐąŅŠŅĐ˛Đ¸Đģи `response_model`, ĐžĐŊ Đ˛ŅŅ‘ Ņ€Đ°Đ˛ĐŊĐž ĐąŅƒĐ´ĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ Đ´ĐģŅ Ņ„Đ¸ĐģŅŒŅ‚Ņ€Đ°Ņ†Đ¸Đ¸ и ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°ĐĩĐŧĐžĐŗĐž ĐžĐąŅŠĐĩĐēŅ‚Đ°. + +**FastAPI** ĐąŅƒĐ´ĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅŅ‚ĐžŅ‚ *Đ˛Ņ€ĐĩĐŧĐĩĐŊĐŊŅ‹Đš* ĐžŅ‚Đ˛ĐĩŅ‚ Đ´ĐģŅ иСвĐģĐĩ҇ĐĩĐŊĐ¸Ņ ĐēОда ŅĐžŅŅ‚ĐžŅĐŊĐ¸Ņ (а Ņ‚Đ°ĐēĐļĐĩ cookies и headers) и ĐŋĐžĐŧĐĩŅŅ‚Đ¸Ņ‚ Đ¸Ņ… в Ņ„Đ¸ĐŊаĐģҌĐŊŅ‹Đš ĐžŅ‚Đ˛ĐĩŅ‚, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš ŅĐžĐ´ĐĩŅ€ĐļĐ¸Ņ‚ Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°ĐĩĐŧĐžĐĩ ваĐŧи СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ, ĐžŅ‚Ņ„Đ¸ĐģŅŒŅ‚Ņ€ĐžĐ˛Đ°ĐŊĐŊĐžĐĩ ĐģŅŽĐąŅ‹Đŧ `response_model`. + +Đ’Ņ‹ Ņ‚Đ°ĐēĐļĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ ĐžĐąŅŠŅĐ˛Đ¸Ņ‚ŅŒ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `Response` в ĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐžŅŅ‚ŅŅ… и ŅƒŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ĐēОд ŅĐžŅŅ‚ĐžŅĐŊĐ¸Ņ в ĐŊĐ¸Ņ…. Но ĐŋĐžĐŧĐŊĐ¸Ņ‚Đĩ, Ņ‡Ņ‚Đž ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐĩ ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊĐžĐĩ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ ĐąŅƒĐ´ĐĩŅ‚ иĐŧĐĩŅ‚ŅŒ ĐŋŅ€Đ¸ĐžŅ€Đ¸Ņ‚ĐĩŅ‚. diff --git a/docs/ru/docs/advanced/response-directly.md b/docs/ru/docs/advanced/response-directly.md new file mode 100644 index 000000000..ee83d22b1 --- /dev/null +++ b/docs/ru/docs/advanced/response-directly.md @@ -0,0 +1,65 @@ +# Đ’ĐžĐˇĐ˛Ņ€Đ°Ņ‚ ĐžŅ‚Đ˛ĐĩŅ‚Đ° ĐŊаĐŋŅ€ŅĐŧŅƒŅŽ + +ĐšĐžĐŗĐ´Đ° Đ˛Ņ‹ ŅĐžĐˇĐ´Đ°Ņ‘Ņ‚Đĩ **FastAPI** *ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅŽ ĐŋŅƒŅ‚Đ¸*, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°Ņ‚ŅŒ иС ĐŊĐĩŅ‘ ĐģŅŽĐąŅ‹Đĩ даĐŊĐŊŅ‹Đĩ: `dict`, `list`, Pydantic-ĐŧОдĐĩĐģҌ, ĐŧОдĐĩĐģҌ ĐąĐ°ĐˇŅ‹ даĐŊĐŊҋ҅ и Ņ‚.Đ´. + +По ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ **FastAPI** Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒĐĩŅ‚ Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°ĐĩĐŧĐžĐĩ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ в JSON ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ `jsonable_encoder`, ĐēаĐē ĐžĐŋĐ¸ŅĐ°ĐŊĐž в [JSON ĐēĐžĐ´Đ¸Ņ€ĐžĐ˛Ņ‰Đ¸Đē](../tutorial/encoder.md){.internal-link target=_blank}. + +Đ—Đ°Ņ‚ĐĩĐŧ "ĐŋОд ĐēаĐŋĐžŅ‚ĐžĐŧ" ŅŅ‚Đ¸ даĐŊĐŊŅ‹Đĩ, ŅĐžĐ˛ĐŧĐĩŅŅ‚Đ¸ĐŧŅ‹Đĩ ҁ JSON (ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€ `dict`), ĐŋĐžĐŧĐĩŅ‰Đ°ŅŽŅ‚ŅŅ в `JSONResponse`, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Đ´ĐģŅ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đēи ĐžŅ‚Đ˛ĐĩŅ‚Đ° ĐēĐģиĐĩĐŊŅ‚Ņƒ. + +Но Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°Ņ‚ŅŒ `JSONResponse` ĐŊаĐŋŅ€ŅĐŧŅƒŅŽ иС Đ˛Đ°ŅˆĐ¸Ņ… *ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đš ĐŋŅƒŅ‚Đ¸*. + +Đ­Ņ‚Đž ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ ĐŋĐžĐģĐĩСĐŊĐž, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐĩҁĐģи ĐŊ҃ĐļĐŊĐž вĐĩŅ€ĐŊŅƒŅ‚ŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēиĐĩ ĐˇĐ°ĐŗĐžĐģОвĐēи иĐģи Đē҃Đēи. + +## Đ’ĐžĐˇĐ˛Ņ€Đ°Ņ‚ `Response` + +На ŅĐ°ĐŧĐžĐŧ Đ´ĐĩĐģĐĩ, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°Ņ‚ŅŒ ĐģŅŽĐąĐžĐš ĐžĐąŅŠĐĩĐēŅ‚ `Response` иĐģи ĐĩĐŗĐž ĐŋОдĐēĐģĐ°ŅŅ. + +/// tip | ĐŸĐžĐ´ŅĐēаСĐēа + +`JSONResponse` ŅĐ°Đŧ ĐŋĐž ҁĐĩĐąĐĩ ŅĐ˛ĐģŅĐĩŅ‚ŅŅ ĐŋОдĐēĐģĐ°ŅŅĐžĐŧ `Response`. + +/// + +И ĐēĐžĐŗĐ´Đ° Đ˛Ņ‹ Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚Đĩ `Response`, **FastAPI** ĐŋĐĩŅ€ĐĩĐ´Đ°ŅŅ‚ ĐĩĐŗĐž ĐŊаĐŋŅ€ŅĐŧŅƒŅŽ. + +Đ­Ņ‚Đž ĐŊĐĩ ĐŋŅ€Đ¸Đ˛ĐĩĐ´ĐĩŅ‚ Đē ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇĐžĐ˛Đ°ĐŊĐ¸ŅŽ даĐŊĐŊҋ҅ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ Pydantic-ĐŧОдĐĩĐģĐĩĐš, ŅĐžĐ´ĐĩŅ€ĐļиĐŧĐžĐĩ ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚ ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇĐžĐ˛Đ°ĐŊĐž в ĐēаĐēОК-ĐģийО Ņ‚Đ¸Đŋ и Ņ‚.Đ´. + +Đ­Ņ‚Đž Đ´Đ°Ņ‘Ņ‚ ваĐŧ йОĐģŅŒŅˆŅƒŅŽ ĐŗĐ¸ĐąĐēĐžŅŅ‚ŅŒ. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°Ņ‚ŅŒ ĐģŅŽĐąŅ‹Đĩ Ņ‚Đ¸ĐŋŅ‹ даĐŊĐŊҋ҅, ĐŋĐĩŅ€ĐĩĐžĐŋŅ€ĐĩĐ´ĐĩĐģŅŅ‚ŅŒ ĐģŅŽĐąŅ‹Đĩ ĐžĐąŅŠŅĐ˛ĐģĐĩĐŊĐ¸Ņ иĐģи ваĐģĐ¸Đ´Đ°Ņ†Đ¸ŅŽ даĐŊĐŊҋ҅ и Ņ‚.Đ´. + +## Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩ `jsonable_encoder` в `Response` + +ĐŸĐžŅĐēĐžĐģҌĐē҃ **FastAPI** ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ ĐžĐąŅŠĐĩĐēŅ‚ `Response`, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš Đ˛Ņ‹ Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚Đĩ, Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ŅƒĐąĐĩĐ´Đ¸Ņ‚ŅŒŅŅ, Ņ‡Ņ‚Đž ĐĩĐŗĐž ŅĐžĐ´ĐĩŅ€ĐļиĐŧĐžĐĩ ĐŗĐžŅ‚ĐžĐ˛Đž Đē ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐēĐĩ. + +НаĐŋŅ€Đ¸ĐŧĐĩŅ€, Đ˛Ņ‹ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐŧĐĩŅŅ‚Đ¸Ņ‚ŅŒ Pydantic-ĐŧОдĐĩĐģҌ в `JSONResponse`, ĐŊĐĩ ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇĐžĐ˛Đ°Đ˛ ĐĩŅ‘ ҁĐŊĐ°Ņ‡Đ°Đģа в `dict` ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ Đ˛ŅĐĩŅ… Ņ‚Đ¸ĐŋОв даĐŊĐŊҋ҅ (Ņ‚Đ°ĐēĐ¸Ņ… ĐēаĐē `datetime`, `UUID` и Ņ‚.Đ´.) в ŅĐžĐ˛ĐŧĐĩŅŅ‚Đ¸ĐŧŅ‹Đĩ ҁ JSON Ņ‚Đ¸ĐŋŅ‹. + +В Ņ‚Đ°ĐēĐ¸Ņ… ҁĐģŅƒŅ‡Đ°ŅŅ… Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ `jsonable_encoder` Đ´ĐģŅ ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ даĐŊĐŊҋ҅ ĐŋĐĩŅ€ĐĩĐ´ ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‡ĐĩĐš Đ¸Ņ… в ĐžŅ‚Đ˛ĐĩŅ‚: + +{* ../../docs_src/response_directly/tutorial001.py hl[6:7,21:22] *} + +/// note | ĐĸĐĩŅ…ĐŊĐ¸Ņ‡ĐĩҁĐēиĐĩ Đ´ĐĩŅ‚Đ°Đģи + +Đ’Ņ‹ Ņ‚Đ°ĐēĐļĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ `from starlette.responses import JSONResponse`. + +**FastAPI** ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ `starlette.responses` ҇ĐĩŅ€ĐĩС `fastapi.responses` ĐŋŅ€ĐžŅŅ‚Đž Đ´ĐģŅ Đ˛Đ°ŅˆĐĩĐŗĐž ŅƒĐ´ĐžĐąŅŅ‚Đ˛Đ°, ĐēаĐē Ņ€Đ°ĐˇŅ€Đ°ĐąĐžŅ‚Ņ‡Đ¸Đēа. Но йОĐģŅŒŅˆĐ¸ĐŊŅŅ‚Đ˛Đž Đ´ĐžŅŅ‚ŅƒĐŋĐŊҋ҅ Response-ĐēĐģĐ°ŅŅĐžĐ˛ ĐŋĐžŅŅ‚ŅƒĐŋĐ°ŅŽŅ‚ ĐŊаĐŋŅ€ŅĐŧŅƒŅŽ иС Starlette. + +/// + +## Đ’ĐžĐˇĐ˛Ņ€Đ°Ņ‚ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēĐžĐŗĐž `Response` + +ĐŸŅ€Đ¸ĐŧĐĩŅ€ Đ˛Ņ‹ŅˆĐĩ ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ Đ˛ŅĐĩ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧŅ‹Đĩ Ņ‡Đ°ŅŅ‚Đ¸, ĐŊĐž ĐžĐŊ ĐŋĐžĐēа ĐŊĐĩ ĐžŅ‡ĐĩĐŊҌ ĐŋĐžĐģĐĩСĐĩĐŊ, Ņ‚Đ°Đē ĐēаĐē Đ˛Ņ‹ ĐŧĐžĐŗĐģи ĐąŅ‹ ĐŋŅ€ĐžŅŅ‚Đž вĐĩŅ€ĐŊŅƒŅ‚ŅŒ `item` ĐŊаĐŋŅ€ŅĐŧŅƒŅŽ, и **FastAPI** ĐŋĐžĐŧĐĩŅŅ‚Đ¸Đģ ĐąŅ‹ ĐĩĐŗĐž в `JSONResponse`, ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇĐžĐ˛Đ°Đ˛ в `dict` и Ņ‚.Đ´. Đ’ŅŅ‘ ŅŅ‚Đž ĐŋŅ€ĐžĐ¸ŅŅ…ĐžĐ´Đ¸Ņ‚ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ. + +ĐĸĐĩĐŋĐĩŅ€ŅŒ Đ´Đ°Đ˛Đ°ĐšŅ‚Đĩ ĐŋĐžŅĐŧĐžŅ‚Ņ€Đ¸Đŧ, ĐēаĐē ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅŅ‚Đž Đ´ĐģŅ Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‚Đ° ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēĐžĐŗĐž ĐžŅ‚Đ˛ĐĩŅ‚Đ°. + +ДоĐŋŅƒŅŅ‚Đ¸Đŧ, Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ вĐĩŅ€ĐŊŅƒŅ‚ŅŒ ĐžŅ‚Đ˛ĐĩŅ‚ в Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đĩ XML. + +Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐŧĐĩŅŅ‚Đ¸Ņ‚ŅŒ Đ˛Đ°Ņˆ XML-ĐēĐžĐŊŅ‚ĐĩĐŊŅ‚ в ŅŅ‚Ņ€ĐžĐē҃, ĐŋĐžĐŧĐĩŅŅ‚Đ¸Ņ‚ŅŒ ĐĩŅ‘ в `Response` и вĐĩŅ€ĐŊŅƒŅ‚ŅŒ: + +{* ../../docs_src/response_directly/tutorial002.py hl[1,18] *} + +## ĐŸŅ€Đ¸ĐŧĐĩŅ‡Đ°ĐŊĐ¸Ņ + +ĐšĐžĐŗĐ´Đ° Đ˛Ņ‹ Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚Đĩ ĐžĐąŅŠĐĩĐēŅ‚ `Response` ĐŊаĐŋŅ€ŅĐŧŅƒŅŽ, ĐĩĐŗĐž даĐŊĐŊŅ‹Đĩ ĐŊĐĩ ваĐģĐ¸Đ´Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ, ĐŊĐĩ ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒŅŽŅ‚ŅŅ (ĐŊĐĩ ҁĐĩŅ€Đ¸Đ°ĐģĐ¸ĐˇŅƒŅŽŅ‚ŅŅ) и ĐŊĐĩ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи. + +Но Đ˛Ņ‹ Đ˛ŅŅ‘ Ņ€Đ°Đ˛ĐŊĐž ĐŧĐžĐļĐĩŅ‚Đĩ СадОĐē҃ĐŧĐĩĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ŅŅ‚Đž, ĐēаĐē ĐžĐŋĐ¸ŅĐ°ĐŊĐž в [ДоĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ ĐžŅ‚Đ˛Đĩ҂ҋ в OpenAPI](additional-responses.md){.internal-link target=_blank}. + +В ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Ņ… Ņ€Đ°ĐˇĐ´ĐĩĐģĐ°Ņ… Đ˛Ņ‹ ŅƒĐ˛Đ¸Đ´Đ¸Ņ‚Đĩ, ĐēаĐē Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ/ĐžĐąŅŠŅĐ˛ĐģŅŅ‚ŅŒ Ņ‚Đ°ĐēиĐĩ ĐēĐ°ŅŅ‚ĐžĐŧĐŊŅ‹Đĩ `Response`, ĐŋŅ€Đ¸ ŅŅ‚ĐžĐŧ ŅĐžŅ…Ņ€Đ°ĐŊŅŅ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēĐžĐĩ ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇĐžĐ˛Đ°ĐŊиĐĩ даĐŊĐŊҋ҅, Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸ŅŽ и Ņ‚.Đ´. diff --git a/docs/ru/docs/deployment/concepts.md b/docs/ru/docs/deployment/concepts.md index 7cdc29526..acfa1f4fe 100644 --- a/docs/ru/docs/deployment/concepts.md +++ b/docs/ru/docs/deployment/concepts.md @@ -216,7 +216,7 @@ КаĐļĐ´Ņ‹Đš иС ŅŅ‚Đ¸Ņ… ĐŋŅ€ĐžŅ†ĐĩŅŅĐžĐ˛ ĐąŅƒĐ´ĐĩŅ‚ СаĐŋ҃ҁĐēĐ°Ņ‚ŅŒ Đ˛Đ°ŅˆĐĩ ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ Đ´ĐģŅ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēи ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐŊĐžĐŗĐž **СаĐŋŅ€ĐžŅĐ°** и Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰ĐĩĐŊĐ¸Ņ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊĐŊĐžĐŗĐž **ĐžŅ‚Đ˛ĐĩŅ‚Đ°** и ĐžĐŊи ĐąŅƒĐ´ŅƒŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐŋĐĩŅ€Đ°Ņ‚Đ¸Đ˛ĐŊŅƒŅŽ ĐŋаĐŧŅŅ‚ŅŒ. - + БĐĩĐˇŅƒŅĐģОвĐŊĐž, ĐŊа ŅŅ‚ĐžĐŧ ĐļĐĩ ҁĐĩŅ€Đ˛ĐĩŅ€Đĩ ĐąŅƒĐ´ŅƒŅ‚ Ņ€Đ°ĐąĐžŅ‚Đ°Ņ‚ŅŒ и **Đ´Ņ€ŅƒĐŗĐ¸Đĩ ĐŋŅ€ĐžŅ†Đĩҁҁҋ**, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊĐĩ ĐžŅ‚ĐŊĐžŅŅŅ‚ŅŅ Đē Đ˛Đ°ŅˆĐĩĐŧ҃ ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊĐ¸ŅŽ. diff --git a/docs/ru/docs/deployment/https.md b/docs/ru/docs/deployment/https.md index 85c4cce60..d8877a9a1 100644 --- a/docs/ru/docs/deployment/https.md +++ b/docs/ru/docs/deployment/https.md @@ -92,7 +92,7 @@ DNS-ҁĐĩŅ€Đ˛ĐĩŅ€Đ° ĐŋŅ€Đ¸ŅŅ‹ĐģĐ°ŅŽŅ‚ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Ņƒ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģŅ‘ĐŊĐŊŅ‹Đš **IP-Đ°Đ´Ņ€Đĩҁ**, Ņ‚ĐžŅ‚ ŅĐ°ĐŧŅ‹Đš ĐŋŅƒĐąĐģĐ¸Ņ‡ĐŊŅ‹Đš IP-Đ°Đ´Ņ€Đĩҁ Đ˛Đ°ŅˆĐĩĐŗĐž ҁĐĩŅ€Đ˛ĐĩŅ€Đ°, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš Đ˛Ņ‹ ҃ĐēаСаĐģи в Ņ€ĐĩŅŅƒŅ€ŅĐŊОК "СаĐŋĐ¸ŅĐ¸ А" ĐŋŅ€Đ¸ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐĩ. - + ### Đ ŅƒĐēĐžĐŋĐžĐļĐ°Ņ‚Đ¸Đĩ TLS @@ -100,7 +100,7 @@ DNS-ҁĐĩŅ€Đ˛ĐĩŅ€Đ° ĐŋŅ€Đ¸ŅŅ‹ĐģĐ°ŅŽŅ‚ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Ņƒ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģŅ‘ĐŊĐŊŅ‹Đš ПĐĩŅ€Đ˛Ņ‹Đŧ ŅˆĐ°ĐŗĐžĐŧ ĐąŅƒĐ´ĐĩŅ‚ ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиĐĩ ŅĐžĐĩдиĐŊĐĩĐŊĐ¸Ņ ĐŧĐĩĐļĐ´Ņƒ ĐēĐģиĐĩĐŊŅ‚ĐžĐŧ (ĐąŅ€Đ°ŅƒĐˇĐĩŅ€ĐžĐŧ) и ҁĐĩŅ€Đ˛ĐĩŅ€ĐžĐŧ и Đ˛Ņ‹ĐąĐžŅ€ ĐēŅ€Đ¸ĐŋŅ‚ĐžĐŗŅ€Đ°Ņ„Đ¸Ņ‡ĐĩҁĐēĐžĐŗĐž ĐēĐģŅŽŅ‡Đ° (Đ´ĐģŅ ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ). - + Đ­Ņ‚Đ° Ņ‡Đ°ŅŅ‚ŅŒ ĐēĐģиĐĩĐŊŅ‚-ҁĐĩŅ€Đ˛ĐĩŅ€ĐŊĐžĐŗĐž вСаиĐŧОдĐĩĐšŅŅ‚Đ˛Đ¸Ņ ŅƒŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ TLS-ŅĐžĐĩдиĐŊĐĩĐŊиĐĩ и ĐŊĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ŅŅ **TLS-Ņ€ŅƒĐēĐžĐŋĐžĐļĐ°Ņ‚Đ¸ĐĩĐŧ**. @@ -118,7 +118,7 @@ DNS-ҁĐĩŅ€Đ˛ĐĩŅ€Đ° ĐŋŅ€Đ¸ŅŅ‹ĐģĐ°ŅŽŅ‚ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Ņƒ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģŅ‘ĐŊĐŊŅ‹Đš ĐĸĐž ĐĩŅŅ‚ŅŒ ĐąŅƒĐ´ĐĩŅ‚ Đ˛Ņ‹ĐąŅ€Đ°ĐŊ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ Đ´ĐģŅ Đ´ĐžĐŧĐĩĐŊа `someapp.example.com`. - + КĐģиĐĩĐŊŅ‚ ҃ĐļĐĩ **дОвĐĩŅ€ŅĐĩŅ‚** Ņ‚ĐžĐŧ҃, ĐēŅ‚Đž Đ˛Ņ‹Đ´Đ°Đģ ŅŅ‚ĐžŅ‚ TLS-ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ (в ĐŊĐ°ŅˆĐĩĐŧ ҁĐģŅƒŅ‡Đ°Đĩ - Let's Encrypt, ĐŊĐž ĐŧŅ‹ Đĩ҉ґ ĐžĐąŅŅƒĐ´Đ¸Đŧ ŅŅ‚Đž), ĐŋĐžŅ‚ĐžĐŧ҃ ĐŧĐžĐļĐĩŅ‚ **ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ**, Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģĐĩĐŊ Đģи ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐŊŅ‹Đš ĐžŅ‚ ҁĐĩŅ€Đ˛ĐĩŅ€Đ° ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚. @@ -140,19 +140,19 @@ DNS-ҁĐĩŅ€Đ˛ĐĩŅ€Đ° ĐŋŅ€Đ¸ŅŅ‹ĐģĐ°ŅŽŅ‚ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Ņƒ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģŅ‘ĐŊĐŊŅ‹Đš ĐĸаĐē ĐēĐģиĐĩĐŊŅ‚ ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģŅĐĩŅ‚ **HTTPS-СаĐŋŅ€ĐžŅ**. ĐĸĐž ĐĩŅŅ‚ŅŒ ĐžĐąŅ‹Ņ‡ĐŊŅ‹Đš HTTP-СаĐŋŅ€ĐžŅ, ĐŊĐž ҇ĐĩŅ€ĐĩС ĐˇĐ°ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐŊĐžĐĩ TLS-ŅĐžĐ´Đ¸ĐŊĐĩĐŊиĐĩ. - + ### Đ Đ°ŅŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đēа СаĐŋŅ€ĐžŅĐ° ĐŸŅ€ĐžĐēŅĐ¸-ҁĐĩŅ€Đ˛ĐĩŅ€, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ŅĐžĐŗĐģĐ°ŅĐžĐ˛Đ°ĐŊĐŊŅ‹Đš ҁ ĐēĐģиĐĩĐŊŅ‚ĐžĐŧ ĐēĐģŅŽŅ‡, Ņ€Đ°ŅŅˆĐ¸Ņ„Ņ€ŅƒĐĩŅ‚ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐŊŅ‹Đš **ĐˇĐ°ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đš СаĐŋŅ€ĐžŅ** и ĐŋĐĩŅ€ĐĩĐ´Đ°ŅŅ‚ **ĐžĐąŅ‹Ņ‡ĐŊŅ‹Đš (ĐŊĐĩĐˇĐ°ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đš) HTTP-СаĐŋŅ€ĐžŅ** ĐŋŅ€ĐžŅ†Đĩҁҁ҃, СаĐŋ҃ҁĐēĐ°ŅŽŅ‰ĐĩĐŧ҃ ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ (ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐŋŅ€ĐžŅ†Đĩҁҁ҃ Uvicorn СаĐŋ҃ҁĐēĐ°ŅŽŅ‰ĐĩĐŧ҃ ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ FastAPI). - + ### HTTP-ĐžŅ‚Đ˛ĐĩŅ‚ ĐŸŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đ°ĐĩŅ‚ СаĐŋŅ€ĐžŅ и вĐĩŅ€ĐŊґ҂ **ĐžĐąŅ‹Ņ‡ĐŊŅ‹Đš (ĐŊĐĩĐˇĐ°ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đš) HTTP-ĐžŅ‚Đ˛ĐĩŅ‚** ĐŋŅ€ĐžĐēŅĐ¸-ҁĐĩŅ€Đ˛ĐĩŅ€Ņƒ. - + ### HTTPS-ĐžŅ‚Đ˛ĐĩŅ‚ @@ -160,7 +160,7 @@ DNS-ҁĐĩŅ€Đ˛ĐĩŅ€Đ° ĐŋŅ€Đ¸ŅŅ‹ĐģĐ°ŅŽŅ‚ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Ņƒ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģŅ‘ĐŊĐŊŅ‹Đš НаĐēĐžĐŊĐĩ҆, ĐąŅ€Đ°ŅƒĐˇĐĩŅ€ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ ĐžŅ‚Đ˛ĐĩŅ‚, в Ņ‚ĐžĐŧ Ņ‡Đ¸ŅĐģĐĩ, Ņ‡Ņ‚Đž Ņ‚ĐžŅ‚ ĐˇĐ°ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊ ҁ ĐŊ҃ĐļĐŊŅ‹Đŧ ĐēĐģŅŽŅ‡ĐžĐŧ, **Ņ€Đ°ŅŅˆĐ¸Ņ„Ņ€ŅƒĐĩŅ‚ ĐĩĐŗĐž** и ĐžĐąŅ€Đ°ĐąĐžŅ‚Đ°ĐĩŅ‚. - + КĐģиĐĩĐŊŅ‚ (ĐąŅ€Đ°ŅƒĐˇĐĩŅ€) СĐŊаĐĩŅ‚, Ņ‡Ņ‚Đž ĐžŅ‚Đ˛ĐĩŅ‚ ĐŋŅ€Đ¸ŅˆŅ‘Đģ ĐžŅ‚ ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐžĐŗĐž ҁĐĩŅ€Đ˛ĐĩŅ€Đ°, Ņ‚Đ°Đē ĐēаĐē Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ ĐŧĐĩŅ‚ĐžĐ´Ņ‹ ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ, ŅĐžĐŗĐģĐ°ŅĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ иĐŧи Ņ€Đ°ĐŊĐŊĐĩĐĩ ҇ĐĩŅ€ĐĩС **HTTPS-ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚**. @@ -171,7 +171,7 @@ DNS-ҁĐĩŅ€Đ˛ĐĩŅ€Đ° ĐŋŅ€Đ¸ŅŅ‹ĐģĐ°ŅŽŅ‚ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Ņƒ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģŅ‘ĐŊĐŊŅ‹Đš НаĐŋĐžĐŧĐŊŅŽ, Ņ‡Ņ‚Đž Ņ‚ĐžĐģҌĐēĐž ОдиĐŊ ĐŋŅ€ĐžŅ†Đĩҁҁ (ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐŋŅ€ĐžĐēŅĐ¸-ҁĐĩŅ€Đ˛ĐĩŅ€) ĐŧĐžĐļĐĩŅ‚ ĐŋŅ€ĐžŅĐģŅƒŅˆĐ¸Đ˛Đ°Ņ‚ŅŒ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģŅ‘ĐŊĐŊŅ‹Đš ĐŋĐžŅ€Ņ‚ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģŅ‘ĐŊĐŊĐžĐŗĐž IP-Đ°Đ´Ņ€ĐĩŅĐ°. Но Đ´Ņ€ŅƒĐŗĐ¸Đĩ ĐŋŅ€ĐžŅ†Đĩҁҁҋ и ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊĐ¸Ņ Ņ‚ĐžĐļĐĩ ĐŧĐžĐŗŅƒŅ‚ Ņ€Đ°ĐąĐžŅ‚Đ°Ņ‚ŅŒ ĐŊа ŅŅ‚ĐžĐŧ ĐļĐĩ ҁĐĩŅ€Đ˛ĐĩŅ€Đĩ (ҁĐĩŅ€Đ˛ĐĩŅ€Đ°Ņ…), ĐĩҁĐģи ĐžĐŊи ĐŊĐĩ ĐŋŅ‹Ņ‚Đ°ŅŽŅ‚ŅŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ҃ĐļĐĩ СаĐŊŅŅ‚ŅƒŅŽ **ĐēĐžĐŧйиĐŊĐ°Ņ†Đ¸ŅŽ IP-Đ°Đ´Ņ€ĐĩŅĐ° и ĐŋĐžŅ€Ņ‚Đ°** (ŅĐžĐēĐĩŅ‚). - + ĐĸаĐēиĐŧ ĐžĐąŅ€Đ°ĐˇĐžĐŧ, ҁĐĩŅ€Đ˛ĐĩŅ€ СавĐĩŅ€ŅˆĐĩĐŊĐ¸Ņ TLS ĐŧĐžĐļĐĩŅ‚ ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°Ņ‚ŅŒ HTTPS-СаĐŋŅ€ĐžŅŅ‹ и Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚Ņ‹ Đ´ĐģŅ **ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛Đ° Đ´ĐžĐŧĐĩĐŊОв** иĐģи ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиК и ĐŋĐĩŅ€ĐĩĐ´Đ°Đ˛Đ°Ņ‚ŅŒ СаĐŋŅ€ĐžŅŅ‹ ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊŅ‹Đŧ Đ°Đ´Ņ€ĐĩŅĐ°Ņ‚Đ°Đŧ (Đ´Ņ€ŅƒĐŗĐ¸Đŧ ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊĐ¸ŅĐŧ). @@ -181,7 +181,7 @@ DNS-ҁĐĩŅ€Đ˛ĐĩŅ€Đ° ĐŋŅ€Đ¸ŅŅ‹ĐģĐ°ŅŽŅ‚ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Ņƒ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģŅ‘ĐŊĐŊŅ‹Đš ĐšĐžĐŗĐ´Đ° ŅŅ‚Đž ĐŋŅ€ĐžĐ¸ĐˇĐžĐšĐ´Ņ‘Ņ‚, ĐŧĐžĐļĐŊĐž СаĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ Đ´Ņ€ŅƒĐŗŅƒŅŽ ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧ҃, ĐēĐžŅ‚ĐžŅ€Đ°Ņ ĐŋОдĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŅ Đē Let's Encrypt и ОйĐŊĐžĐ˛Đ¸Ņ‚ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚(Ņ‹). ĐĄŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‚ ĐŋŅ€ĐžĐēŅĐ¸-ҁĐĩŅ€Đ˛ĐĩҀҋ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŧĐžĐŗŅƒŅ‚ ŅĐ´ĐĩĐģĐ°Ņ‚ŅŒ ŅŅ‚Đž Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Đĩ ŅĐ°ĐŧĐžŅŅ‚ĐžŅŅ‚ĐĩĐģҌĐŊĐž. - + **TLS-ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚Ņ‹** ĐŊĐĩ ĐŋŅ€Đ¸Đ˛ŅĐˇĐ°ĐŊŅ‹ Đē IP-Đ°Đ´Ņ€Đĩҁ҃, ĐŊĐž **ŅĐ˛ŅĐˇĐ°ĐŊŅ‹ ҁ иĐŧĐĩĐŊĐĩĐŧ Đ´ĐžĐŧĐĩĐŊа**. diff --git a/docs/ru/docs/tutorial/bigger-applications.md b/docs/ru/docs/tutorial/bigger-applications.md index 7c3dc288f..8b9080d39 100644 --- a/docs/ru/docs/tutorial/bigger-applications.md +++ b/docs/ru/docs/tutorial/bigger-applications.md @@ -52,7 +52,7 @@ from app.routers import items * ПодĐēĐ°Ņ‚Đ°ĐģĐžĐŗ `app/internal/`, ŅĐžĐ´ĐĩŅ€ĐļĐ°Ņ‰Đ¸Đš Ņ„Đ°ĐšĐģ `__init__.py`, ŅĐ˛ĐģŅĐĩŅ‚ŅŅ Đĩ҉ґ ОдĐŊиĐŧ ŅŅƒĐą-ĐŋаĐēĐĩŅ‚ĐžĐŧ: `app.internal`. * А Ņ„Đ°ĐšĐģ `app/internal/admin.py` ŅĐ˛ĐģŅĐĩŅ‚ŅŅ Đĩ҉ґ ОдĐŊиĐŧ ŅŅƒĐą-ĐŧĐžĐ´ŅƒĐģĐĩĐŧ: `app.internal.admin`. - + Đĸа ĐļĐĩ ŅĐ°ĐŧĐ°Ņ Ņ„Đ°ĐšĐģĐžĐ˛Đ°Ņ ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Đ° ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊĐ¸Ņ, ĐŊĐž ҁ ĐēĐžĐŧĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸ŅĐŧи: @@ -269,7 +269,7 @@ from .dependencies import get_token_header Đ’ŅĐŋĐžĐŧĐŊĐ¸Ņ‚Đĩ, ĐēаĐē Đ˛Ņ‹ĐŗĐģŅĐ´Đ¸Ņ‚ Ņ„Đ°ĐšĐģĐžĐ˛Đ°Ņ ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Đ° ĐŊĐ°ŅˆĐĩĐŗĐž ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊĐ¸Ņ: - + --- diff --git a/docs/ru/docs/tutorial/cookie-param-models.md b/docs/ru/docs/tutorial/cookie-param-models.md new file mode 100644 index 000000000..3a57443bb --- /dev/null +++ b/docs/ru/docs/tutorial/cookie-param-models.md @@ -0,0 +1,76 @@ +# МодĐĩĐģи ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ĐžĐ˛ cookie + +Đ•ŅĐģи ҃ Đ˛Đ°Ņ ĐĩŅŅ‚ŅŒ ĐŗŅ€ŅƒĐŋĐŋа **cookies**, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ŅĐ˛ŅĐˇĐ°ĐŊŅ‹ ĐŧĐĩĐļĐ´Ņƒ ŅĐžĐąĐžĐš, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ŅĐžĐˇĐ´Đ°Ņ‚ŅŒ **Pydantic-ĐŧОдĐĩĐģҌ** Đ´ĐģŅ Đ¸Ņ… ĐžĐąŅŠŅĐ˛ĐģĐĩĐŊĐ¸Ņ. đŸĒ + +Đ­Ņ‚Đž ĐŋОСвОĐģĐ¸Ņ‚ ваĐŧ **ĐŋĐĩŅ€ĐĩĐ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŧОдĐĩĐģҌ** в **Ņ€Đ°ĐˇĐŊҋ҅ ĐŧĐĩŅŅ‚Đ°Ņ…**, а Ņ‚Đ°ĐēĐļĐĩ ĐžĐąŅŠŅĐ˛Đ¸Ņ‚ŅŒ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи и ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐŊŅ‹Đĩ ŅŅ€Đ°ĐˇŅƒ Đ´ĐģŅ Đ˛ŅĐĩŅ… ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ĐžĐ˛. 😎 + +/// note | ЗаĐŧĐĩŅ‚Đēа + +Đ­Ņ‚ĐžŅ‚ Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊаĐģ Đ´ĐžŅŅ‚ŅƒĐŋĐĩĐŊ ҁ вĐĩŅ€ŅĐ¸Đ¸ `0.115.0`. 🤓 + +/// + +/// tip | ХОвĐĩŅ‚ + +ĐĸаĐēОК ĐļĐĩ ĐŋĐžĐ´Ņ…ĐžĐ´ ĐŋŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Đ´ĐģŅ `Query`, `Cookie`, и `Header`. 😎 + +/// + +## Pydantic-ĐŧОдĐĩĐģҌ Đ´ĐģŅ cookies + +ĐžĐąŅŠŅĐ˛Đ¸Ņ‚Đĩ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁҋ **cookie**, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ваĐŧ ĐŊ҃ĐļĐŊŅ‹, в **Pydantic-ĐŧОдĐĩĐģи**, а ĐˇĐ°Ņ‚ĐĩĐŧ ĐžĐąŅŠŅĐ˛Đ¸Ņ‚Đĩ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ĐēаĐē `Cookie`: + +{* ../../docs_src/cookie_param_models/tutorial001_an_py310.py hl[9:12,16] *} + +**FastAPI** **иСвĐģĐĩ҇ґ҂** даĐŊĐŊŅ‹Đĩ Đ´ĐģŅ **ĐēаĐļĐ´ĐžĐŗĐž ĐŋĐžĐģŅ** иС **cookies**, ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐŊҋ҅ в СаĐŋŅ€ĐžŅĐĩ, и Đ˛Ņ‹Đ´Đ°ŅŅ‚ ваĐŧ ĐžĐąŅŠŅĐ˛ĐģĐĩĐŊĐŊŅƒŅŽ Pydantic-ĐŧОдĐĩĐģҌ. + +## ĐŸŅ€ĐžĐ˛ĐĩŅ€Đēа ŅĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊОК Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸ + +Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžŅĐŧĐžŅ‚Ņ€ĐĩŅ‚ŅŒ ĐžĐąŅŠŅĐ˛ĐģĐĩĐŊĐŊŅ‹Đĩ cookies в ĐŗŅ€Đ°Ņ„Đ¸Ņ‡ĐĩҁĐēĐžĐŧ иĐŊŅ‚ĐĩҀ҄ĐĩĐšŅĐĩ ДоĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸ ĐŋĐž ĐŋŅƒŅ‚Đ¸ `/docs`: + +
+ +
+ +/// info | ДоĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊĐ°Ņ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ + +ИĐŧĐĩĐšŅ‚Đĩ в Đ˛Đ¸Đ´Ņƒ, Ņ‡Ņ‚Đž, ĐŋĐžŅĐēĐžĐģҌĐē҃ **ĐąŅ€Đ°ŅƒĐˇĐĩҀҋ ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ cookies** ĐžŅĐžĐąŅ‹Đŧ ĐžĐąŅ€Đ°ĐˇĐžĐŧ и ĐŋОд ĐēаĐŋĐžŅ‚ĐžĐŧ, ĐžĐŊи **ĐŊĐĩ** ĐŋОСвОĐģŅŅ‚ **JavaScript** ĐģĐĩĐŗĐēĐž ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ŅŒ Đ´ĐžŅŅ‚ŅƒĐŋ Đē ĐŊиĐŧ. + +Đ•ŅĐģи Đ˛Ņ‹ ĐŋĐĩŅ€ĐĩĐšĐ´Ņ‘Ņ‚Đĩ Đē **ĐŗŅ€Đ°Ņ„Đ¸Ņ‡ĐĩҁĐēĐžĐŧ҃ иĐŊŅ‚ĐĩҀ҄ĐĩĐšŅŅƒ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸ API** ĐŋĐž ĐŋŅƒŅ‚Đ¸ `/docs`, Ņ‚Đž ҁĐŧĐžĐļĐĩŅ‚Đĩ ŅƒĐ˛Đ¸Đ´ĐĩŅ‚ŅŒ **Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸ŅŽ** ĐŋĐž cookies Đ´ĐģŅ Đ˛Đ°ŅˆĐ¸Ņ… *ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đš ĐŋŅƒŅ‚ĐĩĐš*. + +Но даĐļĐĩ ĐĩҁĐģи Đ˛Ņ‹ **СаĐŋĐžĐģĐŊĐ¸Ņ‚Đĩ даĐŊĐŊŅ‹Đĩ** и ĐŊаĐļĐŧґ҂Đĩ "Execute", ĐŋĐžŅĐēĐžĐģҌĐē҃ ĐŗŅ€Đ°Ņ„Đ¸Ņ‡ĐĩҁĐēиК иĐŊŅ‚ĐĩҀ҄ĐĩĐšŅ ДоĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸ Ņ€Đ°ĐąĐžŅ‚Đ°ĐĩŅ‚ ҁ **JavaScript**, cookies ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ‚ ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ‹, и Đ˛Ņ‹ ŅƒĐ˛Đ¸Đ´Đ¸Ņ‚Đĩ ŅĐžĐžĐąŅ‰ĐĩĐŊиĐĩ Ой **ĐžŅˆĐ¸ĐąĐēĐĩ** ĐēаĐē ĐąŅƒĐ´Ņ‚Đž ĐŊĐĩ ҃ĐēĐ°ĐˇŅ‹Đ˛Đ°Đģи ĐŊиĐēаĐēĐ¸Ņ… СĐŊĐ°Ņ‡ĐĩĐŊиК. + +/// + +## ЗаĐŋŅ€ĐĩŅ‚ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊҋ҅ cookies + +В ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… ҁĐģŅƒŅ‡Đ°ŅŅ… (ĐŊĐĩ ĐžŅĐžĐąĐž Ņ‡Đ°ŅŅ‚Đž Đ˛ŅŅ‚Ņ€ĐĩŅ‡Đ°ŅŽŅ‰Đ¸Ņ…ŅŅ) ваĐŧ ĐŧĐžĐļĐĩŅ‚ ĐŋĐžĐŊĐ°Đ´ĐžĐąĐ¸Ņ‚ŅŒŅŅ **ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Ņ‚ŅŒ** cookies, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŋĐžĐģŅƒŅ‡Đ°Ņ‚ŅŒ. + +ĐĸĐĩĐŋĐĩŅ€ŅŒ Đ˛Đ°Ņˆ API ŅĐ°Đŧ Ņ€ĐĩŅˆĐ°ĐĩŅ‚, ĐŋŅ€Đ¸ĐŊиĐŧĐ°Ņ‚ŅŒ Đģи cookies. đŸ¤ĒđŸĒ + +Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ҁĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Pydantic-ĐŧОдĐĩĐģҌ Ņ‚Đ°Đē, Ņ‡Ņ‚ĐžĐąŅ‹ СаĐŋŅ€ĐĩŅ‚Đ¸Ņ‚ŅŒ (`forbid`) ĐģŅŽĐąŅ‹Đĩ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ (`extra`) ĐŋĐžĐģŅ: + +{* ../../docs_src/cookie_param_models/tutorial002_an_py39.py hl[10] *} + +Đ•ŅĐģи ĐēĐģиĐĩĐŊŅ‚ ĐŋĐžĐŋŅ€ĐžĐąŅƒĐĩŅ‚ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ **Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ cookies**, Ņ‚Đž в ĐžŅ‚Đ˛ĐĩŅ‚ ĐžĐŊ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ **ĐžŅˆĐ¸ĐąĐē҃**. + +БĐĩĐ´ĐŊŅ‹Đĩ йаĐŊĐŊĐĩҀҋ cookies, ĐžĐŊи Đ˛ŅĐĩĐŧи ŅĐ¸ĐģаĐŧи ĐŋŅ‹Ņ‚Đ°ŅŽŅ‚ŅŅ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ŅŒ Đ˛Đ°ŅˆĐĩ ŅĐžĐŗĐģĐ°ŅĐ¸Đĩ — и Đ˛ŅŅ‘ Ņ€Đ°Đ´Đ¸ Ņ‚ĐžĐŗĐž, Ņ‡Ņ‚ĐžĐąŅ‹ API ĐĩĐŗĐž ĐžŅ‚ĐēĐģĐžĐŊиĐģ. đŸĒ + +НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐĩҁĐģи ĐēĐģиĐĩĐŊŅ‚ ĐŋĐžĐŋŅ‹Ņ‚Đ°ĐĩŅ‚ŅŅ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ cookie `santa_tracker` ŅĐž СĐŊĐ°Ņ‡ĐĩĐŊиĐĩĐŧ `good-list-please`, Ņ‚Đž в ĐžŅ‚Đ˛ĐĩŅ‚ ĐžĐŊ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ **ĐžŅˆĐ¸ĐąĐē҃**, ŅĐžĐžĐąŅ‰Đ°ŅŽŅ‰ŅƒŅŽ ĐĩĐŧ҃, Ņ‡Ņ‚Đž cookie `santa_tracker` ĐŊĐĩ Ņ€Đ°ĐˇŅ€ĐĩŅˆŅ‘ĐŊ: + +```json +{ + "detail": [ + { + "type": "extra_forbidden", + "loc": ["cookie", "santa_tracker"], + "msg": "Extra inputs are not permitted", + "input": "good-list-please" + } + ] +} +``` + +## ЗаĐēĐģŅŽŅ‡ĐĩĐŊиĐĩ + +Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ **Pydantic-ĐŧОдĐĩĐģи** Đ´ĐģŅ ĐžĐąŅŠŅĐ˛ĐģĐĩĐŊĐ¸Ņ **cookies** в **FastAPI**. 😎 diff --git a/docs/ru/docs/tutorial/header-param-models.md b/docs/ru/docs/tutorial/header-param-models.md new file mode 100644 index 000000000..4f54e3e15 --- /dev/null +++ b/docs/ru/docs/tutorial/header-param-models.md @@ -0,0 +1,72 @@ +# МодĐĩĐģи Header-ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ĐžĐ˛ + +Đ•ŅĐģи ҃ Đ˛Đ°Ņ ĐĩŅŅ‚ŅŒ ĐŗŅ€ŅƒĐŋĐŋа ŅĐ˛ŅĐˇĐ°ĐŊĐŊҋ҅ **header-ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ĐžĐ˛**, Ņ‚Đž Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐžĐąŅŠĐĩдиĐŊĐ¸Ņ‚ŅŒ Đ¸Ņ… в ОдĐŊ҃ **Pydantic-ĐŧОдĐĩĐģҌ**. + +Đ­Ņ‚Đž ĐŋОСвОĐģĐ¸Ņ‚ ваĐŧ **ĐŋĐĩŅ€ĐĩĐ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŧОдĐĩĐģҌ** в **Ņ€Đ°ĐˇĐŊҋ҅ ĐŧĐĩŅŅ‚Đ°Ņ…**, а Ņ‚Đ°ĐēĐļĐĩ ĐˇĐ°Đ´Đ°Ņ‚ŅŒ ваĐģĐ¸Đ´Đ°Ņ†Đ¸ŅŽ и ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐŊŅ‹Đĩ ŅŅ€Đ°ĐˇŅƒ Đ´ĐģŅ Đ˛ŅĐĩŅ… ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ĐžĐ˛. 😎 + +/// note | ЗаĐŧĐĩŅ‚Đēа + +Đ­Ņ‚ĐžŅ‚ Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊаĐģ Đ´ĐžŅŅ‚ŅƒĐŋĐĩĐŊ в FastAPI ĐŊĐ°Ņ‡Đ¸ĐŊĐ°Ņ ҁ вĐĩŅ€ŅĐ¸Đ¸ `0.115.0`. 🤓 + +/// + +## Header-ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁҋ в видĐĩ Pydantic-ĐŧОдĐĩĐģи + +ĐžĐąŅŠŅĐ˛Đ¸Ņ‚Đĩ ĐŊ҃ĐļĐŊŅ‹Đĩ **header-ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁҋ** в **Pydantic-ĐŧОдĐĩĐģи** и ĐˇĐ°Ņ‚ĐĩĐŧ аĐŊĐŊĐžŅ‚Đ¸Ņ€ŅƒĐšŅ‚Đĩ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ĐēаĐē `Header`: + +{* ../../docs_src/header_param_models/tutorial001_an_py310.py hl[9:14,18] *} + +**FastAPI** **иСвĐģĐĩ҇ґ҂** даĐŊĐŊŅ‹Đĩ Đ´ĐģŅ **ĐēаĐļĐ´ĐžĐŗĐž ĐŋĐžĐģŅ** иС **ĐˇĐ°ĐŗĐžĐģОвĐēОв** СаĐŋŅ€ĐžŅĐ° и Đ˛Ņ‹Đ´Đ°ŅŅ‚ СадаĐŊĐŊŅƒŅŽ ваĐŧи Pydantic-ĐŧОдĐĩĐģҌ. + +## ĐŸŅ€ĐžĐ˛ĐĩŅ€ŅŒŅ‚Đĩ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸ŅŽ + +Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžŅĐŧĐžŅ‚Ņ€ĐĩŅ‚ŅŒ ĐŊ҃ĐļĐŊŅ‹Đĩ header-ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁҋ в ĐŗŅ€Đ°Ņ„Đ¸Ņ‡ĐĩҁĐēĐžĐŧ иĐŊŅ‚ĐĩҀ҄ĐĩĐšŅĐĩ ŅĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊОК Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸ ĐŋĐž ĐŋŅƒŅ‚Đ¸ `/docs`: + +
+ +
+ +## КаĐē СаĐŋŅ€ĐĩŅ‚Đ¸Ņ‚ŅŒ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ ĐˇĐ°ĐŗĐžĐģОвĐēи + +В ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… ҁĐģŅƒŅ‡Đ°ŅŅ… (ĐŊĐĩ ĐžŅĐžĐąĐž Ņ‡Đ°ŅŅ‚Đž Đ˛ŅŅ‚Ņ€ĐĩŅ‡Đ°ŅŽŅ‰Đ¸Ņ…ŅŅ) ваĐŧ ĐŧĐžĐļĐĩŅ‚ ĐŋĐžĐŊĐ°Đ´ĐžĐąĐ¸Ņ‚ŅŒŅŅ **ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Ņ‚ŅŒ** ĐˇĐ°ĐŗĐžĐģОвĐēи, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŋĐžĐģŅƒŅ‡Đ°Ņ‚ŅŒ. + +Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ вОСĐŧĐžĐļĐŊĐžŅŅ‚Đ¸ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ Pydantic-ĐŧОдĐĩĐģи Đ´ĐģŅ Ņ‚ĐžĐŗĐž, Ņ‡Ņ‚ĐžĐąŅ‹ СаĐŋŅ€ĐĩŅ‚Đ¸Ņ‚ŅŒ (`forbid`) ĐģŅŽĐąŅ‹Đĩ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ (`extra`) ĐŋĐžĐģŅ: + +{* ../../docs_src/header_param_models/tutorial002_an_py310.py hl[10] *} + +Đ•ŅĐģи ĐēĐģиĐĩĐŊŅ‚ ĐŋĐžĐŋŅ€ĐžĐąŅƒĐĩŅ‚ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ **Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ ĐˇĐ°ĐŗĐžĐģОвĐēи**, Ņ‚Đž в ĐžŅ‚Đ˛ĐĩŅ‚ ĐžĐŊ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ **ĐžŅˆĐ¸ĐąĐē҃**. + +НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐĩҁĐģи ĐēĐģиĐĩĐŊŅ‚ ĐŋĐžĐŋŅ‹Ņ‚Đ°ĐĩŅ‚ŅŅ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ ĐˇĐ°ĐŗĐžĐģОвОĐē `tool` ŅĐž СĐŊĐ°Ņ‡ĐĩĐŊиĐĩĐŧ `plumbus`, Ņ‚Đž в ĐžŅ‚Đ˛ĐĩŅ‚ ĐžĐŊ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ ĐžŅˆĐ¸ĐąĐē҃, ŅĐžĐžĐąŅ‰Đ°ŅŽŅ‰ŅƒŅŽ ĐĩĐŧ҃, Ņ‡Ņ‚Đž header-ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `tool` ĐŊĐĩ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊ: + +```json +{ + "detail": [ + { + "type": "extra_forbidden", + "loc": ["header", "tool"], + "msg": "Extra inputs are not permitted", + "input": "plumbus", + } + ] +} +``` + +## КаĐē ĐžŅ‚ĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēĐžĐĩ ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇĐžĐ˛Đ°ĐŊиĐĩ ĐŋĐžĐ´Ņ‡ĐĩŅ€ĐēиваĐŊиК + +КаĐē и в ҁĐģŅƒŅ‡Đ°Đĩ ҁ ĐžĐąŅ‹Ņ‡ĐŊŅ‹Đŧи ĐˇĐ°ĐŗĐžĐģОвĐēаĐŧи, ĐĩҁĐģи ҃ Đ˛Đ°Ņ в иĐŧĐĩĐŊĐ°Ņ… ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ĐžĐ˛ иĐŧĐĩŅŽŅ‚ŅŅ ŅĐ¸ĐŧвОĐģŅ‹ ĐŋĐžĐ´Ņ‡ĐĩŅ€ĐēиваĐŊĐ¸Ņ, ĐžĐŊи **Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇĐžĐ˛Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ в Đ´ĐĩŅ„Đ¸Ņ**. + +НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐĩҁĐģи в ĐēОдĐĩ ĐĩŅŅ‚ŅŒ header-ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `save_data`, Ņ‚Đž ĐžĐļидаĐĩĐŧŅ‹Đš HTTP-ĐˇĐ°ĐŗĐžĐģОвОĐē ĐąŅƒĐ´ĐĩŅ‚ `save-data` и иĐŧĐĩĐŊĐŊĐž Ņ‚Đ°Đē ĐžĐŊ ĐąŅƒĐ´ĐĩŅ‚ ĐžŅ‚ĐžĐąŅ€Đ°ĐļĐ°Ņ‚ŅŒŅŅ в Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸. + +Đ•ŅĐģи ĐŋĐž ĐēаĐēиĐŧ-Ņ‚Đž ĐŋŅ€Đ¸Ņ‡Đ¸ĐŊаĐŧ ваĐŧ ĐŊ҃ĐļĐŊĐž ĐžŅ‚ĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ даĐŊĐŊĐžĐĩ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēĐžĐĩ ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇĐžĐ˛Đ°ĐŊиĐĩ, ŅŅ‚Đž ĐŧĐžĐļĐŊĐž ŅĐ´ĐĩĐģĐ°Ņ‚ŅŒ и Đ´ĐģŅ Pydantic-ĐŧОдĐĩĐģĐĩĐš Đ´ĐģŅ header-ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ĐžĐ˛. + +{* ../../docs_src/header_param_models/tutorial003_an_py310.py hl[19] *} + +/// warning | ВĐŊиĐŧаĐŊиĐĩ + +ПĐĩŅ€ĐĩĐ´ Ņ‚ĐĩĐŧ ĐēаĐē ŅƒŅŅ‚Đ°ĐŊавĐģĐ¸Đ˛Đ°Ņ‚ŅŒ Đ´ĐģŅ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° `convert_underscores` СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ `False`, иĐŧĐĩĐšŅ‚Đĩ в Đ˛Đ¸Đ´Ņƒ, Ņ‡Ņ‚Đž ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ HTTP-ĐŋŅ€ĐžĐēŅĐ¸ и ҁĐĩŅ€Đ˛ĐĩҀҋ ĐŊĐĩ Ņ€Đ°ĐˇŅ€ĐĩŅˆĐ°ŅŽŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐˇĐ°ĐŗĐžĐģОвĐēи ҁ ŅĐ¸ĐŧвОĐģаĐŧи ĐŋĐžĐ´Ņ‡ĐĩŅ€ĐēиваĐŊĐ¸Ņ. + +/// + +## Đ ĐĩĐˇŅŽĐŧĐĩ + +Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ **Pydantic-ĐŧОдĐĩĐģи** Đ´ĐģŅ ĐžĐąŅŠŅĐ˛ĐģĐĩĐŊĐ¸Ņ **header-ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ĐžĐ˛** в **FastAPI**. 😎 diff --git a/docs/ru/docs/tutorial/request-form-models.md b/docs/ru/docs/tutorial/request-form-models.md new file mode 100644 index 000000000..1034ed27f --- /dev/null +++ b/docs/ru/docs/tutorial/request-form-models.md @@ -0,0 +1,78 @@ +# МодĐĩĐģи Ņ„ĐžŅ€Đŧ + +Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ **Pydantic-ĐŧОдĐĩĐģи** Đ´ĐģŅ ĐžĐąŅŠŅĐ˛ĐģĐĩĐŊĐ¸Ņ **ĐŋĐžĐģĐĩĐš Ņ„ĐžŅ€Đŧ** в FastAPI. + +/// info | ДоĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊĐ°Ņ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ + +Đ§Ņ‚ĐžĐąŅ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ„ĐžŅ€ĐŧŅ‹, ҁĐŊĐ°Ņ‡Đ°Đģа ŅƒŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đĩ `python-multipart`. + +ĐŖĐąĐĩĐ´Đ¸Ņ‚ĐĩҁҌ, Ņ‡Ņ‚Đž Đ˛Ņ‹ ŅĐžĐˇĐ´Đ°Đģи и аĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Đģи [Đ˛Đ¸Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐžĐĩ ĐžĐēŅ€ŅƒĐļĐĩĐŊиĐĩ](../virtual-environments.md){.internal-link target=_blank}, а ĐˇĐ°Ņ‚ĐĩĐŧ ŅƒŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đĩ ĐŋаĐēĐĩŅ‚, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€: + +```console +$ pip install python-multipart +``` + +/// + +/// note | ЗаĐŧĐĩŅ‚Đēа + +Đ­Ņ‚ĐžŅ‚ Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊаĐģ Đ´ĐžŅŅ‚ŅƒĐŋĐĩĐŊ ҁ вĐĩŅ€ŅĐ¸Đ¸ `0.113.0`. 🤓 + +/// + +## Pydantic-ĐŧОдĐĩĐģҌ Đ´ĐģŅ Ņ„ĐžŅ€ĐŧŅ‹ + +ВаĐŧ ĐŋŅ€ĐžŅŅ‚Đž ĐŊ҃ĐļĐŊĐž ĐžĐąŅŠŅĐ˛Đ¸Ņ‚ŅŒ **Pydantic-ĐŧОдĐĩĐģҌ** ҁ ĐŋĐžĐģŅĐŧи, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ŅŒ ĐēаĐē **ĐŋĐžĐģŅ Ņ„ĐžŅ€ĐŧŅ‹**, а ĐˇĐ°Ņ‚ĐĩĐŧ ĐžĐąŅŠŅĐ˛Đ¸Ņ‚ŅŒ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ĐēаĐē `Form`: + +{* ../../docs_src/request_form_models/tutorial001_an_py39.py hl[9:11,15] *} + +**FastAPI** **иСвĐģĐĩ҇ґ҂** даĐŊĐŊŅ‹Đĩ Đ´ĐģŅ **ĐēаĐļĐ´ĐžĐŗĐž ĐŋĐžĐģŅ** иС **даĐŊĐŊҋ҅ Ņ„ĐžŅ€ĐŧŅ‹** в СаĐŋŅ€ĐžŅĐĩ и Đ˛Ņ‹Đ´Đ°ŅŅ‚ ваĐŧ ĐžĐąŅŠŅĐ˛ĐģĐĩĐŊĐŊŅƒŅŽ Pydantic-ĐŧОдĐĩĐģҌ. + +## ĐŸŅ€ĐžĐ˛ĐĩŅ€Đēа ŅĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊОК Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸ + +Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžŅĐŧĐžŅ‚Ņ€ĐĩŅ‚ŅŒ ĐŋĐžĐģŅ Ņ„ĐžŅ€ĐŧŅ‹ в ĐŗŅ€Đ°Ņ„Đ¸Ņ‡ĐĩҁĐēĐžĐŧ иĐŊŅ‚ĐĩҀ҄ĐĩĐšŅĐĩ ДоĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸ ĐŋĐž ĐŋŅƒŅ‚Đ¸ `/docs`: + +
+ +
+ +## ЗаĐŋŅ€ĐĩŅ‚ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊҋ҅ ĐŋĐžĐģĐĩĐš Ņ„ĐžŅ€ĐŧŅ‹ + +В ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… ҁĐģŅƒŅ‡Đ°ŅŅ… (ĐŊĐĩ ĐžŅĐžĐąĐž Ņ‡Đ°ŅŅ‚Đž Đ˛ŅŅ‚Ņ€ĐĩŅ‡Đ°ŅŽŅ‰Đ¸Ņ…ŅŅ) ваĐŧ ĐŧĐžĐļĐĩŅ‚ ĐŋĐžĐŊĐ°Đ´ĐžĐąĐ¸Ņ‚ŅŒŅŅ **ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Ņ‚ŅŒ** ĐŋĐžĐģŅ Ņ„ĐžŅ€ĐŧŅ‹ Ņ‚ĐžĐģҌĐēĐž Ņ‚ĐĩĐŧи, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐžĐąŅŠŅĐ˛ĐģĐĩĐŊŅ‹ в Pydantic-ĐŧОдĐĩĐģи. И **СаĐŋŅ€ĐĩŅ‚Đ¸Ņ‚ŅŒ** ĐģŅŽĐąŅ‹Đĩ **Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ** ĐŋĐžĐģŅ. + +/// note | ЗаĐŧĐĩŅ‚Đēа + +Đ­Ņ‚ĐžŅ‚ Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊаĐģ Đ´ĐžŅŅ‚ŅƒĐŋĐĩĐŊ ҁ вĐĩŅ€ŅĐ¸Đ¸ `0.114.0`. 🤓 + +/// + +Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ҁĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Pydantic-ĐŧОдĐĩĐģҌ Ņ‚Đ°Đē, Ņ‡Ņ‚ĐžĐąŅ‹ СаĐŋŅ€ĐĩŅ‚Đ¸Ņ‚ŅŒ (`forbid`) Đ˛ŅĐĩ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ (`extra`) ĐŋĐžĐģŅ: + +{* ../../docs_src/request_form_models/tutorial002_an_py39.py hl[12] *} + +Đ•ŅĐģи ĐēĐģиĐĩĐŊŅ‚ ĐŋĐžĐŋŅ€ĐžĐąŅƒĐĩŅ‚ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ даĐŊĐŊŅ‹Đĩ, Ņ‚Đž в ĐžŅ‚Đ˛ĐĩŅ‚ ĐžĐŊ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ **ĐžŅˆĐ¸ĐąĐē҃**. + +НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐĩҁĐģи ĐēĐģиĐĩĐŊŅ‚ ĐŋĐžĐŋŅ‹Ņ‚Đ°ĐĩŅ‚ŅŅ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ ĐŋĐžĐģŅ Ņ„ĐžŅ€ĐŧŅ‹: + +* `username`: `Rick` +* `password`: `Portal Gun` +* `extra`: `Mr. Poopybutthole` + +ĐĸĐž в ĐžŅ‚Đ˛ĐĩŅ‚ ĐžĐŊ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ **ĐžŅˆĐ¸ĐąĐē҃**, ŅĐžĐžĐąŅ‰Đ°ŅŽŅ‰ŅƒŅŽ ĐĩĐŧ҃, Ņ‡Ņ‚Đž ĐŋĐžĐģĐĩ `extra` ĐŊĐĩ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐž: + +```json +{ + "detail": [ + { + "type": "extra_forbidden", + "loc": ["body", "extra"], + "msg": "Extra inputs are not permitted", + "input": "Mr. Poopybutthole" + } + ] +} +``` + +## ЗаĐēĐģŅŽŅ‡ĐĩĐŊиĐĩ + +Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Pydantic-ĐŧОдĐĩĐģи Đ´ĐģŅ ĐžĐąŅŠŅĐ˛ĐģĐĩĐŊĐ¸Ņ ĐŋĐžĐģĐĩĐš Ņ„ĐžŅ€Đŧ в FastAPI. 😎 diff --git a/docs/uk/docs/tutorial/background-tasks.md b/docs/uk/docs/tutorial/background-tasks.md new file mode 100644 index 000000000..912ba8c2a --- /dev/null +++ b/docs/uk/docs/tutorial/background-tasks.md @@ -0,0 +1,85 @@ +# ФОĐŊĐžĐ˛Ņ– ĐˇĐ°Đ´Đ°Ņ‡Ņ– + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ ŅŅ‚Đ˛ĐžŅ€ŅŽĐ˛Đ°Ņ‚Đ¸ Ņ„ĐžĐŊĐžĐ˛Ņ– ĐˇĐ°Đ´Đ°Ņ‡Ņ–, ŅĐēŅ– ĐąŅƒĐ´ŅƒŅ‚ŅŒ виĐēĐžĐŊŅƒĐ˛Đ°Ņ‚Đ¸ŅŅ *ĐŋҖҁĐģŅ* ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ–. + +ĐĻĐĩ ĐēĐžŅ€Đ¸ŅĐŊĐž Đ´ĐģŅ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Đš, ŅĐēŅ– ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž виĐēĐžĐŊĐ°Ņ‚Đ¸ ĐŋҖҁĐģŅ ĐžĐąŅ€ĐžĐąĐēи СаĐŋĐ¸Ņ‚Ņƒ, аĐģĐĩ ĐēĐģŅ–Ņ”ĐŊŅ‚Ņƒ ĐŊĐĩ ĐžĐąĐžĐ˛â€™ŅĐˇĐēОвО ҇ĐĩĐēĐ°Ņ‚Đ¸ СавĐĩŅ€ŅˆĐĩĐŊĐŊŅ ҆ҖҔҗ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ĐŋĐĩŅ€ĐĩĐ´ ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅĐŧ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ–. + +ĐŸŅ€Đ¸ĐēĐģади виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ: + +* ĐĐ°Đ´ŅĐ¸ĐģаĐŊĐŊŅ email-ҁĐŋĐžĐ˛Ņ–Ņ‰ĐĩĐŊҌ ĐŋҖҁĐģŅ виĐēĐžĐŊаĐŊĐŊŅ ĐŋĐĩвĐŊĐžŅ— Đ´Ņ–Ņ—: + * ĐŸŅ–Đ´ĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ Đ´Đž ĐŋĐžŅˆŅ‚ĐžĐ˛ĐžĐŗĐž ҁĐĩŅ€Đ˛ĐĩŅ€Đ° Ņ‚Đ° ĐŊĐ°Đ´ŅĐ¸ĐģаĐŊĐŊŅ ĐģĐ¸ŅŅ‚Đ° ĐŧĐžĐļĐĩ СаКĐŧĐ°Ņ‚Đ¸ ĐēŅ–ĐģҌĐēа ҁĐĩĐē҃ĐŊĐ´. Ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛Ņ–Đ´Ņ€Đ°ĐˇŅƒ ĐŋОвĐĩŅ€ĐŊŅƒŅ‚Đ¸ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ, а email Đ˛Ņ–Đ´ĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đ¸ ҃ Ņ„ĐžĐŊŅ–. +* ĐžĐąŅ€ĐžĐąĐēа даĐŊĐ¸Ņ…: + * НаĐŋŅ€Đ¸ĐēĐģад, ŅĐēŅ‰Đž ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐž Ņ„Đ°ĐšĐģ, ŅĐēиК ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐžĐąŅ€ĐžĐąĐ¸Ņ‚Đ¸ Đ´ĐžĐ˛ĐŗĐžŅ‚Ņ€Đ¸Đ˛Đ°ĐģиĐŧ ĐŋŅ€ĐžŅ†ĐĩŅĐžĐŧ, ĐŧĐžĐļĐŊа ĐŋОвĐĩŅ€ĐŊŅƒŅ‚Đ¸ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ "Accepted" ("ĐŸŅ€Đ¸ĐšĐŊŅŅ‚Đž", HTTP 202) Ņ– виĐēĐžĐŊĐ°Ņ‚Đ¸ ĐžĐąŅ€ĐžĐąĐē҃ Ņ„Đ°ĐšĐģ҃ ҃ Ņ„ĐžĐŊŅ–. + +## ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ `BackgroundTasks` + +ĐĄĐŋĐžŅ‡Đ°Ņ‚Đē҃ Ņ–ĐŧĐŋĐžŅ€Ņ‚ŅƒĐšŅ‚Đĩ `BackgroundTasks` Ņ– Đ´ĐžĐ´Đ°ĐšŅ‚Đĩ ĐšĐžĐŗĐž ŅĐē ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ҃ Đ’Đ°ŅˆŅƒ *Ņ„ŅƒĐŊĐēŅ†Ņ–ŅŽ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ҈ĐģŅŅ…Ņƒ* (path operation function) Đ´Đž `BackgroundTasks`: + +{* ../../docs_src/background_tasks/tutorial001.py hl[1,13] *} + +**FastAPI** Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ŅŅ‚Đ˛ĐžŅ€Đ¸Ņ‚ŅŒ Ой'Ņ”ĐēŅ‚ `BackgroundTasks` Ņ– ĐŋĐĩŅ€ĐĩĐ´Đ°ŅŅ‚ŅŒ ĐšĐžĐŗĐž ҃ ҆ĐĩĐš ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ. + + +## ĐĄŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ Ņ„ŅƒĐŊĐē҆Җҗ ĐˇĐ°Đ´Đ°Ņ‡Ņ– + +ĐĄŅ‚Đ˛ĐžŅ€Ņ–Ņ‚ŅŒ Ņ„ŅƒĐŊĐēŅ†Ņ–ŅŽ, ŅĐēа ĐąŅƒĐ´Đĩ виĐēĐžĐŊŅƒĐ˛Đ°Ņ‚Đ¸ Ņ„ĐžĐŊĐžĐ˛Ņƒ ĐˇĐ°Đ´Đ°Ņ‡Ņƒ. + +ĐĻĐĩ ĐˇĐ˛Đ¸Ņ‡Đ°ĐšĐŊа Ņ„ŅƒĐŊĐēŅ†Ņ–Ņ, ŅĐēа ĐŧĐžĐļĐĩ ĐžŅ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸. + +ВоĐŊа ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ Đ°ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐŊĐžŅŽ `async def` айО ĐˇĐ˛Đ¸Ņ‡Đ°ĐšĐŊĐžŅŽ `def` Ņ„ŅƒĐŊĐēŅ†Ņ–Ņ”ŅŽ – **FastAPI** ĐžĐąŅ€ĐžĐąĐ¸Ņ‚ŅŒ Ņ—Ņ— ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐž. + +ĐŖ ĐŊĐ°ŅˆĐžĐŧ҃ виĐŋадĐē҃ Ņ„ŅƒĐŊĐēŅ†Ņ–Ņ СаĐŋĐ¸ŅŅƒŅ” ҃ Ņ„Đ°ĐšĐģ (Ņ–ĐŧŅ–Ņ‚ŅƒŅŽŅ‡Đ¸ ĐŊĐ°Đ´ŅĐ¸ĐģаĐŊĐŊŅ email). + +І ĐžŅĐēŅ–ĐģҌĐēи ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ СаĐŋĐ¸ŅŅƒ ĐŊĐĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” `async` Ņ‚Đ° `await`, Đŧи виСĐŊĐ°Ņ‡Đ°Ņ”ĐŧĐž Ņ„ŅƒĐŊĐēŅ†Ņ–ŅŽ ŅĐē ĐˇĐ˛Đ¸Ņ‡Đ°ĐšĐŊ҃ `def`: + +{* ../../docs_src/background_tasks/tutorial001.py hl[6:9] *} + +## ДодаваĐŊĐŊŅ Ņ„ĐžĐŊĐžĐ˛ĐžŅ— ĐˇĐ°Đ´Đ°Ņ‡Ņ– + +ĐŖŅĐĩŅ€ĐĩдиĐŊŅ– Đ’Đ°ŅˆĐžŅ— *Ņ„ŅƒĐŊĐē҆Җҗ ĐžĐąŅ€ĐžĐąĐēи ҈ĐģŅŅ…Ņƒ*, ĐŋĐĩŅ€ĐĩĐ´Đ°ĐšŅ‚Đĩ Ņ„ŅƒĐŊĐēŅ†Ņ–ŅŽ ĐˇĐ°Đ´Đ°Ņ‡Ņ– в Ой'Ņ”ĐēŅ‚ *background tasks*, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐŧĐĩŅ‚ĐžĐ´ `.add_task()`: + +{* ../../docs_src/background_tasks/tutorial001.py hl[14] *} + +`.add_task()` ĐŋŅ€Đ¸ĐšĐŧĐ°Ņ” Đ°Ņ€ĐŗŅƒĐŧĐĩĐŊŅ‚Đ¸: + +* Đ¤ŅƒĐŊĐēŅ†Ņ–Ņ ĐˇĐ°Đ´Đ°Ņ‡Đ°, ŅĐēа ĐąŅƒĐ´Đĩ виĐēĐžĐŊŅƒĐ˛Đ°Ņ‚Đ¸ŅŅ ҃ Ņ„ĐžĐŊОвОĐŧ҃ Ņ€ĐĩĐļиĐŧŅ– (`write_notification`). ЗвĐĩŅ€ĐŊŅ–Ņ‚ŅŒ ŅƒĐ˛Đ°ĐŗŅƒ, Ņ‰Đž ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ”Ņ‚ŅŒŅŅ ОйĘŧŅ”ĐēŅ‚ ĐąĐĩС Đ´ŅƒĐļĐžĐē. +* Đ‘ŅƒĐ´ŅŒ-ŅĐēа ĐŋĐžŅĐģŅ–Đ´ĐžĐ˛ĐŊŅ–ŅŅ‚ŅŒ Đ°Ņ€ĐŗŅƒĐŧĐĩĐŊŅ‚Ņ–Đ˛, ŅĐēŅ– ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‚Đ¸ ҃ Ņ„ŅƒĐŊĐēŅ†Ņ–ŅŽ СавдаĐŊĐŊŅ ҃ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊĐžĐŧ҃ ĐŋĐžŅ€ŅĐ´Đē҃ (`email`). +* Đ‘ŅƒĐ´ŅŒ-ŅĐēŅ– Ņ–ĐŧĐĩĐŊОваĐŊŅ– Đ°Ņ€ĐŗŅƒĐŧĐĩĐŊŅ‚Đ¸, ŅĐēŅ– ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‚Đ¸ ҃ Ņ„ŅƒĐŊĐēŅ†Ņ–ŅŽ ĐˇĐ°Đ´Đ°Ņ‡Ņƒ (`message="some notification"`). + +## ВĐŋŅ€ĐžĐ˛Đ°Đ´ĐļĐĩĐŊĐŊŅ СаĐģĐĩĐļĐŊĐžŅŅ‚ĐĩĐš + +ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ `BackgroundTasks` Ņ‚Đ°ĐēĐžĐļ ĐŋŅ€Đ°Ņ†ŅŽŅ” С ŅĐ¸ŅŅ‚ĐĩĐŧĐžŅŽ вĐŋŅ€ĐžĐ˛Đ°Đ´ĐļĐĩĐŊĐŊŅ СаĐģĐĩĐļĐŊĐžŅŅ‚ĐĩĐš. Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐžĐŗĐžĐģĐžŅĐ¸Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ Ņ‚Đ¸Đŋ҃ `BackgroundTasks` ĐŊа Ņ€Ņ–ĐˇĐŊĐ¸Ņ… Ņ€Ņ–Đ˛ĐŊŅŅ…: ҃ *Ņ„ŅƒĐŊĐē҆Җҗ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ҈ĐģŅŅ…Ņƒ*, ҃ СаĐģĐĩĐļĐŊĐžŅŅ‚Ņ– (dependable), ҃ ĐŋŅ–Đ´ СаĐģĐĩĐļĐŊĐžŅŅ‚Ņ– Ņ‚ĐžŅ‰Đž. + +**FastAPI** СĐŊĐ°Ņ”, ŅĐē Đ´Ņ–ŅŅ‚Đ¸ в ĐēĐžĐļĐŊĐžĐŧ҃ виĐŋадĐē҃ Ņ– ŅĐē ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ОдиĐŊ Ņ– Ņ‚ĐžĐš ŅĐ°ĐŧиК Ой'Ņ”ĐēŅ‚, Ņ‰ĐžĐą ŅƒŅŅ– Ņ„ĐžĐŊĐžĐ˛Ņ– ĐˇĐ°Đ´Đ°Ņ‡Ņ– ĐąŅƒĐģи ĐžĐąâ€™Ņ”Đ´ĐŊаĐŊŅ– Ņ‚Đ° виĐēĐžĐŊŅƒĐ˛Đ°ĐģĐ¸ŅŅ ҃ Ņ„ĐžĐŊОвОĐŧ҃ Ņ€ĐĩĐļиĐŧŅ– ĐŋҖҁĐģŅ СавĐĩŅ€ŅˆĐĩĐŊĐŊŅ ĐžŅĐŊОвĐŊĐžĐŗĐž СаĐŋĐ¸Ņ‚Ņƒ. + +{* ../../docs_src/background_tasks/tutorial002_an_py310.py hl[13,15,22,25] *} + +ĐŖ Ņ†ŅŒĐžĐŧ҃ ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņ– ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģĐĩĐŊĐŊŅ ĐąŅƒĐ´ŅƒŅ‚ŅŒ СаĐŋĐ¸ŅĐ°ĐŊŅ– ҃ Ņ„Đ°ĐšĐģ `log.txt` *ĐŋҖҁĐģŅ* Ņ‚ĐžĐŗĐž, ŅĐē Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ ĐąŅƒĐ´Đĩ ĐŊĐ°Đ´Ņ–ŅĐģаĐŊа. + +Đ¯ĐēŅ‰Đž ҃ СаĐŋĐ¸Ņ‚Ņ– ĐąŅƒĐ˛ ĐŋĐĩŅ€ĐĩдаĐŊиК query-ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ, Đ˛Ņ–ĐŊ ĐąŅƒĐ´Đĩ СаĐŋĐ¸ŅĐ°ĐŊиК ҃ ĐģĐžĐŗ ҃ Ņ„ĐžĐŊĐžĐ˛Ņ–Đš ĐˇĐ°Đ´Đ°Ņ‡Ņ–. + +А ĐŋĐžŅ‚Ņ–Đŧ Ņ–ĐŊŅˆĐ° Ņ„ĐžĐŊОва ĐˇĐ°Đ´Đ°Ņ‡Đ°, ŅĐēа ŅŅ‚Đ˛ĐžŅ€ŅŽŅ”Ņ‚ŅŒŅŅ ҃ *Ņ„ŅƒĐŊĐē҆Җҗ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ҈ĐģŅŅ…Ņƒ*, СаĐŋĐ¸ŅˆĐĩ ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģĐĩĐŊĐŊŅ С виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅĐŧ path ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° `email`. + +## ĐĸĐĩŅ…ĐŊҖ҇ĐŊŅ– Đ´ĐĩŅ‚Đ°ĐģŅ– + +КĐģĐ°Ņ `BackgroundTasks` ĐŋĐžŅ…ĐžĐ´Đ¸Ņ‚ŅŒ ĐąĐĩСĐŋĐžŅĐĩŅ€ĐĩĐ´ĐŊŅŒĐž С `starlette.background`. + +Đ’Ņ–ĐŊ Ņ–ĐŧĐŋĐžŅ€Ņ‚ŅƒŅ”Ņ‚ŅŒŅŅ ĐąĐĩСĐŋĐžŅĐĩŅ€ĐĩĐ´ĐŊŅŒĐž ҃ FastAPI, Ņ‰ĐžĐą Ви ĐŧĐžĐŗĐģи виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž С `fastapi` Ņ– виĐŋадĐēОвО ĐŊĐĩ Ņ–ĐŧĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°Đģи `BackgroundTask` (ĐąĐĩС s в ĐēŅ–ĐŊ҆Җ) С `starlette.background`. + +Đ¯ĐēŅ‰Đž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ `BackgroundTasks` (а ĐŊĐĩ `BackgroundTask`), Ņ‚Đž ĐšĐžĐŗĐž ĐŧĐžĐļĐŊа ĐŋĐĩŅ€ĐĩĐ´Đ°Đ˛Đ°Ņ‚Đ¸ ŅĐē ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ҃ *Ņ„ŅƒĐŊĐē҆Җҗ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ҈ĐģŅŅ…Ņƒ*, Ņ– **FastAPI** ĐŋĐžĐ´ĐąĐ°Ņ” ĐŋŅ€Đž Đ˛ŅĐĩ Ņ–ĐŊ҈Đĩ, Ņ‚Đ°Đē ŅĐ°ĐŧĐž ŅĐē Ņ– ĐŋŅ€Đž виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ Ой'Ņ”ĐēŅ‚Đ° `Request`. + +ĐĸаĐēĐžĐļ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `BackgroundTask` ĐžĐēŅ€ĐĩĐŧĐž в FastAPI, аĐģĐĩ Đ´ĐģŅ Ņ†ŅŒĐžĐŗĐž ВаĐŧ дОвĐĩĐ´ĐĩŅ‚ŅŒŅŅ ŅŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ Ой'Ņ”ĐēŅ‚ ҃ ĐēĐžĐ´Ņ– Ņ‚Đ° ĐŋОвĐĩŅ€ĐŊŅƒŅ‚Đ¸ Starlette `Response`, вĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ ĐšĐžĐŗĐž. + +ДĐĩŅ‚Đ°ĐģҌĐŊŅ–ŅˆĐĩ ĐŧĐžĐļĐŊа ĐŋĐžŅ‡Đ¸Ņ‚Đ°Ņ‚Đ¸ в ĐžŅ„Ņ–Ņ†Ņ–ĐšĐŊŅ–Đš Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— Starlette ĐŋŅ€Đž Ņ„ĐžĐŊĐžĐ˛Ņ– ĐˇĐ°Đ´Đ°Ņ‡Ņ– . + +## Đ—Đ°ŅŅ‚ĐĩŅ€ĐĩĐļĐĩĐŊĐŊŅ + +Đ¯ĐēŅ‰Đž ВаĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž виĐēĐžĐŊŅƒĐ˛Đ°Ņ‚Đ¸ ҁĐēĐģадĐŊŅ– Ņ„ĐžĐŊĐžĐ˛Ņ– ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊĐŊŅ, Ņ– ĐŋŅ€Đ¸ Ņ†ŅŒĐžĐŧ҃ ĐŊĐĩĐŧа ĐŋĐžŅ‚Ņ€Đĩйи СаĐŋ҃ҁĐēĐ°Ņ‚Đ¸ Ņ—Ņ… ҃ Ņ‚ĐžĐŧ҃ Đļ ĐŋŅ€ĐžŅ†ĐĩҁҖ (ĐŊаĐŋŅ€Đ¸ĐēĐģад, ĐŊĐĩ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ҁĐŋŅ–ĐģҌĐŊĐžĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž ĐŋаĐŧâ€™ŅŅ‚Ņ– Ņ‡Đ¸ СĐŧŅ–ĐŊĐŊĐ¸Ņ…), ĐŧĐžĐļĐģивО, Đ˛Đ°Ņ€Ņ‚Đž ҁĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ŅŅ ĐąŅ–ĐģҌ҈ ĐŋĐžŅ‚ŅƒĐļĐŊиĐŧи Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Đ°Đŧи, Ņ‚Đ°ĐēиĐŧи ŅĐē Celery. + +ĐĸаĐēŅ– Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Đ¸ ĐˇĐ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš ĐŋĐžŅ‚Ņ€ĐĩĐąŅƒŅŽŅ‚ŅŒ ҁĐēĐģадĐŊŅ–ŅˆĐžŅ— ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ— Ņ‚Đ° ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ€Đ° ҇ĐĩŅ€ĐŗĐ¸ ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģĐĩĐŊҌ/СавдаĐŊҌ, ĐŊаĐŋŅ€Đ¸ĐēĐģад, RabbitMQ айО Redis. ОдĐŊаĐē вОĐŊи дОСвОĐģŅŅŽŅ‚ŅŒ виĐēĐžĐŊŅƒĐ˛Đ°Ņ‚Đ¸ Ņ„ĐžĐŊĐžĐ˛Ņ– ĐˇĐ°Đ´Đ°Ņ‡Ņ– в ĐēŅ–ĐģҌĐēĐžŅ… ĐŋŅ€ĐžŅ†ĐĩŅĐ°Ņ… Ņ– ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ĐŊа ĐēŅ–ĐģҌĐēĐžŅ… ҁĐĩŅ€Đ˛ĐĩŅ€Đ°Ņ…. + +Đ¯ĐēŅ‰Đž Đļ ВаĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž СĐŧŅ–ĐŊĐŊĐ¸Ņ… Ņ– ĐžĐąâ€™Ņ”ĐēŅ‚Ņ–Đ˛ Ņ–Đˇ ҂ҖҔҗ Đļ **FastAPI** - ĐŋŅ€ĐžĐŗŅ€Đ°Đŧи айО виĐēĐžĐŊŅƒĐ˛Đ°Ņ‚Đ¸ ĐŊĐĩвĐĩĐģиĐēŅ– Ņ„ĐžĐŊĐžĐ˛Ņ– СавдаĐŊĐŊŅ (ĐŊаĐŋŅ€Đ¸ĐēĐģад, ĐŊĐ°Đ´ŅĐ¸ĐģĐ°Ņ‚Đ¸ ҁĐŋĐžĐ˛Ņ–Ņ‰ĐĩĐŊĐŊŅ ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊĐžŅŽ ĐŋĐžŅˆŅ‚ĐžŅŽ), Đ´ĐžŅŅ‚Đ°Ņ‚ĐŊŅŒĐž ĐŋŅ€ĐžŅŅ‚Đž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `BackgroundTasks`. + +## ĐŸŅ–Đ´ŅŅƒĐŧĐžĐē + +ІĐŧĐŋĐžŅ€Ņ‚ŅƒĐšŅ‚Đĩ Ņ‚Đ° виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ `BackgroundTasks` ŅĐē ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ҃ *Ņ„ŅƒĐŊĐēŅ†Ņ–ŅŅ… ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ҈ĐģŅŅ…Ņƒ* Ņ‚Đ° СаĐģĐĩĐļĐŊĐžŅŅ‚ŅŅ…, Ņ‰ĐžĐą Đ´ĐžĐ´Đ°Đ˛Đ°Ņ‚Đ¸ Ņ„ĐžĐŊĐžĐ˛Ņ– ĐˇĐ°Đ´Đ°Ņ‡Ņ–. diff --git a/docs/uk/docs/tutorial/body-updates.md b/docs/uk/docs/tutorial/body-updates.md new file mode 100644 index 000000000..e78b5a5bf --- /dev/null +++ b/docs/uk/docs/tutorial/body-updates.md @@ -0,0 +1,116 @@ +# ĐĸŅ–ĐģĐž – ОĐŊОвĐģĐĩĐŊĐŊŅ + +## ОĐŊОвĐģĐĩĐŊĐŊŅ С виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅĐŧ `PUT` + +ЊОй ĐžĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚, Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ HTTP `PUT` ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅŽ. + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ `jsonable_encoder`, Ņ‰ĐžĐą ĐŋĐĩŅ€ĐĩŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ Đ˛Ņ…Ņ–Đ´ĐŊŅ– даĐŊŅ– ĐŊа Ņ‚Đ°ĐēŅ–, ŅĐēŅ– ĐŧĐžĐļĐŊа СйĐĩŅ€Ņ–ĐŗĐ°Ņ‚Đ¸ ŅĐē JSON (ĐŊаĐŋŅ€Đ¸ĐēĐģад, ҃ NoSQL ĐąĐ°ĐˇŅ– даĐŊĐ¸Ņ…). НаĐŋŅ€Đ¸ĐēĐģад, ĐŋĐĩŅ€ĐĩŅ‚Đ˛ĐžŅ€ŅŽŅŽŅ‡Đ¸ `datetime` ҃ `str`. + +{* ../../docs_src/body_updates/tutorial001_py310.py hl[28:33] *} + +`PUT` виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ даĐŊĐ¸Ņ…, ŅĐēŅ– ĐŧĐ°ŅŽŅ‚ŅŒ СаĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ Ņ‡Đ¸ĐŊĐŊŅ– даĐŊŅ–. + +### ПоĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊĐŊŅ ĐŋŅ€Đž СаĐŧŅ–ĐŊ҃ + +ĐĻĐĩ ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž ŅĐēŅ‰Đž Ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐžĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ `bar`, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ `PUT` С ҂ҖĐģĐžĐŧ: + +```Python +{ + "name": "Barz", + "price": 3, + "description": None, +} +``` + +ĐžŅĐēŅ–ĐģҌĐēи Đ˛Ņ–ĐŊ ĐŊĐĩ ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ вĐļĐĩ СйĐĩŅ€ĐĩĐļĐĩĐŊĐžĐŗĐž Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ° `"tax": 20.2`, ĐŧОдĐĩĐģҌ ввĐĩĐ´ĐĩĐŊĐŊŅ ĐŋŅ€Đ¸ĐšĐŧĐĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ `"tax": 10.5`. + +І даĐŊŅ– ĐąŅƒĐ´ŅƒŅ‚ŅŒ СйĐĩŅ€ĐĩĐļĐĩĐŊŅ– С Ņ†Đ¸Đŧ "ĐŊОвиĐŧ" СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧ `tax` = `10.5`. + +## Đ§Đ°ŅŅ‚ĐēĐžĐ˛Ņ– ĐžĐŊОвĐģĐĩĐŊĐŊŅ С `PATCH` + +Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅŽ HTTP `PATCH` Đ´ĐģŅ *Ņ‡Đ°ŅŅ‚ĐēĐžĐ˛ĐžĐŗĐž* ĐžĐŊОвĐģĐĩĐŊĐŊŅ даĐŊĐ¸Ņ…. + +ĐĻĐĩ ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ҂Җ даĐŊŅ–, ŅĐēŅ– Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐžĐŊĐžĐ˛Đ¸Ņ‚Đ¸, СаĐģĐ¸ŅˆĐ°ŅŽŅ‡Đ¸ Ņ–ĐŊŅˆŅ– ĐąĐĩС СĐŧŅ–ĐŊ. + +/// note | ĐŸŅ€Đ¸ĐŧŅ–Ņ‚Đēа + +`PATCH` ĐŧĐĩĐŊ҈ Đ˛Ņ–Đ´ĐžĐŧиК Ņ– Ņ€Ņ–Đ´ŅˆĐĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ, ĐŊŅ–Đļ `PUT`. + +І ĐąĐ°ĐŗĐ°Ņ‚Đž ĐēĐžĐŧаĐŊĐ´ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒ ĐģĐ¸ŅˆĐĩ `PUT`, ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ Đ´ĐģŅ Ņ‡Đ°ŅŅ‚ĐēĐžĐ˛Đ¸Ņ… ĐžĐŊОвĐģĐĩĐŊҌ. + +Ви **Đ˛Ņ–ĐģҌĐŊŅ–** виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ—Ņ… Ņ‚Đ°Đē, ŅĐē Ņ…ĐžŅ‡ĐĩŅ‚Đĩ, **FastAPI** ĐŊĐĩ ĐŊаĐēĐģĐ°Đ´Đ°Ņ” ОйĐŧĐĩĐļĐĩĐŊҌ. + +АĐģĐĩ ҆ĐĩĐš ĐŋĐžŅŅ–ĐąĐŊиĐē ĐŋĐžĐēĐ°ĐˇŅƒŅ” ВаĐŧ ĐąŅ–ĐģҌ҈-ĐŧĐĩĐŊ҈ ŅĐē Ņ—Ņ… ĐˇĐ°Đ´ŅƒĐŧаĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸. + +/// + +### ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° `exclude_unset` ҃ Pydantic + +Đ¯ĐēŅ‰Đž Ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ Ņ‡Đ°ŅŅ‚ĐēĐžĐ˛Ņ– ĐžĐŊОвĐģĐĩĐŊĐŊŅ, Đ´ŅƒĐļĐĩ ĐˇŅ€ŅƒŅ‡ĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `exclude_unset` ҃ ĐŧĐĩŅ‚ĐžĐ´Ņ– `.model_dump()` ĐŧОдĐĩĐģŅ– Pydantic. + +НаĐŋŅ€Đ¸ĐēĐģад: `item.model_dump(exclude_unset=True)`. + +/// info | ІĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ + +ĐŖ Pydantic v1 ҆ĐĩĐš ĐŧĐĩŅ‚ĐžĐ´ ĐŊĐ°ĐˇĐ¸Đ˛Đ°Đ˛ŅŅ `.dict()`, Đ˛Ņ–ĐŊ ĐąŅƒĐ˛ ĐˇĐ°ŅŅ‚Đ°Ņ€Ņ–ĐģиК (аĐģĐĩ Đ˛ŅĐĩ ҉Đĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚ŅŒŅŅ) ҃ Pydantic v2, Ņ– ĐąŅƒĐ˛ ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊОваĐŊиК ҃ `.model_dump()`. + +ĐŸŅ€Đ¸ĐēĐģади Ņ‚ŅƒŅ‚ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒ `.dict()` Đ´ĐģŅ ҁ҃ĐŧҖҁĐŊĐžŅŅ‚Ņ– С Pydantic v1, аĐģĐĩ ВаĐŧ ҁĐģŅ–Đ´ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `.model_dump()`, ŅĐēŅ‰Đž ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Pydantic v2. + +/// + +ĐĻĐĩ ŅŅ‚Đ˛ĐžŅ€Đ¸Ņ‚ŅŒ `dict` ĐģĐ¸ŅˆĐĩ С Ņ‚Đ¸Đŧи даĐŊиĐŧи, ŅĐēŅ– ĐąŅƒĐģи ŅĐ˛ĐŊĐž Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊŅ– ĐŋŅ–Đ´ Ņ‡Đ°Ņ ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ ĐŧОдĐĩĐģŅ– `item`, виĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ. + +ĐĸĐžĐ´Ņ– Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ҆Đĩ, Ņ‰ĐžĐą ŅŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ `dict` ĐģĐ¸ŅˆĐĩ С даĐŊиĐŧи, ŅĐēŅ– ĐąŅƒĐģи Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊŅ– (ĐŊĐ°Đ´Ņ–ŅĐģаĐŊŅ– ҃ СаĐŋĐ¸Ņ‚Ņ–), ĐŋŅ€ĐžĐŋ҃ҁĐēĐ°ŅŽŅ‡Đ¸ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ: + +{* ../../docs_src/body_updates/tutorial002_py310.py hl[32] *} + +### ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° `update` ҃ Pydantic + +ĐĸĐĩĐŋĐĩŅ€ Ви ĐŧĐžĐļĐĩŅ‚Đĩ ŅŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ ĐēĐžĐŋŅ–ŅŽ ĐŊĐ°ŅĐ˛ĐŊĐžŅ— ĐŧОдĐĩĐģŅ– Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ `.model_copy()`, Ņ– ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `update` С `dict` , ŅĐēиК ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ даĐŊŅ– Đ´ĐģŅ ĐžĐŊОвĐģĐĩĐŊĐŊŅ. + +/// info | ІĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ + +ĐŖ Pydantic v1 ĐŧĐĩŅ‚ĐžĐ´ ĐŊĐ°ĐˇĐ¸Đ˛Đ°Đ˛ŅŅ `.copy()`, Đ˛Ņ–ĐŊ ĐąŅƒĐ˛ ĐˇĐ°ŅŅ‚Đ°Ņ€Ņ–ĐģиК (аĐģĐĩ Đ˛ŅĐĩ ҉Đĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚ŅŒŅŅ) ҃ Pydantic v2, Ņ– ĐąŅƒĐ˛ ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊОваĐŊиК ҃ `.model_copy()`. + +ĐŸŅ€Đ¸ĐēĐģади Ņ‚ŅƒŅ‚ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒ `.copy()` Đ´ĐģŅ ҁ҃ĐŧҖҁĐŊĐžŅŅ‚Ņ– С Pydantic v1, аĐģĐĩ ŅĐēŅ‰Đž Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Pydantic v2 — ВаĐŧ ҁĐģŅ–Đ´ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `.model_copy()` СаĐŧŅ–ŅŅ‚ŅŒ Ņ†ŅŒĐžĐŗĐž. + +/// + +НаĐŋŅ€Đ¸ĐēĐģад: `stored_item_model.model_copy(update=update_data)`: + +{* ../../docs_src/body_updates/tutorial002_py310.py hl[33] *} + +### ĐŸŅ–Đ´ŅŅƒĐŧĐžĐē Ņ‡Đ°ŅŅ‚ĐēĐžĐ˛Đ¸Ņ… ĐžĐŊОвĐģĐĩĐŊҌ + +ĐŖ ĐŋŅ–Đ´ŅŅƒĐŧĐē҃, Ņ‰ĐžĐą ĐˇĐ°ŅŅ‚ĐžŅŅƒĐ˛Đ°Ņ‚Đ¸ Ņ‡Đ°ŅŅ‚ĐēĐžĐ˛Ņ– ĐžĐŊОвĐģĐĩĐŊĐŊŅ, Ви: + +* (ОĐŋŅ†Ņ–ĐžĐŊаĐģҌĐŊĐž) виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ `PATCH` СаĐŧŅ–ŅŅ‚ŅŒ `PUT`. +* ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚Đĩ СйĐĩŅ€ĐĩĐļĐĩĐŊŅ– даĐŊŅ–. +* ПоĐŧŅ–Ņ‰Đ°Ņ”Ņ‚Đĩ ҆Җ даĐŊŅ– в ĐŧОдĐĩĐģҌ Pydantic. +* ГĐĩĐŊĐĩŅ€ŅƒŅ”Ņ‚Đĩ `dict` ĐąĐĩС СĐŊĐ°Ņ‡ĐĩĐŊҌ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ С ĐŧОдĐĩĐģŅ– ввĐĩĐ´ĐĩĐŊĐŊŅ (виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ `exclude_unset`). + * ĐĸаĐēиĐŧ Ņ‡Đ¸ĐŊĐžĐŧ Ви ĐžĐŊĐžĐ˛Đ¸Ņ‚Đĩ ĐģĐ¸ŅˆĐĩ ҂Җ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ, ŅĐēŅ– ĐąŅƒĐģи ŅĐ˛ĐŊĐž СадаĐŊŅ– ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡ĐĩĐŧ, СаĐŧŅ–ŅŅ‚ŅŒ Ņ‚ĐžĐŗĐž, Ņ‰ĐžĐą ĐŋĐĩŅ€ĐĩСаĐŋĐ¸ŅŅƒĐ˛Đ°Ņ‚Đ¸ вĐļĐĩ СйĐĩŅ€ĐĩĐļĐĩĐŊŅ– СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧи Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ С Đ˛Đ°ŅˆĐžŅ— ĐŧОдĐĩĐģŅ–. +* ĐĄŅ‚Đ˛ĐžŅ€ŅŽŅ”Ņ‚Đĩ ĐēĐžĐŋŅ–ŅŽ СйĐĩŅ€ĐĩĐļĐĩĐŊĐžŅ— ĐŧОдĐĩĐģŅ–, ĐžĐŊОвĐģŅŽŅŽŅ‡Đ¸ Ņ—Ņ— Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ¸ ĐžŅ‚Ņ€Đ¸ĐŧаĐŊиĐŧи Ņ‡Đ°ŅŅ‚ĐēОвиĐŧи ĐžĐŊОвĐģĐĩĐŊĐŊŅĐŧи (виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `update`). +* ПĐĩŅ€ĐĩŅ‚Đ˛ĐžŅ€ŅŽŅ”Ņ‚Đĩ ҁĐēĐžĐŋŅ–ĐšĐžĐ˛Đ°ĐŊ҃ ĐŧОдĐĩĐģҌ ĐŊа Ņ‰ĐžŅŅŒ, Ņ‰Đž ĐŧĐžĐļĐŊа СйĐĩŅ€ĐĩĐŗŅ‚Đ¸ ҃ Đ˛Đ°ŅˆŅƒ БД (ĐŊаĐŋŅ€Đ¸ĐēĐģад, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ `jsonable_encoder`). + * ĐĻĐĩ ĐŧĐžĐļĐŊа ĐŋĐžŅ€Ņ–Đ˛ĐŊŅŅ‚Đ¸ С ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊиĐŧ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅĐŧ ĐŧĐĩŅ‚ĐžĐ´Ņƒ `.model_dump()` ĐŧОдĐĩĐģŅ–, аĐģĐĩ ҆Đĩ ĐŗĐ°Ņ€Đ°ĐŊŅ‚ŅƒŅ” (Ņ– ĐŋĐĩŅ€ĐĩŅ‚Đ˛ĐžŅ€ŅŽŅ”) СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ҃ Ņ‚Đ¸Đŋи даĐŊĐ¸Ņ…, ŅĐēŅ– ĐŧĐžĐļĐŊа ĐŋĐĩŅ€ĐĩŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ ĐŊа JSON, ĐŊаĐŋŅ€Đ¸ĐēĐģад, `datetime` ĐŊа `str`. +* ЗбĐĩŅ€Ņ–ĐŗĐ°Ņ”Ņ‚Đĩ даĐŊŅ– ҃ Đ˛Đ°ŅˆŅƒ БД. +* ПовĐĩŅ€Ņ‚Đ°Ņ”Ņ‚Đĩ ĐžĐŊОвĐģĐĩĐŊ҃ ĐŧОдĐĩĐģҌ. + +{* ../../docs_src/body_updates/tutorial002_py310.py hl[28:35] *} + +/// tip | ĐŸĐžŅ€Đ°Đ´Đ° + +ĐĐ°ŅĐŋŅ€Đ°Đ˛Đ´Ņ– Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ†ŅŽ ŅĐ°Đŧ҃ Ņ‚ĐĩŅ…ĐŊŅ–Đē҃ Ņ– С ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ”ŅŽ HTTP `PUT`. + +АĐģĐĩ ĐŋŅ€Đ¸ĐēĐģад Ņ‚ŅƒŅ‚ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” `PATCH`, Ņ‚ĐžĐŧ҃ Ņ‰Đž Đ˛Ņ–ĐŊ ĐąŅƒĐ˛ ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊиК ŅĐ°ĐŧĐĩ Đ´ĐģŅ Ņ‚Đ°ĐēĐ¸Ņ… виĐŋадĐēŅ–Đ˛. + +/// + +/// note | ĐŸŅ€Đ¸ĐŧŅ–Ņ‚Đēа + +ЗвĐĩŅ€ĐŊŅ–Ņ‚ŅŒ ŅƒĐ˛Đ°ĐŗŅƒ, Ņ‰Đž ĐŧОдĐĩĐģҌ СаĐŋĐ¸Ņ‚Ņƒ Đ˛ŅĐĩ ҉Đĩ ĐŋŅ€ĐžŅ…ĐžĐ´Đ¸Ņ‚ŅŒ ваĐģŅ–Đ´Đ°Ņ†Ņ–ŅŽ. + +ĐĸĐžĐļ, ŅĐēŅ‰Đž Ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐžŅ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°Ņ‚Đ¸ Ņ‡Đ°ŅŅ‚ĐēĐžĐ˛Ņ– ĐžĐŊОвĐģĐĩĐŊĐŊŅ, ŅĐēŅ– ĐŧĐžĐļŅƒŅ‚ŅŒ ĐŊĐĩ ĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸ ĐļОдĐŊĐžĐŗĐž Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ°, ВаĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐŧĐ°Ņ‚Đ¸ ĐŧОдĐĩĐģҌ, Đ´Đĩ Đ˛ŅŅ– Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ¸ ĐŋОСĐŊĐ°Ņ‡ĐĩĐŊŅ– ŅĐē ĐŊĐĩĐžĐąĐžĐ˛â€™ŅĐˇĐēĐžĐ˛Ņ– (ĐˇŅ– СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧи Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ айО `None`). + +ЊОй Ņ€ĐžĐˇŅ€Ņ–ĐˇĐŊŅŅ‚Đ¸ ĐŧОдĐĩĐģŅ– С ŅƒŅŅ–Đŧа ĐŊĐĩĐžĐąĐžĐ˛â€™ŅĐˇĐēОвиĐŧи СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧи Đ´ĐģŅ **ĐžĐŊОвĐģĐĩĐŊĐŊŅ** Ņ– ĐŧОдĐĩĐģŅ– С ĐžĐąĐžĐ˛â€™ŅĐˇĐēОвиĐŧи СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧи Đ´ĐģŅ **ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ**, Ви ĐŧĐžĐļĐĩŅ‚Đĩ ҁĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ŅŅŒ Ņ–Đ´ĐĩŅĐŧи, ĐžĐŋĐ¸ŅĐ°ĐŊиĐŧи ҃ [Đ”ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– ĐŧОдĐĩĐģŅ–](extra-models.md){.internal-link target=_blank}. + +/// diff --git a/docs/uk/docs/tutorial/cookie-param-models.md b/docs/uk/docs/tutorial/cookie-param-models.md new file mode 100644 index 000000000..f070b6ac8 --- /dev/null +++ b/docs/uk/docs/tutorial/cookie-param-models.md @@ -0,0 +1,76 @@ +# МодĐĩĐģŅ– Đ´ĐģŅ Cookie-ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛ + +Đ¯ĐēŅ‰Đž ҃ Đ’Đ°Ņ Ņ” ĐŗŅ€ŅƒĐŋа **cookies** ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛, ŅĐēŅ– ĐŋОв'ŅĐˇĐ°ĐŊŅ– ĐŧŅ–Đļ ŅĐžĐąĐžŅŽ, Ви ĐŧĐžĐļĐĩŅ‚Đĩ ŅŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ **Pydantic-ĐŧОдĐĩĐģҌ**, Ņ‰ĐžĐą ĐžĐŗĐžĐģĐžŅĐ¸Ņ‚Đ¸ Ņ—Ņ…. đŸĒ + +ĐĻĐĩ дОСвОĐģĐ¸Ņ‚ŅŒ ВаĐŧ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž **виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŧОдĐĩĐģҌ** ҃ **Ņ€Ņ–ĐˇĐŊĐ¸Ņ… ĐŧŅ–ŅŅ†ŅŅ…**, а Ņ‚Đ°ĐēĐžĐļ ĐžĐŗĐžĐģĐžŅĐ¸Ņ‚Đ¸ ваĐģŅ–Đ´Đ°Ņ†Ņ–ŅŽ Ņ‚Đ° ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊŅ– Đ´ĐģŅ Đ˛ŅŅ–Ņ… ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛ ОдĐŊĐžŅ‡Đ°ŅĐŊĐž. 😎 + +/// note | ĐĐžŅ‚Đ°Ņ‚Đēи + +ĐĻĐĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚ŅŒŅŅ С вĐĩҀҁҖҗ FastAPI `0.115.0`. 🤓 + +/// + +/// tip | ĐŸĐžŅ€Đ°Đ´Đ° + +ĐĻŅ Đļ Ņ‚ĐĩŅ…ĐŊŅ–Đēа ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´Đž `Query`, `Cookie`, Ņ‚Đ° `Header`. 😎 + +/// + +## Cookie С Pydantic-ĐŧОдĐĩĐģĐģŅŽ + +ĐžĐŗĐžĐģĐžŅŅ–Ņ‚ŅŒ **cookie-ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸**, ŅĐēŅ– ВаĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊŅ–, ҃ **Pydantic-ĐŧОдĐĩĐģŅ–**, а ĐŋĐžŅ‚Ņ–Đŧ ĐžĐŗĐžĐģĐžŅŅ–Ņ‚ŅŒ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ŅĐē `Cookie`: + +{* ../../docs_src/cookie_param_models/tutorial001_an_py310.py hl[9:12,16] *} + +**FastAPI** ĐąŅƒĐ´Đĩ **Đ˛Đ¸Ņ‚ŅĐŗŅƒĐ˛Đ°Ņ‚Đ¸** даĐŊŅ– Đ´ĐģŅ **ĐēĐžĐļĐŊĐžĐŗĐž ĐŋĐžĐģŅ** С **cookie** ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛, ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐ¸Ņ… ҃ СаĐŋĐ¸Ņ‚Ņ–, Ņ– ĐŋĐĩŅ€ĐĩĐ´Đ°Đ˛Đ°Ņ‚Đ¸ ВаĐŧ Pydantic-ĐŧОдĐĩĐģҌ, ŅĐē҃ Ви виСĐŊĐ°Ņ‡Đ¸Đģи. + +## ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēа ҃ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐąĐ°Ņ‡Đ¸Ņ‚Đ¸ виСĐŊĐ°Ņ‡ĐĩĐŊŅ– cookie в Ņ–ĐŊŅ‚ĐĩҀ҄ĐĩĐšŅŅ– Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— Са Đ°Đ´Ņ€ĐĩŅĐžŅŽ `/docs`: + +
+ +
+ +/// info | ІĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ + +ĐœĐ°ĐšŅ‚Đĩ ĐŊа ŅƒĐ˛Đ°ĐˇŅ–, Ņ‰Đž ĐžŅĐēŅ–ĐģҌĐēи **ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ¸ ĐžĐąŅ€ĐžĐąĐģŅŅŽŅ‚ŅŒ cookie** ĐžŅĐžĐąĐģивиĐŧ Ņ‡Đ¸ĐŊĐžĐŧ Ņ– "Са ĐģĐ°ŅˆŅ‚ŅƒĐŊĐēаĐŧи", вОĐŊи **ĐŊĐĩ** дОСвОĐģŅŅŽŅ‚ŅŒ **JavaScript** ĐģĐĩĐŗĐēĐž С ĐŊиĐŧи ĐŋŅ€Đ°Ņ†ŅŽĐ˛Đ°Ņ‚Đ¸. + +Đ¯ĐēŅ‰Đž Ви СаКдĐĩŅ‚Đĩ Đ´Đž **Ņ–ĐŊŅ‚ĐĩҀ҄ĐĩĐšŅŅƒ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— API** Са Đ°Đ´Ņ€ĐĩŅĐžŅŽ `/docs`, Ви СĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐąĐ°Ņ‡Đ¸Ņ‚Đ¸ **Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–ŅŽ** Đ´ĐģŅ cookie ҃ Đ’Đ°ŅˆĐ¸Ņ… **ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅŅ… ҈ĐģŅŅ…Ņƒ**. + +АĐģĐĩ ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ŅĐēŅ‰Đž Ви СаĐŋОвĐŊĐ¸Ņ‚Đĩ даĐŊŅ– Đš ĐŊĐ°Ņ‚Đ¸ŅĐŊĐĩŅ‚Đĩ "Execute", ĐžŅĐēŅ–ĐģҌĐēи Ņ–ĐŊŅ‚ĐĩҀ҄ĐĩĐšŅ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— ĐŋŅ€Đ°Ņ†ŅŽŅ” С **JavaScript**, cookie ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ‚ŅŒ Đ˛Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ–, Ņ– Ви ĐŋĐžĐąĐ°Ņ‡Đ¸Ņ‚Đĩ **ĐŋĐžĐŧиĐģĐē҃**, ĐŊŅ–ĐąĐ¸ Ви ĐŊĐĩ ввĐĩĐģи ĐļОдĐŊĐ¸Ņ… СĐŊĐ°Ņ‡ĐĩĐŊҌ. + +/// + +## Đ—Đ°ĐąĐžŅ€ĐžĐŊа Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Đ¸Ņ… cookie + +ĐŖ Đ´ĐĩŅĐēĐ¸Ņ… ҁĐŋĐĩŅ†Ņ–Đ°ĐģҌĐŊĐ¸Ņ… виĐŋадĐēĐ°Ņ… (ĐšĐŧĐžĐ˛Ņ–Ņ€ĐŊĐž, ĐŊĐĩ Đ´ŅƒĐļĐĩ ĐŋĐžŅˆĐ¸Ņ€ĐĩĐŊĐ¸Ņ…) Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇĐ°Ņ…ĐžŅ‚Ņ–Ņ‚Đ¸ **ОйĐŧĐĩĐļĐ¸Ņ‚Đ¸** ҁĐŋĐ¸ŅĐžĐē cookie, ŅĐēŅ– Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐžŅ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°Ņ‚Đ¸. + +Đ’Đ°ŅˆĐ° API Ņ‚ĐĩĐŋĐĩŅ€ ĐŧĐ°Ņ” ĐŧĐžĐļĐģĐ¸Đ˛Ņ–ŅŅ‚ŅŒ ĐēĐžĐŊŅ‚Ņ€ĐžĐģŅŽĐ˛Đ°Ņ‚Đ¸ вĐģĐ°ŅĐŊ҃ ĐˇĐŗĐžĐ´Ņƒ ĐŊа cookie. đŸ¤ĒđŸĒ + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ĐŧОдĐĩĐģŅ– Pydantic, Ņ‰ĐžĐą `ĐˇĐ°ĐąĐžŅ€ĐžĐŊĐ¸Ņ‚Đ¸` ĐąŅƒĐ´ŅŒ-ŅĐēŅ– `Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ–` ĐŋĐžĐģŅ: + +{* ../../docs_src/cookie_param_models/tutorial002_an_py39.py hl[10] *} + +Đ¯ĐēŅ‰Đž ĐēĐģŅ–Ņ”ĐŊŅ‚ ҁĐŋŅ€ĐžĐąŅƒŅ” ĐŊĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸ ŅĐēŅ–ŅŅŒ **Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– cookie**, Đ˛Ņ–ĐŊ ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ” Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ С **ĐŋĐžĐŧиĐģĐēĐžŅŽ**. + +Đ‘Ņ–Đ´ĐŊŅ– йаĐŊĐĩŅ€Đ¸ cookie, ŅĐēŅ– Ņ‚Đ°Đē ŅŅ‚Đ°Ņ€Đ°ĐŊĐŊĐž ĐŊаĐŧĐ°ĐŗĐ°ŅŽŅ‚ŅŒŅŅ ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ Đ’Đ°ŅˆŅƒ ĐˇĐŗĐžĐ´Ņƒ, Ņ‰ĐžĐą API Ņ—Ņ— Đ˛Ņ–Đ´Ņ…Đ¸ĐģиĐģа. đŸĒ + +НаĐŋŅ€Đ¸ĐēĐģад, ŅĐēŅ‰Đž ĐēĐģŅ–Ņ”ĐŊŅ‚ ҁĐŋŅ€ĐžĐąŅƒŅ” ĐŊĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸ cookie `santa_tracker` ĐˇŅ– СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧ `good-list-please`, Đ˛Ņ–ĐŊ ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ” Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ С ĐŋĐžĐŧиĐģĐēĐžŅŽ, ŅĐēа ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐ¸Ņ‚ŅŒ, Ņ‰Đž cookie `santa_tracker` ĐŊĐĩ дОСвОĐģĐĩĐŊĐž: + +```json +{ + "detail": [ + { + "type": "extra_forbidden", + "loc": ["cookie", "santa_tracker"], + "msg": "Extra inputs are not permitted", + "input": "good-list-please", + } + ] +} +``` + +## ĐŸŅ–Đ´ŅŅƒĐŧĐžĐē + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ **Pydantic-ĐŧОдĐĩĐģŅ–** Đ´ĐģŅ ĐžĐŗĐžĐģĐžŅˆĐĩĐŊĐŊŅ cookie ҃ FastAPI. 😎 diff --git a/docs/uk/docs/tutorial/cors.md b/docs/uk/docs/tutorial/cors.md new file mode 100644 index 000000000..95b204d0f --- /dev/null +++ b/docs/uk/docs/tutorial/cors.md @@ -0,0 +1,89 @@ +# CORS (ОбĐŧŅ–ĐŊ Ņ€ĐĩŅŅƒŅ€ŅĐ°Đŧи ĐŧŅ–Đļ Ņ€Ņ–ĐˇĐŊиĐŧи Đ´ĐļĐĩŅ€ĐĩĐģаĐŧи) + +CORS айО "ОбĐŧŅ–ĐŊ Ņ€ĐĩŅŅƒŅ€ŅĐ°Đŧи ĐŧŅ–Đļ Ņ€Ņ–ĐˇĐŊиĐŧи Đ´ĐļĐĩŅ€ĐĩĐģаĐŧи" Ņ” ŅĐ¸Ņ‚ŅƒĐ°Ņ†Ņ–Ņ, ĐēĐžĐģи Ņ„Ņ€ĐžĐŊŅ‚ĐĩĐŊĐ´, Ņ‰Đž ĐŋŅ€Đ°Ņ†ŅŽŅ” в ĐąŅ€Đ°ŅƒĐˇĐĩҀҖ, ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ JavaScript-ĐēОд, ŅĐēиК Đ˛ĐˇĐ°Ņ”ĐŧĐžĐ´Ņ–Ņ” С ĐąĐĩĐēĐĩĐŊĐ´ĐžĐŧ, Ņ€ĐžĐˇŅ‚Đ°ŅˆĐžĐ˛Đ°ĐŊиĐŧ в Ņ–ĐŊŅˆĐžĐŧ҃ "Đ´ĐļĐĩŅ€ĐĩĐģŅ–" (origin). + +## ДĐļĐĩŅ€ĐĩĐģĐž (Origin) + +ДĐļĐĩŅ€ĐĩĐģĐž виСĐŊĐ°Ņ‡Đ°Ņ”Ņ‚ŅŒŅŅ ĐēĐžĐŧĐąŅ–ĐŊĐ°Ņ†Ņ–Ņ”ŅŽ ĐŋŅ€ĐžŅ‚ĐžĐēĐžĐģ҃ (`http`, `https`), Đ´ĐžĐŧĐĩĐŊ҃ (`myapp.com`, `localhost`, `localhost.tiangolo.com`), ĐŋĐžŅ€Ņ‚Ņƒ (`80`, `443`, `8080`). + + +НаĐŋŅ€Đ¸ĐēĐģад, Ņ‚Đ°ĐēŅ– Đ°Đ´Ņ€ĐĩŅĐ¸ вваĐļĐ°ŅŽŅ‚ŅŒŅŅ Ņ€Ņ–ĐˇĐŊиĐŧи Đ´ĐļĐĩŅ€ĐĩĐģаĐŧи: + +* `http://localhost` +* `https://localhost` +* `http://localhost:8080` + +ĐĐ°Đ˛Ņ–Ņ‚ŅŒ ŅĐēŅ‰Đž вОĐŊи Đ˛ŅŅ– ĐŧŅ–ŅŅ‚ŅŅ‚ŅŒ `localhost`, вОĐŊи ĐŧĐ°ŅŽŅ‚ŅŒ Ņ€Ņ–ĐˇĐŊŅ– ĐŋŅ€ĐžŅ‚ĐžĐēĐžĐģи айО ĐŋĐžŅ€Ņ‚Đ¸, Ņ‰Đž Ņ€ĐžĐąĐ¸Ņ‚ŅŒ Ņ—Ņ… ĐžĐēŅ€ĐĩĐŧиĐŧи "Đ´ĐļĐĩŅ€ĐĩĐģаĐŧи". + +## ĐšŅ€ĐžĐēи + +ĐŸŅ€Đ¸ĐŋŅƒŅŅ‚Đ¸ĐŧĐž, Ņ‰Đž Đ’Đ°Ņˆ Ņ„Ņ€ĐžĐŊŅ‚ĐĩĐŊĐ´ ĐŋŅ€Đ°Ņ†ŅŽŅ” в ĐąŅ€Đ°ŅƒĐˇĐĩҀҖ ĐŊа `http://localhost:8080`, а ĐšĐžĐŗĐž JavaScript ĐŊаĐŧĐ°ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ Đ˛Ņ–Đ´ĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đ¸ СаĐŋĐ¸Ņ‚ Đ´Đž ĐąĐĩĐēĐĩĐŊĐ´Ņƒ, ŅĐēиК ĐŋŅ€Đ°Ņ†ŅŽŅ” ĐŊа `http://localhost` (ĐžŅĐēŅ–ĐģҌĐēи Đŧи ĐŊĐĩ вĐēĐ°ĐˇŅƒŅ”ĐŧĐž ĐŋĐžŅ€Ņ‚, ĐąŅ€Đ°ŅƒĐˇĐĩŅ€ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ĐŋŅ€Đ¸Đŋ҃ҁĐēĐ°Ņ” ĐŋĐžŅ€Ņ‚ `80`). + +ĐŸĐžŅ‚Ņ–Đŧ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€ ĐŊĐ°Đ´Ņ–ŅˆĐģĐĩ HTTP-СаĐŋĐ¸Ņ‚ `OPTIONS` Đ´Đž ĐąĐĩĐēĐĩĐŊĐ´Ņƒ ĐŊа ĐŋĐžŅ€Ņ‚Ņƒ `:80`, Ņ– ŅĐēŅ‰Đž ĐąĐĩĐēĐĩĐŊĐ´ ĐŊĐ°Đ´Ņ–ŅˆĐģĐĩ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊŅ– ĐˇĐ°ĐŗĐžĐģОвĐēи, Ņ‰Đž дОСвОĐģŅŅŽŅ‚ŅŒ ĐēĐžĐŧ҃ĐŊŅ–ĐēĐ°Ņ†Ņ–ŅŽ С Ņ†ŅŒĐžĐŗĐž Ņ–ĐŊŅˆĐžĐŗĐž Đ´ĐļĐĩŅ€ĐĩĐģа (`http://localhost:8080`), Ņ‚ĐžĐ´Ņ– ĐąŅ€Đ°ŅƒĐˇĐĩŅ€ ĐŊа ĐŋĐžŅ€Ņ‚Ņƒ `:8080` дОСвОĐģĐ¸Ņ‚ŅŒ JavaScript ҃ Ņ„Ņ€ĐžĐŊŅ‚ĐĩĐŊĐ´Ņ– ĐŊĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸ ŅĐ˛Ņ–Đš СаĐŋĐ¸Ņ‚ Đ´Đž ĐąĐĩĐēĐĩĐŊĐ´Ņƒ ĐŊа ĐŋĐžŅ€Ņ‚Ņƒ `:80`. + +ЊОй Đ´ĐžŅŅĐŗŅ‚Đ¸ Ņ†ŅŒĐžĐŗĐž, ĐąĐĩĐēĐĩĐŊĐ´ ĐŊа ĐŋĐžŅ€Ņ‚Ņƒ `:80` ĐŋОвиĐŊĐĩĐŊ ĐŧĐ°Ņ‚Đ¸ ҁĐŋĐ¸ŅĐžĐē "дОСвОĐģĐĩĐŊĐ¸Ņ… Đ´ĐļĐĩŅ€ĐĩĐģ". + +ĐŖ Ņ†ŅŒĐžĐŧ҃ виĐŋадĐē҃ ҁĐŋĐ¸ŅĐžĐē ĐŧĐ°Ņ” ĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸ `http://localhost:8080`, Ņ‰ĐžĐą Ņ„Ņ€ĐžĐŊŅ‚ĐĩĐŊĐ´ ĐŊа ĐŋĐžŅ€Ņ‚Ņƒ `:8080` ĐŋŅ€Đ°Ņ†ŅŽĐ˛Đ°Đ˛ ĐēĐžŅ€ĐĩĐēŅ‚ĐŊĐž. + +## ХиĐŧвОĐģҌĐŊĐĩ ĐŋŅ–Đ´ŅŅ‚Đ°Đ˛ĐģŅĐŊĐŊŅ + +МоĐļĐŊа Ņ‚Đ°ĐēĐžĐļ ĐžĐŗĐžĐģĐžŅĐ¸Ņ‚Đ¸ ҁĐŋĐ¸ŅĐžĐē ŅĐē `"*"` ("ŅĐ¸ĐŧвОĐģҌĐŊĐĩ ĐŋŅ–Đ´ŅŅ‚Đ°Đ˛ĐģŅĐŊĐŊŅ"), Ņ‰Đž ОСĐŊĐ°Ņ‡Đ°Ņ” Đ´ĐžĐˇĐ˛Ņ–Đģ Đ´ĐģŅ Đ˛ŅŅ–Ņ… Đ´ĐļĐĩŅ€ĐĩĐģ. + +ОдĐŊаĐē ҆Đĩ дОСвОĐģĐ¸Ņ‚ŅŒ ĐģĐ¸ŅˆĐĩ ĐŋĐĩвĐŊŅ– Ņ‚Đ¸Đŋи ĐēĐžĐŧ҃ĐŊŅ–ĐēĐ°Ņ†Ņ–Ņ—, виĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ Đ˛ŅĐĩ, Ņ‰Đž ĐŋОв'ŅĐˇĐ°ĐŊĐĩ С ОйĐģŅ–ĐēОвиĐŧи даĐŊиĐŧи: Cookies, ĐˇĐ°ĐŗĐžĐģОвĐēи Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Ņ–Ņ—, Ņ‚Đ°ĐēŅ– ŅĐē ҂Җ, Ņ‰Đž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ С Bearer Ņ‚ĐžĐēĐĩĐŊаĐŧи Ņ‚ĐžŅ‰Đž. + +ĐĸĐžĐŧ҃ Đ´ĐģŅ ĐēĐžŅ€ĐĩĐēŅ‚ĐŊĐžŅ— Ņ€ĐžĐąĐžŅ‚Đ¸ ĐēŅ€Đ°Ņ‰Đĩ ŅĐ˛ĐŊĐž вĐēĐ°ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ дОСвОĐģĐĩĐŊŅ– Đ´ĐļĐĩŅ€ĐĩĐģа. + +## ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ `CORSMiddleware` + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ҆Đĩ ҃ Đ’Đ°ŅˆĐžĐŧ҃ Đ´ĐžĐ´Đ°Ņ‚Đē҃ **FastAPI** Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ `CORSMiddleware`. + +* ІĐŧĐŋĐžŅ€Ņ‚ŅƒĐšŅ‚Đĩ `CORSMiddleware`. +* ĐĄŅ‚Đ˛ĐžŅ€Ņ–Ņ‚ŅŒ ҁĐŋĐ¸ŅĐžĐē дОСвОĐģĐĩĐŊĐ¸Ņ… Đ´ĐļĐĩŅ€ĐĩĐģ (҃ Đ˛Đ¸ĐŗĐģŅĐ´Ņ– Ņ€ŅĐ´ĐēŅ–Đ˛). +* Đ”ĐžĐ´Đ°ĐšŅ‚Đĩ ĐšĐžĐŗĐž ŅĐē "middleware" ҃ Đ’Đ°Ņˆ Đ´ĐžĐ´Đ°Ņ‚ĐžĐē **FastAPI**. + + +ĐĸаĐēĐžĐļ ĐŧĐžĐļĐŊа вĐēĐ°ĐˇĐ°Ņ‚Đ¸, Ņ‡Đ¸ дОСвОĐģŅŅ” Đ’Đ°Ņˆ ĐąĐĩĐēĐĩĐŊĐ´: + +* ОбĐģŅ–ĐēĐžĐ˛Ņ– даĐŊŅ– (ĐˇĐ°ĐŗĐžĐģОвĐēи Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Ņ–Ņ—, ҁookies, Ņ‚ĐžŅ‰Đž). +* КоĐŊĐēŅ€ĐĩŅ‚ĐŊŅ– HTTP-ĐŧĐĩŅ‚ĐžĐ´Đ¸ (`POST`, `PUT`) айО Đ˛ŅŅ– Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ `"*"` +* КоĐŊĐēŅ€ĐĩŅ‚ĐŊŅ– HTTP-ĐˇĐ°ĐŗĐžĐģОвĐēи айО Đ˛ŅŅ– Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ `"*"`. + + +{* ../../docs_src/cors/tutorial001.py hl[2,6:11,13:19] *} + +ĐŸĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ҃ `CORSMiddleware` Ņ” Đ´ĐžŅĐ¸Ņ‚ŅŒ ОйĐŧĐĩĐļĐĩĐŊиĐŧи, Ņ‚ĐžĐŧ҃ ВаĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ŅĐ˛ĐŊĐž вĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊŅ– Đ´ĐļĐĩŅ€ĐĩĐģа, ĐŧĐĩŅ‚ĐžĐ´Đ¸ айО ĐˇĐ°ĐŗĐžĐģОвĐēи, Ņ‰ĐžĐą ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ¸ ĐŧĐžĐŗĐģи виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ—Ņ… ҃ ĐēĐžĐŊŅ‚ĐĩĐēҁ҂Җ СаĐŋĐ¸Ņ‚Ņ–Đ˛ ĐŧŅ–Đļ Ņ€Ņ–ĐˇĐŊиĐŧи Đ´ĐžĐŧĐĩĐŊаĐŧи. + + +ĐŸŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅŽŅ‚ŅŒŅŅ Ņ‚Đ°ĐēŅ– Đ°Ņ€ĐŗŅƒĐŧĐĩĐŊŅ‚Đ¸: + +* `allow_origins` - ĐĄĐŋĐ¸ŅĐžĐē Đ´ĐļĐĩŅ€ĐĩĐģ, ŅĐēиĐŧ дОСвОĐģĐĩĐŊĐž ĐˇĐ´Ņ–ĐšŅĐŊŅŽĐ˛Đ°Ņ‚Đ¸ ĐŧŅ–ĐļĐ´ĐžĐŧĐĩĐŊĐŊŅ– СаĐŋĐ¸Ņ‚Đ¸. НаĐŋŅ€Đ¸ĐēĐģад `['https://example.org', 'https://www.example.org']`. Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ['*'], Ņ‰ĐžĐą дОСвОĐģĐ¸Ņ‚Đ¸ Đ˛ŅŅ– Đ´ĐļĐĩŅ€ĐĩĐģа. +* `allow_origin_regex` - Đ ŅĐ´ĐžĐē Ņ€ĐĩĐŗŅƒĐģŅŅ€ĐŊĐžĐŗĐž Đ˛Đ¸Ņ€Đ°ĐˇŅƒ Đ´ĐģŅ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊĐžŅŅ‚Ņ– Đ´ĐļĐĩŅ€ĐĩĐģаĐŧ, ŅĐēиĐŧ дОСвОĐģĐĩĐŊĐž ĐˇĐ´Ņ–ĐšŅĐŊŅŽĐ˛Đ°Ņ‚Đ¸ ĐŧŅ–ĐļĐ´ĐžĐŧĐĩĐŊĐŊŅ– СаĐŋĐ¸Ņ‚Đ¸. НаĐŋŅ€Đ¸ĐēĐģад, `'https://.*\.example\.org'`. +* `allow_methods` - ĐĄĐŋĐ¸ŅĐžĐē HTTP-ĐŧĐĩŅ‚ĐžĐ´Ņ–Đ˛, дОСвОĐģĐĩĐŊĐ¸Ņ… Đ´ĐģŅ ĐŧŅ–ĐļĐ´ĐžĐŧĐĩĐŊĐŊĐ¸Ņ… СаĐŋĐ¸Ņ‚Ņ–Đ˛. За СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ `['GET']`. Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `['*']`, Ņ‰ĐžĐą дОСвОĐģĐ¸Ņ‚Đ¸ Đ˛ŅŅ– ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊŅ– ĐŧĐĩŅ‚ĐžĐ´Đ¸. +* `allow_headers` - ĐĄĐŋĐ¸ŅĐžĐē HTTP-ĐˇĐ°ĐŗĐžĐģОвĐēŅ–Đ˛, ŅĐēŅ– ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅŽŅ‚ŅŒŅŅ Đ´ĐģŅ ĐŧŅ–ĐļĐ´ĐžĐŧĐĩĐŊĐŊĐ¸Ņ… СаĐŋĐ¸Ņ‚Ņ–Đ˛. За СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ `[]`. Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `['*']`, Ņ‰ĐžĐą дОСвОĐģĐ¸Ņ‚Đ¸ Đ˛ŅŅ– ĐˇĐ°ĐŗĐžĐģОвĐēи. Đ—Đ°ĐŗĐžĐģОвĐēи `Accept`, `Accept-Language`, `Content-Language` Ņ– `Content-Type` СавĐļди дОСвОĐģĐĩĐŊŅ– Đ´ĐģŅ ĐŋŅ€ĐžŅŅ‚Đ¸Ņ… CORS-СаĐŋĐ¸Ņ‚Ņ–Đ˛. +* `allow_credentials` - ВизĐŊĐ°Ņ‡Đ°Ņ”, Ņ‡Đ¸ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅŽŅ‚ŅŒŅŅ Ņ„Đ°ĐšĐģи cookie Đ´ĐģŅ ĐŧŅ–ĐļĐ´ĐžĐŧĐĩĐŊĐŊĐ¸Ņ… СаĐŋĐ¸Ņ‚Ņ–Đ˛. За СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ `False`. ĐĸаĐēĐžĐļ, ŅĐēŅ‰Đž ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž дОСвОĐģĐ¸Ņ‚Đ¸ ОйĐŧŅ–ĐŊ ОйĐģŅ–ĐēОвиĐŧи даĐŊиĐŧи (`allow_credentials = True`), ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `allow_origins` ĐŊĐĩ ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиК ŅĐē `['*']`, ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž вĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊŅ– Đ´ĐļĐĩŅ€ĐĩĐģа. +* `expose_headers` - ВĐēĐ°ĐˇŅƒŅ”, ŅĐēŅ– ĐˇĐ°ĐŗĐžĐģОвĐēи Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ– ĐŋОвиĐŊĐŊŅ– ĐąŅƒŅ‚Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋĐŊŅ– Đ´ĐģŅ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°. За СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ `[]`. +* `max_age` - Đ’ŅŅ‚Đ°ĐŊОвĐģŅŽŅ” ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊиК Ņ‡Đ°Ņ (҃ ҁĐĩĐē҃ĐŊĐ´Đ°Ņ…) Đ´ĐģŅ ĐēĐĩŅˆŅƒĐ˛Đ°ĐŊĐŊŅ CORS-Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐĩĐš ҃ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°Ņ…. За СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ `600`. + +ĐĻĐĩĐš middleware ĐžĐąŅ€ĐžĐąĐģŅŅ” два Ņ‚Đ¸Đŋи HTTP-СаĐŋĐ¸Ņ‚Ņ–Đ˛... + +### ПоĐŋĐĩŅ€ĐĩĐ´ĐŊŅ– CORS-СаĐŋĐ¸Ņ‚Đ¸ (preflight requests) + +ĐĻĐĩ ĐąŅƒĐ´ŅŒ-ŅĐēŅ– `OPTIONS` - СаĐŋĐ¸Ņ‚Đ¸, Ņ‰Đž ĐŧŅ–ŅŅ‚ŅŅ‚ŅŒ ĐˇĐ°ĐŗĐžĐģОвĐēи `Origin` Ņ‚Đ° `Access-Control-Request-Method`. + +ĐŖ Ņ‚Đ°ĐēĐžĐŧ҃ виĐŋадĐē҃ middleware ĐŋĐĩŅ€ĐĩŅ…ĐžĐŋĐ¸Ņ‚ŅŒ Đ˛Ņ…Ņ–Đ´ĐŊиК СаĐŋĐ¸Ņ‚ Ņ– Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–ŅŅ‚ŅŒ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊиĐŧи CORS-ĐˇĐ°ĐŗĐžĐģОвĐēаĐŧи, ĐŋОвĐĩŅ€Ņ‚Đ°ŅŽŅ‡Đ¸ айО `200`, айО `400` Đ´ĐģŅ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ĐšĐŊĐ¸Ņ… ҆ҖĐģĐĩĐš. + +### ĐŸŅ€ĐžŅŅ‚Ņ– СаĐŋĐ¸Ņ‚Đ¸ + +Đ‘ŅƒĐ´ŅŒ-ŅĐēŅ– СаĐŋĐ¸Ņ‚Đ¸ Ņ–Đˇ ĐˇĐ°ĐŗĐžĐģОвĐēĐžĐŧ `Origin`. ĐŖ Ņ†ŅŒĐžĐŧ҃ виĐŋадĐē҃ middleware ĐŋŅ€ĐžĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ СаĐŋĐ¸Ņ‚ ŅĐē ĐˇĐ˛Đ¸Ņ‡Đ°ĐšĐŊиК, аĐģĐĩ Đ´ĐžĐ´Đ°ŅŅ‚ŅŒ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊŅ– CORS-ĐˇĐ°ĐŗĐžĐģОвĐēи ҃ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ. + +## Đ”ĐžĐ´Đ°Ņ‚ĐēОва Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ + +Đ‘Ņ–ĐģҌ҈Đĩ ĐŋŅ€Đž CORS ĐŧĐžĐļĐŊа Đ´Ņ–ĐˇĐŊĐ°Ņ‚Đ¸ŅŅ в Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— Mozilla. + +/// note | ĐĸĐĩŅ…ĐŊҖ҇ĐŊŅ– Đ´ĐĩŅ‚Đ°ĐģŅ– + +ĐĸаĐēĐžĐļ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `from starlette.middleware.cors import CORSMiddleware`. + +**FastAPI** ĐŊĐ°Đ´Đ°Ņ” ĐēŅ–ĐģҌĐēа middleware ҃ `fastapi.middleware` Đ´ĐģŅ ĐˇŅ€ŅƒŅ‡ĐŊĐžŅŅ‚Ņ– Ņ€ĐžĐˇŅ€ĐžĐąĐŊиĐēŅ–Đ˛. АĐģĐĩ ĐąŅ–ĐģŅŒŅˆŅ–ŅŅ‚ŅŒ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐ¸Ņ… middleware ĐŋĐžŅ…ĐžĐ´ŅŅ‚ŅŒ ĐąĐĩСĐŋĐžŅĐĩŅ€ĐĩĐ´ĐŊŅŒĐž ĐˇŅ– Starlette. + +/// diff --git a/docs/uk/docs/tutorial/handling-errors.md b/docs/uk/docs/tutorial/handling-errors.md new file mode 100644 index 000000000..12a356cd0 --- /dev/null +++ b/docs/uk/docs/tutorial/handling-errors.md @@ -0,0 +1,255 @@ +# ĐžĐąŅ€ĐžĐąĐēа ПоĐŧиĐģĐžĐē + +Є ĐąĐ°ĐŗĐ°Ņ‚Đž ŅĐ¸Ņ‚ŅƒĐ°Ņ†Ņ–Đš, ĐēĐžĐģи ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐ¸Ņ‚Đ¸ ĐēĐģŅ–Ņ”ĐŊŅ‚Đ°, ŅĐēиК виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” Đ’Đ°Ņˆ API, ĐŋŅ€Đž ĐŋĐžĐŧиĐģĐē҃. + +ĐĻиĐŧ ĐēĐģŅ–Ņ”ĐŊŅ‚ĐžĐŧ ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€ Ņ–Đˇ Ņ„Ņ€ĐžĐŊŅ‚ĐĩĐŊĐ´ĐžĐŧ, ĐēОд Ņ–ĐŊŅˆĐžĐŗĐž Ņ€ĐžĐˇŅ€ĐžĐąĐŊиĐēа, IoT-ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš Ņ‚ĐžŅ‰Đž. + +МоĐļĐģивО, ВаĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐ¸Ņ‚Đ¸ ĐēĐģŅ–Ņ”ĐŊŅ‚Đ°, Ņ‰Đž: + +* ĐŖ ĐŊŅŒĐžĐŗĐž ĐŊĐĩĐ´ĐžŅŅ‚Đ°Ņ‚ĐŊŅŒĐž ĐŋŅ€Đ°Đ˛ Đ´ĐģŅ виĐēĐžĐŊаĐŊĐŊŅ ҆ҖҔҗ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ—. +* Đ’Ņ–ĐŊ ĐŊĐĩ ĐŧĐ°Ņ” Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž Ņ†ŅŒĐžĐŗĐž Ņ€ĐĩŅŅƒŅ€ŅŅƒ. +* ЕĐģĐĩĐŧĐĩĐŊŅ‚, Đ´Đž ŅĐēĐžĐŗĐž Đ˛Ņ–ĐŊ ĐŊаĐŧĐ°ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋ, ĐŊĐĩ ҖҁĐŊŅƒŅ”. +* Ņ‚ĐžŅ‰Đž. + +ĐŖ Ņ‚Đ°ĐēĐ¸Ņ… виĐŋадĐēĐ°Ņ… ĐˇĐ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš ĐŋОвĐĩŅ€Ņ‚Đ°Ņ”Ņ‚ŅŒŅŅ **HTTP ŅŅ‚Đ°Ņ‚ŅƒŅ-ĐēОд** в Đ´Ņ–Đ°ĐŋаСОĐŊŅ– **400** (Đ˛Ņ–Đ´ 400 Đ´Đž 499). + +ĐĻĐĩ ŅŅ…ĐžĐļĐĩ ĐŊа HTTP ŅŅ‚Đ°Ņ‚ŅƒŅ-ĐēОди 200 (Đ˛Ņ–Đ´ 200 Đ´Đž 299). ĐĻŅ– "200" ŅŅ‚Đ°Ņ‚ŅƒŅ-ĐēОди ОСĐŊĐ°Ņ‡Đ°ŅŽŅ‚ŅŒ, Ņ‰Đž СаĐŋĐ¸Ņ‚ ĐŋŅ€ĐžĐšŅˆĐžĐ˛ ҃ҁĐŋŅ–ŅˆĐŊĐž. + +ĐĄŅ‚Đ°Ņ‚ŅƒŅ-ĐēОди в Đ´Ņ–Đ°ĐŋаСОĐŊŅ– 400 ОСĐŊĐ°Ņ‡Đ°ŅŽŅ‚ŅŒ, Ņ‰Đž ŅŅ‚Đ°ĐģĐ°ŅŅ ĐŋĐžĐŧиĐģĐēа С йОĐē҃ ĐēĐģŅ–Ņ”ĐŊŅ‚Đ°. + +ПаĐŧ'ŅŅ‚Đ°Ņ”Ņ‚Đĩ Đ˛ŅŅ– ҆Җ ĐŋĐžĐŧиĐģĐēи **404 Not Found** (Ņ– ĐļĐ°Ņ€Ņ‚Đ¸ ĐŋŅ€Đž ĐŊĐ¸Ņ…)? + +## ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ `HTTPException` + +ЊОй ĐŋОвĐĩŅ€ĐŊŅƒŅ‚Đ¸ HTTP-Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ– С ĐŋĐžĐŧиĐģĐēаĐŧи ĐēĐģŅ–Ņ”ĐŊŅ‚Ņƒ, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ `HTTPException`. + +### ІĐŧĐŋĐžŅ€Ņ‚ `HTTPException` + +{* ../../docs_src/handling_errors/tutorial001.py hl[1] *} + +### ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ `HTTPException` ҃ ĐēĐžĐ´Ņ– + +`HTTPException` — ҆Đĩ ĐˇĐ˛Đ¸Ņ‡Đ°ĐšĐŊа ĐŋĐžĐŧиĐģĐēа Python Ņ–Đˇ Đ´ĐžĐ´Đ°Ņ‚ĐēОвиĐŧи даĐŊиĐŧи, ŅĐēŅ– ŅŅ‚ĐžŅŅƒŅŽŅ‚ŅŒŅŅ API. + +ĐžŅĐēŅ–ĐģҌĐēи ҆Đĩ ĐŋĐžĐŧиĐģĐēа Python, Ви ĐŊĐĩ `ĐŋОвĐĩŅ€Ņ‚Đ°Ņ”Ņ‚Đĩ` ĐšĐžĐŗĐž, а `ĐŗĐĩĐŊĐĩŅ€ŅƒŅ”Ņ‚Đĩ` (ĐŗĐĩĐŊĐĩŅ€ŅƒŅ”Ņ‚Đĩ ĐŋĐžĐŧиĐģĐē҃). + +ĐĻĐĩ Ņ‚Đ°ĐēĐžĐļ ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž ŅĐēŅ‰Đž Ви ĐŋĐĩŅ€ĐĩĐąŅƒĐ˛Đ°Ņ”Ņ‚Đĩ Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– Đ´ĐžĐŋĐžĐŧŅ–ĐļĐŊĐžŅ— Ņ„ŅƒĐŊĐē҆Җҗ, ŅĐē҃ виĐēĐģиĐēĐ°Ņ”Ņ‚Đĩ Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– ŅĐ˛ĐžŅ”Ņ— *Ņ„ŅƒĐŊĐē҆Җҗ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ҈ĐģŅŅ…Ņƒ*, Ņ– Ņ‚Đ°Đŧ ĐŗĐĩĐŊĐĩŅ€ŅƒŅ”Ņ‚Đĩ `HTTPException`, Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– ҆ҖҔҗ Đ´ĐžĐŋĐžĐŧŅ–ĐļĐŊĐžŅ— Ņ„ŅƒĐŊĐē҆Җҗ, Ņ‚Đž Ņ€ĐĩŅˆŅ‚Đ° ĐēĐžĐ´Ņƒ в *Ņ„ŅƒĐŊĐē҆Җҗ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ҈ĐģŅŅ…Ņƒ* ĐŊĐĩ ĐąŅƒĐ´Đĩ виĐēĐžĐŊаĐŊа. ЗаĐŋĐ¸Ņ‚ ĐžĐ´Ņ€Đ°ĐˇŅƒ СавĐĩŅ€ŅˆĐ¸Ņ‚ŅŒŅŅ, Ņ– HTTP-ĐŋĐžĐŧиĐģĐēа С `HTTPException` ĐąŅƒĐ´Đĩ ĐŊĐ°Đ´Ņ–ŅĐģаĐŊа ĐēĐģŅ–Ņ”ĐŊŅ‚Ņƒ. + +ПĐĩŅ€ĐĩĐ˛Đ°ĐŗĐ° виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ `ĐŗĐĩĐŊĐĩŅ€Đ°Ņ†Ņ–Ņ—` (raise) ĐŋĐžĐŧиĐģĐēи СаĐŧŅ–ŅŅ‚ŅŒ `ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ` СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ (return) ŅŅ‚Đ°ĐŊĐĩ ĐąŅ–ĐģҌ҈ ĐžŅ‡ĐĩвидĐŊиĐŧ в Ņ€ĐžĐˇĐ´Ņ–ĐģŅ– ĐŋŅ€Đž ЗаĐģĐĩĐļĐŊĐžŅŅ‚Ņ– Ņ‚Đ° БĐĩСĐŋĐĩĐē҃. + +ĐŖ Ņ†ŅŒĐžĐŧ҃ ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņ–, ŅĐēŅ‰Đž ĐēĐģŅ–Ņ”ĐŊŅ‚ СаĐŋĐ¸Ņ‚ŅƒŅ” ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ Са ID, ŅĐēĐžĐŗĐž ĐŊĐĩ ҖҁĐŊŅƒŅ”, ĐąŅƒĐ´Đĩ ĐˇĐŗĐĩĐŊĐĩŅ€ĐžĐ˛Đ°ĐŊĐž ĐŋĐžĐŧиĐģĐē҃ ĐˇŅ– ŅŅ‚Đ°Ņ‚ŅƒŅ-ĐēОдОĐŧ `404`: + +{* ../../docs_src/handling_errors/tutorial001.py hl[11] *} + +### ĐžŅ‚Ņ€Đ¸ĐŧаĐŊа Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ + +Đ¯ĐēŅ‰Đž ĐēĐģŅ–Ņ”ĐŊŅ‚ Ņ€ĐžĐąĐ¸Ņ‚ŅŒ СаĐŋĐ¸Ņ‚ Са ҈ĐģŅŅ…ĐžĐŧ `http://example.com/items/foo` (Đ´Đĩ `item_id` `"foo"`), Đ˛Ņ–ĐŊ ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ” ŅŅ‚Đ°Ņ‚ŅƒŅ-ĐēОд 200 Ņ– JSON Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ: + +```JSON +{ + "item": "The Foo Wrestlers" +} +``` + +АĐģĐĩ ŅĐēŅ‰Đž ĐēĐģŅ–Ņ”ĐŊŅ‚ Ņ€ĐžĐąĐ¸Ņ‚ŅŒ СаĐŋĐ¸Ņ‚ ĐŊа `http://example.com/items/bar` (Đ´Đĩ `item_id` ĐŧĐ°Ņ” ĐŊĐĩ ҖҁĐŊŅƒŅŽŅ‡Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ `"bar"`), Ņ‚Đž ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ” ŅŅ‚Đ°Ņ‚ŅƒŅ-ĐēОд 404 (ĐŋĐžĐŧиĐģĐēа "ĐŊĐĩ СĐŊаКдĐĩĐŊĐž") Ņ‚Đ° Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ: + +```JSON +{ + "detail": "Item not found" +} +``` + +/// tip | ĐŸĐžŅ€Đ°Đ´Đ° + +ĐŸŅ–Đ´ Ņ‡Đ°Ņ виĐēĐģиĐē҃ `HTTPException` Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‚Đ¸ ĐąŅƒĐ´ŅŒ-ŅĐēĐĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ, ŅĐēĐĩ ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ ĐŋĐĩŅ€ĐĩŅ‚Đ˛ĐžŅ€ĐĩĐŊĐĩ в JSON, ŅĐē ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `detail`, а ĐŊĐĩ ĐģĐ¸ŅˆĐĩ Ņ€ŅĐ´ĐžĐē (`str`). + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‚Đ¸ `dict`, `list` Ņ‚ĐžŅ‰Đž. + +ВоĐŊи ĐžĐąŅ€ĐžĐąĐģŅŅŽŅ‚ŅŒŅŅ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ **FastAPI** Ņ‚Đ° ĐŋĐĩŅ€ĐĩŅ‚Đ˛ĐžŅ€ŅŽŅŽŅ‚ŅŒŅŅ в JSON. + +/// + +## ДодаваĐŊĐŊŅ вĐģĐ°ŅĐŊĐ¸Ņ… ĐˇĐ°ĐŗĐžĐģОвĐēŅ–Đ˛ + +ІĐŊĐžĐ´Ņ– ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž Đ´ĐžĐ´Đ°Ņ‚Đ¸ вĐģĐ°ŅĐŊŅ– ĐˇĐ°ĐŗĐžĐģОвĐēи Đ´Đž HTTP-ĐŋĐžĐŧиĐģĐēи, ĐŊаĐŋŅ€Đ¸ĐēĐģад, Đ´ĐģŅ ĐŋĐĩвĐŊĐ¸Ņ… Ņ‚Đ¸ĐŋŅ–Đ˛ ĐąĐĩСĐŋĐĩĐēи. + +ЙĐŧĐžĐ˛Ņ–Ņ€ĐŊĐž, ВаĐŧ ĐŊĐĩ дОвĐĩĐ´ĐĩŅ‚ŅŒŅŅ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ҆Đĩ ĐąĐĩСĐŋĐžŅĐĩŅ€ĐĩĐ´ĐŊŅŒĐž ҃ ŅĐ˛ĐžŅ”Đŧ҃ ĐēĐžĐ´Ņ–. + +АĐģĐĩ ŅĐēŅ‰Đž ВаĐŧ СĐŊĐ°Đ´ĐžĐąĐ¸Ņ‚ŅŒŅŅ ҆Đĩ Đ´ĐģŅ ҁĐēĐģадĐŊĐžĐŗĐž ҁ҆ĐĩĐŊĐ°Ņ€Ņ–ŅŽ, Ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ´ĐžĐ´Đ°Ņ‚Đ¸ вĐģĐ°ŅĐŊŅ– ĐˇĐ°ĐŗĐžĐģОвĐēи: + +{* ../../docs_src/handling_errors/tutorial002.py hl[14] *} + +## Đ’ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊŅ вĐģĐ°ŅĐŊĐ¸Ņ… ĐžĐąŅ€ĐžĐąĐŊиĐēŅ–Đ˛ ĐŋĐžĐŧиĐģĐžĐē + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ´ĐžĐ´Đ°Ņ‚Đ¸ вĐģĐ°ŅĐŊŅ– ĐžĐąŅ€ĐžĐąĐŊиĐēи ĐŋĐžĐŧиĐģĐžĐē Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ Ņ‚Đ¸Ņ… ŅĐ°ĐŧĐ¸Ņ… ŅƒŅ‚Đ¸ĐģŅ–Ņ‚ ĐžĐąŅ€ĐžĐąĐēи ĐŋĐžĐŧиĐģĐžĐē ĐˇŅ– Starlette. + +ĐŸŅ€Đ¸ĐŋŅƒŅŅ‚Đ¸ĐŧĐž, ҃ Đ’Đ°Ņ Ņ” вĐģĐ°ŅĐŊиК ОйĘŧŅ”ĐēŅ‚ ĐŋĐžĐŧиĐģĐēи `UnicornException`, ŅĐēĐĩ Ви (айО ĐąŅ–ĐąĐģŅ–ĐžŅ‚ĐĩĐēа, ŅĐē҃ Ви виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ) ĐŧĐžĐļĐĩ `ĐˇĐŗĐĩĐŊĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸` (`raise`). + +І Ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐžĐąŅ€ĐžĐąĐģŅŅ‚Đ¸ ҆Đĩ виĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ ĐŗĐģОйаĐģҌĐŊĐž Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ FastAPI. + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ´ĐžĐ´Đ°Ņ‚Đ¸ вĐģĐ°ŅĐŊиК ĐžĐąŅ€ĐžĐąĐŊиĐē виĐēĐģŅŽŅ‡ĐĩĐŊҌ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ `@app.exception_handler()`: + +{* ../../docs_src/handling_errors/tutorial003.py hl[5:7,13:18,24] *} + +ĐĸŅƒŅ‚, ŅĐēŅ‰Đž Ви СвĐĩŅ€ĐŊĐĩŅ‚ĐĩŅŅ Đ´Đž `/unicorns/yolo`, Ņ‚Đž ĐˇĐŗĐĩĐŊĐĩŅ€ŅƒŅ”Ņ‚ŅŒŅŅ ĐŋĐžĐŧиĐģĐēа `UnicornException`. + +АĐģĐĩ вОĐŊа ĐąŅƒĐ´Đĩ ĐžĐąŅ€ĐžĐąĐģĐĩĐŊа Ņ„ŅƒĐŊĐēŅ†Ņ–Ņ”ŅŽ-ĐžĐąŅ€ĐžĐąĐŊиĐēĐžĐŧ `unicorn_exception_handler`. + +ĐžŅ‚ĐļĐĩ, Ви ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ”Ņ‚Đĩ ĐˇŅ€ĐžĐˇŅƒĐŧŅ–Đģ҃ ĐŋĐžĐŧиĐģĐē҃ ĐˇŅ– HTTP-ŅŅ‚Đ°Ņ‚ŅƒŅĐžĐŧ `418` Ņ– JSON-Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ´ŅŽ: + +```JSON +{"message": "Oops! yolo did something. There goes a rainbow..."} +``` + +/// note | ĐĸĐĩŅ…ĐŊҖ҇ĐŊŅ– Đ´ĐĩŅ‚Đ°ĐģŅ– + +Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `from starlette.requests import Request` Ņ– `from starlette.responses import JSONResponse`. + +**FastAPI** ĐŊĐ°Đ´Đ°Ņ” ҂Җ ŅĐ°ĐŧŅ– `starlette.responses`, Ņ‰Đž Đš `fastapi.responses`, ĐŋŅ€ĐžŅŅ‚Đž Đ´ĐģŅ ĐˇŅ€ŅƒŅ‡ĐŊĐžŅŅ‚Ņ– Ņ€ĐžĐˇŅ€ĐžĐąĐŊиĐēа. АĐģĐĩ ĐąŅ–ĐģŅŒŅˆŅ–ŅŅ‚ŅŒ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐ¸Ņ… Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐĩĐš ĐŊĐ°Đ´Ņ…ĐžĐ´ŅŅ‚ŅŒ ĐąĐĩСĐŋĐžŅĐĩŅ€ĐĩĐ´ĐŊŅŒĐž ĐˇŅ– Starlette. ĐĸĐĩ Đļ ŅĐ°ĐŧĐĩ ŅŅ‚ĐžŅŅƒŅ”Ņ‚ŅŒŅŅ Ņ– `Request`. + +/// + +## ПĐĩŅ€ĐĩвиСĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐžĐąŅ€ĐžĐąĐŊиĐēŅ–Đ˛ ĐŋĐžĐŧиĐģĐžĐē Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ + +**FastAPI** ĐŧĐ°Ņ” ĐēŅ–ĐģҌĐēа ĐžĐąŅ€ĐžĐąĐŊиĐēŅ–Đ˛ ĐŋĐžĐŧиĐģĐžĐē Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ. + +ĐĻŅ– ĐžĐąŅ€ĐžĐąĐŊиĐēи Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°ŅŽŅ‚ŅŒ Са ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊĐ¸Ņ… JSON-Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐĩĐš, ĐēĐžĐģи Ви `ĐŗĐĩĐŊĐĩŅ€ŅƒŅ”Ņ‚Đĩ` (`raise`) `HTTPException`, а Ņ‚Đ°ĐēĐžĐļ ĐēĐžĐģи СаĐŋĐ¸Ņ‚ ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ ĐŊĐĩĐēĐžŅ€ĐĩĐēŅ‚ĐŊŅ– даĐŊŅ–. + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩвиСĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸ ҆Җ ĐžĐąŅ€ĐžĐąĐŊиĐēи, ŅŅ‚Đ˛ĐžŅ€Đ¸Đ˛ŅˆĐ¸ вĐģĐ°ŅĐŊŅ–. + +### ПĐĩŅ€ĐĩвиСĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐŋĐžĐŧиĐģĐžĐē ваĐģŅ–Đ´Đ°Ņ†Ņ–Ņ— СаĐŋĐ¸Ņ‚Ņƒ + +КоĐģи СаĐŋĐ¸Ņ‚ ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ ĐŊĐĩĐēĐžŅ€ĐĩĐēŅ‚ĐŊŅ– даĐŊŅ–, **FastAPI** ĐŗĐĩĐŊĐĩŅ€ŅƒŅ” `RequestValidationError`. + +І Ņ‚Đ°ĐēĐžĐļ вĐēĐģŅŽŅ‡Đ°Ņ” ĐžĐąŅ€ĐžĐąĐŊиĐē ĐŋĐžĐŧиĐģĐžĐē Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ Đ´ĐģŅ ĐŊŅŒĐžĐŗĐž. + +ЊОй ĐŋĐĩŅ€ĐĩвиСĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸ ĐšĐžĐŗĐž, Ņ–ĐŧĐŋĐžŅ€Ņ‚ŅƒĐšŅ‚Đĩ `RequestValidationError` Ņ– виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐšĐžĐŗĐž С `@app.exception_handler(RequestValidationError)` Đ´ĐģŅ Đ´ĐĩĐēĐžŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ ĐžĐąŅ€ĐžĐąĐŊиĐēа ĐŋĐžĐŧиĐģĐžĐē. + +ĐžĐąŅ€ĐžĐąĐŊиĐē ĐŋĐžĐŧиĐģĐžĐē ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ” `Request` Ņ– ŅĐ°Đŧ҃ ĐŋĐžĐŧиĐģĐē҃. + +{* ../../docs_src/handling_errors/tutorial004.py hl[2,14:16] *} + +ĐĸĐĩĐŋĐĩŅ€, ŅĐēŅ‰Đž Ви ĐŋĐĩŅ€ĐĩКдĐĩŅ‚Đĩ Са ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅĐŧ `/items/foo`, СаĐŧŅ–ŅŅ‚ŅŒ Ņ‚ĐžĐŗĐž, Ņ‰ĐžĐą ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊ҃ JSON-ĐŋĐžĐŧиĐģĐē҃: + +```JSON +{ + "detail": [ + { + "loc": [ + "path", + "item_id" + ], + "msg": "value is not a valid integer", + "type": "type_error.integer" + } + ] +} +``` + +Ви ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ”Ņ‚Đĩ Ņ‚ĐĩĐēŅŅ‚ĐžĐ˛Ņƒ вĐĩŅ€ŅŅ–ŅŽ: + +``` +1 validation error +path -> item_id + value is not a valid integer (type=type_error.integer) +``` + +#### `RequestValidationError` ĐŋŅ€ĐžŅ‚Đ¸ `ValidationError` + +/// warning | ĐŖĐ˛Đ°ĐŗĐ° + +ĐĻĐĩ Ņ‚ĐĩŅ…ĐŊҖ҇ĐŊŅ– Đ´ĐĩŅ‚Đ°ĐģŅ–, ŅĐēŅ– Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€ĐžĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸, ŅĐēŅ‰Đž вОĐŊи ĐˇĐ°Ņ€Đ°Đˇ ĐŊĐĩ ваĐļĐģĐ¸Đ˛Ņ– Đ´ĐģŅ Đ’Đ°Ņ. + +/// + +`RequestValidationError` Ņ” ĐŋŅ–Đ´ĐēĐģĐ°ŅĐžĐŧ Pydantic `ValidationError`. + +**FastAPI** виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” ĐšĐžĐŗĐž Đ´ĐģŅ Ņ‚ĐžĐŗĐž, ŅĐēŅ‰Đž Ви виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ ĐŧОдĐĩĐģҌ Pydantic ҃ `response_model` Ņ– ҃ Đ˛Đ°ŅˆĐ¸Ņ… даĐŊĐ¸Ņ… Ņ” ĐŋĐžĐŧиĐģĐēа, Ви ĐŋĐžĐąĐ°Ņ‡Đ¸Đģи ĐŋĐžĐŧиĐģĐē҃ ҃ ŅĐ˛ĐžŅ”Đŧ҃ ĐļŅƒŅ€ĐŊаĐģŅ–. + +АĐģĐĩ ĐēĐģŅ–Ņ”ĐŊŅ‚/ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡ ĐŊĐĩ ĐŋĐžĐąĐ°Ņ‡Đ¸Ņ‚ŅŒ Ņ—Ņ—. ĐĐ°Ņ‚ĐžĐŧŅ–ŅŅ‚ŅŒ ĐēĐģŅ–Ņ”ĐŊŅ‚ ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ” "Internal Server Error" ĐˇŅ– ŅŅ‚Đ°Ņ‚ŅƒŅĐžĐŧ HTTP `500`. + +ĐĸаĐē ĐŧĐ°Ņ” ĐąŅƒŅ‚Đ¸, ŅĐēŅ‰Đž ҃ Đ’Đ°Ņ виĐŊиĐēĐģа `ValidationError` Pydantic ҃ *Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ–* айО Đ´ĐĩŅ–ĐŊĐ´Đĩ ҃ Đ˛Đ°ŅˆĐžĐŧ҃ ĐēĐžĐ´Ņ– (ĐŊĐĩ ҃ *СаĐŋĐ¸Ņ‚Ņ–* ĐēĐģŅ–Ņ”ĐŊŅ‚Đ°), ҆Đĩ ĐŊĐ°ŅĐŋŅ€Đ°Đ˛Đ´Ņ– Ņ” ĐŋĐžĐŧиĐģĐēĐžŅŽ ҃ Đ’Đ°ŅˆĐžĐŧ҃ ĐēĐžĐ´Ņ–. + +І ĐŋĐžĐēи Ви Ņ—Ņ— виĐŋŅ€Đ°Đ˛ĐģŅŅ”Ņ‚Đĩ, ĐēĐģŅ–Ņ”ĐŊŅ‚Đ¸/ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Ņ– ĐŊĐĩ ĐŋОвиĐŊĐŊŅ– ĐŧĐ°Ņ‚Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž вĐŊŅƒŅ‚Ņ€Ņ–ŅˆĐŊŅŒĐžŅ— Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŋŅ€Đž ĐŋĐžĐŧиĐģĐē҃, ĐžŅĐēŅ–ĐģҌĐēи ҆Đĩ ĐŧĐžĐļĐĩ ĐŋŅ€Đ¸ĐˇĐ˛ĐĩŅŅ‚Đ¸ Đ´Đž Đ˛Ņ€Đ°ĐˇĐģĐ¸Đ˛ĐžŅŅ‚Ņ– ĐąĐĩСĐŋĐĩĐēи. + +### ПĐĩŅ€ĐĩвиСĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐžĐąŅ€ĐžĐąĐŊиĐēа ĐŋĐžĐŧиĐģĐžĐē `HTTPException` + +АĐŊаĐģĐžĐŗŅ–Ņ‡ĐŊĐž, Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩвиСĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸ ĐžĐąŅ€ĐžĐąĐŊиĐē `HTTPException`. + +НаĐŋŅ€Đ¸ĐēĐģад, Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇĐ°Ņ…ĐžŅ‚Ņ–Ņ‚Đ¸ ĐŋОвĐĩŅ€ĐŊŅƒŅ‚Đ¸ Ņ‚ĐĩĐēŅŅ‚ĐžĐ˛Ņƒ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ СаĐŧŅ–ŅŅ‚ŅŒ JSON Đ´ĐģŅ Ņ†Đ¸Ņ… ĐŋĐžĐŧиĐģĐžĐē: + +{* ../../docs_src/handling_errors/tutorial004.py hl[3:4,9:11,22] *} + +/// note | ĐĸĐĩŅ…ĐŊҖ҇ĐŊŅ– Đ´ĐĩŅ‚Đ°ĐģŅ– + +Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `from starlette.responses import PlainTextResponse`. + +**FastAPI** ĐŊĐ°Đ´Đ°Ņ” ҂Җ ŅĐ°ĐŧŅ– `starlette.responses`, Ņ‰Đž Đš `fastapi.responses`, ĐŋŅ€ĐžŅŅ‚Đž Đ´ĐģŅ ĐˇŅ€ŅƒŅ‡ĐŊĐžŅŅ‚Ņ– Ņ€ĐžĐˇŅ€ĐžĐąĐŊиĐēа. АĐģĐĩ ĐąŅ–ĐģŅŒŅˆŅ–ŅŅ‚ŅŒ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐ¸Ņ… Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐĩĐš ĐŊĐ°Đ´Ņ…ĐžĐ´ŅŅ‚ŅŒ ĐąĐĩСĐŋĐžŅĐĩŅ€ĐĩĐ´ĐŊŅŒĐž ĐˇŅ– Starlette. + +/// + +### ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ ҂ҖĐģа `RequestValidationError` + +`RequestValidationError` ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ `body`, ŅĐēиК Đ˛Ņ–ĐŊ ĐžŅ‚Ņ€Đ¸Đŧав Ņ–Đˇ ĐŊĐĩĐēĐžŅ€ĐĩĐēŅ‚ĐŊиĐŧи даĐŊиĐŧи. + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ҆Đĩ ĐŋŅ–Đ´ Ņ‡Đ°Ņ Ņ€ĐžĐˇŅ€ĐžĐąĐēи ŅĐ˛ĐžĐŗĐž Đ´ĐžĐ´Đ°Ņ‚Đēа, Ņ‰ĐžĐą ĐģĐžĐŗŅƒĐ˛Đ°Ņ‚Đ¸ ҂ҖĐģĐž СаĐŋĐ¸Ņ‚Ņƒ Ņ‚Đ° ĐŊаĐģĐ°ĐŗĐžĐ´ĐļŅƒĐ˛Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž, ĐŋОвĐĩŅ€Ņ‚Đ°Ņ‚Đ¸ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡ĐĩĐ˛Ņ– Ņ‚ĐžŅ‰Đž. + +{* ../../docs_src/handling_errors/tutorial005.py hl[14] *} + +ĐĸĐĩĐŋĐĩŅ€ ҁĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ ĐŊĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸ ĐŊĐĩĐēĐžŅ€ĐĩĐēŅ‚ĐŊиК ĐĩĐģĐĩĐŧĐĩĐŊŅ‚, ĐŊаĐŋŅ€Đ¸ĐēĐģад: + +```JSON +{ + "title": "towel", + "size": "XL" +} +``` +Ви ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ”Ņ‚Đĩ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ, ŅĐēа ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐ¸Ņ‚ŅŒ ВаĐŧ, ŅĐēŅ– ŅĐ°ĐŧĐĩ даĐŊŅ– Ņ” ĐŊĐĩĐēĐžŅ€ĐĩĐēŅ‚ĐŊŅ– ҃ Đ˛Đ°ŅˆĐžĐŧ҃ ҂ҖĐģŅ– СаĐŋĐ¸Ņ‚Ņƒ: + + +```JSON hl_lines="12-15" +{ + "detail": [ + { + "loc": [ + "body", + "size" + ], + "msg": "value is not a valid integer", + "type": "type_error.integer" + } + ], + "body": { + "title": "towel", + "size": "XL" + } +} +``` + +#### `HTTPException` FastAPI ĐŋŅ€ĐžŅ‚Đ¸ `HTTPException` Starlette + +**FastAPI** ĐŧĐ°Ņ” вĐģĐ°ŅĐŊиК `HTTPException`. + +І ĐēĐģĐ°Ņ ĐŋĐžĐŧиĐģĐēи `HTTPException` в **FastAPI** ҃ҁĐŋадĐēĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ˛Ņ–Đ´ ĐēĐģĐ°ŅŅƒ ĐŋĐžĐŧиĐģĐēи `HTTPException` в Starlette. + +ЄдиĐŊа Ņ€Ņ–ĐˇĐŊĐ¸Ņ†Ņ ĐŋĐžĐģŅĐŗĐ°Ņ” в Ņ‚ĐžĐŧ҃, Ņ‰Đž `HTTPException` в **FastAPI** ĐŋŅ€Đ¸ĐšĐŧĐ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēŅ– даĐŊŅ–, ŅĐēŅ– ĐŧĐžĐļĐŊа ĐŋĐĩŅ€ĐĩŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ ĐŊа JSON, Đ´ĐģŅ ĐŋĐžĐģŅ `detail`, Ņ‚ĐžĐ´Ņ– ŅĐē `HTTPException` ҃ Starlette ĐŋŅ€Đ¸ĐšĐŧĐ°Ņ” ҂ҖĐģҌĐēи Ņ€ŅĐ´Đēи. + +ĐžŅ‚ĐļĐĩ, Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļŅƒĐ˛Đ°Ņ‚Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `HTTPException` в **FastAPI** ŅĐē ĐˇĐ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš ҃ ŅĐ˛ĐžŅ”Đŧ҃ ĐēĐžĐ´Ņ–. + +АĐģĐĩ ĐēĐžĐģи Ви Ņ€ĐĩŅ”ŅŅ‚Ņ€ŅƒŅ”Ņ‚Đĩ ĐžĐąŅ€ĐžĐąĐŊиĐē виĐēĐģŅŽŅ‡ĐĩĐŊҌ, ҁĐģŅ–Đ´ Ņ€ĐĩŅ”ŅŅ‚Ņ€ŅƒĐ˛Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž Đ´ĐģŅ `HTTPException` ĐˇŅ– Starlette. + +ĐĸаĐēиĐŧ Ņ‡Đ¸ĐŊĐžĐŧ, ŅĐēŅ‰Đž ĐąŅƒĐ´ŅŒ-ŅĐēа Ņ‡Đ°ŅŅ‚Đ¸ĐŊа вĐŊŅƒŅ‚Ņ€Ņ–ŅˆĐŊŅŒĐžĐŗĐž ĐēĐžĐ´Ņƒ Starlette айО Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ Ņ‡Đ¸ ĐŋĐģĐ°ĐŗŅ–ĐŊ Starlette ĐˇĐŗĐĩĐŊĐĩŅ€ŅƒŅ” (raise) `HTTPException`, Đ’Đ°Ņˆ ĐžĐąŅ€ĐžĐąĐŊиĐē СĐŧĐžĐļĐĩ ĐŋĐĩŅ€ĐĩŅ…ĐžĐŋĐ¸Ņ‚Đ¸ Ņ‚Đ° ĐžĐąŅ€ĐžĐąĐ¸Ņ‚Đ¸ Ņ—Ņ—. + +ĐŖ Ņ†ŅŒĐžĐŧ҃ ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņ–, Ņ‰ĐžĐą ĐŧĐ°Ņ‚Đ¸ ĐŧĐžĐļĐģĐ¸Đ˛Ņ–ŅŅ‚ŅŒ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ойидва `HTTPException` в ОдĐŊĐžĐŧ҃ ĐēĐžĐ´Ņ–, ĐŋĐžĐŧиĐģĐēа Starlette ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ ĐŊа `StarletteHTTPException`: + +```Python +from starlette.exceptions import HTTPException as StarletteHTTPException +``` + +### ĐŸĐžĐ˛Ņ‚ĐžŅ€ĐŊĐĩ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ ĐžĐąŅ€ĐžĐąĐŊиĐēŅ–Đ˛ ĐŋĐžĐŧиĐģĐžĐē **FastAPI** + +Đ¯ĐēŅ‰Đž Ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐžĐŧиĐģĐēи Ņ€Đ°ĐˇĐžĐŧ Ņ–Đˇ Ņ‚Đ°ĐēиĐŧи Đļ ĐžĐąŅ€ĐžĐąĐŊиĐēаĐŧи ĐŋĐžĐŧиĐģĐžĐē Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ, ŅĐē ҃ **FastAPI**, Ви ĐŧĐžĐļĐĩŅ‚Đĩ Ņ–ĐŧĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ‚Đ° ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ—Ņ… Ņ–Đˇ `fastapi.exception_handlers`: + +{* ../../docs_src/handling_errors/tutorial006.py hl[2:5,15,21] *} + +ĐŖ Ņ†ŅŒĐžĐŧ҃ ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņ– Ви ĐŋŅ€ĐžŅŅ‚Đž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ `print` Đ´ĐģŅ вивĐĩĐ´ĐĩĐŊĐŊŅ Đ´ŅƒĐļĐĩ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ‚Đ¸Đ˛ĐŊĐžĐŗĐž ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģĐĩĐŊĐŊŅ, аĐģĐĩ Ви ĐˇŅ€ĐžĐˇŅƒĐŧŅ–Đģи ĐžŅĐŊОвĐŊ҃ Ņ–Đ´ĐĩŅŽ. Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐžĐąŅ€ĐžĐąĐ¸Ņ‚Đ¸ ĐŋĐžĐŧиĐģĐē҃ Ņ‚Đ° ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐžĐąŅ€ĐžĐąĐŊиĐēи ĐŋĐžĐŧиĐģĐžĐē Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ. diff --git a/docs/uk/docs/tutorial/header-param-models.md b/docs/uk/docs/tutorial/header-param-models.md new file mode 100644 index 000000000..6f7b0bdae --- /dev/null +++ b/docs/uk/docs/tutorial/header-param-models.md @@ -0,0 +1,58 @@ +# МодĐĩĐģŅ– ĐŸĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛ Đ—Đ°ĐŗĐžĐģОвĐēŅ–Đ˛ + +Đ¯ĐēŅ‰Đž ҃ Đ’Đ°Ņ Ņ” ĐŗŅ€ŅƒĐŋа ĐŋĐžĐ˛â€™ŅĐˇĐ°ĐŊĐ¸Ņ… ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛ ĐˇĐ°ĐŗĐžĐģОвĐēŅ–Đ˛, Ви ĐŧĐžĐļĐĩŅ‚Đĩ ŅŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ **Pydantic ĐŧОдĐĩĐģҌ** Đ´ĐģŅ Ņ—Ņ… ĐžĐŗĐžĐģĐžŅˆĐĩĐŊĐŊŅ. + +ĐĻĐĩ дОСвОĐģĐ¸Ņ‚ŅŒ ВаĐŧ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž **виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŧОдĐĩĐģҌ** в **Ņ€Ņ–ĐˇĐŊĐ¸Ņ… ĐŧŅ–ŅŅ†ŅŅ…**, а Ņ‚Đ°ĐēĐžĐļ ĐžĐŗĐžĐģĐžŅĐ¸Ņ‚Đ¸ ваĐģŅ–Đ´Đ°Ņ†Ņ–Ņ— Ņ‚Đ° ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊŅ– Đ´ĐģŅ Đ˛ŅŅ–Ņ… ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛ ОдĐŊĐžŅ‡Đ°ŅĐŊĐž. 😎 + +/// note | ĐĐžŅ‚Đ°Ņ‚Đēи + +ĐĻŅ ĐŧĐžĐļĐģĐ¸Đ˛Ņ–ŅŅ‚ŅŒ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚ŅŒŅŅ ĐŋĐžŅ‡Đ¸ĐŊĐ°ŅŽŅ‡Đ¸ С вĐĩҀҁҖҗ FastAPI `0.115.0`. 🤓 + +/// + +## ĐŸĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ Đ—Đ°ĐŗĐžĐģОвĐēŅ–Đ˛ С ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅĐŧ Pydantic Model + +ĐžĐŗĐžĐģĐžŅŅ–Ņ‚ŅŒ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊŅ– **ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ ĐˇĐ°ĐŗĐžĐģОвĐēŅ–Đ˛** ҃ **Pydantic ĐŧОдĐĩĐģŅ–**, а ĐŋĐžŅ‚Ņ–Đŧ ĐžĐŗĐžĐģĐžŅŅ–Ņ‚ŅŒ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ŅĐē `Header`: + +{* ../../docs_src/header_param_models/tutorial001_an_py310.py hl[9:14,18] *} + +FastAPI ĐąŅƒĐ´Đĩ Đ˛Đ¸Ņ‚ŅĐŗŅƒĐ˛Đ°Ņ‚Đ¸ даĐŊŅ– Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž ĐŋĐžĐģŅ С ĐˇĐ°ĐŗĐžĐģОвĐēŅ–Đ˛ ҃ СаĐŋĐ¸Ņ‚Ņ– Ņ‚Đ° ĐŋĐĩŅ€ĐĩĐ´Đ°Đ˛Đ°Ņ‚Đ¸ Ņ—Ņ… ҃ ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊ҃ ВаĐŧи Pydantic ĐŧОдĐĩĐģҌ. + +**FastAPI** ĐąŅƒĐ´Đĩ **Đ˛Đ¸Ņ‚ŅĐŗŅƒĐ˛Đ°Ņ‚Đ¸** даĐŊŅ– Đ´ĐģŅ **ĐēĐžĐļĐŊĐžĐŗĐž ĐŋĐžĐģŅ** С **ĐˇĐ°ĐŗĐžĐģОвĐēŅ–Đ˛** ҃ СаĐŋĐ¸Ņ‚Ņ– Ņ‚Đ° ĐŋĐĩŅ€ĐĩĐ´Đ°Đ˛Đ°Ņ‚Đ¸ Ņ—Ņ… ҃ ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊ҃ ВаĐŧи Pydantic ĐŧОдĐĩĐģҌ. + +## ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēа в ДоĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐąĐ°Ņ‡Đ¸Ņ‚Đ¸ ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊŅ– ĐˇĐ°ĐŗĐžĐģОвĐēи в Ņ–ĐŊŅ‚ĐĩҀ҄ĐĩĐšŅŅ– Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— Са Đ°Đ´Ņ€ĐĩŅĐžŅŽ `/docs`: + +
+ +
+ +## Đ—Đ°ĐąĐžŅ€ĐžĐŊа Đ”ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Đ¸Ņ… Đ—Đ°ĐŗĐžĐģОвĐēŅ–Đ˛ + +ĐŖ Đ´ĐĩŅĐēĐ¸Ņ… ĐžŅĐžĐąĐģĐ¸Đ˛Đ¸Ņ… виĐŋадĐēĐ°Ņ… (ĐšĐŧĐžĐ˛Ņ–Ņ€ĐŊĐž, ĐŊĐĩ Đ´ŅƒĐļĐĩ ĐŋĐžŅˆĐ¸Ņ€ĐĩĐŊĐ¸Ņ…) Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇĐ°Ņ…ĐžŅ‚Ņ–Ņ‚Đ¸ **ОйĐŧĐĩĐļĐ¸Ņ‚Đ¸** ĐˇĐ°ĐŗĐžĐģОвĐēи, ŅĐēŅ– Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸. + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ŅŽ ĐŧОдĐĩĐģŅ– Pydantic, Ņ‰ĐžĐą `ĐˇĐ°ĐąĐžŅ€ĐžĐŊĐ¸Ņ‚Đ¸` ĐąŅƒĐ´ŅŒ-ŅĐēŅ– `Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ–` ĐŋĐžĐģŅ: + +{* ../../docs_src/header_param_models/tutorial002_an_py310.py hl[10] *} + +Đ¯ĐēŅ‰Đž ĐēĐģŅ–Ņ”ĐŊŅ‚ ҁĐŋŅ€ĐžĐąŅƒŅ” ĐŊĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸ **Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– ĐˇĐ°ĐŗĐžĐģОвĐēи**, Đ˛Ņ–ĐŊ ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ” **ĐŋĐžĐŧиĐģĐē҃** ҃ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ–. + +НаĐŋŅ€Đ¸ĐēĐģад, ŅĐēŅ‰Đž ĐēĐģŅ–Ņ”ĐŊŅ‚ ҁĐŋŅ€ĐžĐąŅƒŅ” ĐŊĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸ ĐˇĐ°ĐŗĐžĐģОвОĐē `tool` ĐˇŅ– СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧ `plumbus`, Đ˛Ņ–ĐŊ ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ” **ĐŋĐžĐŧиĐģĐē҃** С ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģĐĩĐŊĐŊŅĐŧ ĐŋŅ€Đž Ņ‚Đĩ, Ņ‰Đž ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ĐˇĐ°ĐŗĐžĐģОвĐēа `tool` ĐŊĐĩ дОСвОĐģĐĩĐŊиК: + +```json +{ + "detail": [ + { + "type": "extra_forbidden", + "loc": ["header", "tool"], + "msg": "Extra inputs are not permitted", + "input": "plumbus", + } + ] +} +``` + +## ĐŸŅ–Đ´ŅŅƒĐŧĐžĐē + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ **Pydantic ĐŧОдĐĩĐģŅ–** Đ´ĐģŅ ĐžĐŗĐžĐģĐžŅˆĐĩĐŊĐŊŅ **ĐˇĐ°ĐŗĐžĐģОвĐēŅ–Đ˛** ҃ **FastAPI**. 😎 diff --git a/docs/uk/docs/tutorial/metadata.md b/docs/uk/docs/tutorial/metadata.md new file mode 100644 index 000000000..64e667ec6 --- /dev/null +++ b/docs/uk/docs/tutorial/metadata.md @@ -0,0 +1,120 @@ +# МĐĩŅ‚Đ°Đ´Đ°ĐŊŅ– Ņ‚Đ° URL-Đ°Đ´Ņ€ĐĩŅĐ¸ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēŅ–ĐģҌĐēа ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Đš ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐ¸Ņ… ҃ Đ’Đ°ŅˆĐžĐŧ҃ Đ´ĐžĐ´Đ°Ņ‚Đē҃ **FastAPI**. + +## МĐĩŅ‚Đ°Đ´Đ°ĐŊŅ– Đ´ĐģŅ API + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ Ņ‚Đ°ĐēŅ– ĐŋĐžĐģŅ, ŅĐēŅ– виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ в ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— OpenAPI Ņ‚Đ° в Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐˇĐŗĐĩĐŊĐĩŅ€ĐžĐ˛Đ°ĐŊĐ¸Ņ… Ņ–ĐŊŅ‚ĐĩҀ҄ĐĩĐšŅĐ°Ņ… Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— API: + +| ĐŸĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ | ĐĸиĐŋ | ОĐŋĐ¸Ņ | +|------------|------|-------------| +| `title` | `str` | Назва API. | +| `summary` | `str` | ĐšĐžŅ€ĐžŅ‚ĐēиК ĐžĐŋĐ¸Ņ API. Đ”ĐžŅŅ‚ŅƒĐŋĐŊĐž С OpenAPI 3.1.0, FastAPI 0.99.0. | +| `description` | `str` | Đ‘Ņ–ĐģҌ҈ Đ´ĐĩŅ‚Đ°ĐģҌĐŊиК ĐžĐŋĐ¸Ņ API. МоĐļĐĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Markdown. | +| `version` | `string` | ВĐĩŅ€ŅŅ–Ņ API. ĐĻĐĩ вĐĩŅ€ŅŅ–Ņ Đ’Đ°ŅˆĐžĐŗĐž Đ´ĐžĐ´Đ°Ņ‚Đēа, а ĐŊĐĩ OpenAPI. НаĐŋŅ€Đ¸ĐēĐģад, `2.5.0`. | +| `terms_of_service` | `str` | URL Đ´Đž ҃ĐŧОв виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ API. Đ¯ĐēŅ‰Đž вĐēаСаĐŊĐž, ĐŧĐ°Ņ” ĐąŅƒŅ‚Đ¸ ҃ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņ– URL. | +| `contact` | `dict` | ІĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ Đ´ĐģŅ ĐēĐžĐŊŅ‚Đ°ĐēŅ‚Ņƒ С API. МоĐļĐĩ ĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸ ĐēŅ–ĐģҌĐēа ĐŋĐžĐģŅ–Đ˛.
contact ĐŋĐžĐģŅ
ĐŸĐ°Ņ€Đ°ĐŧĐĩ҂ҀĐĸиĐŋОĐŋĐ¸Ņ
namestrІĐŧ'Ņ ĐēĐžĐŊŅ‚Đ°ĐēŅ‚ĐŊĐžŅ— ĐžŅĐžĐąĐ¸ айО ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—.
urlstrURL С Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ”ŅŽ Đ´ĐģŅ ĐēĐžĐŊŅ‚Đ°ĐēŅ‚Ņƒ. ПовиĐŊĐĩĐŊ ĐąŅƒŅ‚Đ¸ ҃ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņ– URL.
emailstrEmail ĐēĐžĐŊŅ‚Đ°ĐēŅ‚ĐŊĐžŅ— ĐžŅĐžĐąĐ¸ айО ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—. ПовиĐŊĐĩĐŊ ĐąŅƒŅ‚Đ¸ ҃ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņ– ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊĐžŅ— ĐŋĐžŅˆŅ‚Đ¸.
| +| `license_info` | `dict` | ІĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ ĐŋŅ€Đž ĐģҖ҆ĐĩĐŊĐˇŅ–ŅŽ Đ´ĐģŅ API. МоĐļĐĩ ĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸ ĐēŅ–ĐģҌĐēа ĐŋĐžĐģŅ–Đ˛.
license_info ĐŋĐžĐģŅ
ĐŸĐ°Ņ€Đ°ĐŧĐĩ҂ҀĐĸиĐŋОĐŋĐ¸Ņ
namestrОБОВ'Đ¯Đ—ĐšĐžĐ’Đž (ŅĐēŅ‰Đž Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž license_info). Назва ĐģҖ҆ĐĩĐŊĐˇŅ–Ņ— Đ´ĐģŅ API.
identifierstrĐ›Ņ–Ņ†ĐĩĐŊĐˇŅ–ĐšĐŊиК Đ˛Đ¸Ņ€Đ°Đˇ Са SPDX Đ´ĐģŅ API. ПоĐģĐĩ identifier Đ˛ĐˇĐ°Ņ”ĐŧОвиĐēĐģŅŽŅ‡ĐŊĐĩ С ĐŋĐžĐģĐĩĐŧ url. Đ”ĐžŅŅ‚ŅƒĐŋĐŊĐž С OpenAPI 3.1.0, FastAPI 0.99.0.
urlstrURL Đ´Đž ĐģҖ҆ĐĩĐŊĐˇŅ–Ņ—, ŅĐēа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ API. ПовиĐŊĐĩĐŊ ĐąŅƒŅ‚Đ¸ ҃ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņ– URL.
| + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ—Ņ… ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊиĐŧ Ņ‡Đ¸ĐŊĐžĐŧ: + +{* ../../docs_src/metadata/tutorial001.py hl[3:16, 19:32] *} + +/// tip | ĐŸŅ–Đ´ĐēаСĐēа + +ĐŖ ĐŋĐžĐģŅ– `description` ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Markdown, Ņ– Đ˛Ņ–ĐŊ ĐąŅƒĐ´Đĩ Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°Ņ‚Đ¸ŅŅ ҃ Ņ€ĐĩĐˇŅƒĐģŅŒŅ‚Đ°Ņ‚Ņ–. + +/// + +З Ņ†Ņ–Ņ”ŅŽ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ”ŅŽ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊа Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ API Đ˛Đ¸ĐŗĐģŅĐ´Đ°Ņ‚Đ¸ĐŧĐĩ Ņ‚Đ°Đē: + + + +## ІдĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚ĐžŅ€ ĐģҖ҆ĐĩĐŊĐˇŅ–Ņ— + +З ĐŋĐžŅ‡Đ°Ņ‚Đē҃ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ OpenAPI 3.1.0 Ņ‚Đ° FastAPI 0.99.0 Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ `license_info` Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ `identifier` СаĐŧŅ–ŅŅ‚ŅŒ `url`. + +НаĐŋŅ€Đ¸ĐēĐģад: + +{* ../../docs_src/metadata/tutorial001_1.py hl[31] *} + +## МĐĩŅ‚Đ°Đ´Đ°ĐŊŅ– Đ´ĐģŅ Ņ‚ĐĩĐŗŅ–Đ˛ + +Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ Đ´ĐžĐ´Đ°Ņ‚Đ¸ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊŅ– Đ´ĐģŅ Ņ€Ņ–ĐˇĐŊĐ¸Ņ… Ņ‚ĐĩĐŗŅ–Đ˛, ŅĐēŅ– виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ Đ´ĐģŅ ĐŗŅ€ŅƒĐŋŅƒĐ˛Đ°ĐŊĐŊŅ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Đš ҈ĐģŅŅ…Ņ–Đ˛, Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° `openapi_tags`. + +Đ’Ņ–ĐŊ ĐŋŅ€Đ¸ĐšĐŧĐ°Ņ” ҁĐŋĐ¸ŅĐžĐē, ŅĐēиК ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ ОдиĐŊ ҁĐģОвĐŊиĐē Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž Ņ‚ĐĩĐŗĐ°. + +КоĐļĐĩĐŊ ҁĐģОвĐŊиĐē ĐŧĐžĐļĐĩ ĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸: + +* `name` (**ОйОв'ŅĐˇĐēОвО**): `str` С Ņ‚Ņ–Ņ”ŅŽ Đļ ĐŊĐ°ĐˇĐ˛ĐžŅŽ Ņ‚ĐĩĐŗŅƒ, ŅĐē҃ Ви виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ ҃ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂ҀҖ `tags` ҃ Đ’Đ°ŅˆĐ¸Ņ… *ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅŅ… ҈ĐģŅŅ…Ņƒ* Ņ‚Đ° `APIRouter`s. +* `description`: `str` С ĐēĐžŅ€ĐžŅ‚ĐēиĐŧ ĐžĐŋĐ¸ŅĐžĐŧ Ņ‚ĐĩĐŗŅƒ. МоĐļĐĩ ĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸ Markdown Ņ– ĐąŅƒĐ´Đĩ Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐĩĐŊĐž в Ņ–ĐŊŅ‚ĐĩҀ҄ĐĩĐšŅŅ– Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ—. +* `externalDocs`: `dict` ŅĐēиК ĐžĐŋĐ¸ŅŅƒŅ” СОвĐŊŅ–ŅˆĐŊŅŽ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–ŅŽ С Ņ‚Đ°ĐēиĐŧи ĐŋĐžĐģŅĐŧи: + * `description`: `str` С ĐēĐžŅ€ĐžŅ‚ĐēиĐŧ ĐžĐŋĐ¸ŅĐžĐŧ СОвĐŊŅ–ŅˆĐŊŅŒĐžŅ— Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ—. + * `url` (**ОйОв'ŅĐˇĐēОвО**): `str`С URL-Đ°Đ´Ņ€ĐĩŅĐžŅŽ СОвĐŊŅ–ŅˆĐŊŅŒĐžŅ— Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ—. + +### ĐĄŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐ¸Ņ… Đ´ĐģŅ Ņ‚ĐĩĐŗŅ–Đ˛ + +ĐĄĐŋŅ€ĐžĐąŅƒĐšĐŧĐž ҆Đĩ ĐŊа ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņ– С Ņ‚ĐĩĐŗĐ°Đŧи Đ´ĐģŅ `users` Ņ‚Đ° `items`. + +ĐĄŅ‚Đ˛ĐžŅ€Ņ–Ņ‚ŅŒ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊŅ– Đ´ĐģŅ ŅĐ˛ĐžŅ—Ņ… Ņ‚ĐĩĐŗŅ–Đ˛ Ņ– ĐŋĐĩŅ€ĐĩĐ´Đ°ĐšŅ‚Đĩ Ņ—Ņ… ҃ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `openapi_tags`: + +{* ../../docs_src/metadata/tutorial004.py hl[3:16,18] *} + +ЗвĐĩŅ€ĐŊŅ–Ņ‚ŅŒ ŅƒĐ˛Đ°ĐŗŅƒ, Ņ‰Đž в ĐžĐŋĐ¸ŅĐ°Ņ… ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Markdown, ĐŊаĐŋŅ€Đ¸ĐēĐģад, "login" ĐąŅƒĐ´Đĩ ĐŋĐžĐēаСаĐŊĐž ĐļĐ¸Ņ€ĐŊиĐŧ ŅˆŅ€Đ¸Ņ„Ņ‚ĐžĐŧ (**login**), а "fancy" ĐąŅƒĐ´Đĩ ĐŋĐžĐēаСаĐŊĐž ĐēŅƒŅ€ŅĐ¸Đ˛ĐžĐŧ (_fancy_). + +/// tip | ĐŸĐžŅ€Đ°Đ´Đ° + +НĐĩ ОйОв'ŅĐˇĐēОвО Đ´ĐžĐ´Đ°Đ˛Đ°Ņ‚Đ¸ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊŅ– Đ´ĐģŅ Đ˛ŅŅ–Ņ… Ņ‚ĐĩĐŗŅ–Đ˛, ŅĐēŅ– Ви виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ. + +/// + +### ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ Ņ‚ĐĩĐŗŅ–Đ˛ + +ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `tags` ĐˇŅ– ŅĐ˛ĐžŅ—Đŧи *ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅĐŧи ҈ĐģŅŅ…Ņƒ* (Ņ– `APIRouter`) Đ´ĐģŅ ĐŋŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Ņ—Ņ… Đ´Đž Ņ€Ņ–ĐˇĐŊĐ¸Ņ… Ņ‚ĐĩĐŗŅ–Đ˛: + +{* ../../docs_src/metadata/tutorial004.py hl[21,26] *} + +/// info | ІĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ + +ДĐĩŅ‚Đ°ĐģҌĐŊŅ–ŅˆĐĩ ĐŋŅ€Đž Ņ‚ĐĩĐŗĐ¸ Ņ‡Đ¸Ņ‚Đ°ĐšŅ‚Đĩ в Ņ€ĐžĐˇĐ´Ņ–ĐģŅ– [КоĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ ҈ĐģŅŅ…Ņ–Đ˛ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Đš](path-operation-configuration.md#tags){.internal-link target=_blank}. + +/// + +### ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēа Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— + +Đ¯ĐēŅ‰Đž Ви ĐˇĐ°Ņ€Đ°Đˇ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đ¸Ņ‚Đĩ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–ŅŽ, вОĐŊа ĐŋĐžĐēаĐļĐĩ Đ˛ŅŅ– Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊŅ–: + + + +### ĐŸĐžŅ€ŅĐ´ĐžĐē Ņ‚ĐĩĐŗŅ–Đ˛ + +ĐŸĐžŅ€ŅĐ´ĐžĐē ĐēĐžĐļĐŊĐžĐŗĐž ҁĐģОвĐŊиĐēа ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐ¸Ņ… Ņ‚ĐĩĐŗŅƒ Ņ‚Đ°ĐēĐžĐļ виСĐŊĐ°Ņ‡Đ°Ņ” ĐŋĐžŅ€ŅĐ´ĐžĐē Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ в Ņ–ĐŊŅ‚ĐĩҀ҄ĐĩĐšŅŅ– Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ—. + +НаĐŋŅ€Đ¸ĐēĐģад, Ņ…ĐžŅ‡Đ° `users` Đŧав йи ĐšŅ‚Đ¸ ĐŋҖҁĐģŅ `items` в аĐģŅ„Đ°Đ˛Ņ–Ņ‚ĐŊĐžĐŧ҃ ĐŋĐžŅ€ŅĐ´Đē҃, Đ˛Ņ–ĐŊ Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°Ņ”Ņ‚ŅŒŅŅ ĐŋĐĩŅ€ĐĩĐ´ ĐŊиĐŧи, ĐžŅĐēŅ–ĐģҌĐēи Đŧи дОдаĐģи ĐšĐžĐŗĐž ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊŅ– ŅĐē ĐŋĐĩŅ€ŅˆĐ¸Đš ҁĐģОвĐŊиĐē ҃ ҁĐŋĐ¸ŅĐē҃. + +## URL Đ´ĐģŅ OpenAPI + +За СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ҁ҅ĐĩĐŧа OpenAPI ĐŊĐ°Đ´Đ°Ņ”Ņ‚ŅŒŅŅ Са Đ°Đ´Ņ€ĐĩŅĐžŅŽ `/openapi.json`. + +АĐģĐĩ Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ҆Đĩ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° `openapi_url`. + +НаĐŋŅ€Đ¸ĐēĐģад, Ņ‰ĐžĐą ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž ĐŊа `/api/v1/openapi.json`: + +{* ../../docs_src/metadata/tutorial002.py hl[3] *} + +Đ¯ĐēŅ‰Đž Ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐŋОвĐŊŅ–ŅŅ‚ŅŽ виĐŧĐēĐŊŅƒŅ‚Đ¸ ҁ҅ĐĩĐŧ҃ OpenAPI, Ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ `openapi_url=None`, ҆Đĩ Ņ‚Đ°ĐēĐžĐļ виĐŧĐēĐŊĐĩ Ņ–ĐŊŅ‚ĐĩҀ҄ĐĩĐšŅĐ¸ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ—, ŅĐēŅ– Ņ—Ņ— виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒ. + +## URL-Đ°Đ´Ņ€ĐĩŅĐ¸ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ два Ņ–ĐŊŅ‚ĐĩҀ҄ĐĩĐšŅĐ¸ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ° Đ´ĐģŅ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ—, ŅĐēŅ– вĐēĐģŅŽŅ‡ĐĩĐŊŅ–: + +* **Swagger UI**: Đ´ĐžŅŅ‚ŅƒĐŋĐŊиК Са Đ°Đ´Ņ€ĐĩŅĐžŅŽ `/docs`. + * Ви ĐŧĐžĐļĐĩŅ‚Đĩ СĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ĐšĐžĐŗĐž URL Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° `docs_url`. + * Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐŧĐēĐŊŅƒŅ‚Đ¸ ĐšĐžĐŗĐž, Đ˛ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Đ˛ŅˆĐ¸ `docs_url=None`. +* **ReDoc**: Đ´ĐžŅŅ‚ŅƒĐŋĐŊиК Са Đ°Đ´Ņ€ĐĩŅĐžŅŽ `/redoc`. + * Ви ĐŧĐžĐļĐĩŅ‚Đĩ СĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ĐšĐžĐŗĐž URL Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° `redoc_url`. + * Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐŧĐēĐŊŅƒŅ‚Đ¸ ĐšĐžĐŗĐž, Đ˛ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Đ˛ŅˆĐ¸ `redoc_url=None`. + +НаĐŋŅ€Đ¸ĐēĐģад, Ņ‰ĐžĐą ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ Swagger UI ĐŊа `/documentation` Ņ– виĐŧĐēĐŊŅƒŅ‚Đ¸ ReDoc: + +{* ../../docs_src/metadata/tutorial003.py hl[3] *} diff --git a/docs/uk/docs/tutorial/middleware.md b/docs/uk/docs/tutorial/middleware.md new file mode 100644 index 000000000..807be484a --- /dev/null +++ b/docs/uk/docs/tutorial/middleware.md @@ -0,0 +1,75 @@ +# Middleware (ĐŸŅ€ĐžĐŧŅ–ĐļĐŊиК ŅˆĐ°Ņ€) + +ĐŖ **FastAPI** ĐŧĐžĐļĐŊа Đ´ĐžĐ´Đ°Đ˛Đ°Ņ‚Đ¸ middleware (ĐŋŅ€ĐžĐŧŅ–ĐļĐŊиК ŅˆĐ°Ņ€). + +"Middleware" — ҆Đĩ Ņ„ŅƒĐŊĐēŅ†Ņ–Ņ, ŅĐēа ĐŋŅ€Đ°Ņ†ŅŽŅ” С ĐēĐžĐļĐŊиĐŧ **СаĐŋĐ¸Ņ‚ĐžĐŧ** ĐŋĐĩŅ€ĐĩĐ´ ĐšĐžĐŗĐž ĐžĐąŅ€ĐžĐąĐēĐžŅŽ ĐąŅƒĐ´ŅŒ-ŅĐēĐžŅŽ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊĐžŅŽ *ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ”ŅŽ ҈ĐģŅŅ…Ņƒ* (*path operation*), а Ņ‚Đ°ĐēĐžĐļ С ĐēĐžĐļĐŊĐžŅŽ **Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ´ŅŽ** ĐŋĐĩŅ€ĐĩĐ´ Ņ—Ņ— ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅĐŧ. + +* Middleware ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ” ĐēĐžĐļĐĩĐŊ **СаĐŋĐ¸Ņ‚**, Ņ‰Đž ĐŊĐ°Đ´Ņ…ĐžĐ´Đ¸Ņ‚ŅŒ Đ´Đž Đ’Đ°ŅˆĐžĐŗĐž ĐˇĐ°ŅŅ‚ĐžŅŅƒĐŊĐē҃. +* МоĐļĐĩ виĐēĐžĐŊĐ°Ņ‚Đ¸ ĐŋĐĩвĐŊŅ– Đ´Ņ–Ņ— Ņ–Đˇ Ņ†Đ¸Đŧ **СаĐŋĐ¸Ņ‚ĐžĐŧ** айО СаĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸ ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊиК ĐēОд. +* ДаĐģŅ– ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ” **СаĐŋĐ¸Ņ‚** Đ´ĐģŅ ĐžĐąŅ€ĐžĐąĐēи ĐžŅĐŊОвĐŊиĐŧ ĐˇĐ°ŅŅ‚ĐžŅŅƒĐŊĐēĐžĐŧ (*ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ”ŅŽ ҈ĐģŅŅ…Ņƒ*). +* ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ” **Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ**, ŅŅ„ĐžŅ€ĐŧОваĐŊ҃ ĐˇĐ°ŅŅ‚ĐžŅŅƒĐŊĐēĐžĐŧ (*ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ”ŅŽ ҈ĐģŅŅ…Ņƒ*). +* МоĐļĐĩ СĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ Ņ†ŅŽ **Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ** айО виĐēĐžĐŊĐ°Ņ‚Đ¸ Đ´ĐžĐ´Đ°Ņ‚ĐēОвиК ĐēОд. +* ПовĐĩŅ€Ņ‚Đ°Ņ” **Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ** ĐēĐģŅ–Ņ”ĐŊŅ‚Ņƒ. + +/// note | ĐĸĐĩŅ…ĐŊҖ҇ĐŊŅ– Đ´ĐĩŅ‚Đ°ĐģŅ– + +Đ¯ĐēŅ‰Đž ҃ Đ’Đ°Ņ Ņ” СаĐģĐĩĐļĐŊĐžŅŅ‚Ņ– С `yield`, ĐēОд Đ˛Đ¸Ņ…ĐžĐ´Ņƒ виĐēĐžĐŊĐ°Ņ”Ņ‚ŅŒŅŅ *ĐŋҖҁĐģŅ* middleware. + +Đ¯ĐēŅ‰Đž ĐąŅƒĐģи СаĐŋĐģаĐŊОваĐŊŅ– Ņ„ĐžĐŊĐžĐ˛Ņ– ĐˇĐ°Đ´Đ°Ņ‡Ņ– (background tasks - Ņ€ĐžĐˇĐŗĐģŅĐŊŅƒŅ‚Đž даĐģŅ–), вОĐŊи виĐēĐžĐŊĐ°ŅŽŅ‚ŅŒŅŅ *ĐŋҖҁĐģŅ* Đ˛ŅŅ–Ņ… middleware. + +/// + +## ĐĄŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ middleware + +ЊОй ŅŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ middleware, Ви виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ Đ´ĐĩĐēĐžŅ€Đ°Ņ‚ĐžŅ€ `@app.middleware("http")` ĐŊа Ņ„ŅƒĐŊĐē҆Җҗ. + +Đ¤ŅƒĐŊĐēŅ†Ņ–Ņ middleware ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”: + +* `ЗаĐŋĐ¸Ņ‚`. +* Đ¤ŅƒĐŊĐēŅ†Ņ–ŅŽ `call_next`, ŅĐēа ĐŋŅ€Đ¸ĐšĐŧĐ°Ņ” `СаĐŋĐ¸Ņ‚` ŅĐē ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ. + * ĐĻŅ Ņ„ŅƒĐŊĐēŅ†Ņ–Ņ ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ” `СаĐŋĐ¸Ņ‚` Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊŅ–Đš *ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ҈ĐģŅŅ…Ņƒ*. + * ĐŸĐžŅ‚Ņ–Đŧ вОĐŊа ĐŋОвĐĩŅ€Ņ‚Đ°Ņ” `Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ`, ĐˇĐŗĐĩĐŊĐĩŅ€ĐžĐ˛Đ°ĐŊ҃ Ņ†Ņ–Ņ”ŅŽ *ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ”ŅŽ ҈ĐģŅŅ…Ņƒ*. + +* Ви ĐŧĐžĐļĐĩŅ‚Đĩ ҉Đĩ СĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ `Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ` ĐŋĐĩŅ€ĐĩĐ´ Ņ‚Đ¸Đŧ, ŅĐē ĐŋОвĐĩŅ€ĐŊŅƒŅ‚Đ¸ Ņ—Ņ—. + + +{* ../../docs_src/middleware/tutorial001.py hl[8:9,11,14] *} + +/// tip | ĐŸĐžŅ€Đ°Đ´Đ° + +НĐĩ ĐˇĐ°ĐąŅƒĐ˛Đ°ĐšŅ‚Đĩ, Ņ‰Đž вĐģĐ°ŅĐŊŅ– ĐˇĐ°ĐŗĐžĐģОвĐēи ĐŧĐžĐļĐŊа Đ´ĐžĐ´Đ°Đ˛Đ°Ņ‚Đ¸, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐŋŅ€Đĩ҄ҖĐēҁ 'X-'. + +АĐģĐĩ ŅĐēŅ‰Đž ҃ Đ’Đ°Ņ Ņ” вĐģĐ°ŅĐŊŅ– ĐˇĐ°ĐŗĐžĐģОвĐēи, ŅĐēŅ– Ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ, Ņ‰ĐžĐą ĐąŅ€Đ°ŅƒĐˇĐĩŅ€ĐŊиК ĐēĐģŅ–Ņ”ĐŊŅ‚ ĐŧŅ–Đŗ ĐŋĐžĐąĐ°Ņ‡Đ¸Ņ‚Đ¸, ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž Đ´ĐžĐ´Đ°Ņ‚Đ¸ Ņ—Ņ… Đ´Đž Đ’Đ°ŅˆĐžŅ— ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ— CORS (див. [CORS (ОбĐŧŅ–ĐŊ Ņ€ĐĩŅŅƒŅ€ŅĐ°Đŧи ĐŧŅ–Đļ Ņ€Ņ–ĐˇĐŊиĐŧи Đ´ĐļĐĩŅ€ĐĩĐģаĐŧи)](cors.md){.internal-link target=_blank} Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° `expose_headers`, ĐžĐŋĐ¸ŅĐ°ĐŊĐžĐŗĐž в Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— Starlette ĐŋĐž CORS. + +/// + +/// note | ĐĸĐĩŅ…ĐŊҖ҇ĐŊŅ– Đ´ĐĩŅ‚Đ°ĐģŅ– + +Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ `from starlette.requests import Request`. + +**FastAPI** ĐŊĐ°Đ´Đ°Ņ” ҆Đĩ Đ´ĐģŅ Đ’Đ°ŅˆĐžŅ— ĐˇŅ€ŅƒŅ‡ĐŊĐžŅŅ‚Ņ– ŅĐē Ņ€ĐžĐˇŅ€ĐžĐąĐŊиĐēа. АĐģĐĩ Đ˛Ņ–ĐŊ ĐŋĐžŅ…ĐžĐ´Đ¸Ņ‚ŅŒ ĐąĐĩСĐŋĐžŅĐĩŅ€ĐĩĐ´ĐŊŅŒĐž ĐˇŅ– Starlette. + +/// + +### До Ņ– ĐŋҖҁĐģŅ `response`(`Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ–`) + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ´ĐžĐ´Đ°Ņ‚Đ¸ ĐēОд, ŅĐēиК ĐąŅƒĐ´Đĩ виĐēĐžĐŊŅƒĐ˛Đ°Ņ‚Đ¸ŅŅ С `СаĐŋĐ¸Ņ‚ĐžĐŧ` (`request`), Đ´Đž Ņ‚ĐžĐŗĐž, ŅĐē ĐšĐžĐŗĐž ĐžĐąŅ€ĐžĐąĐ¸Ņ‚ŅŒ ĐąŅƒĐ´ŅŒ-ŅĐēа *ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ ҈ĐģŅŅ…Ņƒ* (*path operation*). + +ĐĸаĐēĐžĐļ Ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ´ĐžĐ´Đ°Ņ‚Đ¸ ĐēОд, ŅĐēиК ĐąŅƒĐ´Đĩ виĐēĐžĐŊŅƒĐ˛Đ°Ņ‚Đ¸ŅŅ ĐŋҖҁĐģŅ Ņ‚ĐžĐŗĐž, ŅĐē `Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ` (`response`) ĐąŅƒĐ´Đĩ ĐˇĐŗĐĩĐŊĐĩŅ€ĐžĐ˛Đ°ĐŊĐž, ĐŋĐĩŅ€ĐĩĐ´ Ņ‚Đ¸Đŧ ŅĐē ĐšĐžĐŗĐž ĐŋОвĐĩŅ€ĐŊŅƒŅ‚Đ¸. + +НаĐŋŅ€Đ¸ĐēĐģад, Ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ´ĐžĐ´Đ°Ņ‚Đ¸ вĐģĐ°ŅĐŊиК ĐˇĐ°ĐŗĐžĐģОвОĐē `X-Process-Time`, ŅĐēиК ĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸ĐŧĐĩ Ņ‡Đ°Ņ ҃ ҁĐĩĐē҃ĐŊĐ´Đ°Ņ…, ŅĐēиК Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‚Đ¸Đ˛ŅŅ ĐŊа ĐžĐąŅ€ĐžĐąĐē҃ СаĐŋĐ¸Ņ‚Ņƒ Ņ‚Đ° ĐŗĐĩĐŊĐĩŅ€Đ°Ņ†Ņ–ŅŽ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ–: + +{* ../../docs_src/middleware/tutorial001.py hl[10,12:13] *} + + +/// tip | ĐŸŅ–Đ´ĐēаСĐēа + +ĐĸŅƒŅ‚ Đŧи виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”ĐŧĐž `time.perf_counter()` СаĐŧŅ–ŅŅ‚ŅŒ `time.time()` ĐžŅĐēŅ–ĐģҌĐēи Đ˛Ņ–ĐŊ ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ ĐąŅ–ĐģҌ҈ Ņ‚ĐžŅ‡ĐŊиĐŧ Đ´ĐģŅ Ņ‚Đ°ĐēĐ¸Ņ… виĐŋадĐēŅ–Đ˛. 🤓 + +/// + +## ІĐŊŅˆŅ– middlewares + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ–ĐˇĐŊŅ–ŅˆĐĩ ĐŋŅ€ĐžŅ‡Đ¸Ņ‚Đ°Ņ‚Đ¸ ĐąŅ–ĐģҌ҈Đĩ ĐŋŅ€Đž Ņ–ĐŊŅˆŅ– middlewares в [Advanced User Guide: Advanced Middleware](../advanced/middleware.md){.internal-link target=_blank}. + +Ви Đ´Ņ–ĐˇĐŊĐ°Ņ”Ņ‚ĐĩҁҌ, ŅĐē ĐžĐąŅ€ĐžĐąĐģŅŅ‚Đ¸ CORS Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ middleware в ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐžĐŧ҃ Ņ€ĐžĐˇĐ´Ņ–ĐģŅ–. diff --git a/docs/uk/docs/tutorial/path-params-numeric-validations.md b/docs/uk/docs/tutorial/path-params-numeric-validations.md new file mode 100644 index 000000000..281ee183c --- /dev/null +++ b/docs/uk/docs/tutorial/path-params-numeric-validations.md @@ -0,0 +1,165 @@ +# Path ĐŸĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ Ņ‚Đ° ваĐģŅ–Đ´Đ°Ņ†Ņ–Ņ Ņ‡Đ¸ŅĐģĐžĐ˛Đ¸Ņ… даĐŊĐ¸Ņ… + +ĐĸаĐē ŅĐ°ĐŧĐž ŅĐē Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐžĐŗĐžĐģĐžŅˆŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи Ņ‚Đ° ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊŅ– Đ´ĐģŅ query ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ `Query`, Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐžĐŗĐžĐģĐžŅˆŅƒĐ˛Đ°Ņ‚Đ¸ Ņ‚ĐžĐš ŅĐ°ĐŧиК Ņ‚Đ¸Đŋ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ĐžĐē Ņ– ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐ¸Ņ… Đ´ĐģŅ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛ ҈ĐģŅŅ…Ņƒ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ `Path`. + +## ІĐŧĐŋĐžŅ€Ņ‚ Path + +ĐĄĐŋĐžŅ‡Đ°Ņ‚Đē҃ Ņ–ĐŧĐŋĐžŅ€Ņ‚ŅƒĐšŅ‚Đĩ `Path` С `fastapi` Ņ– Ņ–ĐŧĐŋĐžŅ€Ņ‚ŅƒĐšŅ‚Đĩ `Annotated`: + +{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *} + +/// info | ІĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ + +FastAPI дОдав ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐē҃ `Annotated` (Ņ– ĐŋĐžŅ‡Đ°Đ˛ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐ˛Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ) ҃ вĐĩҀҁҖҗ 0.95.0. + +Đ¯ĐēŅ‰Đž ҃ Đ’Đ°Ņ ŅŅ‚Đ°Ņ€Đ° вĐĩŅ€ŅŅ–Ņ, ĐŋŅ€Đ¸ ҁĐŋŅ€ĐžĐąŅ– виĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ `Annotated` ĐŧĐžĐļŅƒŅ‚ŅŒ виĐŊиĐēĐ°Ņ‚Đ¸ ĐŋĐžĐŧиĐģĐēи. + +ПĐĩŅ€ĐĩĐēĐžĐŊĐ°ĐšŅ‚ĐĩŅŅ, Ņ‰Đž Ви [ĐžĐŊОвиĐģи вĐĩŅ€ŅŅ–ŅŽ FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} ĐŋŅ€Đ¸ĐŊаКĐŧĐŊŅ– Đ´Đž вĐĩҀҁҖҗ 0.95.1 ĐŋĐĩŅ€ĐĩĐ´ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅĐŧ `Annotated`. + +/// + +## ĐžĐŗĐžĐģĐžŅˆĐĩĐŊĐŊŅ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐ¸Ņ… + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐžĐŗĐžĐģĐžŅˆŅƒĐ˛Đ°Ņ‚Đ¸ Đ˛ŅŅ– ҂Җ Đļ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸, Ņ‰Đž Ņ– Đ´ĐģŅ `Query`. + +НаĐŋŅ€Đ¸ĐēĐģад, Ņ‰ĐžĐą ĐžĐŗĐžĐģĐžŅĐ¸Ņ‚Đ¸ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐ¸Ņ… `title` Đ´ĐģŅ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° ҈ĐģŅŅ…Ņƒ `item_id`, Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊаĐŋĐ¸ŅĐ°Ņ‚Đ¸: + +{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[10] *} + +/// note | ĐŸŅ€Đ¸ĐŧŅ–Ņ‚Đēа + +ĐŸĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ҈ĐģŅŅ…Ņƒ СавĐļди Ņ” ĐžĐąĐžĐ˛â€™ŅĐˇĐēОвиĐŧ, ĐžŅĐēŅ–ĐģҌĐēи Đ˛Ņ–ĐŊ ĐŧĐ°Ņ” ĐąŅƒŅ‚Đ¸ Ņ‡Đ°ŅŅ‚Đ¸ĐŊĐžŅŽ ҈ĐģŅŅ…Ņƒ. ĐĐ°Đ˛Ņ–Ņ‚ŅŒ ŅĐēŅ‰Đž Ви ĐžĐŗĐžĐģĐžŅĐ¸Ņ‚Đĩ ĐšĐžĐŗĐž ĐˇŅ– СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧ `None` айО Đ˛ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ — Đ˛Ņ–ĐŊ Đ˛ŅĐĩ ОдĐŊĐž СаĐģĐ¸ŅˆĐ°Ņ‚Đ¸ĐŧĐĩŅ‚ŅŒŅŅ ĐžĐąĐžĐ˛â€™ŅĐˇĐēОвиĐŧ. + +/// + +## ĐŖĐŋĐžŅ€ŅĐ´ĐēĐžĐ˛ŅƒĐšŅ‚Đĩ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸, ŅĐē ВаĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž + +/// tip | ĐŸŅ–Đ´ĐēаСĐēа + +ĐĻĐĩ, ĐŧĐ°ĐąŅƒŅ‚ŅŒ, ĐŊĐĩ ĐŊĐ°ŅŅ‚Ņ–ĐģҌĐēи ваĐļĐģивО айО ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž, ŅĐēŅ‰Đž Ви виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ `Annotated`. + +/// + +ĐŸŅ€Đ¸ĐŋŅƒŅŅ‚Đ¸ĐŧĐž, Ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐžĐŗĐžĐģĐžŅĐ¸Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ СаĐŋĐ¸Ņ‚Ņƒ `q` ŅĐē ĐžĐąĐžĐ˛â€™ŅĐˇĐēОвиК `str`. + +І ВаĐŧ ĐŊĐĩ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐžĐŗĐžĐģĐžŅˆŅƒĐ˛Đ°Ņ‚Đ¸ ĐŊŅ–Ņ‡ĐžĐŗĐž Ņ–ĐŊŅˆĐžĐŗĐž Đ´ĐģŅ Ņ†ŅŒĐžĐŗĐž ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ°, Ņ‚ĐžĐŧ҃ ĐŊĐĩĐŧĐ°Ņ” ĐŋĐžŅ‚Ņ€Đĩйи виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `Query`. + +АĐģĐĩ ВаĐŧ Đ˛ŅĐĩ ОдĐŊĐž ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `Path` Đ´ĐģŅ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° ҈ĐģŅŅ…Ņƒ `item_id`. І С ĐŋĐĩвĐŊĐ¸Ņ… ĐŋŅ€Đ¸Ņ‡Đ¸ĐŊ Ви ĐŊĐĩ Ņ…ĐžŅ‡ĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `Annotated`. + +Python Đ˛Đ¸Đ´Đ°ŅŅ‚ŅŒ ĐŋĐžĐŧиĐģĐē҃, ŅĐēŅ‰Đž Ņ€ĐžĐˇĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ С "default" ĐŋĐĩŅ€ĐĩĐ´ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧ, ŅĐēĐĩ ĐŊĐĩ ĐŧĐ°Ņ” "default". + +АĐģĐĩ Ви ĐŧĐžĐļĐĩŅ‚Đĩ СĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ĐŋĐžŅ€ŅĐ´ĐžĐē Ņ– Ņ€ĐžĐˇĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐąĐĩС СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ (ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ СаĐŋĐ¸Ņ‚Ņƒ `q`) ĐŋĐĩŅ€ŅˆĐ¸Đŧ. + + +ДĐģŅ **FastAPI** ĐŋĐžŅ€ŅĐ´ĐžĐē ĐŊĐĩ ĐŧĐ°Ņ” СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ. Đ’Ņ–ĐŊ виСĐŊĐ°Ņ‡Đ°Ņ” ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ Са Ņ—Ņ… Ņ–ĐŧĐĩĐŊаĐŧи, Ņ‚Đ¸ĐŋаĐŧи Ņ‚Đ° СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧи Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ (`Query`, `Path` Ņ‚ĐžŅ‰Đž) Ņ– ĐŊĐĩ СвĐĩŅ€Ņ‚Đ°Ņ” ŅƒĐ˛Đ°ĐŗĐ¸ ĐŊа ĐŋĐžŅ€ŅĐ´ĐžĐē. + +ĐĸĐžĐŧ҃ Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐžĐŗĐžĐģĐžŅĐ¸Ņ‚Đ¸ Đ’Đ°ŅˆŅƒ Ņ„ŅƒĐŊĐēŅ†Ņ–ŅŽ Ņ‚Đ°Đē: + +//// tab | Python 3.8 non-Annotated + +/// tip | ĐŸŅ–Đ´ĐēаСĐēа + +За ĐŧĐžĐļĐģĐ¸Đ˛ĐžŅŅ‚Ņ– Đ˛Ņ–Đ´Đ´Đ°Đ˛Đ°ĐšŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐ˛Đ°ĐŗŅƒ вĐĩҀҁҖҗ С виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅĐŧ `Annotated`. + +/// + +{* ../../docs_src/path_params_numeric_validations/tutorial002.py hl[7] *} + +//// + +АĐģĐĩ ĐŧĐ°ĐšŅ‚Đĩ ĐŊа ŅƒĐ˛Đ°ĐˇŅ–, Ņ‰Đž ŅĐēŅ‰Đž Ви виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ `Annotated`, Ņ†Ņ ĐŋŅ€ĐžĐąĐģĐĩĐŧа ĐŊĐĩ виĐŊиĐēĐŊĐĩ, ĐžŅĐēŅ–ĐģҌĐēи Ви ĐŊĐĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ Đ´ĐģŅ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛ `Query()` айО `Path()`. + +{* ../../docs_src/path_params_numeric_validations/tutorial002_an_py39.py *} + +## ĐŖĐŋĐžŅ€ŅĐ´ĐēĐžĐ˛ŅƒĐšŅ‚Đĩ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ Са ĐŋĐžŅ‚Ņ€ĐĩĐąĐžŅŽ, Ņ…Đ¸Ņ‚Ņ€ĐžŅ‰Ņ– + +/// tip | ĐŸŅ–Đ´ĐēаСĐēа + +ĐĻĐĩ, ĐŧĐ°ĐąŅƒŅ‚ŅŒ, ĐŊĐĩ ĐŊĐ°ŅŅ‚Ņ–ĐģҌĐēи ваĐļĐģивО айО ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž, ŅĐēŅ‰Đž Ви виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ `Annotated`. + +/// + +ĐžŅŅŒ **ĐŊĐĩвĐĩĐģиĐēа Ņ…Đ¸Ņ‚Ņ€Ņ–ŅŅ‚ŅŒ**, ŅĐēа ĐŧĐžĐļĐĩ ŅŅ‚Đ°Ņ‚Đ¸ в ĐŋŅ€Đ¸ĐŗĐžĐ´Ņ–, Ņ…ĐžŅ‡Đ° вОĐŊа Ņ€Ņ–Đ´ĐēĐž СĐŊĐ°Đ´ĐžĐąĐ¸Ņ‚ŅŒŅŅ. + +Đ¯ĐēŅ‰Đž Ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ: + +* ĐžĐŗĐžĐģĐžŅĐ¸Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ СаĐŋĐ¸Ņ‚Ņƒ `q` ĐąĐĩС виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ `Query` айО СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ +* ĐžĐŗĐžĐģĐžŅĐ¸Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ҈ĐģŅŅ…Ņƒ `item_id`, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ `Path` +* Ņ€ĐžĐˇĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸ Ņ—Ņ… ҃ Ņ€Ņ–ĐˇĐŊĐžĐŧ҃ ĐŋĐžŅ€ŅĐ´Đē҃ +* ĐŊĐĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `Annotated` + +...҃ Python Ņ” ҁĐŋĐĩŅ†Ņ–Đ°ĐģҌĐŊиК ŅĐ¸ĐŊŅ‚Đ°ĐēŅĐ¸Ņ Đ´ĐģŅ Ņ†ŅŒĐžĐŗĐž. + +ПĐĩŅ€ĐĩĐ´Đ°ĐšŅ‚Đĩ `*` ŅĐē ĐŋĐĩŅ€ŅˆĐ¸Đš ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ Ņ„ŅƒĐŊĐē҆Җҗ. + +Python ĐŊŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ ĐˇŅ€ĐžĐąĐ¸Ņ‚ŅŒ Ņ–Đˇ Ņ†Ņ–Ņ”ŅŽ `*`, аĐģĐĩ Ņ€ĐžĐˇĐŋŅ–ĐˇĐŊĐ°Ņ”, Ņ‰Đž Đ˛ŅŅ– ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊŅ– ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ ҁĐģŅ–Đ´ виĐēĐģиĐēĐ°Ņ‚Đ¸ ŅĐē Đ°Ņ€ĐŗŅƒĐŧĐĩĐŊŅ‚Đ¸ Са ĐēĐģŅŽŅ‡ĐžĐ˛Đ¸Đŧ ҁĐģОвОĐŧ (ĐŋĐ°Ņ€Đ¸ ĐēĐģŅŽŅ‡-СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ), Ņ‚Đ°ĐēĐžĐļ Đ˛Ņ–Đ´ĐžĐŧŅ– ŅĐē kwargs. ĐĐ°Đ˛Ņ–Ņ‚ŅŒ ŅĐēŅ‰Đž вОĐŊи ĐŊĐĩ ĐŧĐ°ŅŽŅ‚ŅŒ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ. + +{* ../../docs_src/path_params_numeric_validations/tutorial003.py hl[7] *} + +### ĐšŅ€Đ°Ņ‰Đĩ С `Annotated` + +ĐœĐ°ĐšŅ‚Đĩ ĐŊа ŅƒĐ˛Đ°ĐˇŅ–, ŅĐēŅ‰Đž Ви виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ `Annotated`, ĐžŅĐēŅ–ĐģҌĐēи Ви ĐŊĐĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ Đ´ĐģŅ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛ Ņ„ŅƒĐŊĐē҆Җҗ, ҆ҖҔҗ ĐŋŅ€ĐžĐąĐģĐĩĐŧи ĐŊĐĩ виĐŊиĐēĐŊĐĩ, Ņ–, ŅˆĐ˛Đ¸Đ´ŅˆĐĩ Са Đ˛ŅĐĩ, ВаĐŧ ĐŊĐĩ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐąŅƒĐ´Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `*`. + +{* ../../docs_src/path_params_numeric_validations/tutorial003_an_py39.py hl[10] *} + +## ВаĐģŅ–Đ´Đ°Ņ†Ņ–Ņ Ņ‡Đ¸ŅĐģĐžĐ˛Đ¸Ņ… даĐŊĐ¸Ņ…: ĐąŅ–ĐģҌ҈Đĩ айО Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” + +За Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ `Query` Ņ– `Path` (Ņ‚Đ° Ņ–ĐŊŅˆĐ¸Ņ…, ŅĐēŅ– Ви ĐŋĐžĐąĐ°Ņ‡Đ¸Ņ‚Đĩ ĐŋŅ–ĐˇĐŊŅ–ŅˆĐĩ) ĐŧĐžĐļĐŊа ĐžĐŗĐžĐģĐžŅˆŅƒĐ˛Đ°Ņ‚Đ¸ Ņ‡Đ¸ŅĐģĐžĐ˛Ņ– ОйĐŧĐĩĐļĐĩĐŊĐŊŅ. + +ĐĸŅƒŅ‚, ĐˇĐ°Đ˛Đ´ŅĐēи `ge=1`, `item_id` ĐŧĐ°Ņ” ĐąŅƒŅ‚Đ¸ ҆ҖĐģиĐŧ Ņ‡Đ¸ŅĐģĐžĐŧ, ŅĐēĐĩ "`g`reater than or `e`qual" (ĐąŅ–ĐģҌ҈Đĩ айО Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ”) `1`. + +{* ../../docs_src/path_params_numeric_validations/tutorial004_an_py39.py hl[10] *} + +## ВаĐģŅ–Đ´Đ°Ņ†Ņ–Ņ Ņ‡Đ¸ŅĐģĐžĐ˛Đ¸Ņ… даĐŊĐ¸Ņ…: ĐąŅ–ĐģҌ҈Đĩ ĐŊŅ–Đļ Ņ– ĐŧĐĩĐŊ҈Đĩ айО Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” + +ĐĸĐĩ ŅĐ°ĐŧĐĩ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´Đž: + +* `gt`: `g`reater `t`han (ĐąŅ–ĐģҌ҈Đĩ ĐŊŅ–Đļ) +* `le`: `l`ess than or `e`qual (ĐŧĐĩĐŊ҈Đĩ айО Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ”) + +{* ../../docs_src/path_params_numeric_validations/tutorial005_an_py39.py hl[10] *} + +## ВаĐģŅ–Đ´Đ°Ņ†Ņ–Ņ Ņ‡Đ¸ŅĐģĐžĐ˛Đ¸Ņ… даĐŊĐ¸Ņ…: float, ĐąŅ–ĐģҌ҈Đĩ ĐŊŅ–Đļ Ņ– ĐŧĐĩĐŊ҈Đĩ ĐŊŅ–Đļ + +ВаĐģŅ–Đ´Đ°Ņ†Ņ–Ņ Ņ‡Đ¸ŅĐĩĐģ Ņ‚Đ°ĐēĐžĐļ ĐŋŅ€Đ°Ņ†ŅŽŅ” Đ´ĐģŅ СĐŊĐ°Ņ‡ĐĩĐŊҌ Ņ‚Đ¸Đŋ҃ `float`. + +ĐžŅŅŒ Đ´Đĩ ŅŅ‚Đ°Ņ” ваĐļĐģивО ĐŧĐ°Ņ‚Đ¸ ĐŧĐžĐļĐģĐ¸Đ˛Ņ–ŅŅ‚ŅŒ ĐžĐŗĐžĐģĐžŅˆŅƒĐ˛Đ°Ņ‚Đ¸ gt, а ĐŊĐĩ ҂ҖĐģҌĐēи ge. ĐĻĐĩ дОСвОĐģŅŅ”, ĐŊаĐŋŅ€Đ¸ĐēĐģад, виĐŧĐ°ĐŗĐ°Ņ‚Đ¸, Ņ‰ĐžĐą СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐąŅƒĐģĐž ĐąŅ–ĐģҌ҈Đĩ `0`, ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ŅĐēŅ‰Đž вОĐŊĐž ĐŧĐĩĐŊ҈Đĩ `1`. + +ĐĸаĐēиĐŧ Ņ‡Đ¸ĐŊĐžĐŧ, СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ `0.5` ĐąŅƒĐ´Đĩ Đ´ĐžĐŋŅƒŅŅ‚Đ¸ĐŧиĐŧ. АĐģĐĩ `0.0` айО `0` — ĐŊŅ–. + +ĐĸĐĩ ŅĐ°ĐŧĐĩ ŅŅ‚ĐžŅŅƒŅ”Ņ‚ŅŒŅŅ lt. + +{* ../../docs_src/path_params_numeric_validations/tutorial006_an_py39.py hl[13] *} + +## ĐŸŅ–Đ´ŅŅƒĐŧĐžĐē + +За Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ `Query`, `Path` (Ņ– Ņ–ĐŊŅˆĐ¸Ņ… ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛, ŅĐēŅ– Ви ҉Đĩ ĐŊĐĩ ĐąĐ°Ņ‡Đ¸Đģи) ĐŧĐžĐļĐŊа ĐžĐŗĐžĐģĐžŅˆŅƒĐ˛Đ°Ņ‚Đ¸ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊŅ– Ņ‚Đ° ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи Ņ€ŅĐ´ĐēŅ–Đ˛, Ņ‚Đ°Đē ŅĐ°ĐŧĐž ŅĐē ҃ [Query ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ Ņ‚Đ° ваĐģŅ–Đ´Đ°Ņ†Ņ–Ņ Ņ€ŅĐ´ĐēŅ–Đ˛](query-params-str-validations.md){.internal-link target=_blank}. + +ĐĸаĐēĐžĐļ ĐŧĐžĐļĐŊа ĐžĐŗĐžĐģĐžŅˆŅƒĐ˛Đ°Ņ‚Đ¸ Ņ‡Đ¸ŅĐģĐžĐ˛Ņ– ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи: + +* `gt`: `g`reater `t`han (ĐąŅ–ĐģҌ҈Đĩ ĐŊŅ–Đļ) +* `ge`: `g`reater than or `e`qual (ĐąŅ–ĐģҌ҈Đĩ айО Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ”) +* `lt`: `l`ess `t`han (ĐŧĐĩĐŊ҈Đĩ ĐŊŅ–Đļ) +* `le`: `l`ess than or `e`qual (ĐŧĐĩĐŊ҈Đĩ айО Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ”) + +/// info | ІĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ + +`Query`, `Path` Ņ‚Đ° Ņ–ĐŊŅˆŅ– ĐēĐģĐ°ŅĐ¸, ŅĐēŅ– Ви ĐŋĐžĐąĐ°Ņ‡Đ¸Ņ‚Đĩ ĐŋŅ–ĐˇĐŊŅ–ŅˆĐĩ, Ņ” ĐŋŅ–Đ´ĐēĐģĐ°ŅĐ°Đŧи ҁĐŋŅ–ĐģҌĐŊĐžĐŗĐž ĐēĐģĐ°ŅŅƒ `Param`. + +Đ’ŅŅ– вОĐŊи ĐŧĐ°ŅŽŅ‚ŅŒ ОдĐŊаĐēĐžĐ˛Ņ– ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ Đ´ĐģŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Đ¸Ņ… ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ĐžĐē Ņ– ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐ¸Ņ…, ŅĐēŅ– Ви вĐļĐĩ ĐąĐ°Ņ‡Đ¸Đģи. + +/// + +/// note | ĐĸĐĩŅ…ĐŊҖ҇ĐŊŅ– Đ´ĐĩŅ‚Đ°ĐģŅ– + +КоĐģи Ви Ņ–ĐŧĐŋĐžŅ€Ņ‚ŅƒŅ”Ņ‚Đĩ `Query`, `Path` Ņ‚Đ° Ņ–ĐŊŅˆŅ– С `fastapi`, ĐŊĐ°ŅĐŋŅ€Đ°Đ˛Đ´Ņ– ҆Đĩ Ņ„ŅƒĐŊĐē҆Җҗ. + +ĐŸŅ€Đ¸ виĐēĐģиĐē҃ вОĐŊи ĐŋОвĐĩŅ€Ņ‚Đ°ŅŽŅ‚ŅŒ ĐĩĐēСĐĩĐŧĐŋĐģŅŅ€Đ¸ ĐēĐģĐ°ŅŅ–Đ˛ С Ņ‚Đ°ĐēиĐŧи Đļ Ņ–ĐŧĐĩĐŊаĐŧи. + +ĐĸĐžĐąŅ‚Đž Ви Ņ–ĐŧĐŋĐžŅ€Ņ‚ŅƒŅ”Ņ‚Đĩ `Query`, ŅĐēа Ņ” Ņ„ŅƒĐŊĐēŅ†Ņ–Ņ”ŅŽ. А ĐēĐžĐģи Ви Ņ—Ņ— виĐēĐģиĐēĐ°Ņ”Ņ‚Đĩ, вОĐŊа ĐŋОвĐĩŅ€Ņ‚Đ°Ņ” ĐĩĐēСĐĩĐŧĐŋĐģŅŅ€ ĐēĐģĐ°ŅŅƒ, ŅĐēиК Ņ‚ĐĩĐļ ĐŊĐ°ĐˇĐ¸Đ˛Đ°Ņ”Ņ‚ŅŒŅŅ `Query`. + +ĐĻŅ– Ņ„ŅƒĐŊĐē҆Җҗ ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊŅ– Ņ‚Đ°ĐēиĐŧ Ņ‡Đ¸ĐŊĐžĐŧ (СаĐŧŅ–ŅŅ‚ŅŒ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ ĐēĐģĐ°ŅŅ–Đ˛ ĐŊаĐŋŅ€ŅĐŧ҃), Ņ‰ĐžĐą Đ’Đ°Ņˆ Ņ€ĐĩдаĐēŅ‚ĐžŅ€ ĐŊĐĩ Đ˛Ņ–Đ´ĐˇĐŊĐ°Ņ‡Đ°Đ˛ Ņ—Ņ…ĐŊŅ– Ņ‚Đ¸Đŋи ŅĐē ĐŋĐžĐŧиĐģĐēи. + +ĐĸаĐēиĐŧ Ņ‡Đ¸ĐŊĐžĐŧ, Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ŅŅ ŅĐ˛ĐžŅ—Đŧ ĐˇĐ˛Đ¸Ņ‡Đ°ĐšĐŊиĐŧ Ņ€ĐĩдаĐēŅ‚ĐžŅ€ĐžĐŧ Ņ– Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Đ°Đŧи Đ´ĐģŅ ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧŅƒĐ˛Đ°ĐŊĐŊŅ ĐąĐĩС Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Đ¸Ņ… ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊҌ Đ´ĐģŅ Ņ–ĐŗĐŊĐžŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ Ņ‚Đ°ĐēĐ¸Ņ… ĐŋĐžĐŧиĐģĐžĐē. + +/// diff --git a/docs/uk/docs/tutorial/query-param-models.md b/docs/uk/docs/tutorial/query-param-models.md new file mode 100644 index 000000000..97eb82fa1 --- /dev/null +++ b/docs/uk/docs/tutorial/query-param-models.md @@ -0,0 +1,68 @@ +# МодĐĩĐģŅ– Query ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛ + +Đ¯ĐēŅ‰Đž ҃ Đ’Đ°Ņ Ņ” ĐŗŅ€ŅƒĐŋа **query ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛**, ŅĐēŅ– ĐŋĐžĐ˛â€™ŅĐˇĐ°ĐŊŅ– ĐŧŅ–Đļ ŅĐžĐąĐžŅŽ, Ви ĐŧĐžĐļĐĩŅ‚Đĩ ŅŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ **Pydantic-ĐŧОдĐĩĐģҌ** Đ´ĐģŅ Ņ—Ņ… ĐžĐŗĐžĐģĐžŅˆĐĩĐŊĐŊŅ. + +ĐĻĐĩ дОСвОĐģĐ¸Ņ‚ŅŒ ВаĐŧ **ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŧОдĐĩĐģҌ** ҃ **Ņ€Ņ–ĐˇĐŊĐ¸Ņ… ĐŧŅ–ŅŅ†ŅŅ…**, а Ņ‚Đ°ĐēĐžĐļ ĐžĐŗĐžĐģĐžŅˆŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи Ņ‚Đ° ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊŅ– Đ´ĐģŅ Đ˛ŅŅ–Ņ… ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛ ОдĐŊĐžŅ‡Đ°ŅĐŊĐž. 😎 + +/// note | ĐŸŅ€Đ¸ĐŧŅ–Ņ‚Đēа + +ĐĻŅ ĐŧĐžĐļĐģĐ¸Đ˛Ņ–ŅŅ‚ŅŒ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚ŅŒŅŅ, ĐŋĐžŅ‡Đ¸ĐŊĐ°ŅŽŅ‡Đ¸ С вĐĩҀҁҖҗ FastAPI `0.115.0`. 🤓 + +/// + +## Query ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ С Pydantic-ĐŧОдĐĩĐģĐģŅŽ + +ĐžĐŗĐžĐģĐžŅŅ–Ņ‚ŅŒ **query ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸**, ŅĐēŅ– ВаĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊŅ–, ҃ **Pydantic-ĐŧОдĐĩĐģŅ–**, а ĐŋĐžŅ‚Ņ–Đŧ ĐžĐŗĐžĐģĐžŅŅ–Ņ‚ŅŒ ҆ĐĩĐš ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ŅĐē `Query`: + +{* ../../docs_src/query_param_models/tutorial001_an_py310.py hl[9:13,17] *} + +**FastAPI** ĐąŅƒĐ´Đĩ **Đ˛Đ¸Ņ‚ŅĐŗŅƒĐ˛Đ°Ņ‚Đ¸** даĐŊŅ– Đ´ĐģŅ **ĐēĐžĐļĐŊĐžĐŗĐž ĐŋĐžĐģŅ** С **query ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛** ҃ СаĐŋĐ¸Ņ‚Ņ– Ņ‚Đ° ĐŋĐĩŅ€ĐĩĐ´Đ°Đ˛Đ°Ņ‚Đ¸ Ņ—Ņ… ҃ виСĐŊĐ°Ņ‡ĐĩĐŊ҃ ваĐŧи Pydantic-ĐŧОдĐĩĐģҌ. + +## ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€Ņ‚Đĩ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–ŅŽ + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐąĐ°Ņ‡Đ¸Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ СаĐŋĐ¸Ņ‚Ņƒ в UI Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— Са `/docs`: + +
+ +
+ +## Đ—Đ°ĐąĐžŅ€ĐžĐŊа ĐˇĐ°ĐšĐ˛Đ¸Ņ… Query ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛ + +ĐŖ Đ´ĐĩŅĐēĐ¸Ņ… ĐžŅĐžĐąĐģĐ¸Đ˛Đ¸Ņ… виĐŋадĐēĐ°Ņ… (ĐšĐŧĐžĐ˛Ņ–Ņ€ĐŊĐž, ĐŊĐĩ Đ´ŅƒĐļĐĩ ĐŋĐžŅˆĐ¸Ņ€ĐĩĐŊĐ¸Ņ…) Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇĐ°Ņ…ĐžŅ‚Ņ–Ņ‚Đ¸ **ОйĐŧĐĩĐļĐ¸Ņ‚Đ¸** query ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸, ŅĐēŅ– дОСвОĐģĐĩĐŊĐž ĐžŅ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°Ņ‚Đ¸. + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ŅŽ ĐŧОдĐĩĐģŅ– Pydantic, Ņ‰ĐžĐą ĐˇĐ°ĐąĐžŅ€ĐžĐŊĐ¸Ņ‚Đ¸ (`forbid`) ĐąŅƒĐ´ŅŒ-ŅĐēŅ– ĐˇĐ°ĐšĐ˛Ņ– (`extra`) ĐŋĐžĐģŅ: + +{* ../../docs_src/query_param_models/tutorial002_an_py310.py hl[10] *} + +Đ¯ĐēŅ‰Đž ĐēĐģŅ–Ņ”ĐŊŅ‚ ҁĐŋŅ€ĐžĐąŅƒŅ” ĐŊĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸ **ĐˇĐ°ĐšĐ˛Ņ–** даĐŊŅ– ҃ **query ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ°Ņ…**, Đ˛Ņ–ĐŊ ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ” **ĐŋĐžĐŧиĐģĐē҃**. + +НаĐŋŅ€Đ¸ĐēĐģад, ŅĐēŅ‰Đž ĐēĐģŅ–Ņ”ĐŊŅ‚ ҁĐŋŅ€ĐžĐąŅƒŅ” ĐŊĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸ query ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `tool` ĐˇŅ– СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧ `plumbus`, ŅĐē ҃ Ņ†ŅŒĐžĐŧ҃ СаĐŋĐ¸Ņ‚Ņ–: + +```http +https://example.com/items/?limit=10&tool=plumbus +``` + +Đ’Ņ–ĐŊ ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ” Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ С **ĐŋĐžĐŧиĐģĐēĐžŅŽ**, ŅĐēа ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐ¸Ņ‚ŅŒ, Ņ‰Đž query ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `tool ` ĐŊĐĩ дОСвОĐģĐĩĐŊĐž: + +```json +{ + "detail": [ + { + "type": "extra_forbidden", + "loc": ["query", "tool"], + "msg": "Extra inputs are not permitted", + "input": "plumbus" + } + ] +} +``` + +## ĐŸŅ–Đ´ŅŅƒĐŧĐžĐē + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ **Pydantic-ĐŧОдĐĩĐģŅ–** Đ´ĐģŅ ĐžĐŗĐžĐģĐžŅˆĐĩĐŊĐŊŅ **query ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛** ҃ **FastAPI**. 😎 + +/// tip | ĐŸŅ–Đ´ĐēаСĐēа + +ĐĄĐŋОКĐģĐĩŅ€: Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Pydantic-ĐŧОдĐĩĐģŅ– Đ´ĐģŅ ĐžĐŗĐžĐģĐžŅˆĐĩĐŊĐŊŅ cookie Ņ‚Đ° ĐˇĐ°ĐŗĐžĐģОвĐēŅ–Đ˛, аĐģĐĩ ĐŋŅ€Đž ҆Đĩ Ви Đ´Ņ–ĐˇĐŊĐ°Ņ”Ņ‚ĐĩŅŅ ĐŋŅ–ĐˇĐŊŅ–ŅˆĐĩ в Ņ†ŅŒĐžĐŧ҃ ĐŋĐžŅŅ–ĐąĐŊиĐē҃. đŸ¤Ģ + +/// diff --git a/docs/uk/docs/tutorial/query-params-str-validations.md b/docs/uk/docs/tutorial/query-params-str-validations.md new file mode 100644 index 000000000..cd3f4ad93 --- /dev/null +++ b/docs/uk/docs/tutorial/query-params-str-validations.md @@ -0,0 +1,491 @@ +# Query ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ Ņ‚Đ° ваĐģŅ–Đ´Đ°Ņ†Ņ–Ņ Ņ€ŅĐ´ĐēŅ–Đ˛ + +**FastAPI** дОСвОĐģŅŅ” ĐžĐŗĐžĐģĐžŅˆŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņƒ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ Ņ‚Đ° виĐēĐžĐŊŅƒĐ˛Đ°Ņ‚Đ¸ ваĐģŅ–Đ´Đ°Ņ†Ņ–ŅŽ Đ´ĐģŅ Đ’Đ°ŅˆĐ¸Ņ… ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛. + +Đ ĐžĐˇĐŗĐģŅĐŊĐĩĐŧĐž ҆ĐĩĐš Đ´ĐžĐ´Đ°Ņ‚ĐžĐē ŅĐē ĐŋŅ€Đ¸ĐēĐģад: + +{* ../../docs_src/query_params_str_validations/tutorial001_py310.py hl[7] *} + +Query ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `q` ĐŧĐ°Ņ” Ņ‚Đ¸Đŋ `str | None`, Ņ‰Đž ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž Đ˛Ņ–ĐŊ ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ ŅĐē `str`, Ņ‚Đ°Đē Ņ– `None`. За СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ Đ˛Ņ–ĐŊ ĐŧĐ°Ņ” СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ `None`, Ņ‚ĐžĐŧ҃ FastAPI Ņ€ĐžĐˇŅƒĐŧŅ–Ņ”, Ņ‰Đž ҆ĐĩĐš ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ĐŊĐĩ Ņ” ОйОв'ŅĐˇĐēОвиĐŧ. + +/// note | ĐŸŅ€Đ¸ĐŧŅ–Ņ‚Đēа + +FastAPI СĐŊĐ°Ņ”, Ņ‰Đž `q` ĐŊĐĩ Ņ” ĐžĐąĐžĐ˛â€™ŅĐˇĐēОвиĐŧ, ĐˇĐ°Đ˛Đ´ŅĐēи СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅŽ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ `= None`. + +ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ `str | None` дОСвОĐģĐ¸Ņ‚ŅŒ Đ’Đ°ŅˆĐžĐŧ҃ Ņ€ĐĩдаĐēŅ‚ĐžŅ€Ņƒ ĐēĐžĐ´Ņƒ ĐŊĐ°Đ´Đ°Đ˛Đ°Ņ‚Đ¸ ĐēŅ€Đ°Ņ‰Ņƒ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐē҃ Ņ‚Đ° Đ˛Đ¸ŅĐ˛ĐģŅŅ‚Đ¸ ĐŋĐžĐŧиĐģĐēи. + +/// + +## Đ”ĐžĐ´Đ°Ņ‚ĐēОва ваĐģŅ–Đ´Đ°Ņ†Ņ–Ņ + +Ми Ņ…ĐžŅ‡ĐĩĐŧĐž, Ņ‰ĐžĐą ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ŅĐēŅ‰Đž `q` Ņ” ĐŊĐĩĐžĐąĐžĐ˛â€™ŅĐˇĐēОвиĐŧ, **ĐšĐžĐŗĐž дОвĐļиĐŊа ĐŊĐĩ ĐŋĐĩŅ€ĐĩĐ˛Đ¸Ņ‰ŅƒĐ˛Đ°Đģа 50 ŅĐ¸ĐŧвОĐģŅ–Đ˛**, ŅĐēŅ‰Đž Đ˛Ņ–ĐŊ Đ˛ŅĐĩ Đļ ĐąŅƒĐ´Đĩ ĐŋĐĩŅ€ĐĩдаĐŊиК. + +### ІĐŧĐŋĐžŅ€Ņ‚ `Query` Ņ‚Đ° `Annotated` + +ЊОй ҆Đĩ ĐˇŅ€ĐžĐąĐ¸Ņ‚Đ¸, ҁĐŋĐžŅ‡Đ°Ņ‚Đē҃ Ņ–ĐŧĐŋĐžŅ€Ņ‚ŅƒŅ”ĐŧĐž: + +* `Query` С `fastapi` +* `Annotated` С `typing` + +{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *} + +/// info | ІĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ + +FastAPI дОдав ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐē҃ `Annotated` (Ņ– ĐŋĐžŅ‡Đ°Đ˛ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐ˛Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž) ҃ вĐĩҀҁҖҗ 0.95.0. + +Đ¯ĐēŅ‰Đž ҃ Đ’Đ°Ņ ŅŅ‚Đ°Ņ€Ņ–ŅˆĐ° вĐĩŅ€ŅŅ–Ņ, ĐŋŅ–Đ´ Ņ‡Đ°Ņ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ `Annotated` ĐŧĐžĐļŅƒŅ‚ŅŒ виĐŊиĐēĐ°Ņ‚Đ¸ ĐŋĐžĐŧиĐģĐēи. + +ПĐĩŅ€ĐĩĐēĐžĐŊĐ°ĐšŅ‚ĐĩŅŅ, Ņ‰Đž Ви [ĐžĐŊОвиĐģи вĐĩŅ€ŅŅ–ŅŽ FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} Đ´Đž ĐŋŅ€Đ¸ĐŊаКĐŧĐŊŅ– 0.95.1, ĐŋĐĩŅ€Ņˆ ĐŊŅ–Đļ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `Annotated`. + +/// + +## ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ `Annotated` ҃ Ņ‚Đ¸ĐŋŅ– ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° `q` + +ПаĐŧâ€™ŅŅ‚Đ°Ņ”Ņ‚Đĩ, ŅĐē Ņ Ņ€Đ°ĐŊŅ–ŅˆĐĩ Ņ€ĐžĐˇĐŋĐžĐ˛Ņ–Đ´Đ°Đ˛, Ņ‰Đž `Annotated` ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ дОдаваĐŊĐŊŅ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐ¸Ņ… Đ´Đž ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛ ҃ [Đ’ŅŅ‚ŅƒĐŋŅ– Đ´Đž Ņ‚Đ¸ĐŋŅ–Đ˛ Python](../python-types.md#type-hints-with-metadata-annotations){.internal-link target=_blank}? + +Đ—Đ°Ņ€Đ°Đˇ ŅĐ°ĐŧĐĩ Ņ‡Đ°Ņ виĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž Ņ€Đ°ĐˇĐžĐŧ Ņ–Đˇ FastAPI. 🚀 + +РаĐŊŅ–ŅˆĐĩ Đŧи ĐŧаĐģи Ņ‚Đ°Đē҃ аĐŊĐžŅ‚Đ°Ņ†Ņ–ŅŽ Ņ‚Đ¸Đŋ҃: + +//// tab | Python 3.10+ + +```Python +q: str | None = None +``` + +//// + +//// tab | Python 3.8+ + +```Python +q: Union[str, None] = None +``` + +//// + +ĐĸĐĩĐŋĐĩŅ€ Đŧи ĐˇĐ°ĐŗĐžŅ€ĐŊĐĩĐŧĐž Ņ—Ņ— ҃ `Annotated`, Ņ– ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ”ĐŧĐž: + +//// tab | Python 3.10+ + +```Python +q: Annotated[str | None] = None +``` + +//// + +//// tab | Python 3.8+ + +```Python +q: Annotated[Union[str, None]] = None +``` + +//// + +ĐžĐąĐ¸Đ´Đ˛Ņ– ҆Җ вĐĩҀҁҖҗ ОСĐŊĐ°Ņ‡Đ°ŅŽŅ‚ŅŒ ОдĐŊĐĩ Đš Ņ‚Đĩ ŅĐ°ĐŧĐĩ: `q` — ҆Đĩ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ, ŅĐēиК ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ `str` айО `None`, Ņ– Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ĐŧĐ°Ņ” СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ `None`. + +А Ņ‚ĐĩĐŋĐĩŅ€ ĐŋĐĩŅ€ĐĩŅ…ĐžĐ´Đ¸ĐŧĐž Đ´Đž ҆ҖĐēĐ°Đ˛ĐžĐŗĐž! 🎉 + +## ДодаваĐŊĐŊŅ `Query` Đ´Đž `Annotated` ҃ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `q` + +ĐĸĐĩĐŋĐĩŅ€, ĐēĐžĐģи ҃ ĐŊĐ°Ņ Ņ” `Annotated`, Đ´Đĩ Đŧи ĐŧĐžĐļĐĩĐŧĐž Đ´ĐžĐ´Đ°Đ˛Đ°Ņ‚Đ¸ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņƒ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ (СОĐēŅ€ĐĩĐŧа ваĐģŅ–Đ´Đ°Ņ†Ņ–ŅŽ), дОдаĐŧĐž `Query` Đ˛ŅĐĩŅ€ĐĩдиĐŊ҃ `Annotated` Ņ– Đ˛ŅŅ‚Đ°ĐŊОвиĐŧĐž ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `max_length` ҃ `50`: + +{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[9] *} + +ЗвĐĩŅ€ĐŊŅ–Ņ‚ŅŒ ŅƒĐ˛Đ°ĐŗŅƒ, Ņ‰Đž СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ҃ҁĐĩ ҉Đĩ `None`, Ņ‚ĐžĐŧ҃ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ СаĐģĐ¸ŅˆĐ°Ņ”Ņ‚ŅŒŅŅ ĐŊĐĩОйОв'ŅĐˇĐēОвиĐŧ. + +АĐģĐĩ Ņ‚ĐĩĐŋĐĩŅ€, Đ´ĐžĐ´Đ°Đ˛ŅˆĐ¸ `Query(max_length=50)` Đ˛ŅĐĩŅ€ĐĩдиĐŊ҃ `Annotated`, Đŧи ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģŅŅ”ĐŧĐž FastAPI, Ņ‰Đž Ņ…ĐžŅ‡ĐĩĐŧĐž **Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņƒ ваĐģŅ–Đ´Đ°Ņ†Ņ–ŅŽ** Đ´ĐģŅ Ņ†ŅŒĐžĐŗĐž СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ — вОĐŊĐž ĐŧĐ°Ņ” ĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸ ĐŧаĐēŅĐ¸Đŧ҃Đŧ 50 ŅĐ¸ĐŧвОĐģŅ–Đ˛. 😎 + +/// tip | ĐŸŅ–Đ´ĐēаСĐēа + +Ми виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”ĐŧĐž `Query()`, ĐžŅĐēŅ–ĐģҌĐēи ҆Đĩ **query ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ**. ДаĐģŅ– Đŧи Ņ€ĐžĐˇĐŗĐģŅĐŊĐĩĐŧĐž Ņ–ĐŊŅˆŅ– Đ˛Đ°Ņ€Ņ–Đ°ĐŊŅ‚Đ¸, ŅĐē-ĐžŅ‚ `Path()`, `Body()`, `Header()` Ņ‚Đ° `Cookie()`, ŅĐēŅ– ĐŋŅ€Đ¸ĐšĐŧĐ°ŅŽŅ‚ŅŒ ҂Җ ŅĐ°ĐŧŅ– Đ°Ņ€ĐŗŅƒĐŧĐĩĐŊŅ‚Đ¸, Ņ‰Đž Đš `Query()`. + +/// + +ĐĸĐĩĐŋĐĩŅ€ FastAPI: + +* **ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đ¸Ņ‚ŅŒ** даĐŊŅ–, Ņ‰ĐžĐą ĐŋĐĩŅ€ĐĩĐēĐžĐŊĐ°Ņ‚Đ¸ŅŅ, Ņ‰Đž Ņ—Ņ…ĐŊŅ дОвĐļиĐŊа ĐŊĐĩ ĐŋĐĩŅ€ĐĩĐ˛Đ¸Ņ‰ŅƒŅ” 50 ŅĐ¸ĐŧвОĐģŅ–Đ˛ +* ПоĐēаĐļe **҇Җ҂Đē҃ ĐŋĐžĐŧиĐģĐē҃** ĐēĐģŅ–Ņ”ĐŊŅ‚Ņƒ, ŅĐēŅ‰Đž даĐŊŅ– ĐŊĐĩĐ´Ņ–ĐšŅĐŊŅ– +* **ЗадоĐē҃ĐŧĐĩĐŊŅ‚ŅƒŅ”** ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ в OpenAPI-ҁ҅ĐĩĐŧŅ– *ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ҈ĐģŅŅ…Ņƒ* (Ņ‰Đž Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐˇĐ¸Ņ‚ŅŒŅŅ в **Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐˇĐŗĐĩĐŊĐĩŅ€ĐžĐ˛Đ°ĐŊŅ–Đš Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ—**) + +## АĐģŅŒŅ‚ĐĩŅ€ĐŊĐ°Ņ‚Đ¸Đ˛ĐŊиК (ĐˇĐ°ŅŅ‚Đ°Ņ€Ņ–ĐģиК) ĐŧĐĩŅ‚ĐžĐ´: Query ŅĐē СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ + +ĐŖ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅ–Ņ… вĐĩŅ€ŅŅ–ŅŅ… FastAPI (Đ´Đž 0.95.0) `Query` виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Đ˛ŅŅ ŅĐē СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ Đ´ĐģŅ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ°, а ĐŊĐĩ Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– `Annotated`. Ви, ĐšĐŧĐžĐ˛Ņ–Ņ€ĐŊĐž, ĐŋĐžĐąĐ°Ņ‡Đ¸Ņ‚Đĩ ĐēОд, ŅĐēиК виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” ҆ĐĩĐš ĐŋŅ–Đ´Ņ…Ņ–Đ´, Ņ‚ĐžĐŧ҃ Đ˛Đ°Ņ€Ņ‚Đž Ņ€ĐžĐˇĐŗĐģŅĐŊŅƒŅ‚Đ¸ ĐšĐžĐŗĐž. + +/// tip | ĐŸŅ–Đ´ĐēаСĐēа + +ДĐģŅ ĐŊĐžĐ˛ĐžĐŗĐž ĐēĐžĐ´Ņƒ Ņ‚Đ° ĐēĐžĐģи ҆Đĩ ĐŧĐžĐļĐģивО, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ `Annotated`, ŅĐē ĐŋĐžĐēаСаĐŊĐž Đ˛Đ¸Ņ‰Đĩ. ĐĻĐĩ ĐŧĐ°Ņ” ĐąĐ°ĐŗĐ°Ņ‚Đž ĐŋĐĩŅ€ĐĩĐ˛Đ°Đŗ (ĐŋĐžŅŅĐŊĐĩĐŊĐ¸Ņ… ĐŊиĐļ҇Đĩ) Ņ– ĐŊĐĩ ĐŧĐ°Ņ” ĐŊĐĩĐ´ĐžĐģŅ–ĐēŅ–Đ˛. 🍰 + +/// + +РаĐŊŅ–ŅˆĐĩ Đŧи ĐŋĐ¸ŅĐ°Đģи `Query()` ŅĐē СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ Đ´ĐģŅ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° Ņ„ŅƒĐŊĐē҆Җҗ, Đ˛ŅŅ‚Đ°ĐŊОвĐģŅŽŅŽŅ‡Đ¸ `max_length` ҃ 50: + +{* ../../docs_src/query_params_str_validations/tutorial002_py310.py hl[7] *} + +ĐžŅĐēŅ–ĐģҌĐēи в Ņ†ŅŒĐžĐŧ҃ виĐŋадĐē҃ (ĐąĐĩС `Annotated`) ĐŊаĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž СаĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ `None` ҃ Ņ„ŅƒĐŊĐē҆Җҗ ĐŊа `Query()`, Ņ‚ĐĩĐŋĐĩŅ€ Đŧи ĐŋОвиĐŊĐŊŅ– ŅĐ˛ĐŊĐž Đ˛ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ҇ĐĩŅ€ĐĩС ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `Query(default=None)`. ĐĻĐĩ виĐēĐžĐŊŅƒŅ” Ņ‚Ņƒ ŅĐ°Đŧ҃ Ņ€ĐžĐģҌ виСĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ (ĐŋŅ€Đ¸ĐŊаКĐŧĐŊŅ– Đ´ĐģŅ FastAPI). + +ĐĸаĐēиĐŧ Ņ‡Đ¸ĐŊĐžĐŧ: + +```Python +q: str | None = Query(default=None) +``` + +...Ņ€ĐžĐąĐ¸Ņ‚ŅŒ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ĐŊĐĩĐžĐąĐžĐ˛â€™ŅĐˇĐēОвиĐŧ ĐˇŅ– СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ `None`, Ņ‰Đž ĐĩĐēĐ˛Ņ–Đ˛Đ°ĐģĐĩĐŊŅ‚ĐŊĐž: + + +```Python +q: str | None = None +``` +АĐģĐĩ ҃ вĐĩҀҁҖҗ С `Query` Đŧи ŅĐ˛ĐŊĐž вĐēĐ°ĐˇŅƒŅ”ĐŧĐž, Ņ‰Đž ҆Đĩ query ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ. + +ДаĐģŅ– Đŧи ĐŧĐžĐļĐĩĐŧĐž ĐŋĐĩŅ€ĐĩĐ´Đ°Đ˛Đ°Ņ‚Đ¸ `Query` Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸, СОĐēŅ€ĐĩĐŧа `max_length`, ŅĐēиК ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´Đž Ņ€ŅĐ´ĐēŅ–Đ˛: + +```Python +q: str | None = Query(default=None, max_length=50) +``` + +ĐĻĐĩ СайĐĩСĐŋĐĩŅ‡Đ¸Ņ‚ŅŒ ваĐģŅ–Đ´Đ°Ņ†Ņ–ŅŽ даĐŊĐ¸Ņ…, вивĐĩĐ´Đĩ ĐˇŅ€ĐžĐˇŅƒĐŧŅ–Đģ҃ ĐŋĐžĐŧиĐģĐē҃ ҃ Ņ€Đ°ĐˇŅ– ĐŊĐĩĐ´Ņ–ĐšŅĐŊĐ¸Ņ… даĐŊĐ¸Ņ… Ņ– СадОĐē҃ĐŧĐĩĐŊŅ‚ŅƒŅ” ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ҃ ҁ҅ĐĩĐŧŅ– OpenAPI *ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ҈ĐģŅŅ…Ņƒ*. + +### `Query` ŅĐē СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ айО Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– `Annotated` + +ВаĐļĐģивО ĐŋаĐŧâ€™ŅŅ‚Đ°Ņ‚Đ¸, ŅĐēŅ‰Đž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `Query` Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– `Annotated`, ĐŊĐĩ ĐŧĐžĐļĐŊа ĐˇĐ°Đ´Đ°Đ˛Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `default` ҃ `Query`. + +ЗаĐŧŅ–ŅŅ‚ŅŒ Ņ†ŅŒĐžĐŗĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ҃ ŅĐ°ĐŧŅ–Đš Ņ„ŅƒĐŊĐē҆Җҗ. ІĐŊаĐē҈Đĩ ҆Đĩ ĐąŅƒĐ´Đĩ ĐŊĐĩĐģĐžĐŗŅ–Ņ‡ĐŊĐž. + +НаĐŋŅ€Đ¸ĐēĐģад, ҆ĐĩĐš Đ˛Đ°Ņ€Ņ–Đ°ĐŊŅ‚ Ņ” ĐŊĐĩĐēĐžŅ€ĐĩĐēŅ‚ĐŊиĐŧ: + +```Python +q: Annotated[str, Query(default="rick")] = "morty" +``` + +...Ņ‚ĐžĐŧ҃, Ņ‰Đž ĐŊĐĩ ĐˇŅ€ĐžĐˇŅƒĐŧŅ–ĐģĐž, ŅĐēĐĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐŧĐ°Ņ” ĐąŅƒŅ‚Đ¸ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ: `"rick"` Ņ‡Đ¸ `"morty"`. + +ĐšĐžŅ€ĐĩĐēŅ‚ĐŊŅ– Đ˛Đ°Ņ€Ņ–Đ°ĐŊŅ‚Đ¸: + +```Python +q: Annotated[str, Query()] = "rick" +``` + +...айО ҃ ŅŅ‚Đ°Ņ€Đ¸Ņ… ĐēĐžĐ´ĐžĐ˛Đ¸Ņ… ĐąĐ°ĐˇĐ°Ņ… Ви СĐŊаКдĐĩŅ‚Đĩ: + +```Python +q: str = Query(default="rick") +``` + +### ПĐĩŅ€ĐĩĐ˛Đ°ĐŗĐ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ `Annotated` + +**ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ `Annotated` Ņ” Ņ€ĐĩĐēĐžĐŧĐĩĐŊдОваĐŊиĐŧ** СаĐŧŅ–ŅŅ‚ŅŒ СадаĐŊĐŊŅ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ҃ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ°Ņ… Ņ„ŅƒĐŊĐē҆Җҗ, ĐžŅĐēŅ–ĐģҌĐēи вОĐŊĐž **ĐēŅ€Đ°Ņ‰Đĩ** С ĐēŅ–ĐģҌĐēĐžŅ… ĐŋŅ€Đ¸Ņ‡Đ¸ĐŊ. 🤓 + +ЗĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ **Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ** ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° **Ņ„ŅƒĐŊĐē҆Җҗ** Ņ” ĐšĐžĐŗĐž **Ņ„Đ°ĐēŅ‚Đ¸Ņ‡ĐŊиĐŧ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ**, Ņ‰Đž Ņ” ĐąŅ–ĐģҌ҈ Ņ–ĐŊŅ‚ŅƒŅ—Ņ‚Đ¸Đ˛ĐŊиĐŧ ҃ Python ĐˇĐ°ĐŗĐ°ĐģĐžĐŧ. 😌 + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ **виĐēĐģиĐēĐ°Ņ‚Đ¸** Ņ‚Ņƒ ŅĐ°Đŧ҃ Ņ„ŅƒĐŊĐēŅ†Ņ–ŅŽ **в Ņ–ĐŊŅˆĐ¸Ņ… ĐŧŅ–ŅŅ†ŅŅ…** ĐąĐĩС FastAPI, Ņ– вОĐŊа **ĐŋŅ€Đ°Ņ†ŅŽĐ˛Đ°Ņ‚Đ¸ĐŧĐĩ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐž**. Đ¯ĐēŅ‰Đž ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ Ņ” **ĐžĐąĐžĐ˛â€™ŅĐˇĐēОвиĐŧ** (ĐąĐĩС СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ), Đ’Đ°Ņˆ **Ņ€ĐĩдаĐēŅ‚ĐžŅ€** ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐ¸Ņ‚ŅŒ ĐŋŅ€Đž ĐŋĐžĐŧиĐģĐē҃, а **Python** Ņ‚Đ°ĐēĐžĐļ Đ˛Đ¸Đ´Đ°ŅŅ‚ŅŒ ĐŋĐžĐŧиĐģĐē҃, ŅĐēŅ‰Đž Ви виĐēĐžĐŊĐ°Ņ”Ņ‚Đĩ Ņ„ŅƒĐŊĐēŅ†Ņ–ŅŽ ĐąĐĩС ĐŋĐĩŅ€ĐĩдаваĐŊĐŊŅ Ņ†ŅŒĐžĐŗĐž ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ°. + +Đ¯ĐēŅ‰Đž Ви ĐŊĐĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ `Annotated`, а виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ **(ŅŅ‚Đ°Ņ€Đ¸Đš) ŅŅ‚Đ¸ĐģҌ СĐŊĐ°Ņ‡ĐĩĐŊҌ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ**, Ņ‚Đž ĐŋŅ€Đ¸ виĐēĐģиĐē҃ ҆ҖҔҗ Ņ„ŅƒĐŊĐē҆Җҗ ĐąĐĩС FastAPI **в Ņ–ĐŊŅˆĐ¸Ņ… ĐŧŅ–ŅŅ†ŅŅ…**, ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž **ĐŊĐĩ ĐˇĐ°ĐąŅƒŅ‚Đ¸** ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‚Đ¸ Ņ—Đš Đ°Ņ€ĐŗŅƒĐŧĐĩĐŊŅ‚Đ¸, Ņ–ĐŊаĐē҈Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐąŅƒĐ´ŅƒŅ‚ŅŒ Đ˛Ņ–Đ´Ņ€Ņ–ĐˇĐŊŅŅ‚Đ¸ŅŅ Đ˛Ņ–Đ´ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐ¸Ņ… (ĐŊаĐŋŅ€Đ¸ĐēĐģад, Ви ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ”Ņ‚Đĩ `QueryInfo` айО ĐŋĐžĐ´Ņ–ĐąĐŊĐĩ СаĐŧŅ–ŅŅ‚ŅŒ `str`). Đ’Đ°Ņˆ Ņ€ĐĩдаĐēŅ‚ĐžŅ€ ĐŊĐĩ ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐ¸Ņ‚ŅŒ ĐŋŅ€Đž ĐŋĐžĐŧиĐģĐē҃, Ņ– Python Ņ‚Đ°ĐēĐžĐļ ĐŊĐĩ Đ˛Đ¸Đ´Đ°ŅŅ‚ŅŒ ĐŋĐžĐŧиĐģĐē҃ ĐŋŅ€Đ¸ СаĐŋ҃ҁĐē҃ Ņ„ŅƒĐŊĐē҆Җҗ, ĐŋĐžĐēи ĐŊĐĩ виĐŊиĐēĐŊĐĩ ĐŋĐžĐŧиĐģĐēа ĐŋŅ–Đ´ Ņ‡Đ°Ņ виĐēĐžĐŊаĐŊĐŊŅ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Đš ҃ҁĐĩŅ€ĐĩдиĐŊŅ–. + +ĐžŅĐēŅ–ĐģҌĐēи `Annotated` ĐŧĐžĐļĐĩ ĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸ ĐēŅ–ĐģҌĐēа аĐŊĐžŅ‚Đ°Ņ†Ņ–Đš ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐ¸Ņ…, Ви ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ‚Ņƒ ŅĐ°Đŧ҃ Ņ„ŅƒĐŊĐēŅ†Ņ–ŅŽ С Ņ–ĐŊŅˆĐ¸Đŧи Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Đ°Đŧи, Ņ‚Đ°ĐēиĐŧи ŅĐē Typer. 🚀 + +## ДодаваĐŊĐŊŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Đ¸Ņ… ваĐģŅ–Đ´Đ°Ņ†Ņ–Đš + +Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ Đ´ĐžĐ´Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `min_length`: + +{* ../../docs_src/query_params_str_validations/tutorial003_an_py310.py hl[10] *} + +## ДодаваĐŊĐŊŅ Ņ€ĐĩĐŗŅƒĐģŅŅ€ĐŊĐ¸Ņ… Đ˛Đ¸Ņ€Đ°ĐˇŅ–Đ˛ + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ виСĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸ Ņ€ĐĩĐŗŅƒĐģŅŅ€ĐŊиК Đ˛Đ¸Ņ€Đ°Đˇ pattern, ŅĐēĐžĐŧ҃ ĐŧĐ°Ņ” Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ: + +{* ../../docs_src/query_params_str_validations/tutorial004_an_py310.py hl[11] *} + +ĐĻĐĩĐš ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊиК ŅˆĐ°ĐąĐģĐžĐŊ Ņ€ĐĩĐŗŅƒĐģŅŅ€ĐŊĐžĐŗĐž Đ˛Đ¸Ņ€Đ°ĐˇŅƒ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ”, Ņ‰Đž ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ°: + +* `^`: ĐŋĐžŅ‡Đ¸ĐŊĐ°Ņ”Ņ‚ŅŒŅŅ С ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐ¸Ņ… ŅĐ¸ĐŧвОĐģŅ–Đ˛, ĐŋĐĩŅ€ĐĩĐ´ ŅĐēиĐŧи ĐŊĐĩĐŧĐ°Ņ” Ņ–ĐŊŅˆĐ¸Ņ… ŅĐ¸ĐŧвОĐģŅ–Đ˛. +* `fixedquery`: Ņ‚ĐžŅ‡ĐŊĐž Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ” СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅŽ `fixedquery`. +* `$`: СаĐēŅ–ĐŊŅ‡ŅƒŅ”Ņ‚ŅŒŅŅ Ņ‚ŅƒŅ‚, ĐŋҖҁĐģŅ `fixedquery` ĐŊĐĩĐŧĐ°Ņ” ĐļОдĐŊĐ¸Ņ… ŅĐ¸ĐŧвОĐģŅ–Đ˛. + +Đ¯ĐēŅ‰Đž Ви ĐŋĐžŅ‡ŅƒĐ˛Đ°Ņ”Ņ‚ĐĩŅŅ Ņ€ĐžĐˇĐŗŅƒĐąĐģĐĩĐŊĐž Ņ‰ĐžĐ´Đž **"Ņ€ĐĩĐŗŅƒĐģŅŅ€ĐŊĐ¸Ņ… Đ˛Đ¸Ņ€Đ°ĐˇŅ–Đ˛"**, ĐŊĐĩ Ņ…Đ˛Đ¸ĐģŅŽĐšŅ‚ĐĩŅŅ. ВоĐŊи Ņ” ҁĐēĐģадĐŊĐžŅŽ Ņ‚ĐĩĐŧĐžŅŽ Đ´ĐģŅ ĐąĐ°ĐŗĐ°Ņ‚ŅŒĐžŅ… ĐģŅŽĐ´ĐĩĐš. Ви Đ˛ŅĐĩ ОдĐŊĐž ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇŅ€ĐžĐąĐ¸Ņ‚Đ¸ ĐąĐ°ĐŗĐ°Ņ‚Đž Ņ€Đĩ҇ĐĩĐš ĐąĐĩС Ņ—Ņ… виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ. + +АĐģĐĩ Ņ‚ĐĩĐŋĐĩŅ€ Ви СĐŊĐ°Ņ”Ņ‚Đĩ, Ņ‰Đž ĐēĐžĐģи вОĐŊи СĐŊадОйĐģŅŅ‚ŅŒŅŅ, Ņ—Ņ… ĐŧĐžĐļĐŊа ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ҃ **FastAPI**. + +### Pydantic v1 `regex` СаĐŧŅ–ŅŅ‚ŅŒ `pattern` + +До вĐĩҀҁҖҗ Pydantic 2 Ņ– FastAPI 0.100.0 ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ĐŊĐ°ĐˇĐ¸Đ˛Đ°Đ˛ŅŅ `regex` СаĐŧŅ–ŅŅ‚ŅŒ `pattern`, аĐģĐĩ Ņ‚ĐĩĐŋĐĩŅ€ Đ˛Ņ–ĐŊ ĐˇĐ°ŅŅ‚Đ°Ņ€Ņ–Đ˛. + +Ви Đ˛ŅĐĩ ҉Đĩ ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇŅƒŅŅ‚Ņ€Ņ–Ņ‚Đ¸ ĐēОд, ŅĐēиК виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” ĐšĐžĐŗĐž: + +//// tab | Pydantic v1 + +{* ../../docs_src/query_params_str_validations/tutorial004_regex_an_py310.py hl[11] *} + +//// + +АĐģĐĩ ĐŧĐ°ĐšŅ‚Đĩ ĐŊа ŅƒĐ˛Đ°ĐˇŅ–, Ņ‰Đž Đ˛Ņ–ĐŊ Ņ” ĐˇĐ°ŅŅ‚Đ°Ņ€Ņ–ĐģиĐŧ Ņ– ĐšĐžĐŗĐž ҁĐģŅ–Đ´ ĐžĐŊĐžĐ˛Đ¸Ņ‚Đ¸ Đ´Đž ĐŊĐžĐ˛ĐžĐŗĐž ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° `pattern`. 🤓 + +## ЗĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ, Đ˛Ņ–Đ´ĐŧŅ–ĐŊĐŊŅ– Đ˛Ņ–Đ´ `None`. + +НаĐŋŅ€Đ¸ĐēĐģад, ŅĐēŅ‰Đž Ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐžĐŗĐžĐģĐžŅĐ¸Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ СаĐŋĐ¸Ņ‚Ņƒ `q` С `min_length` `3` Ņ– СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ `"fixedquery"`: + +{* ../../docs_src/query_params_str_validations/tutorial005_an_py39.py hl[9] *} + +/// note | ĐĸĐĩŅ…ĐŊҖ҇ĐŊŅ– Đ´ĐĩŅ‚Đ°ĐģŅ– + +ĐĐ°ŅĐ˛ĐŊŅ–ŅŅ‚ŅŒ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ĐąŅƒĐ´ŅŒ-ŅĐēĐžĐŗĐž Ņ‚Đ¸Đŋ҃, вĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ `None`, Ņ€ĐžĐąĐ¸Ņ‚ŅŒ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ĐŊĐĩĐžĐąĐžĐ˛â€™ŅĐˇĐēОвиĐŧ (not required). + +/// + +## ĐžĐąĐžĐ˛â€™ŅĐˇĐēĐžĐ˛Ņ– ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ + +Đ¯ĐēŅ‰Đž ĐŊаĐŧ ĐŊĐĩ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž вĐēĐ°ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи айО ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊŅ–, Đŧи ĐŧĐžĐļĐĩĐŧĐž ĐˇŅ€ĐžĐąĐ¸Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `q` ĐžĐąĐžĐ˛â€™ŅĐˇĐēОвиĐŧ, ĐŋŅ€ĐžŅŅ‚Đž ĐŊĐĩ ĐžĐŗĐžĐģĐžŅˆŅƒŅŽŅ‡Đ¸ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ, ĐŊаĐŋŅ€Đ¸ĐēĐģад: + +```Python +q: str +``` + +СаĐŧŅ–ŅŅ‚ŅŒ: + +```Python +q: str | None = None +``` + +АĐģĐĩ Ņ‚ĐĩĐŋĐĩŅ€ Đŧи ĐžĐŗĐžĐģĐžŅˆŅƒŅ”ĐŧĐž ĐšĐžĐŗĐž С `Query`, ĐŊаĐŋŅ€Đ¸ĐēĐģад: + +//// tab | Annotated + +```Python +q: Annotated[str | None, Query(min_length=3)] = None +``` + +//// + +ĐĸĐžĐŧ҃, ŅĐēŅ‰Đž ВаĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐˇŅ€ĐžĐąĐ¸Ņ‚Đ¸ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐžĐąĐžĐ˛â€™ŅĐˇĐēОвиĐŧ, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ `Query`, ĐŋŅ€ĐžŅŅ‚Đž ĐŊĐĩ вĐēĐ°ĐˇŅƒĐšŅ‚Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ: + +{* ../../docs_src/query_params_str_validations/tutorial006_an_py39.py hl[9] *} + +### ĐžĐąĐžĐ˛â€™ŅĐˇĐēОвĐĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ, ŅĐēĐĩ ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ `None` + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐ°ĐˇĐ°Ņ‚Đ¸, Ņ‰Đž ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ĐŧĐžĐļĐĩ ĐŋŅ€Đ¸ĐšĐŧĐ°Ņ‚Đ¸ `None`, аĐģĐĩ ĐŋŅ€Đ¸ Ņ†ŅŒĐžĐŧ҃ СаĐģĐ¸ŅˆĐ°Ņ”Ņ‚ŅŒŅŅ ĐžĐąĐžĐ˛â€™ŅĐˇĐēОвиĐŧ. ĐĻĐĩ СĐŧŅƒŅĐ¸Ņ‚ŅŒ ĐēĐģŅ–Ņ”ĐŊŅ‚Ņ–Đ˛ ĐŊĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ, ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ŅĐēŅ‰Đž вОĐŊĐž Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” `None`. + +ЊОй ĐˇŅ€ĐžĐąĐ¸Ņ‚Đ¸ ҆Đĩ, ĐžĐŗĐžĐģĐžŅŅ–Ņ‚ŅŒ, Ņ‰Đž `None` Ņ” Đ´ĐžĐŋŅƒŅŅ‚Đ¸ĐŧиĐŧ Ņ‚Đ¸ĐŋĐžĐŧ, аĐģĐĩ ĐŊĐĩ вĐēĐ°ĐˇŅƒĐšŅ‚Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ: + +{* ../../docs_src/query_params_str_validations/tutorial006c_an_py310.py hl[9] *} + +## ĐĄĐŋĐ¸ŅĐžĐē ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛ СаĐŋĐ¸Ņ‚Ņƒ / ĐēŅ–ĐģҌĐēа СĐŊĐ°Ņ‡ĐĩĐŊҌ + +Đ¯ĐēŅ‰Đž Ви виСĐŊĐ°Ņ‡Đ°Ņ”Ņ‚Đĩ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ СаĐŋĐ¸Ņ‚Ņƒ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ `Query`, Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ дОСвОĐģĐ¸Ņ‚Đ¸ ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ ҁĐŋĐ¸ŅĐē҃ СĐŊĐ°Ņ‡ĐĩĐŊҌ, Ņ‚ĐžĐąŅ‚Đž дОСвОĐģĐ¸Ņ‚Đ¸ ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ ĐēŅ–ĐģҌĐēĐžŅ… СĐŊĐ°Ņ‡ĐĩĐŊҌ. + +НаĐŋŅ€Đ¸ĐēĐģад, Ņ‰ĐžĐą дОСвОĐģĐ¸Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņƒ СаĐŋĐ¸Ņ‚Ņƒ `q` С'ŅĐ˛ĐģŅŅ‚Đ¸ŅŅ ĐēŅ–ĐģҌĐēа Ņ€Đ°ĐˇŅ–Đ˛ в URL, ĐŧĐžĐļĐŊа ĐŊаĐŋĐ¸ŅĐ°Ņ‚Đ¸: + +{* ../../docs_src/query_params_str_validations/tutorial011_an_py310.py hl[9] *} + +ĐĸĐžĐ´Ņ–, ҃ виĐŋадĐē҃ СаĐŋĐ¸Ņ‚Ņƒ Са URL: + +``` +http://localhost:8000/items/?q=foo&q=bar +``` + +Ви ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ”Ņ‚Đĩ ĐēŅ–ĐģҌĐēа СĐŊĐ°Ņ‡ĐĩĐŊҌ *query ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ°* `q` (`foo` Ņ– `bar`) ҃ Đ˛Đ¸ĐŗĐģŅĐ´Ņ– ҁĐŋĐ¸ŅĐē҃ `list` в Python ҃ Đ’Đ°ŅˆŅ–Đš *Ņ„ŅƒĐŊĐē҆Җҗ ĐžĐąŅ€ĐžĐąĐēи ҈ĐģŅŅ…Ņƒ*, ҃ *ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂ҀҖ Ņ„ŅƒĐŊĐē҆Җҗ* `q`. + +ĐžŅ‚ĐļĐĩ, Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ ĐŊа ҆ĐĩĐš URL ĐąŅƒĐ´Đĩ: + +```JSON +{ + "q": [ + "foo", + "bar" + ] +} +``` + +/// tip | ĐŸŅ–Đ´ĐēаСĐēа + +ЊОй ĐžĐŗĐžĐģĐžŅĐ¸Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ СаĐŋĐ¸Ņ‚Ņƒ С Ņ‚Đ¸ĐŋĐžĐŧ `list`, ŅĐē ҃ ĐŊавĐĩĐ´ĐĩĐŊĐžĐŧ҃ Đ˛Đ¸Ņ‰Đĩ ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņ–, ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ŅĐ˛ĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `Query`, Ņ–ĐŊаĐē҈Đĩ Đ˛Ņ–ĐŊ ĐąŅƒĐ´Đĩ Ņ–ĐŊŅ‚ĐĩŅ€ĐŋŅ€ĐĩŅ‚ĐžĐ˛Đ°ĐŊиК ŅĐē ҂ҖĐģĐž СаĐŋĐ¸Ņ‚Ņƒ. + +/// + +ІĐŊŅ‚ĐĩŅ€Đ°ĐēŅ‚Đ¸Đ˛ĐŊа API-Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ ĐžĐŊĐžĐ˛Đ¸Ņ‚ŅŒŅŅ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊĐž, дОСвОĐģŅŅŽŅ‡Đ¸ ĐŋĐĩŅ€ĐĩĐ´Đ°Đ˛Đ°Ņ‚Đ¸ ĐēŅ–ĐģҌĐēа СĐŊĐ°Ņ‡ĐĩĐŊҌ: + + + +### ĐĄĐŋĐ¸ŅĐžĐē ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛ СаĐŋĐ¸Ņ‚Ņƒ / ĐēŅ–ĐģҌĐēа СĐŊĐ°Ņ‡ĐĩĐŊҌ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ + +Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ виСĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ Đ´ĐģŅ `list`, ŅĐēŅ‰Đž ĐļОдĐŊĐĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐŊĐĩ ĐąŅƒĐģĐž ĐŋĐĩŅ€ĐĩдаĐŊĐĩ: + +{* ../../docs_src/query_params_str_validations/tutorial012_an_py39.py hl[9] *} + +Đ¯ĐēŅ‰Đž Ви ĐŋĐĩŅ€ĐĩКдĐĩŅ‚Đĩ Са ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅĐŧ: + +``` +http://localhost:8000/items/ +``` + +Ņ‚Đž СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ `q` Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ĐąŅƒĐ´Đĩ: `["foo", "bar"]`, Ņ– Đ’Đ°ŅˆĐ° Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ Đ˛Đ¸ĐŗĐģŅĐ´Đ°Ņ‚Đ¸ĐŧĐĩ Ņ‚Đ°Đē: + +```JSON +{ + "q": [ + "foo", + "bar" + ] +} +``` + +#### ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ ҂ҖĐģҌĐēи `list` + +Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `list` ĐąĐĩС ŅƒŅ‚ĐžŅ‡ĐŊĐĩĐŊĐŊŅ Ņ‚Đ¸Đŋ҃, СаĐŧŅ–ŅŅ‚ŅŒ `list[str]`: + +{* ../../docs_src/query_params_str_validations/tutorial013_an_py39.py hl[9] *} + +/// note | ĐĸĐĩŅ…ĐŊҖ҇ĐŊŅ– Đ´ĐĩŅ‚Đ°ĐģŅ– + +ĐœĐ°ĐšŅ‚Đĩ ĐŊа ŅƒĐ˛Đ°ĐˇŅ–, Ņ‰Đž в Ņ†ŅŒĐžĐŧ҃ виĐŋадĐē҃ FastAPI ĐŊĐĩ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ‚Đ¸ĐŧĐĩ вĐŧҖҁ҂ ҁĐŋĐ¸ŅĐē҃. + +НаĐŋŅ€Đ¸ĐēĐģад, `list[int]` ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ‚Đ¸ĐŧĐĩ (Ņ– Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ĐŧĐĩ), Ņ‰Đž Đ˛ŅŅ– ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸ ҁĐŋĐ¸ŅĐē҃ Ņ” ҆ҖĐģиĐŧи Ņ‡Đ¸ŅĐģаĐŧи. АĐģĐĩ `list` ĐąĐĩС ŅƒŅ‚ĐžŅ‡ĐŊĐĩĐŊĐŊŅ Ņ†ŅŒĐžĐŗĐž ĐŊĐĩ Ņ€ĐžĐąĐ¸Ņ‚Đ¸ĐŧĐĩ. + +/// + +## ДодаваĐŊĐŊŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Đ¸Ņ… ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐ¸Ņ… + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ´ĐžĐ´Đ°Ņ‚Đ¸ ĐąŅ–ĐģҌ҈Đĩ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŋŅ€Đž ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ. + +ĐĻŅ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ ĐąŅƒĐ´Đĩ вĐēĐģŅŽŅ‡ĐĩĐŊа ҃ ĐˇĐŗĐĩĐŊĐĩŅ€ĐžĐ˛Đ°ĐŊиК OpenAPI Ņ‚Đ° виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊа в Ņ–ĐŊŅ‚ĐĩҀ҄ĐĩĐšŅĐ°Ņ… Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— Ņ‚Đ° СОвĐŊŅ–ŅˆĐŊŅ–Ņ… Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Đ°Ņ…. + +/// note | ĐĸĐĩŅ…ĐŊҖ҇ĐŊŅ– Đ´ĐĩŅ‚Đ°ĐģŅ– + +ĐœĐ°ĐšŅ‚Đĩ ĐŊа ŅƒĐ˛Đ°ĐˇŅ–, Ņ‰Đž Ņ€Ņ–ĐˇĐŊŅ– Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Đ¸ ĐŧĐžĐļŅƒŅ‚ŅŒ ĐŧĐ°Ņ‚Đ¸ Ņ€Ņ–ĐˇĐŊиК Ņ€Ņ–Đ˛ĐĩĐŊҌ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐēи OpenAPI. + +ДĐĩŅĐēŅ– С ĐŊĐ¸Ņ… ĐŧĐžĐļŅƒŅ‚ŅŒ ҉Đĩ ĐŊĐĩ Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°Ņ‚Đ¸ Đ˛ŅŅŽ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņƒ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ, Ņ…ĐžŅ‡Đ° в ĐąŅ–ĐģŅŒŅˆĐžŅŅ‚Ņ– виĐŋадĐēŅ–Đ˛ Ņ†Ņ Ņ„ŅƒĐŊĐēŅ†Ņ–Ņ вĐļĐĩ СаĐŋĐģаĐŊОваĐŊа Đ´ĐģŅ Ņ€ĐžĐˇŅ€ĐžĐąĐēи. + +/// + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ´ĐžĐ´Đ°Ņ‚Đ¸ `title` : + +{* ../../docs_src/query_params_str_validations/tutorial007_an_py310.py hl[10] *} + +А Ņ‚Đ°ĐēĐžĐļ `description`: + +{* ../../docs_src/query_params_str_validations/tutorial008_an_py310.py hl[14] *} + +## АĐģŅ–Đ°ŅĐ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛ + +ĐŖŅĐ˛Ņ–Ņ‚ŅŒ, Ņ‰Đž Ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ, Ņ‰ĐžĐą ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ĐŊĐ°ĐˇĐ¸Đ˛Đ°Đ˛ŅŅ `item-query`. + +НаĐŋŅ€Đ¸ĐēĐģад: + +``` +http://127.0.0.1:8000/items/?item-query=foobaritems +``` + +АĐģĐĩ `item-query` — ҆Đĩ ĐŊĐĩĐēĐžŅ€ĐĩĐēŅ‚ĐŊа ĐŊаСва СĐŧŅ–ĐŊĐŊĐžŅ— в Python. + +НайбĐģиĐļŅ‡Đ¸Đš Đ´ĐžĐŋŅƒŅŅ‚Đ¸ĐŧиК Đ˛Đ°Ņ€Ņ–Đ°ĐŊŅ‚ — `item_query`. + +ĐŸŅ€ĐžŅ‚Đĩ ВаĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž, Ņ‰ĐžĐą ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ СаĐģĐ¸ŅˆĐ°Đ˛ŅŅ ŅĐ°ĐŧĐĩ `item-query`... + +ĐŖ Ņ‚Đ°ĐēĐžĐŧ҃ виĐŋадĐē҃ ĐŧĐžĐļĐŊа ĐžĐŗĐžĐģĐžŅĐ¸Ņ‚Đ¸ `alias`, Ņ– ŅĐ°ĐŧĐĩ Đ˛Ņ–ĐŊ ĐąŅƒĐ´Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ŅŅ Đ´ĐģŅ ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ°: + +{* ../../docs_src/query_params_str_validations/tutorial009_an_py310.py hl[9] *} + +## ВивĐĩĐ´ĐĩĐŊĐŊŅ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛ ŅĐē ĐˇĐ°ŅŅ‚Đ°Ņ€Ņ–ĐģĐ¸Ņ… + +ĐŸŅ€Đ¸ĐŋŅƒŅŅ‚Đ¸ĐŧĐž, Ņ‰Đž Ви ĐąŅ–ĐģҌ҈Đĩ ĐŊĐĩ Ņ…ĐžŅ‡ĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ҆ĐĩĐš ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ. + +ВаĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž СаĐģĐ¸ŅˆĐ¸Ņ‚Đ¸ ĐšĐžĐŗĐž ĐŊа Đ´ĐĩŅĐēиК Ņ‡Đ°Ņ, ĐžŅĐēŅ–ĐģҌĐēи ĐŊиĐŧ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒŅŽŅ‚ŅŒŅŅ ĐēĐģŅ–Ņ”ĐŊŅ‚Đ¸, аĐģĐĩ Ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ, Ņ‰ĐžĐą Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ ҇Җ҂ĐēĐž ĐŋĐžĐēĐ°ĐˇŅƒĐ˛Đ°Đģа, Ņ‰Đž Đ˛Ņ–ĐŊ Ņ” ĐˇĐ°ŅŅ‚Đ°Ņ€Ņ–ĐģиĐŧ. + +ĐĸĐžĐ´Ņ– Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `deprecated=True` Đ´Đž `Query`: + +{* ../../docs_src/query_params_str_validations/tutorial010_an_py310.py hl[19] *} + +ДоĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ ĐąŅƒĐ´Đĩ ĐŋĐžĐēĐ°ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ ҆Đĩ Ņ‚Đ°ĐēиĐŧ Ņ‡Đ¸ĐŊĐžĐŧ: + + + +## ВиĐŊŅŅ‚ĐžĐē ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛ С OpenAPI + +ЊОй виĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ СаĐŋĐ¸Ņ‚Ņƒ ĐˇŅ– ĐˇĐŗĐĩĐŊĐĩŅ€ĐžĐ˛Đ°ĐŊĐžŅ— ҁ҅ĐĩĐŧи OpenAPI (Ņ–, Ņ‚Đ°ĐēиĐŧ Ņ‡Đ¸ĐŊĐžĐŧ, С Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐ¸Ņ… ŅĐ¸ŅŅ‚ĐĩĐŧ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ—), Đ˛ŅŅ‚Đ°ĐŊĐžĐ˛Ņ–Ņ‚ŅŒ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `include_in_schema` Đ´ĐģŅ `Query` в `False`: + +{* ../../docs_src/query_params_str_validations/tutorial014_an_py310.py hl[10] *} + +## ĐšĐ°ŅŅ‚ĐžĐŧĐŊа ваĐģŅ–Đ´Đ°Ņ†Ņ–Ņ + +МоĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ виĐŋадĐēи, ĐēĐžĐģи ВаĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐŋŅ€ĐžĐ˛ĐĩŅŅ‚Đ¸ **ĐēĐ°ŅŅ‚ĐžĐŧĐŊ҃ ваĐģŅ–Đ´Đ°Ņ†Ņ–ŅŽ**, ŅĐē҃ ĐŊĐĩ ĐŧĐžĐļĐŊа Ņ€ĐĩаĐģŅ–ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛, ĐŋĐžĐēаСаĐŊĐ¸Ņ… Đ˛Đ¸Ņ‰Đĩ. + +ĐŖ Ņ‚Đ°ĐēĐ¸Ņ… виĐŋадĐēĐ°Ņ… ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ **ĐēĐ°ŅŅ‚ĐžĐŧĐŊ҃ Ņ„ŅƒĐŊĐēŅ†Ņ–ŅŽ ваĐģŅ–Đ´Đ°Ņ†Ņ–Ņ—**, ŅĐēа ĐąŅƒĐ´Đĩ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛Đ°ĐŊа ĐŋҖҁĐģŅ ĐˇĐ˛Đ¸Ņ‡Đ°ĐšĐŊĐžŅ— ваĐģŅ–Đ´Đ°Ņ†Ņ–Ņ— (ĐŊаĐŋŅ€Đ¸ĐēĐģад, ĐŋҖҁĐģŅ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи, Ņ‰Đž СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Ņ” Ņ‚Đ¸ĐŋĐžĐŧ `str`). + +ĐĻĐĩ ĐŧĐžĐļĐŊа Đ´ĐžŅŅĐŗŅ‚Đ¸ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ Pydantic's `AfterValidator` в ҁĐĩŅ€ĐĩдиĐŊŅ– `Annotated`. + +/// tip | ĐŸŅ–Đ´ĐēаСĐēа + +Pydantic Ņ‚Đ°ĐēĐžĐļ ĐŧĐ°Ņ” `BeforeValidator` Ņ‚Đ° Ņ–ĐŊŅˆŅ–. 🤓 + +/// + +НаĐŋŅ€Đ¸ĐēĐģад, ҆ĐĩĐš ĐēĐ°ŅŅ‚ĐžĐŧĐŊиК ваĐģŅ–Đ´Đ°Ņ‚ĐžŅ€ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ”, Ņ‡Đ¸ ĐŋĐžŅ‡Đ¸ĐŊĐ°Ņ”Ņ‚ŅŒŅŅ ID ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ° С `isbn-` Đ´ĐģŅ ĐŊĐžĐŧĐĩŅ€Đ° ĐēĐŊĐ¸ĐŗĐ¸ ISBN айО С `imdb-` Đ´ĐģŅ ID URL ҄ҖĐģҌĐŧ҃ ĐŊа IMDB: + +{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *} + +/// info | ІĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ + +ĐĻĐĩ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐž С вĐĩҀҁҖҗ Pydantic 2 айО Đ˛Đ¸Ņ‰Đĩ. 😎 + +/// + +/// tip | ĐŸŅ–Đ´ĐēаСĐēа + +Đ¯ĐēŅ‰Đž ВаĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž виĐēĐžĐŊĐ°Ņ‚Đ¸ ĐąŅƒĐ´ŅŒ-ŅĐē҃ ваĐģŅ–Đ´Đ°Ņ†Ņ–ŅŽ, ŅĐēа виĐŧĐ°ĐŗĐ°Ņ” Đ˛ĐˇĐ°Ņ”ĐŧĐžĐ´Ņ–Ņ— С ĐąŅƒĐ´ŅŒ-ŅĐēиĐŧ **СОвĐŊŅ–ŅˆĐŊŅ–Đŧ ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ‚ĐžĐŧ**, Ņ‚Đ°ĐēиĐŧ ŅĐē йаСа даĐŊĐ¸Ņ… Ņ‡Đ¸ Ņ–ĐŊŅˆĐ¸Đš API, ви ĐŋОвиĐŊĐŊŅ– СаĐŧŅ–ŅŅ‚ŅŒ Ņ†ŅŒĐžĐŗĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ **FastAPI Dependencies**. Ви Đ´Ņ–ĐˇĐŊĐ°Ņ”Ņ‚ĐĩҁҌ ĐŋŅ€Đž ĐŊĐ¸Ņ… ĐŋŅ–ĐˇĐŊŅ–ŅˆĐĩ. + +ĐĻŅ– ĐēĐ°ŅŅ‚ĐžĐŧĐŊŅ– ваĐģŅ–Đ´Đ°Ņ‚ĐžŅ€Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ Đ´ĐģŅ Ņ€Đĩ҇ĐĩĐš, ŅĐēŅ– ĐŧĐžĐļĐŊа ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đ¸Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С **Ņ‚Đ¸Đŧи даĐŊиĐŧи**, Ņ‰Đž ĐŊадаĐŊŅ– в СаĐŋĐ¸Ņ‚Ņ–. + +/// + +### Đ—Ņ€ĐžĐˇŅƒĐŧŅ–ĐšŅ‚Đĩ ҆ĐĩĐš ĐēОд + +ГоĐģОвĐŊиК ĐŧĐžĐŧĐĩĐŊŅ‚ – ҆Đĩ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ **`AfterValidator` С Ņ„ŅƒĐŊĐēŅ†Ņ–Ņ”ŅŽ Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– `Annotated`**. МоĐļĐĩŅ‚Đĩ ĐŋŅ€ĐžĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸ Ņ†ŅŽ Ņ‡Đ°ŅŅ‚Đ¸ĐŊ҃, ŅĐēŅ‰Đž Ņ…ĐžŅ‡ĐĩŅ‚Đĩ. 🤸 + +--- + +АĐģĐĩ ŅĐēŅ‰Đž ВаĐŧ ҆ҖĐēавО Ņ€ĐžĐˇŅ–ĐąŅ€Đ°Ņ‚Đ¸ŅŅ в Ņ†ŅŒĐžĐŧ҃ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊĐžĐŧ҃ ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņ– ĐēĐžĐ´Ņƒ Ņ– ВаĐŧ ҉Đĩ ĐŊĐĩ ĐŊĐ°ĐąŅ€Đ¸Đ´ĐģĐž, ĐžŅŅŒ ĐēŅ–ĐģҌĐēа Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Đ¸Ņ… Đ´ĐĩŅ‚Đ°ĐģĐĩĐš. + +#### Đ ŅĐ´ĐžĐē Ņ–Đˇ `value.startswith()` + +ЗвĐĩŅ€ĐŊ҃Đģи ŅƒĐ˛Đ°ĐŗŅƒ? Đ ŅĐ´ĐžĐē Ņ–Đˇ `value.startswith()` ĐŧĐžĐļĐĩ ĐŋŅ€Đ¸ĐšĐŧĐ°Ņ‚Đ¸ ĐēĐžŅ€Ņ‚ĐĩĐļ, Ņ– Ņ‚ĐžĐ´Ņ– Đ˛Ņ–ĐŊ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ‚Đ¸ĐŧĐĩ ĐēĐžĐļĐŊĐĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ в ĐēĐžŅ€Ņ‚ĐĩĐļŅ–: + +{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[16:19] hl[17] *} + +#### ВиĐŋадĐēОвиК ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ + +За Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ `data.items()` Đŧи ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”ĐŧĐž Ņ–Ņ‚ĐĩŅ€Đ°ĐąĐĩĐģҌĐŊиК Ой'Ņ”ĐēŅ‚ Ņ–Đˇ ĐēĐžŅ€Ņ‚ĐĩĐļаĐŧи, Ņ‰Đž ĐŧŅ–ŅŅ‚ŅŅ‚ŅŒ ĐēĐģŅŽŅ‡ Ņ– СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ° ҁĐģОвĐŊиĐēа. + +Ми ĐŋĐĩŅ€ĐĩŅ‚Đ˛ĐžŅ€ŅŽŅ”ĐŧĐž ҆ĐĩĐš Ņ–Ņ‚ĐĩŅ€Đ°ĐąĐĩĐģҌĐŊиК Ой'Ņ”ĐēŅ‚ ҃ ĐˇĐ˛Đ¸Ņ‡Đ°ĐšĐŊиК `list` Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ `list(data.items())`. + +ĐŸĐžŅ‚Ņ–Đŧ, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ `random.choice()`, Đŧи ĐŧĐžĐļĐĩĐŧĐž ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ виĐŋадĐēОвĐĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐˇŅ– ҁĐŋĐ¸ŅĐē҃, Ņ‚ĐžĐąŅ‚Đž ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”ĐŧĐž ĐēĐžŅ€Ņ‚ĐĩĐļ Ņ–Đˇ `(id, name)`. ĐĻĐĩ ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ Ņ‰ĐžŅŅŒ ĐŊа ĐˇŅ€Đ°ĐˇĐžĐē `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`. + +ДаĐģŅ– Đŧи **ĐŋŅ€Đ¸ŅĐ˛ĐžŅŽŅ”ĐŧĐž ҆Җ два СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ** ĐēĐžŅ€Ņ‚ĐĩĐļ҃ СĐŧŅ–ĐŊĐŊиĐŧ `id` Ņ– `name`. + +ĐĸĐžĐļ, ŅĐēŅ‰Đž ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡ ĐŊĐĩ вĐēаСав ID ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ°, Đ˛Ņ–ĐŊ Đ˛ŅĐĩ ОдĐŊĐž ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ” виĐŋадĐēĐžĐ˛Ņƒ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´Đ°Ņ†Ņ–ŅŽ. + +...Ņ– Đ˛ŅĐĩ ҆Đĩ Ņ€ĐĩаĐģŅ–ĐˇĐžĐ˛Đ°ĐŊĐž в **ОдĐŊĐžĐŧ҃ Ņ€ŅĐ´Đē҃ ĐēĐžĐ´Ņƒ**. đŸ¤¯ ĐĨŅ–ĐąĐ° ĐŊĐĩ ĐŋŅ€ĐĩĐēŅ€Đ°ŅĐŊиК Python? 🐍 + +{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[22:30] hl[29] *} + +## ĐŸŅ–Đ´ŅŅƒĐŧĐžĐē + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐžĐŗĐžĐģĐžŅˆŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– ваĐģŅ–Đ´Đ°Ņ†Ņ–Ņ— Ņ‚Đ° ĐŧĐĩŅ‚Đ°Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ Đ´ĐģŅ ŅĐ˛ĐžŅ—Ņ… ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛. + +Đ—Đ°ĐŗĐ°ĐģҌĐŊŅ– ваĐģŅ–Đ´Đ°Ņ†Ņ–Ņ— Ņ‚Đ° ĐŧĐĩŅ‚Đ°Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ: + +* `alias` +* `title` +* `description` +* `deprecated` + +ВаĐģŅ–Đ´Đ°Ņ†Ņ–Ņ—, ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–Ņ‡ĐŊŅ– Đ´ĐģŅ Ņ€ŅĐ´ĐēŅ–Đ˛: + +* `min_length` +* `max_length` +* `pattern` + +ĐšĐ°ŅŅ‚ĐžĐŧĐŊŅ– ваĐģŅ–Đ´Đ°Ņ†Ņ–Ņ— Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ `AfterValidator`. + +ĐŖ Ņ†Đ¸Ņ… ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Đ°Ņ… Ви ĐŋĐžĐąĐ°Ņ‡Đ¸Đģи, ŅĐē ĐžĐŗĐžĐģĐžŅˆŅƒĐ˛Đ°Ņ‚Đ¸ ваĐģŅ–Đ´Đ°Ņ†Ņ–Ņ— Đ´ĐģŅ СĐŊĐ°Ņ‡ĐĩĐŊҌ `str`. + +Đ”Đ¸Đ˛Ņ–Ņ‚ŅŒŅŅ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊŅ– Ņ€ĐžĐˇĐ´Ņ–Đģи, Ņ‰ĐžĐą Đ´Ņ–ĐˇĐŊĐ°Ņ‚Đ¸ŅŅ, ŅĐē ĐžĐŗĐžĐģĐžŅˆŅƒĐ˛Đ°Ņ‚Đ¸ ваĐģŅ–Đ´Đ°Ņ†Ņ–Ņ— Đ´ĐģŅ Ņ–ĐŊŅˆĐ¸Ņ… Ņ‚Đ¸ĐŋŅ–Đ˛, ĐŊаĐŋŅ€Đ¸ĐēĐģад Ņ‡Đ¸ŅĐĩĐģ. diff --git a/docs/uk/docs/tutorial/response-model.md b/docs/uk/docs/tutorial/response-model.md new file mode 100644 index 000000000..def1f8a2d --- /dev/null +++ b/docs/uk/docs/tutorial/response-model.md @@ -0,0 +1,358 @@ +# МодĐĩĐģҌ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ– — ĐĸиĐŋ, Ņ‰Đž ĐŋОвĐĩŅ€Ņ‚Đ°Ņ”Ņ‚ŅŒŅŅ + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐžĐŗĐžĐģĐžŅĐ¸Ņ‚Đ¸ Ņ‚Đ¸Đŋ, ŅĐēиК виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ĐŧĐĩŅ‚ŅŒŅŅ ҃ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ–, Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ *аĐŊĐžŅ‚Đ°Ņ†Ņ–Ņ— Ņ‚Đ¸Đŋ҃, Ņ‰Đž ĐŋОвĐĩŅ€Ņ‚Đ°Ņ”Ņ‚ŅŒŅŅ* *Ņ„ŅƒĐŊĐēŅ†Ņ–Ņ”ŅŽ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ”ŅŽ ҈ĐģŅŅ…Ņƒ* (path operation) + +**АĐŊĐžŅ‚Đ°Ņ†Ņ–ŅŽ Ņ‚Đ¸Đŋ҃** ĐŧĐžĐļĐŊа вĐēĐ°ĐˇĐ°Ņ‚Đ¸ Ņ‚Đ°Đē ŅĐ°ĐŧĐž ŅĐē Ņ– Đ´ĐģŅ Đ˛Ņ…Ņ–Đ´ĐŊĐ¸Ņ… **ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛** Ņ„ŅƒĐŊĐē҆Җҗ: ҆Đĩ ĐŧĐžĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ ĐŧОдĐĩĐģŅ– Pydantic, ҁĐŋĐ¸ŅĐēи (lists), ҁĐģОвĐŊиĐēи (dictionaries), ҁĐēаĐģŅŅ€ĐŊŅ– СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ, ŅĐē-ĐžŅ‚ ҆ҖĐģŅ– Ņ‡Đ¸ŅĐģа (integers), ĐąŅƒĐģĐĩĐ˛Ņ– СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ (booleans) Ņ‚ĐžŅ‰Đž. + +{* ../../docs_src/response_model/tutorial001_01_py310.py hl[16,21] *} + +FastAPI виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ĐŧĐĩ ҆ĐĩĐš Ņ‚Đ¸Đŋ, Ņ‰ĐžĐą: + +* **ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đ¸Ņ‚Đ¸ ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊŅ–ŅŅ‚ŅŒ** ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐ¸Ņ… даĐŊĐ¸Ņ…. + * Đ¯ĐēŅ‰Đž даĐŊŅ– ĐŊĐĩ ваĐģŅ–Đ´ĐŊŅ– (ĐŊаĐŋŅ€Đ¸ĐēĐģад, Đ˛Ņ–Đ´ŅŅƒŅ‚ĐŊŅ” ĐŋĐžĐģĐĩ), ҆Đĩ ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž Đ’Đ°Ņˆ ĐēОд Đ´ĐžĐ´Đ°Ņ‚Đē҃ ĐŋŅ€Đ°Ņ†ŅŽŅ” ĐŊĐĩĐēĐžŅ€ĐĩĐēŅ‚ĐŊĐž Ņ– ĐŊĐĩ ĐŋОвĐĩŅ€Ņ‚Đ°Ņ” Ņ‚Đĩ, Ņ‰Đž ĐŋОвиĐŊĐĩĐŊ. ĐŖ Ņ‚Đ°ĐēĐžĐŧ҃ виĐŋадĐē҃ FastAPI ĐŋОвĐĩŅ€ĐŊĐĩ ĐŋĐžĐŧиĐģĐē҃ ҁĐĩŅ€Đ˛ĐĩŅ€Đ°, СаĐŧŅ–ŅŅ‚ŅŒ Ņ‚ĐžĐŗĐž Ņ‰ĐžĐą Đ˛Ņ–Đ´Đ´Đ°Ņ‚Đ¸ ĐŊĐĩĐ´ĐžĐŋŅƒŅŅ‚Đ¸ĐŧŅ– даĐŊŅ–. ĐĸаĐē Ви Ņ‚Đ° Đ’Đ°ŅˆŅ– ĐēĐģŅ–Ņ”ĐŊŅ‚Đ¸ ĐąŅƒĐ´ĐĩŅ‚Đĩ вĐŋĐĩвĐŊĐĩĐŊŅ–, Ņ‰Đž ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚Đĩ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊŅ– даĐŊŅ– ҃ ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐžĐŧ҃ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņ–. + +* Đ”ĐžĐ´Đ°Ņ‚Đ¸ **JSON Schema** Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ– Đ´Đž ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— OpenAPI в *ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅŅ… ҈ĐģŅŅ…Ņƒ*. + * ĐĻĐĩ ĐąŅƒĐ´Đĩ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐž в **Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊŅ–Đš Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ—**. + * А Ņ‚Đ°ĐēĐžĐļ Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Đ°Đŧи, ŅĐēŅ– Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŗĐĩĐŊĐĩŅ€ŅƒŅŽŅ‚ŅŒ ĐēĐģŅ–Ņ”ĐŊŅ‚ŅŅŒĐēиК ĐēОд. + +АĐģĐĩ ĐŊĐ°ĐšĐŗĐžĐģОвĐŊŅ–ŅˆĐĩ: + +* FastAPI **ОйĐŧĐĩĐļĐ¸Ņ‚ŅŒ Ņ‚Đ° Đ˛Ņ–Đ´Ņ„Ņ–ĐģŅŒŅ‚Ņ€ŅƒŅ”** Đ˛Đ¸Ņ…Ņ–Đ´ĐŊŅ– даĐŊŅ– Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊĐž Đ´Đž Ņ‚Đ¸Đŋ҃, вĐēаСаĐŊĐžĐŗĐž ҃ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ–. + * ĐĻĐĩ ĐžŅĐžĐąĐģивО ваĐļĐģивО Đ´ĐģŅ **ĐąĐĩСĐŋĐĩĐēи**. ДĐĩŅ‚Đ°ĐģŅ– ĐŊиĐļ҇Đĩ. + +## ĐŸĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `response_model` + +ІĐŊĐžĐ´Ņ– ВаĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž айО ĐˇŅ€ŅƒŅ‡ĐŊĐž ĐŋОвĐĩŅ€Ņ‚Đ°Ņ‚Đ¸ Ņ–ĐŊŅˆŅ– Ņ‚Đ¸Đŋи даĐŊĐ¸Ņ…, ĐŊŅ–Đļ ҂Җ, Ņ‰Đž СаСĐŊĐ°Ņ‡ĐĩĐŊŅ– ŅĐē Ņ‚Đ¸Đŋ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ–. + +НаĐŋŅ€Đ¸ĐēĐģад, Ви ĐŧĐžĐļĐĩŅ‚Đĩ **ĐŋОвĐĩŅ€Ņ‚Đ°Ņ‚Đ¸ ҁĐģОвĐŊиĐē** айО ĐžĐąâ€™Ņ”ĐēŅ‚ йаСи даĐŊĐ¸Ņ…, аĐģĐĩ **ĐžĐŗĐžĐģĐžŅĐ¸Ņ‚Đ¸ ĐŧОдĐĩĐģҌ Pydantic** ŅĐē ĐŧОдĐĩĐģҌ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ–. ĐĸĐžĐ´Ņ– ĐŧОдĐĩĐģҌ Pydantic Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐžĐąŅ€ĐžĐąĐģŅŅ‚Đ¸ĐŧĐĩ ваĐģŅ–Đ´Đ°Ņ†Ņ–ŅŽ, Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–ŅŽ Ņ‚ĐžŅ‰Đž. + +Đ¯ĐēŅ‰Đž Ви Đ´ĐžĐ´Đ°ŅŅ‚Đĩ аĐŊĐžŅ‚Đ°Ņ†Ņ–ŅŽ Ņ‚Đ¸Đŋ҃ Đ´ĐģŅ ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ, Ņ€ĐĩдаĐēŅ‚ĐžŅ€ ĐēĐžĐ´Ņƒ айО mypy ĐŧĐžĐļŅƒŅ‚ŅŒ ĐŋĐžŅĐēĐ°Ņ€ĐļĐ¸Ņ‚Đ¸ŅŅ, Ņ‰Đž Ņ„ŅƒĐŊĐēŅ†Ņ–Ņ ĐŋОвĐĩŅ€Ņ‚Đ°Ņ” Ņ–ĐŊŅˆĐ¸Đš Ņ‚Đ¸Đŋ (ĐŊаĐŋŅ€Đ¸ĐēĐģад, dict СаĐŧŅ–ŅŅ‚ŅŒ Item). + +ĐŖ Ņ‚Đ°ĐēĐ¸Ņ… виĐŋадĐēĐ°Ņ… ĐŧĐžĐļĐŊа ҁĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ŅŅ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ĐžĐŧ `response_model` в Đ´ĐĩĐēĐžŅ€Đ°Ņ‚ĐžŅ€Ņ– ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚Ņƒ (ĐŊаĐŋŅ€Đ¸ĐēĐģад, @app.get()). + +ĐŸĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `response_model` ĐŋŅ€Đ°Ņ†ŅŽŅ” С ĐąŅƒĐ´ŅŒ-ŅĐēиĐŧ *ĐžĐŋĐĩŅ€Đ°Ņ‚ĐžŅ€ĐžĐŧ ҈ĐģŅŅ…Ņƒ*: + +* `@app.get()` +* `@app.post()` +* `@app.put()` +* `@app.delete()` +* Ņ‚ĐžŅ‰Đž. + +{* ../../docs_src/response_model/tutorial001_py310.py hl[17,22,24:27] *} + +/// note | ĐŸŅ€Đ¸ĐŧŅ–Ņ‚Đēа + +ЗвĐĩŅ€ĐŊŅ–Ņ‚ŅŒ ŅƒĐ˛Đ°ĐŗŅƒ, Ņ‰Đž `response_model` Ņ” ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ĐžĐŧ ĐŧĐĩŅ‚ĐžĐ´Ņƒ-Đ´ĐĩĐēĐžŅ€Đ°Ņ‚ĐžŅ€Đ° (`get`, `post`, Ņ‚ĐžŅ‰Đž), а ĐŊĐĩ *Ņ„ŅƒĐŊĐēŅ†Ņ–Ņ”ŅŽ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ”ŅŽ ҈ĐģŅŅ…Ņƒ* (path operation function), ŅĐē ҆Đĩ Ņ€ĐžĐąĐ¸Ņ‚ŅŒŅŅ С ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ°Đŧи айО ҂ҖĐģĐžĐŧ СаĐŋĐ¸Ņ‚Ņƒ. + +/// + +`response_model` ĐŋŅ€Đ¸ĐšĐŧĐ°Ņ” Ņ‚Đ°ĐēиК ŅĐ°ĐŧиК Ņ‚Đ¸Đŋ, ŅĐēиК Ви Đą вĐēаСаĐģи Đ´ĐģŅ ĐŋĐžĐģŅ ĐŧОдĐĩĐģŅ– Pydantic. ĐĸĐžĐąŅ‚Đž ҆Đĩ ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ ŅĐē Pydantic-ĐŧОдĐĩĐģҌ, Ņ‚Đ°Đē Ņ–, ĐŊаĐŋŅ€Đ¸ĐēĐģад, `list` Ņ–Đˇ ĐŧОдĐĩĐģĐĩĐš Pydantic — `List[Item]`. + +FastAPI виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ĐŧĐĩ `response_model` Đ´ĐģŅ ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ—, ваĐģŅ–Đ´Đ°Ņ†Ņ–Ņ— даĐŊĐ¸Ņ… Ņ‚Đ° — ĐŊаКваĐļĐģĐ¸Đ˛Ņ–ŅˆĐĩ — **ĐŋĐĩŅ€ĐĩŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ Ņ‚Đ° ҄ҖĐģŅŒŅ‚Ņ€Đ°Ņ†Ņ–Ņ— Đ˛Đ¸Ņ…Ņ–Đ´ĐŊĐ¸Ņ… даĐŊĐ¸Ņ…** ĐˇĐŗŅ–Đ´ĐŊĐž С ĐžĐŗĐžĐģĐžŅˆĐĩĐŊиĐŧ Ņ‚Đ¸ĐŋĐžĐŧ. + +/// tip | ĐŸĐžŅ€Đ°Đ´Đ° + +Đ¯ĐēŅ‰Đž ҃ Đ’Đ°Ņ ŅƒĐ˛Ņ–ĐŧĐēĐŊĐĩĐŊĐž ŅŅƒĐ˛ĐžŅ€Ņƒ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đē҃ Ņ‚Đ¸ĐŋŅ–Đ˛ ҃ Ņ€ĐĩдаĐēŅ‚ĐžŅ€Ņ–, mypy Ņ‚ĐžŅ‰Đž, Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐžĐŗĐžĐģĐžŅĐ¸Ņ‚Đ¸ Ņ‚Đ¸Đŋ ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ Ņ„ŅƒĐŊĐē҆Җҗ ŅĐē `Any`. + +ĐĸаĐēиĐŧ Ņ‡Đ¸ĐŊĐžĐŧ, Ви ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģŅŅ”Ņ‚Đĩ Ņ€ĐĩдаĐēŅ‚ĐžŅ€Ņƒ, Ņ‰Đž ŅĐ˛Ņ–Đ´ĐžĐŧĐž ĐŋОвĐĩŅ€Ņ‚Đ°Ņ”Ņ‚Đĩ ĐąŅƒĐ´ŅŒ-Ņ‰Đž. АĐģĐĩ FastAPI ҃ҁĐĩ ОдĐŊĐž виĐēĐžĐŊŅƒĐ˛Đ°Ņ‚Đ¸ĐŧĐĩ ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ—, ваĐģŅ–Đ´Đ°Ņ†Ņ–ŅŽ, ҄ҖĐģŅŒŅ‚Ņ€Đ°Ņ†Ņ–ŅŽ Ņ‚ĐžŅ‰Đž Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° `response_model`. + +/// + +### ĐŸŅ€Ņ–ĐžŅ€Đ¸Ņ‚ĐĩŅ‚ `response_model` + +Đ¯ĐēŅ‰Đž Ви вĐēĐ°ĐˇŅƒŅ”Ņ‚Đĩ Ņ– Ņ‚Đ¸Đŋ ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ, Ņ– `response_model`, Ņ‚Đž FastAPI виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ĐŧĐĩ `response_model` С ĐŋŅ€Ņ–ĐžŅ€Đ¸Ņ‚ĐĩŅ‚ĐžĐŧ. + +ĐĸаĐēиĐŧ Ņ‡Đ¸ĐŊĐžĐŧ, Ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ´ĐžĐ´Đ°Ņ‚Đ¸ ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊŅ– аĐŊĐžŅ‚Đ°Ņ†Ņ–Ņ— Ņ‚Đ¸ĐŋŅ–Đ˛ Đ´Đž Đ˛Đ°ŅˆĐ¸Ņ… Ņ„ŅƒĐŊĐēŅ†Ņ–Đš, ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ŅĐēŅ‰Đž вОĐŊи ĐŋОвĐĩŅ€Ņ‚Đ°ŅŽŅ‚ŅŒ Ņ‚Đ¸Đŋ, Đ˛Ņ–Đ´ĐŧŅ–ĐŊĐŊиК Đ˛Ņ–Đ´ `response_model`. ĐĻĐĩ ĐąŅƒĐ´Đĩ ĐēĐžŅ€Đ¸ŅĐŊĐž Đ´ĐģŅ Ņ€ĐĩдаĐēŅ‚ĐžŅ€Ņ–Đ˛ ĐēĐžĐ´Ņƒ Ņ‚Đ° Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Ņ–Đ˛, Ņ‚Đ°ĐēĐ¸Ņ… ŅĐē mypy. І ĐŋŅ€Đ¸ Ņ†ŅŒĐžĐŧ҃ FastAPI ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐ¸Ņ‚ŅŒ виĐēĐžĐŊŅƒĐ˛Đ°Ņ‚Đ¸ ваĐģŅ–Đ´Đ°Ņ†Ņ–ŅŽ даĐŊĐ¸Ņ…, ĐŗĐĩĐŊĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–ŅŽ Ņ‚ĐžŅ‰Đž ĐŊа ĐžŅĐŊĐžĐ˛Ņ– `response_model`. + +Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ `response_model=None`, Ņ‰ĐžĐą виĐŧĐēĐŊŅƒŅ‚Đ¸ ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ ĐŧОдĐĩĐģŅ– Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ– Đ´ĐģŅ ҆ҖҔҗ *ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ҈ĐģŅŅ…Ņƒ*. ĐĻĐĩ ĐŧĐžĐļĐĩ СĐŊĐ°Đ´ĐžĐąĐ¸Ņ‚Đ¸ŅŅ, ŅĐēŅ‰Đž Ви Đ´ĐžĐ´Đ°Ņ”Ņ‚Đĩ аĐŊĐžŅ‚Đ°Ņ†Ņ–Ņ— Ņ‚Đ¸ĐŋŅ–Đ˛ Đ´Đž Ой'Ņ”ĐēŅ‚Ņ–Đ˛, ŅĐēŅ– ĐŊĐĩ Ņ” Đ´ĐžĐŋŅƒŅŅ‚Đ¸ĐŧиĐŧи ĐŋĐžĐģŅĐŧи Pydantic — ĐŋŅ€Đ¸ĐēĐģад Ņ†ŅŒĐžĐŗĐž Ви ĐŋĐžĐąĐ°Ņ‡Đ¸Ņ‚Đĩ в ОдĐŊĐžĐŧ҃ С ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐ¸Ņ… Ņ€ĐžĐˇĐ´Ņ–ĐģŅ–Đ˛. + +## ПовĐĩŅ€ĐŊŅƒŅ‚Đ¸ ҂Җ ŅĐ°ĐŧŅ– Đ˛Ņ…Ņ–Đ´ĐŊŅ– даĐŊŅ– + +ĐĸŅƒŅ‚ Đŧи ĐžĐŗĐžĐģĐžŅˆŅƒŅ”ĐŧĐž ĐŧОдĐĩĐģҌ `UserIn`, ŅĐēа ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ ĐˇĐ˛Đ¸Ņ‡Đ°ĐšĐŊиК Ņ‚ĐĩĐēŅŅ‚ĐžĐ˛Đ¸Đš ĐŋĐ°Ņ€ĐžĐģҌ: + +{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *} + +/// info | ІĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ + +ЊОй виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `EmailStr`, ҁĐŋĐžŅ‡Đ°Ņ‚Đē҃ Đ˛ŅŅ‚Đ°ĐŊĐžĐ˛Ņ–Ņ‚ŅŒ `email-validator`. + +ПĐĩŅ€ĐĩĐēĐžĐŊĐ°ĐšŅ‚ĐĩҁҌ, Ņ‰Đž Ви ŅŅ‚Đ˛ĐžŅ€Đ¸Đģи [Đ˛Ņ–Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐĩ ҁĐĩŅ€ĐĩĐ´ĐžĐ˛Đ¸Ņ‰Đĩ](../virtual-environments.md){.internal-link target=_blank}, аĐēŅ‚Đ¸Đ˛ŅƒĐ˛Đ°Đģи ĐšĐžĐŗĐž, а ĐŋĐžŅ‚Ņ–Đŧ Đ˛ŅŅ‚Đ°ĐŊОвиĐģи ĐŋаĐēĐĩŅ‚, ĐŊаĐŋŅ€Đ¸ĐēĐģад: + +```console +$ pip install email-validator +``` + +or with: + +```console +$ pip install "pydantic[email]" +``` + +/// + +І Đŧи виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”ĐŧĐž Ņ†ŅŽ ĐŧОдĐĩĐģҌ, Ņ‰ĐžĐą ĐžĐŗĐžĐģĐžŅĐ¸Ņ‚Đ¸ Ņ– Đ˛Ņ…Ņ–Đ´ĐŊŅ–, Ņ– Đ˛Đ¸Ņ…Ņ–Đ´ĐŊŅ– даĐŊŅ–: + +{* ../../docs_src/response_model/tutorial002_py310.py hl[16] *} + +ĐĸĐĩĐŋĐĩŅ€, ĐēĐžĐģи ĐąŅ€Đ°ŅƒĐˇĐĩŅ€ ŅŅ‚Đ˛ĐžŅ€ŅŽŅ” ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ° С ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ, API ĐŋОвĐĩŅ€ĐŊĐĩ Ņ‚ĐžĐš ŅĐ°ĐŧиК ĐŋĐ°Ņ€ĐžĐģҌ ҃ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ–. + +ĐŖ Ņ†ŅŒĐžĐŧ҃ виĐŋадĐē҃ ҆Đĩ ĐŧĐžĐļĐĩ ĐŊĐĩ ĐąŅƒŅ‚Đ¸ ĐŋŅ€ĐžĐąĐģĐĩĐŧĐžŅŽ, адĐļĐĩ ŅĐ°ĐŧĐĩ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡ ĐŊĐ°Đ´Ņ–ŅĐģав ĐŋĐ°Ņ€ĐžĐģҌ. + +АĐģĐĩ ŅĐēŅ‰Đž Đŧи виĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ”ĐŧĐž Ņ†ŅŽ Đļ ĐŧОдĐĩĐģҌ Đ´ĐģŅ Ņ–ĐŊŅˆĐžŅ— ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ҈ĐģŅŅ…Ņƒ, Đŧи ĐŧĐžĐļĐĩĐŧĐž виĐŋадĐēОвО ĐŊĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģŅ– ĐŊĐ°ŅˆĐ¸Ņ… ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Ņ–Đ˛ ĐēĐžĐļĐŊĐžĐŧ҃ ĐēĐģŅ–Ņ”ĐŊŅ‚Ņƒ. + +/// danger | ОбĐĩŅ€ĐĩĐļĐŊĐž + +ĐŅ–ĐēĐžĐģи ĐŊĐĩ СйĐĩŅ€Ņ–ĐŗĐ°ĐšŅ‚Đĩ ĐŋĐ°Ņ€ĐžĐģҌ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ° ҃ Đ˛Ņ–Đ´ĐēŅ€Đ¸Ņ‚ĐžĐŧ҃ Đ˛Đ¸ĐŗĐģŅĐ´Ņ– Ņ‚Đ° ĐŊĐĩ ĐŊĐ°Đ´ŅĐ¸ĐģĐ°ĐšŅ‚Đĩ ĐšĐžĐŗĐž ҃ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ–, ŅĐēŅ‰Đž ҂ҖĐģҌĐēи Ви ĐŊĐĩ СĐŊĐ°Ņ”Ņ‚Đĩ Đ˛ŅŅ– Ņ€Đ¸ĐˇĐ¸Đēи Ņ– Ņ‚ĐžŅ‡ĐŊĐž Ņ€ĐžĐˇŅƒĐŧҖҔ҂Đĩ, Ņ‰Đž Ņ€ĐžĐąĐ¸Ņ‚Đĩ. + +/// + +## Đ”ĐžĐ´Đ°ĐšŅ‚Đĩ ĐžĐēŅ€ĐĩĐŧ҃ Đ˛Đ¸Ņ…Ņ–Đ´ĐŊ҃ ĐŧОдĐĩĐģҌ + +ЗаĐŧŅ–ŅŅ‚ŅŒ Ņ†ŅŒĐžĐŗĐž Đŧи ĐŧĐžĐļĐĩĐŧĐž ŅŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ Đ˛Ņ…Ņ–Đ´ĐŊ҃ ĐŧОдĐĩĐģҌ С Đ˛Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸Đŧ ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ Ņ– Đ˛Đ¸Ņ…Ņ–Đ´ĐŊ҃ ĐŧОдĐĩĐģҌ ĐąĐĩС ĐŊŅŒĐžĐŗĐž: + +{* ../../docs_src/response_model/tutorial003_py310.py hl[9,11,16] *} + +ĐĸŅƒŅ‚, ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ŅĐēŅ‰Đž *Ņ„ŅƒĐŊĐēŅ†Ņ–Ņ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ҈ĐģŅŅ…Ņƒ* ĐŋОвĐĩŅ€Ņ‚Đ°Ņ” Ой'Ņ”ĐēŅ‚ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ°, ŅĐēиК ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ: + +{* ../../docs_src/response_model/tutorial003_py310.py hl[24] *} + +...Đŧи ĐžĐŗĐžĐģĐžŅĐ¸Đģи `response_model` ŅĐē ĐŊĐ°ŅˆŅƒ ĐŧОдĐĩĐģҌ `UserOut`, ŅĐēа ĐŊĐĩ ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģŅ: + +{* ../../docs_src/response_model/tutorial003_py310.py hl[22] *} + +ĐĸаĐēиĐŧ Ņ‡Đ¸ĐŊĐžĐŧ, **FastAPI** Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Đ˛Ņ–Đ´Ņ„Ņ–ĐģŅŒŅ‚Ņ€ŅƒŅ” Đ˛ŅŅ– даĐŊŅ–, ŅĐēŅ– ĐŊĐĩ вĐēаСаĐŊŅ– ҃ Đ˛Đ¸Ņ…Ņ–Đ´ĐŊŅ–Đš ĐŧОдĐĩĐģŅ– (Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ Pydantic). + +### `response_model` айО Ņ‚Đ¸Đŋ ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ + +ĐŖ Ņ†ŅŒĐžĐŧ҃ виĐŋадĐē҃, ĐžŅĐēŅ–ĐģҌĐēи Đ´Đ˛Ņ– ĐŧОдĐĩĐģŅ– Ņ€Ņ–ĐˇĐŊŅ–, ŅĐēŅ‰Đž Đŧи аĐŊĐžŅ‚ŅƒŅ”ĐŧĐž Ņ‚Đ¸Đŋ ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ Ņ„ŅƒĐŊĐē҆Җҗ ŅĐē `UserOut`, Ņ€ĐĩдаĐēŅ‚ĐžŅ€ Ņ– Ņ‚Đ°ĐēŅ– Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Đ¸, ŅĐē mypy, Đ˛Đ¸Đ´Đ°Đ´ŅƒŅ‚ŅŒ ĐŋĐžĐŧиĐģĐē҃, йО Ņ„Đ°ĐēŅ‚Đ¸Ņ‡ĐŊĐž Đŧи ĐŋОвĐĩŅ€Ņ‚Đ°Ņ”ĐŧĐž Ņ–ĐŊŅˆĐ¸Đš Ņ‚Đ¸Đŋ. + +ĐĸĐžĐŧ҃ в Ņ†ŅŒĐžĐŧ҃ ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņ– Đŧи виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”ĐŧĐž ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `response_model`, а ĐŊĐĩ аĐŊĐžŅ‚Đ°Ņ†Ņ–ŅŽ Ņ‚Đ¸Đŋ҃ ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ. + +...аĐģĐĩ Ņ‡Đ¸Ņ‚Đ°ĐšŅ‚Đĩ даĐģŅ–, Ņ‰ĐžĐą Đ´Ņ–ĐˇĐŊĐ°Ņ‚Đ¸ŅŅ, ŅĐē ĐžĐąŅ–ĐšŅ‚Đ¸ ҆Đĩ ОйĐŧĐĩĐļĐĩĐŊĐŊŅ. + +## ĐĸиĐŋ ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ Ņ– ҄ҖĐģŅŒŅ‚Ņ€Đ°Ņ†Ņ–Ņ даĐŊĐ¸Ņ… + +ĐŸŅ€ĐžĐ´ĐžĐ˛ĐļиĐŧĐž С ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅŒĐžĐŗĐž ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņƒ. Ми Ņ…ĐžŅ‚Ņ–Đģи **аĐŊĐžŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ„ŅƒĐŊĐēŅ†Ņ–ŅŽ ОдĐŊиĐŧ Ņ‚Đ¸ĐŋĐžĐŧ**, аĐģĐĩ ĐŋŅ€Đ¸ Ņ†ŅŒĐžĐŧ҃ ĐŋОвĐĩŅ€Ņ‚Đ°Ņ‚Đ¸ С ĐŊĐĩŅ— ĐąŅ–ĐģҌ҈Đĩ даĐŊĐ¸Ņ…. + +Ми Ņ…ĐžŅ‡ĐĩĐŧĐž, Ņ‰ĐžĐą FastAPI ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļŅƒĐ˛Đ°Đ˛ **҄ҖĐģŅŒŅ‚Ņ€ŅƒĐ˛Đ°Ņ‚Đ¸** ҆Җ даĐŊŅ– Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ response_model. ĐĸĐžĐąŅ‚Đž ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ŅĐēŅ‰Đž Ņ„ŅƒĐŊĐēŅ†Ņ–Ņ ĐŋОвĐĩŅ€Ņ‚Đ°Ņ” ĐąŅ–ĐģҌ҈Đĩ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ—, ҃ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ– ĐąŅƒĐ´ŅƒŅ‚ŅŒ ĐģĐ¸ŅˆĐĩ ҂Җ ĐŋĐžĐģŅ, ŅĐēŅ– вĐēаСаĐŊŅ– ҃ response_model. + +ĐŖ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅŒĐžĐŧ҃ ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņ–, ĐžŅĐēŅ–ĐģҌĐēи ĐēĐģĐ°ŅĐ¸ ĐąŅƒĐģи Ņ€Ņ–ĐˇĐŊŅ–, ĐŊаĐŧ дОвĐĩĐģĐžŅŅ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `response_model`. АĐģĐĩ ҆Đĩ ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž Đŧи ĐŊĐĩ ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”ĐŧĐž ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐēи С йОĐē҃ Ņ€ĐĩдаĐēŅ‚ĐžŅ€Đ° ĐēĐžĐ´Ņƒ Ņ‚Đ° Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Ņ–Đ˛ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи Ņ‚Đ¸ĐŋŅ–Đ˛ Ņ‰ĐžĐ´Đž Ņ‚Đ¸Đŋ҃, ŅĐēиК ĐŋОвĐĩŅ€Ņ‚Đ°Ņ” Ņ„ŅƒĐŊĐēŅ†Ņ–Ņ. + +ĐŸŅ€ĐžŅ‚Đĩ в ĐąŅ–ĐģŅŒŅˆĐžŅŅ‚Ņ– виĐŋадĐēŅ–Đ˛, ĐēĐžĐģи ĐŊаĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐˇŅ€ĐžĐąĐ¸Ņ‚Đ¸ Ņ‰ĐžŅŅŒ ĐŋĐžĐ´Ņ–ĐąĐŊĐĩ, Đŧи ĐŋŅ€ĐžŅŅ‚Đž Ņ…ĐžŅ‡ĐĩĐŧĐž, Ņ‰ĐžĐą ĐŧОдĐĩĐģҌ **Đ˛Ņ–Đ´Ņ„Ņ–ĐģŅŒŅ‚Ņ€ŅƒĐ˛Đ°Đģа айО ĐŋŅ€Đ¸ĐąŅ€Đ°Đģа** Ņ‡Đ°ŅŅ‚Đ¸ĐŊ҃ даĐŊĐ¸Ņ…, ŅĐē ҃ Ņ†ŅŒĐžĐŧ҃ ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņ–. + +ĐŖ Ņ‚Đ°ĐēĐ¸Ņ… виĐŋадĐēĐ°Ņ… Đŧи ĐŧĐžĐļĐĩĐŧĐž виĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ ĐēĐģĐ°ŅĐ¸ Ņ‚Đ° ҁĐŋадĐēŅƒĐ˛Đ°ĐŊĐŊŅ, Ņ‰ĐžĐą ҁĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ŅŅ **аĐŊĐžŅ‚Đ°Ņ†Ņ–ŅĐŧи Ņ‚Đ¸ĐŋŅ–Đ˛** Ņ„ŅƒĐŊĐēŅ†Ņ–Đš — ҆Đĩ Đ´Đ°Ņ” ĐēŅ€Đ°Ņ‰Ņƒ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐē҃ С йОĐē҃ Ņ€ĐĩдаĐēŅ‚ĐžŅ€Đ° Ņ‚Đ° Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Ņ–Đ˛ Ņ‚Đ¸Đŋ҃ mypy, Ņ– ĐŋŅ€Đ¸ Ņ†ŅŒĐžĐŧ҃ FastAPI ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļŅƒŅ” виĐēĐžĐŊŅƒĐ˛Đ°Ņ‚Đ¸ **҄ҖĐģŅŒŅ‚Ņ€Đ°Ņ†Ņ–ŅŽ даĐŊĐ¸Ņ…** ҃ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ–. + +{* ../../docs_src/response_model/tutorial003_01_py310.py hl[7:10,13:14,18] *} + +Đ—Đ°Đ˛Đ´ŅĐēи Ņ†ŅŒĐžĐŧ҃ Đŧи ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”ĐŧĐž ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐē҃ Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Ņ–Đ˛ — Đ˛Ņ–Đ´ Ņ€ĐĩдаĐēŅ‚ĐžŅ€Ņ–Đ˛ Ņ– mypy, ĐžŅĐēŅ–ĐģҌĐēи ҆ĐĩĐš ĐēОд Ņ” ĐēĐžŅ€ĐĩĐēŅ‚ĐŊиĐŧ С Ņ‚ĐžŅ‡Đēи ĐˇĐžŅ€Ņƒ Ņ‚Đ¸ĐŋŅ–Đ˛, — аĐģĐĩ Đŧи Ņ‚Đ°ĐēĐžĐļ ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”ĐŧĐž ҄ҖĐģŅŒŅ‚Ņ€Đ°Ņ†Ņ–ŅŽ даĐŊĐ¸Ņ… Đ˛Ņ–Đ´ FastAPI. + +Đ¯Đē ҆Đĩ ĐŋŅ€Đ°Ņ†ŅŽŅ”? Đ”Đ°Đ˛Đ°ĐšŅ‚Đĩ Ņ€ĐžĐˇĐąĐĩŅ€ĐĩĐŧĐžŅŅ. 🤓 + +### ĐĸиĐŋи Ņ‚Đ° ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐēа Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Ņ–Đ˛ + +ĐĄĐŋĐĩŅ€ŅˆŅƒ ĐŋОдивиĐŧĐžŅŅŒ, ŅĐē ҆Đĩ ĐąĐ°Ņ‡Đ°Ņ‚ŅŒ Ņ€ĐĩдаĐēŅ‚ĐžŅ€Đ¸, mypy Ņ‚Đ° Ņ–ĐŊŅˆŅ– Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Đ¸. + +`BaseUser` ĐŧĐ°Ņ” ĐąĐ°ĐˇĐžĐ˛Ņ– ĐŋĐžĐģŅ. ĐŸĐžŅ‚Ņ–Đŧ `UserIn` ҃ҁĐŋадĐēĐžĐ˛ŅƒŅ” `BaseUser` Ņ– Đ´ĐžĐ´Đ°Ņ” ĐŋĐžĐģĐĩ `password`, ĐžŅ‚ĐļĐĩ, Đ˛Ņ–ĐŊ ĐŧĐ°Ņ‚Đ¸ĐŧĐĩ Đ˛ŅŅ– ĐŋĐžĐģŅ С ĐžĐąĐžŅ… ĐŧОдĐĩĐģĐĩĐš. + +Ми СаСĐŊĐ°Ņ‡Đ°Ņ”ĐŧĐž Ņ‚Đ¸Đŋ ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ Ņ„ŅƒĐŊĐē҆Җҗ ŅĐē `BaseUser`, аĐģĐĩ Ņ„Đ°ĐēŅ‚Đ¸Ņ‡ĐŊĐž ĐŋОвĐĩŅ€Ņ‚Đ°Ņ”ĐŧĐž ĐĩĐēСĐĩĐŧĐŋĐģŅŅ€ `UserIn`. + +Đ ĐĩдаĐēŅ‚ĐžŅ€, mypy Ņ‚Đ° Ņ–ĐŊŅˆŅ– Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Đ¸ ĐŊĐĩ ҁĐēĐ°Ņ€ĐļĐ¸Ņ‚Đ¸ĐŧŅƒŅ‚ŅŒŅŅ ĐŊа ҆Đĩ, Ņ‚ĐžĐŧ҃ Ņ‰Đž С Ņ‚ĐžŅ‡Đēи ĐˇĐžŅ€Ņƒ Ņ‚Đ¸ĐŋŅ–ĐˇĐ°Ņ†Ņ–Ņ— `UserIn` Ņ” ĐŋŅ–Đ´ĐēĐģĐ°ŅĐžĐŧ `BaseUser`, а ҆Đĩ ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž Đ˛Ņ–ĐŊ Ņ” `ваĐģŅ–Đ´ĐŊиĐŧ` Ņ‚Đ¸ĐŋĐžĐŧ, ĐēĐžĐģи ĐžŅ‡Ņ–ĐēŅƒŅ”Ņ‚ŅŒŅŅ ĐąŅƒĐ´ŅŒ-Ņ‰Đž, Ņ‰Đž Ņ” `BaseUser`. + +### Đ¤Ņ–ĐģŅŒŅ‚Ņ€Đ°Ņ†Ņ–Ņ даĐŊĐ¸Ņ… ҃ FastAPI + +ĐĸĐĩĐŋĐĩŅ€ Đ´ĐģŅ FastAPI Đ˛Ņ–ĐŊ ĐąĐ°Ņ‡Đ¸Ņ‚ŅŒ Ņ‚Đ¸Đŋ ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ Ņ– ĐŋĐĩŅ€ĐĩĐēĐžĐŊŅƒŅ”Ņ‚ŅŒŅŅ, Ņ‰Đž Ņ‚Đĩ, Ņ‰Đž Ви ĐŋОвĐĩŅ€Ņ‚Đ°Ņ”Ņ‚Đĩ, ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ **҂ҖĐģҌĐēи** ĐŋĐžĐģŅ, ŅĐēŅ– ĐžĐŗĐžĐģĐžŅˆĐĩĐŊŅ– ҃ Ņ†ŅŒĐžĐŧ҃ Ņ‚Đ¸ĐŋŅ–. + +FastAPI виĐēĐžĐŊŅƒŅ” ĐēŅ–ĐģҌĐēа вĐŊŅƒŅ‚Ņ€Ņ–ŅˆĐŊŅ–Ņ… ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Đš С Pydantic, Ņ‰ĐžĐą ĐŗĐ°Ņ€Đ°ĐŊŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸, Ņ‰Đž ĐŋŅ€Đ°Đ˛Đ¸Đģа ĐŊĐ°ŅĐģŅ–Đ´ŅƒĐ˛Đ°ĐŊĐŊŅ ĐēĐģĐ°ŅŅ–Đ˛ ĐŊĐĩ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ Đ´ĐģŅ ҄ҖĐģŅŒŅ‚Ņ€Đ°Ņ†Ņ–Ņ— ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐ¸Ņ… даĐŊĐ¸Ņ…, Ņ–ĐŊаĐē҈Đĩ Ви ĐŧĐžĐŗĐģи Đą ĐŋОвĐĩŅ€ĐŊŅƒŅ‚Đ¸ СĐŊĐ°Ņ‡ĐŊĐž ĐąŅ–ĐģҌ҈Đĩ даĐŊĐ¸Ņ…, ĐŊŅ–Đļ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°Đģи. + +ĐĸаĐēиĐŧ Ņ‡Đ¸ĐŊĐžĐŧ, Ви ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚Đĩ ĐŊаКĐēŅ€Đ°Ņ‰Đĩ С Đ´Đ˛ĐžŅ… ŅĐ˛Ņ–Ņ‚Ņ–Đ˛: аĐŊĐžŅ‚Đ°Ņ†Ņ–Ņ— Ņ‚Đ¸ĐŋŅ–Đ˛ **С ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐēĐžŅŽ Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Ņ–Đ˛** Ņ– **҄ҖĐģŅŒŅ‚Ņ€Đ°Ņ†Ņ–ŅŽ даĐŊĐ¸Ņ…**. + +## ĐŸĐžĐ´Đ¸Đ˛Đ¸Ņ‚Đ¸ŅŅŒ ҃ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— + +КоĐģи Ви Đ´Đ¸Đ˛Đ¸Ņ‚ĐĩҁҌ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊ҃ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–ŅŽ, Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐąĐ°Ņ‡Đ¸Ņ‚Đ¸, Ņ‰Đž Đ˛Ņ…Ņ–Đ´ĐŊа ĐŧОдĐĩĐģҌ Ņ– Đ˛Đ¸Ņ…Ņ–Đ´ĐŊа ĐŧОдĐĩĐģҌ ĐŧĐ°ŅŽŅ‚ŅŒ вĐģĐ°ŅĐŊ҃ JSON-ҁ҅ĐĩĐŧ҃: + + + +І ĐžĐąĐ¸Đ´Đ˛Ņ– ĐŧОдĐĩĐģŅ– виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ Đ´ĐģŅ Ņ–ĐŊŅ‚ĐĩŅ€Đ°ĐēŅ‚Đ¸Đ˛ĐŊĐžŅ— API-Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ—: + + + +## ІĐŊŅˆŅ– аĐŊĐžŅ‚Đ°Ņ†Ņ–Ņ— Ņ‚Đ¸ĐŋŅ–Đ˛ ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ + +Đ†ŅĐŊŅƒŅŽŅ‚ŅŒ виĐŋадĐēи, ĐēĐžĐģи Ви ĐŋОвĐĩŅ€Ņ‚Đ°Ņ”Ņ‚Đĩ Ņ‰ĐžŅŅŒ, Ņ‰Đž ĐŊĐĩ Ņ” Đ´ĐžĐŋŅƒŅŅ‚Đ¸ĐŧиĐŧ ĐŋĐžĐģĐĩĐŧ Pydantic, аĐģĐĩ аĐŊĐžŅ‚ŅƒŅ”Ņ‚Đĩ ҆Đĩ ҃ Ņ„ŅƒĐŊĐē҆Җҗ ĐģĐ¸ŅˆĐĩ Đ´ĐģŅ Ņ‚ĐžĐŗĐž, Ņ‰ĐžĐą ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐē҃ Đ˛Ņ–Đ´ Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Ņ–Đ˛ (Ņ€ĐĩдаĐēŅ‚ĐžŅ€Đ°, mypy Ņ‚ĐžŅ‰Đž). + +### ПовĐĩŅ€ĐŊĐĩĐŊĐŊŅ Response ĐŊаĐŋŅ€ŅĐŧ҃ + +НайĐŋĐžŅˆĐ¸Ņ€ĐĩĐŊŅ–ŅˆĐ¸Đŧ виĐŋадĐēĐžĐŧ ĐąŅƒĐ´Đĩ [ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ Response ĐŊаĐŋŅ€ŅĐŧ҃, ŅĐē ĐŋĐžŅŅĐŊŅŽŅ”Ņ‚ŅŒŅŅ ĐŋŅ–ĐˇĐŊŅ–ŅˆĐĩ ҃ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊŅ–Đš Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ—](../advanced/response-directly.md){.internal-link target=_blank}. + +{* ../../docs_src/response_model/tutorial003_02.py hl[8,10:11] *} + +ĐĻĐĩĐš ĐŋŅ€ĐžŅŅ‚Đ¸Đš виĐŋадОĐē Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐžĐąŅ€ĐžĐąĐģŅŅ”Ņ‚ŅŒŅŅ FastAPI, Ņ‚ĐžĐŧ҃ Ņ‰Đž аĐŊĐžŅ‚Đ°Ņ†Ņ–Ņ Ņ‚Đ¸Đŋ҃ ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ — ҆Đĩ ĐēĐģĐ°Ņ (айО ĐŋŅ–Đ´ĐēĐģĐ°Ņ) `Response`. + +І Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Đ¸ Ņ‚Đ°ĐēĐžĐļ ĐąŅƒĐ´ŅƒŅ‚ŅŒ СадОвОĐģĐĩĐŊŅ–, йО Ņ– `RedirectResponse`, Ņ– `JSONResponse` Ņ” ĐŋŅ–Đ´ĐēĐģĐ°ŅĐ°Đŧи `Response`, ĐžŅ‚ĐļĐĩ аĐŊĐžŅ‚Đ°Ņ†Ņ–Ņ Ņ‚Đ¸Đŋ҃ ĐēĐžŅ€ĐĩĐēŅ‚ĐŊа. + +### АĐŊĐžŅ‚Đ°Ņ†Ņ–Ņ ĐŋŅ–Đ´ĐēĐģĐ°ŅŅƒ Response + +ĐĸаĐēĐžĐļ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ–Đ´ĐēĐģĐ°Ņ `Response` ҃ аĐŊĐžŅ‚Đ°Ņ†Ņ–Ņ— Ņ‚Đ¸Đŋ҃: + +{* ../../docs_src/response_model/tutorial003_03.py hl[8:9] *} + +ĐĻĐĩ Ņ‚ĐĩĐļ ĐŋŅ€Đ°Ņ†ŅŽĐ˛Đ°Ņ‚Đ¸ĐŧĐĩ, йО `RedirectResponse` — ĐŋŅ–Đ´ĐēĐģĐ°Ņ `Response`, Ņ– FastAPI Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐžĐąŅ€ĐžĐąĐ¸Ņ‚ŅŒ ҆ĐĩĐš ĐŋŅ€ĐžŅŅ‚Đ¸Đš виĐŋадОĐē. + +### НĐĩĐēĐžŅ€ĐĩĐēŅ‚ĐŊŅ– аĐŊĐžŅ‚Đ°Ņ†Ņ–Ņ— Ņ‚Đ¸Đŋ҃ ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ + +АĐģĐĩ ĐēĐžĐģи Ви ĐŋОвĐĩŅ€Ņ‚Đ°Ņ”Ņ‚Đĩ ŅĐēĐ¸ĐšŅŅŒ Ņ–ĐŊŅˆĐ¸Đš Đ´ĐžĐ˛Ņ–ĐģҌĐŊиК ĐžĐąâ€™Ņ”ĐēŅ‚, Ņ‰Đž ĐŊĐĩ Ņ” ваĐģŅ–Đ´ĐŊиĐŧ Ņ‚Đ¸ĐŋĐžĐŧ Pydantic (ĐŊаĐŋŅ€Đ¸ĐēĐģад, ĐžĐąâ€™Ņ”ĐēŅ‚ йаСи даĐŊĐ¸Ņ…), Ņ– аĐŊĐžŅ‚ŅƒŅ”Ņ‚Đĩ ĐšĐžĐŗĐž Ņ‚Đ°Đē ҃ Ņ„ŅƒĐŊĐē҆Җҗ, FastAPI ҁĐŋŅ€ĐžĐąŅƒŅ” ŅŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ Pydantic ĐŧОдĐĩĐģҌ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ– ĐŊа ĐžŅĐŊĐžĐ˛Ņ– ҆ҖҔҗ аĐŊĐžŅ‚Đ°Ņ†Ņ–Ņ— Ņ‚Đ¸Đŋ҃, Ņ– ҆Đĩ СавĐĩŅ€ŅˆĐ¸Ņ‚ŅŒŅŅ ĐŋĐžĐŧиĐģĐēĐžŅŽ. + +ĐĸĐĩ ŅĐ°ĐŧĐĩ ŅŅ‚Đ°ĐŊĐĩŅ‚ŅŒŅŅ, ŅĐēŅ‰Đž Ви виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ union ĐŧŅ–Đļ Ņ€Ņ–ĐˇĐŊиĐŧи Ņ‚Đ¸ĐŋаĐŧи, Đ´Đĩ ОдиĐŊ айО ĐąŅ–ĐģҌ҈Đĩ ĐŊĐĩ Ņ” ваĐģŅ–Đ´ĐŊиĐŧи Ņ‚Đ¸ĐŋаĐŧи Pydantic, ĐŊаĐŋŅ€Đ¸ĐēĐģад, ҆Đĩ ҁĐŋŅ€Đ¸Ņ‡Đ¸ĐŊĐ¸Ņ‚ŅŒ ĐŋĐžĐŧиĐģĐē҃ đŸ’Ĩ: + +{* ../../docs_src/response_model/tutorial003_04_py310.py hl[8] *} + +...҆Đĩ ĐŊĐĩ ĐŋŅ€Đ°Ņ†ŅŽŅ”, Ņ‚ĐžĐŧ҃ Ņ‰Đž Ņ‚Đ¸Đŋ аĐŊĐžŅ‚Đ°Ņ†Ņ–Ņ— ĐŊĐĩ Ņ” Ņ‚Đ¸ĐŋĐžĐŧ Pydantic Ņ– ĐŊĐĩ Ņ” ĐŋŅ€ĐžŅŅ‚Đž ĐēĐģĐ°ŅĐžĐŧ `Response` айО ĐšĐžĐŗĐž ĐŋŅ–Đ´ĐēĐģĐ°ŅĐžĐŧ, а Ņ” ĐžĐąâ€™Ņ”Đ´ĐŊаĐŊĐŊŅĐŧ (union) — айО `Response`, айО `dict`. + +### Đ’Ņ–Đ´ĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ МодĐĩĐģŅ– Đ’Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ– + +ĐŸŅ€ĐžĐ´ĐžĐ˛ĐļŅƒŅŽŅ‡Đ¸ ĐŋŅ€Đ¸ĐēĐģад Đ˛Đ¸Ņ‰Đĩ, ĐŧĐžĐļĐģивО, Ви ĐŊĐĩ Ņ…ĐžŅ‡ĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊ҃ ваĐģŅ–Đ´Đ°Ņ†Ņ–ŅŽ даĐŊĐ¸Ņ…, Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊ҃ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–ŅŽ, ҄ҖĐģŅŒŅ‚Ņ€Đ°Ņ†Ņ–ŅŽ Ņ‚ĐžŅ‰Đž, ŅĐēŅ– FastAPI виĐēĐžĐŊŅƒŅ” Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ. + +АĐģĐĩ ви Đ˛ŅĐĩ ОдĐŊĐž ĐŧĐžĐļĐĩŅ‚Đĩ СаĐģĐ¸ŅˆĐ¸Ņ‚Đ¸ аĐŊĐžŅ‚Đ°Ņ†Ņ–ŅŽ Ņ‚Đ¸Đŋ҃ ҃ Ņ„ŅƒĐŊĐē҆Җҗ, Ņ‰ĐžĐą СйĐĩŅ€ĐĩĐŗŅ‚Đ¸ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐē҃ С йОĐē҃ Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Ņ–Đ˛, Ņ‚Đ°ĐēĐ¸Ņ… ŅĐē Ņ€ĐĩдаĐēŅ‚ĐžŅ€Đ¸ ĐēĐžĐ´Ņƒ айО ŅŅ‚Đ°Ņ‚Đ¸Ņ‡ĐŊŅ– ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи Ņ‚Đ¸ĐŋŅ–Đ˛ (ĐŊаĐŋŅ€Đ¸ĐēĐģад, mypy). + +ĐŖ Ņ‚Đ°ĐēĐžĐŧ҃ виĐŋадĐē҃ ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐŧĐēĐŊŅƒŅ‚Đ¸ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ†Ņ–ŅŽ ĐŧОдĐĩĐģŅ– Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ–, Đ˛ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Đ˛ŅˆĐ¸ `response_model=None`: + +{* ../../docs_src/response_model/tutorial003_05_py310.py hl[7] *} + +ĐĻĐĩ СĐŧŅƒŅĐ¸Ņ‚ŅŒ FastAPI ĐŋŅ€ĐžĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ†Ņ–ŅŽ ĐŧОдĐĩĐģŅ– Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ–, Ņ– Ņ‚Đ°ĐēиĐŧ Ņ‡Đ¸ĐŊĐžĐŧ Ви СĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐąŅƒĐ´ŅŒ-ŅĐēŅ– аĐŊĐžŅ‚Đ°Ņ†Ņ–Ņ— Ņ‚Đ¸ĐŋŅ–Đ˛ ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ ĐąĐĩС вĐŋĐģĐ¸Đ˛Ņƒ ĐŊа Đ˛Đ°ŅˆŅƒ FastAPI аĐŋĐģŅ–ĐēĐ°Ņ†Ņ–ŅŽ. 🤓 + +## ĐŸĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ ĐēĐžĐ´ŅƒĐ˛Đ°ĐŊĐŊŅ ĐŧОдĐĩĐģŅ– Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ– + +Đ’Đ°ŅˆĐ° ĐŧОдĐĩĐģҌ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ– ĐŧĐžĐļĐĩ ĐŧĐ°Ņ‚Đ¸ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ, ĐŊаĐŋŅ€Đ¸ĐēĐģад: + +{* ../../docs_src/response_model/tutorial004_py310.py hl[9,11:12] *} + +* `description: Union[str, None] = None` (айО `str | None = None` ҃ Python 3.10) ĐŧĐ°Ņ” СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ `None`. +* `tax: float = 10.5` ĐŧĐ°Ņ” СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ `10.5`. +* `tags: List[str] = []` ĐŧĐ°Ņ” СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ĐŋĐžŅ€ĐžĐļĐŊŅ–Đš ҁĐŋĐ¸ŅĐžĐē: `[]`. + +АĐģĐĩ Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇĐ°Ņ…ĐžŅ‚Ņ–Ņ‚Đ¸ ĐŊĐĩ вĐēĐģŅŽŅ‡Đ°Ņ‚Đ¸ Ņ—Ņ… ҃ Ņ€ĐĩĐˇŅƒĐģŅŒŅ‚Đ°Ņ‚, ŅĐēŅ‰Đž вОĐŊи Ņ„Đ°ĐēŅ‚Đ¸Ņ‡ĐŊĐž ĐŊĐĩ ĐąŅƒĐģи СйĐĩŅ€ĐĩĐļĐĩĐŊŅ–. + +НаĐŋŅ€Đ¸ĐēĐģад, ŅĐēŅ‰Đž ҃ Đ’Đ°Ņ Ņ” ĐŧОдĐĩĐģŅ– С ĐąĐ°ĐŗĐ°Ņ‚ŅŒĐŧа ĐŊĐĩĐžĐąĐžĐ˛â€™ŅĐˇĐēОвиĐŧи Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ°Đŧи ҃ NoSQL ĐąĐ°ĐˇŅ– даĐŊĐ¸Ņ…, аĐģĐĩ Ви ĐŊĐĩ Ņ…ĐžŅ‡ĐĩŅ‚Đĩ Đ˛Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģŅŅ‚Đ¸ Đ´ŅƒĐļĐĩ Đ´ĐžĐ˛ĐŗŅ– JSON-Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ–, ĐŋОвĐŊŅ– СĐŊĐ°Ņ‡ĐĩĐŊҌ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ. + +### ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `response_model_exclude_unset` + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ Đ´ĐĩĐēĐžŅ€Đ°Ņ‚ĐžŅ€Đ° ҈ĐģŅŅ…Ņƒ `response_model_exclude_unset=True`: + +{* ../../docs_src/response_model/tutorial004_py310.py hl[22] *} + +Ņ– ҆Җ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ‚ŅŒ вĐēĐģŅŽŅ‡ĐĩĐŊŅ– ҃ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ, ҂ҖĐģҌĐēи Ņ„Đ°ĐēŅ‚Đ¸Ņ‡ĐŊĐž Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊŅ– СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ. + +ĐžŅ‚ĐļĐĩ, ŅĐēŅ‰Đž Ви ĐŊĐ°Đ´Ņ–ŅˆĐģĐĩŅ‚Đĩ СаĐŋĐ¸Ņ‚ Đ´Đž Ņ†ŅŒĐžĐŗĐž ĐžĐŋĐĩŅ€Đ°Ņ‚ĐžŅ€Đ° ҈ĐģŅŅ…Ņƒ Đ´ĐģŅ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ° С item_id `foo`, Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ (ĐąĐĩС вĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ СĐŊĐ°Ņ‡ĐĩĐŊҌ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ) ĐąŅƒĐ´Đĩ: + +```JSON +{ + "name": "Foo", + "price": 50.2 +} +``` + +/// info | ІĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ + +ĐŖ Pydantic вĐĩҀҁҖҗ 1 ĐŧĐĩŅ‚ĐžĐ´ ĐŊĐ°ĐˇĐ¸Đ˛Đ°Đ˛ŅŅ `.dict()`, Đ˛Ņ–ĐŊ ĐąŅƒĐ˛ ĐˇĐ°ŅŅ‚Đ°Ņ€Ņ–ĐģиК (аĐģĐĩ ҉Đĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚ŅŒŅŅ) ҃ Pydantic вĐĩҀҁҖҗ 2 Ņ– ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊОваĐŊиК ҃ `.model_dump()`. + +ĐŸŅ€Đ¸ĐēĐģади Ņ‚ŅƒŅ‚ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒ `.dict()` Đ´ĐģŅ ҁ҃ĐŧҖҁĐŊĐžŅŅ‚Ņ– С Pydantic v1, аĐģĐĩ ВаĐŧ ҁĐģŅ–Đ´ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `.model_dump()`, ŅĐēŅ‰Đž Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Pydantic v2. + +/// + +/// info | ІĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ + +FastAPI виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” `.dict()` ĐŧОдĐĩĐģŅ– Pydantic С ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ĐžĐŧ `exclude_unset`, Ņ‰ĐžĐą Đ´ĐžŅŅĐŗŅ‚Đ¸ Ņ†ŅŒĐžĐŗĐž. + +/// + +/// info | ІĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ + +Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸: + +* `response_model_exclude_defaults=True` +* `response_model_exclude_none=True` + +ŅĐē ĐžĐŋĐ¸ŅĐ°ĐŊĐž в Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— Pydantic for `exclude_defaults` Ņ‚Đ° `exclude_none`. + +/// + +#### ДаĐŊŅ– ĐˇŅ– СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧи Đ´ĐģŅ ĐŋĐžĐģŅ–Đ˛ Ņ–Đˇ Ņ‚Đ¸ĐŋОвиĐŧи СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧи + +АĐģĐĩ ŅĐēŅ‰Đž Đ’Đ°ŅˆŅ– даĐŊŅ– ĐŧĐ°ŅŽŅ‚ŅŒ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Đ´ĐģŅ ĐŋĐžĐģŅ–Đ˛ ĐŧОдĐĩĐģŅ– С Ņ‚Đ¸ĐŋОвиĐŧи СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧи, ŅĐē ҃ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ° С item_id `bar`: + +```Python hl_lines="3 5" +{ + "name": "Bar", + "description": "The bartenders", + "price": 62, + "tax": 20.2 +} +``` +вОĐŊи ĐąŅƒĐ´ŅƒŅ‚ŅŒ вĐēĐģŅŽŅ‡ĐĩĐŊŅ– ҃ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ. + +#### ДаĐŊŅ– С Ņ‚Đ¸Đŧи ŅĐ°ĐŧиĐŧи СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧи, Ņ‰Đž Đš Ņ‚Đ¸ĐŋĐžĐ˛Ņ– + +Đ¯ĐēŅ‰Đž даĐŊŅ– ĐŧĐ°ŅŽŅ‚ŅŒ ҂Җ ŅĐ°ĐŧŅ– СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ, Ņ‰Đž Đš Ņ‚Đ¸ĐŋĐžĐ˛Ņ–, ŅĐē ҃ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ° С item_id `baz`: + +```Python hl_lines="3 5-6" +{ + "name": "Baz", + "description": None, + "price": 50.2, + "tax": 10.5, + "tags": [] +} +``` + +FastAPI Đ´ĐžŅŅ‚Đ°Ņ‚ĐŊŅŒĐž Ņ€ĐžĐˇŅƒĐŧĐŊиК (ĐŊĐ°ŅĐŋŅ€Đ°Đ˛Đ´Ņ–, Pydantic Đ´ĐžŅŅ‚Đ°Ņ‚ĐŊŅŒĐž Ņ€ĐžĐˇŅƒĐŧĐŊиК), Ņ‰ĐžĐą ĐˇŅ€ĐžĐˇŅƒĐŧŅ–Ņ‚Đ¸, Ņ‰Đž, Ņ…ĐžŅ‡Đ° `description`, `tax` Ņ– `tags` ĐŧĐ°ŅŽŅ‚ŅŒ ҂Җ ŅĐ°ĐŧŅ– СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ, Ņ‰Đž Đš Ņ‚Đ¸ĐŋĐžĐ˛Ņ–, вОĐŊи ĐąŅƒĐģи Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊŅ– ŅĐ˛ĐŊĐž (а ĐŊĐĩ Đ˛ĐˇŅŅ‚Ņ– ŅĐē СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ). + +ĐžŅ‚ĐļĐĩ, вОĐŊи ĐąŅƒĐ´ŅƒŅ‚ŅŒ вĐēĐģŅŽŅ‡ĐĩĐŊŅ– ҃ JSON-Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ. + +/// tip | ĐŸĐžŅ€Đ°Đ´Đ° + +ЗвĐĩŅ€ĐŊŅ–Ņ‚ŅŒ ŅƒĐ˛Đ°ĐŗŅƒ, Ņ‰Đž Ņ‚Đ¸ĐŋĐžĐ˛Ņ– СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐŧĐžĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ ĐąŅƒĐ´ŅŒ-ŅĐēиĐŧи, ĐŊĐĩ ĐģĐ¸ŅˆĐĩ `None`. + +ĐĻĐĩ ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ list (`[]`), `float` 10.5 Ņ‚ĐžŅ‰Đž. + +/// + +### `response_model_include` Ņ‚Đ° `response_model_exclude` + +Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ *Đ´ĐĩĐēĐžŅ€Đ°Ņ‚ĐžŅ€Đ° ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ҈ĐģŅŅ…Ņƒ* `response_model_include` Ņ‚Đ° `response_model_exclude`. + +ВоĐŊи ĐŋŅ€Đ¸ĐšĐŧĐ°ŅŽŅ‚ŅŒ `set` (ĐŧĐŊĐžĐļиĐŊ҃) Ņ€ŅĐ´ĐēŅ–Đ˛ (`str`) С Ņ–ĐŧĐĩĐŊаĐŧи Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Ņ–Đ˛, ŅĐēŅ– ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž вĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸ (ĐŋŅ€ĐžĐŋ҃ҁĐēĐ°ŅŽŅ‡Đ¸ Ņ–ĐŊŅˆŅ–) айО виĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸ (вĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ Ņ–ĐŊŅˆŅ–). + +ĐĻĐĩ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ŅĐē ŅˆĐ˛Đ¸Đ´ĐēиК ҁĐŋĐžŅŅ–Đą, ŅĐēŅ‰Đž ҃ Đ’Đ°Ņ Ņ” ĐģĐ¸ŅˆĐĩ ОдĐŊа ĐŧОдĐĩĐģҌ Pydantic Ņ– Ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ видаĐģĐ¸Ņ‚Đ¸ Đ´ĐĩŅĐēŅ– даĐŊŅ– С Đ˛Đ¸Đ˛ĐžĐ´Ņƒ. + +/// tip | ĐŸĐžŅ€Đ°Đ´Đ° + +АĐģĐĩ Đ˛ŅĐĩ Đļ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐžĐŋĐ¸ŅĐ°ĐŊŅ– Đ˛Đ¸Ņ‰Đĩ ĐŋŅ–Đ´Ņ…ĐžĐ´Đ¸, Ņ–Đˇ ĐˇĐ°ŅŅ‚ĐžŅŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ĐēŅ–ĐģҌĐēĐžŅ… ĐēĐģĐ°ŅŅ–Đ˛, СаĐŧŅ–ŅŅ‚ŅŒ Ņ†Đ¸Ņ… ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛. + + +ĐĻĐĩ Ņ‚ĐžĐŧ҃, Ņ‰Đž JSON Schema, ŅĐēиК ĐŗĐĩĐŊĐĩŅ€ŅƒŅ”Ņ‚ŅŒŅŅ ҃ Đ˛Đ°ŅˆĐžĐŧ҃ OpenAPI Đ´ĐžĐ´Đ°Ņ‚Đē҃ (Ņ– в Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ—), Đ˛ŅĐĩ ОдĐŊĐž ĐąŅƒĐ´Đĩ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ‚Đ¸ ĐŋОвĐŊŅ–Đš ĐŧОдĐĩĐģŅ–, ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ŅĐēŅ‰Đž Ви виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ `response_model_include` айО `response_model_exclude` Đ´ĐģŅ виĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ Đ´ĐĩŅĐēĐ¸Ņ… Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Ņ–Đ˛. + +ĐĻĐĩ Ņ‚Đ°ĐēĐžĐļ ŅŅ‚ĐžŅŅƒŅ”Ņ‚ŅŒŅŅ `response_model_by_alias`, ŅĐēиК ĐŋŅ€Đ°Ņ†ŅŽŅ” ĐŋĐžĐ´Ņ–ĐąĐŊиĐŧ Ņ‡Đ¸ĐŊĐžĐŧ. + +/// + +{* ../../docs_src/response_model/tutorial005_py310.py hl[29,35] *} + +/// tip | ĐŸĐžŅ€Đ°Đ´Đ° + +ХиĐŊŅ‚Đ°ĐēŅĐ¸Ņ `{"name", "description"}` ŅŅ‚Đ˛ĐžŅ€ŅŽŅ” `set` С Ņ†Đ¸Đŧи двОĐŧа СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧи. + +Đ’Ņ–ĐŊ ĐĩĐēĐ˛Ņ–Đ˛Đ°ĐģĐĩĐŊŅ‚ĐŊиК `set(["name", "description"])`. + +/// + +#### ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ `list` СаĐŧŅ–ŅŅ‚ŅŒ `set` + +Đ¯ĐēŅ‰Đž Ви ĐˇĐ°ĐąŅƒĐ´ĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ `set` Ņ– ĐŊĐ°Ņ‚ĐžĐŧŅ–ŅŅ‚ŅŒ ĐˇĐ°ŅŅ‚ĐžŅŅƒŅ”Ņ‚Đĩ `list` айО `tuple`, FastAPI Đ˛ŅĐĩ ОдĐŊĐž ĐŋĐĩŅ€ĐĩŅ‚Đ˛ĐžŅ€Đ¸Ņ‚ŅŒ ҆Đĩ ĐŊа `set`, Ņ– Đ˛ŅĐĩ ĐŋŅ€Đ°Ņ†ŅŽĐ˛Đ°Ņ‚Đ¸ĐŧĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐž: + +{* ../../docs_src/response_model/tutorial006_py310.py hl[29,35] *} + +## ĐŸŅ–Đ´ŅŅƒĐŧĐžĐē + +ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `response_model` *Đ´ĐĩĐēĐžŅ€Đ°Ņ‚ĐžŅ€Đ° ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ҈ĐģŅŅ…Ņƒ*, Ņ‰ĐžĐą виСĐŊĐ°Ņ‡Đ°Ņ‚Đ¸ ĐŧОдĐĩĐģŅ– Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ–, ĐžŅĐžĐąĐģивО Ņ‰ĐžĐą ĐŗĐ°Ņ€Đ°ĐŊŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ҄ҖĐģŅŒŅ‚Ņ€Đ°Ņ†Ņ–ŅŽ ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊĐ¸Ņ… даĐŊĐ¸Ņ…. + +ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ `response_model_exclude_unset`, Ņ‰ĐžĐą ĐŋОвĐĩŅ€Ņ‚Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ŅĐ˛ĐŊĐž Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊŅ– СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ. diff --git a/docs/uk/docs/tutorial/response-status-code.md b/docs/uk/docs/tutorial/response-status-code.md new file mode 100644 index 000000000..1ed69d6f2 --- /dev/null +++ b/docs/uk/docs/tutorial/response-status-code.md @@ -0,0 +1,100 @@ +# ĐĄŅ‚Đ°Ņ‚ŅƒŅ ĐēОди Đ’Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐĩĐš + +ĐĸаĐē ŅĐ°ĐŧĐž ŅĐē Ви ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐŧОдĐĩĐģҌ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ–, Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ ĐžĐŗĐžĐģĐžŅĐ¸Ņ‚Đ¸ HTTP ĐēОд ŅŅ‚Đ°Ņ‚ŅƒŅŅƒ Đ´ĐģŅ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ– Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° `status_code` в ĐąŅƒĐ´ŅŒ-ŅĐēŅ–Đš С *ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Đš ҈ĐģŅŅ…Ņƒ*: + +* `@app.get()` +* `@app.post()` +* `@app.put()` +* `@app.delete()` +* Ņ‚ĐžŅ‰Đž. + +{* ../../docs_src/response_status_code/tutorial001.py hl[6] *} + +/// note | ĐĐžŅ‚Đ°Ņ‚Đēа + +ЗвĐĩŅ€ĐŊŅ–Ņ‚ŅŒ ŅƒĐ˛Đ°ĐŗŅƒ, Ņ‰Đž `status_code` Ņ” ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ĐžĐŧ ĐŧĐĩŅ‚ĐžĐ´Ņƒ "Đ´ĐĩĐēĐžŅ€Đ°Ņ‚ĐžŅ€Đ°" (`get`, `post` Ņ– Ņ‚.Đ´.), а ĐŊĐĩ Đ’Đ°ŅˆĐžŅ— *Ņ„ŅƒĐŊĐē҆Җҗ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ҈ĐģŅŅ…Ņƒ*, ŅĐē ŅƒŅŅ– Ņ–ĐŊŅˆŅ– ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ Ņ‚Đ° ҂ҖĐģĐž СаĐŋĐ¸Ņ‚Ņƒ. + +/// + +ĐŸĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `status_code` ĐŋŅ€Đ¸ĐšĐŧĐ°Ņ” Ņ‡Đ¸ŅĐģĐž, ŅĐēĐĩ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ” HTTP ĐēĐžĐ´Ņƒ ŅŅ‚Đ°Ņ‚ŅƒŅŅƒ. + +/// info | ІĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ +`status_code` Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩ ĐžŅ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°Ņ‚Đ¸ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ С `IntEnum`, ĐŊаĐŋŅ€Đ¸ĐēĐģад, С Python `http.HTTPStatus`. + +/// + +Đ’Ņ–ĐŊ ĐąŅƒĐ´Đĩ: + +* ПовĐĩŅ€Ņ‚Đ°Ņ‚Đ¸ вĐēаСаĐŊиК ĐēОд ŅŅ‚Đ°Ņ‚ŅƒŅŅƒ ҃ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ–. +* ДоĐē҃ĐŧĐĩĐŊŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž ŅĐē Ņ‚Đ°ĐēиК ҃ ҁ҅ĐĩĐŧŅ– OpenAPI (Ņ–, Ņ‚Đ°ĐēиĐŧ Ņ‡Đ¸ĐŊĐžĐŧ, в Ņ–ĐŊŅ‚ĐĩҀ҄ĐĩĐšŅŅ– ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ°): + + + +/// note | ĐĐžŅ‚Đ°Ņ‚Đēа + +ДĐĩŅĐēŅ– ĐēОди Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ– (див. ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊиК Ņ€ĐžĐˇĐ´Ņ–Đģ) вĐēĐ°ĐˇŅƒŅŽŅ‚ŅŒ, Ņ‰Đž Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ ĐŊĐĩ ĐŧĐ°Ņ” ҂ҖĐģа. + +FastAPI СĐŊĐ°Ņ” ĐŋŅ€Đž ҆Đĩ Ņ– ŅŅ‚Đ˛ĐžŅ€Đ¸Ņ‚ŅŒ OpenAPI Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–ŅŽ, ŅĐēа вĐēĐ°ĐˇŅƒŅ”, Ņ‰Đž ҂ҖĐģа Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ– ĐŊĐĩĐŧĐ°Ņ”. + +/// + +## ĐŸŅ€Đž HTTP ŅŅ‚Đ°Ņ‚ŅƒŅ ĐēОди + +/// note | ĐĐžŅ‚Đ°Ņ‚Đēа + +Đ¯ĐēŅ‰Đž Ви вĐļĐĩ СĐŊĐ°Ņ”Ņ‚Đĩ, Ņ‰Đž Ņ‚Đ°ĐēĐĩ HTTP ĐēОди ŅŅ‚Đ°Ņ‚ŅƒŅŅƒ, ĐŋĐĩŅ€ĐĩŅ…ĐžĐ´ŅŒŅ‚Đĩ Đ´Đž ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž Ņ€ĐžĐˇĐ´Ņ–Đģ҃. + +/// + +В HTTP Ви ĐŊĐ°Đ´ŅĐ¸ĐģĐ°Ņ”Ņ‚Đĩ Ņ‡Đ¸ŅĐģОвиК ĐēОд ŅŅ‚Đ°Ņ‚ŅƒŅŅƒ С 3 Ņ†Đ¸Ņ„Ņ€ ŅĐē Ņ‡Đ°ŅŅ‚Đ¸ĐŊ҃ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ–. + +ĐĻŅ– ĐēОди ŅŅ‚Đ°Ņ‚ŅƒŅŅƒ ĐŧĐ°ŅŽŅ‚ŅŒ ĐŋĐžĐ˛â€™ŅĐˇĐ°ĐŊ҃ ĐŊĐ°ĐˇĐ˛Ņƒ Đ´ĐģŅ Ņ—Ņ… Ņ€ĐžĐˇĐŋŅ–ĐˇĐŊаваĐŊĐŊŅ, аĐģĐĩ ĐŊаКваĐļĐģĐ¸Đ˛Ņ–ŅˆĐžŅŽ Ņ‡Đ°ŅŅ‚Đ¸ĐŊĐžŅŽ Ņ” ŅĐ°ĐŧĐĩ Ņ‡Đ¸ŅĐģĐž. + +ĐšĐžŅ€ĐžŅ‚ĐēĐž: + +* **`100 - 199`** "ІĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ĐšĐŊŅ–" Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ–. Ви Ņ€Ņ–Đ´ĐēĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ Ņ—Ņ… ĐŊаĐŋŅ€ŅĐŧ҃. Đ’Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ– С Ņ‚Đ°ĐēиĐŧи ĐēОдаĐŧи ĐŊĐĩ ĐŧĐžĐļŅƒŅ‚ŅŒ ĐŧĐ°Ņ‚Đ¸ ҂ҖĐģа. +* **`200 - 299`** "ĐŖŅĐŋŅ–ŅˆĐŊŅ–" Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ–. ĐĻĐĩ ҂Җ, ŅĐēŅ– Ви виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ĐŧĐĩŅ‚Đĩ ĐŊĐ°ĐšŅ‡Đ°ŅŅ‚Ņ–ŅˆĐĩ. + * `200` - ĐēОд Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ, ŅĐēиК ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž Đ˛ŅĐĩ ĐŋŅ€ĐžĐšŅˆĐģĐž "OK". + * ІĐŊŅˆĐ¸Đš ĐŋŅ€Đ¸ĐēĐģад – `201`, "Created" (ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐž). Đ™ĐžĐŗĐž ĐˇĐ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒ ĐŋҖҁĐģŅ ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ ĐŊĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒ в ĐąĐ°ĐˇŅ– даĐŊĐ¸Ņ…. + * ĐžŅĐžĐąĐģивиК виĐŋадОĐē – `204`, "No Content" (ĐŊĐĩĐŧĐ°Ņ” вĐŧŅ–ŅŅ‚Ņƒ). ĐĻŅ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ, ĐēĐžĐģи ĐŊĐĩĐŧĐ°Ņ” даĐŊĐ¸Ņ… Đ´ĐģŅ ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ ĐēĐģŅ–Ņ”ĐŊŅ‚Ņƒ, Ņ‚ĐžĐŧ҃ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ŅŒ ĐŊĐĩ ĐŋОвиĐŊĐŊа ĐŧĐ°Ņ‚Đ¸ ҂ҖĐģа. +* **`300 - 399`** "ПĐĩŅ€ĐĩĐŊаĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ". Đ’Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Ņ– С Ņ†Đ¸Đŧи ĐēОдаĐŧи ĐŧĐžĐļŅƒŅ‚ŅŒ ĐŧĐ°Ņ‚Đ¸ айО ĐŊĐĩ ĐŧĐ°Ņ‚Đ¸ ҂ҖĐģа, Са виĐŊŅŅ‚ĐēĐžĐŧ `304`, "Not Modified" (ĐŊĐĩ СĐŧŅ–ĐŊĐĩĐŊĐž), ŅĐēа ĐŊĐĩ ĐŋОвиĐŊĐŊа ĐŧĐ°Ņ‚Đ¸ ҂ҖĐģа. +* **`400 - 499`** "ПоĐŧиĐģĐēа ĐēĐģŅ–Ņ”ĐŊŅ‚Đ°". ĐĻĐĩ Đ´Ņ€ŅƒĐŗĐ¸Đš Ņ‚Đ¸Đŋ, ŅĐēиК Ви, ĐšĐŧĐžĐ˛Ņ–Ņ€ĐŊĐž, ĐąŅƒĐ´ĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŊĐ°ĐšŅ‡Đ°ŅŅ‚Ņ–ŅˆĐĩ. + * ĐŸŅ€Đ¸ĐēĐģад `404`, "Not Found" (ĐŊĐĩ СĐŊаКдĐĩĐŊĐž). + * ДĐģŅ ĐˇĐ°ĐŗĐ°ĐģҌĐŊĐ¸Ņ… ĐŋĐžĐŧиĐģĐžĐē ĐēĐģŅ–Ņ”ĐŊŅ‚Đ° ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `400`. +* `500 - 599` "ПоĐŧиĐģĐēи ҁĐĩŅ€Đ˛ĐĩŅ€Đ°". Ви ĐŧаКĐļĐĩ ĐŊŅ–ĐēĐžĐģи ĐŊĐĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ Ņ—Ņ… ĐŊаĐŋŅ€ŅĐŧ҃. Đ¯ĐēŅ‰Đž в ĐēĐžĐ´Ņ– Đ’Đ°ŅˆĐžĐŗĐž ĐˇĐ°ŅŅ‚ĐžŅŅƒĐŊĐē҃ айО ĐŊа ҁĐĩŅ€Đ˛ĐĩҀҖ Ņ‰ĐžŅŅŒ ĐŋŅ–ŅˆĐģĐž ĐŊĐĩ Ņ‚Đ°Đē, Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐąŅƒĐ´Đĩ ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐž ОдиĐŊ Ņ–Đˇ Ņ†Đ¸Ņ… ĐēĐžĐ´Ņ–Đ˛ ŅŅ‚Đ°Ņ‚ŅƒŅŅƒ. + +/// tip | ĐŸĐžŅ€Đ°Đ´Đ° + +ЊОй Đ´Ņ–ĐˇĐŊĐ°Ņ‚Đ¸ŅŅ ĐąŅ–ĐģҌ҈Đĩ ĐŋŅ€Đž ĐēĐžĐļĐĩĐŊ ĐēОд ŅŅ‚Đ°Ņ‚ŅƒŅŅƒ Ņ– ĐŋŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐēĐžĐļĐŊĐžĐŗĐž С ĐŊĐ¸Ņ…, ĐŋĐĩŅ€ĐĩĐŗĐģŅĐŊŅŒŅ‚Đĩ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–ŅŽ MDN ĐŋŅ€Đž HTTP ĐēОди ŅŅ‚Đ°Ņ‚ŅƒŅŅƒ. + +/// + +## ЛĐĩĐŗĐēиК ҁĐŋĐžŅŅ–Đą СаĐŋаĐŧ'ŅŅ‚Đ°Ņ‚Đ¸ ĐŊаСви + +Đ ĐžĐˇĐŗĐģŅĐŊĐĩĐŧĐž ҉Đĩ Ņ€Đ°Đˇ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅ–Đš ĐŋŅ€Đ¸ĐēĐģад: + +{* ../../docs_src/response_status_code/tutorial001.py hl[6] *} + +`201` - ҆Đĩ ĐēОд ŅŅ‚Đ°Ņ‚ŅƒŅŅƒ Đ´ĐģŅ "Created" (ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐž). + +АĐģĐĩ ВаĐŧ ĐŊĐĩ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž СаĐŋаĐŧ'ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸, Ņ‰Đž ОСĐŊĐ°Ņ‡Đ°Ņ” ĐēĐžĐļĐĩĐŊ Ņ–Đˇ Ņ†Đ¸Ņ… ĐēĐžĐ´Ņ–Đ˛. + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐˇŅ€ŅƒŅ‡ĐŊŅ– СĐŧŅ–ĐŊĐŊŅ– С `fastapi.status` + +{* ../../docs_src/response_status_code/tutorial002.py hl[1,6] *} + +ĐĻŅ– СĐŧŅ–ĐŊĐŊŅ– ĐŋŅ€ĐžŅŅ‚Đž Đ´ĐģŅ ĐˇŅ€ŅƒŅ‡ĐŊĐžŅŅ‚Ņ–. ВоĐŊи ĐŧŅ–ŅŅ‚ŅŅ‚ŅŒ ҂Җ Đļ ŅĐ°ĐŧŅ– Ņ‡Đ¸ŅĐģа, аĐģĐĩ Ви ĐŧĐžĐļĐĩŅ‚Đĩ ҁĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ŅŅ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅĐŧ в Ņ€ĐĩдаĐēŅ‚ĐžŅ€Ņ–: + + + +/// note | ĐĸĐĩŅ…ĐŊҖ҇ĐŊŅ– Đ´ĐĩŅ‚Đ°ĐģŅ– + +Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ `from starlette import status`. + +**FastAPI** ĐŊĐ°Đ´Đ°Ņ” ҂Җ Đļ ŅĐ°ĐŧŅ– СĐŧŅ–ĐŊĐŊŅ– `starlette.status` ŅĐē `fastapi.status`, ĐŋŅ€ĐžŅŅ‚Đž Đ´ĐģŅ ĐˇŅ€ŅƒŅ‡ĐŊĐžŅŅ‚Ņ– Ņ€ĐžĐˇŅ€ĐžĐąĐŊиĐēа. ОдĐŊаĐē вОĐŊи ĐŋĐžŅ…ĐžĐ´ŅŅ‚ŅŒ ĐąĐĩСĐŋĐžŅĐĩŅ€ĐĩĐ´ĐŊŅŒĐž ĐˇŅ– Starlette. + +/// + +## ЗĐŧŅ–ĐŊа СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ + +ДаĐģŅ–, ҃ ĐŸĐžŅŅ–ĐąĐŊиĐē҃ Đ´ĐģŅ Đ´ĐžŅĐ˛Ņ–Đ´Ņ‡ĐĩĐŊĐ¸Ņ… ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Ņ–Đ˛{.internal-link target=_blank}, Ви Đ´Ņ–ĐˇĐŊĐ°Ņ”Ņ‚ĐĩҁҌ, ŅĐē ĐŋОвĐĩŅ€ĐŊŅƒŅ‚Đ¸ Ņ–ĐŊŅˆĐ¸Đš ĐēОд ŅŅ‚Đ°Ņ‚ŅƒŅŅƒ, ĐŊŅ–Đļ Ņ‚ĐžĐš, ŅĐēиК Ви ĐžĐŗĐžĐģĐžŅĐ¸Đģи Ņ‚ŅƒŅ‚. diff --git a/docs/uk/docs/tutorial/schema-extra-example.md b/docs/uk/docs/tutorial/schema-extra-example.md new file mode 100644 index 000000000..853fd5e65 --- /dev/null +++ b/docs/uk/docs/tutorial/schema-extra-example.md @@ -0,0 +1,222 @@ +# ДĐĩĐēĐģĐ°Ņ€ŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņ–Đ˛ Đ˛Ņ…Ņ–Đ´ĐŊĐ¸Ņ… даĐŊĐ¸Ņ… + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇĐ°Đ´Đ°Ņ‚Đ¸ ĐŋŅ€Đ¸ĐēĐģади даĐŊĐ¸Ņ…, ŅĐēŅ– Đ’Đ°Ņˆ ĐˇĐ°ŅŅ‚ĐžŅŅƒĐŊĐžĐē ĐŧĐžĐļĐĩ ĐžŅ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°Ņ‚Đ¸. + +ĐžŅŅŒ ĐēŅ–ĐģҌĐēа ҁĐŋĐžŅĐžĐąŅ–Đ˛, ŅĐē ҆Đĩ ĐˇŅ€ĐžĐąĐ¸Ņ‚Đ¸. + +## Đ”ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– даĐŊŅ– JSON-ҁ҅ĐĩĐŧи в ĐŧОдĐĩĐģŅŅ… Pydantic + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇĐ°Đ´Đ°Ņ‚Đ¸ `examples` Đ´ĐģŅ ĐŧОдĐĩĐģŅ– Pydantic, ŅĐēŅ– ĐąŅƒĐ´Đĩ дОдаĐŊĐž Đ´Đž ĐˇĐŗĐĩĐŊĐĩŅ€ĐžĐ˛Đ°ĐŊĐžŅ— JSON-ҁ҅ĐĩĐŧи. + +//// tab | Pydantic v2 + +{* ../../docs_src/schema_extra_example/tutorial001_py310.py hl[13:24] *} + +//// + +//// tab | Pydantic v1 + +{* ../../docs_src/schema_extra_example/tutorial001_pv1_py310.py hl[13:23] *} + +//// + +ĐĻŅ Đ´ĐžĐ´Đ°Ņ‚ĐēОва Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ ĐąŅƒĐ´Đĩ дОдаĐŊа ŅĐē Ņ” Đ´Đž **JSON-ҁ҅ĐĩĐŧи**, Ņ– вОĐŊа ĐąŅƒĐ´Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ŅŅ в Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— Đ´Đž API. + +//// tab | Pydantic v2 + +ĐŖ вĐĩҀҁҖҗ Pydantic 2 виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚ `model_config`, ŅĐēиК ĐŋŅ€Đ¸ĐšĐŧĐ°Ņ” `dict`, ŅĐē ĐžĐŋĐ¸ŅĐ°ĐŊĐž в Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— Pydantic: КоĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ. + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ `"json_schema_extra"` ŅĐē `dict`, Ņ‰Đž ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ ĐąŅƒĐ´ŅŒ-ŅĐēŅ– Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– даĐŊŅ–, ŅĐēŅ– Ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐˇĐ¸Ņ‚Đ¸ ҃ ĐˇĐŗĐĩĐŊĐĩŅ€ĐžĐ˛Đ°ĐŊŅ–Đš JSON-ҁ҅ĐĩĐŧŅ–, вĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ `examples`. + +//// + +//// tab | Pydantic v1 + +ĐŖ вĐĩҀҁҖҗ Pydantic 1 виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ вĐŊŅƒŅ‚Ņ€Ņ–ŅˆĐŊŅ–Đš ĐēĐģĐ°Ņ `Config` Ņ– ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `schema_extra`, ŅĐē ĐžĐŋĐ¸ŅĐ°ĐŊĐž в Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— Pydantic: НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ҁ҅ĐĩĐŧи. + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇĐ°Đ´Đ°Ņ‚Đ¸ `schema_extra` ŅĐē `dict`, Ņ‰Đž ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ ĐąŅƒĐ´ŅŒ-ŅĐēŅ– Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– даĐŊŅ–, ŅĐēŅ– Ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐąĐ°Ņ‡Đ¸Ņ‚Đ¸ ҃ ĐˇĐŗĐĩĐŊĐĩŅ€ĐžĐ˛Đ°ĐŊŅ–Đš JSON-ҁ҅ĐĩĐŧŅ–, вĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ `examples`. + +//// + +/// tip | ĐŸŅ–Đ´ĐēаСĐēа + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ Ņ‚Ņƒ Đļ Ņ‚ĐĩŅ…ĐŊŅ–Đē҃, Ņ‰ĐžĐą Ņ€ĐžĐˇŅˆĐ¸Ņ€Đ¸Ņ‚Đ¸ JSON-ҁ҅ĐĩĐŧ҃ Ņ– Đ´ĐžĐ´Đ°Ņ‚Đ¸ вĐģĐ°ŅĐŊ҃ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņƒ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ. + +НаĐŋŅ€Đ¸ĐēĐģад, Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ Ņ—Ņ— Đ´ĐģŅ дОдаваĐŊĐŊŅ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐ¸Ņ… Đ´ĐģŅ Ņ–ĐŊŅ‚ĐĩҀ҄ĐĩĐšŅŅƒ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ° ĐŊа Ņ„Ņ€ĐžĐŊŅ‚ĐĩĐŊĐ´Ņ– Ņ‚ĐžŅ‰Đž. + +/// + +/// info | ІĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ + +OpenAPI 3.1.0 (ŅĐēиК виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ ĐŋĐžŅ‡Đ¸ĐŊĐ°ŅŽŅ‡Đ¸ С FastAPI 0.99.0) дОдав ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐē҃ `examples`, Ņ‰Đž Ņ” Ņ‡Đ°ŅŅ‚Đ¸ĐŊĐžŅŽ ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚Ņƒ **JSON-ҁ҅ĐĩĐŧи**. + +До Ņ†ŅŒĐžĐŗĐž ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°Đ˛ŅŅ ĐģĐ¸ŅˆĐĩ ĐēĐģŅŽŅ‡ `example` С ОдĐŊиĐŧ ĐŋŅ€Đ¸ĐēĐģадОĐŧ. Đ’Ņ–ĐŊ Đ˛ŅĐĩ ҉Đĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚ŅŒŅŅ в OpenAPI 3.1.0, аĐģĐĩ Ņ” ĐˇĐ°ŅŅ‚Đ°Ņ€Ņ–ĐģиĐŧ Ņ– ĐŊĐĩ Đ˛Ņ…ĐžĐ´Đ¸Ņ‚ŅŒ Đ´Đž ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚Ņƒ JSON Schema. ĐĸĐžĐŧ҃ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ ĐŋĐĩŅ€ĐĩĐšŅ‚Đ¸ С `example` ĐŊа `examples`. 🤓 + +Đ‘Ņ–ĐģҌ҈Đĩ ĐŋŅ€Đž ҆Đĩ ĐŧĐžĐļĐŊа ĐŋŅ€ĐžŅ‡Đ¸Ņ‚Đ°Ņ‚Đ¸ в ĐēŅ–ĐŊ҆Җ ҆ҖҔҗ ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи. + +/// + +## Đ”ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– Đ°Ņ€ĐŗŅƒĐŧĐĩĐŊŅ‚Đ¸ `Field` + +КоĐģи ви виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ `Field()` ҃ ĐŧОдĐĩĐģŅŅ… Pydantic, Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐ°ĐˇĐ°Ņ‚Đ¸ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– `examples`: + +{* ../../docs_src/schema_extra_example/tutorial002_py310.py hl[2,8:11] *} + +## `examples` ҃ JSON-ҁ҅ĐĩĐŧŅ– — OpenAPI + +ĐŸŅ€Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ– ĐąŅƒĐ´ŅŒ-ĐēĐžĐŗĐž С ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž: + +* `Path()` +* `Query()` +* `Header()` +* `Cookie()` +* `Body()` +* `Form()` +* `File()` + +Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇĐ°Đ´Đ°Ņ‚Đ¸ ĐŊĐ°ĐąŅ–Ņ€ `examples` С Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžŅŽ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ”ŅŽ, ŅĐēа ĐąŅƒĐ´Đĩ дОдаĐŊа Đ´Đž Ņ—Ņ…ĐŊŅ–Ņ… **JSON-ҁ҅ĐĩĐŧ** ҃ **OpenAPI**. + +### `Body` С `examples` + +ĐĸŅƒŅ‚ Đŧи ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ”ĐŧĐž `examples`, ŅĐēŅ– ĐŧŅ–ŅŅ‚ŅŅ‚ŅŒ ОдиĐŊ ĐŋŅ€Đ¸ĐēĐģад ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐ¸Ņ… даĐŊĐ¸Ņ… ҃ `Body()`: + +{* ../../docs_src/schema_extra_example/tutorial003_an_py310.py hl[22:29] *} + +### ĐŸŅ€Đ¸ĐēĐģад ҃ UI Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— + +За Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐąŅƒĐ´ŅŒ-ŅĐēĐžĐŗĐž С ĐŊавĐĩĐ´ĐĩĐŊĐ¸Ņ… Đ˛Đ¸Ņ‰Đĩ ĐŧĐĩŅ‚ĐžĐ´Ņ–Đ˛ ҆Đĩ Đ˛Đ¸ĐŗĐģŅĐ´Đ°Ņ‚Đ¸ĐŧĐĩ Ņ‚Đ°Đē ҃ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— Са `/docs`: + + + +### `Body` С ĐēŅ–ĐģҌĐēĐžĐŧа `examples` + +Đ—Đ˛Đ¸Ņ‡Đ°ĐšĐŊĐž, Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‚Đ¸ ĐēŅ–ĐģҌĐēа `examples`: + +{* ../../docs_src/schema_extra_example/tutorial004_an_py310.py hl[23:38] *} + +КоĐģи Ви ҆Đĩ Ņ€ĐžĐąĐ¸Ņ‚Đĩ, ĐŋŅ€Đ¸ĐēĐģади ĐąŅƒĐ´ŅƒŅ‚ŅŒ Ņ‡Đ°ŅŅ‚Đ¸ĐŊĐžŅŽ вĐŊŅƒŅ‚Ņ€Ņ–ŅˆĐŊŅŒĐžŅ— **JSON-ҁ҅ĐĩĐŧи** Đ´ĐģŅ Ņ†Đ¸Ņ… даĐŊĐ¸Ņ…. + +Đ’Ņ‚Ņ–Đŧ, ĐŊа ĐŧĐžĐŧĐĩĐŊŅ‚ ĐŊаĐŋĐ¸ŅĐ°ĐŊĐŊŅ Ņ†ŅŒĐžĐŗĐž (26 ҁĐĩŅ€ĐŋĐŊŅ 2023), Swagger UI — Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚, ŅĐēиК Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ” Са Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ UI Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— — ĐŊĐĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ” ĐŋĐžĐēаС ĐēŅ–ĐģҌĐēĐžŅ… ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņ–Đ˛ ҃ **JSON-ҁ҅ĐĩĐŧи**. АĐģĐĩ ĐŊиĐļ҇Đĩ ĐŧĐžĐļĐŊа ĐŋŅ€ĐžŅ‡Đ¸Ņ‚Đ°Ņ‚Đ¸ ĐŋŅ€Đž ĐžĐąŅ…Ņ–Đ´ĐŊиК ҈ĐģŅŅ…. + +### ĐĄĐŋĐĩŅ†Đ¸Ņ„Ņ–Ņ‡ĐŊŅ– Đ´ĐģŅ OpenAPI `examples` + +ĐŠĐĩ Đ´Đž Ņ‚ĐžĐŗĐž, ŅĐē **JSON-ҁ҅ĐĩĐŧа** ĐŋĐžŅ‡Đ°Đģа ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°Ņ‚Đ¸ `examples`, OpenAPI вĐļĐĩ ĐŧаĐģа ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐē҃ ĐŋĐžĐģŅ С Ņ‚Đ°ĐēĐžŅŽ Đļ ĐŊĐ°ĐˇĐ˛ĐžŅŽ — `examples`. + +ĐĻĐĩ **ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–Ņ‡ĐŊĐĩ Đ´ĐģŅ OpenAPI** ĐŋĐžĐģĐĩ `examples` Ņ€ĐžĐˇĐŧŅ–Ņ‰ŅƒŅ”Ņ‚ŅŒŅŅ в Ņ–ĐŊŅˆŅ–Đš Ņ‡Đ°ŅŅ‚Đ¸ĐŊŅ– ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— OpenAPI — ҃ **Đ´ĐĩŅ‚Đ°ĐģŅŅ… ĐēĐžĐļĐŊĐžŅ— *ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ҈ĐģŅŅ…Ņƒ***, а ĐŊĐĩ Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– ŅĐ°ĐŧĐžŅ— JSON-ҁ҅ĐĩĐŧи. + +Swagger UI вĐļĐĩ давĐŊĐž ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ” ҆Đĩ ĐŋĐžĐģĐĩ `examples`. ĐĸĐžĐŧ҃ Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž, Ņ‰ĐžĐą **Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°Ņ‚Đ¸** ĐēŅ–ĐģҌĐēа **ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņ–Đ˛ ҃ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ—**. + +ĐĻĐĩ ĐŋĐžĐģĐĩ `examples` ҃ ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— OpenAPI — ҆Đĩ `dict` (ҁĐģОвĐŊиĐē) С **ĐēŅ–ĐģҌĐēĐžĐŧа ĐŋŅ€Đ¸ĐēĐģадаĐŧи** (а ĐŊĐĩ ҁĐŋĐ¸ŅĐžĐē `list`), ĐēĐžĐļĐĩĐŊ Ņ–Đˇ ŅĐēĐ¸Ņ… ĐŧĐžĐļĐĩ ĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņƒ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ, Ņ‰Đž ĐąŅƒĐ´Đĩ дОдаĐŊа Đ´Đž **OpenAPI**. + +ВоĐŊĐž ĐŊĐĩ вĐēĐģŅŽŅ‡Đ°Ņ”Ņ‚ŅŒŅŅ Đ´Đž JSON Schema ĐēĐžĐļĐŊĐžĐŗĐž ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ°, а Ņ€ĐžĐˇĐŧŅ–Ņ‰ŅƒŅ”Ņ‚ŅŒŅŅ СОвĐŊŅ–, ĐąĐĩСĐŋĐžŅĐĩŅ€ĐĩĐ´ĐŊŅŒĐž в *ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ҈ĐģŅŅ…Ņƒ*. + +### ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° `openapi_examples` + +Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐžĐŗĐžĐģĐžŅĐ¸Ņ‚Đ¸ ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–Ņ‡ĐŊŅ– Đ´ĐģŅ OpenAPI `examples` ҃ FastAPI Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° `openapi_examples` Đ´ĐģŅ: + +* `Path()` +* `Query()` +* `Header()` +* `Cookie()` +* `Body()` +* `Form()` +* `File()` + +КĐģŅŽŅ‡Ņ– ҁĐģОвĐŊиĐēа (`dict`) Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒ ĐēĐžĐļĐĩĐŊ ĐŋŅ€Đ¸ĐēĐģад, а ĐēĐžĐļĐŊĐĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ `dict` — ĐēĐžĐļĐĩĐŊ ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–Ņ‡ĐŊиК ҁĐģОвĐŊиĐē `dict` в `examples` ĐŧĐžĐļĐĩ ĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸: + +* `summary`: ĐēĐžŅ€ĐžŅ‚ĐēиК ĐžĐŋĐ¸Ņ ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņƒ. +* `description`: Ņ€ĐžĐˇĐŗĐžŅ€ĐŊŅƒŅ‚Đ¸Đš ĐžĐŋĐ¸Ņ (ĐŧĐžĐļĐĩ ĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸ Markdown). +* `value`: ŅĐ°Đŧ ĐŋŅ€Đ¸ĐēĐģад, ĐŊаĐŋŅ€Đ¸ĐēĐģад, ҁĐģОвĐŊиĐē (`dict`). +* `externalValue`: аĐģŅŒŅ‚ĐĩŅ€ĐŊĐ°Ņ‚Đ¸Đ˛Đ° `value`, URL-Đ°Đ´Ņ€ĐĩŅĐ°, Ņ‰Đž вĐēĐ°ĐˇŅƒŅ” ĐŊа ĐŋŅ€Đ¸ĐēĐģад. ĐŸŅ€ĐžŅ‚Đĩ Ņ†Ņ ĐžĐŋŅ†Ņ–Ņ ĐŧĐžĐļĐĩ ĐŊĐĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°Ņ‚Đ¸ŅŅ ĐąŅ–ĐģŅŒŅˆŅ–ŅŅ‚ŅŽ Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Ņ–Đ˛, ĐŊа Đ˛Ņ–Đ´ĐŧŅ–ĐŊ҃ Đ˛Ņ–Đ´ `value`. + +ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ Đ˛Đ¸ĐŗĐģŅĐ´Đ°Ņ” Ņ‚Đ°Đē: + +{* ../../docs_src/schema_extra_example/tutorial005_an_py310.py hl[23:49] *} + +### ĐŸŅ€Đ¸ĐēĐģади OpenAPI ҃ UI Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— + +З ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ĐžĐŧ `openapi_examples`, дОдаĐŊиĐŧ Đ´Đž `Body()`, Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ `/docs` Đ˛Đ¸ĐŗĐģŅĐ´Đ°Ņ‚Đ¸ĐŧĐĩ Ņ‚Đ°Đē: + + + +## ĐĸĐĩŅ…ĐŊҖ҇ĐŊŅ– Đ´ĐĩŅ‚Đ°ĐģŅ– + +/// tip | ĐŸŅ–Đ´ĐēаСĐēа + +Đ¯ĐēŅ‰Đž Ви вĐļĐĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ **FastAPI** вĐĩҀҁҖҗ **0.99.0 айО Đ˛Đ¸Ņ‰Đĩ**, Ви ĐŧĐžĐļĐĩŅ‚Đĩ **ĐŋŅ€ĐžĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸** ҆ĐĩĐš Ņ€ĐžĐˇĐ´Ņ–Đģ. + +Đ’Ņ–ĐŊ ĐąŅ–ĐģҌ҈ аĐēŅ‚ŅƒĐ°ĐģҌĐŊиК Đ´ĐģŅ ŅŅ‚Đ°Ņ€Đ¸Ņ… вĐĩŅ€ŅŅ–Đš, Đ´Đž ĐŋĐžŅĐ˛Đ¸ OpenAPI 3.1.0. + +МоĐļĐŊа вваĐļĐ°Ņ‚Đ¸ ҆Đĩ ĐēĐžŅ€ĐžŅ‚ĐēиĐŧ **Ņ–ŅŅ‚ĐžŅ€Đ¸Ņ‡ĐŊиĐŧ ĐĩĐēҁĐēŅƒŅ€ŅĐžĐŧ** ҃ OpenAPI Ņ‚Đ° JSON Schema. 🤓 + +/// + +/// warning | ПоĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊĐŊŅ + +ĐĻĐĩ Đ´ŅƒĐļĐĩ Ņ‚ĐĩŅ…ĐŊҖ҇ĐŊа Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ ĐŋŅ€Đž ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚Đ¸ **JSON Schema** Ņ– **OpenAPI**. + +Đ¯ĐēŅ‰Đž Đ˛Đ¸Ņ‰ĐĩĐˇĐŗĐ°Đ´Đ°ĐŊŅ– Ņ–Đ´ĐĩŅ— вĐļĐĩ ĐŋŅ€Đ°Ņ†ŅŽŅŽŅ‚ŅŒ ҃ Đ’Đ°Ņ — ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊĐĩ ĐˇĐ°ĐŗĐģийĐģŅŽĐ˛Đ°Ņ‚Đ¸ŅŅ в ҆Җ Đ´ĐĩŅ‚Đ°ĐģŅ–. + +/// + +До OpenAPI 3.1.0 ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Đģа ŅŅ‚Đ°Ņ€Ņƒ Ņ‚Đ° ĐŧĐžĐ´Đ¸Ņ„Ņ–ĐēОваĐŊ҃ вĐĩŅ€ŅŅ–ŅŽ **JSON Schema**. + +ĐžŅĐēŅ–ĐģҌĐēи JSON Schema Ņ€Đ°ĐŊŅ–ŅˆĐĩ ĐŊĐĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°Đģа `examples`, OpenAPI дОдаĐģа вĐģĐ°ŅĐŊĐĩ ĐŋĐžĐģĐĩ `examples`. + +OpenAPI Ņ‚Đ°ĐēĐžĐļ дОдаĐģа `example` Ņ– `examples` Đ´Đž Ņ–ĐŊŅˆĐ¸Ņ… Ņ‡Đ°ŅŅ‚Đ¸ĐŊ ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—: + +* `Parameter Object` (в ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—) виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ FastAPI Đ´ĐģŅ: + * `Path()` + * `Query()` + * `Header()` + * `Cookie()` +* `Request Body Object`, в ĐŋĐžĐģŅ– `content`, в `Media Type Object` (в ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—) виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ FastAPI Đ´ĐģŅ: + * `Body()` + * `File()` + * `Form()` + +/// info | ІĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ + +ĐĻĐĩĐš ŅŅ‚Đ°Ņ€Đ¸Đš ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `examples`, ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–Ņ‡ĐŊиК Đ´ĐģŅ OpenAPI, Ņ‚ĐĩĐŋĐĩŅ€ ĐŊĐ°ĐˇĐ¸Đ˛Đ°Ņ”Ņ‚ŅŒŅŅ `openapi_examples`, ĐŋĐžŅ‡Đ¸ĐŊĐ°ŅŽŅ‡Đ¸ С FastAPI вĐĩҀҁҖҗ `0.103.0`. + +/// + +### ПоĐģĐĩ `examples` ҃ JSON Schema + +ĐŸŅ–ĐˇĐŊŅ–ŅˆĐĩ JSON Schema дОдаĐģа ĐŋĐžĐģĐĩ `examples` ҃ ĐŊĐžĐ˛Ņƒ вĐĩŅ€ŅŅ–ŅŽ ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—. + +І вĐļĐĩ OpenAPI 3.1.0 ĐąĐ°ĐˇŅƒŅ”Ņ‚ŅŒŅŅ ĐŊа Ņ†Ņ–Đš ĐŊĐžĐ˛Ņ–Đš вĐĩҀҁҖҗ (JSON Schema 2020-12), ŅĐēа вĐēĐģŅŽŅ‡Đ°Ņ” ĐŋĐžĐģĐĩ `examples`. + +ĐĸĐĩĐŋĐĩŅ€ ҆Đĩ ĐŋĐžĐģĐĩ `examples` Ņ” ĐŋŅ€Ņ–ĐžŅ€Đ¸Ņ‚ĐĩŅ‚ĐŊиĐŧ Ņ– СаĐŧŅ–ĐŊŅŽŅ” ŅŅ‚Đ°Ņ€Đĩ (Ņ– ĐēĐ°ŅŅ‚ĐžĐŧĐŊĐĩ) ĐŋĐžĐģĐĩ `example`, ŅĐēĐĩ ŅŅ‚Đ°ĐģĐž ĐˇĐ°ŅŅ‚Đ°Ņ€Ņ–ĐģиĐŧ. + +НовĐĩ ĐŋĐžĐģĐĩ `examples` ҃ JSON Schema — ҆Đĩ **ĐŋŅ€ĐžŅŅ‚Đž ҁĐŋĐ¸ŅĐžĐē (`list`)** ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņ–Đ˛, ĐąĐĩС Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Đ¸Ņ… ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐ¸Ņ… (ĐŊа Đ˛Ņ–Đ´ĐŧŅ–ĐŊ҃ Đ˛Ņ–Đ´ OpenAPI). + +/// info | ІĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ + +ĐĐ°Đ˛Ņ–Ņ‚ŅŒ ĐŋҖҁĐģŅ Ņ‚ĐžĐŗĐž, ŅĐē С'ŅĐ˛Đ¸Đ˛ŅŅ OpenAPI 3.1.0, ŅĐēиК ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°Đ˛ examples ҃ JSON Schema, Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ Swagger UI ҉Đĩ Đ´ĐĩŅĐēиК Ņ‡Đ°Ņ ĐŊĐĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°Đ˛ Ņ†ŅŽ вĐĩŅ€ŅŅ–ŅŽ (ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐēа Đˇâ€™ŅĐ˛Đ¸ĐģĐ°ŅŅŒ С вĐĩҀҁҖҗ 5.0.0 🎉). + +ЧĐĩŅ€ĐĩС ҆Đĩ вĐĩҀҁҖҗ FastAPI Đ´Đž 0.99.0 Đ˛ŅĐĩ ҉Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Đģи вĐĩҀҁҖҗ OpenAPI ĐŊиĐļ҇Җ Са 3.1.0. + +/// + +### `Examples` в Pydantic Ņ– FastAPI + +КоĐģи Ви Đ´ĐžĐ´Đ°Ņ”Ņ‚Đĩ `examples` ҃ ĐŧОдĐĩĐģҌ Pydantic ҇ĐĩŅ€ĐĩС `schema_extra` айО `Field(examples=["something"])`, ҆Җ ĐŋŅ€Đ¸ĐēĐģади Đ´ĐžĐ´Đ°ŅŽŅ‚ŅŒŅŅ Đ´Đž **JSON Schema** ҆ҖҔҗ ĐŧОдĐĩĐģŅ–. + +І Ņ†Ņ **JSON Schema** Pydantic-ĐŧОдĐĩĐģŅ– вĐēĐģŅŽŅ‡Đ°Ņ”Ņ‚ŅŒŅŅ Đ´Đž **OpenAPI** Đ’Đ°ŅˆĐžĐŗĐž API, а ĐŋĐžŅ‚Ņ–Đŧ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ в UI Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— (docs UI). + +ĐŖ вĐĩŅ€ŅŅ–ŅŅ… FastAPI Đ´Đž 0.99.0 (ĐŋĐžŅ‡Đ¸ĐŊĐ°ŅŽŅ‡Đ¸ С 0.99.0 виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ ĐŊĐžĐ˛Ņ–ŅˆĐ¸Đš OpenAPI 3.1.0), ĐēĐžĐģи Ви виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Đģи `example` айО `examples` С Ņ–ĐŊŅˆĐ¸Đŧи ŅƒŅ‚Đ¸ĐģŅ–Ņ‚Đ°Đŧи (`Query()`, `Body()` Ņ‚ĐžŅ‰Đž), ҆Җ ĐŋŅ€Đ¸ĐēĐģади ĐŊĐĩ дОдаваĐģĐ¸ŅŅ Đ´Đž JSON Schema, ŅĐēиК ĐžĐŋĐ¸ŅŅƒŅ” ҆Җ даĐŊŅ– (ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ĐŊĐĩ Đ´Đž вĐģĐ°ŅĐŊĐžŅ— вĐĩҀҁҖҗ JSON Schema ҃ OpenAPI). ĐĐ°Ņ‚ĐžĐŧŅ–ŅŅ‚ŅŒ вОĐŊи дОдаваĐģĐ¸ŅŅ ĐąĐĩСĐŋĐžŅĐĩŅ€ĐĩĐ´ĐŊŅŒĐž Đ´Đž ĐžĐŋĐ¸ŅŅƒ *ĐžĐąŅ€ĐžĐąĐŊиĐēа ҈ĐģŅŅ…Ņƒ* *(path operation)* в OpenAPI (Ņ‚ĐžĐąŅ‚Đž ĐŋОСа ĐŧĐĩĐļаĐŧи Ņ‡Đ°ŅŅ‚Đ¸ĐŊ, ŅĐēŅ– виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒ JSON Schema). + +АĐģĐĩ Ņ‚ĐĩĐŋĐĩŅ€, ĐēĐžĐģи FastAPI 0.99.0 Ņ– Đ˛Đ¸Ņ‰Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒ OpenAPI 3.1.0, а Ņ‚ĐžĐš — JSON Schema 2020-12, Ņ€Đ°ĐˇĐžĐŧ Ņ–Đˇ Swagger UI 5.0.0 Ņ– Đ˛Đ¸Ņ‰Đĩ — Đ˛ŅĐĩ ŅŅ‚Đ°ĐģĐž ĐąŅ–ĐģҌ҈ ŅƒĐˇĐŗĐžĐ´ĐļĐĩĐŊиĐŧ, Ņ– examples Ņ‚ĐĩĐŋĐĩŅ€ вĐēĐģŅŽŅ‡Đ°ŅŽŅ‚ŅŒŅŅ Đ´Đž JSON Schema. + +### Swagger UI Ņ‚Đ° ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–Ņ‡ĐŊŅ– Đ´ĐģŅ OpenAPI `examples` + +РаĐŊŅ–ŅˆĐĩ (ŅŅ‚Đ°ĐŊĐžĐŧ ĐŊа 26 ҁĐĩŅ€ĐŋĐŊŅ 2023 Ņ€ĐžĐē҃) Swagger UI ĐŊĐĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°Đ˛ ĐēŅ–ĐģҌĐēа ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņ–Đ˛ ҃ JSON Schema, Ņ‚ĐžĐŧ҃ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Ņ– ĐŊĐĩ ĐŧаĐģи ĐŧĐžĐļĐģĐ¸Đ˛ĐžŅŅ‚Ņ– ĐŋĐžĐēĐ°ĐˇĐ°Ņ‚Đ¸ Đ´ĐĩĐēŅ–ĐģҌĐēа ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņ–Đ˛ ҃ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ—. + +ЊОй Đ˛Đ¸Ņ€Ņ–ŅˆĐ¸Ņ‚Đ¸ ҆Đĩ, FastAPI ĐŋĐžŅ‡Đ¸ĐŊĐ°ŅŽŅ‡Đ¸ С вĐĩҀҁҖҗ 0.103.0 **дОдав ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐē҃** ŅŅ‚Đ°Ņ€ĐžĐŗĐž **OpenAPI-ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–Ņ‡ĐŊĐžĐŗĐž** ĐŋĐžĐģŅ `examples` ҇ĐĩŅ€ĐĩС ĐŊОвиК ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ `openapi_examples`. 🤓 + +### ĐŸŅ–Đ´ŅŅƒĐŧĐžĐē + +РаĐŊŅ–ŅˆĐĩ Ņ ĐēаСав, Ņ‰Đž ĐŊĐĩ ĐģŅŽĐąĐģŅŽ Ņ–ŅŅ‚ĐžŅ€Ņ–ŅŽ... а Ņ‚ĐĩĐŋĐĩŅ€ ĐžŅŅŒ Ņ — Ņ€ĐžĐˇĐŋĐžĐ˛Ņ–Đ´Đ°ŅŽ "Ņ‚ĐĩŅ…ĐŊҖ҇ĐŊŅ– Ņ–ŅŅ‚ĐžŅ€Đ¸Ņ‡ĐŊŅ–" ĐģĐĩĐē҆Җҗ. 😅 + +ĐšĐžŅ€ĐžŅ‚ĐēĐž: **ĐžĐŊĐžĐ˛Ņ–Ņ‚ŅŒŅŅ Đ´Đž FastAPI 0.99.0 айО Đ˛Đ¸Ņ‰Đĩ** — Ņ– Đ˛ŅĐĩ ŅŅ‚Đ°ĐŊĐĩ СĐŊĐ°Ņ‡ĐŊĐž **ĐŋŅ€ĐžŅŅ‚Ņ–ŅˆĐ¸Đŧ, ŅƒĐˇĐŗĐžĐ´ĐļĐĩĐŊиĐŧ Ņ‚Đ° Ņ–ĐŊŅ‚ŅƒŅ—Ņ‚Đ¸Đ˛ĐŊĐž ĐˇŅ€ĐžĐˇŅƒĐŧŅ–ĐģиĐŧ**, Ņ– ВаĐŧ ĐŊĐĩ дОвĐĩĐ´ĐĩŅ‚ŅŒŅŅ СĐŊĐ°Ņ‚Đ¸ Đ˛ŅŅ– ҆Җ Ņ–ŅŅ‚ĐžŅ€Đ¸Ņ‡ĐŊŅ– Đ´ĐĩŅ‚Đ°ĐģŅ–. 😎 diff --git a/docs/uk/docs/tutorial/security/index.md b/docs/uk/docs/tutorial/security/index.md new file mode 100644 index 000000000..c3d94be8d --- /dev/null +++ b/docs/uk/docs/tutorial/security/index.md @@ -0,0 +1,104 @@ +# БĐĩСĐŋĐĩĐēа + +Đ†ŅĐŊŅƒŅ” ĐąĐ°ĐŗĐ°Ņ‚Đž ҁĐŋĐžŅĐžĐąŅ–Đ˛ Ņ€ĐĩаĐģŅ–ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ ĐąĐĩСĐŋĐĩĐē҃, Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–ŅŽ Ņ‚Đ° Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Ņ–ŅŽ. + +ĐĻĐĩ ĐˇĐ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš ҁĐēĐģадĐŊа Ņ– "ĐŊĐĩĐŋŅ€ĐžŅŅ‚Đ°" Ņ‚ĐĩĐŧа. + +ĐŖ ĐąĐ°ĐŗĐ°Ņ‚ŅŒĐžŅ… ҄ҀĐĩĐšĐŧĐ˛ĐžŅ€ĐēĐ°Ņ… Ņ– ŅĐ¸ŅŅ‚ĐĩĐŧĐ°Ņ… СайĐĩСĐŋĐĩ҇ĐĩĐŊĐŊŅ ĐąĐĩСĐŋĐĩĐēи Ņ‚Đ° Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— СаКĐŧĐ°Ņ” вĐĩĐģĐ¸Ņ‡ĐĩСĐŊ҃ Ņ‡Đ°ŅŅ‚Đ¸ĐŊ҃ ĐˇŅƒŅĐ¸ĐģҌ Ņ– ĐēĐžĐ´Ņƒ (Ņ–ĐŊĐžĐ´Ņ– — ĐŋĐžĐŊад 50% Đ˛ŅŅŒĐžĐŗĐž ĐŊаĐŋĐ¸ŅĐ°ĐŊĐžĐŗĐž ĐēĐžĐ´Ņƒ). + +**FastAPI** ĐŊĐ°Đ´Đ°Ņ” ĐēŅ–ĐģҌĐēа Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Ņ–Đ˛, ŅĐēŅ– Đ´ĐžĐŋĐžĐŧĐžĐļŅƒŅ‚ŅŒ ВаĐŧ вĐŋĐžŅ€Đ°Ņ‚Đ¸ŅŅ С **ĐąĐĩСĐŋĐĩĐēĐžŅŽ** ĐģĐĩĐŗĐēĐž, ŅˆĐ˛Đ¸Đ´ĐēĐž, ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊиĐŧ ҁĐŋĐžŅĐžĐąĐžĐŧ, ĐąĐĩС ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐžŅŅ‚Ņ– Đ˛Đ¸Đ˛Ņ‡Đ°Ņ‚Đ¸ Đ˛ŅŅ– ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— ĐąĐĩСĐŋĐĩĐēи. + +АĐģĐĩ ҁĐŋĐžŅ‡Đ°Ņ‚Đē҃ — ĐēŅ–ĐģҌĐēа ĐēĐžŅ€ĐžŅ‚ĐēĐ¸Ņ… ĐŋĐžĐŊŅŅ‚ŅŒ. + +## ĐŸĐžŅĐŋŅ–ŅˆĐ°Ņ”Ņ‚Đĩ? + +Đ¯ĐēŅ‰Đž ВаĐŧ ĐŊĐĩ ҆ҖĐēĐ°Đ˛Ņ– Đ˛ŅŅ– ҆Җ Ņ‚ĐĩŅ€ĐŧŅ–ĐŊи Đš ĐŋŅ€ĐžŅŅ‚Đž ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž *ŅˆĐ˛Đ¸Đ´ĐēĐž* Đ´ĐžĐ´Đ°Ņ‚Đ¸ Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–ŅŽ Са ĐģĐžĐŗŅ–ĐŊĐžĐŧ Ņ– ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ — ĐŋĐĩŅ€ĐĩŅ…ĐžĐ´ŅŒŅ‚Đĩ Đ´Đž ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐ¸Ņ… Ņ€ĐžĐˇĐ´Ņ–ĐģŅ–Đ˛. + +## OAuth2 + +OAuth2 — ҆Đĩ ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ, Ņ‰Đž ĐžĐŋĐ¸ŅŅƒŅ” ĐēŅ–ĐģҌĐēа ҁĐŋĐžŅĐžĐąŅ–Đ˛ ĐžĐąŅ€ĐžĐąĐēи Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— Ņ‚Đ° Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Ņ–Ņ—. + +ĐĻĐĩ Đ´ĐžŅĐ¸Ņ‚ŅŒ Ой'Ņ”ĐŧĐŊа ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ, ŅĐēа ĐžŅ…ĐžĐŋĐģŅŽŅ” ҁĐēĐģадĐŊŅ– виĐŋадĐēи виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ. + +ВоĐŊа вĐēĐģŅŽŅ‡Đ°Ņ” ҁĐŋĐžŅĐžĐąĐ¸ Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— ҇ĐĩŅ€ĐĩС "҂ҀĐĩŅ‚ŅŽ ŅŅ‚ĐžŅ€ĐžĐŊ҃". + +ХаĐŧĐĩ ҆Đĩ ĐģĐĩĐļĐ¸Ņ‚ŅŒ в ĐžŅĐŊĐžĐ˛Ņ– "Đ˛Ņ…ĐžĐ´Ņƒ ҇ĐĩŅ€ĐĩС Google, Facebook, X (Twitter), GitHub" Ņ‚ĐžŅ‰Đž. + +### OAuth 1 + +РаĐŊŅ–ŅˆĐĩ ҖҁĐŊŅƒĐ˛Đ°Đ˛ OAuth 1, ŅĐēиК СĐŊĐ°Ņ‡ĐŊĐž Đ˛Ņ–Đ´Ņ€Ņ–ĐˇĐŊŅŅ”Ņ‚ŅŒŅŅ Đ˛Ņ–Đ´ OAuth2 Ņ– Ņ” ҁĐēĐģадĐŊŅ–ŅˆĐ¸Đŧ, ĐžŅĐēŅ–ĐģҌĐēи ĐŧŅ–ŅŅ‚Đ¸Đ˛ ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— Đ´ĐģŅ ŅˆĐ¸Ņ„Ņ€ŅƒĐ˛Đ°ĐŊĐŊŅ ĐēĐžĐŧ҃ĐŊŅ–ĐēĐ°Ņ†Ņ–Đš. + +Đ—Đ°Ņ€Đ°Đˇ ĐŧаКĐļĐĩ ĐŊĐĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ. + +OAuth2 ĐŊĐĩ вĐēĐ°ĐˇŅƒŅ”, ŅĐē ŅĐ°ĐŧĐĩ ŅˆĐ¸Ņ„Ņ€ŅƒĐ˛Đ°Ņ‚Đ¸ С'Ņ”Đ´ĐŊаĐŊĐŊŅ — вОĐŊĐž ĐžŅ‡Ņ–ĐēŅƒŅ”, Ņ‰Đž Đ˛Đ°Ņˆ ĐˇĐ°ŅŅ‚ĐžŅŅƒĐŊĐžĐē ĐŋŅ€Đ°Ņ†ŅŽŅ” ҇ĐĩŅ€ĐĩС HTTPS. + +/// tip | ĐŸĐžŅ€Đ°Đ´Đ° + +ĐŖ Ņ€ĐžĐˇĐ´Ņ–ĐģŅ– ĐŋŅ€Đž **Đ´ĐĩĐŋĐģОК** Ви ĐŋĐžĐąĐ°Ņ‡Đ¸Ņ‚Đĩ, ŅĐē ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ HTTPS ĐąĐĩСĐēĐžŅˆŅ‚ĐžĐ˛ĐŊĐž С Traefik Ņ‚Đ° Let's Encrypt. + +/// + +## OpenID Connect + +OpenID Connect — ҉Đĩ ОдĐŊа ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ, ĐŋĐžĐąŅƒĐ´ĐžĐ˛Đ°ĐŊа ĐŊа ĐžŅĐŊĐžĐ˛Ņ– **OAuth2**. + +ВоĐŊа Ņ€ĐžĐˇŅˆĐ¸Ņ€ŅŽŅ” OAuth2, ŅƒŅ‚ĐžŅ‡ĐŊŅŽŅŽŅ‡Đ¸ Đ´ĐĩŅĐēŅ– ĐŊĐĩОдĐŊОСĐŊĐ°Ņ‡ĐŊĐžŅŅ‚Ņ– Đ´ĐģŅ Đ´ĐžŅŅĐŗĐŊĐĩĐŊĐŊŅ ĐēŅ€Đ°Ņ‰ĐžŅ— ҁ҃ĐŧҖҁĐŊĐžŅŅ‚Ņ–. + +НаĐŋŅ€Đ¸ĐēĐģад, Đ˛Ņ…Ņ–Đ´ ҇ĐĩŅ€ĐĩС Google виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” OpenID Connect (ŅĐēиК ĐąĐ°ĐˇŅƒŅ”Ņ‚ŅŒŅŅ ĐŊа OAuth2). + +АĐģĐĩ Đ˛Ņ…Ņ–Đ´ ҇ĐĩŅ€ĐĩС Facebook — ĐŊŅ–. Đ’Ņ–ĐŊ ĐŧĐ°Ņ” вĐģĐ°ŅĐŊ҃ Ņ€ĐĩаĐģŅ–ĐˇĐ°Ņ†Ņ–ŅŽ ĐŊа ĐąĐ°ĐˇŅ– OAuth2. + +### OpenID (ĐŊĐĩ "OpenID Connect") + +Đ†ŅĐŊŅƒĐ˛Đ°Đģа Ņ‚Đ°ĐēĐžĐļ ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ "OpenID", ŅĐēа ĐŊаĐŧĐ°ĐŗĐ°ĐģĐ°ŅŅ Ņ€ĐžĐˇĐ˛ĘŧŅĐˇĐ°Ņ‚Đ¸ ҂Җ ŅĐ°ĐŧŅ– ĐˇĐ°Đ´Đ°Ņ‡Ņ–, Ņ‰Đž Đš **OpenID Connect**, аĐģĐĩ ĐŊĐĩ ĐąĐ°ĐˇŅƒĐ˛Đ°ĐģĐ°ŅŅŒ ĐŊа OAuth2. + +ĐĻĐĩ ĐąŅƒĐģа ĐˇĐžĐ˛ŅŅ–Đŧ Ņ–ĐŊŅˆĐ° ŅĐ¸ŅŅ‚ĐĩĐŧа, Ņ– ŅŅŒĐžĐŗĐžĐ´ĐŊŅ– вОĐŊа ĐŧаКĐļĐĩ ĐŊĐĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ. + +## OpenAPI + +OpenAPI (Ņ€Đ°ĐŊŅ–ŅˆĐĩ Swagger) — ҆Đĩ ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ Đ´ĐģŅ ĐŋĐžĐąŅƒĐ´ĐžĐ˛Đ¸ API (Ņ‚ĐĩĐŋĐĩŅ€ ĐŋŅ–Đ´ ĐĩĐŗŅ–Đ´ĐžŅŽ Linux Foundation). + +**FastAPI** ĐąĐ°ĐˇŅƒŅ”Ņ‚ŅŒŅŅ ĐŊа **OpenAPI**. + +Đ—Đ°Đ˛Đ´ŅĐēи Ņ†ŅŒĐžĐŧ҃ Ви ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚Đĩ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊ҃ Ņ–ĐŊŅ‚ĐĩŅ€Đ°ĐēŅ‚Đ¸Đ˛ĐŊ҃ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–ŅŽ, ĐŗĐĩĐŊĐĩŅ€Đ°Ņ†Ņ–ŅŽ ĐēĐžĐ´Ņƒ Ņ‚Đ° ĐąĐ°ĐŗĐ°Ņ‚Đž Ņ–ĐŊŅˆĐžĐŗĐž. + +OpenAPI дОСвОĐģŅŅ” ĐžĐŋĐ¸ŅŅƒĐ˛Đ°Ņ‚Đ¸ Ņ€Ņ–ĐˇĐŊŅ– "ҁ҅ĐĩĐŧи" ĐąĐĩСĐŋĐĩĐēи. + +ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ Ņ—Ņ…, Ви ĐŧĐžĐļĐĩŅ‚Đĩ ҁĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ŅŅ Đ˛ŅŅ–Đŧа Ņ†Đ¸Đŧи Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Đ°Đŧи, Ņ‰Đž ĐąĐ°ĐˇŅƒŅŽŅ‚ŅŒŅŅ ĐŊа ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚Đ°Ņ…, СОĐēŅ€ĐĩĐŧа Ņ–ĐŊŅ‚ĐĩŅ€Đ°ĐēŅ‚Đ¸Đ˛ĐŊиĐŧи ŅĐ¸ŅŅ‚ĐĩĐŧаĐŧи Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ—. + +OpenAPI виСĐŊĐ°Ņ‡Đ°Ņ” Ņ‚Đ°ĐēŅ– ҁ҅ĐĩĐŧи ĐąĐĩСĐŋĐĩĐēи: + +* `apiKey`: ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–Ņ‡ĐŊиК Đ´ĐģŅ ĐˇĐ°ŅŅ‚ĐžŅŅƒĐŊĐē҃ ĐēĐģŅŽŅ‡, ŅĐēиК ĐŧĐžĐļĐĩ ĐŋĐĩŅ€ĐĩĐ´Đ°Đ˛Đ°Ņ‚Đ¸ŅŅ ҇ĐĩŅ€ĐĩС: + * ĐŸĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ СаĐŋĐ¸Ņ‚Ņƒ. + * Đ—Đ°ĐŗĐžĐģОвОĐē. + * Cookie. +* `http`: ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊŅ– ĐŧĐĩŅ‚ĐžĐ´Đ¸ HTTP-Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—, вĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸: + * `bearer`: ĐˇĐ°ĐŗĐžĐģОвОĐē `Authorization` ĐˇŅ– СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧ `Bearer` Ņ‚Đ° Ņ‚ĐžĐēĐĩĐŊĐžĐŧ. ĐĻĐĩ ҃ҁĐŋадĐēОваĐŊĐž С OAuth2. + * HTTP Basic Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ + * HTTP Digest, Ņ‚ĐžŅ‰Đž. +* `oauth2`: ŅƒŅŅ– ҁĐŋĐžŅĐžĐąĐ¸ ĐžĐąŅ€ĐžĐąĐēи ĐąĐĩСĐŋĐĩĐēи Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ OAuth2 (Ņ‚Đ°Đē СваĐŊŅ– ÂĢĐŋĐžŅ‚ĐžĐēиÂģ). + * ДĐĩŅĐēŅ– С Ņ†Đ¸Ņ… ĐŋĐžŅ‚ĐžĐēŅ–Đ˛ ĐŋŅ–Đ´Ņ…ĐžĐ´ŅŅ‚ŅŒ Đ´ĐģŅ ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ вĐģĐ°ŅĐŊĐžĐŗĐž ĐŋŅ€ĐžĐ˛Đ°ĐšĐ´ĐĩŅ€Đ° Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— OAuth 2.0 (ĐŊаĐŋŅ€Đ¸ĐēĐģад, Google, Facebook, X (Twitter), GitHub Ņ‚ĐžŅ‰Đž): + * `implicit`— ĐŊĐĩŅĐ˛ĐŊиК + * `clientCredentials`— ОйĐģŅ–ĐēĐžĐ˛Ņ– даĐŊŅ– ĐēĐģŅ–Ņ”ĐŊŅ‚Đ° + * `authorizationCode` — ĐēОд Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Ņ–Ņ— + * АĐģĐĩ Ņ” ОдиĐŊ ĐžĐēŅ€ĐĩĐŧиК ÂĢĐŋĐžŅ‚Ņ–ĐēÂģ, ŅĐēиК Ņ–Đ´ĐĩаĐģҌĐŊĐž ĐŋŅ–Đ´Ņ…ĐžĐ´Đ¸Ņ‚ŅŒ Đ´ĐģŅ Ņ€ĐĩаĐģŅ–ĐˇĐ°Ņ†Ņ–Ņ— Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– ОдĐŊĐžĐŗĐž Đ´ĐžĐ´Đ°Ņ‚Đē҃: + * `password`: ҃ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐ¸Ņ… Ņ€ĐžĐˇĐ´Ņ–ĐģĐ°Ņ… ĐąŅƒĐ´Đĩ ĐŋŅ€Đ¸ĐēĐģад виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ Ņ†ŅŒĐžĐŗĐž ĐŋĐžŅ‚ĐžĐē҃. +* `openIdConnect`: дОСвОĐģŅŅ” Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Đ˛Đ¸ŅĐ˛ĐģŅŅ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— OAuth2. + * ĐĻĐĩ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐŊŅ виСĐŊĐ°Ņ‡Đ°Ņ”Ņ‚ŅŒŅŅ ҃ ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— OpenID Connect. + + +/// tip | ĐŸĐžŅ€Đ°Đ´Đ° + +ІĐŊŅ‚ĐĩĐŗŅ€Đ°Ņ†Ņ–Ņ Ņ–ĐŊŅˆĐ¸Ņ… ĐŋŅ€ĐžĐ˛Đ°ĐšĐ´ĐĩŅ€Ņ–Đ˛ Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—/Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Ņ–Ņ—, Ņ‚Đ°ĐēĐ¸Ņ… ŅĐē Google, Facebook, X (Twitter), GitHub Ņ‚ĐžŅ‰Đž — Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐģива Ņ– Đ˛Ņ–Đ´ĐŊĐžŅĐŊĐž ĐŋŅ€ĐžŅŅ‚Đ°. + +ĐĐ°ĐšŅĐēĐģадĐŊŅ–ŅˆĐĩ — ҆Đĩ ŅŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ вĐģĐ°ŅĐŊĐžĐŗĐž ĐŋŅ€ĐžĐ˛Đ°ĐšĐ´ĐĩŅ€Đ° Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—/Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Ņ–Ņ—, ŅĐē Google Ņ‡Đ¸ Facebook. АĐģĐĩ **FastAPI** ĐŊĐ°Đ´Đ°Ņ” ВаĐŧ Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Đ¸, Ņ‰ĐžĐą ĐˇŅ€ĐžĐąĐ¸Ņ‚Đ¸ ҆Đĩ ĐģĐĩĐŗĐēĐž, ĐąĐĩŅ€ŅƒŅ‡Đ¸ ĐŊа ҁĐĩĐąĐĩ ваĐļĐē҃ Ņ‡Đ°ŅŅ‚Đ¸ĐŊ҃ Ņ€ĐžĐąĐžŅ‚Đ¸. + +/// + +## ІĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Đ¸ **FastAPI** + +FastAPI ĐŊĐ°Đ´Đ°Ņ” ĐēŅ–ĐģҌĐēа Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Ņ–Đ˛ Đ´ĐģŅ ĐēĐžĐļĐŊĐžŅ— С ĐžĐŋĐ¸ŅĐ°ĐŊĐ¸Ņ… ҁ҅ĐĩĐŧ ĐąĐĩСĐŋĐĩĐēи в ĐŧĐžĐ´ŅƒĐģŅ– `fastapi.security`, ŅĐēŅ– ҁĐŋŅ€ĐžŅ‰ŅƒŅŽŅ‚ŅŒ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ Ņ†Đ¸Ņ… ĐŧĐĩŅ…Đ°ĐŊŅ–ĐˇĐŧŅ–Đ˛ ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ. + +ĐŖ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐ¸Ņ… Ņ€ĐžĐˇĐ´Ņ–ĐģĐ°Ņ… Ви ĐŋĐžĐąĐ°Ņ‡Đ¸Ņ‚Đĩ, ŅĐē Đ´ĐžĐ´Đ°Ņ‚Đ¸ ĐąĐĩСĐŋĐĩĐē҃ Đ´Đž ŅĐ˛ĐžĐŗĐž API Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ Ņ†Đ¸Ņ… Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Ņ–Đ˛ **FastAPI**. + +А Ņ‚Đ°ĐēĐžĐļ ĐŋĐžĐąĐ°Ņ‡Đ¸Ņ‚Đĩ, ŅĐē вОĐŊа Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Ņ–ĐŊŅ‚ĐĩĐŗŅ€ŅƒŅ”Ņ‚ŅŒŅŅ в Ņ–ĐŊŅ‚ĐĩŅ€Đ°ĐēŅ‚Đ¸Đ˛ĐŊ҃ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–ŅŽ Đ˛Đ°ŅˆĐžĐŗĐž API. diff --git a/docs/zh/docs/deployment/concepts.md b/docs/zh/docs/deployment/concepts.md index 7a0b6c3d2..f7208da7c 100644 --- a/docs/zh/docs/deployment/concepts.md +++ b/docs/zh/docs/deployment/concepts.md @@ -220,7 +220,7 @@ čŋ™äē›åˇĨäŊœčŋ›į¨‹å°†æ˜¯čŋčĄŒæ‚¨įš„åē”ᔍፋåēįš„čŋ›į¨‹īŧŒåރäģŦå°†æ‰§čĄŒä¸ģčĻčŽĄįŽ—äģĨæŽĨæ”ļ **č¯ˇæą‚** åšļčŋ”回 **响åē”**īŧŒåšļ且厃äģŦ将加čŊŊ您攞å…Ĩ RAM ä¸­įš„å˜é‡ä¸­įš„äģģäŊ•内厚。 - + åŊ“į„ļīŧŒé™¤ä熿‚¨įš„åē”ᔍፋåēäš‹å¤–īŧŒåŒä¸€å°æœē器可čƒŊčŋ˜čŋčĄŒ**å…ļäģ–čŋ›į¨‹**。 diff --git a/docs/zh/docs/deployment/https.md b/docs/zh/docs/deployment/https.md index 9c963d587..d994c4add 100644 --- a/docs/zh/docs/deployment/https.md +++ b/docs/zh/docs/deployment/https.md @@ -86,7 +86,7 @@ DNS æœåŠĄå™¨äŧšå‘Šč¯‰æĩč§ˆå™¨äŊŋį”¨æŸä¸Ēį‰šåŽšįš„ **IP 地址**。 čŋ™å°†æ˜¯äŊ åœ¨ DNS æœåŠĄå™¨ä¸­ä¸ēäŊ įš„æœåŠĄå™¨é…įŊŽįš„å…Ŧå…ą IP 地址。 - + ### TLS æĄæ‰‹åŧ€å§‹ @@ -94,7 +94,7 @@ DNS æœåŠĄå™¨äŧšå‘Šč¯‰æĩč§ˆå™¨äŊŋį”¨æŸä¸Ēį‰šåŽšįš„ **IP 地址**。 čŋ™å°†æ˜¯ 通äŋĄįš„įŦŦ一部分åĒ是åģēįĢ‹åŽĸæˆˇįĢ¯å’ŒæœåŠĄå™¨äš‹é—´įš„čŋžæŽĨåšļå†ŗåŽšåŽƒäģŦ将äŊŋį”¨įš„åŠ å¯†å¯†é’Ĩį­‰ã€‚ - + åŽĸæˆˇįĢ¯å’ŒæœåŠĄå™¨äš‹é—´åģēįĢ‹ TLS čŋžæŽĨįš„čŋ‡į¨‹į§°ä¸ē **TLS æĄæ‰‹**。 @@ -112,7 +112,7 @@ TLS į숿­ĸäģŖį†å¯äģĨčŽŋ问一ä¸Ē或多ä¸Ē **TLS 蝁äšĻ**īŧˆHTTPS 蝁äšĻīŧ‰ã€‚ 在čŋ™į§æƒ…å†ĩ下īŧŒåŽƒå°†äŊŋᔍ`someapp.example.com`įš„č¯äšĻ。 - + åŽĸæˆˇį̝厞įģ**äŋĄäģģ**į”Ÿæˆč¯Ĩ TLS 蝁äšĻįš„åŽžäŊ“īŧˆåœ¨æœŦ例中ä¸ē Let's EncryptīŧŒäŊ†æˆ‘äģŦį¨åŽäŧšįœ‹åˆ°īŧ‰īŧŒå› æ­¤åŽƒå¯äģĨ**énj蝁**č¯Ĩ蝁äšĻ是åĻ有效。 @@ -134,19 +134,19 @@ TLS į숿­ĸäģŖį†å¯äģĨčŽŋ问一ä¸Ē或多ä¸Ē **TLS 蝁äšĻ**īŧˆHTTPS 蝁äšĻīŧ‰ã€‚ æŽĨ下æĨīŧŒåŽĸæˆˇįĢ¯å‘é€ä¸€ä¸Ē **HTTPS č¯ˇæą‚**。 čŋ™å…ļ厞åĒ是一ä¸Ē通čŋ‡ TLS 加密čŋžæŽĨįš„ HTTP č¯ˇæą‚ã€‚ - + ### č§Ŗå¯†č¯ˇæą‚ TLS į숿­ĸäģŖį†å°†äŊŋį”¨åå•†åĨŊįš„åŠ å¯†įŽ—æŗ•**č§Ŗå¯†č¯ˇæą‚**īŧŒåšļ将**īŧˆč§Ŗå¯†įš„īŧ‰HTTP č¯ˇæą‚**äŧ čž“到čŋčĄŒåē”ᔍፋåēįš„čŋ›į¨‹īŧˆäž‹åĻ‚čŋčĄŒ FastAPI åē”į”¨įš„ Uvicorn čŋ›į¨‹īŧ‰ã€‚ - + ### HTTP 响åē” åē”ᔍፋåēå°†å¤„į†č¯ˇæą‚åšļ向 TLS į숿­ĸäģŖį†å‘送**īŧˆæœĒ加密īŧ‰HTTP 响åē”**。 - + ### HTTPS 响åē” @@ -154,7 +154,7 @@ TLS į숿­ĸäģŖį†å°†äŊŋį”¨åå•†åĨŊįš„åŠ å¯†įŽ—æŗ•**č§Ŗå¯†č¯ˇæą‚**īŧŒåšļ将**īŧˆ æŽĨ下æĨīŧŒæĩč§ˆå™¨å°†éĒŒč¯å“å甿˜¯åĻ有效和是åĻäŊŋᔍä熿­ŖįĄŽįš„加密密é’Ĩį­‰ã€‚į„ļ后厃äŧš**č§Ŗå¯†å“åē”**åšļå¤„į†åŽƒã€‚ - + åŽĸæˆˇį̝īŧˆæĩč§ˆå™¨īŧ‰å°†įŸĨ道响å甿Ĩč‡Ēæ­ŖįĄŽįš„æœåŠĄå™¨īŧŒå› ä¸ē厃äŊŋᔍäē†äģ–äģŦ䚋前äŊŋᔍ **HTTPS 蝁äšĻ** 协商å‡ēįš„åŠ å¯†įŽ—æŗ•ã€‚ @@ -164,7 +164,7 @@ TLS į숿­ĸäģŖį†å°†äŊŋį”¨åå•†åĨŊįš„åŠ å¯†įŽ—æŗ•**č§Ŗå¯†č¯ˇæą‚**īŧŒåšļ将**īŧˆ åĒ有一ä¸Ēčŋ›į¨‹å¯äģĨå¤„į†į‰šåŽšįš„ IP 和įĢ¯åŖīŧˆåœ¨æˆ‘äģŦįš„į¤ē例中ä¸ē TLS į숿­ĸäģŖį†īŧ‰īŧŒäŊ†å…ļäģ–åē”ᔍፋåē/čŋ›į¨‹äšŸå¯äģĨåœ¨æœåŠĄå™¨ä¸ŠčŋčĄŒīŧŒåĒčĻåŽƒäģŦä¸å°č¯•äŊŋį”¨į›¸åŒįš„ **å…Ŧå…ą IP 和įĢ¯åŖįš„įģ„合**。 - + čŋ™æ ˇīŧŒTLS į숿­ĸäģŖį†å°ąå¯äģĨä¸ē多ä¸Ēåē”ᔍፋåēå¤„ᐆ**多ä¸Ē域名**įš„ HTTPS å’Œč¯äšĻīŧŒį„ļåŽåœ¨æ¯į§æƒ…å†ĩä¸‹å°†č¯ˇæą‚äŧ čž“åˆ°æ­ŖįĄŽįš„åē”ᔍፋåēã€‚ @@ -174,7 +174,7 @@ TLS į숿­ĸäģŖį†å°†äŊŋį”¨åå•†åĨŊįš„åŠ å¯†įŽ—æŗ•**č§Ŗå¯†č¯ˇæą‚**īŧŒåšļ将**īŧˆ į„ļ后īŧŒäŧšæœ‰åĻ一ä¸Ēፋåēīŧˆåœ¨æŸä盿ƒ…å†ĩ下是åĻ一ä¸ĒፋåēīŧŒåœ¨æŸä盿ƒ…å†ĩ下可čƒŊ是同一ä¸Ē TLS į숿­ĸäģŖį†īŧ‰ä¸Ž Let's Encrypt 通äŋĄåšļæ›´æ–°č¯äšĻ。 - + **TLS 蝁äšĻ** **ä¸ŽåŸŸåį›¸å…ŗč”**īŧŒč€Œä¸æ˜¯ä¸Ž IP åœ°å€į›¸å…ŗč”ã€‚ diff --git a/docs/zh/docs/deployment/manually.md b/docs/zh/docs/deployment/manually.md index 30ee7a1e9..3dc5942e3 100644 --- a/docs/zh/docs/deployment/manually.md +++ b/docs/zh/docs/deployment/manually.md @@ -1,159 +1,157 @@ -# 手动čŋčĄŒæœåŠĄå™¨ - Uvicorn +# 手动čŋčĄŒæœåŠĄå™¨ -在čŋœį¨‹æœåŠĄå™¨čŽĄįŽ—æœē上čŋčĄŒ **FastAPI** åē”ᔍፋåēæ‰€éœ€įš„ä¸ģčρ䏜čĨŋ是 ASGI æœåŠĄå™¨į¨‹åēīŧŒäž‹åĻ‚ **Uvicorn**。 +## äŊŋᔍ `fastapi run` å‘Ŋäģ¤ -有 3 ä¸Ēä¸ģčĻå¯é€‰æ–šæĄˆīŧš +įŽ€č€Œč¨€äš‹īŧŒäŊŋᔍ `fastapi run` æĨčŋčĄŒæ‚¨įš„ FastAPI åē”ᔍፋåēīŧš -* UvicornīŧšéĢ˜æ€§čƒŊ ASGI æœåŠĄå™¨ã€‚ -* Hypercornīŧšä¸Ž HTTP/2 和 Trio į­‰å…ŧåŽšįš„ ASGI æœåŠĄå™¨ã€‚ -* Daphneīŧšä¸ē Django Channels 构åģēįš„ ASGI æœåŠĄå™¨ã€‚ - -## æœåŠĄå™¨ä¸ģæœēå’ŒæœåŠĄå™¨į¨‹åē - -å…ŗäēŽåį§°īŧŒæœ‰ä¸€ä¸Ē小įģ†čŠ‚éœ€čĻčŽ°äŊã€‚ 💡 - -“**æœåŠĄå™¨**â€ä¸€č¯é€šå¸¸į”¨äēŽæŒ‡čŋœį¨‹/äē‘čŽĄįŽ—æœēīŧˆį‰Šį†æœēæˆ–č™šæ‹Ÿæœēīŧ‰äģĨ及在č¯ĨčŽĄįŽ—æœē上čŋčĄŒįš„ፋåēīŧˆäž‹åĻ‚ Uvicornīŧ‰ã€‚ +
-č¯ˇčŽ°äŊīŧŒåŊ“您一čˆŦč¯ģåˆ°â€œæœåŠĄå™¨â€čŋ™ä¸Ēåč¯æ—ļīŧŒåŽƒå¯čƒŊæŒ‡įš„æ˜¯čŋ™ä¸¤č€…䚋一。 +```console +$ fastapi run main.py -åŊ“提到čŋœį¨‹ä¸ģæœēæ—ļīŧŒé€šå¸¸å°†å…ļį§°ä¸ē**æœåŠĄå™¨**īŧŒäŊ†äšŸį§°ä¸ē**æœē器**(machine)、**VM**īŧˆč™šæ‹Ÿæœēīŧ‰ã€**čŠ‚į‚š**。 čŋ™äē›éƒŊæ˜¯æŒ‡æŸį§įąģåž‹įš„čŋœį¨‹čŽĄįŽ—æœēīŧŒé€šå¸¸čŋčĄŒ LinuxīŧŒæ‚¨å¯äģĨ在å…ļ中čŋčĄŒį¨‹åēã€‚ + FastAPI Starting production server 🚀 + Searching for package file structure from directories + with __init__.py files + Importing from /home/user/code/awesomeapp -## åŽ‰čŖ…æœåŠĄå™¨į¨‹åē + module 🐍 main.py -您可äģĨäŊŋᔍäģĨ下å‘Ŋäģ¤åމ誅 ASGI å…ŧåŽšæœåŠĄå™¨īŧš + code Importing the FastAPI app object from the module with + the following code: -//// tab | Uvicorn + from main import app -* UvicornīŧŒä¸€ä¸ĒåŋĢåĻ‚é—Ēį”ĩ ASGI æœåŠĄå™¨īŧŒåŸēäēŽ uvloop 和 httptools 构åģē。 + app Using import string: main:app -
+ server Server started at http://0.0.0.0:8000 + server Documentation at http://0.0.0.0:8000/docs -```console -$ pip install "uvicorn[standard]" + Logs: ----> 100% + INFO Started server process [2306215] + INFO Waiting for application startup. + INFO Application startup complete. + INFO Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C + to quit) ```
-/// tip +čŋ™åœ¨å¤§å¤šæ•°æƒ…å†ĩ下éƒŊčƒŊæ­Ŗå¸¸čŋčĄŒã€‚đŸ˜Ž -通čŋ‡æˇģ加`standard`īŧŒUvicorn å°†åŽ‰čŖ…åšļäŊŋᔍ䏀ä盿Ž¨čįš„éĸå¤–䞝čĩ–éĄšã€‚ +例åĻ‚īŧŒæ‚¨å¯äģĨäŊŋᔍč¯Ĩå‘Ŋäģ¤åœ¨åŽšå™¨ã€æœåŠĄå™¨į­‰įŽ¯åĸƒä¸­å¯åŠ¨æ‚¨įš„ **FastAPI** åē”į”¨ã€‚ -å…ļ中包æ‹Ŧ`uvloop`īŧŒåŽƒæ˜¯`asyncio`įš„éĢ˜æ€§čƒŊæ›ŋäģŖå“īŧŒåŽƒæäž›äē†åˇ¨å¤§įš„åšļ发性čƒŊ提升。 +## ASGI æœåŠĄå™¨ -/// +čŽŠæˆ‘äģŦæˇąå…Ĩäē†č§Ŗä¸€äē›įģ†čŠ‚ã€‚ -//// +FastAPI äŊŋᔍäē†ä¸€į§į”¨äēŽæž„åģē Python Web æĄ†æžļå’ŒæœåŠĄå™¨įš„æ ‡å‡†īŧŒį§°ä¸ē ASGI。FastAPI æœŦč´¨ä¸Šæ˜¯ä¸€ä¸Ē ASGI Web æĄ†æžļ。 -//// tab | Hypercorn +čρ圍čŋœį¨‹æœåŠĄå™¨ä¸ŠčŋčĄŒ **FastAPI** åē”ᔍīŧˆæˆ–äģģäŊ•å…ļäģ– ASGI åē”ᔍīŧ‰īŧŒæ‚¨éœ€čρ䏀ä¸Ē ASGI æœåŠĄå™¨į¨‹åēīŧŒäž‹åĻ‚ **Uvicorn**。厃是 `fastapi` å‘Ŋäģ¤éģ˜čޤäŊŋį”¨įš„ ASGI æœåŠĄå™¨ã€‚ -* HypercornīŧŒä¸€ä¸Ē也与 HTTP/2 å…ŧåŽšįš„ ASGI æœåŠĄå™¨ã€‚ - -
+除此䚋外īŧŒčŋ˜æœ‰å…ļäģ–一äē›å¯é€‰įš„ ASGI æœåŠĄå™¨īŧŒäž‹åĻ‚īŧš -```console -$ pip install hypercorn - ----> 100% -``` - -
+* UvicornīŧšéĢ˜æ€§čƒŊ ASGI æœåŠĄå™¨ã€‚ +* Hypercornīŧšä¸Ž HTTP/2 和 Trio į­‰å…ŧåŽšįš„ ASGI æœåŠĄå™¨ã€‚ +* Daphneīŧšä¸ē Django Channels 构åģēįš„ ASGI æœåŠĄå™¨ã€‚ +* GranianīŧšåŸēäēŽ Rust įš„ HTTP æœåŠĄå™¨īŧŒä¸“ä¸ē Python åē”į”¨čŽžčŽĄã€‚ +* NGINX UnitīŧšNGINX Unit 是一ä¸ĒčŊģ量įē§ä¸”įĩæ´ģįš„ Web åē”ᔍčŋčĄŒæ—ļįŽ¯åĸƒã€‚ -...或äģģäŊ•å…ļäģ– ASGI æœåŠĄå™¨ã€‚ +## æœåŠĄå™¨ä¸ģæœēå’ŒæœåŠĄå™¨į¨‹åē -//// +å…ŗäēŽåį§°īŧŒæœ‰ä¸€ä¸Ē小įģ†čŠ‚éœ€čĻčŽ°äŊã€‚ 💡 -## čŋčĄŒæœåŠĄå™¨į¨‹åē +“**æœåŠĄå™¨**â€ä¸€č¯é€šå¸¸į”¨äēŽæŒ‡čŋœį¨‹/äē‘čŽĄįŽ—æœēīŧˆį‰Šį†æœēæˆ–č™šæ‹Ÿæœēīŧ‰äģĨ及在č¯ĨčŽĄįŽ—æœē上čŋčĄŒįš„ፋåēīŧˆäž‹åĻ‚ Uvicornīŧ‰ã€‚ -您可äģĨæŒ‰į…§äš‹å‰æ•™į¨‹ä¸­įš„į›¸åŒæ–šåŧčŋčĄŒåē”ᔍፋåēīŧŒäŊ†ä¸äŊŋᔍ`--reload`选项īŧŒäž‹åĻ‚īŧš +č¯ˇčŽ°äŊīŧŒåŊ“您一čˆŦč¯ģåˆ°â€œæœåŠĄå™¨â€čŋ™ä¸Ēåč¯æ—ļīŧŒåŽƒå¯čƒŊæŒ‡įš„æ˜¯čŋ™ä¸¤č€…䚋一。 -//// tab | Uvicorn +åŊ“提到čŋœį¨‹ä¸ģæœēæ—ļīŧŒé€šå¸¸å°†å…ļį§°ä¸ē**æœåŠĄå™¨**īŧŒäŊ†äšŸį§°ä¸ē**æœē器**(machine)、**VM**īŧˆč™šæ‹Ÿæœēīŧ‰ã€**čŠ‚į‚š**。 čŋ™äē›éƒŊæ˜¯æŒ‡æŸį§įąģåž‹įš„čŋœį¨‹čŽĄįŽ—æœēīŧŒé€šå¸¸čŋčĄŒ LinuxīŧŒæ‚¨å¯äģĨ在å…ļ中čŋčĄŒį¨‹åēã€‚ -
-```console -$ uvicorn main:app --host 0.0.0.0 --port 80 +## åŽ‰čŖ…æœåŠĄå™¨į¨‹åē -INFO: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit) -``` +åŊ“您åމ誅 FastAPI æ—ļīŧŒåރč‡Ēå¸Ļ一ä¸Ēį”Ÿäē§įޝåĸƒæœåŠĄå™¨â€”â€”UvicornīŧŒåšļ且您可äģĨäŊŋᔍ `fastapi run` å‘Ŋä줿Ĩ启动厃。 -
+不čŋ‡īŧŒæ‚¨äšŸå¯äģĨæ‰‹åŠ¨åŽ‰čŖ… ASGI æœåŠĄå™¨ã€‚ -//// +č¯ˇįĄŽäŋæ‚¨åˆ›åģēåšļæŋ€æ´ģ一ä¸Ē[č™šæ‹ŸįŽ¯åĸƒ](../virtual-environments.md){.internal-link target=_blank}īŧŒį„ļåŽå†åŽ‰čŖ…æœåŠĄå™¨åē”ᔍፋåēã€‚ -//// tab | Hypercorn +例åĻ‚īŧŒčĻåŽ‰čŖ… UvicornīŧŒå¯äģĨčŋčĄŒäģĨ下å‘Ŋäģ¤īŧš
```console -$ hypercorn main:app --bind 0.0.0.0:80 +$ pip install "uvicorn[standard]" -Running on 0.0.0.0:8080 over http (CTRL + C to quit) +---> 100% ```
-//// +įąģäŧŧįš„æĩį¨‹äšŸé€‚ᔍäēŽäģģäŊ•å…ļäģ– ASGI æœåŠĄå™¨į¨‹åēã€‚ -/// warning +/// tip -åĻ‚æžœæ‚¨æ­Ŗåœ¨äŊŋᔍ`--reload`选项īŧŒč¯ˇčްäŊåˆ é™¤åŽƒã€‚ +通čŋ‡æˇģ加 `standard` 选项īŧŒUvicorn å°†åŽ‰čŖ…åšļäŊŋᔍ䏀ä盿Ž¨čįš„éĸå¤–䞝čĩ–éĄšã€‚ - `--reload` 选项æļˆč€—更多čĩ„æēīŧŒåšļä¸”æ›´ä¸į¨ŗåŽšã€‚ +å…ļ中包æ‹Ŧ `uvloop`īŧŒčŋ™æ˜¯ `asyncio` įš„éĢ˜æ€§čƒŊæ›ŋäģŖæ–šæĄˆīŧŒčƒŊå¤Ÿæ˜žč‘—æå‡åšļ发性čƒŊ。 - 厃在**åŧ€å‘**期间有垈大帎劊īŧŒäŊ†æ‚¨**不åē”č¯Ĩ**在**į”Ÿäē§įޝåĸƒ**中äŊŋį”¨åŽƒã€‚ +åŊ“您äŊŋᔍ `pip install "fastapi[standard]"` åŽ‰čŖ… FastAPI æ—ļīŧŒåŽžé™…ä¸ŠäšŸäŧšåމ誅 `uvicorn[standard]`。 /// -## Hypercorn with Trio - -Starlette 和 **FastAPI** åŸēäēŽ AnyIOīŧŒ 所äģĨ厃äģŦ才čƒŊ同æ—ļ与 Python įš„æ ‡å‡†åē“ asyncio 和Trio å…ŧ厚。 - -å°ŊįŽĄåĻ‚æ­¤īŧŒUvicorn į›Žå‰äģ…与 asyncio å…ŧ厚īŧŒåšļ且通常äŊŋᔍ `uvloop`, 厃是`asyncio`įš„éĢ˜æ€§čƒŊæ›ŋäģŖå“ã€‚ - -äŊ†åĻ‚æžœäŊ æƒŗį›´æŽĨäŊŋᔍ**Trio**īŧŒé‚ŖäšˆäŊ å¯äģĨäŊŋᔍ**Hypercorn**īŧŒå› ä¸ē厃支持厃。 ✨ - -### åŽ‰čŖ…å…ˇæœ‰ Trio įš„ Hypercorn +## čŋčĄŒæœåŠĄå™¨į¨‹åē -éĻ–å…ˆīŧŒæ‚¨éœ€čĻåŽ‰čŖ…å…ˇæœ‰ Trio æ”¯æŒįš„ Hypercornīŧš +åĻ‚æžœæ‚¨æ‰‹åŠ¨åŽ‰čŖ…äē† ASGI æœåŠĄå™¨īŧŒé€šå¸¸éœ€čρäģĨį‰šåŽšæ ŧåŧäŧ é€’一ä¸Ēå¯ŧå…Ĩ字įŦĻ串īŧŒäģĨäžŋæœåŠĄå™¨čƒŊå¤Ÿæ­ŖįĄŽå¯ŧå…Ĩæ‚¨įš„ FastAPI åē”ᔍīŧš
```console -$ pip install "hypercorn[trio]" ----> 100% +$ uvicorn main:app --host 0.0.0.0 --port 80 + +INFO: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit) ```
-### Run with Trio +/// note -į„ļ后äŊ å¯äģĨäŧ é€’å€ŧ`trio`įģ™å‘Ŋäģ¤čĄŒé€‰éĄš`--worker-class`: +å‘Ŋäģ¤ `uvicorn main:app` įš„åĢ义åς䏋īŧš -
+* `main`īŧšæŒ‡įš„æ˜¯ `main.py` 文äģļīŧˆåŗ Python â€œæ¨Ąå—â€īŧ‰ã€‚ +* `app`īŧšæŒ‡įš„æ˜¯ `main.py` 文äģļ中通čŋ‡ `app = FastAPI()` 创åģēįš„å¯ščąĄã€‚ -```console -$ hypercorn main:app --worker-class trio +åŽƒį­‰äģˇäēŽäģĨ下å¯ŧå…Ĩ蝭åĨīŧš + +```Python +from main import app ``` -
+/// + +æ¯į§ ASGI æœåŠĄå™¨į¨‹åēé€šå¸¸éƒŊäŧšæœ‰įąģäŧŧįš„å‘Ŋäģ¤īŧŒæ‚¨å¯äģĨ在厃äģŦįš„åŽ˜æ–šæ–‡æĄŖä¸­æ‰žåˆ°æ›´å¤šäŋĄæ¯ã€‚ + +/// warning + +Uvicorn 和å…ļäģ–æœåŠĄå™¨æ”¯æŒ `--reload` 选项īŧŒč¯Ĩé€‰éĄšåœ¨åŧ€å‘čŋ‡į¨‹ä¸­éžå¸¸æœ‰į”¨ã€‚ -čŋ™å°†é€ščŋ‡æ‚¨įš„åē”ᔍፋåēå¯åЍ HypercornīŧŒåšļäŊŋᔍ Trio äŊœä¸ē后įĢ¯ã€‚ +äŊ† `--reload` 选项äŧšæļˆč€—更多čĩ„æēīŧŒä¸”į›¸å¯šä¸į¨ŗåŽšã€‚ -įŽ°åœ¨æ‚¨å¯äģĨ在åē”ᔍፋåēå†…部äŊŋᔍ Trio。 æˆ–č€…æ›´åĨŊįš„æ˜¯īŧŒæ‚¨å¯äģĨäŊŋᔍ AnyIOīŧŒäŊŋæ‚¨įš„äģŖį ä¸Ž Trio 和 asyncio å…ŧ厚。 🎉 +厃寚äēŽ**åŧ€å‘é˜ļæŽĩ**非常有帎劊īŧŒäŊ†åœ¨**į”Ÿäē§įޝåĸƒ**中**不åē”č¯Ĩ**äŊŋį”¨ã€‚ + +/// ## 部įŊ˛æĻ‚åŋĩ -čŋ™äē›į¤ē例čŋčĄŒæœåŠĄå™¨į¨‹åēīŧˆäž‹åĻ‚ Uvicornīŧ‰īŧŒå¯åЍ**单ä¸Ēčŋ›į¨‹**īŧŒåœ¨æ‰€æœ‰ IPīŧˆ`0.0.0.0`)ä¸Šį›‘åŦéĸ„厚䚉įĢ¯åŖīŧˆäž‹åĻ‚`80`)。 +čŋ™äē›į¤ē例čŋčĄŒæœåŠĄå™¨į¨‹åēīŧˆäž‹åĻ‚ Uvicornīŧ‰īŧŒå¯åЍ**单ä¸Ēčŋ›į¨‹**īŧŒåœ¨æ‰€æœ‰ IPīŧˆ`0.0.0.0`īŧ‰ä¸Šį›‘åŦéĸ„厚䚉įĢ¯åŖīŧˆäž‹åĻ‚`80`īŧ‰ã€‚ čŋ™æ˜¯åŸēæœŦæ€čˇ¯ã€‚ äŊ†æ‚¨å¯čƒŊ需čρ处ᐆ䏀äē›å…ļäģ–ä狿ƒ…īŧŒäž‹åĻ‚īŧš * 厉全性 - HTTPS * 启动æ—ļčŋčĄŒ * 重新启动 -* ReplicationīŧˆčŋčĄŒįš„čŋ›į¨‹æ•°īŧ‰ +* 复åˆļīŧˆčŋčĄŒįš„čŋ›į¨‹æ•°īŧ‰ * 内存 * åŧ€å§‹å‰įš„æ­ĨéǤ diff --git a/docs/zh/docs/deployment/server-workers.md b/docs/zh/docs/deployment/server-workers.md index eb0252a5c..e46ba7a09 100644 --- a/docs/zh/docs/deployment/server-workers.md +++ b/docs/zh/docs/deployment/server-workers.md @@ -1,4 +1,4 @@ -# Server Workers - Gunicorn with Uvicorn +# æœåŠĄå™¨åˇĨäŊœčŋ›į¨‹īŧˆWorkersīŧ‰ - äŊŋᔍ Uvicorn įš„å¤šåˇĨäŊœčŋ›į¨‹æ¨Ąåŧ čŽŠæˆ‘äģŦå›žéĄžä¸€ä¸‹äš‹å‰įš„éƒ¨įŊ˛æĻ‚åŋĩīŧš @@ -9,125 +9,79 @@ * 内存 * å¯åŠ¨å‰įš„å…ˆå‰æ­ĨéǤ -åˆ°į›Žå‰ä¸ēæ­ĸīŧŒé€ščŋ‡æ–‡æĄŖä¸­įš„æ‰€æœ‰æ•™į¨‹īŧŒæ‚¨å¯čƒŊ厞įģåœ¨**单ä¸Ēčŋ›į¨‹**上čŋčĄŒäē†åƒ Uvicorn čŋ™æ ˇįš„**æœåŠĄå™¨į¨‹åē**。 +åˆ°į›Žå‰ä¸ēæ­ĸīŧŒåœ¨æ–‡æĄŖä¸­įš„æ‰€æœ‰æ•™į¨‹ä¸­īŧŒæ‚¨å¯čƒŊä¸€į›´æ˜¯åœ¨čŋčĄŒä¸€ä¸Ē**æœåŠĄå™¨į¨‹åē**īŧŒäž‹åĻ‚äŊŋᔍ `fastapi` å‘Ŋä줿Ĩ启动 UvicornīŧŒč€Œåރéģ˜čޤčŋčĄŒįš„æ˜¯**单čŋ›į¨‹æ¨Ąåŧ**。 -部įŊ˛åē”ᔍፋåēæ—ļīŧŒæ‚¨å¯čƒŊ希望čŋ›čĄŒä¸€äē›**čŋ›į¨‹å¤åˆļ**īŧŒäģĨåˆŠį”¨**多核**åšļčƒŊå¤Ÿå¤„į†æ›´å¤šč¯ˇæą‚ã€‚ +部įŊ˛åē”ᔍፋåēæ—ļīŧŒæ‚¨å¯čƒŊ希望čŋ›čĄŒä¸€äē›**čŋ›į¨‹å¤åˆļ**īŧŒäģĨåˆŠį”¨**多核** CPU åšļčƒŊå¤Ÿå¤„į†æ›´å¤šč¯ˇæą‚ã€‚ æ­ŖåĻ‚æ‚¨åœ¨ä¸Šä¸€įĢ æœ‰å…ŗ[部įŊ˛æĻ‚åŋĩ](concepts.md){.internal-link target=_blank}ä¸­įœ‹åˆ°įš„īŧŒæ‚¨å¯äģĨäŊŋį”¨å¤šį§į­–į•Ĩ。 -在čŋ™é‡Œæˆ‘å°†å‘æ‚¨åą•į¤ēåĻ‚äŊ•å°† **Gunicorn** 与 **Uvicorn worker čŋ›į¨‹** 一čĩˇäŊŋį”¨ã€‚ +在æœŦįĢ čŠ‚ä¸­īŧŒæˆ‘å°†å‘æ‚¨åą•į¤ēåĻ‚äŊ•äŊŋᔍ `fastapi` å‘Ŋä줿ˆ–į›´æŽĨäŊŋᔍ `uvicorn` å‘Ŋäģ¤äģĨ**多åˇĨäŊœčŋ›į¨‹æ¨Ąåŧ**čŋčĄŒ **Uvicorn**。 /// info åĻ‚æžœæ‚¨æ­Ŗåœ¨äŊŋį”¨åŽšå™¨īŧŒäž‹åĻ‚ Docker 或 KubernetesīŧŒæˆ‘将在下一įĢ ä¸­å‘Šč¯‰æ‚¨æ›´å¤šį›¸å…ŗäŋĄæ¯īŧš[åŽšå™¨ä¸­įš„ FastAPI - Docker](docker.md){.internal-link target=_blank}。 -į‰šåˆĢ是īŧŒåŊ“在 **Kubernetes** 上čŋčĄŒæ—ļīŧŒæ‚¨å¯čƒŊ**ä¸æƒŗ**äŊŋᔍ GunicornīŧŒč€Œæ˜¯čŋčĄŒ **每ä¸Ē厚器一ä¸Ē Uvicorn čŋ›į¨‹**īŧŒäŊ†æˆ‘将在æœŦįĢ åŽéĸå‘Šč¯‰æ‚¨čŋ™ä¸€į‚šã€‚ +æ¯”čžƒį‰šåˆĢįš„æ˜¯īŧŒåœ¨ **Kubernetes** įŽ¯åĸƒä¸­čŋčĄŒæ—ļīŧŒæ‚¨é€šå¸¸**不需čρ**äŊŋį”¨å¤šä¸ĒåˇĨäŊœčŋ›į¨‹īŧŒč€Œæ˜¯**每ä¸Ē厚器čŋčĄŒä¸€ä¸Ē Uvicorn čŋ›į¨‹**。不čŋ‡īŧŒæˆ‘äŧšåœ¨æœŦįĢ čŠ‚įš„åŽįģ­éƒ¨åˆ†č¯Ļįģ†äģ‹įģčŋ™ä¸€į‚šã€‚ /// -## Gunicorn with Uvicorn Workers +## 多ä¸ĒåˇĨäŊœčŋ›į¨‹ -**Gunicorn**ä¸ģčĻæ˜¯ä¸€ä¸ĒäŊŋᔍ**WSGI标准**įš„åē”į”¨æœåŠĄå™¨ã€‚ čŋ™æ„å‘ŗį€ Gunicorn 可äģĨä¸ē Flask 和 Django į­‰åē”ᔍፋåēæäž›æœåŠĄã€‚ Gunicorn æœŦčēĢ与 **FastAPI** 不å…ŧ厚īŧŒå› ä¸ē FastAPI äŊŋį”¨æœ€æ–°įš„ **ASGI 标准**。 +您可äģĨäŊŋᔍ `--workers` å‘Ŋäģ¤čĄŒé€‰éĄšæĨ启动多ä¸ĒåˇĨäŊœčŋ›į¨‹īŧš -äŊ† Gunicorn 支持充åŊ“ **čŋ›į¨‹įŽĄį†å™¨** åšļå…čŽ¸į”¨æˆˇå‘Šč¯‰åŽƒčρäŊŋᔍå“Ēä¸Ēį‰šåŽšįš„ **workerįąģ**。 į„ļ后 Gunicorn 将äŊŋᔍč¯Ĩįąģ启动一ä¸Ē或多ä¸Ē **workerčŋ›į¨‹**。 +//// tab | `fastapi` -**Uvicorn** 有一ä¸Ē Gunicorn å…ŧåŽšįš„workerįąģ。 - -äŊŋᔍčŋ™į§įģ„合īŧŒGunicorn 将充åŊ“ **čŋ›į¨‹įŽĄį†å™¨**īŧŒį›‘åŦ **įĢ¯åŖ** 和 **IP**。 厃äŧšå°†é€šäŋĄ**äŧ čž“**到čŋčĄŒ**Uvicornįąģ**įš„workerčŋ›į¨‹ã€‚ - -į„ļ后与Gunicornå…ŧåŽšįš„**Uvicorn worker**įąģå°†č´Ÿč´Ŗå°†Gunicornå‘é€įš„æ•°æŽčŊŦæĸä¸ēASGI标准äģĨ供FastAPIäŊŋį”¨ã€‚ - -## åŽ‰čŖ… Gunicorn 和 Uvicorn +åĻ‚æžœæ‚¨äŊŋᔍ `fastapi` å‘Ŋäģ¤īŧš
```console -$ pip install "uvicorn[standard]" gunicorn - ----> 100% -``` - -
+$ fastapi run --workers 4 main.py -čŋ™å°†åމ誅å¸Ļ有`standard`æ‰Šåą•åŒ…īŧˆäģĨčŽˇåž—éĢ˜æ€§čƒŊīŧ‰įš„ Uvicorn 和 Gunicorn。 + FastAPI Starting production server 🚀 -## Run Gunicorn with Uvicorn Workers + Searching for package file structure from directories with + __init__.py files + Importing from /home/user/code/awesomeapp -æŽĨ下æĨäŊ å¯äģĨ通čŋ‡äģĨ下å‘Ŋäģ¤čŋčĄŒGunicorn: - -
- -```console -$ gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80 - -[19499] [INFO] Starting gunicorn 20.1.0 -[19499] [INFO] Listening at: http://0.0.0.0:80 (19499) -[19499] [INFO] Using worker: uvicorn.workers.UvicornWorker -[19511] [INFO] Booting worker with pid: 19511 -[19513] [INFO] Booting worker with pid: 19513 -[19514] [INFO] Booting worker with pid: 19514 -[19515] [INFO] Booting worker with pid: 19515 -[19511] [INFO] Started server process [19511] -[19511] [INFO] Waiting for application startup. -[19511] [INFO] Application startup complete. -[19513] [INFO] Started server process [19513] -[19513] [INFO] Waiting for application startup. -[19513] [INFO] Application startup complete. -[19514] [INFO] Started server process [19514] -[19514] [INFO] Waiting for application startup. -[19514] [INFO] Application startup complete. -[19515] [INFO] Started server process [19515] -[19515] [INFO] Waiting for application startup. -[19515] [INFO] Application startup complete. -``` - -
+ module 🐍 main.py + code Importing the FastAPI app object from the module with the + following code: -čŽŠæˆ‘äģŦįœ‹įœ‹æ¯ä¸Ēé€‰éĄšįš„åĢ义īŧš + from main import app -* `main:app`īŧščŋ™ä¸Ž Uvicorn äŊŋį”¨įš„č¯­æŗ•į›¸åŒīŧŒ`main` 襨į¤ē名ä¸ē"`main`"įš„ Python æ¨Ąå—īŧŒå› æ­¤æ˜¯æ–‡äģļ `main.py`。 `app` 是 **FastAPI** åē”ᔍፋåēįš„å˜é‡åį§°ã€‚ - * äŊ å¯äģĨæƒŗčąĄ `main:app` ᛏåŊ“äēŽä¸€ä¸Ē Python `import` 蝭åĨīŧŒäž‹åĻ‚īŧš + app Using import string: main:app - ```Python - from main import app - ``` + server Server started at http://0.0.0.0:8000 + server Documentation at http://0.0.0.0:8000/docs - * 因此īŧŒ`main:app` ä¸­įš„å†’åˇį›¸åŊ“äēŽ `from main import app` ä¸­įš„ Python `import` 部分。 + Logs: -* `--workers`īŧščρäŊŋį”¨įš„workerčŋ›į¨‹æ•°é‡īŧŒæ¯ä¸Ēčŋ›į¨‹å°†čŋčĄŒä¸€ä¸Ē Uvicorn workerčŋ›į¨‹īŧŒåœ¨æœŦ例中ä¸ē 4 ä¸Ēworkerčŋ›į¨‹ã€‚ - -* `--worker-class`īŧšåœ¨workerčŋ›į¨‹ä¸­äŊŋį”¨įš„ä¸Ž Gunicorn å…ŧåŽšįš„åˇĨäŊœįąģ。 - * čŋ™é‡Œæˆ‘äģŦäŧ é€’äē† Gunicorn 可äģĨå¯ŧå…Ĩ和äŊŋį”¨įš„įąģīŧš - - ```Python - import uvicorn.workers.UvicornWorker - ``` - -* `--bind`īŧščŋ™å‘Šč¯‰ Gunicorn čρᛑåŦįš„ IP 和įĢ¯åŖīŧŒäŊŋį”¨å†’åˇ (`:`) 分隔 IP 和įĢ¯åŖã€‚ - * åĻ‚æžœæ‚¨į›´æŽĨčŋčĄŒ UvicornīŧŒåˆ™å¯äģĨäŊŋᔍ`--host 0.0.0.0`和`--port 80`īŧŒč€Œä¸æ˜¯`--bind 0.0.0.0:80`īŧˆGunicorn 选项īŧ‰ã€‚ - - -åœ¨čž“å‡ē中īŧŒæ‚¨å¯äģĨįœ‹åˆ°åŽƒæ˜žį¤ēä熿¯ä¸Ēčŋ›į¨‹įš„ **PID**īŧˆčŋ›į¨‹ IDīŧ‰īŧˆåރåĒ是一ä¸Ē数字īŧ‰ã€‚ - -äŊ å¯äģĨįœ‹åˆ°īŧš - -* Gunicorn **čŋ›į¨‹įŽĄį†å™¨** äģĨ PID `19499` åŧ€å¤´īŧˆåœ¨æ‚¨įš„æƒ…å†ĩ下īŧŒåŽƒå°†æ˜¯ä¸€ä¸Ēä¸åŒįš„æ•°å­—īŧ‰ã€‚ -* į„ļ后厃åŧ€å§‹`Listening at: http://0.0.0.0:80`。 -* į„ļåŽåŽƒæŖ€æĩ‹åˆ°åރåŋ…éĄģäŊŋᔍ `uvicorn.workers.UvicornWorker` å¤„įš„workerįąģ。 -* į„ļ后厃启动**4ä¸Ēworker**īŧŒæ¯ä¸ĒéƒŊ有č‡Ēåˇąįš„PIDīŧš`19511`、`19513`、`19514`和`19515`。 - -Gunicorn čŋ˜å°†č´Ÿč´ŖįŽĄį†**æ­ģčŋ›į¨‹**和**重新启动**新čŋ›į¨‹īŧˆåĻ‚æžœéœ€čρäŋæŒworker数量īŧ‰ã€‚ 因此īŧŒčŋ™åœ¨ä¸€åŽšį¨‹åēĻ上有劊äēŽä¸Šéĸåˆ—čĄ¨ä¸­**重启**įš„æĻ‚åŋĩ。 - -å°ŊįŽĄåĻ‚æ­¤īŧŒæ‚¨å¯čƒŊčŋ˜å¸Œæœ›æœ‰ä¸€äē›å¤–éƒ¨įš„ä¸œčĨŋīŧŒäģĨįĄŽäŋåœ¨åŋ…čρæ—ļ**重新启动 Gunicorn**īŧŒåšļ且**在启动æ—ļčŋčĄŒåރ**į­‰ã€‚ + INFO Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to + quit) + INFO Started parent process [27365] + INFO Started server process [27368] + INFO Started server process [27369] + INFO Started server process [27370] + INFO Started server process [27367] + INFO Waiting for application startup. + INFO Waiting for application startup. + INFO Waiting for application startup. + INFO Waiting for application startup. + INFO Application startup complete. + INFO Application startup complete. + INFO Application startup complete. + INFO Application startup complete. +``` -## Uvicorn with Workers +
-Uvicorn 䚟有一ä¸Ēé€‰éĄšå¯äģĨ启动和čŋčĄŒå¤šä¸Ē **workerčŋ›į¨‹**。 +//// -į„ļ而īŧŒåˆ°į›Žå‰ä¸ēæ­ĸīŧŒUvicorn 处ᐆworkerčŋ›į¨‹įš„čƒŊ力比 Gunicorn 更有限。 因此īŧŒåĻ‚æžœæ‚¨æƒŗæ‹Ĩ有čŋ™ä¸Ēįē§åˆĢīŧˆPython įē§åˆĢīŧ‰įš„čŋ›į¨‹įŽĄį†å™¨īŧŒé‚Ŗäšˆæœ€åĨŊå°č¯•äŊŋᔍ Gunicorn äŊœä¸ēčŋ›į¨‹įŽĄį†å™¨ã€‚ +//// tab | `uvicorn` -无čŽēåĻ‚äŊ•īŧŒæ‚¨éƒŊ可äģĨ像čŋ™æ ˇčŋčĄŒåރīŧš +åĻ‚æžœæ‚¨æ›´æƒŗčρᛴæŽĨäŊŋᔍ `uvicorn` å‘Ŋäģ¤īŧš
@@ -151,13 +105,15 @@ $ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4
+//// + čŋ™é‡Œå”¯ä¸€įš„æ–°é€‰éĄšæ˜¯ `--workers` å‘Šč¯‰ Uvicorn 启动 4 ä¸ĒåˇĨäŊœčŋ›į¨‹ã€‚ -您čŋ˜å¯äģĨįœ‹åˆ°åŽƒæ˜žį¤ēä熿¯ä¸Ēčŋ›į¨‹įš„ **PID**īŧŒįˆļčŋ›į¨‹īŧˆčŋ™æ˜¯ **čŋ›į¨‹įŽĄį†å™¨**īŧ‰įš„ PID ä¸ē`27365`īŧŒæ¯ä¸ĒåˇĨäŊœčŋ›į¨‹įš„ PID ä¸ēīŧš`27368`、`27369`īŧŒ `27370`和`27367`。 +您čŋ˜å¯äģĨįœ‹åˆ°åŽƒæ˜žį¤ēä熿¯ä¸Ēčŋ›į¨‹įš„ **PID**īŧŒįˆļčŋ›į¨‹īŧˆčŋ™æ˜¯**čŋ›į¨‹įŽĄį†å™¨**īŧ‰įš„ PID ä¸ē`27365`īŧŒæ¯ä¸ĒåˇĨäŊœčŋ›į¨‹įš„ PID ä¸ēīŧš`27368`、`27369`īŧŒ `27370`和`27367`。 ## 部įŊ˛æĻ‚åŋĩ -在čŋ™é‡ŒīŧŒæ‚¨äē†č§Ŗäē†åĻ‚äŊ•äŊŋᔍ **Gunicorn**īŧˆæˆ– Uvicornīŧ‰įŽĄį† **Uvicorn åˇĨäŊœčŋ›į¨‹**æĨ**åšļ行**åē”ᔍፋåēįš„æ‰§čĄŒīŧŒåˆŠį”¨ CPU ä¸­įš„ **多核**īŧŒåšļ čƒŊ够æģĄčļŗ**æ›´å¤šč¯ˇæą‚**。 +在čŋ™é‡ŒīŧŒæ‚¨å­Ļäš äē†åĻ‚äŊ•äŊŋį”¨å¤šä¸Ē**åˇĨäŊœčŋ›į¨‹īŧˆworkersīŧ‰**æĨ莊åē”ᔍፋåēįš„æ‰§čĄŒ**åšļčĄŒåŒ–**īŧŒå……åˆ†åˆŠį”¨ CPU įš„**多核性čƒŊ**īŧŒåšļčƒŊå¤Ÿå¤„į†**æ›´å¤šįš„č¯ˇæą‚**。 äģŽä¸Šéĸįš„éƒ¨įŊ˛æĻ‚åŋĩåˆ—čĄ¨æĨįœ‹īŧŒäŊŋᔍworkerä¸ģčĻæœ‰åŠŠäēŽ**复åˆļ**部分īŧŒåšļ寚**重新启动**æœ‰ä¸€į‚šå¸ŽåŠŠīŧŒäŊ†æ‚¨äģį„ļ需čĻį…§éĄžå…ļäģ–部分īŧš @@ -170,15 +126,13 @@ $ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4 ## 厚器和 Docker -åœ¨å…ŗäēŽ [åŽšå™¨ä¸­įš„ FastAPI - Docker](docker.md){.internal-link target=_blank} įš„ä¸‹ä¸€į̠䏭īŧŒæˆ‘å°†äģ‹įģä¸€äē›å¯į”¨äēŽå¤„ᐆå…ļäģ– **部įŊ˛æĻ‚åŋĩ** įš„į­–į•Ĩ。 - -我čŋ˜å°†å‘æ‚¨åą•į¤ē **厘斚 Docker 镜像**īŧŒå…ļ中包æ‹Ŧ **Gunicorn 和 Uvicorn worker** äģĨ及一äē›å¯šįŽ€å•æƒ…å†ĩæœ‰į”¨įš„éģ˜čŽ¤é…įŊŽã€‚ +åœ¨å…ŗäēŽ [åŽšå™¨ä¸­įš„ FastAPI - Docker](docker.md){.internal-link target=_blank} įš„ä¸‹ä¸€į̠䏭īŧŒæˆ‘å°†äģ‹įģä¸€äē›å¯į”¨äēŽå¤„ᐆå…ļäģ–**部įŊ˛æĻ‚åŋĩ**įš„į­–į•Ĩ。 -åœ¨é‚Ŗé‡ŒīŧŒæˆ‘čŋ˜å°†å‘æ‚¨åą•į¤ēåĻ‚äŊ• **äģŽå¤´åŧ€å§‹æž„åģēč‡Ēåˇąįš„é•œåƒ** äģĨčŋčĄŒå•ä¸Ē Uvicorn čŋ›į¨‹īŧˆæ˛Ąæœ‰ Gunicornīŧ‰ã€‚ čŋ™æ˜¯ä¸€ä¸ĒįŽ€å•įš„čŋ‡į¨‹īŧŒåšļ且可čƒŊ是您在äŊŋį”¨åƒ **Kubernetes** čŋ™æ ˇįš„分布åŧåŽšå™¨įŽĄį†įŗģį쟿—ļæƒŗčĻåšįš„ä狿ƒ…。 +æˆ‘å°†å‘æ‚¨åą•į¤ēåĻ‚äŊ•**äģŽé›ļåŧ€å§‹æž„åģēč‡Ēåˇąįš„é•œåƒ**īŧŒäģĨčŋčĄŒä¸€ä¸Ē单į‹Ŧįš„ Uvicorn čŋ›į¨‹ã€‚čŋ™ä¸Ēčŋ‡į¨‹į›¸å¯šįŽ€å•īŧŒåšļ且在äŊŋᔍ **Kubernetes** į­‰åˆ†å¸ƒåŧåŽšå™¨įŽĄį†įŗģį쟿—ļīŧŒčŋ™é€šå¸¸æ˜¯æ‚¨éœ€čĻé‡‡å–įš„æ–šæŗ•ã€‚ ## å›žéĄž -您可äģĨäŊŋᔍ**Gunicorn**īŧˆæˆ–Uvicornīŧ‰äŊœä¸ēUvicornåˇĨäŊœčŋ›į¨‹įš„čŋ›į¨‹įŽĄį†å™¨īŧŒäģĨåˆŠį”¨**多核CPU**īŧŒ**åšļ行čŋčĄŒå¤šä¸Ēčŋ›į¨‹**。 +您可äģĨ在äŊŋᔍ `fastapi` 或 `uvicorn` å‘Ŋä줿—ļīŧŒé€ščŋ‡ `--workers` CLI é€‰éĄšå¯į”¨å¤šä¸ĒåˇĨäŊœčŋ›į¨‹īŧˆworkersīŧ‰īŧŒäģĨå……åˆ†åˆŠį”¨**多核 CPU**īŧŒäģĨ**åšļ行čŋčĄŒå¤šä¸Ēčŋ›į¨‹**。 åĻ‚æžœæ‚¨čĻčŽžįŊŽ**č‡Ēåˇąįš„éƒ¨įŊ˛įŗģįģŸ**īŧŒåŒæ—ļč‡Ēåˇąå¤„į†å…ļäģ–部įŊ˛æĻ‚åŋĩīŧŒåˆ™å¯äģĨäŊŋᔍčŋ™äē›åˇĨå…ˇå’Œæƒŗæŗ•ã€‚ diff --git a/docs/zh/docs/python-types.md b/docs/zh/docs/python-types.md index 5126cb847..ba767da87 100644 --- a/docs/zh/docs/python-types.md +++ b/docs/zh/docs/python-types.md @@ -228,7 +228,7 @@ John Doe ## Pydantic æ¨Ąåž‹ -Pydantic 是一ä¸ĒᔍæĨᔍæĨæ‰§čĄŒæ•°æŽæ ĄéĒŒįš„ Python åē“。 +Pydantic 是一ä¸ĒᔍæĨæ‰§čĄŒæ•°æŽæ ĄéĒŒįš„ Python åē“。 äŊ å¯äģĨå°†æ•°æŽįš„"į쓿ž„"åŖ°æ˜Žä¸ēå…ˇæœ‰åąžæ€§įš„įąģ。 diff --git a/docs/zh/docs/tutorial/bigger-applications.md b/docs/zh/docs/tutorial/bigger-applications.md index 318e10fd7..554bc654f 100644 --- a/docs/zh/docs/tutorial/bigger-applications.md +++ b/docs/zh/docs/tutorial/bigger-applications.md @@ -52,7 +52,7 @@ from app.routers import items * čŋ˜æœ‰ä¸€ä¸Ēå­į›ŽåŊ• `app/internal/` 包åĢåĻ一ä¸Ē `__init__.py` 文äģļīŧŒå› æ­¤åŽƒæ˜¯åˆä¸€ä¸Ē「Python 子包」īŧš`app.internal`。 * `app/internal/admin.py` 是åĻ一ä¸Ēå­æ¨Ąå—īŧš`app.internal.admin`。 - + å¸Ļæœ‰æŗ¨é‡Šįš„åŒä¸€æ–‡äģļį쓿ž„īŧš @@ -244,7 +244,7 @@ from .dependencies import get_token_header č¯ˇčŽ°äŊæˆ‘äģŦįš„į¨‹åē/文äģļį쓿ž„æ˜¯æ€Žæ ˇįš„īŧš - + --- diff --git a/docs/zh/docs/tutorial/first-steps.md b/docs/zh/docs/tutorial/first-steps.md index c4ff460e0..80a34116a 100644 --- a/docs/zh/docs/tutorial/first-steps.md +++ b/docs/zh/docs/tutorial/first-steps.md @@ -11,26 +11,42 @@
```console -$ uvicorn main:app --reload +$ fastapi dev main.py -INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) -INFO: Started reloader process [28720] -INFO: Started server process [28722] -INFO: Waiting for application startup. -INFO: Application startup complete. -``` + FastAPI Starting development server 🚀 -
+ Searching for package file structure from directories + with __init__.py files + Importing from /home/user/code/awesomeapp -/// note + module 🐍 main.py -`uvicorn main:app` å‘Ŋäģ¤åĢ义åς䏋: + code Importing the FastAPI app object from the module with + the following code: -* `main`īŧš`main.py` 文äģļīŧˆä¸€ä¸Ē Pythonã€Œæ¨Ąå—ã€īŧ‰ã€‚ -* `app`īŧšåœ¨ `main.py` 文äģļ中通čŋ‡ `app = FastAPI()` 创åģēįš„å¯ščąĄã€‚ -* `--reload`īŧščŽŠæœåŠĄå™¨åœ¨æ›´æ–°äģŖį åŽé‡æ–°å¯åŠ¨ã€‚äģ…在åŧ€å‘æ—ļäŊŋᔍč¯Ĩé€‰éĄšã€‚ + from main import app -/// + app Using import string: main:app + + server Server started at http://127.0.0.1:8000 + server Documentation at http://127.0.0.1:8000/docs + + tip Running in development mode, for production use: + fastapi run + + Logs: + + INFO Will watch for changes in these directories: + ['/home/user/code/awesomeapp'] + INFO Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C + to quit) + INFO Started reloader process [383138] using WatchFiles + INFO Started server process [383153] + INFO Waiting for application startup. + INFO Application startup complete. +``` + + åœ¨čž“å‡ē中īŧŒäŧšæœ‰ä¸€čĄŒäŋĄæ¯åƒä¸‹éĸčŋ™æ ˇīŧš @@ -38,7 +54,6 @@ $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` - č¯ĨčĄŒæ˜žį¤ēäē†äŊ įš„åē”į”¨åœ¨æœŦæœēæ‰€æäž›æœåŠĄįš„ URL 地址。 ### æŸĨįœ‹ @@ -63,7 +78,7 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) 前垀 http://127.0.0.1:8000/redoc。 -äŊ å°†äŧšįœ‹åˆ°å¯é€‰įš„č‡ĒåŠ¨į”Ÿæˆæ–‡æĄŖ īŧˆį”ą ReDoc 提䞛)īŧš +äŊ å°†äŧšįœ‹åˆ°å¯é€‰įš„č‡ĒåŠ¨į”Ÿæˆæ–‡æĄŖ īŧˆį”ą ReDoc 提䞛īŧ‰īŧš ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) @@ -77,9 +92,9 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) #### APIã€Œæ¨Ąåŧã€ -在čŋ™į§åœē景下īŧŒOpenAPI æ˜¯ä¸€į§č§„åŽšåĻ‚äŊ•厚䚉 API æ¨Ąåŧįš„č§„čŒƒã€‚ +在čŋ™į§åœē景下īŧŒOpenAPI æ˜¯ä¸€į§č§„åŽšåĻ‚äŊ•厚䚉 API æ¨Ąåŧįš„č§„čŒƒã€‚ -åŽšäš‰įš„ OpenAPI æ¨Ąåŧå°†åŒ…æ‹ŦäŊ įš„ API čˇ¯åž„īŧŒäģĨ及厃äģŦ可čƒŊäŊŋį”¨įš„å‚æ•°į­‰į­‰ã€‚ +ã€Œæ¨Ąåŧã€įš„厚䚉包æ‹ŦäŊ įš„ API čˇ¯åž„īŧŒäģĨ及厃äģŦ可čƒŊäŊŋį”¨įš„å‚æ•°į­‰į­‰ã€‚ #### æ•°æŽã€Œæ¨Ąåŧã€ @@ -93,7 +108,7 @@ OpenAPI ä¸ēäŊ įš„ API 厚䚉 API æ¨Ąåŧã€‚č¯Ĩæ¨Ąåŧä¸­åŒ…åĢäē†äŊ įš„ API 发送 #### æŸĨįœ‹ `openapi.json` -åĻ‚æžœäŊ å¯šåŽŸå§‹įš„ OpenAPI æ¨Ąåŧé•ŋäģ€äšˆæ ˇå­æ„Ÿåˆ°åĨŊåĨ‡īŧŒå…ļ厞厃åĒ是一ä¸Ēč‡ĒåŠ¨į”Ÿæˆįš„åŒ…åĢä熿‰€æœ‰ API 描čŋ°įš„ JSON。 +åĻ‚æžœäŊ å¯šåŽŸå§‹įš„ OpenAPI æ¨Ąåŧé•ŋäģ€äšˆæ ˇå­æ„Ÿåˆ°åĨŊåĨ‡īŧŒFastAPI č‡ĒåŠ¨į”Ÿæˆäē†åŒ…åĢ所有 API 描čŋ°įš„ JSONīŧˆæ¨Ąåŧīŧ‰ã€‚ äŊ å¯äģĨį›´æŽĨ在īŧšhttp://127.0.0.1:8000/openapi.json įœ‹åˆ°åŽƒã€‚ @@ -101,7 +116,7 @@ OpenAPI ä¸ēäŊ įš„ API 厚䚉 API æ¨Ąåŧã€‚č¯Ĩæ¨Ąåŧä¸­åŒ…åĢäē†äŊ įš„ API 发送 ```JSON { - "openapi": "3.0.2", + "openapi": "3.1.0", "info": { "title": "FastAPI", "version": "0.1.0" @@ -140,7 +155,7 @@ OpenAPI ä¸ēäŊ įš„ API 厚䚉 API æ¨Ąåŧã€‚č¯Ĩæ¨Ąåŧä¸­åŒ…åĢäē†äŊ įš„ API 发送 `FastAPI` æ˜¯į›´æŽĨäģŽ `Starlette` įģ§æ‰ŋįš„įąģ。 -äŊ å¯äģĨ通čŋ‡ `FastAPI` äŊŋį”¨æ‰€æœ‰įš„ Starlette įš„åŠŸčƒŊ。 +äŊ å¯äģĨ通čŋ‡ `FastAPI` äŊŋį”¨æ‰€æœ‰įš„ Starlette įš„åŠŸčƒŊ。 /// @@ -152,34 +167,6 @@ OpenAPI ä¸ēäŊ įš„ API 厚䚉 API æ¨Ąåŧã€‚č¯Ĩæ¨Ąåŧä¸­åŒ…åĢäē†äŊ įš„ API 发送 čŋ™ä¸Ē厞䞋将是创åģēäŊ æ‰€æœ‰ API įš„ä¸ģčρäē¤äē’å¯ščąĄã€‚ -čŋ™ä¸Ē `app` åŒæ ˇåœ¨åς䏋å‘Ŋäģ¤ä¸­čĸĢ `uvicorn` 所åŧ•ᔍīŧš - -
- -```console -$ uvicorn main:app --reload - -INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) -``` - -
- -åĻ‚æžœäŊ åƒä¸‹éĸčŋ™æ ˇåˆ›åģēåē”ᔍīŧš - -{* ../../docs_src/first_steps/tutorial002.py hl[3] *} - -将äģŖį æ”žå…Ĩ `main.py` 文äģļ中īŧŒį„ļ后äŊ å¯äģĨ像下éĸčŋ™æ ˇčŋčĄŒ `uvicorn`īŧš - -
- -```console -$ uvicorn main:my_awesome_api --reload - -INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) -``` - -
- ### æ­ĨéǤ 3īŧšåˆ›åģē一ä¸Ē*čˇ¯åž„æ“äŊœ* #### čˇ¯åž„ @@ -279,13 +266,13 @@ https://example.com/items/foo /// tip -您可äģĨ随意äŊŋᔍäģģäŊ•一ä¸Ē操äŊœīŧˆHTTPæ–šæŗ•īŧ‰ã€‚ +äŊ å¯äģĨ随意äŊŋᔍäģģäŊ•一ä¸Ē操äŊœīŧˆHTTPæ–šæŗ•īŧ‰ã€‚ **FastAPI** æ˛Ąæœ‰åŧēåˆļčĻæą‚æ“äŊœæœ‰äģģäŊ•į‰šåŽšįš„åĢ䚉。 æ­¤å¤„æäž›įš„äŋĄæ¯äģ…äŊœä¸ē指å¯ŧīŧŒč€Œä¸æ˜¯čĻæą‚ã€‚ -比åĻ‚īŧŒåŊ“äŊŋᔍ GraphQL æ—ļ通常äŊ æ‰€æœ‰įš„动äŊœéƒŊ通čŋ‡ `post` ä¸€į§æ–šæŗ•æ‰§čĄŒã€‚ +比åĻ‚īŧŒåŊ“äŊŋᔍ GraphQL æ—ļ通常äŊ æ‰€æœ‰įš„动äŊœéƒŊ通čŋ‡ `POST` ä¸€į§æ–šæŗ•æ‰§čĄŒã€‚ /// @@ -331,6 +318,6 @@ https://example.com/items/foo * å¯ŧå…Ĩ `FastAPI`。 * 创åģē一ä¸Ē `app` 厞䞋。 -* įŧ–写一ä¸Ē**čˇ¯åž„æ“äŊœčŖ…éĨ°å™¨**īŧˆåĻ‚ `@app.get("/")`īŧ‰ã€‚ -* įŧ–写一ä¸Ē**čˇ¯åž„æ“äŊœå‡Ŋ数**īŧˆåĻ‚ä¸Šéĸįš„ `def root(): ...`īŧ‰ã€‚ -* čŋčĄŒåŧ€å‘æœåŠĄå™¨īŧˆåĻ‚ `uvicorn main:app --reload`īŧ‰ã€‚ +* įŧ–写一ä¸Ē**čˇ¯åž„æ“äŊœčŖ…éĨ°å™¨**īŧŒåĻ‚ `@app.get("/")`。 +* 厚䚉一ä¸Ē**čˇ¯åž„æ“äŊœå‡Ŋ数**īŧŒåĻ‚ `def root(): ...`。 +* äŊŋᔍå‘Ŋäģ¤ `fastapi dev` čŋčĄŒåŧ€å‘æœåŠĄå™¨ã€‚ diff --git a/docs/zh/docs/tutorial/index.md b/docs/zh/docs/tutorial/index.md index ab19f02c5..3ca927337 100644 --- a/docs/zh/docs/tutorial/index.md +++ b/docs/zh/docs/tutorial/index.md @@ -1,34 +1,58 @@ # æ•™į¨‹ - į”¨æˆˇæŒ‡å— -æœŦæ•™į¨‹å°†ä¸€æ­Ĩæ­Ĩ向äŊ åą•į¤ēåĻ‚äŊ•äŊŋᔍ **FastAPI** įš„įģå¤§éƒ¨åˆ†į‰šæ€§ã€‚ +æœŦæ•™į¨‹å°†ä¸€æ­Ĩæ­Ĩå‘æ‚¨åą•į¤ēåĻ‚äŊ•äŊŋᔍ **FastAPI** įš„įģå¤§éƒ¨åˆ†į‰šæ€§ã€‚ -各ä¸ĒįĢ čŠ‚įš„å†…åŽšåžĒåēæ¸čŋ›īŧŒäŊ†æ˜¯åˆå›´įģ•į€å•į‹Ŧįš„ä¸ģéĸ˜īŧŒæ‰€äģĨäŊ å¯äģĨį›´æŽĨ莺čŊŦ到某ä¸ĒįĢ čŠ‚äģĨ觪冺äŊ įš„į‰šåŽšéœ€æą‚ã€‚ +各ä¸ĒįĢ čŠ‚įš„å†…åŽšåžĒåēæ¸čŋ›īŧŒäŊ†æ˜¯åˆå›´įģ•į€å•į‹Ŧįš„ä¸ģéĸ˜īŧŒæ‰€äģĨ您可äģĨį›´æŽĨ莺čŊŦ到某ä¸ĒįĢ čŠ‚äģĨč§Ŗå†ŗæ‚¨įš„į‰šåŽšéœ€æą‚ã€‚ -æœŦæ•™į¨‹åŒæ ˇå¯äģĨäŊœä¸ē将æĨįš„å‚č€ƒæ‰‹å†Œã€‚ - -äŊ å¯äģĨ随æ—ļ回到æœŦæ•™į¨‹åšļæŸĨ阅äŊ éœ€čĻįš„å†…åŽšã€‚ +æœŦæ•™į¨‹åŒæ ˇå¯äģĨäŊœä¸ē将æĨįš„å‚č€ƒæ‰‹å†ŒīŧŒæ‰€äģĨ您可äģĨ随æ—ļ回到æœŦæ•™į¨‹åšļæŸĨ阅您需čĻįš„å†…åŽšã€‚ ## čŋčĄŒäģŖį  所有äģŖį į‰‡æŽĩéƒŊ可äģĨ复åˆļåŽį›´æŽĨäŊŋᔍīŧˆåރäģŦ厞际上是įģčŋ‡æĩ‹č¯•įš„ Python 文äģļīŧ‰ã€‚ -čρčŋčĄŒäģģäŊ•į¤ē例īŧŒč¯ˇå°†äģŖį å¤åˆļ到 `main.py` 文äģļ中īŧŒį„ļ后äŊŋᔍäģĨ下å‘Ŋäģ¤å¯åЍ `uvicorn`īŧš +čρčŋčĄŒäģģäŊ•į¤ē例īŧŒč¯ˇå°†äģŖį å¤åˆļ到 `main.py` 文äģļ中īŧŒį„ļ后äŊŋᔍäģĨ下å‘Ŋäģ¤å¯åЍ `fastapi dev`īŧš
```console -$ uvicorn main:app --reload +$ fastapi dev main.py + + FastAPI Starting development server 🚀 + + Searching for package file structure from directories + with __init__.py files + Importing from /home/user/code/awesomeapp + + module 🐍 main.py + + code Importing the FastAPI app object from the module with + the following code: + + from main import app + + app Using import string: main:app + + server Server started at http://127.0.0.1:8000 + server Documentation at http://127.0.0.1:8000/docs + + tip Running in development mode, for production use: + fastapi run + + Logs: -INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) -INFO: Started reloader process [28720] -INFO: Started server process [28722] -INFO: Waiting for application startup. -INFO: Application startup complete. + INFO Will watch for changes in these directories: + ['/home/user/code/awesomeapp'] + INFO Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C + to quit) + INFO Started reloader process [383138] using WatchFiles + INFO Started server process [383153] + INFO Waiting for application startup. + INFO Application startup complete. ```
-åŧē჈åģē莎äŊ åœ¨æœŦ地įŧ–写或复åˆļäģŖį īŧŒå¯šå…ļčŋ›čĄŒįŧ–čž‘åšļčŋčĄŒã€‚ +**åŧē჈åģē莎**您在æœŦ地įŧ–写或复åˆļäģŖį īŧŒå¯šå…ļčŋ›čĄŒįŧ–čž‘åšļčŋčĄŒã€‚ 在įŧ–čž‘å™¨ä¸­äŊŋᔍ FastAPI äŧšįœŸæ­Ŗåœ°åą•įŽ°å‡ēåŽƒįš„äŧ˜åŠŋīŧšåĒ需čρįŧ–å†™åžˆå°‘įš„äģŖį īŧŒæ‰€æœ‰įš„įąģåž‹æŖ€æŸĨīŧŒäģŖį čĄĨå…¨į­‰į­‰ã€‚ @@ -36,48 +60,34 @@ $ uvicorn main:app --reload ## åŽ‰čŖ… FastAPI -įŦŦ一ä¸Ēæ­ĨéĒ¤æ˜¯åŽ‰čŖ… FastAPI。 +įŦŦ一ä¸Ēæ­ĨéĒ¤æ˜¯åŽ‰čŖ… FastAPI. -ä¸ēäē†äŊŋᔍæœŦæ•™į¨‹īŧŒäŊ å¯čƒŊ需čĻåŽ‰čŖ…æ‰€æœ‰įš„å¯é€‰äžčĩ–及寚åē”功čƒŊīŧš +č¯ˇįĄŽäŋæ‚¨åˆ›åģēåšļæŋ€æ´ģ一ä¸Ē[č™šæ‹ŸįŽ¯åĸƒ](../virtual-environments.md){.internal-link target=_blank}īŧŒį„ļ后**åŽ‰čŖ… FastAPI**īŧš
```console -$ pip install "fastapi[all]" +$ pip install "fastapi[standard]" ---> 100% ```
-......äģĨä¸ŠåŽ‰čŖ…čŋ˜åŒ…æ‹Ŧäē† `uvicorn`īŧŒäŊ å¯äģĨ将å…ļᔍäŊœčŋčĄŒäģŖį įš„æœåŠĄå™¨ã€‚ - /// note -äŊ äšŸå¯äģĨ分åŧ€æĨåŽ‰čŖ…ã€‚ - -假åĻ‚äŊ æƒŗå°†åē”ᔍፋåēéƒ¨įŊ˛åˆ°į”Ÿäē§įޝåĸƒīŧŒäŊ å¯čƒŊčĻæ‰§čĄŒäģĨ下操äŊœīŧš - -``` -pip install fastapi -``` - -åšļä¸”åŽ‰čŖ…`uvicorn`æĨäŊœä¸ēæœåŠĄå™¨īŧš - -``` -pip install "uvicorn[standard]" -``` +åŊ“您äŊŋᔍ `pip install "fastapi[standard]"` čŋ›čĄŒåމ誅æ—ļīŧŒåރäŧšé™„å¸Ļ一äē›éģ˜čŽ¤įš„å¯é€‰æ ‡å‡†äžčĩ–éĄšã€‚ -į„ļ后寚äŊ æƒŗäŊŋį”¨įš„æ¯ä¸Ē可选䞝čĩ–éĄšäšŸæ‰§čĄŒį›¸åŒįš„æ“äŊœã€‚ +åĻ‚æžœæ‚¨ä¸æƒŗåŽ‰čŖ…čŋ™äē›å¯é€‰äžčĩ–īŧŒå¯äģĨé€‰æ‹ŠåŽ‰čŖ… `pip install fastapi`。 /// ## čŋ›é˜ļį”¨æˆˇæŒ‡å— -在æœŦ**æ•™į¨‹-į”¨æˆˇæŒ‡å—**䚋后īŧŒäŊ å¯äģĨ阅č¯ģ**čŋ›é˜ļį”¨æˆˇæŒ‡å—**。 +在æœŦ**æ•™į¨‹-į”¨æˆˇæŒ‡å—**䚋后īŧŒæ‚¨å¯äģĨ阅č¯ģ**čŋ›é˜ļį”¨æˆˇæŒ‡å—**。 **čŋ›é˜ļį”¨æˆˇæŒ‡å—**äģĨæœŦæ•™į¨‹ä¸ēåŸēįĄ€īŧŒäŊŋį”¨į›¸åŒįš„æĻ‚åŋĩīŧŒåšļ教授一äē›éĸå¤–įš„į‰šæ€§ã€‚ -äŊ†æ˜¯äŊ åē”č¯Ĩ先阅č¯ģ**æ•™į¨‹-į”¨æˆˇæŒ‡å—**īŧˆåŗäŊ įŽ°åœ¨æ­Ŗåœ¨é˜…č¯ģįš„å†…åŽšīŧ‰ã€‚ +äŊ†æ˜¯æ‚¨åē”č¯Ĩ先阅č¯ģ**æ•™į¨‹-į”¨æˆˇæŒ‡å—**īŧˆåŗæ‚¨įŽ°åœ¨æ­Ŗåœ¨é˜…č¯ģįš„å†…åŽšīŧ‰ã€‚ -æ•™į¨‹įģčŋ‡į˛žåŋƒčŽžčŽĄīŧŒäŊŋäŊ å¯äģĨäģ…通čŋ‡**æ•™į¨‹-į”¨æˆˇæŒ‡å—**æĨåŧ€å‘一ä¸ĒåŽŒæ•´įš„åē”ᔍፋåēīŧŒį„ļ后栚捎äŊ įš„需čρīŧŒäŊŋᔍ**čŋ›é˜ļį”¨æˆˇæŒ‡å—**ä¸­įš„ä¸€äē›å…ļä얿ςåŋĩīŧŒäģĨä¸åŒįš„æ–šåŧæĨæ‰Šåą•åŽƒã€‚ +æ•™į¨‹įģčŋ‡į˛žåŋƒčŽžčŽĄīŧŒäŊŋ您可äģĨäģ…通čŋ‡**æ•™į¨‹-į”¨æˆˇæŒ‡å—**æĨåŧ€å‘一ä¸ĒåŽŒæ•´įš„åē”ᔍፋåēīŧŒį„ļåŽæ šæŽæ‚¨įš„éœ€čρīŧŒäŊŋᔍ**čŋ›é˜ļį”¨æˆˇæŒ‡å—**ä¸­įš„ä¸€äē›å…ļä얿ςåŋĩīŧŒäģĨä¸åŒįš„æ–šåŧæĨæ‰Šåą•åŽƒã€‚ diff --git a/docs_src/custom_docs_ui/tutorial001.py b/docs_src/custom_docs_ui/tutorial001.py index f7ceb0c2f..1cfcce19a 100644 --- a/docs_src/custom_docs_ui/tutorial001.py +++ b/docs_src/custom_docs_ui/tutorial001.py @@ -29,7 +29,7 @@ async def redoc_html(): return get_redoc_html( openapi_url=app.openapi_url, title=app.title + " - ReDoc", - redoc_js_url="https://unpkg.com/redoc@next/bundles/redoc.standalone.js", + redoc_js_url="https://unpkg.com/redoc@2/bundles/redoc.standalone.js", ) diff --git a/docs_src/header_param_models/tutorial003.py b/docs_src/header_param_models/tutorial003.py new file mode 100644 index 000000000..dc2eb74bd --- /dev/null +++ b/docs_src/header_param_models/tutorial003.py @@ -0,0 +1,19 @@ +from typing import List, Union + +from fastapi import FastAPI, Header +from pydantic import BaseModel + +app = FastAPI() + + +class CommonHeaders(BaseModel): + host: str + save_data: bool + if_modified_since: Union[str, None] = None + traceparent: Union[str, None] = None + x_tag: List[str] = [] + + +@app.get("/items/") +async def read_items(headers: CommonHeaders = Header(convert_underscores=False)): + return headers diff --git a/docs_src/header_param_models/tutorial003_an.py b/docs_src/header_param_models/tutorial003_an.py new file mode 100644 index 000000000..e3edb1189 --- /dev/null +++ b/docs_src/header_param_models/tutorial003_an.py @@ -0,0 +1,22 @@ +from typing import List, Union + +from fastapi import FastAPI, Header +from pydantic import BaseModel +from typing_extensions import Annotated + +app = FastAPI() + + +class CommonHeaders(BaseModel): + host: str + save_data: bool + if_modified_since: Union[str, None] = None + traceparent: Union[str, None] = None + x_tag: List[str] = [] + + +@app.get("/items/") +async def read_items( + headers: Annotated[CommonHeaders, Header(convert_underscores=False)], +): + return headers diff --git a/docs_src/header_param_models/tutorial003_an_py310.py b/docs_src/header_param_models/tutorial003_an_py310.py new file mode 100644 index 000000000..07bfa83bf --- /dev/null +++ b/docs_src/header_param_models/tutorial003_an_py310.py @@ -0,0 +1,21 @@ +from typing import Annotated + +from fastapi import FastAPI, Header +from pydantic import BaseModel + +app = FastAPI() + + +class CommonHeaders(BaseModel): + host: str + save_data: bool + if_modified_since: str | None = None + traceparent: str | None = None + x_tag: list[str] = [] + + +@app.get("/items/") +async def read_items( + headers: Annotated[CommonHeaders, Header(convert_underscores=False)], +): + return headers diff --git a/docs_src/header_param_models/tutorial003_an_py39.py b/docs_src/header_param_models/tutorial003_an_py39.py new file mode 100644 index 000000000..8be6b01d0 --- /dev/null +++ b/docs_src/header_param_models/tutorial003_an_py39.py @@ -0,0 +1,21 @@ +from typing import Annotated, Union + +from fastapi import FastAPI, Header +from pydantic import BaseModel + +app = FastAPI() + + +class CommonHeaders(BaseModel): + host: str + save_data: bool + if_modified_since: Union[str, None] = None + traceparent: Union[str, None] = None + x_tag: list[str] = [] + + +@app.get("/items/") +async def read_items( + headers: Annotated[CommonHeaders, Header(convert_underscores=False)], +): + return headers diff --git a/docs_src/header_param_models/tutorial003_py310.py b/docs_src/header_param_models/tutorial003_py310.py new file mode 100644 index 000000000..65e92a28c --- /dev/null +++ b/docs_src/header_param_models/tutorial003_py310.py @@ -0,0 +1,17 @@ +from fastapi import FastAPI, Header +from pydantic import BaseModel + +app = FastAPI() + + +class CommonHeaders(BaseModel): + host: str + save_data: bool + if_modified_since: str | None = None + traceparent: str | None = None + x_tag: list[str] = [] + + +@app.get("/items/") +async def read_items(headers: CommonHeaders = Header(convert_underscores=False)): + return headers diff --git a/docs_src/header_param_models/tutorial003_py39.py b/docs_src/header_param_models/tutorial003_py39.py new file mode 100644 index 000000000..848c34111 --- /dev/null +++ b/docs_src/header_param_models/tutorial003_py39.py @@ -0,0 +1,19 @@ +from typing import Union + +from fastapi import FastAPI, Header +from pydantic import BaseModel + +app = FastAPI() + + +class CommonHeaders(BaseModel): + host: str + save_data: bool + if_modified_since: Union[str, None] = None + traceparent: Union[str, None] = None + x_tag: list[str] = [] + + +@app.get("/items/") +async def read_items(headers: CommonHeaders = Header(convert_underscores=False)): + return headers diff --git a/fastapi/__init__.py b/fastapi/__init__.py index 757b76106..b02bf8b4f 100644 --- a/fastapi/__init__.py +++ b/fastapi/__init__.py @@ -1,6 +1,6 @@ """FastAPI framework, high performance, easy to learn, fast to code, ready for production""" -__version__ = "0.115.11" +__version__ = "0.116.1" from starlette import status as status diff --git a/fastapi/_compat.py b/fastapi/_compat.py index c07e4a3b0..227ad837d 100644 --- a/fastapi/_compat.py +++ b/fastapi/_compat.py @@ -16,6 +16,7 @@ from typing import ( Tuple, Type, Union, + cast, ) from fastapi.exceptions import RequestErrorModel @@ -231,6 +232,10 @@ if PYDANTIC_V2: field_mapping, definitions = schema_generator.generate_definitions( inputs=inputs ) + for item_def in cast(Dict[str, Dict[str, Any]], definitions).values(): + if "description" in item_def: + item_description = cast(str, item_def["description"]).split("\f")[0] + item_def["description"] = item_description return field_mapping, definitions # type: ignore[return-value] def is_scalar_field(field: ModelField) -> bool: diff --git a/fastapi/applications.py b/fastapi/applications.py index 6d427cdc2..05c7bd2be 100644 --- a/fastapi/applications.py +++ b/fastapi/applications.py @@ -748,7 +748,7 @@ class FastAPI(Starlette): This affects the generated OpenAPI (e.g. visible at `/docs`). Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). """ ), ] = True, @@ -1720,7 +1720,7 @@ class FastAPI(Starlette): This affects the generated OpenAPI (e.g. visible at `/docs`). Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). """ ), ] = True, @@ -2093,7 +2093,7 @@ class FastAPI(Starlette): This affects the generated OpenAPI (e.g. visible at `/docs`). Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). """ ), ] = True, @@ -2471,7 +2471,7 @@ class FastAPI(Starlette): This affects the generated OpenAPI (e.g. visible at `/docs`). Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). """ ), ] = True, @@ -2849,7 +2849,7 @@ class FastAPI(Starlette): This affects the generated OpenAPI (e.g. visible at `/docs`). Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). """ ), ] = True, @@ -3222,7 +3222,7 @@ class FastAPI(Starlette): This affects the generated OpenAPI (e.g. visible at `/docs`). Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). """ ), ] = True, @@ -3595,7 +3595,7 @@ class FastAPI(Starlette): This affects the generated OpenAPI (e.g. visible at `/docs`). Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). """ ), ] = True, @@ -3968,7 +3968,7 @@ class FastAPI(Starlette): This affects the generated OpenAPI (e.g. visible at `/docs`). Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). """ ), ] = True, @@ -4346,7 +4346,7 @@ class FastAPI(Starlette): This affects the generated OpenAPI (e.g. visible at `/docs`). Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). """ ), ] = True, @@ -4425,7 +4425,7 @@ class FastAPI(Starlette): app = FastAPI() - @app.put("/items/{item_id}") + @app.trace("/items/{item_id}") def trace_item(item_id: str): return None ``` @@ -4515,14 +4515,17 @@ class FastAPI(Starlette): ```python import time + from typing import Awaitable, Callable - from fastapi import FastAPI, Request + from fastapi import FastAPI, Request, Response app = FastAPI() @app.middleware("http") - async def add_process_time_header(request: Request, call_next): + async def add_process_time_header( + request: Request, call_next: Callable[[Request], Awaitable[Response]] + ) -> Response: start_time = time.time() response = await call_next(request) process_time = time.time() - start_time diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index cf8f88e1c..5ce40b7c6 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -780,9 +780,15 @@ def request_params_to_args( first_field = fields[0] fields_to_extract = fields single_not_embedded_field = False + default_convert_underscores = True if len(fields) == 1 and lenient_issubclass(first_field.type_, BaseModel): fields_to_extract = get_cached_model_fields(first_field.type_) single_not_embedded_field = True + # If headers are in a Pydantic model, the way to disable convert_underscores + # would be with Header(convert_underscores=False) at the Pydantic model level + default_convert_underscores = getattr( + first_field.field_info, "convert_underscores", True + ) params_to_process: Dict[str, Any] = {} @@ -793,7 +799,9 @@ def request_params_to_args( if isinstance(received_params, Headers): # Handle fields extracted from a Pydantic Model for a header, each field # doesn't have a FieldInfo of type Header with the default convert_underscores=True - convert_underscores = getattr(field.field_info, "convert_underscores", True) + convert_underscores = getattr( + field.field_info, "convert_underscores", default_convert_underscores + ) if convert_underscores: alias = ( field.alias @@ -838,6 +846,25 @@ def request_params_to_args( return values, errors +def is_union_of_base_models(field_type: Any) -> bool: + """Check if field type is a Union where all members are BaseModel subclasses.""" + from fastapi.types import UnionType + + origin = get_origin(field_type) + + # Check if it's a Union type (covers both typing.Union and types.UnionType in Python 3.10+) + if origin is not Union and origin is not UnionType: + return False + + union_args = get_args(field_type) + + for arg in union_args: + if not lenient_issubclass(arg, BaseModel): + return False + + return True + + def _should_embed_body_fields(fields: List[ModelField]) -> bool: if not fields: return False @@ -851,10 +878,12 @@ def _should_embed_body_fields(fields: List[ModelField]) -> bool: # If it explicitly specifies it is embedded, it has to be embedded if getattr(first_field.field_info, "embed", None): return True - # If it's a Form (or File) field, it has to be a BaseModel to be top level + # If it's a Form (or File) field, it has to be a BaseModel (or a union of BaseModels) to be top level # otherwise it has to be embedded, so that the key value pair can be extracted - if isinstance(first_field.field_info, params.Form) and not lenient_issubclass( - first_field.type_, BaseModel + if ( + isinstance(first_field.field_info, params.Form) + and not lenient_issubclass(first_field.type_, BaseModel) + and not is_union_of_base_models(first_field.type_) ): return True return False diff --git a/fastapi/openapi/docs.py b/fastapi/openapi/docs.py index c2ec358d2..f181b43c1 100644 --- a/fastapi/openapi/docs.py +++ b/fastapi/openapi/docs.py @@ -188,7 +188,7 @@ def get_redoc_html( It is normally set to a CDN URL. """ ), - ] = "https://cdn.jsdelivr.net/npm/redoc@next/bundles/redoc.standalone.js", + ] = "https://cdn.jsdelivr.net/npm/redoc@2/bundles/redoc.standalone.js", redoc_favicon_url: Annotated[ str, Doc( diff --git a/fastapi/openapi/utils.py b/fastapi/openapi/utils.py index bd8f3c106..808646cc2 100644 --- a/fastapi/openapi/utils.py +++ b/fastapi/openapi/utils.py @@ -32,6 +32,7 @@ from fastapi.utils import ( generate_operation_id_for_path, is_body_allowed_for_status_code, ) +from pydantic import BaseModel from starlette.responses import JSONResponse from starlette.routing import BaseRoute from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY @@ -113,6 +114,13 @@ def _get_openapi_operation_parameters( (ParamTypes.header, header_params), (ParamTypes.cookie, cookie_params), ] + default_convert_underscores = True + if len(flat_dependant.header_params) == 1: + first_field = flat_dependant.header_params[0] + if lenient_issubclass(first_field.type_, BaseModel): + default_convert_underscores = getattr( + first_field.field_info, "convert_underscores", True + ) for param_type, param_group in parameter_groups: for param in param_group: field_info = param.field_info @@ -126,8 +134,21 @@ def _get_openapi_operation_parameters( field_mapping=field_mapping, separate_input_output_schemas=separate_input_output_schemas, ) + name = param.alias + convert_underscores = getattr( + param.field_info, + "convert_underscores", + default_convert_underscores, + ) + if ( + param_type == ParamTypes.header + and param.alias == param.name + and convert_underscores + ): + name = param.name.replace("_", "-") + parameter = { - "name": param.alias, + "name": name, "in": param_type.value, "required": param.required, "schema": param_schema, diff --git a/fastapi/routing.py b/fastapi/routing.py index 80d22cc3b..aa6658c5c 100644 --- a/fastapi/routing.py +++ b/fastapi/routing.py @@ -9,6 +9,7 @@ from typing import ( Any, AsyncIterator, Callable, + Collection, Coroutine, Dict, List, @@ -814,7 +815,7 @@ class APIRouter(routing.Router): This affects the generated OpenAPI (e.g. visible at `/docs`). Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). """ ), ] = True, @@ -862,7 +863,7 @@ class APIRouter(routing.Router): def route( self, path: str, - methods: Optional[List[str]] = None, + methods: Optional[Collection[str]] = None, name: Optional[str] = None, include_in_schema: bool = True, ) -> Callable[[DecoratedCallable], DecoratedCallable]: @@ -1626,7 +1627,7 @@ class APIRouter(routing.Router): This affects the generated OpenAPI (e.g. visible at `/docs`). Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). """ ), ] = True, @@ -2003,7 +2004,7 @@ class APIRouter(routing.Router): This affects the generated OpenAPI (e.g. visible at `/docs`). Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). """ ), ] = True, @@ -2385,7 +2386,7 @@ class APIRouter(routing.Router): This affects the generated OpenAPI (e.g. visible at `/docs`). Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). """ ), ] = True, @@ -2767,7 +2768,7 @@ class APIRouter(routing.Router): This affects the generated OpenAPI (e.g. visible at `/docs`). Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). """ ), ] = True, @@ -3144,7 +3145,7 @@ class APIRouter(routing.Router): This affects the generated OpenAPI (e.g. visible at `/docs`). Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). """ ), ] = True, @@ -3521,7 +3522,7 @@ class APIRouter(routing.Router): This affects the generated OpenAPI (e.g. visible at `/docs`). Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). """ ), ] = True, @@ -3903,7 +3904,7 @@ class APIRouter(routing.Router): This affects the generated OpenAPI (e.g. visible at `/docs`). Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). """ ), ] = True, @@ -4285,7 +4286,7 @@ class APIRouter(routing.Router): This affects the generated OpenAPI (e.g. visible at `/docs`). Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). """ ), ] = True, diff --git a/fastapi/security/oauth2.py b/fastapi/security/oauth2.py index 5ffad5986..88e394db1 100644 --- a/fastapi/security/oauth2.py +++ b/fastapi/security/oauth2.py @@ -85,7 +85,7 @@ class OAuth2PasswordRequestForm: ], password: Annotated[ str, - Form(), + Form(json_schema_extra={"format": "password"}), Doc( """ `password` string. The OAuth2 spec requires the exact field name @@ -130,7 +130,7 @@ class OAuth2PasswordRequestForm: ] = None, client_secret: Annotated[ Union[str, None], - Form(), + Form(json_schema_extra={"format": "password"}), Doc( """ If there's a `client_password` (and a `client_id`), they can be sent @@ -457,11 +457,26 @@ class OAuth2PasswordBearer(OAuth2): """ ), ] = True, + refreshUrl: Annotated[ + Optional[str], + Doc( + """ + The URL to refresh the token and obtain a new one. + """ + ), + ] = None, ): if not scopes: scopes = {} flows = OAuthFlowsModel( - password=cast(Any, {"tokenUrl": tokenUrl, "scopes": scopes}) + password=cast( + Any, + { + "tokenUrl": tokenUrl, + "refreshUrl": refreshUrl, + "scopes": scopes, + }, + ) ) super().__init__( flows=flows, diff --git a/pyproject.toml b/pyproject.toml index 1c540e2f6..7709451ff 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,7 +43,7 @@ classifiers = [ "Topic :: Internet :: WWW/HTTP", ] dependencies = [ - "starlette>=0.40.0,<0.47.0", + "starlette>=0.40.0,<0.48.0", "pydantic>=1.7.4,!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0", "typing-extensions>=4.8.0", ] @@ -58,7 +58,26 @@ Changelog = "https://fastapi.tiangolo.com/release-notes/" [project.optional-dependencies] standard = [ - "fastapi-cli[standard] >=0.0.5", + "fastapi-cli[standard] >=0.0.8", + # For the test client + "httpx >=0.23.0", + # For templates + "jinja2 >=3.1.5", + # For forms and file uploads + "python-multipart >=0.0.18", + # To validate email fields + "email-validator >=2.0.0", + # Uvicorn with uvloop + "uvicorn[standard] >=0.12.0", + # TODO: this should be part of some pydantic optional extra dependencies + # # Settings management + # "pydantic-settings >=2.0.0", + # # Extra Pydantic data types + # "pydantic-extra-types >=2.0.0", +] + +standard-no-fastapi-cloud-cli = [ + "fastapi-cli[standard-no-fastapi-cloud-cli] >=0.0.8", # For the test client "httpx >=0.23.0", # For templates @@ -77,7 +96,7 @@ standard = [ ] all = [ - "fastapi-cli[standard] >=0.0.5", + "fastapi-cli[standard] >=0.0.8", # # For the test client "httpx >=0.23.0", # For templates diff --git a/requirements-docs-tests.txt b/requirements-docs-tests.txt index e7718e61d..e7684a2e3 100644 --- a/requirements-docs-tests.txt +++ b/requirements-docs-tests.txt @@ -1,4 +1,4 @@ # For mkdocstrings and tests -httpx >=0.23.0,<0.28.0 +httpx >=0.23.0,<0.29.0 # For linting and generating docs versions -ruff ==0.9.4 +ruff ==0.11.2 diff --git a/requirements-docs.txt b/requirements-docs.txt index 8812e27f9..5c5701f73 100644 --- a/requirements-docs.txt +++ b/requirements-docs.txt @@ -1,18 +1,18 @@ -e . -r requirements-docs-tests.txt -mkdocs-material==9.6.1 +mkdocs-material==9.6.15 mdx-include >=1.4.1,<2.0.0 mkdocs-redirects>=1.2.1,<1.3.0 -typer == 0.12.5 +typer == 0.16.0 pyyaml >=5.3.1,<7.0.0 # For Material for MkDocs, Chinese search jieba==0.42.1 # For image processing by Material for MkDocs -pillow==11.1.0 +pillow==11.3.0 # For image processing by Material for MkDocs cairosvg==2.7.1 mkdocstrings[python]==0.26.1 -griffe-typingdoc==0.2.7 +griffe-typingdoc==0.2.8 # For griffe, it formats with black black==25.1.0 mkdocs-macros-plugin==1.3.7 diff --git a/requirements-github-actions.txt b/requirements-github-actions.txt index 920aefea6..f807d06a8 100644 --- a/requirements-github-actions.txt +++ b/requirements-github-actions.txt @@ -1,6 +1,6 @@ PyGithub>=2.3.0,<3.0.0 pydantic>=2.5.3,<3.0.0 pydantic-settings>=2.1.0,<3.0.0 -httpx>=0.27.0,<0.28.0 +httpx>=0.27.0,<0.29.0 pyyaml >=5.3.1,<7.0.0 smokeshow diff --git a/requirements-tests.txt b/requirements-tests.txt index 6a870add6..b9f2b2b66 100644 --- a/requirements-tests.txt +++ b/requirements-tests.txt @@ -3,14 +3,14 @@ pytest >=7.1.3,<9.0.0 coverage[toml] >= 6.5.0,< 8.0 mypy ==1.8.0 -dirty-equals ==0.8.0 -sqlmodel==0.0.23 +dirty-equals ==0.9.0 +sqlmodel==0.0.24 flask >=1.1.2,<4.0.0 anyio[trio] >=3.2.1,<5.0.0 PyJWT==2.8.0 pyyaml >=5.3.1,<7.0.0 passlib[bcrypt] >=1.7.2,<2.0.0 -inline-snapshot==0.19.3 +inline-snapshot>=0.21.1 # types types-ujson ==5.10.0.20240515 types-orjson ==3.6.2 diff --git a/requirements-translations.txt b/requirements-translations.txt index a8f8a02d7..90f718032 100644 --- a/requirements-translations.txt +++ b/requirements-translations.txt @@ -1 +1,2 @@ -pydantic-ai==0.0.15 +pydantic-ai==0.0.30 +GitPython==3.1.45 diff --git a/scripts/label_approved.py b/scripts/label_approved.py index 271444504..81de92efb 100644 --- a/scripts/label_approved.py +++ b/scripts/label_approved.py @@ -27,7 +27,7 @@ if settings.debug: logging.basicConfig(level=logging.DEBUG) else: logging.basicConfig(level=logging.INFO) -logging.debug(f"Using config: {settings.json()}") +logging.debug(f"Using config: {settings.model_dump_json()}") g = Github(settings.token.get_secret_value()) repo = g.get_repo(settings.github_repository) for pr in repo.get_pulls(state="open"): @@ -48,7 +48,7 @@ for pr in repo.get_pulls(state="open"): ] config = settings.config or default_config for approved_label, conf in config.items(): - logging.debug(f"Processing config: {conf.json()}") + logging.debug(f"Processing config: {conf.model_dump_json()}") if conf.await_label is None or (conf.await_label in pr_label_by_name): logging.debug(f"Processable PR: {pr.number}") if len(approved_reviews) >= conf.number: diff --git a/scripts/people.py b/scripts/people.py index f61fd31c9..7418b4595 100644 --- a/scripts/people.py +++ b/scripts/people.py @@ -119,6 +119,7 @@ class Settings(BaseSettings): github_token: SecretStr github_repository: str httpx_timeout: int = 30 + sleep_interval: int = 5 def get_graphql_response( @@ -184,7 +185,7 @@ def get_discussion_nodes(settings: Settings) -> list[DiscussionsNode]: discussion_nodes.append(discussion_edge.node) last_edge = discussion_edges[-1] # Handle GitHub secondary rate limits, requests per minute - time.sleep(5) + time.sleep(settings.sleep_interval) discussion_edges = get_graphql_question_discussion_edges( settings=settings, after=last_edge.cursor ) diff --git a/scripts/translate.py b/scripts/translate.py index 9a2136d1b..b78d7211b 100644 --- a/scripts/translate.py +++ b/scripts/translate.py @@ -2,9 +2,11 @@ from functools import lru_cache from pathlib import Path from typing import Iterable +import git import typer import yaml from pydantic_ai import Agent +from rich import print non_translated_sections = ( "reference/", @@ -28,8 +30,38 @@ The content is written in markdown, write the translation in markdown as well. D When there's an example of code, the console or a terminal, normally surrounded by triple backticks and a keyword like "console" or "bash" (e.g. ```console), do not translate the content, keep the original in English. The original content will be surrounded by triple percentage signs (%) and you should translate it to the target language. Do not include the triple percentage signs in the translation. + +There are special blocks of notes, tips and others that look like: + +/// note + +To translate it, keep the same line and add the translation after a vertical bar. + +For example, if you were translating to Spanish, you would write: + +/// note | Nota + +Some examples in Spanish: + +Source: + +/// tip + +Result: + +/// tip | Consejo + +Source: + +/// details | Preview + +Result: + +/// details | Vista previa """ +app = typer.Typer() + @lru_cache def get_langs() -> dict[str, str]: @@ -46,6 +78,17 @@ def generate_lang_path(*, lang: str, path: Path) -> Path: return out_path +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(*, lang: str, path: Path) -> None: langs = get_langs() language = langs[lang] @@ -64,12 +107,14 @@ def translate_page(*, lang: str, path: Path) -> None: original_content = path.read_text() old_translation: str | None = None if out_path.exists(): + print(f"Found existing translation: {out_path}") old_translation = out_path.read_text() + print(f"Translating {path} to {lang} ({language})") agent = Agent("openai:gpt-4o") prompt_segments = [ - lang_prompt_content, general_prompt, + lang_prompt_content, ] if old_translation: prompt_segments.extend( @@ -89,13 +134,14 @@ def translate_page(*, lang: str, path: Path) -> None: ] ) prompt = "\n\n".join(prompt_segments) - + print(f"Running agent for {out_path}") result = agent.run_sync(prompt) out_content = f"{result.data.strip()}\n" + print(f"Saving translation to {out_path}") out_path.write_text(out_content) -def iter_paths_to_translate() -> Iterable[Path]: +def iter_all_en_paths() -> Iterable[Path]: """ Iterate on the markdown files to translate in order of priority. """ @@ -119,12 +165,16 @@ def iter_paths_to_translate() -> Iterable[Path]: yield path -def translate_all(lang: str) -> None: - paths_to_process: list[Path] = [] - for path in iter_paths_to_translate(): +def iter_en_paths_to_translate() -> Iterable[Path]: + for path in iter_all_en_paths(): if str(path).replace("docs/en/docs/", "").startswith(non_translated_sections): continue - paths_to_process.append(path) + yield path + + +@app.command() +def translate_all(lang: str) -> None: + paths_to_process = list(iter_en_paths_to_translate()) print("Original paths:") for p in paths_to_process: print(f" - {p}") @@ -151,12 +201,82 @@ def translate_all(lang: str) -> None: print(f"Done translating: {p}") -def main(*, lang: str, path: Path = None) -> None: - if path: +@app.command() +def list_removable(lang: str) -> list[Path]: + removable_paths: list[Path] = [] + lang_paths = Path(f"docs/{lang}").rglob("*.md") + for path in lang_paths: + en_path = generate_en_path(lang=lang, 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(lang: str) -> None: + removable_paths = list_removable(lang) + 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_outdated(lang: 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=lang, path=path) + if not lang_path.exists(): + outdated_paths.append(path) + 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(lang: str) -> None: + outdated_paths = list_outdated(lang) + for path in outdated_paths: + print(f"Updating lang: {lang} path: {path}") translate_page(lang=lang, path=path) - else: - translate_all(lang=lang) + print(f"Done updating: {path}") + print("Done updating all outdated paths") if __name__ == "__main__": - typer.run(main) + app() diff --git a/tests/test_application.py b/tests/test_application.py index 5c62f5f6e..a7d50ea72 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -43,7 +43,7 @@ def test_redoc(): response = client.get("/redoc") assert response.status_code == 200, response.text assert response.headers["content-type"] == "text/html; charset=utf-8" - assert "redoc@next" in response.text + assert "redoc@2" in response.text def test_enum_status_code_response(): diff --git a/tests/test_openapi_model_description_trim_on_formfeed.py b/tests/test_openapi_model_description_trim_on_formfeed.py new file mode 100644 index 000000000..e18d4f6b2 --- /dev/null +++ b/tests/test_openapi_model_description_trim_on_formfeed.py @@ -0,0 +1,31 @@ +from fastapi import FastAPI +from fastapi.testclient import TestClient +from pydantic import BaseModel + +app = FastAPI() + + +class MyModel(BaseModel): + """ + A model with a form feed character in the title. + \f + Text after form feed character. + """ + + +@app.get("/foo") +def foo(v: MyModel): # pragma: no cover + pass + + +client = TestClient(app) + + +def test_openapi(): + response = client.get("/openapi.json") + assert response.status_code == 200, response.text + openapi_schema = response.json() + + assert openapi_schema["components"]["schemas"]["MyModel"]["description"] == ( + "A model with a form feed character in the title.\n" + ) diff --git a/tests/test_tutorial/test_cookie_param_models/test_tutorial002.py b/tests/test_tutorial/test_cookie_param_models/test_tutorial002.py index 30adadc8a..cef6f6630 100644 --- a/tests/test_tutorial/test_cookie_param_models/test_tutorial002.py +++ b/tests/test_tutorial/test_cookie_param_models/test_tutorial002.py @@ -5,7 +5,13 @@ from dirty_equals import IsDict from fastapi.testclient import TestClient from inline_snapshot import snapshot -from tests.utils import needs_py39, needs_py310, needs_pydanticv1, needs_pydanticv2 +from tests.utils import ( + needs_py39, + needs_py310, + needs_pydanticv1, + needs_pydanticv2, + pydantic_snapshot, +) @pytest.fixture( @@ -59,8 +65,8 @@ def test_cookie_param_model_defaults(client: TestClient): def test_cookie_param_model_invalid(client: TestClient): response = client.get("/items/") assert response.status_code == 422 - assert response.json() == snapshot( - IsDict( + assert response.json() == pydantic_snapshot( + v2=snapshot( { "detail": [ { @@ -71,9 +77,8 @@ def test_cookie_param_model_invalid(client: TestClient): } ] } - ) - | IsDict( - # TODO: remove when deprecating Pydantic v1 + ), + v1=snapshot( { "detail": [ { @@ -83,7 +88,7 @@ def test_cookie_param_model_invalid(client: TestClient): } ] } - ) + ), ) @@ -144,18 +149,23 @@ def test_openapi_schema(client: TestClient): "name": "fatebook_tracker", "in": "cookie", "required": False, - "schema": IsDict( - { - "anyOf": [{"type": "string"}, {"type": "null"}], - "title": "Fatebook Tracker", - } - ) - | IsDict( - # TODO: remove when deprecating Pydantic v1 - { - "type": "string", - "title": "Fatebook Tracker", - } + "schema": pydantic_snapshot( + v2=snapshot( + { + "anyOf": [ + {"type": "string"}, + {"type": "null"}, + ], + "title": "Fatebook Tracker", + } + ), + v1=snapshot( + # TODO: remove when deprecating Pydantic v1 + { + "type": "string", + "title": "Fatebook Tracker", + } + ), ), }, { diff --git a/tests/test_tutorial/test_custom_docs_ui/test_tutorial001.py b/tests/test_tutorial/test_custom_docs_ui/test_tutorial001.py index aff070d74..cb8e8c224 100644 --- a/tests/test_tutorial/test_custom_docs_ui/test_tutorial001.py +++ b/tests/test_tutorial/test_custom_docs_ui/test_tutorial001.py @@ -33,7 +33,7 @@ def test_swagger_ui_oauth2_redirect_html(client: TestClient): def test_redoc_html(client: TestClient): response = client.get("/redoc") assert response.status_code == 200, response.text - assert "https://unpkg.com/redoc@next/bundles/redoc.standalone.js" in response.text + assert "https://unpkg.com/redoc@2/bundles/redoc.standalone.js" in response.text def test_api(client: TestClient): diff --git a/tests/test_tutorial/test_custom_request_and_route/test_tutorial002.py b/tests/test_tutorial/test_custom_request_and_route/test_tutorial002.py index 6f7355aaa..647f1c5dd 100644 --- a/tests/test_tutorial/test_custom_request_and_route/test_tutorial002.py +++ b/tests/test_tutorial/test_custom_request_and_route/test_tutorial002.py @@ -1,4 +1,4 @@ -from dirty_equals import IsDict +from dirty_equals import IsDict, IsOneOf from fastapi.testclient import TestClient from docs_src.custom_request_and_route.tutorial002 import app @@ -24,14 +24,16 @@ def test_exception_handler_body_access(): "input": {"numbers": [1, 2, 3]}, } ], - "body": '{"numbers": [1, 2, 3]}', + # httpx 0.28.0 switches to compact JSON https://github.com/encode/httpx/issues/3363 + "body": IsOneOf('{"numbers": [1, 2, 3]}', '{"numbers":[1,2,3]}'), } } ) | IsDict( # TODO: remove when deprecating Pydantic v1 { "detail": { - "body": '{"numbers": [1, 2, 3]}', + # httpx 0.28.0 switches to compact JSON https://github.com/encode/httpx/issues/3363 + "body": IsOneOf('{"numbers": [1, 2, 3]}', '{"numbers":[1,2,3]}'), "errors": [ { "loc": ["body"], diff --git a/tests/test_tutorial/test_header_param_models/test_tutorial001.py b/tests/test_tutorial/test_header_param_models/test_tutorial001.py index 06b2404cf..bc876897b 100644 --- a/tests/test_tutorial/test_header_param_models/test_tutorial001.py +++ b/tests/test_tutorial/test_header_param_models/test_tutorial001.py @@ -129,13 +129,13 @@ def test_openapi_schema(client: TestClient): "schema": {"type": "string", "title": "Host"}, }, { - "name": "save_data", + "name": "save-data", "in": "header", "required": True, "schema": {"type": "boolean", "title": "Save Data"}, }, { - "name": "if_modified_since", + "name": "if-modified-since", "in": "header", "required": False, "schema": IsDict( @@ -171,7 +171,7 @@ def test_openapi_schema(client: TestClient): ), }, { - "name": "x_tag", + "name": "x-tag", "in": "header", "required": False, "schema": { diff --git a/tests/test_tutorial/test_header_param_models/test_tutorial002.py b/tests/test_tutorial/test_header_param_models/test_tutorial002.py index e07655a0c..0615521c4 100644 --- a/tests/test_tutorial/test_header_param_models/test_tutorial002.py +++ b/tests/test_tutorial/test_header_param_models/test_tutorial002.py @@ -140,13 +140,13 @@ def test_openapi_schema(client: TestClient): "schema": {"type": "string", "title": "Host"}, }, { - "name": "save_data", + "name": "save-data", "in": "header", "required": True, "schema": {"type": "boolean", "title": "Save Data"}, }, { - "name": "if_modified_since", + "name": "if-modified-since", "in": "header", "required": False, "schema": IsDict( @@ -182,7 +182,7 @@ def test_openapi_schema(client: TestClient): ), }, { - "name": "x_tag", + "name": "x-tag", "in": "header", "required": False, "schema": { diff --git a/tests/test_tutorial/test_header_param_models/test_tutorial003.py b/tests/test_tutorial/test_header_param_models/test_tutorial003.py new file mode 100644 index 000000000..60940e1da --- /dev/null +++ b/tests/test_tutorial/test_header_param_models/test_tutorial003.py @@ -0,0 +1,285 @@ +import importlib + +import pytest +from dirty_equals import IsDict +from fastapi.testclient import TestClient +from inline_snapshot import snapshot + +from tests.utils import needs_py39, needs_py310 + + +@pytest.fixture( + name="client", + params=[ + "tutorial003", + pytest.param("tutorial003_py39", marks=needs_py39), + pytest.param("tutorial003_py310", marks=needs_py310), + "tutorial003_an", + pytest.param("tutorial003_an_py39", marks=needs_py39), + pytest.param("tutorial003_an_py310", marks=needs_py310), + ], +) +def get_client(request: pytest.FixtureRequest): + mod = importlib.import_module(f"docs_src.header_param_models.{request.param}") + + client = TestClient(mod.app) + return client + + +def test_header_param_model(client: TestClient): + response = client.get( + "/items/", + headers=[ + ("save_data", "true"), + ("if_modified_since", "yesterday"), + ("traceparent", "123"), + ("x_tag", "one"), + ("x_tag", "two"), + ], + ) + assert response.status_code == 200 + assert response.json() == { + "host": "testserver", + "save_data": True, + "if_modified_since": "yesterday", + "traceparent": "123", + "x_tag": ["one", "two"], + } + + +def test_header_param_model_no_underscore(client: TestClient): + response = client.get( + "/items/", + headers=[ + ("save-data", "true"), + ("if-modified-since", "yesterday"), + ("traceparent", "123"), + ("x-tag", "one"), + ("x-tag", "two"), + ], + ) + assert response.status_code == 422 + assert response.json() == snapshot( + { + "detail": [ + IsDict( + { + "type": "missing", + "loc": ["header", "save_data"], + "msg": "Field required", + "input": { + "host": "testserver", + "traceparent": "123", + "x_tag": [], + "accept": "*/*", + "accept-encoding": "gzip, deflate", + "connection": "keep-alive", + "user-agent": "testclient", + "save-data": "true", + "if-modified-since": "yesterday", + "x-tag": "two", + }, + } + ) + | IsDict( + # TODO: remove when deprecating Pydantic v1 + { + "type": "value_error.missing", + "loc": ["header", "save_data"], + "msg": "field required", + } + ) + ] + } + ) + + +def test_header_param_model_defaults(client: TestClient): + response = client.get("/items/", headers=[("save_data", "true")]) + assert response.status_code == 200 + assert response.json() == { + "host": "testserver", + "save_data": True, + "if_modified_since": None, + "traceparent": None, + "x_tag": [], + } + + +def test_header_param_model_invalid(client: TestClient): + response = client.get("/items/") + assert response.status_code == 422 + assert response.json() == snapshot( + { + "detail": [ + IsDict( + { + "type": "missing", + "loc": ["header", "save_data"], + "msg": "Field required", + "input": { + "x_tag": [], + "host": "testserver", + "accept": "*/*", + "accept-encoding": "gzip, deflate", + "connection": "keep-alive", + "user-agent": "testclient", + }, + } + ) + | IsDict( + # TODO: remove when deprecating Pydantic v1 + { + "type": "value_error.missing", + "loc": ["header", "save_data"], + "msg": "field required", + } + ) + ] + } + ) + + +def test_header_param_model_extra(client: TestClient): + response = client.get( + "/items/", headers=[("save_data", "true"), ("tool", "plumbus")] + ) + assert response.status_code == 200, response.text + assert response.json() == snapshot( + { + "host": "testserver", + "save_data": True, + "if_modified_since": None, + "traceparent": None, + "x_tag": [], + } + ) + + +def test_openapi_schema(client: TestClient): + response = client.get("/openapi.json") + assert response.status_code == 200, response.text + assert response.json() == snapshot( + { + "openapi": "3.1.0", + "info": {"title": "FastAPI", "version": "0.1.0"}, + "paths": { + "/items/": { + "get": { + "summary": "Read Items", + "operationId": "read_items_items__get", + "parameters": [ + { + "name": "host", + "in": "header", + "required": True, + "schema": {"type": "string", "title": "Host"}, + }, + { + "name": "save_data", + "in": "header", + "required": True, + "schema": {"type": "boolean", "title": "Save Data"}, + }, + { + "name": "if_modified_since", + "in": "header", + "required": False, + "schema": IsDict( + { + "anyOf": [{"type": "string"}, {"type": "null"}], + "title": "If Modified Since", + } + ) + | IsDict( + # TODO: remove when deprecating Pydantic v1 + { + "type": "string", + "title": "If Modified Since", + } + ), + }, + { + "name": "traceparent", + "in": "header", + "required": False, + "schema": IsDict( + { + "anyOf": [{"type": "string"}, {"type": "null"}], + "title": "Traceparent", + } + ) + | IsDict( + # TODO: remove when deprecating Pydantic v1 + { + "type": "string", + "title": "Traceparent", + } + ), + }, + { + "name": "x_tag", + "in": "header", + "required": False, + "schema": { + "type": "array", + "items": {"type": "string"}, + "default": [], + "title": "X Tag", + }, + }, + ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + } + }, + "components": { + "schemas": { + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "type": "array", + "title": "Detail", + } + }, + "type": "object", + "title": "HTTPValidationError", + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [{"type": "string"}, {"type": "integer"}] + }, + "type": "array", + "title": "Location", + }, + "msg": {"type": "string", "title": "Message"}, + "type": {"type": "string", "title": "Error Type"}, + }, + "type": "object", + "required": ["loc", "msg", "type"], + "title": "ValidationError", + }, + } + }, + } + ) diff --git a/tests/test_tutorial/test_security/test_tutorial003.py b/tests/test_tutorial/test_security/test_tutorial003.py index 37fc2618f..2bbb2e851 100644 --- a/tests/test_tutorial/test_security/test_tutorial003.py +++ b/tests/test_tutorial/test_security/test_tutorial003.py @@ -163,7 +163,11 @@ def test_openapi_schema(client: TestClient): } ), "username": {"title": "Username", "type": "string"}, - "password": {"title": "Password", "type": "string"}, + "password": { + "title": "Password", + "type": "string", + "format": "password", + }, "scope": {"title": "Scope", "type": "string", "default": ""}, "client_id": IsDict( { @@ -179,11 +183,16 @@ def test_openapi_schema(client: TestClient): { "title": "Client Secret", "anyOf": [{"type": "string"}, {"type": "null"}], + "format": "password", } ) | IsDict( # TODO: remove when deprecating Pydantic v1 - {"title": "Client Secret", "type": "string"} + { + "title": "Client Secret", + "type": "string", + "format": "password", + } ), }, }, diff --git a/tests/test_tutorial/test_security/test_tutorial005.py b/tests/test_tutorial/test_security/test_tutorial005.py index 88c3d7815..ad644d61b 100644 --- a/tests/test_tutorial/test_security/test_tutorial005.py +++ b/tests/test_tutorial/test_security/test_tutorial005.py @@ -377,7 +377,11 @@ def test_openapi_schema(mod: ModuleType): } ), "username": {"title": "Username", "type": "string"}, - "password": {"title": "Password", "type": "string"}, + "password": { + "title": "Password", + "type": "string", + "format": "password", + }, "scope": {"title": "Scope", "type": "string", "default": ""}, "client_id": IsDict( { @@ -393,11 +397,16 @@ def test_openapi_schema(mod: ModuleType): { "title": "Client Secret", "anyOf": [{"type": "string"}, {"type": "null"}], + "format": "password", } ) | IsDict( # TODO: remove when deprecating Pydantic v1 - {"title": "Client Secret", "type": "string"} + { + "title": "Client Secret", + "type": "string", + "format": "password", + } ), }, }, diff --git a/tests/test_tutorial/test_settings/test_tutorial001.py b/tests/test_tutorial/test_settings/test_tutorial001.py index eb30dbcee..92a5782d4 100644 --- a/tests/test_tutorial/test_settings/test_tutorial001.py +++ b/tests/test_tutorial/test_settings/test_tutorial001.py @@ -1,14 +1,26 @@ +import importlib + +import pytest from fastapi.testclient import TestClient from pytest import MonkeyPatch -from ...utils import needs_pydanticv2 +from ...utils import needs_pydanticv1, needs_pydanticv2 -@needs_pydanticv2 -def test_settings(monkeypatch: MonkeyPatch): +@pytest.fixture( + name="app", + params=[ + pytest.param("tutorial001", marks=needs_pydanticv2), + pytest.param("tutorial001_pv1", marks=needs_pydanticv1), + ], +) +def get_app(request: pytest.FixtureRequest, monkeypatch: MonkeyPatch): monkeypatch.setenv("ADMIN_EMAIL", "admin@example.com") - from docs_src.settings.tutorial001 import app + mod = importlib.import_module(f"docs_src.settings.{request.param}") + return mod.app + +def test_settings(app): client = TestClient(app) response = client.get("/info") assert response.status_code == 200, response.text diff --git a/tests/test_tutorial/test_settings/test_tutorial001_pv1.py b/tests/test_tutorial/test_settings/test_tutorial001_pv1.py deleted file mode 100644 index e4659de66..000000000 --- a/tests/test_tutorial/test_settings/test_tutorial001_pv1.py +++ /dev/null @@ -1,19 +0,0 @@ -from fastapi.testclient import TestClient -from pytest import MonkeyPatch - -from ...utils import needs_pydanticv1 - - -@needs_pydanticv1 -def test_settings(monkeypatch: MonkeyPatch): - monkeypatch.setenv("ADMIN_EMAIL", "admin@example.com") - from docs_src.settings.tutorial001_pv1 import app - - client = TestClient(app) - response = client.get("/info") - assert response.status_code == 200, response.text - assert response.json() == { - "app_name": "Awesome API", - "admin_email": "admin@example.com", - "items_per_user": 50, - } diff --git a/tests/test_tutorial/test_sql_databases/test_tutorial002.py b/tests/test_tutorial/test_sql_databases/test_tutorial002.py index 79e48c1c3..8a98f9a2d 100644 --- a/tests/test_tutorial/test_sql_databases/test_tutorial002.py +++ b/tests/test_tutorial/test_sql_databases/test_tutorial002.py @@ -4,7 +4,7 @@ import warnings import pytest from dirty_equals import IsDict, IsInt from fastapi.testclient import TestClient -from inline_snapshot import snapshot +from inline_snapshot import Is, snapshot from sqlalchemy import StaticPool from sqlmodel import SQLModel, create_engine from sqlmodel.main import default_registry @@ -117,14 +117,14 @@ def test_crud_app(client: TestClient): ) assert response.status_code == 200, response.text assert response.json() == snapshot( - {"name": "Dog Pond", "age": None, "id": hero_id} + {"name": "Dog Pond", "age": None, "id": Is(hero_id)} ) # Get updated hero response = client.get(f"/heroes/{hero_id}") assert response.status_code == 200, response.text assert response.json() == snapshot( - {"name": "Dog Pond", "age": None, "id": hero_id} + {"name": "Dog Pond", "age": None, "id": Is(hero_id)} ) # Delete a hero diff --git a/tests/test_union_forms.py b/tests/test_union_forms.py new file mode 100644 index 000000000..cbe98ea82 --- /dev/null +++ b/tests/test_union_forms.py @@ -0,0 +1,156 @@ +from typing import Union + +from fastapi import FastAPI, Form +from fastapi.testclient import TestClient +from pydantic import BaseModel +from typing_extensions import Annotated + +app = FastAPI() + + +class UserForm(BaseModel): + name: str + email: str + + +class CompanyForm(BaseModel): + company_name: str + industry: str + + +@app.post("/form-union/") +def post_union_form(data: Annotated[Union[UserForm, CompanyForm], Form()]): + return {"received": data} + + +client = TestClient(app) + + +def test_post_user_form(): + response = client.post( + "/form-union/", data={"name": "John Doe", "email": "john@example.com"} + ) + assert response.status_code == 200, response.text + assert response.json() == { + "received": {"name": "John Doe", "email": "john@example.com"} + } + + +def test_post_company_form(): + response = client.post( + "/form-union/", data={"company_name": "Tech Corp", "industry": "Technology"} + ) + assert response.status_code == 200, response.text + assert response.json() == { + "received": {"company_name": "Tech Corp", "industry": "Technology"} + } + + +def test_invalid_form_data(): + response = client.post( + "/form-union/", + data={"name": "John", "company_name": "Tech Corp"}, + ) + assert response.status_code == 422, response.text + + +def test_empty_form(): + response = client.post("/form-union/") + assert response.status_code == 422, response.text + + +def test_openapi_schema(): + response = client.get("/openapi.json") + assert response.status_code == 200, response.text + + assert response.json() == { + "openapi": "3.1.0", + "info": {"title": "FastAPI", "version": "0.1.0"}, + "paths": { + "/form-union/": { + "post": { + "summary": "Post Union Form", + "operationId": "post_union_form_form_union__post", + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "anyOf": [ + {"$ref": "#/components/schemas/UserForm"}, + {"$ref": "#/components/schemas/CompanyForm"}, + ], + "title": "Data", + } + } + }, + "required": True, + }, + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + } + }, + "components": { + "schemas": { + "CompanyForm": { + "properties": { + "company_name": {"type": "string", "title": "Company Name"}, + "industry": {"type": "string", "title": "Industry"}, + }, + "type": "object", + "required": ["company_name", "industry"], + "title": "CompanyForm", + }, + "HTTPValidationError": { + "properties": { + "detail": { + "items": {"$ref": "#/components/schemas/ValidationError"}, + "type": "array", + "title": "Detail", + } + }, + "type": "object", + "title": "HTTPValidationError", + }, + "UserForm": { + "properties": { + "name": {"type": "string", "title": "Name"}, + "email": {"type": "string", "title": "Email"}, + }, + "type": "object", + "required": ["name", "email"], + "title": "UserForm", + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [{"type": "string"}, {"type": "integer"}] + }, + "type": "array", + "title": "Location", + }, + "msg": {"type": "string", "title": "Message"}, + "type": {"type": "string", "title": "Error Type"}, + }, + "type": "object", + "required": ["loc", "msg", "type"], + "title": "ValidationError", + }, + } + }, + } diff --git a/tests/test_validate_response_recursive/app_pv1.py b/tests/test_validate_response_recursive/app.py similarity index 79% rename from tests/test_validate_response_recursive/app_pv1.py rename to tests/test_validate_response_recursive/app.py index 4cfc4b3ee..d23d27980 100644 --- a/tests/test_validate_response_recursive/app_pv1.py +++ b/tests/test_validate_response_recursive/app.py @@ -1,6 +1,7 @@ from typing import List from fastapi import FastAPI +from fastapi._compat import PYDANTIC_V2 from pydantic import BaseModel app = FastAPI() @@ -11,9 +12,6 @@ class RecursiveItem(BaseModel): name: str -RecursiveItem.update_forward_refs() - - class RecursiveSubitemInSubmodel(BaseModel): sub_items2: List["RecursiveItemViaSubmodel"] = [] name: str @@ -24,7 +22,13 @@ class RecursiveItemViaSubmodel(BaseModel): name: str -RecursiveSubitemInSubmodel.update_forward_refs() +if PYDANTIC_V2: + RecursiveItem.model_rebuild() + RecursiveSubitemInSubmodel.model_rebuild() + RecursiveItemViaSubmodel.model_rebuild() +else: + RecursiveItem.update_forward_refs() + RecursiveSubitemInSubmodel.update_forward_refs() @app.get("/items/recursive", response_model=RecursiveItem) diff --git a/tests/test_validate_response_recursive/app_pv2.py b/tests/test_validate_response_recursive/app_pv2.py deleted file mode 100644 index 8c93a8349..000000000 --- a/tests/test_validate_response_recursive/app_pv2.py +++ /dev/null @@ -1,51 +0,0 @@ -from typing import List - -from fastapi import FastAPI -from pydantic import BaseModel - -app = FastAPI() - - -class RecursiveItem(BaseModel): - sub_items: List["RecursiveItem"] = [] - name: str - - -RecursiveItem.model_rebuild() - - -class RecursiveSubitemInSubmodel(BaseModel): - sub_items2: List["RecursiveItemViaSubmodel"] = [] - name: str - - -class RecursiveItemViaSubmodel(BaseModel): - sub_items1: List[RecursiveSubitemInSubmodel] = [] - name: str - - -RecursiveSubitemInSubmodel.model_rebuild() -RecursiveItemViaSubmodel.model_rebuild() - - -@app.get("/items/recursive", response_model=RecursiveItem) -def get_recursive(): - return {"name": "item", "sub_items": [{"name": "subitem", "sub_items": []}]} - - -@app.get("/items/recursive-submodel", response_model=RecursiveItemViaSubmodel) -def get_recursive_submodel(): - return { - "name": "item", - "sub_items1": [ - { - "name": "subitem", - "sub_items2": [ - { - "name": "subsubitem", - "sub_items1": [{"name": "subsubsubitem", "sub_items2": []}], - } - ], - } - ], - } diff --git a/tests/test_validate_response_recursive/test_validate_response_recursive_pv2.py b/tests/test_validate_response_recursive/test_validate_response_recursive.py similarity index 90% rename from tests/test_validate_response_recursive/test_validate_response_recursive_pv2.py rename to tests/test_validate_response_recursive/test_validate_response_recursive.py index 7d45e7fe4..21a299ab8 100644 --- a/tests/test_validate_response_recursive/test_validate_response_recursive_pv2.py +++ b/tests/test_validate_response_recursive/test_validate_response_recursive.py @@ -1,12 +1,9 @@ from fastapi.testclient import TestClient -from ..utils import needs_pydanticv2 +from .app import app -@needs_pydanticv2 def test_recursive(): - from .app_pv2 import app - client = TestClient(app) response = client.get("/items/recursive") assert response.status_code == 200, response.text diff --git a/tests/test_validate_response_recursive/test_validate_response_recursive_pv1.py b/tests/test_validate_response_recursive/test_validate_response_recursive_pv1.py deleted file mode 100644 index de578ae03..000000000 --- a/tests/test_validate_response_recursive/test_validate_response_recursive_pv1.py +++ /dev/null @@ -1,33 +0,0 @@ -from fastapi.testclient import TestClient - -from ..utils import needs_pydanticv1 - - -@needs_pydanticv1 -def test_recursive(): - from .app_pv1 import app - - client = TestClient(app) - response = client.get("/items/recursive") - assert response.status_code == 200, response.text - assert response.json() == { - "sub_items": [{"name": "subitem", "sub_items": []}], - "name": "item", - } - - response = client.get("/items/recursive-submodel") - assert response.status_code == 200, response.text - assert response.json() == { - "name": "item", - "sub_items1": [ - { - "name": "subitem", - "sub_items2": [ - { - "name": "subsubitem", - "sub_items1": [{"name": "subsubsubitem", "sub_items2": []}], - } - ], - } - ], - } diff --git a/tests/utils.py b/tests/utils.py index 460c028f7..ae9543e3b 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -2,6 +2,7 @@ import sys import pytest from fastapi._compat import PYDANTIC_V2 +from inline_snapshot import Snapshot needs_py39 = pytest.mark.skipif(sys.version_info < (3, 9), reason="requires python3.9+") needs_py310 = pytest.mark.skipif( @@ -9,3 +10,25 @@ needs_py310 = pytest.mark.skipif( ) needs_pydanticv2 = pytest.mark.skipif(not PYDANTIC_V2, reason="requires Pydantic v2") needs_pydanticv1 = pytest.mark.skipif(PYDANTIC_V2, reason="requires Pydantic v1") + + +def pydantic_snapshot( + *, + v2: Snapshot, + v1: Snapshot, # TODO: remove v1 argument when deprecating Pydantic v1 +): + """ + This function should be used like this: + + >>> assert value == pydantic_snapshot(v2=snapshot(),v1=snapshot()) + + inline-snapshot will create the snapshots when pytest is executed for each versions of pydantic. + + It is also possible to use the function inside snapshots for version-specific values. + + >>> assert value == snapshot({ + "data": "some data", + "version_specific": pydantic_snapshot(v2=snapshot(),v1=snapshot()), + }) + """ + return v2 if PYDANTIC_V2 else v1