diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
index a8f4c4de2..fd9f3b11c 100644
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -4,13 +4,13 @@ contact_links:
about: Please report security vulnerabilities to security@tiangolo.com
- name: Question or Problem
about: Ask a question or ask about a problem in GitHub Discussions.
- url: https://github.com/tiangolo/fastapi/discussions/categories/questions
+ url: https://github.com/fastapi/fastapi/discussions/categories/questions
- name: Feature Request
about: To suggest an idea or ask about a feature, please start with a question saying what you would like to achieve. There might be a way to do it already.
- url: https://github.com/tiangolo/fastapi/discussions/categories/questions
+ url: https://github.com/fastapi/fastapi/discussions/categories/questions
- name: Show and tell
about: Show what you built with FastAPI or to be used with FastAPI.
- url: https://github.com/tiangolo/fastapi/discussions/categories/show-and-tell
+ url: https://github.com/fastapi/fastapi/discussions/categories/show-and-tell
- name: Translations
about: Coordinate translations in GitHub Discussions.
- url: https://github.com/tiangolo/fastapi/discussions/categories/translations
+ url: https://github.com/fastapi/fastapi/discussions/categories/translations
diff --git a/.github/ISSUE_TEMPLATE/privileged.yml b/.github/ISSUE_TEMPLATE/privileged.yml
index c01e34b6d..2b85eb310 100644
--- a/.github/ISSUE_TEMPLATE/privileged.yml
+++ b/.github/ISSUE_TEMPLATE/privileged.yml
@@ -6,7 +6,7 @@ body:
value: |
Thanks for your interest in FastAPI! 🚀
- If you are not @tiangolo or he didn't ask you directly to create an issue here, please start the conversation in a [Question in GitHub Discussions](https://github.com/tiangolo/fastapi/discussions/categories/questions) instead.
+ If you are not @tiangolo or he didn't ask you directly to create an issue here, please start the conversation in a [Question in GitHub Discussions](https://github.com/fastapi/fastapi/discussions/categories/questions) instead.
- type: checkboxes
id: privileged
attributes:
diff --git a/.github/actions/comment-docs-preview-in-pr/Dockerfile b/.github/actions/comment-docs-preview-in-pr/Dockerfile
deleted file mode 100644
index 42627fe19..000000000
--- a/.github/actions/comment-docs-preview-in-pr/Dockerfile
+++ /dev/null
@@ -1,9 +0,0 @@
-FROM python:3.10
-
-COPY ./requirements.txt /app/requirements.txt
-
-RUN pip install -r /app/requirements.txt
-
-COPY ./app /app
-
-CMD ["python", "/app/main.py"]
diff --git a/.github/actions/comment-docs-preview-in-pr/action.yml b/.github/actions/comment-docs-preview-in-pr/action.yml
deleted file mode 100644
index 0eb64402d..000000000
--- a/.github/actions/comment-docs-preview-in-pr/action.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-name: Comment Docs Preview in PR
-description: Comment with the docs URL preview in the PR
-author: Sebastián Ramírez
-inputs:
- token:
- description: Token for the repo. Can be passed in using {{ secrets.GITHUB_TOKEN }}
- required: true
- deploy_url:
- description: The deployment URL to comment in the PR
- required: true
-runs:
- using: docker
- image: Dockerfile
diff --git a/.github/actions/comment-docs-preview-in-pr/app/main.py b/.github/actions/comment-docs-preview-in-pr/app/main.py
deleted file mode 100644
index 8cc119fe0..000000000
--- a/.github/actions/comment-docs-preview-in-pr/app/main.py
+++ /dev/null
@@ -1,69 +0,0 @@
-import logging
-import sys
-from pathlib import Path
-from typing import Union
-
-import httpx
-from github import Github
-from github.PullRequest import PullRequest
-from pydantic import BaseModel, SecretStr, ValidationError
-from pydantic_settings import BaseSettings
-
-github_api = "https://api.github.com"
-
-
-class Settings(BaseSettings):
- github_repository: str
- github_event_path: Path
- github_event_name: Union[str, None] = None
- input_token: SecretStr
- input_deploy_url: str
-
-
-class PartialGithubEventHeadCommit(BaseModel):
- id: str
-
-
-class PartialGithubEventWorkflowRun(BaseModel):
- head_commit: PartialGithubEventHeadCommit
-
-
-class PartialGithubEvent(BaseModel):
- workflow_run: PartialGithubEventWorkflowRun
-
-
-if __name__ == "__main__":
- logging.basicConfig(level=logging.INFO)
- settings = Settings()
- logging.info(f"Using config: {settings.json()}")
- g = Github(settings.input_token.get_secret_value())
- repo = g.get_repo(settings.github_repository)
- try:
- event = PartialGithubEvent.parse_file(settings.github_event_path)
- except ValidationError as e:
- logging.error(f"Error parsing event file: {e.errors()}")
- sys.exit(0)
- use_pr: Union[PullRequest, None] = None
- for pr in repo.get_pulls():
- if pr.head.sha == event.workflow_run.head_commit.id:
- use_pr = pr
- break
- if not use_pr:
- logging.error(f"No PR found for hash: {event.workflow_run.head_commit.id}")
- sys.exit(0)
- github_headers = {
- "Authorization": f"token {settings.input_token.get_secret_value()}"
- }
- url = f"{github_api}/repos/{settings.github_repository}/issues/{use_pr.number}/comments"
- logging.info(f"Using comments URL: {url}")
- response = httpx.post(
- url,
- headers=github_headers,
- json={
- "body": f"📝 Docs preview for commit {use_pr.head.sha} at: {settings.input_deploy_url}"
- },
- )
- if not (200 <= response.status_code <= 300):
- logging.error(f"Error posting comment: {response.text}")
- sys.exit(1)
- logging.info("Finished")
diff --git a/.github/actions/notify-translations/app/main.py b/.github/actions/notify-translations/app/main.py
index 8ac1f233d..716232d49 100644
--- a/.github/actions/notify-translations/app/main.py
+++ b/.github/actions/notify-translations/app/main.py
@@ -11,7 +11,7 @@ from pydantic import BaseModel, BaseSettings, SecretStr
awaiting_label = "awaiting-review"
lang_all_label = "lang-all"
-approved_label = "approved-2"
+approved_label = "approved-1"
translations_path = Path(__file__).parent / "translations.yml"
github_graphql_url = "https://api.github.com/graphql"
@@ -19,7 +19,7 @@ questions_translations_category_id = "DIC_kwDOCZduT84CT5P9"
all_discussions_query = """
query Q($category_id: ID) {
- repository(name: "fastapi", owner: "tiangolo") {
+ repository(name: "fastapi", owner: "fastapi") {
discussions(categoryId: $category_id, first: 100) {
nodes {
title
@@ -41,7 +41,7 @@ query Q($category_id: ID) {
translation_discussion_query = """
query Q($after: String, $discussion_number: Int!) {
- repository(name: "fastapi", owner: "tiangolo") {
+ repository(name: "fastapi", owner: "fastapi") {
discussion(number: $discussion_number) {
comments(first: 100, after: $after) {
edges {
diff --git a/.github/actions/people/app/main.py b/.github/actions/people/app/main.py
index 9f2b9369d..b752d9d2b 100644
--- a/.github/actions/people/app/main.py
+++ b/.github/actions/people/app/main.py
@@ -17,7 +17,7 @@ questions_category_id = "MDE4OkRpc2N1c3Npb25DYXRlZ29yeTMyMDAxNDM0"
discussions_query = """
query Q($after: String, $category_id: ID) {
- repository(name: "fastapi", owner: "tiangolo") {
+ repository(name: "fastapi", owner: "fastapi") {
discussions(first: 100, after: $after, categoryId: $category_id) {
edges {
cursor
@@ -61,7 +61,7 @@ query Q($after: String, $category_id: ID) {
prs_query = """
query Q($after: String) {
- repository(name: "fastapi", owner: "tiangolo") {
+ repository(name: "fastapi", owner: "fastapi") {
pullRequests(first: 100, after: $after) {
edges {
cursor
@@ -109,7 +109,7 @@ query Q($after: String) {
sponsors_query = """
query Q($after: String) {
- user(login: "tiangolo") {
+ user(login: "fastapi") {
sponsorshipsAsMaintainer(first: 100, after: $after) {
edges {
cursor
@@ -515,9 +515,9 @@ def get_individual_sponsors(settings: Settings):
tiers: DefaultDict[float, Dict[str, SponsorEntity]] = defaultdict(dict)
for node in nodes:
- tiers[node.tier.monthlyPriceInDollars][
- node.sponsorEntity.login
- ] = node.sponsorEntity
+ tiers[node.tier.monthlyPriceInDollars][node.sponsorEntity.login] = (
+ node.sponsorEntity
+ )
return tiers
diff --git a/.github/labeler.yml b/.github/labeler.yml
new file mode 100644
index 000000000..1d49a2411
--- /dev/null
+++ b/.github/labeler.yml
@@ -0,0 +1,34 @@
+docs:
+ - all:
+ - changed-files:
+ - any-glob-to-any-file:
+ - docs/en/docs/**
+ - docs_src/**
+ - all-globs-to-all-files:
+ - '!fastapi/**'
+ - '!pyproject.toml'
+
+lang-all:
+ - all:
+ - changed-files:
+ - any-glob-to-any-file:
+ - docs/*/docs/**
+ - all-globs-to-all-files:
+ - '!docs/en/docs/**'
+ - '!fastapi/**'
+ - '!pyproject.toml'
+
+internal:
+ - all:
+ - changed-files:
+ - any-glob-to-any-file:
+ - .github/**
+ - scripts/**
+ - .gitignore
+ - .pre-commit-config.yaml
+ - pdm_build.py
+ - requirements*.txt
+ - all-globs-to-all-files:
+ - '!docs/*/docs/**'
+ - '!fastapi/**'
+ - '!pyproject.toml'
diff --git a/.github/workflows/add-to-project.yml b/.github/workflows/add-to-project.yml
new file mode 100644
index 000000000..dccea83f3
--- /dev/null
+++ b/.github/workflows/add-to-project.yml
@@ -0,0 +1,18 @@
+name: Add to Project
+
+on:
+ pull_request_target:
+ issues:
+ types:
+ - opened
+ - reopened
+
+jobs:
+ add-to-project:
+ name: Add to project
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/add-to-project@v1.0.2
+ with:
+ project-url: https://github.com/orgs/fastapi/projects/2
+ github-token: ${{ secrets.PROJECTS_TOKEN }}
diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml
index 4ff5e26cb..e46629e9b 100644
--- a/.github/workflows/build-docs.yml
+++ b/.github/workflows/build-docs.yml
@@ -18,7 +18,7 @@ jobs:
docs: ${{ steps.filter.outputs.docs }}
steps:
- uses: actions/checkout@v4
- # For pull requests it's not necessary to checkout the code but for master it is
+ # For pull requests it's not necessary to checkout the code but for the main branch it is
- uses: dorny/paths-filter@v3
id: filter
with:
@@ -28,9 +28,12 @@ jobs:
- docs/**
- docs_src/**
- requirements-docs.txt
+ - requirements-docs-insiders.txt
- pyproject.toml
- mkdocs.yml
- mkdocs.insiders.yml
+ - mkdocs.maybe-insiders.yml
+ - mkdocs.no-insiders.yml
- .github/workflows/build-docs.yml
- .github/workflows/deploy-docs.yml
langs:
@@ -49,17 +52,16 @@ jobs:
id: cache
with:
path: ${{ env.pythonLocation }}
- key: ${{ runner.os }}-python-docs-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml', 'requirements-docs.txt', 'requirements-docs-tests.txt') }}-v07
+ key: ${{ runner.os }}-python-docs-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml', 'requirements-docs.txt', 'requirements-docs-insiders.txt', 'requirements-docs-tests.txt') }}-v08
- name: Install docs extras
if: steps.cache.outputs.cache-hit != 'true'
run: pip install -r requirements-docs.txt
# Install MkDocs Material Insiders here just to put it in the cache for the rest of the steps
- name: Install Material for MkDocs Insiders
if: ( github.event_name != 'pull_request' || github.secret_source == 'Actions' ) && steps.cache.outputs.cache-hit != 'true'
- run: |
- pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/squidfunk/mkdocs-material-insiders.git
- pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/pawamoy-insiders/griffe-typing-deprecated.git
- pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/pawamoy-insiders/mkdocstrings-python.git
+ run: pip install -r requirements-docs-insiders.txt
+ env:
+ TOKEN: ${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}
- name: Verify Docs
run: python ./scripts/docs.py verify-docs
- name: Export Language Codes
@@ -90,16 +92,15 @@ jobs:
id: cache
with:
path: ${{ env.pythonLocation }}
- key: ${{ runner.os }}-python-docs-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml', 'requirements-docs.txt', 'requirements-docs-tests.txt') }}-v08
+ key: ${{ runner.os }}-python-docs-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml', 'requirements-docs.txt', 'requirements-docs-insiders.txt', 'requirements-docs-tests.txt') }}-v08
- name: Install docs extras
if: steps.cache.outputs.cache-hit != 'true'
run: pip install -r requirements-docs.txt
- name: Install Material for MkDocs Insiders
if: ( github.event_name != 'pull_request' || github.secret_source == 'Actions' ) && steps.cache.outputs.cache-hit != 'true'
- run: |
- pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/squidfunk/mkdocs-material-insiders.git
- pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/pawamoy-insiders/griffe-typing-deprecated.git
- pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/pawamoy-insiders/mkdocstrings-python.git
+ run: pip install -r requirements-docs-insiders.txt
+ env:
+ TOKEN: ${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}
- name: Update Languages
run: python ./scripts/docs.py update-languages
- uses: actions/cache@v4
@@ -108,9 +109,9 @@ jobs:
path: docs/${{ matrix.lang }}/.cache
- name: Build Docs
run: python ./scripts/docs.py build-lang ${{ matrix.lang }}
- - uses: actions/upload-artifact@v3
+ - uses: actions/upload-artifact@v4
with:
- name: docs-site
+ name: docs-site-${{ matrix.lang }}
path: ./site/**
# https://github.com/marketplace/actions/alls-green#why
diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml
index b8dbb7dc5..d2953f284 100644
--- a/.github/workflows/deploy-docs.yml
+++ b/.github/workflows/deploy-docs.yml
@@ -6,6 +6,12 @@ on:
types:
- completed
+permissions:
+ deployments: write
+ issues: write
+ pull-requests: write
+ statuses: write
+
jobs:
deploy-docs:
runs-on: ubuntu-latest
@@ -15,22 +21,39 @@ jobs:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- uses: actions/checkout@v4
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: "3.11"
+ - uses: actions/cache@v4
+ id: cache
+ with:
+ path: ${{ env.pythonLocation }}
+ key: ${{ runner.os }}-python-github-actions-${{ env.pythonLocation }}-${{ hashFiles('requirements-github-actions.txt') }}-v01
+ - name: Install GitHub Actions dependencies
+ if: steps.cache.outputs.cache-hit != 'true'
+ run: pip install -r requirements-github-actions.txt
+ - name: Deploy Docs Status Pending
+ run: python ./scripts/deploy_docs_status.py
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ COMMIT_SHA: ${{ github.event.workflow_run.head_sha }}
+ RUN_ID: ${{ github.run_id }}
+
- name: Clean site
run: |
rm -rf ./site
mkdir ./site
- - name: Download Artifact Docs
- id: download
- uses: dawidd6/action-download-artifact@v3.1.4
+ - uses: actions/download-artifact@v4
with:
- if_no_artifact_found: ignore
- github_token: ${{ secrets.FASTAPI_PREVIEW_DOCS_DOWNLOAD_ARTIFACTS }}
- workflow: build-docs.yml
- run_id: ${{ github.event.workflow_run.id }}
- name: docs-site
path: ./site/
+ pattern: docs-site-*
+ merge-multiple: true
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ run-id: ${{ github.event.workflow_run.id }}
- name: Deploy to Cloudflare Pages
- if: steps.download.outputs.found_artifact == 'true'
+ # hashFiles returns an empty string if there are no files
+ if: hashFiles('./site/*')
id: deploy
uses: cloudflare/pages-action@v1
with:
@@ -41,8 +64,10 @@ jobs:
gitHubToken: ${{ secrets.GITHUB_TOKEN }}
branch: ${{ ( github.event.workflow_run.head_repository.full_name == github.repository && github.event.workflow_run.head_branch == 'master' && 'main' ) || ( github.event.workflow_run.head_sha ) }}
- name: Comment Deploy
- if: steps.deploy.outputs.url != ''
- uses: ./.github/actions/comment-docs-preview-in-pr
- with:
- token: ${{ secrets.FASTAPI_PREVIEW_DOCS_COMMENT_DEPLOY }}
- deploy_url: "${{ steps.deploy.outputs.url }}"
+ run: python ./scripts/deploy_docs_status.py
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ DEPLOY_URL: ${{ steps.deploy.outputs.url }}
+ COMMIT_SHA: ${{ github.event.workflow_run.head_sha }}
+ RUN_ID: ${{ github.run_id }}
+ IS_DONE: "true"
diff --git a/.github/workflows/issue-manager.yml b/.github/workflows/issue-manager.yml
index 0f564d721..d5b947a9c 100644
--- a/.github/workflows/issue-manager.yml
+++ b/.github/workflows/issue-manager.yml
@@ -14,9 +14,12 @@ on:
- labeled
workflow_dispatch:
+permissions:
+ issues: write
+
jobs:
issue-manager:
- if: github.repository_owner == 'tiangolo'
+ if: github.repository_owner == 'fastapi'
runs-on: ubuntu-latest
steps:
- name: Dump GitHub context
@@ -25,7 +28,7 @@ jobs:
run: echo "$GITHUB_CONTEXT"
- uses: tiangolo/issue-manager@0.5.0
with:
- token: ${{ secrets.FASTAPI_ISSUE_MANAGER }}
+ token: ${{ secrets.GITHUB_TOKEN }}
config: >
{
"answered": {
diff --git a/.github/workflows/label-approved.yml b/.github/workflows/label-approved.yml
index 51be2413d..0470fb606 100644
--- a/.github/workflows/label-approved.yml
+++ b/.github/workflows/label-approved.yml
@@ -5,9 +5,12 @@ on:
- cron: "0 12 * * *"
workflow_dispatch:
+permissions:
+ pull-requests: write
+
jobs:
label-approved:
- if: github.repository_owner == 'tiangolo'
+ if: github.repository_owner == 'fastapi'
runs-on: ubuntu-latest
steps:
- name: Dump GitHub context
@@ -16,7 +19,7 @@ jobs:
run: echo "$GITHUB_CONTEXT"
- uses: docker://tiangolo/label-approved:0.0.4
with:
- token: ${{ secrets.FASTAPI_LABEL_APPROVED }}
+ token: ${{ secrets.GITHUB_TOKEN }}
config: >
{
"approved-1":
diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml
new file mode 100644
index 000000000..c3bb83f9a
--- /dev/null
+++ b/.github/workflows/labeler.yml
@@ -0,0 +1,31 @@
+name: Labels
+on:
+ pull_request_target:
+ types:
+ - opened
+ - synchronize
+ - reopened
+ # For label-checker
+ - labeled
+ - unlabeled
+
+jobs:
+ labeler:
+ permissions:
+ contents: read
+ pull-requests: write
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/labeler@v5
+ # Run this after labeler applied labels
+ check-labels:
+ needs:
+ - labeler
+ permissions:
+ pull-requests: read
+ runs-on: ubuntu-latest
+ steps:
+ - uses: docker://agilepathway/pull-request-label-checker:latest
+ with:
+ one_of: breaking,security,feature,bug,refactor,upgrade,docs,lang-all,internal
+ repo_token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/latest-changes.yml b/.github/workflows/latest-changes.yml
index 27e062d09..16da3bc63 100644
--- a/.github/workflows/latest-changes.yml
+++ b/.github/workflows/latest-changes.yml
@@ -34,8 +34,7 @@ jobs:
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }}
with:
limit-access-to-actor: true
- - uses: docker://tiangolo/latest-changes:0.3.0
- # - uses: tiangolo/latest-changes@main
+ - uses: tiangolo/latest-changes@0.3.1
with:
token: ${{ secrets.GITHUB_TOKEN }}
latest_changes_file: docs/en/docs/release-notes.md
diff --git a/.github/workflows/notify-translations.yml b/.github/workflows/notify-translations.yml
index c0904ce48..4787f3ddd 100644
--- a/.github/workflows/notify-translations.yml
+++ b/.github/workflows/notify-translations.yml
@@ -15,6 +15,9 @@ on:
required: false
default: 'false'
+permissions:
+ discussions: write
+
jobs:
notify-translations:
runs-on: ubuntu-latest
@@ -32,4 +35,4 @@ jobs:
limit-access-to-actor: true
- uses: ./.github/actions/notify-translations
with:
- token: ${{ secrets.FASTAPI_NOTIFY_TRANSLATIONS }}
+ token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/people.yml b/.github/workflows/people.yml
index b0868771d..c60c63d1b 100644
--- a/.github/workflows/people.yml
+++ b/.github/workflows/people.yml
@@ -12,7 +12,7 @@ on:
jobs:
fastapi-people:
- if: github.repository_owner == 'tiangolo'
+ if: github.repository_owner == 'fastapi'
runs-on: ubuntu-latest
steps:
- name: Dump GitHub context
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index e7c69befc..591df634b 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -35,7 +35,7 @@ jobs:
TIANGOLO_BUILD_PACKAGE: ${{ matrix.package }}
run: python -m build
- name: Publish
- uses: pypa/gh-action-pypi-publish@v1.8.14
+ uses: pypa/gh-action-pypi-publish@v1.9.0
- name: Dump GitHub context
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
diff --git a/.github/workflows/smokeshow.yml b/.github/workflows/smokeshow.yml
index c4043cc6a..d3a975df5 100644
--- a/.github/workflows/smokeshow.yml
+++ b/.github/workflows/smokeshow.yml
@@ -24,17 +24,18 @@ jobs:
- run: pip install smokeshow
- - uses: dawidd6/action-download-artifact@v3.1.4
+ - uses: actions/download-artifact@v4
with:
- github_token: ${{ secrets.FASTAPI_SMOKESHOW_DOWNLOAD_ARTIFACTS }}
- workflow: test.yml
- commit: ${{ github.event.workflow_run.head_sha }}
+ name: coverage-html
+ path: htmlcov
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ run-id: ${{ github.event.workflow_run.id }}
- - run: smokeshow upload coverage-html
+ - run: smokeshow upload htmlcov
env:
SMOKESHOW_GITHUB_STATUS_DESCRIPTION: Coverage {coverage-percentage}
SMOKESHOW_GITHUB_COVERAGE_THRESHOLD: 100
SMOKESHOW_GITHUB_CONTEXT: coverage
- SMOKESHOW_GITHUB_TOKEN: ${{ secrets.FASTAPI_SMOKESHOW_UPLOAD }}
+ SMOKESHOW_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SMOKESHOW_GITHUB_PR_HEAD_SHA: ${{ github.event.workflow_run.head_sha }}
SMOKESHOW_AUTH_KEY: ${{ secrets.SMOKESHOW_AUTH_KEY }}
diff --git a/.github/workflows/test-redistribute.yml b/.github/workflows/test-redistribute.yml
index a249b18a7..693f0c603 100644
--- a/.github/workflows/test-redistribute.yml
+++ b/.github/workflows/test-redistribute.yml
@@ -41,6 +41,8 @@ jobs:
run: |
cd dist/fastapi*/
pip install -r requirements-tests.txt
+ env:
+ TIANGOLO_BUILD_PACKAGE: ${{ matrix.package }}
- name: Run source distribution tests
run: |
cd dist/fastapi*/
@@ -53,3 +55,15 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
+
+ # https://github.com/marketplace/actions/alls-green#why
+ test-redistribute-alls-green: # This job does nothing and is only used for the branch protection
+ if: always()
+ needs:
+ - test-redistribute
+ runs-on: ubuntu-latest
+ steps:
+ - name: Decide whether the needed jobs succeeded or failed
+ uses: re-actors/alls-green@release/v1
+ with:
+ jobs: ${{ toJSON(needs) }}
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index fe1e419d6..0458f83ff 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -87,9 +87,9 @@ jobs:
COVERAGE_FILE: coverage/.coverage.${{ runner.os }}-py${{ matrix.python-version }}
CONTEXT: ${{ runner.os }}-py${{ matrix.python-version }}
- name: Store coverage files
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
with:
- name: coverage
+ name: coverage-${{ matrix.python-version }}-${{ matrix.pydantic-version }}
path: coverage
coverage-combine:
@@ -108,17 +108,18 @@ jobs:
# cache: "pip"
# cache-dependency-path: pyproject.toml
- name: Get coverage files
- uses: actions/download-artifact@v3
+ uses: actions/download-artifact@v4
with:
- name: coverage
+ pattern: coverage-*
path: coverage
+ merge-multiple: true
- run: pip install coverage[toml]
- run: ls -la coverage
- run: coverage combine coverage
- run: coverage report
- - run: coverage html --show-contexts --title "Coverage for ${{ github.sha }}"
+ - run: coverage html --title "Coverage for ${{ github.sha }}"
- name: Store coverage HTML
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
with:
name: coverage-html
path: htmlcov
diff --git a/.gitignore b/.gitignore
index 9be494cec..ef6364a9a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,7 +7,7 @@ __pycache__
htmlcov
dist
site
-.coverage
+.coverage*
coverage.xml
.netlify
test.db
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 4d49845d6..7532f21b5 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -4,7 +4,7 @@ default_language_version:
python: python3.10
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v4.4.0
+ rev: v4.6.0
hooks:
- id: check-added-large-files
- id: check-toml
@@ -13,8 +13,8 @@ repos:
- --unsafe
- id: end-of-file-fixer
- id: trailing-whitespace
-- repo: https://github.com/charliermarsh/ruff-pre-commit
- rev: v0.2.0
+- repo: https://github.com/astral-sh/ruff-pre-commit
+ rev: v0.6.1
hooks:
- id: ruff
args:
diff --git a/CITATION.cff b/CITATION.cff
index 9028248b1..f14700349 100644
--- a/CITATION.cff
+++ b/CITATION.cff
@@ -12,7 +12,7 @@ authors:
family-names: Ramírez
email: tiangolo@gmail.com
identifiers:
-repository-code: 'https://github.com/tiangolo/fastapi'
+repository-code: 'https://github.com/fastapi/fastapi'
url: 'https://fastapi.tiangolo.com'
abstract: >-
FastAPI framework, high performance, easy to learn, fast to code,
diff --git a/README.md b/README.md
index 1db8a8949..ec7a95497 100644
--- a/README.md
+++ b/README.md
@@ -5,11 +5,11 @@
FastAPI framework, high performance, easy to learn, fast to code, ready for production
```console
-$ pip install fastapi
+$ pip install "fastapi[standard]"
---> 100%
```
+**Note**: Make sure you put `"fastapi[standard]"` in quotes to ensure it works in all terminals.
+
## Example
### Create it
@@ -387,7 +394,7 @@ Coming back to the previous code example, **FastAPI** will:
* Check if there is an optional query parameter named `q` (as in `http://127.0.0.1:8000/items/foo?q=somequery`) for `GET` requests.
* As the `q` parameter is declared with `= None`, it is optional.
* Without the `None` it would be required (as is the body in the case with `PUT`).
-* For `PUT` requests to `/items/{item_id}`, Read the body as JSON:
+* For `PUT` requests to `/items/{item_id}`, read the body as JSON:
* Check that it has a required attribute `name` that should be a `str`.
* Check that it has a required attribute `price` that has to be a `float`.
* Check that it has an optional attribute `is_offer`, that should be a `bool`, if present.
@@ -449,11 +456,15 @@ To understand more about it, see the section
@@ -439,7 +439,7 @@ item: Item
Pydantic দ্বারা ব্যবহৃত:
--
email_validator
- ইমেল যাচাইকরণের জন্য।
+-
email-validator
- ইমেল যাচাইকরণের জন্য।
স্টারলেট দ্বারা ব্যবহৃত:
diff --git a/docs/bn/docs/python-types.md b/docs/bn/docs/python-types.md
index 6923363dd..d5304a65e 100644
--- a/docs/bn/docs/python-types.md
+++ b/docs/bn/docs/python-types.md
@@ -12,8 +12,11 @@ Python-এ ঐচ্ছিক "টাইপ হিন্ট" (যা "টাই
তবে, আপনি যদি কখনো **FastAPI** ব্যবহার নাও করেন, তবুও এগুলি সম্পর্কে একটু শেখা আপনার উপকারে আসবে।
-!!! Note
- যদি আপনি একজন Python বিশেষজ্ঞ হন, এবং টাইপ হিন্ট সম্পর্কে সবকিছু জানেন, তাহলে পরবর্তী অধ্যায়ে চলে যান।
+/// note
+
+যদি আপনি একজন Python বিশেষজ্ঞ হন, এবং টাইপ হিন্ট সম্পর্কে সবকিছু জানেন, তাহলে পরবর্তী অধ্যায়ে চলে যান।
+
+///
## প্রেরণা
@@ -170,45 +173,55 @@ Python যত এগিয়ে যাচ্ছে, **নতুন সংস্
উদাহরণস্বরূপ, একটি ভেরিয়েবলকে `str`-এর একটি `list` হিসেবে সংজ্ঞায়িত করা যাক।
-=== "Python 3.9+"
+//// tab | Python 3.9+
- ভেরিয়েবলটি ঘোষণা করুন, একই কোলন (`:`) সিনট্যাক্স ব্যবহার করে।
+ভেরিয়েবলটি ঘোষণা করুন, একই কোলন (`:`) সিনট্যাক্স ব্যবহার করে।
- টাইপ হিসেবে, `list` ব্যবহার করুন।
+টাইপ হিসেবে, `list` ব্যবহার করুন।
- যেহেতু লিস্ট এমন একটি টাইপ যা অভ্যন্তরীণ টাইপগুলি ধারণ করে, আপনি তাদের স্কোয়ার ব্রাকেটের ভিতরে ব্যবহার করুন:
+যেহেতু লিস্ট এমন একটি টাইপ যা অভ্যন্তরীণ টাইপগুলি ধারণ করে, আপনি তাদের স্কোয়ার ব্রাকেটের ভিতরে ব্যবহার করুন:
- ```Python hl_lines="1"
- {!> ../../../docs_src/python_types/tutorial006_py39.py!}
- ```
+```Python hl_lines="1"
+{!> ../../../docs_src/python_types/tutorial006_py39.py!}
+```
-=== "Python 3.8+"
+////
- `typing` থেকে `List` (বড় হাতের `L` দিয়ে) ইমপোর্ট করুন:
+//// tab | Python 3.8+
- ``` Python hl_lines="1"
- {!> ../../../docs_src/python_types/tutorial006.py!}
- ```
+`typing` থেকে `List` (বড় হাতের `L` দিয়ে) ইমপোর্ট করুন:
- ভেরিয়েবলটি ঘোষণা করুন, একই কোলন (`:`) সিনট্যাক্স ব্যবহার করে।
+``` Python hl_lines="1"
+{!> ../../../docs_src/python_types/tutorial006.py!}
+```
- টাইপ হিসেবে, `typing` থেকে আপনার ইম্পোর্ট করা `List` ব্যবহার করুন।
+ভেরিয়েবলটি ঘোষণা করুন, একই কোলন (`:`) সিনট্যাক্স ব্যবহার করে।
+
+টাইপ হিসেবে, `typing` থেকে আপনার ইম্পোর্ট করা `List` ব্যবহার করুন।
+
+যেহেতু লিস্ট এমন একটি টাইপ যা অভ্যন্তরীণ টাইপগুলি ধারণ করে, আপনি তাদের স্কোয়ার ব্রাকেটের ভিতরে করুন:
+
+```Python hl_lines="4"
+{!> ../../../docs_src/python_types/tutorial006.py!}
+```
- যেহেতু লিস্ট এমন একটি টাইপ যা অভ্যন্তরীণ টাইপগুলি ধারণ করে, আপনি তাদের স্কোয়ার ব্রাকেটের ভিতরে করুন:
+////
- ```Python hl_lines="4"
- {!> ../../../docs_src/python_types/tutorial006.py!}
- ```
+/// info
-!!! Info
- স্কোয়ার ব্রাকেট এর ভিতরে ব্যবহৃত এইসব অভন্তরীন টাইপগুলোকে "ইন্টারনাল টাইপ" বলে।
+স্কোয়ার ব্রাকেট এর ভিতরে ব্যবহৃত এইসব অভন্তরীন টাইপগুলোকে "ইন্টারনাল টাইপ" বলে।
- এই উদাহরণে, এটি হচ্ছে `List`(অথবা পাইথন ৩.৯ বা তার উপরের সংস্করণের ক্ষেত্রে `list`) এ পাস করা টাইপ প্যারামিটার।
+এই উদাহরণে, এটি হচ্ছে `List`(অথবা পাইথন ৩.৯ বা তার উপরের সংস্করণের ক্ষেত্রে `list`) এ পাস করা টাইপ প্যারামিটার।
+
+///
এর অর্থ হচ্ছে: "ভেরিয়েবল `items` একটি `list`, এবং এই লিস্টের প্রতিটি আইটেম একটি `str`।"
-!!! Tip
- যদি আপনি Python 3.9 বা তার উপরে ব্যবহার করেন, আপনার `typing` থেকে `List` আমদানি করতে হবে না, আপনি সাধারণ `list` ওই টাইপের পরিবর্তে ব্যবহার করতে পারেন।
+/// tip
+
+যদি আপনি Python 3.9 বা তার উপরে ব্যবহার করেন, আপনার `typing` থেকে `List` আমদানি করতে হবে না, আপনি সাধারণ `list` ওই টাইপের পরিবর্তে ব্যবহার করতে পারেন।
+
+///
এর মাধ্যমে, আপনার এডিটর লিস্ট থেকে আইটেম প্রসেস করার সময় সাপোর্ট প্রদান করতে পারবে:
@@ -224,17 +237,21 @@ Python যত এগিয়ে যাচ্ছে, **নতুন সংস্
আপনি `tuple` এবং `set` ঘোষণা করার জন্য একই প্রক্রিয়া অনুসরণ করবেন:
-=== "Python 3.9+"
+//// tab | Python 3.9+
+
+```Python hl_lines="1"
+{!> ../../../docs_src/python_types/tutorial007_py39.py!}
+```
- ```Python hl_lines="1"
- {!> ../../../docs_src/python_types/tutorial007_py39.py!}
- ```
+////
-=== "Python 3.8+"
+//// tab | Python 3.8+
- ```Python hl_lines="1 4"
- {!> ../../../docs_src/python_types/tutorial007.py!}
- ```
+```Python hl_lines="1 4"
+{!> ../../../docs_src/python_types/tutorial007.py!}
+```
+
+////
এর মানে হল:
@@ -249,18 +266,21 @@ Python যত এগিয়ে যাচ্ছে, **নতুন সংস্
দ্বিতীয় টাইপ প্যারামিটারটি হল `dict`-এর মানগুলির জন্য:
-=== "Python 3.9+"
+//// tab | Python 3.9+
+
+```Python hl_lines="1"
+{!> ../../../docs_src/python_types/tutorial008_py39.py!}
+```
- ```Python hl_lines="1"
- {!> ../../../docs_src/python_types/tutorial008_py39.py!}
- ```
+////
-=== "Python 3.8+"
+//// tab | Python 3.8+
- ```Python hl_lines="1 4"
- {!> ../../../docs_src/python_types/tutorial008.py!}
- ```
+```Python hl_lines="1 4"
+{!> ../../../docs_src/python_types/tutorial008.py!}
+```
+////
এর মানে হল:
@@ -276,17 +296,21 @@ Python 3.6 এবং তার উপরের সংস্করণগুলি
Python 3.10-এ একটি **নতুন সিনট্যাক্স** আছে যেখানে আপনি সম্ভাব্য টাইপগুলিকে একটি
ভার্টিকাল বার (`|`) দ্বারা পৃথক করতে পারেন।
-=== "Python 3.10+"
+//// tab | Python 3.10+
+
+```Python hl_lines="1"
+{!> ../../../docs_src/python_types/tutorial008b_py310.py!}
+```
+
+////
- ```Python hl_lines="1"
- {!> ../../../docs_src/python_types/tutorial008b_py310.py!}
- ```
+//// tab | Python 3.8+
-=== "Python 3.8+"
+```Python hl_lines="1 4"
+{!> ../../../docs_src/python_types/tutorial008b.py!}
+```
- ```Python hl_lines="1 4"
- {!> ../../../docs_src/python_types/tutorial008b.py!}
- ```
+////
উভয় ক্ষেত্রেই এর মানে হল যে `item` হতে পারে একটি `int` অথবা `str`।
@@ -306,23 +330,29 @@ Python 3.6 এবং তার উপরের সংস্করণগুলি
এর মানে হল, Python 3.10-এ, আপনি টাইপগুলির ইউনিয়ন ঘোষণা করতে `Something | None` ব্যবহার করতে পারেন:
-=== "Python 3.10+"
+//// tab | Python 3.10+
- ```Python hl_lines="1"
- {!> ../../../docs_src/python_types/tutorial009_py310.py!}
- ```
+```Python hl_lines="1"
+{!> ../../../docs_src/python_types/tutorial009_py310.py!}
+```
-=== "Python 3.8+"
+////
- ```Python hl_lines="1 4"
- {!> ../../../docs_src/python_types/tutorial009.py!}
- ```
+//// tab | Python 3.8+
-=== "Python 3.8+ বিকল্প"
+```Python hl_lines="1 4"
+{!> ../../../docs_src/python_types/tutorial009.py!}
+```
- ```Python hl_lines="1 4"
- {!> ../../../docs_src/python_types/tutorial009b.py!}
- ```
+////
+
+//// tab | Python 3.8+ বিকল্প
+
+```Python hl_lines="1 4"
+{!> ../../../docs_src/python_types/tutorial009b.py!}
+```
+
+////
#### `Union` বা `Optional` ব্যবহার
@@ -367,46 +397,53 @@ say_hi(name=None) # এটি কাজ করে, None বৈধ 🎉
স্কোয়ার ব্র্যাকেটে টাইপ প্যারামিটার নেওয়া এই টাইপগুলিকে **জেনেরিক টাইপ** বা **জেনেরিকস** বলা হয়, যেমন:
-=== "Python 3.10+"
- আপনি সেই একই বিল্টইন টাইপ জেনেরিক্স হিসেবে ব্যবহার করতে পারবেন(ভিতরে টাইপ সহ স্কয়ারে ব্রাকেট দিয়ে):
+//// tab | Python 3.10+
+
+আপনি সেই একই বিল্টইন টাইপ জেনেরিক্স হিসেবে ব্যবহার করতে পারবেন(ভিতরে টাইপ সহ স্কয়ারে ব্রাকেট দিয়ে):
+
+* `list`
+* `tuple`
+* `set`
+* `dict`
+
+এবং Python 3.8 এর মতোই, `typing` মডিউল থেকে:
- * `list`
- * `tuple`
- * `set`
- * `dict`
+* `Union`
+* `Optional` (Python 3.8 এর মতোই)
+* ...এবং অন্যান্য।
- এবং Python 3.8 এর মতোই, `typing` মডিউল থেকে:
+Python 3.10-এ, `Union` এবং `Optional` জেনেরিকস ব্যবহার করার বিকল্প হিসেবে, আপনি টাইপগুলির ইউনিয়ন ঘোষণা করতে
ভার্টিকাল বার (`|`) ব্যবহার করতে পারেন, যা ওদের থেকে অনেক ভালো এবং সহজ।
- * `Union`
- * `Optional` (Python 3.8 এর মতোই)
- * ...এবং অন্যান্য।
+////
- Python 3.10-এ, `Union` এবং `Optional` জেনেরিকস ব্যবহার করার বিকল্প হিসেবে, আপনি টাইপগুলির ইউনিয়ন ঘোষণা করতে
ভার্টিকাল বার (`|`) ব্যবহার করতে পারেন, যা ওদের থেকে অনেক ভালো এবং সহজ।
+//// tab | Python 3.9+
-=== "Python 3.9+"
+আপনি সেই একই বিল্টইন টাইপ জেনেরিক্স হিসেবে ব্যবহার করতে পারবেন(ভিতরে টাইপ সহ স্কয়ারে ব্রাকেট দিয়ে):
- আপনি সেই একই বিল্টইন টাইপ জেনেরিক্স হিসেবে ব্যবহার করতে পারবেন(ভিতরে টাইপ সহ স্কয়ারে ব্রাকেট দিয়ে):
+* `list`
+* `tuple`
+* `set`
+* `dict`
- * `list`
- * `tuple`
- * `set`
- * `dict`
+এবং Python 3.8 এর মতোই, `typing` মডিউল থেকে:
- এবং Python 3.8 এর মতোই, `typing` মডিউল থেকে:
+* `Union`
+* `Optional`
+* ...এবং অন্যান্য।
- * `Union`
- * `Optional`
- * ...এবং অন্যান্য।
+////
-=== "Python 3.8+"
+//// tab | Python 3.8+
- * `List`
- * `Tuple`
- * `Set`
- * `Dict`
- * `Union`
- * `Optional`
- * ...এবং অন্যান্য।
+* `List`
+* `Tuple`
+* `Set`
+* `Dict`
+* `Union`
+* `Optional`
+* ...এবং অন্যান্য।
+
+////
### ক্লাস হিসেবে টাইপস
@@ -446,55 +483,71 @@ say_hi(name=None) # এটি কাজ করে, None বৈধ 🎉
অফিসিয়াল Pydantic ডক্স থেকে একটি উদাহরণ:
-=== "Python 3.10+"
+//// tab | Python 3.10+
+
+```Python
+{!> ../../../docs_src/python_types/tutorial011_py310.py!}
+```
+
+////
+
+//// tab | Python 3.9+
+
+```Python
+{!> ../../../docs_src/python_types/tutorial011_py39.py!}
+```
+
+////
- ```Python
- {!> ../../../docs_src/python_types/tutorial011_py310.py!}
- ```
+//// tab | Python 3.8+
-=== "Python 3.9+"
+```Python
+{!> ../../../docs_src/python_types/tutorial011.py!}
+```
- ```Python
- {!> ../../../docs_src/python_types/tutorial011_py39.py!}
- ```
+////
-=== "Python 3.8+"
+/// info
- ```Python
- {!> ../../../docs_src/python_types/tutorial011.py!}
- ```
+[Pydantic সম্পর্কে আরও জানতে, এর ডকুমেন্টেশন দেখুন](https://docs.pydantic.dev/)।
-!!! Info
- [Pydantic সম্পর্কে আরও জানতে, এর ডকুমেন্টেশন দেখুন](https://docs.pydantic.dev/)।
+///
**FastAPI** মূলত Pydantic-এর উপর নির্মিত।
আপনি এই সমস্ত কিছুর অনেক বাস্তবসম্মত উদাহরণ পাবেন [টিউটোরিয়াল - ইউজার গাইডে](https://fastapi.tiangolo.com/tutorial/)।
-!!! Tip
- যখন আপনি `Optional` বা `Union[Something, None]` ব্যবহার করেন এবং কোনো ডিফল্ট মান না থাকে, Pydantic-এর একটি বিশেষ আচরণ রয়েছে, আপনি Pydantic ডকুমেন্টেশনে [Required Optional fields](https://docs.pydantic.dev/latest/concepts/models/#required-optional-fields) সম্পর্কে আরও পড়তে পারেন।
+/// tip
+
+যখন আপনি `Optional` বা `Union[Something, None]` ব্যবহার করেন এবং কোনো ডিফল্ট মান না থাকে, Pydantic-এর একটি বিশেষ আচরণ রয়েছে, আপনি Pydantic ডকুমেন্টেশনে [Required Optional fields](https://docs.pydantic.dev/latest/concepts/models/#required-optional-fields) সম্পর্কে আরও পড়তে পারেন।
+
+///
## মেটাডাটা অ্যানোটেশন সহ টাইপ হিন্টস
Python-এ এমন একটি ফিচার আছে যা `Annotated` ব্যবহার করে এই টাইপ হিন্টগুলিতে **অতিরিক্ত মেটাডাটা** রাখতে দেয়।
-=== "Python 3.9+"
+//// tab | Python 3.9+
+
+Python 3.9-এ, `Annotated` স্ট্যান্ডার্ড লাইব্রেরিতে অন্তর্ভুক্ত, তাই আপনি এটি `typing` থেকে ইমপোর্ট করতে পারেন।
+
+```Python hl_lines="1 4"
+{!> ../../../docs_src/python_types/tutorial013_py39.py!}
+```
- Python 3.9-এ, `Annotated` স্ট্যান্ডার্ড লাইব্রেরিতে অন্তর্ভুক্ত, তাই আপনি এটি `typing` থেকে ইমপোর্ট করতে পারেন।
+////
- ```Python hl_lines="1 4"
- {!> ../../../docs_src/python_types/tutorial013_py39.py!}
- ```
+//// tab | Python 3.8+
-=== "Python 3.8+"
+Python 3.9-এর নীচের সংস্করণগুলিতে, আপনি `Annotated`-কে `typing_extensions` থেকে ইমপোর্ট করেন।
- Python 3.9-এর নীচের সংস্করণগুলিতে, আপনি `Annotated`-কে `typing_extensions` থেকে ইমপোর্ট করেন।
+এটি **FastAPI** এর সাথে ইতিমদ্ধে ইনস্টল হয়ে থাকবে।
- এটি **FastAPI** এর সাথে ইতিমদ্ধে ইনস্টল হয়ে থাকবে।
+```Python hl_lines="1 4"
+{!> ../../../docs_src/python_types/tutorial013.py!}
+```
- ```Python hl_lines="1 4"
- {!> ../../../docs_src/python_types/tutorial013.py!}
- ```
+////
Python নিজে এই `Annotated` দিয়ে কিছুই করে না। এবং এডিটর এবং অন্যান্য টুলগুলির জন্য, টাইপটি এখনও `str`।
@@ -506,10 +559,13 @@ Python নিজে এই `Annotated` দিয়ে কিছুই করে
পরবর্তীতে আপনি দেখবেন এটি কতটা **শক্তিশালী** হতে পারে।
-!!! Tip
- এটি **স্ট্যান্ডার্ড Python** হওয়ার মানে হল আপনি আপনার এডিটরে, আপনি যে টুলগুলি কোড বিশ্লেষণ এবং রিফ্যাক্টর করার জন্য ব্যবহার করেন তাতে **সেরা সম্ভাব্য ডেভেলপার এক্সপেরিয়েন্স** পাবেন। ✨
+/// tip
- এবং এছাড়াও আপনার কোড অন্যান্য অনেক Python টুল এবং লাইব্রেরিগুলির সাথে খুব সামঞ্জস্যপূর্ণ হবে। 🚀
+এটি **স্ট্যান্ডার্ড Python** হওয়ার মানে হল আপনি আপনার এডিটরে, আপনি যে টুলগুলি কোড বিশ্লেষণ এবং রিফ্যাক্টর করার জন্য ব্যবহার করেন তাতে **সেরা সম্ভাব্য ডেভেলপার এক্সপেরিয়েন্স** পাবেন। ✨
+
+এবং এছাড়াও আপনার কোড অন্যান্য অনেক Python টুল এবং লাইব্রেরিগুলির সাথে খুব সামঞ্জস্যপূর্ণ হবে। 🚀
+
+///
## **FastAPI**-এ টাইপ হিন্টস
@@ -533,5 +589,8 @@ Python নিজে এই `Annotated` দিয়ে কিছুই করে
গুরুত্বপূর্ণ বিষয় হল, আপনি যদি স্ট্যান্ডার্ড Python টাইপগুলি ব্যবহার করেন, তবে আরও বেশি ক্লাস, ডেকোরেটর ইত্যাদি যোগ না করেই একই স্থানে **FastAPI** আপনার অনেক কাজ করে দিবে।
-!!! Info
- যদি আপনি টিউটোরিয়ালের সমস্ত বিষয় পড়ে ফেলে থাকেন এবং টাইপ সম্পর্কে আরও জানতে চান, তবে একটি ভালো রিসোর্স হল [mypy এর "cheat sheet"](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html)। এই "cheat sheet" এ আপনি Python টাইপ হিন্ট সম্পর্কে বেসিক থেকে উন্নত লেভেলের ধারণা পেতে পারেন, যা আপনার কোডে টাইপ সেফটি এবং স্পষ্টতা বাড়াতে সাহায্য করবে।
+/// info
+
+যদি আপনি টিউটোরিয়ালের সমস্ত বিষয় পড়ে ফেলে থাকেন এবং টাইপ সম্পর্কে আরও জানতে চান, তবে একটি ভালো রিসোর্স হল [mypy এর "cheat sheet"](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html)। এই "cheat sheet" এ আপনি Python টাইপ হিন্ট সম্পর্কে বেসিক থেকে উন্নত লেভেলের ধারণা পেতে পারেন, যা আপনার কোডে টাইপ সেফটি এবং স্পষ্টতা বাড়াতে সাহায্য করবে।
+
+///
diff --git a/docs/de/docs/advanced/additional-responses.md b/docs/de/docs/advanced/additional-responses.md
index 2bfcfab33..6f2c4b2dd 100644
--- a/docs/de/docs/advanced/additional-responses.md
+++ b/docs/de/docs/advanced/additional-responses.md
@@ -1,9 +1,12 @@
# Zusätzliche Responses in OpenAPI
-!!! warning "Achtung"
- Dies ist ein eher fortgeschrittenes Thema.
+/// warning | "Achtung"
- Wenn Sie mit **FastAPI** beginnen, benötigen Sie dies möglicherweise nicht.
+Dies ist ein eher fortgeschrittenes Thema.
+
+Wenn Sie mit **FastAPI** beginnen, benötigen Sie dies möglicherweise nicht.
+
+///
Sie können zusätzliche Responses mit zusätzlichen Statuscodes, Medientypen, Beschreibungen, usw. deklarieren.
@@ -27,20 +30,26 @@ Um beispielsweise eine weitere Response mit dem Statuscode `404` und einem Pydan
{!../../../docs_src/additional_responses/tutorial001.py!}
```
-!!! note "Hinweis"
- Beachten Sie, dass Sie die `JSONResponse` direkt zurückgeben müssen.
+/// note | "Hinweis"
+
+Beachten Sie, dass Sie die `JSONResponse` direkt zurückgeben müssen.
+
+///
+
+/// info
-!!! info
- Der `model`-Schlüssel ist nicht Teil von OpenAPI.
+Der `model`-Schlüssel ist nicht Teil von OpenAPI.
- **FastAPI** nimmt das Pydantic-Modell von dort, generiert das JSON-Schema und fügt es an der richtigen Stelle ein.
+**FastAPI** nimmt das Pydantic-Modell von dort, generiert das JSON-Schema und fügt es an der richtigen Stelle ein.
- Die richtige Stelle ist:
+Die richtige Stelle ist:
- * Im Schlüssel `content`, der als Wert ein weiteres JSON-Objekt (`dict`) hat, welches Folgendes enthält:
- * Ein Schlüssel mit dem Medientyp, z. B. `application/json`, der als Wert ein weiteres JSON-Objekt hat, welches Folgendes enthält:
- * Ein Schlüssel `schema`, der als Wert das JSON-Schema aus dem Modell hat, hier ist die richtige Stelle.
- * **FastAPI** fügt hier eine Referenz auf die globalen JSON-Schemas an einer anderen Stelle in Ihrer OpenAPI hinzu, anstatt es direkt einzubinden. Auf diese Weise können andere Anwendungen und Clients diese JSON-Schemas direkt verwenden, bessere Tools zur Codegenerierung bereitstellen, usw.
+* Im Schlüssel `content`, der als Wert ein weiteres JSON-Objekt (`dict`) hat, welches Folgendes enthält:
+ * Ein Schlüssel mit dem Medientyp, z. B. `application/json`, der als Wert ein weiteres JSON-Objekt hat, welches Folgendes enthält:
+ * Ein Schlüssel `schema`, der als Wert das JSON-Schema aus dem Modell hat, hier ist die richtige Stelle.
+ * **FastAPI** fügt hier eine Referenz auf die globalen JSON-Schemas an einer anderen Stelle in Ihrer OpenAPI hinzu, anstatt es direkt einzubinden. Auf diese Weise können andere Anwendungen und Clients diese JSON-Schemas direkt verwenden, bessere Tools zur Codegenerierung bereitstellen, usw.
+
+///
Die generierten Responses in der OpenAPI für diese *Pfadoperation* lauten:
@@ -172,13 +181,19 @@ Sie können beispielsweise einen zusätzlichen Medientyp `image/png` hinzufügen
{!../../../docs_src/additional_responses/tutorial002.py!}
```
-!!! note "Hinweis"
- Beachten Sie, dass Sie das Bild direkt mit einer `FileResponse` zurückgeben müssen.
+/// note | "Hinweis"
+
+Beachten Sie, dass Sie das Bild direkt mit einer `FileResponse` zurückgeben müssen.
+
+///
+
+/// info
+
+Sofern Sie in Ihrem Parameter `responses` nicht explizit einen anderen Medientyp angeben, geht FastAPI davon aus, dass die Response denselben Medientyp wie die Haupt-Response-Klasse hat (Standardmäßig `application/json`).
-!!! info
- Sofern Sie in Ihrem Parameter `responses` nicht explizit einen anderen Medientyp angeben, geht FastAPI davon aus, dass die Response denselben Medientyp wie die Haupt-Response-Klasse hat (Standardmäßig `application/json`).
+Wenn Sie jedoch eine benutzerdefinierte Response-Klasse mit `None` als Medientyp angegeben haben, verwendet FastAPI `application/json` für jede zusätzliche Response, die über ein zugehöriges Modell verfügt.
- Wenn Sie jedoch eine benutzerdefinierte Response-Klasse mit `None` als Medientyp angegeben haben, verwendet FastAPI `application/json` für jede zusätzliche Response, die über ein zugehöriges Modell verfügt.
+///
## Informationen kombinieren
diff --git a/docs/de/docs/advanced/additional-status-codes.md b/docs/de/docs/advanced/additional-status-codes.md
index e9de267cf..672efee51 100644
--- a/docs/de/docs/advanced/additional-status-codes.md
+++ b/docs/de/docs/advanced/additional-status-codes.md
@@ -14,53 +14,75 @@ Sie möchten aber auch, dass sie neue Artikel akzeptiert. Und wenn die Elemente
Um dies zu erreichen, importieren Sie `JSONResponse`, und geben Sie Ihren Inhalt direkt zurück, indem Sie den gewünschten `status_code` setzen:
-=== "Python 3.10+"
+//// tab | Python 3.10+
- ```Python hl_lines="4 25"
- {!> ../../../docs_src/additional_status_codes/tutorial001_an_py310.py!}
- ```
+```Python hl_lines="4 25"
+{!> ../../../docs_src/additional_status_codes/tutorial001_an_py310.py!}
+```
-=== "Python 3.9+"
+////
- ```Python hl_lines="4 25"
- {!> ../../../docs_src/additional_status_codes/tutorial001_an_py39.py!}
- ```
+//// tab | Python 3.9+
-=== "Python 3.8+"
+```Python hl_lines="4 25"
+{!> ../../../docs_src/additional_status_codes/tutorial001_an_py39.py!}
+```
- ```Python hl_lines="4 26"
- {!> ../../../docs_src/additional_status_codes/tutorial001_an.py!}
- ```
+////
-=== "Python 3.10+ nicht annotiert"
+//// tab | Python 3.8+
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+```Python hl_lines="4 26"
+{!> ../../../docs_src/additional_status_codes/tutorial001_an.py!}
+```
- ```Python hl_lines="2 23"
- {!> ../../../docs_src/additional_status_codes/tutorial001_py310.py!}
- ```
+////
-=== "Python 3.8+ nicht annotiert"
+//// tab | Python 3.10+ nicht annotiert
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+/// tip | "Tipp"
- ```Python hl_lines="4 25"
- {!> ../../../docs_src/additional_status_codes/tutorial001.py!}
- ```
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
-!!! warning "Achtung"
- Wenn Sie eine `Response` direkt zurückgeben, wie im obigen Beispiel, wird sie direkt zurückgegeben.
+///
- Sie wird nicht mit einem Modell usw. serialisiert.
+```Python hl_lines="2 23"
+{!> ../../../docs_src/additional_status_codes/tutorial001_py310.py!}
+```
- Stellen Sie sicher, dass sie die gewünschten Daten enthält und dass die Werte gültiges JSON sind (wenn Sie `JSONResponse` verwenden).
+////
-!!! note "Technische Details"
- Sie können auch `from starlette.responses import JSONResponse` verwenden.
+//// tab | Python 3.8+ nicht annotiert
- **FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette. Das Gleiche gilt für `status`.
+/// tip | "Tipp"
+
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
+
+///
+
+```Python hl_lines="4 25"
+{!> ../../../docs_src/additional_status_codes/tutorial001.py!}
+```
+
+////
+
+/// warning | "Achtung"
+
+Wenn Sie eine `Response` direkt zurückgeben, wie im obigen Beispiel, wird sie direkt zurückgegeben.
+
+Sie wird nicht mit einem Modell usw. serialisiert.
+
+Stellen Sie sicher, dass sie die gewünschten Daten enthält und dass die Werte gültiges JSON sind (wenn Sie `JSONResponse` verwenden).
+
+///
+
+/// note | "Technische Details"
+
+Sie können auch `from starlette.responses import JSONResponse` verwenden.
+
+**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette. Das Gleiche gilt für `status`.
+
+///
## OpenAPI- und API-Dokumentation
diff --git a/docs/de/docs/advanced/advanced-dependencies.md b/docs/de/docs/advanced/advanced-dependencies.md
index 33b93b332..f29970872 100644
--- a/docs/de/docs/advanced/advanced-dependencies.md
+++ b/docs/de/docs/advanced/advanced-dependencies.md
@@ -18,26 +18,35 @@ Nicht die Klasse selbst (die bereits aufrufbar ist), sondern eine Instanz dieser
Dazu deklarieren wir eine Methode `__call__`:
-=== "Python 3.9+"
+//// tab | Python 3.9+
- ```Python hl_lines="12"
- {!> ../../../docs_src/dependencies/tutorial011_an_py39.py!}
- ```
+```Python hl_lines="12"
+{!> ../../../docs_src/dependencies/tutorial011_an_py39.py!}
+```
+
+////
+
+//// tab | Python 3.8+
+
+```Python hl_lines="11"
+{!> ../../../docs_src/dependencies/tutorial011_an.py!}
+```
-=== "Python 3.8+"
+////
- ```Python hl_lines="11"
- {!> ../../../docs_src/dependencies/tutorial011_an.py!}
- ```
+//// tab | Python 3.8+ nicht annotiert
-=== "Python 3.8+ nicht annotiert"
+/// tip | "Tipp"
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
- ```Python hl_lines="10"
- {!> ../../../docs_src/dependencies/tutorial011.py!}
- ```
+///
+
+```Python hl_lines="10"
+{!> ../../../docs_src/dependencies/tutorial011.py!}
+```
+
+////
In diesem Fall ist dieses `__call__` das, was **FastAPI** verwendet, um nach zusätzlichen Parametern und Unterabhängigkeiten zu suchen, und das ist es auch, was später aufgerufen wird, um einen Wert an den Parameter in Ihrer *Pfadoperation-Funktion* zu übergeben.
@@ -45,26 +54,35 @@ In diesem Fall ist dieses `__call__` das, was **FastAPI** verwendet, um nach zus
Und jetzt können wir `__init__` verwenden, um die Parameter der Instanz zu deklarieren, die wir zum `Parametrisieren` der Abhängigkeit verwenden können:
-=== "Python 3.9+"
+//// tab | Python 3.9+
- ```Python hl_lines="9"
- {!> ../../../docs_src/dependencies/tutorial011_an_py39.py!}
- ```
+```Python hl_lines="9"
+{!> ../../../docs_src/dependencies/tutorial011_an_py39.py!}
+```
-=== "Python 3.8+"
+////
- ```Python hl_lines="8"
- {!> ../../../docs_src/dependencies/tutorial011_an.py!}
- ```
+//// tab | Python 3.8+
-=== "Python 3.8+ nicht annotiert"
+```Python hl_lines="8"
+{!> ../../../docs_src/dependencies/tutorial011_an.py!}
+```
+
+////
+
+//// tab | Python 3.8+ nicht annotiert
+
+/// tip | "Tipp"
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
- ```Python hl_lines="7"
- {!> ../../../docs_src/dependencies/tutorial011.py!}
- ```
+///
+
+```Python hl_lines="7"
+{!> ../../../docs_src/dependencies/tutorial011.py!}
+```
+
+////
In diesem Fall wird **FastAPI** `__init__` nie berühren oder sich darum kümmern, wir werden es direkt in unserem Code verwenden.
@@ -72,26 +90,35 @@ In diesem Fall wird **FastAPI** `__init__` nie berühren oder sich darum kümmer
Wir könnten eine Instanz dieser Klasse erstellen mit:
-=== "Python 3.9+"
+//// tab | Python 3.9+
+
+```Python hl_lines="18"
+{!> ../../../docs_src/dependencies/tutorial011_an_py39.py!}
+```
+
+////
- ```Python hl_lines="18"
- {!> ../../../docs_src/dependencies/tutorial011_an_py39.py!}
- ```
+//// tab | Python 3.8+
-=== "Python 3.8+"
+```Python hl_lines="17"
+{!> ../../../docs_src/dependencies/tutorial011_an.py!}
+```
- ```Python hl_lines="17"
- {!> ../../../docs_src/dependencies/tutorial011_an.py!}
- ```
+////
-=== "Python 3.8+ nicht annotiert"
+//// tab | Python 3.8+ nicht annotiert
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+/// tip | "Tipp"
- ```Python hl_lines="16"
- {!> ../../../docs_src/dependencies/tutorial011.py!}
- ```
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
+
+///
+
+```Python hl_lines="16"
+{!> ../../../docs_src/dependencies/tutorial011.py!}
+```
+
+////
Und auf diese Weise können wir unsere Abhängigkeit „parametrisieren“, die jetzt `"bar"` enthält, als das Attribut `checker.fixed_content`.
@@ -107,32 +134,44 @@ checker(q="somequery")
... und übergibt, was immer das als Wert dieser Abhängigkeit in unserer *Pfadoperation-Funktion* zurückgibt, als den Parameter `fixed_content_included`:
-=== "Python 3.9+"
+//// tab | Python 3.9+
+
+```Python hl_lines="22"
+{!> ../../../docs_src/dependencies/tutorial011_an_py39.py!}
+```
- ```Python hl_lines="22"
- {!> ../../../docs_src/dependencies/tutorial011_an_py39.py!}
- ```
+////
-=== "Python 3.8+"
+//// tab | Python 3.8+
- ```Python hl_lines="21"
- {!> ../../../docs_src/dependencies/tutorial011_an.py!}
- ```
+```Python hl_lines="21"
+{!> ../../../docs_src/dependencies/tutorial011_an.py!}
+```
+
+////
+
+//// tab | Python 3.8+ nicht annotiert
+
+/// tip | "Tipp"
+
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
+
+///
+
+```Python hl_lines="20"
+{!> ../../../docs_src/dependencies/tutorial011.py!}
+```
-=== "Python 3.8+ nicht annotiert"
+////
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+/// tip | "Tipp"
- ```Python hl_lines="20"
- {!> ../../../docs_src/dependencies/tutorial011.py!}
- ```
+Das alles mag gekünstelt wirken. Und es ist möglicherweise noch nicht ganz klar, welchen Nutzen das hat.
-!!! tip "Tipp"
- Das alles mag gekünstelt wirken. Und es ist möglicherweise noch nicht ganz klar, welchen Nutzen das hat.
+Diese Beispiele sind bewusst einfach gehalten, zeigen aber, wie alles funktioniert.
- Diese Beispiele sind bewusst einfach gehalten, zeigen aber, wie alles funktioniert.
+In den Kapiteln zum Thema Sicherheit gibt es Hilfsfunktionen, die auf die gleiche Weise implementiert werden.
- In den Kapiteln zum Thema Sicherheit gibt es Hilfsfunktionen, die auf die gleiche Weise implementiert werden.
+Wenn Sie das hier alles verstanden haben, wissen Sie bereits, wie diese Sicherheits-Hilfswerkzeuge unter der Haube funktionieren.
- Wenn Sie das hier alles verstanden haben, wissen Sie bereits, wie diese Sicherheits-Hilfswerkzeuge unter der Haube funktionieren.
+///
diff --git a/docs/de/docs/advanced/async-tests.md b/docs/de/docs/advanced/async-tests.md
index 2e2c22210..9f0bd4aa2 100644
--- a/docs/de/docs/advanced/async-tests.md
+++ b/docs/de/docs/advanced/async-tests.md
@@ -64,8 +64,11 @@ Der Marker `@pytest.mark.anyio` teilt pytest mit, dass diese Testfunktion asynch
{!../../../docs_src/async_tests/test_main.py!}
```
-!!! tip "Tipp"
- Beachten Sie, dass die Testfunktion jetzt `async def` ist und nicht nur `def` wie zuvor, wenn Sie den `TestClient` verwenden.
+/// tip | "Tipp"
+
+Beachten Sie, dass die Testfunktion jetzt `async def` ist und nicht nur `def` wie zuvor, wenn Sie den `TestClient` verwenden.
+
+///
Dann können wir einen `AsyncClient` mit der App erstellen und mit `await` asynchrone Requests an ihn senden.
@@ -81,15 +84,24 @@ response = client.get('/')
... welches wir verwendet haben, um unsere Requests mit dem `TestClient` zu machen.
-!!! tip "Tipp"
- Beachten Sie, dass wir async/await mit dem neuen `AsyncClient` verwenden – der Request ist asynchron.
+/// tip | "Tipp"
+
+Beachten Sie, dass wir async/await mit dem neuen `AsyncClient` verwenden – der Request ist asynchron.
+
+///
-!!! warning "Achtung"
- Falls Ihre Anwendung auf Lifespan-Events angewiesen ist, der `AsyncClient` löst diese Events nicht aus. Um sicherzustellen, dass sie ausgelöst werden, verwenden Sie `LifespanManager` von
florimondmanca/asgi-lifespan.
+/// warning | "Achtung"
+
+Falls Ihre Anwendung auf Lifespan-Events angewiesen ist, der `AsyncClient` löst diese Events nicht aus. Um sicherzustellen, dass sie ausgelöst werden, verwenden Sie `LifespanManager` von
florimondmanca/asgi-lifespan.
+
+///
## Andere asynchrone Funktionsaufrufe
Da die Testfunktion jetzt asynchron ist, können Sie in Ihren Tests neben dem Senden von Requests an Ihre FastAPI-Anwendung jetzt auch andere `async`hrone Funktionen aufrufen (und `await`en), genau so, wie Sie diese an anderer Stelle in Ihrem Code aufrufen würden.
-!!! tip "Tipp"
- Wenn Sie einen `RuntimeError: Task attached to a different loop` erhalten, wenn Sie asynchrone Funktionsaufrufe in Ihre Tests integrieren (z. B. bei Verwendung von
MongoDBs MotorClient), dann denken Sie daran, Objekte zu instanziieren, die einen Event Loop nur innerhalb asynchroner Funktionen benötigen, z. B. einen `@app.on_event("startup")`-Callback.
+/// tip | "Tipp"
+
+Wenn Sie einen `RuntimeError: Task attached to a different loop` erhalten, wenn Sie asynchrone Funktionsaufrufe in Ihre Tests integrieren (z. B. bei Verwendung von
MongoDBs MotorClient), dann denken Sie daran, Objekte zu instanziieren, die einen Event Loop nur innerhalb asynchroner Funktionen benötigen, z. B. einen `@app.on_event("startup")`-Callback.
+
+///
diff --git a/docs/de/docs/advanced/behind-a-proxy.md b/docs/de/docs/advanced/behind-a-proxy.md
index ad0a92e28..18f90ebde 100644
--- a/docs/de/docs/advanced/behind-a-proxy.md
+++ b/docs/de/docs/advanced/behind-a-proxy.md
@@ -43,8 +43,11 @@ browser --> proxy
proxy --> server
```
-!!! tip "Tipp"
- Die IP `0.0.0.0` wird üblicherweise verwendet, um anzudeuten, dass das Programm alle auf diesem Computer/Server verfügbaren IPs abhört.
+/// tip | "Tipp"
+
+Die IP `0.0.0.0` wird üblicherweise verwendet, um anzudeuten, dass das Programm alle auf diesem Computer/Server verfügbaren IPs abhört.
+
+///
Die Benutzeroberfläche der Dokumentation würde benötigen, dass das OpenAPI-Schema deklariert, dass sich dieser API-`server` unter `/api/v1` (hinter dem Proxy) befindet. Zum Beispiel:
@@ -81,10 +84,13 @@ $ uvicorn main:app --root-path /api/v1
Falls Sie Hypercorn verwenden, das hat auch die Option `--root-path`.
-!!! note "Technische Details"
- Die ASGI-Spezifikation definiert einen `root_path` für diesen Anwendungsfall.
+/// note | "Technische Details"
+
+Die ASGI-Spezifikation definiert einen `root_path` für diesen Anwendungsfall.
+
+Und die Kommandozeilenoption `--root-path` stellt diesen `root_path` bereit.
- Und die Kommandozeilenoption `--root-path` stellt diesen `root_path` bereit.
+///
### Überprüfen des aktuellen `root_path`
@@ -172,8 +178,11 @@ Dann erstellen Sie eine Datei `traefik.toml` mit:
Dadurch wird Traefik angewiesen, Port 9999 abzuhören und eine andere Datei `routes.toml` zu verwenden.
-!!! tip "Tipp"
- Wir verwenden Port 9999 anstelle des Standard-HTTP-Ports 80, damit Sie ihn nicht mit Administratorrechten (`sudo`) ausführen müssen.
+/// tip | "Tipp"
+
+Wir verwenden Port 9999 anstelle des Standard-HTTP-Ports 80, damit Sie ihn nicht mit Administratorrechten (`sudo`) ausführen müssen.
+
+///
Erstellen Sie nun die andere Datei `routes.toml`:
@@ -239,8 +248,11 @@ Wenn Sie nun zur URL mit dem Port für Uvicorn gehen:
http://127.0.0.1:9999/api/v1/app.
@@ -283,8 +295,11 @@ Dies liegt daran, dass FastAPI diesen `root_path` verwendet, um den Default-`ser
## Zusätzliche Server
-!!! warning "Achtung"
- Dies ist ein fortgeschrittener Anwendungsfall. Überspringen Sie das gerne.
+/// warning | "Achtung"
+
+Dies ist ein fortgeschrittener Anwendungsfall. Überspringen Sie das gerne.
+
+///
Standardmäßig erstellt **FastAPI** einen `server` im OpenAPI-Schema mit der URL für den `root_path`.
@@ -323,15 +338,21 @@ Erzeugt ein OpenAPI-Schema, wie:
}
```
-!!! tip "Tipp"
- Beachten Sie den automatisch generierten Server mit dem `URL`-Wert `/api/v1`, welcher vom `root_path` stammt.
+/// tip | "Tipp"
+
+Beachten Sie den automatisch generierten Server mit dem `URL`-Wert `/api/v1`, welcher vom `root_path` stammt.
+
+///
In der Dokumentationsoberfläche unter
http://127.0.0.1:9999/api/v1/docs würde es so aussehen:

-!!! tip "Tipp"
- Die Dokumentationsoberfläche interagiert mit dem von Ihnen ausgewählten Server.
+/// tip | "Tipp"
+
+Die Dokumentationsoberfläche interagiert mit dem von Ihnen ausgewählten Server.
+
+///
### Den automatischen Server von `root_path` deaktivieren
diff --git a/docs/de/docs/advanced/custom-response.md b/docs/de/docs/advanced/custom-response.md
index 68c037ad7..20d6a039a 100644
--- a/docs/de/docs/advanced/custom-response.md
+++ b/docs/de/docs/advanced/custom-response.md
@@ -12,8 +12,11 @@ Der Inhalt, den Sie von Ihrer *Pfadoperation-Funktion* zurückgeben, wird in die
Und wenn diese `Response` einen JSON-Medientyp (`application/json`) hat, wie es bei `JSONResponse` und `UJSONResponse` der Fall ist, werden die von Ihnen zurückgegebenen Daten automatisch mit jedem Pydantic `response_model` konvertiert (und gefiltert), das Sie im *Pfadoperation-Dekorator* deklariert haben.
-!!! note "Hinweis"
- Wenn Sie eine Response-Klasse ohne Medientyp verwenden, erwartet FastAPI, dass Ihre Response keinen Inhalt hat, und dokumentiert daher das Format der Response nicht in deren generierter OpenAPI-Dokumentation.
+/// note | "Hinweis"
+
+Wenn Sie eine Response-Klasse ohne Medientyp verwenden, erwartet FastAPI, dass Ihre Response keinen Inhalt hat, und dokumentiert daher das Format der Response nicht in deren generierter OpenAPI-Dokumentation.
+
+///
## `ORJSONResponse` verwenden
@@ -31,15 +34,21 @@ Wenn Sie jedoch sicher sind, dass der von Ihnen zurückgegebene Inhalt **mit JSO
{!../../../docs_src/custom_response/tutorial001b.py!}
```
-!!! info
- Der Parameter `response_class` wird auch verwendet, um den „Medientyp“ der Response zu definieren.
+/// info
+
+Der Parameter `response_class` wird auch verwendet, um den „Medientyp“ der Response zu definieren.
+
+In diesem Fall wird der HTTP-Header `Content-Type` auf `application/json` gesetzt.
+
+Und er wird als solcher in OpenAPI dokumentiert.
+
+///
- In diesem Fall wird der HTTP-Header `Content-Type` auf `application/json` gesetzt.
+/// tip | "Tipp"
- Und er wird als solcher in OpenAPI dokumentiert.
+Die `ORJSONResponse` ist derzeit nur in FastAPI verfügbar, nicht in Starlette.
-!!! tip "Tipp"
- Die `ORJSONResponse` ist derzeit nur in FastAPI verfügbar, nicht in Starlette.
+///
## HTML-Response
@@ -52,12 +61,15 @@ Um eine Response mit HTML direkt von **FastAPI** zurückzugeben, verwenden Sie `
{!../../../docs_src/custom_response/tutorial002.py!}
```
-!!! info
- Der Parameter `response_class` wird auch verwendet, um den „Medientyp“ der Response zu definieren.
+/// info
- In diesem Fall wird der HTTP-Header `Content-Type` auf `text/html` gesetzt.
+Der Parameter `response_class` wird auch verwendet, um den „Medientyp“ der Response zu definieren.
- Und er wird als solcher in OpenAPI dokumentiert.
+In diesem Fall wird der HTTP-Header `Content-Type` auf `text/html` gesetzt.
+
+Und er wird als solcher in OpenAPI dokumentiert.
+
+///
### Eine `Response` zurückgeben
@@ -69,11 +81,17 @@ Das gleiche Beispiel von oben, das eine `HTMLResponse` zurückgibt, könnte so a
{!../../../docs_src/custom_response/tutorial003.py!}
```
-!!! warning "Achtung"
- Eine `Response`, die direkt von Ihrer *Pfadoperation-Funktion* zurückgegeben wird, wird in OpenAPI nicht dokumentiert (zum Beispiel wird der `Content-Type` nicht dokumentiert) und ist in der automatischen interaktiven Dokumentation nicht sichtbar.
+/// warning | "Achtung"
+
+Eine `Response`, die direkt von Ihrer *Pfadoperation-Funktion* zurückgegeben wird, wird in OpenAPI nicht dokumentiert (zum Beispiel wird der `Content-Type` nicht dokumentiert) und ist in der automatischen interaktiven Dokumentation nicht sichtbar.
+
+///
+
+/// info
-!!! info
- Natürlich stammen der eigentliche `Content-Type`-Header, der Statuscode, usw., aus dem `Response`-Objekt, das Sie zurückgegeben haben.
+Natürlich stammen der eigentliche `Content-Type`-Header, der Statuscode, usw., aus dem `Response`-Objekt, das Sie zurückgegeben haben.
+
+///
### In OpenAPI dokumentieren und `Response` überschreiben
@@ -103,10 +121,13 @@ Hier sind einige der verfügbaren Responses.
Bedenken Sie, dass Sie `Response` verwenden können, um alles andere zurückzugeben, oder sogar eine benutzerdefinierte Unterklasse zu erstellen.
-!!! note "Technische Details"
- Sie können auch `from starlette.responses import HTMLResponse` verwenden.
+/// note | "Technische Details"
+
+Sie können auch `from starlette.responses import HTMLResponse` verwenden.
+
+**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette.
- **FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette.
+///
### `Response`
@@ -153,15 +174,21 @@ Eine schnelle alternative JSON-Response mit
`ujson`.
-!!! warning "Achtung"
- `ujson` ist bei der Behandlung einiger Sonderfälle weniger sorgfältig als Pythons eingebaute Implementierung.
+/// warning | "Achtung"
+
+`ujson` ist bei der Behandlung einiger Sonderfälle weniger sorgfältig als Pythons eingebaute Implementierung.
+
+///
```Python hl_lines="2 7"
{!../../../docs_src/custom_response/tutorial001.py!}
```
-!!! tip "Tipp"
- Möglicherweise ist `ORJSONResponse` eine schnellere Alternative.
+/// tip | "Tipp"
+
+Möglicherweise ist `ORJSONResponse` eine schnellere Alternative.
+
+///
### `RedirectResponse`
@@ -222,8 +249,11 @@ Das umfasst viele Bibliotheken zur Interaktion mit Cloud-Speicher, Videoverarbei
Auf diese Weise können wir das Ganze in einen `with`-Block einfügen und so sicherstellen, dass das dateiartige Objekt nach Abschluss geschlossen wird.
-!!! tip "Tipp"
- Beachten Sie, dass wir, da wir Standard-`open()` verwenden, welches `async` und `await` nicht unterstützt, hier die Pfadoperation mit normalen `def` deklarieren.
+/// tip | "Tipp"
+
+Beachten Sie, dass wir, da wir Standard-`open()` verwenden, welches `async` und `await` nicht unterstützt, hier die Pfadoperation mit normalen `def` deklarieren.
+
+///
### `FileResponse`
@@ -292,8 +322,11 @@ Im folgenden Beispiel verwendet **FastAPI** standardmäßig `ORJSONResponse` in
{!../../../docs_src/custom_response/tutorial010.py!}
```
-!!! tip "Tipp"
- Sie können dennoch weiterhin `response_class` in *Pfadoperationen* überschreiben, wie bisher.
+/// tip | "Tipp"
+
+Sie können dennoch weiterhin `response_class` in *Pfadoperationen* überschreiben, wie bisher.
+
+///
## Zusätzliche Dokumentation
diff --git a/docs/de/docs/advanced/dataclasses.md b/docs/de/docs/advanced/dataclasses.md
index c78a6d3dd..d5a663485 100644
--- a/docs/de/docs/advanced/dataclasses.md
+++ b/docs/de/docs/advanced/dataclasses.md
@@ -20,12 +20,15 @@ Und natürlich wird das gleiche unterstützt:
Das funktioniert genauso wie mit Pydantic-Modellen. Und tatsächlich wird es unter der Haube mittels Pydantic auf die gleiche Weise bewerkstelligt.
-!!! info
- Bedenken Sie, dass Datenklassen nicht alles können, was Pydantic-Modelle können.
+/// info
- Daher müssen Sie möglicherweise weiterhin Pydantic-Modelle verwenden.
+Bedenken Sie, dass Datenklassen nicht alles können, was Pydantic-Modelle können.
- Wenn Sie jedoch eine Menge Datenklassen herumliegen haben, ist dies ein guter Trick, um sie für eine Web-API mithilfe von FastAPI zu verwenden. 🤓
+Daher müssen Sie möglicherweise weiterhin Pydantic-Modelle verwenden.
+
+Wenn Sie jedoch eine Menge Datenklassen herumliegen haben, ist dies ein guter Trick, um sie für eine Web-API mithilfe von FastAPI zu verwenden. 🤓
+
+///
## Datenklassen als `response_model`
diff --git a/docs/de/docs/advanced/events.md b/docs/de/docs/advanced/events.md
index e29f61ab9..e898db49b 100644
--- a/docs/de/docs/advanced/events.md
+++ b/docs/de/docs/advanced/events.md
@@ -38,10 +38,13 @@ Hier simulieren wir das langsame *Hochfahren*, das Laden des Modells, indem wir
Und dann, direkt nach dem `yield`, entladen wir das Modell. Dieser Code wird unmittelbar vor dem *Herunterfahren* ausgeführt, **nachdem** die Anwendung **die Bearbeitung von Requests abgeschlossen hat**. Dadurch könnten beispielsweise Ressourcen wie Arbeitsspeicher oder eine GPU freigegeben werden.
-!!! tip "Tipp"
- Das *Herunterfahren* würde erfolgen, wenn Sie die Anwendung **stoppen**.
+/// tip | "Tipp"
- Möglicherweise müssen Sie eine neue Version starten, oder Sie haben es einfach satt, sie auszuführen. 🤷
+Das *Herunterfahren* würde erfolgen, wenn Sie die Anwendung **stoppen**.
+
+Möglicherweise müssen Sie eine neue Version starten, oder Sie haben es einfach satt, sie auszuführen. 🤷
+
+///
### Lifespan-Funktion
@@ -91,10 +94,13 @@ Der Parameter `lifespan` der `FastAPI`-App benötigt einen **asynchronen Kontext
## Alternative Events (deprecated)
-!!! warning "Achtung"
- Der empfohlene Weg, das *Hochfahren* und *Herunterfahren* zu handhaben, ist die Verwendung des `lifespan`-Parameters der `FastAPI`-App, wie oben beschrieben. Wenn Sie einen `lifespan`-Parameter übergeben, werden die `startup`- und `shutdown`-Eventhandler nicht mehr aufgerufen. Es ist entweder alles `lifespan` oder alles Events, nicht beides.
+/// warning | "Achtung"
+
+Der empfohlene Weg, das *Hochfahren* und *Herunterfahren* zu handhaben, ist die Verwendung des `lifespan`-Parameters der `FastAPI`-App, wie oben beschrieben. Wenn Sie einen `lifespan`-Parameter übergeben, werden die `startup`- und `shutdown`-Eventhandler nicht mehr aufgerufen. Es ist entweder alles `lifespan` oder alles Events, nicht beides.
- Sie können diesen Teil wahrscheinlich überspringen.
+Sie können diesen Teil wahrscheinlich überspringen.
+
+///
Es gibt eine alternative Möglichkeit, diese Logik zu definieren, sodass sie beim *Hochfahren* und beim *Herunterfahren* ausgeführt wird.
@@ -126,17 +132,23 @@ Um eine Funktion hinzuzufügen, die beim Herunterfahren der Anwendung ausgeführ
Hier schreibt die `shutdown`-Eventhandler-Funktion eine Textzeile `"Application shutdown"` in eine Datei `log.txt`.
-!!! info
- In der Funktion `open()` bedeutet `mode="a"` „append“ („anhängen“), sodass die Zeile nach dem, was sich in dieser Datei befindet, hinzugefügt wird, ohne den vorherigen Inhalt zu überschreiben.
+/// info
+
+In der Funktion `open()` bedeutet `mode="a"` „append“ („anhängen“), sodass die Zeile nach dem, was sich in dieser Datei befindet, hinzugefügt wird, ohne den vorherigen Inhalt zu überschreiben.
-!!! tip "Tipp"
- Beachten Sie, dass wir in diesem Fall eine Standard-Python-Funktion `open()` verwenden, die mit einer Datei interagiert.
+///
- Es handelt sich also um I/O (Input/Output), welches „Warten“ erfordert, bis Dinge auf die Festplatte geschrieben werden.
+/// tip | "Tipp"
- Aber `open()` verwendet nicht `async` und `await`.
+Beachten Sie, dass wir in diesem Fall eine Standard-Python-Funktion `open()` verwenden, die mit einer Datei interagiert.
- Daher deklarieren wir die Eventhandler-Funktion mit Standard-`def` statt mit `async def`.
+Es handelt sich also um I/O (Input/Output), welches „Warten“ erfordert, bis Dinge auf die Festplatte geschrieben werden.
+
+Aber `open()` verwendet nicht `async` und `await`.
+
+Daher deklarieren wir die Eventhandler-Funktion mit Standard-`def` statt mit `async def`.
+
+///
### `startup` und `shutdown` zusammen
@@ -152,10 +164,13 @@ Nur ein technisches Detail für die neugierigen Nerds. 🤓
In der technischen ASGI-Spezifikation ist dies Teil des
Lifespan Protokolls und definiert Events namens `startup` und `shutdown`.
-!!! info
- Weitere Informationen zu Starlettes `lifespan`-Handlern finden Sie in
Starlettes Lifespan-Dokumentation.
+/// info
+
+Weitere Informationen zu Starlettes `lifespan`-Handlern finden Sie in
Starlettes Lifespan-Dokumentation.
+
+Einschließlich, wie man Lifespan-Zustand handhabt, der in anderen Bereichen Ihres Codes verwendet werden kann.
- Einschließlich, wie man Lifespan-Zustand handhabt, der in anderen Bereichen Ihres Codes verwendet werden kann.
+///
## Unteranwendungen
diff --git a/docs/de/docs/advanced/generate-clients.md b/docs/de/docs/advanced/generate-clients.md
index 7d1d69353..b8d66fdd7 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. 🤓
@@ -28,17 +28,21 @@ Es gibt auch mehrere andere Unternehmen, welche ähnliche Dienste anbieten und d
Beginnen wir mit einer einfachen FastAPI-Anwendung:
-=== "Python 3.9+"
+//// tab | Python 3.9+
- ```Python hl_lines="7-9 12-13 16-17 21"
- {!> ../../../docs_src/generate_clients/tutorial001_py39.py!}
- ```
+```Python hl_lines="7-9 12-13 16-17 21"
+{!> ../../../docs_src/generate_clients/tutorial001_py39.py!}
+```
+
+////
-=== "Python 3.8+"
+//// tab | Python 3.8+
- ```Python hl_lines="9-11 14-15 18 19 23"
- {!> ../../../docs_src/generate_clients/tutorial001.py!}
- ```
+```Python hl_lines="9-11 14-15 18 19 23"
+{!> ../../../docs_src/generate_clients/tutorial001.py!}
+```
+
+////
Beachten Sie, dass die *Pfadoperationen* die Modelle definieren, welche diese für die Request- und Response-
Payload verwenden, indem sie die Modelle `Item` und `ResponseMessage` verwenden.
@@ -123,8 +127,11 @@ Sie erhalten außerdem automatische Vervollständigung für die zu sendende Payl

-!!! tip "Tipp"
- Beachten Sie die automatische Vervollständigung für `name` und `price`, welche in der FastAPI-Anwendung im `Item`-Modell definiert wurden.
+/// tip | "Tipp"
+
+Beachten Sie die automatische Vervollständigung für `name` und `price`, welche in der FastAPI-Anwendung im `Item`-Modell definiert wurden.
+
+///
Sie erhalten Inline-Fehlerberichte für die von Ihnen gesendeten Daten:
@@ -140,17 +147,21 @@ In vielen Fällen wird Ihre FastAPI-Anwendung größer sein und Sie werden wahrs
Beispielsweise könnten Sie einen Abschnitt für **Items (Artikel)** und einen weiteren Abschnitt für **Users (Benutzer)** haben, und diese könnten durch Tags getrennt sein:
-=== "Python 3.9+"
+//// tab | Python 3.9+
+
+```Python hl_lines="21 26 34"
+{!> ../../../docs_src/generate_clients/tutorial002_py39.py!}
+```
+
+////
- ```Python hl_lines="21 26 34"
- {!> ../../../docs_src/generate_clients/tutorial002_py39.py!}
- ```
+//// tab | Python 3.8+
-=== "Python 3.8+"
+```Python hl_lines="23 28 36"
+{!> ../../../docs_src/generate_clients/tutorial002.py!}
+```
- ```Python hl_lines="23 28 36"
- {!> ../../../docs_src/generate_clients/tutorial002.py!}
- ```
+////
### Einen TypeScript-Client mit Tags generieren
@@ -197,17 +208,21 @@ Hier verwendet sie beispielsweise den ersten Tag (Sie werden wahrscheinlich nur
Anschließend können Sie diese benutzerdefinierte Funktion als Parameter `generate_unique_id_function` an **FastAPI** übergeben:
-=== "Python 3.9+"
+//// tab | Python 3.9+
+
+```Python hl_lines="6-7 10"
+{!> ../../../docs_src/generate_clients/tutorial003_py39.py!}
+```
- ```Python hl_lines="6-7 10"
- {!> ../../../docs_src/generate_clients/tutorial003_py39.py!}
- ```
+////
-=== "Python 3.8+"
+//// tab | Python 3.8+
+
+```Python hl_lines="8-9 12"
+{!> ../../../docs_src/generate_clients/tutorial003.py!}
+```
- ```Python hl_lines="8-9 12"
- {!> ../../../docs_src/generate_clients/tutorial003.py!}
- ```
+////
### Einen TypeScript-Client mit benutzerdefinierten Operation-IDs generieren
@@ -229,17 +244,21 @@ Aber für den generierten Client könnten wir die OpenAPI-Operation-IDs direkt v
Wir könnten das OpenAPI-JSON in eine Datei `openapi.json` herunterladen und dann mit einem Skript wie dem folgenden **den vorangestellten Tag entfernen**:
-=== "Python"
+//// tab | Python
- ```Python
- {!> ../../../docs_src/generate_clients/tutorial004.py!}
- ```
+```Python
+{!> ../../../docs_src/generate_clients/tutorial004.py!}
+```
+
+////
-=== "Node.js"
+//// tab | Node.js
+
+```Javascript
+{!> ../../../docs_src/generate_clients/tutorial004.js!}
+```
- ```Javascript
- {!> ../../../docs_src/generate_clients/tutorial004.js!}
- ```
+////
Damit würden die Operation-IDs von Dingen wie `items-get_items` in `get_items` umbenannt, sodass der Client-Generator einfachere Methodennamen generieren kann.
diff --git a/docs/de/docs/advanced/index.md b/docs/de/docs/advanced/index.md
index 048e31e06..953ad317d 100644
--- a/docs/de/docs/advanced/index.md
+++ b/docs/de/docs/advanced/index.md
@@ -6,10 +6,13 @@ Das Haupt-[Tutorial – Benutzerhandbuch](../tutorial/index.md){.internal-link t
In den nächsten Abschnitten sehen Sie weitere Optionen, Konfigurationen und zusätzliche Funktionen.
-!!! tip "Tipp"
- Die nächsten Abschnitte sind **nicht unbedingt „fortgeschritten“**.
+/// tip | "Tipp"
- Und es ist möglich, dass für Ihren Anwendungsfall die Lösung in einem davon liegt.
+Die nächsten Abschnitte sind **nicht unbedingt „fortgeschritten“**.
+
+Und es ist möglich, dass für Ihren Anwendungsfall die Lösung in einem davon liegt.
+
+///
## Lesen Sie zuerst das Tutorial
diff --git a/docs/de/docs/advanced/middleware.md b/docs/de/docs/advanced/middleware.md
index 2c4e8542a..8912225fb 100644
--- a/docs/de/docs/advanced/middleware.md
+++ b/docs/de/docs/advanced/middleware.md
@@ -43,10 +43,13 @@ app.add_middleware(UnicornMiddleware, some_config="rainbow")
**FastAPI** enthält mehrere Middlewares für gängige Anwendungsfälle. Wir werden als Nächstes sehen, wie man sie verwendet.
-!!! note "Technische Details"
- Für die nächsten Beispiele könnten Sie auch `from starlette.middleware.something import SomethingMiddleware` verwenden.
+/// note | "Technische Details"
- **FastAPI** bietet mehrere Middlewares via `fastapi.middleware` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Middlewares kommen aber direkt von Starlette.
+Für die nächsten Beispiele könnten Sie auch `from starlette.middleware.something import SomethingMiddleware` verwenden.
+
+**FastAPI** bietet mehrere Middlewares via `fastapi.middleware` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Middlewares kommen aber direkt von Starlette.
+
+///
## `HTTPSRedirectMiddleware`
@@ -92,7 +95,6 @@ Es gibt viele andere ASGI-Middlewares.
Zum Beispiel:
-*
Sentry
*
Uvicorns `ProxyHeadersMiddleware`
*
MessagePack
diff --git a/docs/de/docs/advanced/openapi-callbacks.md b/docs/de/docs/advanced/openapi-callbacks.md
index 026fdb4fe..d7b5bc885 100644
--- a/docs/de/docs/advanced/openapi-callbacks.md
+++ b/docs/de/docs/advanced/openapi-callbacks.md
@@ -35,8 +35,11 @@ Dieser Teil ist ziemlich normal, der größte Teil des Codes ist Ihnen wahrschei
{!../../../docs_src/openapi_callbacks/tutorial001.py!}
```
-!!! tip "Tipp"
- Der Query-Parameter `callback_url` verwendet einen Pydantic-
Url-Typ.
+/// tip | "Tipp"
+
+Der Query-Parameter `callback_url` verwendet einen Pydantic-
Url-Typ.
+
+///
Das einzig Neue ist `callbacks=invoices_callback_router.routes` als Argument für den *Pfadoperation-Dekorator*. Wir werden als Nächstes sehen, was das ist.
@@ -61,10 +64,13 @@ Diese Dokumentation wird in der Swagger-Oberfläche unter `/docs` in Ihrer API a
In diesem Beispiel wird nicht der Callback selbst implementiert (das könnte nur eine Codezeile sein), sondern nur der Dokumentationsteil.
-!!! tip "Tipp"
- Der eigentliche Callback ist nur ein HTTP-Request.
+/// tip | "Tipp"
+
+Der eigentliche Callback ist nur ein HTTP-Request.
- Wenn Sie den Callback selbst implementieren, können Sie beispielsweise
HTTPX oder
Requests verwenden.
+Wenn Sie den Callback selbst implementieren, können Sie beispielsweise
HTTPX oder
Requests verwenden.
+
+///
## Schreiben des Codes, der den Callback dokumentiert
@@ -74,10 +80,13 @@ Sie wissen jedoch bereits, wie Sie mit **FastAPI** ganz einfach eine automatisch
Daher werden wir dasselbe Wissen nutzen, um zu dokumentieren, wie die *externe API* aussehen sollte ... indem wir die *Pfadoperation(en)* erstellen, welche die externe API implementieren soll (die, welche Ihre API aufruft).
-!!! tip "Tipp"
- Wenn Sie den Code zum Dokumentieren eines Callbacks schreiben, kann es hilfreich sein, sich vorzustellen, dass Sie dieser *externe Entwickler* sind. Und dass Sie derzeit die *externe API* implementieren, nicht *Ihre API*.
+/// tip | "Tipp"
+
+Wenn Sie den Code zum Dokumentieren eines Callbacks schreiben, kann es hilfreich sein, sich vorzustellen, dass Sie dieser *externe Entwickler* sind. Und dass Sie derzeit die *externe API* implementieren, nicht *Ihre API*.
- Wenn Sie diese Sichtweise (des *externen Entwicklers*) vorübergehend übernehmen, wird es offensichtlicher, wo die Parameter, das Pydantic-Modell für den Body, die Response, usw. für diese *externe API* hingehören.
+Wenn Sie diese Sichtweise (des *externen Entwicklers*) vorübergehend übernehmen, wird es offensichtlicher, wo die Parameter, das Pydantic-Modell für den Body, die Response, usw. für diese *externe API* hingehören.
+
+///
### Einen Callback-`APIRouter` erstellen
@@ -154,8 +163,11 @@ und sie würde eine Response von dieser *externen API* mit einem JSON-Body wie d
}
```
-!!! tip "Tipp"
- Beachten Sie, dass die verwendete Callback-URL die URL enthält, die als Query-Parameter in `callback_url` (`https://www.external.org/events`) empfangen wurde, und auch die Rechnungs-`id` aus dem JSON-Body (`2expen51ve`).
+/// tip | "Tipp"
+
+Beachten Sie, dass die verwendete Callback-URL die URL enthält, die als Query-Parameter in `callback_url` (`https://www.external.org/events`) empfangen wurde, und auch die Rechnungs-`id` aus dem JSON-Body (`2expen51ve`).
+
+///
### Den Callback-Router hinzufügen
@@ -167,8 +179,11 @@ Verwenden Sie nun den Parameter `callbacks` im *Pfadoperation-Dekorator Ihrer AP
{!../../../docs_src/openapi_callbacks/tutorial001.py!}
```
-!!! tip "Tipp"
- Beachten Sie, dass Sie nicht den Router selbst (`invoices_callback_router`) an `callback=` übergeben, sondern das Attribut `.routes`, wie in `invoices_callback_router.routes`.
+/// tip | "Tipp"
+
+Beachten Sie, dass Sie nicht den Router selbst (`invoices_callback_router`) an `callback=` übergeben, sondern das Attribut `.routes`, wie in `invoices_callback_router.routes`.
+
+///
### Es in der Dokumentation ansehen
diff --git a/docs/de/docs/advanced/openapi-webhooks.md b/docs/de/docs/advanced/openapi-webhooks.md
index 339218080..fb0daa908 100644
--- a/docs/de/docs/advanced/openapi-webhooks.md
+++ b/docs/de/docs/advanced/openapi-webhooks.md
@@ -22,8 +22,11 @@ Mit **FastAPI** können Sie mithilfe von OpenAPI die Namen dieser Webhooks, die
Dies kann es Ihren Benutzern viel einfacher machen, **deren APIs zu implementieren**, um Ihre **Webhook**-Requests zu empfangen. Möglicherweise können diese sogar einen Teil des eigenem API-Codes automatisch generieren.
-!!! info
- Webhooks sind in OpenAPI 3.1.0 und höher verfügbar und werden von FastAPI `0.99.0` und höher unterstützt.
+/// info
+
+Webhooks sind in OpenAPI 3.1.0 und höher verfügbar und werden von FastAPI `0.99.0` und höher unterstützt.
+
+///
## Eine Anwendung mit Webhooks
@@ -35,8 +38,11 @@ Wenn Sie eine **FastAPI**-Anwendung erstellen, gibt es ein `webhooks`-Attribut,
Die von Ihnen definierten Webhooks landen im **OpenAPI**-Schema und der automatischen **Dokumentations-Oberfläche**.
-!!! info
- Das `app.webhooks`-Objekt ist eigentlich nur ein `APIRouter`, derselbe Typ, den Sie verwenden würden, wenn Sie Ihre Anwendung mit mehreren Dateien strukturieren.
+/// info
+
+Das `app.webhooks`-Objekt ist eigentlich nur ein `APIRouter`, derselbe Typ, den Sie verwenden würden, wenn Sie Ihre Anwendung mit mehreren Dateien strukturieren.
+
+///
Beachten Sie, dass Sie bei Webhooks tatsächlich keinen *Pfad* (wie `/items/`) deklarieren, sondern dass der Text, den Sie dort übergeben, lediglich eine **Kennzeichnung** des Webhooks (der Name des Events) ist. Zum Beispiel ist in `@app.webhooks.post("new-subscription")` der Webhook-Name `new-subscription`.
diff --git a/docs/de/docs/advanced/path-operation-advanced-configuration.md b/docs/de/docs/advanced/path-operation-advanced-configuration.md
index 406a08e9e..c9cb82fe3 100644
--- a/docs/de/docs/advanced/path-operation-advanced-configuration.md
+++ b/docs/de/docs/advanced/path-operation-advanced-configuration.md
@@ -2,8 +2,11 @@
## OpenAPI operationId
-!!! warning "Achtung"
- Wenn Sie kein „Experte“ für OpenAPI sind, brauchen Sie dies wahrscheinlich nicht.
+/// warning | "Achtung"
+
+Wenn Sie kein „Experte“ für OpenAPI sind, brauchen Sie dies wahrscheinlich nicht.
+
+///
Mit dem Parameter `operation_id` können Sie die OpenAPI `operationId` festlegen, die in Ihrer *Pfadoperation* verwendet werden soll.
@@ -23,13 +26,19 @@ Sie sollten dies tun, nachdem Sie alle Ihre *Pfadoperationen* hinzugefügt haben
{!../../../docs_src/path_operation_advanced_configuration/tutorial002.py!}
```
-!!! tip "Tipp"
- Wenn Sie `app.openapi()` manuell aufrufen, sollten Sie vorher die `operationId`s aktualisiert haben.
+/// tip | "Tipp"
+
+Wenn Sie `app.openapi()` manuell aufrufen, sollten Sie vorher die `operationId`s aktualisiert haben.
+
+///
+
+/// warning | "Achtung"
+
+Wenn Sie dies tun, müssen Sie sicherstellen, dass jede Ihrer *Pfadoperation-Funktionen* einen eindeutigen Namen hat.
-!!! warning "Achtung"
- Wenn Sie dies tun, müssen Sie sicherstellen, dass jede Ihrer *Pfadoperation-Funktionen* einen eindeutigen Namen hat.
+Auch wenn diese sich in unterschiedlichen Modulen (Python-Dateien) befinden.
- Auch wenn diese sich in unterschiedlichen Modulen (Python-Dateien) befinden.
+///
## Von OpenAPI ausschließen
@@ -65,8 +74,11 @@ Es gibt hier in der Dokumentation ein ganzes Kapitel darüber, Sie können es un
Wenn Sie in Ihrer Anwendung eine *Pfadoperation* deklarieren, generiert **FastAPI** automatisch die relevanten Metadaten dieser *Pfadoperation*, die in das OpenAPI-Schema aufgenommen werden sollen.
-!!! note "Technische Details"
- In der OpenAPI-Spezifikation wird das
Operationsobjekt genannt.
+/// note | "Technische Details"
+
+In der OpenAPI-Spezifikation wird das
Operationsobjekt genannt.
+
+///
Es hat alle Informationen zur *Pfadoperation* und wird zur Erstellung der automatischen Dokumentation verwendet.
@@ -74,10 +86,13 @@ Es enthält `tags`, `parameters`, `requestBody`, `responses`, usw.
Dieses *Pfadoperation*-spezifische OpenAPI-Schema wird normalerweise automatisch von **FastAPI** generiert, Sie können es aber auch erweitern.
-!!! tip "Tipp"
- Dies ist ein Low-Level Erweiterungspunkt.
+/// tip | "Tipp"
+
+Dies ist ein Low-Level Erweiterungspunkt.
- Wenn Sie nur zusätzliche Responses deklarieren müssen, können Sie dies bequemer mit [Zusätzliche Responses in OpenAPI](additional-responses.md){.internal-link target=_blank} tun.
+Wenn Sie nur zusätzliche Responses deklarieren müssen, können Sie dies bequemer mit [Zusätzliche Responses in OpenAPI](additional-responses.md){.internal-link target=_blank} tun.
+
+///
Sie können das OpenAPI-Schema für eine *Pfadoperation* erweitern, indem Sie den Parameter `openapi_extra` verwenden.
@@ -150,20 +165,27 @@ Und Sie könnten dies auch tun, wenn der Datentyp in der Anfrage nicht JSON ist.
In der folgenden Anwendung verwenden wir beispielsweise weder die integrierte Funktionalität von FastAPI zum Extrahieren des JSON-Schemas aus Pydantic-Modellen noch die automatische Validierung für JSON. Tatsächlich deklarieren wir den Request-Content-Type als YAML und nicht als JSON:
-=== "Pydantic v2"
+//// tab | Pydantic v2
+
+```Python hl_lines="17-22 24"
+{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007.py!}
+```
+
+////
+
+//// tab | Pydantic v1
+
+```Python hl_lines="17-22 24"
+{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py!}
+```
- ```Python hl_lines="17-22 24"
- {!> ../../../docs_src/path_operation_advanced_configuration/tutorial007.py!}
- ```
+////
-=== "Pydantic v1"
+/// info
- ```Python hl_lines="17-22 24"
- {!> ../../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py!}
- ```
+In Pydantic Version 1 hieß die Methode zum Abrufen des JSON-Schemas für ein Modell `Item.schema()`, in Pydantic Version 2 heißt die Methode `Item.model_json_schema()`.
-!!! info
- In Pydantic Version 1 hieß die Methode zum Abrufen des JSON-Schemas für ein Modell `Item.schema()`, in Pydantic Version 2 heißt die Methode `Item.model_json_schema()`.
+///
Obwohl wir nicht die standardmäßig integrierte Funktionalität verwenden, verwenden wir dennoch ein Pydantic-Modell, um das JSON-Schema für die Daten, die wir in YAML empfangen möchten, manuell zu generieren.
@@ -171,22 +193,32 @@ Dann verwenden wir den Request direkt und extrahieren den Body als `bytes`. Das
Und dann parsen wir in unserem Code diesen YAML-Inhalt direkt und verwenden dann wieder dasselbe Pydantic-Modell, um den YAML-Inhalt zu validieren:
-=== "Pydantic v2"
+//// tab | Pydantic v2
+
+```Python hl_lines="26-33"
+{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007.py!}
+```
+
+////
+
+//// tab | Pydantic v1
+
+```Python hl_lines="26-33"
+{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py!}
+```
+
+////
+
+/// info
- ```Python hl_lines="26-33"
- {!> ../../../docs_src/path_operation_advanced_configuration/tutorial007.py!}
- ```
+In Pydantic Version 1 war die Methode zum Parsen und Validieren eines Objekts `Item.parse_obj()`, in Pydantic Version 2 heißt die Methode `Item.model_validate()`.
-=== "Pydantic v1"
+///
- ```Python hl_lines="26-33"
- {!> ../../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py!}
- ```
+/// tip | "Tipp"
-!!! info
- In Pydantic Version 1 war die Methode zum Parsen und Validieren eines Objekts `Item.parse_obj()`, in Pydantic Version 2 heißt die Methode `Item.model_validate()`.
+Hier verwenden wir dasselbe Pydantic-Modell wieder.
-!!! tip "Tipp"
- Hier verwenden wir dasselbe Pydantic-Modell wieder.
+Aber genauso hätten wir es auch auf andere Weise validieren können.
- Aber genauso hätten wir es auch auf andere Weise validieren können.
+///
diff --git a/docs/de/docs/advanced/response-cookies.md b/docs/de/docs/advanced/response-cookies.md
index 0f09bd444..3d2043565 100644
--- a/docs/de/docs/advanced/response-cookies.md
+++ b/docs/de/docs/advanced/response-cookies.md
@@ -30,20 +30,26 @@ Setzen Sie dann Cookies darin und geben Sie sie dann zurück:
{!../../../docs_src/response_cookies/tutorial001.py!}
```
-!!! tip "Tipp"
- Beachten Sie, dass, wenn Sie eine Response direkt zurückgeben, anstatt den `Response`-Parameter zu verwenden, FastAPI diese direkt zurückgibt.
+/// tip | "Tipp"
- Sie müssen also sicherstellen, dass Ihre Daten vom richtigen Typ sind. Z. B. sollten diese mit JSON kompatibel sein, wenn Sie eine `JSONResponse` zurückgeben.
+Beachten Sie, dass, wenn Sie eine Response direkt zurückgeben, anstatt den `Response`-Parameter zu verwenden, FastAPI diese direkt zurückgibt.
- Und auch, dass Sie keine Daten senden, die durch ein `response_model` hätten gefiltert werden sollen.
+Sie müssen also sicherstellen, dass Ihre Daten vom richtigen Typ sind. Z. B. sollten diese mit JSON kompatibel sein, wenn Sie eine `JSONResponse` zurückgeben.
+
+Und auch, dass Sie keine Daten senden, die durch ein `response_model` hätten gefiltert werden sollen.
+
+///
### Mehr Informationen
-!!! note "Technische Details"
- Sie können auch `from starlette.responses import Response` oder `from starlette.responses import JSONResponse` verwenden.
+/// note | "Technische Details"
+
+Sie können auch `from starlette.responses import Response` oder `from starlette.responses import JSONResponse` verwenden.
+
+**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette.
- **FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette.
+Und da die `Response` häufig zum Setzen von Headern und Cookies verwendet wird, stellt **FastAPI** diese auch unter `fastapi.Response` bereit.
- Und da die `Response` häufig zum Setzen von Headern und Cookies verwendet wird, stellt **FastAPI** diese auch unter `fastapi.Response` bereit.
+///
Um alle verfügbaren Parameter und Optionen anzuzeigen, sehen Sie sich deren
Dokumentation in Starlette an.
diff --git a/docs/de/docs/advanced/response-directly.md b/docs/de/docs/advanced/response-directly.md
index 13bca7825..377490b56 100644
--- a/docs/de/docs/advanced/response-directly.md
+++ b/docs/de/docs/advanced/response-directly.md
@@ -14,8 +14,11 @@ Das kann beispielsweise nützlich sein, um benutzerdefinierte Header oder Cookie
Tatsächlich können Sie jede `Response` oder jede Unterklasse davon zurückgeben.
-!!! tip "Tipp"
- `JSONResponse` selbst ist eine Unterklasse von `Response`.
+/// tip | "Tipp"
+
+`JSONResponse` selbst ist eine Unterklasse von `Response`.
+
+///
Und wenn Sie eine `Response` zurückgeben, wird **FastAPI** diese direkt weiterleiten.
@@ -35,10 +38,13 @@ In diesen Fällen können Sie den `jsonable_encoder` verwenden, um Ihre Daten zu
{!../../../docs_src/response_directly/tutorial001.py!}
```
-!!! note "Technische Details"
- Sie können auch `from starlette.responses import JSONResponse` verwenden.
+/// note | "Technische Details"
+
+Sie können auch `from starlette.responses import JSONResponse` verwenden.
+
+**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette.
- **FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette.
+///
## Eine benutzerdefinierte `Response` zurückgeben
diff --git a/docs/de/docs/advanced/response-headers.md b/docs/de/docs/advanced/response-headers.md
index 6f4760e7f..51a364f56 100644
--- a/docs/de/docs/advanced/response-headers.md
+++ b/docs/de/docs/advanced/response-headers.md
@@ -28,12 +28,15 @@ Erstellen Sie eine Response wie in [Eine Response direkt zurückgeben](response-
{!../../../docs_src/response_headers/tutorial001.py!}
```
-!!! note "Technische Details"
- Sie können auch `from starlette.responses import Response` oder `from starlette.responses import JSONResponse` verwenden.
+/// note | "Technische Details"
- **FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette.
+Sie können auch `from starlette.responses import Response` oder `from starlette.responses import JSONResponse` verwenden.
- Und da die `Response` häufig zum Setzen von Headern und Cookies verwendet wird, stellt **FastAPI** diese auch unter `fastapi.Response` bereit.
+**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette.
+
+Und da die `Response` häufig zum Setzen von Headern und Cookies verwendet wird, stellt **FastAPI** diese auch unter `fastapi.Response` bereit.
+
+///
## Benutzerdefinierte Header
diff --git a/docs/de/docs/advanced/security/http-basic-auth.md b/docs/de/docs/advanced/security/http-basic-auth.md
index 9f9c0cf7d..3e7aeb8a0 100644
--- a/docs/de/docs/advanced/security/http-basic-auth.md
+++ b/docs/de/docs/advanced/security/http-basic-auth.md
@@ -20,26 +20,35 @@ Wenn Sie dann den Benutzernamen und das Passwort eingeben, sendet der Browser di
* Diese gibt ein Objekt vom Typ `HTTPBasicCredentials` zurück:
* Es enthält den gesendeten `username` und das gesendete `password`.
-=== "Python 3.9+"
+//// tab | Python 3.9+
- ```Python hl_lines="4 8 12"
- {!> ../../../docs_src/security/tutorial006_an_py39.py!}
- ```
+```Python hl_lines="4 8 12"
+{!> ../../../docs_src/security/tutorial006_an_py39.py!}
+```
+
+////
+
+//// tab | Python 3.8+
+
+```Python hl_lines="2 7 11"
+{!> ../../../docs_src/security/tutorial006_an.py!}
+```
+
+////
-=== "Python 3.8+"
+//// tab | Python 3.8+ nicht annotiert
- ```Python hl_lines="2 7 11"
- {!> ../../../docs_src/security/tutorial006_an.py!}
- ```
+/// tip | "Tipp"
-=== "Python 3.8+ nicht annotiert"
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+///
- ```Python hl_lines="2 6 10"
- {!> ../../../docs_src/security/tutorial006.py!}
- ```
+```Python hl_lines="2 6 10"
+{!> ../../../docs_src/security/tutorial006.py!}
+```
+
+////
Wenn Sie versuchen, die URL zum ersten Mal zu öffnen (oder in der Dokumentation auf den Button „Execute“ zu klicken), wird der Browser Sie nach Ihrem Benutzernamen und Passwort fragen:
@@ -59,26 +68,35 @@ Um dies zu lösen, konvertieren wir zunächst den `username` und das `password`
Dann können wir `secrets.compare_digest()` verwenden, um sicherzustellen, dass `credentials.username` `"stanleyjobson"` und `credentials.password` `"swordfish"` ist.
-=== "Python 3.9+"
+//// tab | Python 3.9+
+
+```Python hl_lines="1 12-24"
+{!> ../../../docs_src/security/tutorial007_an_py39.py!}
+```
+
+////
+
+//// tab | Python 3.8+
- ```Python hl_lines="1 12-24"
- {!> ../../../docs_src/security/tutorial007_an_py39.py!}
- ```
+```Python hl_lines="1 12-24"
+{!> ../../../docs_src/security/tutorial007_an.py!}
+```
+
+////
+
+//// tab | Python 3.8+ nicht annotiert
-=== "Python 3.8+"
+/// tip | "Tipp"
- ```Python hl_lines="1 12-24"
- {!> ../../../docs_src/security/tutorial007_an.py!}
- ```
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
-=== "Python 3.8+ nicht annotiert"
+///
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+```Python hl_lines="1 11-21"
+{!> ../../../docs_src/security/tutorial007.py!}
+```
- ```Python hl_lines="1 11-21"
- {!> ../../../docs_src/security/tutorial007.py!}
- ```
+////
Dies wäre das gleiche wie:
@@ -142,23 +160,32 @@ So ist Ihr Anwendungscode, dank der Verwendung von `secrets.compare_digest()`, v
Nachdem Sie festgestellt haben, dass die Anmeldeinformationen falsch sind, geben Sie eine `HTTPException` mit dem Statuscode 401 zurück (derselbe, der auch zurückgegeben wird, wenn keine Anmeldeinformationen angegeben werden) und fügen den Header `WWW-Authenticate` hinzu, damit der Browser die Anmeldeaufforderung erneut anzeigt:
-=== "Python 3.9+"
+//// tab | Python 3.9+
+
+```Python hl_lines="26-30"
+{!> ../../../docs_src/security/tutorial007_an_py39.py!}
+```
+
+////
+
+//// tab | Python 3.8+
+
+```Python hl_lines="26-30"
+{!> ../../../docs_src/security/tutorial007_an.py!}
+```
+
+////
- ```Python hl_lines="26-30"
- {!> ../../../docs_src/security/tutorial007_an_py39.py!}
- ```
+//// tab | Python 3.8+ nicht annotiert
-=== "Python 3.8+"
+/// tip | "Tipp"
- ```Python hl_lines="26-30"
- {!> ../../../docs_src/security/tutorial007_an.py!}
- ```
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
-=== "Python 3.8+ nicht annotiert"
+///
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+```Python hl_lines="23-27"
+{!> ../../../docs_src/security/tutorial007.py!}
+```
- ```Python hl_lines="23-27"
- {!> ../../../docs_src/security/tutorial007.py!}
- ```
+////
diff --git a/docs/de/docs/advanced/security/index.md b/docs/de/docs/advanced/security/index.md
index a3c975bed..380e48bbf 100644
--- a/docs/de/docs/advanced/security/index.md
+++ b/docs/de/docs/advanced/security/index.md
@@ -4,10 +4,13 @@
Neben den in [Tutorial – Benutzerhandbuch: Sicherheit](../../tutorial/security/index.md){.internal-link target=_blank} behandelten Funktionen gibt es noch einige zusätzliche Funktionen zur Handhabung der Sicherheit.
-!!! tip "Tipp"
- Die nächsten Abschnitte sind **nicht unbedingt „fortgeschritten“**.
+/// tip | "Tipp"
- Und es ist möglich, dass für Ihren Anwendungsfall die Lösung in einem davon liegt.
+Die nächsten Abschnitte sind **nicht unbedingt „fortgeschritten“**.
+
+Und es ist möglich, dass für Ihren Anwendungsfall die Lösung in einem davon liegt.
+
+///
## Lesen Sie zuerst das Tutorial
diff --git a/docs/de/docs/advanced/security/oauth2-scopes.md b/docs/de/docs/advanced/security/oauth2-scopes.md
index ffd34d65f..f02707698 100644
--- a/docs/de/docs/advanced/security/oauth2-scopes.md
+++ b/docs/de/docs/advanced/security/oauth2-scopes.md
@@ -10,18 +10,21 @@ Jedes Mal, wenn Sie sich mit Facebook, Google, GitHub, Microsoft oder Twitter an
In diesem Abschnitt erfahren Sie, wie Sie Authentifizierung und Autorisierung mit demselben OAuth2, mit Scopes in Ihrer **FastAPI**-Anwendung verwalten.
-!!! warning "Achtung"
- Dies ist ein mehr oder weniger fortgeschrittener Abschnitt. Wenn Sie gerade erst anfangen, können Sie ihn überspringen.
+/// warning | "Achtung"
- Sie benötigen nicht unbedingt OAuth2-Scopes, und Sie können die Authentifizierung und Autorisierung handhaben wie Sie möchten.
+Dies ist ein mehr oder weniger fortgeschrittener Abschnitt. Wenn Sie gerade erst anfangen, können Sie ihn überspringen.
- Aber OAuth2 mit Scopes kann bequem in Ihre API (mit OpenAPI) und deren API-Dokumentation integriert werden.
+Sie benötigen nicht unbedingt OAuth2-Scopes, und Sie können die Authentifizierung und Autorisierung handhaben wie Sie möchten.
- Dennoch, verwenden Sie solche Scopes oder andere Sicherheits-/Autorisierungsanforderungen in Ihrem Code so wie Sie es möchten.
+Aber OAuth2 mit Scopes kann bequem in Ihre API (mit OpenAPI) und deren API-Dokumentation integriert werden.
- In vielen Fällen kann OAuth2 mit Scopes ein Overkill sein.
+Dennoch, verwenden Sie solche Scopes oder andere Sicherheits-/Autorisierungsanforderungen in Ihrem Code so wie Sie es möchten.
- Aber wenn Sie wissen, dass Sie es brauchen oder neugierig sind, lesen Sie weiter.
+In vielen Fällen kann OAuth2 mit Scopes ein Overkill sein.
+
+Aber wenn Sie wissen, dass Sie es brauchen oder neugierig sind, lesen Sie weiter.
+
+///
## OAuth2-Scopes und OpenAPI
@@ -43,63 +46,87 @@ Er wird normalerweise verwendet, um bestimmte Sicherheitsberechtigungen zu dekla
* `instagram_basic` wird von Facebook / Instagram verwendet.
* `https://www.googleapis.com/auth/drive` wird von Google verwendet.
-!!! info
- In OAuth2 ist ein „Scope“ nur ein String, der eine bestimmte erforderliche Berechtigung deklariert.
+/// info
+
+In OAuth2 ist ein „Scope“ nur ein String, der eine bestimmte erforderliche Berechtigung deklariert.
+
+Es spielt keine Rolle, ob er andere Zeichen wie `:` enthält oder ob es eine URL ist.
- Es spielt keine Rolle, ob er andere Zeichen wie `:` enthält oder ob es eine URL ist.
+Diese Details sind implementierungsspezifisch.
- Diese Details sind implementierungsspezifisch.
+Für OAuth2 sind es einfach nur Strings.
- Für OAuth2 sind es einfach nur Strings.
+///
## Gesamtübersicht
Sehen wir uns zunächst kurz die Teile an, die sich gegenüber den Beispielen im Haupt-**Tutorial – Benutzerhandbuch** für [OAuth2 mit Password (und Hashing), Bearer mit JWT-Tokens](../../tutorial/security/oauth2-jwt.md){.internal-link target=_blank} ändern. Diesmal verwenden wir OAuth2-Scopes:
-=== "Python 3.10+"
+//// tab | Python 3.10+
+
+```Python hl_lines="4 8 12 46 64 105 107-115 121-124 128-134 139 155"
+{!> ../../../docs_src/security/tutorial005_an_py310.py!}
+```
+
+////
+
+//// tab | Python 3.9+
+
+```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155"
+{!> ../../../docs_src/security/tutorial005_an_py39.py!}
+```
+
+////
+
+//// tab | Python 3.8+
+
+```Python hl_lines="2 4 8 12 47 65 106 108-116 122-125 129-135 140 156"
+{!> ../../../docs_src/security/tutorial005_an.py!}
+```
+
+////
+
+//// tab | Python 3.10+ nicht annotiert
+
+/// tip | "Tipp"
- ```Python hl_lines="4 8 12 46 64 105 107-115 121-124 128-134 139 155"
- {!> ../../../docs_src/security/tutorial005_an_py310.py!}
- ```
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
-=== "Python 3.9+"
+///
- ```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155"
- {!> ../../../docs_src/security/tutorial005_an_py39.py!}
- ```
+```Python hl_lines="3 7 11 45 63 104 106-114 120-123 127-133 138 154"
+{!> ../../../docs_src/security/tutorial005_py310.py!}
+```
-=== "Python 3.8+"
+////
- ```Python hl_lines="2 4 8 12 47 65 106 108-116 122-125 129-135 140 156"
- {!> ../../../docs_src/security/tutorial005_an.py!}
- ```
+//// tab | Python 3.9+ nicht annotiert
-=== "Python 3.10+ nicht annotiert"
+/// tip | "Tipp"
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
- ```Python hl_lines="3 7 11 45 63 104 106-114 120-123 127-133 138 154"
- {!> ../../../docs_src/security/tutorial005_py310.py!}
- ```
+///
-=== "Python 3.9+ nicht annotiert"
+```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155"
+{!> ../../../docs_src/security/tutorial005_py39.py!}
+```
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+////
- ```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155"
- {!> ../../../docs_src/security/tutorial005_py39.py!}
- ```
+//// tab | Python 3.8+ nicht annotiert
-=== "Python 3.8+ nicht annotiert"
+/// tip | "Tipp"
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
- ```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155"
- {!> ../../../docs_src/security/tutorial005.py!}
- ```
+///
+
+```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155"
+{!> ../../../docs_src/security/tutorial005.py!}
+```
+
+////
Sehen wir uns diese Änderungen nun Schritt für Schritt an.
@@ -109,51 +136,71 @@ Die erste Änderung ist, dass wir jetzt das OAuth2-Sicherheitsschema mit zwei ve
Der `scopes`-Parameter erhält ein `dict` mit jedem Scope als Schlüssel und dessen Beschreibung als Wert:
-=== "Python 3.10+"
+//// tab | Python 3.10+
+
+```Python hl_lines="62-65"
+{!> ../../../docs_src/security/tutorial005_an_py310.py!}
+```
+
+////
+
+//// tab | Python 3.9+
+
+```Python hl_lines="62-65"
+{!> ../../../docs_src/security/tutorial005_an_py39.py!}
+```
+
+////
- ```Python hl_lines="62-65"
- {!> ../../../docs_src/security/tutorial005_an_py310.py!}
- ```
+//// tab | Python 3.8+
-=== "Python 3.9+"
+```Python hl_lines="63-66"
+{!> ../../../docs_src/security/tutorial005_an.py!}
+```
- ```Python hl_lines="62-65"
- {!> ../../../docs_src/security/tutorial005_an_py39.py!}
- ```
+////
-=== "Python 3.8+"
+//// tab | Python 3.10+ nicht annotiert
- ```Python hl_lines="63-66"
- {!> ../../../docs_src/security/tutorial005_an.py!}
- ```
+/// tip | "Tipp"
-=== "Python 3.10+ nicht annotiert"
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+///
- ```Python hl_lines="61-64"
- {!> ../../../docs_src/security/tutorial005_py310.py!}
- ```
+```Python hl_lines="61-64"
+{!> ../../../docs_src/security/tutorial005_py310.py!}
+```
+////
-=== "Python 3.9+ nicht annotiert"
+//// tab | Python 3.9+ nicht annotiert
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+/// tip | "Tipp"
- ```Python hl_lines="62-65"
- {!> ../../../docs_src/security/tutorial005_py39.py!}
- ```
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
-=== "Python 3.8+ nicht annotiert"
+///
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+```Python hl_lines="62-65"
+{!> ../../../docs_src/security/tutorial005_py39.py!}
+```
- ```Python hl_lines="62-65"
- {!> ../../../docs_src/security/tutorial005.py!}
- ```
+////
+
+//// tab | Python 3.8+ nicht annotiert
+
+/// tip | "Tipp"
+
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
+
+///
+
+```Python hl_lines="62-65"
+{!> ../../../docs_src/security/tutorial005.py!}
+```
+
+////
Da wir diese Scopes jetzt deklarieren, werden sie in der API-Dokumentation angezeigt, wenn Sie sich einloggen/autorisieren.
@@ -171,55 +218,79 @@ Wir verwenden immer noch dasselbe `OAuth2PasswordRequestForm`. Es enthält eine
Und wir geben die Scopes als Teil des JWT-Tokens zurück.
-!!! danger "Gefahr"
- Der Einfachheit halber fügen wir hier die empfangenen Scopes direkt zum Token hinzu.
+/// danger | "Gefahr"
+
+Der Einfachheit halber fügen wir hier die empfangenen Scopes direkt zum Token hinzu.
- Aus Sicherheitsgründen sollten Sie jedoch sicherstellen, dass Sie in Ihrer Anwendung nur die Scopes hinzufügen, die der Benutzer tatsächlich haben kann, oder die Sie vordefiniert haben.
+Aus Sicherheitsgründen sollten Sie jedoch sicherstellen, dass Sie in Ihrer Anwendung nur die Scopes hinzufügen, die der Benutzer tatsächlich haben kann, oder die Sie vordefiniert haben.
-=== "Python 3.10+"
+///
- ```Python hl_lines="155"
- {!> ../../../docs_src/security/tutorial005_an_py310.py!}
- ```
+//// tab | Python 3.10+
-=== "Python 3.9+"
+```Python hl_lines="155"
+{!> ../../../docs_src/security/tutorial005_an_py310.py!}
+```
- ```Python hl_lines="155"
- {!> ../../../docs_src/security/tutorial005_an_py39.py!}
- ```
+////
-=== "Python 3.8+"
+//// tab | Python 3.9+
- ```Python hl_lines="156"
- {!> ../../../docs_src/security/tutorial005_an.py!}
- ```
+```Python hl_lines="155"
+{!> ../../../docs_src/security/tutorial005_an_py39.py!}
+```
-=== "Python 3.10+ nicht annotiert"
+////
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+//// tab | Python 3.8+
- ```Python hl_lines="154"
- {!> ../../../docs_src/security/tutorial005_py310.py!}
- ```
+```Python hl_lines="156"
+{!> ../../../docs_src/security/tutorial005_an.py!}
+```
-=== "Python 3.9+ nicht annotiert"
+////
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+//// tab | Python 3.10+ nicht annotiert
- ```Python hl_lines="155"
- {!> ../../../docs_src/security/tutorial005_py39.py!}
- ```
+/// tip | "Tipp"
-=== "Python 3.8+ nicht annotiert"
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+///
- ```Python hl_lines="155"
- {!> ../../../docs_src/security/tutorial005.py!}
- ```
+```Python hl_lines="154"
+{!> ../../../docs_src/security/tutorial005_py310.py!}
+```
+
+////
+
+//// tab | Python 3.9+ nicht annotiert
+
+/// tip | "Tipp"
+
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
+
+///
+
+```Python hl_lines="155"
+{!> ../../../docs_src/security/tutorial005_py39.py!}
+```
+
+////
+
+//// tab | Python 3.8+ nicht annotiert
+
+/// tip | "Tipp"
+
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
+
+///
+
+```Python hl_lines="155"
+{!> ../../../docs_src/security/tutorial005.py!}
+```
+
+////
## Scopes in *Pfadoperationen* und Abhängigkeiten deklarieren
@@ -237,62 +308,89 @@ Und die Abhängigkeitsfunktion `get_current_active_user` kann auch Unterabhängi
In diesem Fall erfordert sie den Scope `me` (sie könnte mehr als einen Scope erfordern).
-!!! note "Hinweis"
- Sie müssen nicht unbedingt an verschiedenen Stellen verschiedene Scopes hinzufügen.
+/// note | "Hinweis"
+
+Sie müssen nicht unbedingt an verschiedenen Stellen verschiedene Scopes hinzufügen.
+
+Wir tun dies hier, um zu demonstrieren, wie **FastAPI** auf verschiedenen Ebenen deklarierte Scopes verarbeitet.
+
+///
+
+//// tab | Python 3.10+
+
+```Python hl_lines="4 139 170"
+{!> ../../../docs_src/security/tutorial005_an_py310.py!}
+```
+
+////
+
+//// tab | Python 3.9+
+
+```Python hl_lines="4 139 170"
+{!> ../../../docs_src/security/tutorial005_an_py39.py!}
+```
+
+////
+
+//// tab | Python 3.8+
+
+```Python hl_lines="4 140 171"
+{!> ../../../docs_src/security/tutorial005_an.py!}
+```
+
+////
+
+//// tab | Python 3.10+ nicht annotiert
+
+/// tip | "Tipp"
- Wir tun dies hier, um zu demonstrieren, wie **FastAPI** auf verschiedenen Ebenen deklarierte Scopes verarbeitet.
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
-=== "Python 3.10+"
+///
- ```Python hl_lines="4 139 170"
- {!> ../../../docs_src/security/tutorial005_an_py310.py!}
- ```
+```Python hl_lines="3 138 167"
+{!> ../../../docs_src/security/tutorial005_py310.py!}
+```
-=== "Python 3.9+"
+////
- ```Python hl_lines="4 139 170"
- {!> ../../../docs_src/security/tutorial005_an_py39.py!}
- ```
+//// tab | Python 3.9+ nicht annotiert
-=== "Python 3.8+"
+/// tip | "Tipp"
- ```Python hl_lines="4 140 171"
- {!> ../../../docs_src/security/tutorial005_an.py!}
- ```
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
-=== "Python 3.10+ nicht annotiert"
+///
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+```Python hl_lines="4 139 168"
+{!> ../../../docs_src/security/tutorial005_py39.py!}
+```
- ```Python hl_lines="3 138 167"
- {!> ../../../docs_src/security/tutorial005_py310.py!}
- ```
+////
-=== "Python 3.9+ nicht annotiert"
+//// tab | Python 3.8+ nicht annotiert
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+/// tip | "Tipp"
- ```Python hl_lines="4 139 168"
- {!> ../../../docs_src/security/tutorial005_py39.py!}
- ```
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
-=== "Python 3.8+ nicht annotiert"
+///
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+```Python hl_lines="4 139 168"
+{!> ../../../docs_src/security/tutorial005.py!}
+```
- ```Python hl_lines="4 139 168"
- {!> ../../../docs_src/security/tutorial005.py!}
- ```
+////
-!!! info "Technische Details"
- `Security` ist tatsächlich eine Unterklasse von `Depends` und hat nur noch einen zusätzlichen Parameter, den wir später kennenlernen werden.
+/// info | "Technische Details"
- Durch die Verwendung von `Security` anstelle von `Depends` weiß **FastAPI** jedoch, dass es Sicherheits-Scopes deklarieren, intern verwenden und die API mit OpenAPI dokumentieren kann.
+`Security` ist tatsächlich eine Unterklasse von `Depends` und hat nur noch einen zusätzlichen Parameter, den wir später kennenlernen werden.
- Wenn Sie jedoch `Query`, `Path`, `Depends`, `Security` und andere von `fastapi` importieren, handelt es sich tatsächlich um Funktionen, die spezielle Klassen zurückgeben.
+Durch die Verwendung von `Security` anstelle von `Depends` weiß **FastAPI** jedoch, dass es Sicherheits-Scopes deklarieren, intern verwenden und die API mit OpenAPI dokumentieren kann.
+
+Wenn Sie jedoch `Query`, `Path`, `Depends`, `Security` und andere von `fastapi` importieren, handelt es sich tatsächlich um Funktionen, die spezielle Klassen zurückgeben.
+
+///
## `SecurityScopes` verwenden
@@ -308,50 +406,71 @@ Wir deklarieren auch einen speziellen Parameter vom Typ `SecurityScopes`, der au
Diese `SecurityScopes`-Klasse ähnelt `Request` (`Request` wurde verwendet, um das Request-Objekt direkt zu erhalten).
-=== "Python 3.10+"
+//// tab | Python 3.10+
+
+```Python hl_lines="8 105"
+{!> ../../../docs_src/security/tutorial005_an_py310.py!}
+```
+
+////
+
+//// tab | Python 3.9+
+
+```Python hl_lines="8 105"
+{!> ../../../docs_src/security/tutorial005_an_py39.py!}
+```
+
+////
+
+//// tab | Python 3.8+
+
+```Python hl_lines="8 106"
+{!> ../../../docs_src/security/tutorial005_an.py!}
+```
+
+////
+
+//// tab | Python 3.10+ nicht annotiert
+
+/// tip | "Tipp"
+
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
+
+///
- ```Python hl_lines="8 105"
- {!> ../../../docs_src/security/tutorial005_an_py310.py!}
- ```
+```Python hl_lines="7 104"
+{!> ../../../docs_src/security/tutorial005_py310.py!}
+```
-=== "Python 3.9+"
+////
- ```Python hl_lines="8 105"
- {!> ../../../docs_src/security/tutorial005_an_py39.py!}
- ```
+//// tab | Python 3.9+ nicht annotiert
-=== "Python 3.8+"
+/// tip | "Tipp"
- ```Python hl_lines="8 106"
- {!> ../../../docs_src/security/tutorial005_an.py!}
- ```
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
-=== "Python 3.10+ nicht annotiert"
+///
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+```Python hl_lines="8 105"
+{!> ../../../docs_src/security/tutorial005_py39.py!}
+```
- ```Python hl_lines="7 104"
- {!> ../../../docs_src/security/tutorial005_py310.py!}
- ```
+////
-=== "Python 3.9+ nicht annotiert"
+//// tab | Python 3.8+ nicht annotiert
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+/// tip | "Tipp"
- ```Python hl_lines="8 105"
- {!> ../../../docs_src/security/tutorial005_py39.py!}
- ```
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
-=== "Python 3.8+ nicht annotiert"
+///
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+```Python hl_lines="8 105"
+{!> ../../../docs_src/security/tutorial005.py!}
+```
- ```Python hl_lines="8 105"
- {!> ../../../docs_src/security/tutorial005.py!}
- ```
+////
## Die `scopes` verwenden
@@ -365,50 +484,71 @@ Wir erstellen eine `HTTPException`, die wir später an mehreren Stellen wiederve
In diese Exception fügen wir (falls vorhanden) die erforderlichen Scopes als durch Leerzeichen getrennten String ein (unter Verwendung von `scope_str`). Wir fügen diesen String mit den Scopes in den Header `WWW-Authenticate` ein (das ist Teil der Spezifikation).
-=== "Python 3.10+"
+//// tab | Python 3.10+
- ```Python hl_lines="105 107-115"
- {!> ../../../docs_src/security/tutorial005_an_py310.py!}
- ```
+```Python hl_lines="105 107-115"
+{!> ../../../docs_src/security/tutorial005_an_py310.py!}
+```
-=== "Python 3.9+"
+////
- ```Python hl_lines="105 107-115"
- {!> ../../../docs_src/security/tutorial005_an_py39.py!}
- ```
+//// tab | Python 3.9+
-=== "Python 3.8+"
+```Python hl_lines="105 107-115"
+{!> ../../../docs_src/security/tutorial005_an_py39.py!}
+```
- ```Python hl_lines="106 108-116"
- {!> ../../../docs_src/security/tutorial005_an.py!}
- ```
+////
-=== "Python 3.10+ nicht annotiert"
+//// tab | Python 3.8+
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+```Python hl_lines="106 108-116"
+{!> ../../../docs_src/security/tutorial005_an.py!}
+```
- ```Python hl_lines="104 106-114"
- {!> ../../../docs_src/security/tutorial005_py310.py!}
- ```
+////
-=== "Python 3.9+ nicht annotiert"
+//// tab | Python 3.10+ nicht annotiert
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+/// tip | "Tipp"
- ```Python hl_lines="105 107-115"
- {!> ../../../docs_src/security/tutorial005_py39.py!}
- ```
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
-=== "Python 3.8+ nicht annotiert"
+///
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+```Python hl_lines="104 106-114"
+{!> ../../../docs_src/security/tutorial005_py310.py!}
+```
- ```Python hl_lines="105 107-115"
- {!> ../../../docs_src/security/tutorial005.py!}
- ```
+////
+
+//// tab | Python 3.9+ nicht annotiert
+
+/// tip | "Tipp"
+
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
+
+///
+
+```Python hl_lines="105 107-115"
+{!> ../../../docs_src/security/tutorial005_py39.py!}
+```
+
+////
+
+//// tab | Python 3.8+ nicht annotiert
+
+/// tip | "Tipp"
+
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
+
+///
+
+```Python hl_lines="105 107-115"
+{!> ../../../docs_src/security/tutorial005.py!}
+```
+
+////
## Den `username` und das Format der Daten überprüfen
@@ -424,50 +564,71 @@ Anstelle beispielsweise eines `dict`s oder etwas anderem, was später in der Anw
Wir verifizieren auch, dass wir einen Benutzer mit diesem Benutzernamen haben, und wenn nicht, lösen wir dieselbe Exception aus, die wir zuvor erstellt haben.
-=== "Python 3.10+"
+//// tab | Python 3.10+
+
+```Python hl_lines="46 116-127"
+{!> ../../../docs_src/security/tutorial005_an_py310.py!}
+```
- ```Python hl_lines="46 116-127"
- {!> ../../../docs_src/security/tutorial005_an_py310.py!}
- ```
+////
-=== "Python 3.9+"
+//// tab | Python 3.9+
- ```Python hl_lines="46 116-127"
- {!> ../../../docs_src/security/tutorial005_an_py39.py!}
- ```
+```Python hl_lines="46 116-127"
+{!> ../../../docs_src/security/tutorial005_an_py39.py!}
+```
-=== "Python 3.8+"
+////
- ```Python hl_lines="47 117-128"
- {!> ../../../docs_src/security/tutorial005_an.py!}
- ```
+//// tab | Python 3.8+
-=== "Python 3.10+ nicht annotiert"
+```Python hl_lines="47 117-128"
+{!> ../../../docs_src/security/tutorial005_an.py!}
+```
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+////
- ```Python hl_lines="45 115-126"
- {!> ../../../docs_src/security/tutorial005_py310.py!}
- ```
+//// tab | Python 3.10+ nicht annotiert
-=== "Python 3.9+ nicht annotiert"
+/// tip | "Tipp"
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
- ```Python hl_lines="46 116-127"
- {!> ../../../docs_src/security/tutorial005_py39.py!}
- ```
+///
-=== "Python 3.8+ nicht annotiert"
+```Python hl_lines="45 115-126"
+{!> ../../../docs_src/security/tutorial005_py310.py!}
+```
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+////
- ```Python hl_lines="46 116-127"
- {!> ../../../docs_src/security/tutorial005.py!}
- ```
+//// tab | Python 3.9+ nicht annotiert
+
+/// tip | "Tipp"
+
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
+
+///
+
+```Python hl_lines="46 116-127"
+{!> ../../../docs_src/security/tutorial005_py39.py!}
+```
+
+////
+
+//// tab | Python 3.8+ nicht annotiert
+
+/// tip | "Tipp"
+
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
+
+///
+
+```Python hl_lines="46 116-127"
+{!> ../../../docs_src/security/tutorial005.py!}
+```
+
+////
## Die `scopes` verifizieren
@@ -475,50 +636,71 @@ Wir überprüfen nun, ob das empfangenen Token alle Scopes enthält, die von die
Hierzu verwenden wir `security_scopes.scopes`, das eine `list`e mit allen diesen Scopes als `str` enthält.
-=== "Python 3.10+"
+//// tab | Python 3.10+
+
+```Python hl_lines="128-134"
+{!> ../../../docs_src/security/tutorial005_an_py310.py!}
+```
+
+////
+
+//// tab | Python 3.9+
- ```Python hl_lines="128-134"
- {!> ../../../docs_src/security/tutorial005_an_py310.py!}
- ```
+```Python hl_lines="128-134"
+{!> ../../../docs_src/security/tutorial005_an_py39.py!}
+```
-=== "Python 3.9+"
+////
- ```Python hl_lines="128-134"
- {!> ../../../docs_src/security/tutorial005_an_py39.py!}
- ```
+//// tab | Python 3.8+
-=== "Python 3.8+"
+```Python hl_lines="129-135"
+{!> ../../../docs_src/security/tutorial005_an.py!}
+```
- ```Python hl_lines="129-135"
- {!> ../../../docs_src/security/tutorial005_an.py!}
- ```
+////
-=== "Python 3.10+ nicht annotiert"
+//// tab | Python 3.10+ nicht annotiert
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+/// tip | "Tipp"
- ```Python hl_lines="127-133"
- {!> ../../../docs_src/security/tutorial005_py310.py!}
- ```
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
-=== "Python 3.9+ nicht annotiert"
+///
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+```Python hl_lines="127-133"
+{!> ../../../docs_src/security/tutorial005_py310.py!}
+```
- ```Python hl_lines="128-134"
- {!> ../../../docs_src/security/tutorial005_py39.py!}
- ```
+////
-=== "Python 3.8+ nicht annotiert"
+//// tab | Python 3.9+ nicht annotiert
- !!! tip "Tipp"
- Bevorzugen Sie die `Annotated`-Version, falls möglich.
+/// tip | "Tipp"
- ```Python hl_lines="128-134"
- {!> ../../../docs_src/security/tutorial005.py!}
- ```
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
+
+///
+
+```Python hl_lines="128-134"
+{!> ../../../docs_src/security/tutorial005_py39.py!}
+```
+
+////
+
+//// tab | Python 3.8+ nicht annotiert
+
+/// tip | "Tipp"
+
+Bevorzugen Sie die `Annotated`-Version, falls möglich.
+
+///
+
+```Python hl_lines="128-134"
+{!> ../../../docs_src/security/tutorial005.py!}
+```
+
+////
## Abhängigkeitsbaum und Scopes
@@ -545,10 +727,13 @@ So sieht die Hierarchie der Abhängigkeiten und Scopes aus:
* `security_scopes.scopes` enthält `["me"]` für die *Pfadoperation* `read_users_me`, da das in der Abhängigkeit `get_current_active_user` deklariert ist.
* `security_scopes.scopes` wird `[]` (nichts) für die *Pfadoperation* `read_system_status` enthalten, da diese keine `Security` mit `scopes` deklariert hat, und deren Abhängigkeit `get_current_user` ebenfalls keinerlei `scopes` deklariert.
-!!! tip "Tipp"
- Das Wichtige und „Magische“ hier ist, dass `get_current_user` für jede *Pfadoperation* eine andere Liste von `scopes` hat, die überprüft werden.
+/// tip | "Tipp"
+
+Das Wichtige und „Magische“ hier ist, dass `get_current_user` für jede *Pfadoperation* eine andere Liste von `scopes` hat, die überprüft werden.
- Alles hängt von den „Scopes“ ab, die in jeder *Pfadoperation* und jeder Abhängigkeit im Abhängigkeitsbaum für diese bestimmte *Pfadoperation* deklariert wurden.
+Alles hängt von den „Scopes“ ab, die in jeder *Pfadoperation* und jeder Abhängigkeit im Abhängigkeitsbaum für diese bestimmte *Pfadoperation* deklariert wurden.
+
+///
## Weitere Details zu `SecurityScopes`.
@@ -586,10 +771,13 @@ Am häufigsten ist der „Implicit“-Flow.
Am sichersten ist der „Code“-Flow, die Implementierung ist jedoch komplexer, da mehr Schritte erforderlich sind. Da er komplexer ist, schlagen viele Anbieter letztendlich den „Implicit“-Flow vor.
-!!! note "Hinweis"
- Es ist üblich, dass jeder Authentifizierungsanbieter seine Flows anders benennt, um sie zu einem Teil seiner Marke zu machen.
+/// note | "Hinweis"
+
+Es ist üblich, dass jeder Authentifizierungsanbieter seine Flows anders benennt, um sie zu einem Teil seiner Marke zu machen.
+
+Aber am Ende implementieren sie denselben OAuth2-Standard.
- Aber am Ende implementieren sie denselben OAuth2-Standard.
+///
**FastAPI** enthält Werkzeuge für alle diese OAuth2-Authentifizierungs-Flows in `fastapi.security.oauth2`.
diff --git a/docs/de/docs/advanced/settings.md b/docs/de/docs/advanced/settings.md
index fe01d8e1f..3cd4c6c7d 100644
--- a/docs/de/docs/advanced/settings.md
+++ b/docs/de/docs/advanced/settings.md
@@ -8,44 +8,51 @@ Aus diesem Grund werden diese üblicherweise in Umgebungsvariablen bereitgestell
## Umgebungsvariablen
-!!! tip "Tipp"
- Wenn Sie bereits wissen, was „Umgebungsvariablen“ sind und wie man sie verwendet, können Sie gerne mit dem nächsten Abschnitt weiter unten fortfahren.
+/// tip | "Tipp"
+
+Wenn Sie bereits wissen, was „Umgebungsvariablen“ sind und wie man sie verwendet, können Sie gerne mit dem nächsten Abschnitt weiter unten fortfahren.
+
+///
Eine
Umgebungsvariable (auch bekannt als „env var“) ist eine Variable, die sich außerhalb des Python-Codes im Betriebssystem befindet und von Ihrem Python-Code (oder auch von anderen Programmen) gelesen werden kann.
Sie können Umgebungsvariablen in der Shell erstellen und verwenden, ohne Python zu benötigen:
-=== "Linux, macOS, Windows Bash"
+//// tab | Linux, macOS, Windows Bash
-
+
- ```console
- // Sie könnten eine Umgebungsvariable MY_NAME erstellen mittels
- $ export MY_NAME="Wade Wilson"
+```console
+// Sie könnten eine Umgebungsvariable MY_NAME erstellen mittels
+$ export MY_NAME="Wade Wilson"
- // Dann könnten Sie diese mit anderen Programmen verwenden, etwa
- $ echo "Hello $MY_NAME"
+// Dann könnten Sie diese mit anderen Programmen verwenden, etwa
+$ echo "Hello $MY_NAME"
+
+Hello Wade Wilson
+```
+
+
- Hello Wade Wilson
- ```
+////
-
+//// tab | Windows PowerShell
-=== "Windows PowerShell"
+
-
+```console
+// Erstelle eine Umgebungsvariable MY_NAME
+$ $Env:MY_NAME = "Wade Wilson"
- ```console
- // Erstelle eine Umgebungsvariable MY_NAME
- $ $Env:MY_NAME = "Wade Wilson"
+// Verwende sie mit anderen Programmen, etwa
+$ echo "Hello $Env:MY_NAME"
- // Verwende sie mit anderen Programmen, etwa
- $ echo "Hello $Env:MY_NAME"
+Hello Wade Wilson
+```
- Hello Wade Wilson
- ```
+
-
+////
### Umgebungsvariablen mit Python auslesen
@@ -60,10 +67,13 @@ name = os.getenv("MY_NAME", "World")
print(f"Hello {name} from Python")
```
-!!! tip "Tipp"
- Das zweite Argument für
`os.getenv()` ist der zurückzugebende Defaultwert.
+/// tip | "Tipp"
+
+Das zweite Argument für
`os.getenv()` ist der zurückzugebende Defaultwert.
- Wenn nicht angegeben, ist er standardmäßig `None`. Hier übergeben wir `"World"` als Defaultwert.
+Wenn nicht angegeben, ist er standardmäßig `None`. Hier übergeben wir `"World"` als Defaultwert.
+
+///
Dann könnten Sie dieses Python-Programm aufrufen:
@@ -114,8 +124,11 @@ Hello World from Python
-!!! tip "Tipp"
- Weitere Informationen dazu finden Sie unter