Browse Source

Merge branch 'master' into feature/flexible-router-args

pull/11050/head
Aleksei Kotenko 6 months ago
committed by GitHub
parent
commit
8618925db2
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 6
      .github/actions/people/app/main.py
  2. 38
      .github/labeler.yml
  3. 18
      .github/workflows/add-to-project.yml
  4. 24
      .github/workflows/build-docs.yml
  5. 49
      .github/workflows/deploy-docs.yml
  6. 9
      .github/workflows/issue-manager.yml
  7. 33
      .github/workflows/labeler.yml
  8. 3
      .github/workflows/latest-changes.yml
  9. 2
      .github/workflows/publish.yml
  10. 12
      .github/workflows/test-redistribute.yml
  11. 8
      .github/workflows/test.yml
  12. 2
      .gitignore
  13. 6
      .pre-commit-config.yaml
  14. 10
      README.md
  15. 185
      docs/az/docs/fastapi-people.md
  16. 2
      docs/az/docs/index.md
  17. 2
      docs/bn/docs/index.md
  18. 167
      docs/bn/docs/python-types.md
  19. 33
      docs/de/docs/advanced/additional-responses.md
  20. 50
      docs/de/docs/advanced/additional-status-codes.md
  21. 97
      docs/de/docs/advanced/advanced-dependencies.md
  22. 30
      docs/de/docs/advanced/async-tests.md
  23. 45
      docs/de/docs/advanced/behind-a-proxy.md
  24. 87
      docs/de/docs/advanced/custom-response.md
  25. 11
      docs/de/docs/advanced/dataclasses.md
  26. 37
      docs/de/docs/advanced/events.md
  27. 53
      docs/de/docs/advanced/generate-clients.md
  28. 5
      docs/de/docs/advanced/index.md
  29. 12
      docs/de/docs/advanced/middleware.md
  30. 33
      docs/de/docs/advanced/openapi-callbacks.md
  31. 12
      docs/de/docs/advanced/openapi-webhooks.md
  32. 76
      docs/de/docs/advanced/path-operation-advanced-configuration.md
  33. 2
      docs/de/docs/advanced/response-change-status-code.md
  34. 14
      docs/de/docs/advanced/response-cookies.md
  35. 14
      docs/de/docs/advanced/response-directly.md
  36. 9
      docs/de/docs/advanced/response-headers.md
  37. 69
      docs/de/docs/advanced/security/http-basic-auth.md
  38. 5
      docs/de/docs/advanced/security/index.md
  39. 442
      docs/de/docs/advanced/security/oauth2-scopes.md
  40. 181
      docs/de/docs/advanced/settings.md
  41. 6
      docs/de/docs/advanced/sub-applications.md
  42. 23
      docs/de/docs/advanced/templates.md
  43. 50
      docs/de/docs/advanced/testing-dependencies.md
  44. 2
      docs/de/docs/advanced/testing-events.md
  45. 7
      docs/de/docs/advanced/testing-websockets.md
  46. 12
      docs/de/docs/advanced/using-request-directly.md
  47. 78
      docs/de/docs/advanced/websockets.md
  48. 2
      docs/de/docs/advanced/wsgi.md
  49. 121
      docs/de/docs/alternatives.md
  50. 20
      docs/de/docs/async.md
  51. 65
      docs/de/docs/contributing.md
  52. 20
      docs/de/docs/deployment/concepts.md
  53. 55
      docs/de/docs/deployment/docker.md
  54. 15
      docs/de/docs/deployment/https.md
  55. 26
      docs/de/docs/deployment/manually.md
  56. 5
      docs/de/docs/deployment/server-workers.md
  57. 10
      docs/de/docs/deployment/versions.md
  58. 36
      docs/de/docs/external-links.md
  59. 176
      docs/de/docs/fastapi-people.md
  60. 7
      docs/de/docs/features.md
  61. 10
      docs/de/docs/help-fastapi.md
  62. 2
      docs/de/docs/how-to/conditional-openapi.md
  63. 12
      docs/de/docs/how-to/configure-swagger-ui.md
  64. 24
      docs/de/docs/how-to/custom-docs-ui-assets.md
  65. 32
      docs/de/docs/how-to/custom-request-and-route.md
  66. 15
      docs/de/docs/how-to/extending-openapi.md
  67. 12
      docs/de/docs/how-to/graphql.md
  68. 5
      docs/de/docs/how-to/index.md
  69. 89
      docs/de/docs/how-to/separate-openapi-schemas.md
  70. 2
      docs/de/docs/index.md
  71. 5
      docs/de/docs/newsletter.md
  72. 167
      docs/de/docs/python-types.md
  73. 24
      docs/de/docs/reference/apirouter.md
  74. 11
      docs/de/docs/reference/background.md
  75. 29
      docs/de/docs/reference/dependencies.md
  76. 3
      docs/de/docs/reference/encoders.md
  77. 20
      docs/de/docs/reference/exceptions.md
  78. 31
      docs/de/docs/reference/fastapi.md
  79. 11
      docs/de/docs/reference/httpconnection.md
  80. 8
      docs/de/docs/reference/index.md
  81. 45
      docs/de/docs/reference/middleware.md
  82. 11
      docs/de/docs/reference/openapi/docs.md
  83. 5
      docs/de/docs/reference/openapi/index.md
  84. 5
      docs/de/docs/reference/openapi/models.md
  85. 35
      docs/de/docs/reference/parameters.md
  86. 14
      docs/de/docs/reference/request.md
  87. 13
      docs/de/docs/reference/response.md
  88. 164
      docs/de/docs/reference/responses.md
  89. 73
      docs/de/docs/reference/security/index.md
  90. 13
      docs/de/docs/reference/staticfiles.md
  91. 36
      docs/de/docs/reference/status.md
  92. 13
      docs/de/docs/reference/templating.md
  93. 13
      docs/de/docs/reference/testclient.md
  94. 22
      docs/de/docs/reference/uploadfile.md
  95. 64
      docs/de/docs/reference/websockets.md
  96. 46
      docs/de/docs/tutorial/background-tasks.md
  97. 117
      docs/de/docs/tutorial/bigger-applications.md
  98. 100
      docs/de/docs/tutorial/body-fields.md
  99. 187
      docs/de/docs/tutorial/body-multiple-params.md
  100. 179
      docs/de/docs/tutorial/body-nested-models.md

6
.github/actions/people/app/main.py

@ -515,9 +515,9 @@ def get_individual_sponsors(settings: Settings):
tiers: DefaultDict[float, Dict[str, SponsorEntity]] = defaultdict(dict) tiers: DefaultDict[float, Dict[str, SponsorEntity]] = defaultdict(dict)
for node in nodes: for node in nodes:
tiers[node.tier.monthlyPriceInDollars][ tiers[node.tier.monthlyPriceInDollars][node.sponsorEntity.login] = (
node.sponsorEntity.login node.sponsorEntity
] = node.sponsorEntity )
return tiers return tiers

38
.github/labeler.yml

@ -0,0 +1,38 @@
docs:
- all:
- changed-files:
- any-glob-to-any-file:
- docs/en/docs/**
- docs_src/**
- all-globs-to-all-files:
- '!fastapi/**'
- '!pyproject.toml'
- '!docs/en/data/sponsors.yml'
- '!docs/en/overrides/main.html'
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
- docs/en/data/sponsors.yml
- docs/en/overrides/main.html
- all-globs-to-all-files:
- '!docs/*/docs/**'
- '!fastapi/**'
- '!pyproject.toml'

18
.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/[email protected]
with:
project-url: https://github.com/orgs/fastapi/projects/2
github-token: ${{ secrets.PROJECTS_TOKEN }}

24
.github/workflows/build-docs.yml

@ -18,7 +18,7 @@ jobs:
docs: ${{ steps.filter.outputs.docs }} docs: ${{ steps.filter.outputs.docs }}
steps: steps:
- uses: actions/checkout@v4 - 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 - uses: dorny/paths-filter@v3
id: filter id: filter
with: with:
@ -28,9 +28,12 @@ jobs:
- docs/** - docs/**
- docs_src/** - docs_src/**
- requirements-docs.txt - requirements-docs.txt
- requirements-docs-insiders.txt
- pyproject.toml - pyproject.toml
- mkdocs.yml - mkdocs.yml
- mkdocs.insiders.yml - mkdocs.insiders.yml
- mkdocs.maybe-insiders.yml
- mkdocs.no-insiders.yml
- .github/workflows/build-docs.yml - .github/workflows/build-docs.yml
- .github/workflows/deploy-docs.yml - .github/workflows/deploy-docs.yml
langs: langs:
@ -49,17 +52,16 @@ jobs:
id: cache id: cache
with: with:
path: ${{ env.pythonLocation }} 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 - name: Install docs extras
if: steps.cache.outputs.cache-hit != 'true' if: steps.cache.outputs.cache-hit != 'true'
run: pip install -r requirements-docs.txt 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 # Install MkDocs Material Insiders here just to put it in the cache for the rest of the steps
- name: Install Material for MkDocs Insiders - name: Install Material for MkDocs Insiders
if: ( github.event_name != 'pull_request' || github.secret_source == 'Actions' ) && steps.cache.outputs.cache-hit != 'true' if: ( github.event_name != 'pull_request' || github.secret_source == 'Actions' ) && steps.cache.outputs.cache-hit != 'true'
run: | run: pip install -r requirements-docs-insiders.txt
pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/squidfunk/mkdocs-material-insiders.git env:
pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/pawamoy-insiders/griffe-typing-deprecated.git TOKEN: ${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}
pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/pawamoy-insiders/mkdocstrings-python.git
- name: Verify Docs - name: Verify Docs
run: python ./scripts/docs.py verify-docs run: python ./scripts/docs.py verify-docs
- name: Export Language Codes - name: Export Language Codes
@ -90,16 +92,15 @@ jobs:
id: cache id: cache
with: with:
path: ${{ env.pythonLocation }} 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 - name: Install docs extras
if: steps.cache.outputs.cache-hit != 'true' if: steps.cache.outputs.cache-hit != 'true'
run: pip install -r requirements-docs.txt run: pip install -r requirements-docs.txt
- name: Install Material for MkDocs Insiders - name: Install Material for MkDocs Insiders
if: ( github.event_name != 'pull_request' || github.secret_source == 'Actions' ) && steps.cache.outputs.cache-hit != 'true' if: ( github.event_name != 'pull_request' || github.secret_source == 'Actions' ) && steps.cache.outputs.cache-hit != 'true'
run: | run: pip install -r requirements-docs-insiders.txt
pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/squidfunk/mkdocs-material-insiders.git env:
pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/pawamoy-insiders/griffe-typing-deprecated.git TOKEN: ${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}
pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/pawamoy-insiders/mkdocstrings-python.git
- name: Update Languages - name: Update Languages
run: python ./scripts/docs.py update-languages run: python ./scripts/docs.py update-languages
- uses: actions/cache@v4 - uses: actions/cache@v4
@ -112,6 +113,7 @@ jobs:
with: with:
name: docs-site-${{ matrix.lang }} name: docs-site-${{ matrix.lang }}
path: ./site/** path: ./site/**
include-hidden-files: true
# https://github.com/marketplace/actions/alls-green#why # https://github.com/marketplace/actions/alls-green#why
docs-all-green: # This job does nothing and is only used for the branch protection docs-all-green: # This job does nothing and is only used for the branch protection

49
.github/workflows/deploy-docs.yml

@ -10,6 +10,7 @@ permissions:
deployments: write deployments: write
issues: write issues: write
pull-requests: write pull-requests: write
statuses: write
jobs: jobs:
deploy-docs: deploy-docs:
@ -20,6 +21,25 @@ jobs:
GITHUB_CONTEXT: ${{ toJson(github) }} GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT" run: echo "$GITHUB_CONTEXT"
- uses: actions/checkout@v4 - 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 - name: Clean site
run: | run: |
rm -rf ./site rm -rf ./site
@ -35,30 +55,19 @@ jobs:
# hashFiles returns an empty string if there are no files # hashFiles returns an empty string if there are no files
if: hashFiles('./site/*') if: hashFiles('./site/*')
id: deploy id: deploy
uses: cloudflare/pages-action@v1 env:
PROJECT_NAME: fastapitiangolo
BRANCH: ${{ ( github.event.workflow_run.head_repository.full_name == github.repository && github.event.workflow_run.head_branch == 'master' && 'main' ) || ( github.event.workflow_run.head_sha ) }}
uses: cloudflare/wrangler-action@v3
with: with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
projectName: fastapitiangolo command: pages deploy ./site --project-name=${{ env.PROJECT_NAME }} --branch=${{ env.BRANCH }}
directory: './site'
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: 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: Comment Deploy - name: Comment Deploy
if: steps.deploy.outputs.url != '' run: python ./scripts/deploy_docs_status.py
run: python ./scripts/comment_docs_deploy_url_in_pr.py
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DEPLOY_URL: ${{ steps.deploy.outputs.url }} DEPLOY_URL: ${{ steps.deploy.outputs.deployment-url }}
COMMIT_SHA: ${{ github.event.workflow_run.head_sha }} COMMIT_SHA: ${{ github.event.workflow_run.head_sha }}
RUN_ID: ${{ github.run_id }}
IS_DONE: "true"

9
.github/workflows/issue-manager.yml

@ -2,7 +2,7 @@ name: Issue Manager
on: on:
schedule: schedule:
- cron: "10 3 * * *" - cron: "13 22 * * *"
issue_comment: issue_comment:
types: types:
- created - created
@ -16,6 +16,7 @@ on:
permissions: permissions:
issues: write issues: write
pull-requests: write
jobs: jobs:
issue-manager: issue-manager:
@ -26,7 +27,7 @@ jobs:
env: env:
GITHUB_CONTEXT: ${{ toJson(github) }} GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT" run: echo "$GITHUB_CONTEXT"
- uses: tiangolo/[email protected].0 - uses: tiangolo/[email protected].1
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
config: > config: >
@ -35,8 +36,8 @@ jobs:
"delay": 864000, "delay": 864000,
"message": "Assuming the original need was handled, this will be automatically closed now. But feel free to add more comments or create new issues or PRs." "message": "Assuming the original need was handled, this will be automatically closed now. But feel free to add more comments or create new issues or PRs."
}, },
"changes-requested": { "waiting": {
"delay": 2628000, "delay": 2628000,
"message": "As this PR had requested changes to be applied but has been inactive for a while, it's now going to be closed. But if there's anyone interested, feel free to create a new PR." "message": "As this PR has been waiting for the original user for a while but seems to be inactive, it's now going to be closed. But if there's anyone interested, feel free to create a new PR."
} }
} }

33
.github/workflows/labeler.yml

@ -0,0 +1,33 @@
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
if: ${{ github.event.action != 'labeled' && github.event.action != 'unlabeled' }}
- run: echo "Done adding labels"
# 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 }}

3
.github/workflows/latest-changes.yml

@ -34,8 +34,7 @@ jobs:
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }} if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }}
with: with:
limit-access-to-actor: true limit-access-to-actor: true
- uses: docker://tiangolo/latest-changes:0.3.0 - uses: tiangolo/[email protected]
# - uses: tiangolo/latest-changes@main
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
latest_changes_file: docs/en/docs/release-notes.md latest_changes_file: docs/en/docs/release-notes.md

2
.github/workflows/publish.yml

@ -35,7 +35,7 @@ jobs:
TIANGOLO_BUILD_PACKAGE: ${{ matrix.package }} TIANGOLO_BUILD_PACKAGE: ${{ matrix.package }}
run: python -m build run: python -m build
- name: Publish - name: Publish
uses: pypa/gh-action-pypi-publish@v1.8.14 uses: pypa/gh-action-pypi-publish@v1.10.3
- name: Dump GitHub context - name: Dump GitHub context
env: env:
GITHUB_CONTEXT: ${{ toJson(github) }} GITHUB_CONTEXT: ${{ toJson(github) }}

12
.github/workflows/test-redistribute.yml

@ -55,3 +55,15 @@ jobs:
env: env:
GITHUB_CONTEXT: ${{ toJson(github) }} GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT" 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) }}

8
.github/workflows/test.yml

@ -37,7 +37,7 @@ jobs:
if: steps.cache.outputs.cache-hit != 'true' if: steps.cache.outputs.cache-hit != 'true'
run: pip install -r requirements-tests.txt run: pip install -r requirements-tests.txt
- name: Install Pydantic v2 - name: Install Pydantic v2
run: pip install "pydantic>=2.0.2,<3.0.0" run: pip install --upgrade "pydantic>=2.0.2,<3.0.0"
- name: Lint - name: Lint
run: bash scripts/lint.sh run: bash scripts/lint.sh
@ -79,7 +79,7 @@ jobs:
run: pip install "pydantic>=1.10.0,<2.0.0" run: pip install "pydantic>=1.10.0,<2.0.0"
- name: Install Pydantic v2 - name: Install Pydantic v2
if: matrix.pydantic-version == 'pydantic-v2' if: matrix.pydantic-version == 'pydantic-v2'
run: pip install "pydantic>=2.0.2,<3.0.0" run: pip install --upgrade "pydantic>=2.0.2,<3.0.0"
- run: mkdir coverage - run: mkdir coverage
- name: Test - name: Test
run: bash scripts/test.sh run: bash scripts/test.sh
@ -91,6 +91,7 @@ jobs:
with: with:
name: coverage-${{ matrix.python-version }}-${{ matrix.pydantic-version }} name: coverage-${{ matrix.python-version }}-${{ matrix.pydantic-version }}
path: coverage path: coverage
include-hidden-files: true
coverage-combine: coverage-combine:
needs: [test] needs: [test]
@ -117,12 +118,13 @@ jobs:
- run: ls -la coverage - run: ls -la coverage
- run: coverage combine coverage - run: coverage combine coverage
- run: coverage report - 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 - name: Store coverage HTML
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: coverage-html name: coverage-html
path: htmlcov path: htmlcov
include-hidden-files: true
# https://github.com/marketplace/actions/alls-green#why # https://github.com/marketplace/actions/alls-green#why
check: # This job does nothing and is only used for the branch protection check: # This job does nothing and is only used for the branch protection

2
.gitignore

@ -7,7 +7,7 @@ __pycache__
htmlcov htmlcov
dist dist
site site
.coverage .coverage*
coverage.xml coverage.xml
.netlify .netlify
test.db test.db

6
.pre-commit-config.yaml

@ -4,7 +4,7 @@ default_language_version:
python: python3.10 python: python3.10
repos: repos:
- repo: https://github.com/pre-commit/pre-commit-hooks - repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.4.0 rev: v5.0.0
hooks: hooks:
- id: check-added-large-files - id: check-added-large-files
- id: check-toml - id: check-toml
@ -13,8 +13,8 @@ repos:
- --unsafe - --unsafe
- id: end-of-file-fixer - id: end-of-file-fixer
- id: trailing-whitespace - id: trailing-whitespace
- repo: https://github.com/charliermarsh/ruff-pre-commit - repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.2.0 rev: v0.6.9
hooks: hooks:
- id: ruff - id: ruff
args: args:

10
README.md

@ -52,11 +52,9 @@ The key features are:
<a href="https://bump.sh/fastapi?utm_source=fastapi&utm_medium=referral&utm_campaign=sponsor" target="_blank" title="Automate FastAPI documentation generation with Bump.sh"><img src="https://fastapi.tiangolo.com/img/sponsors/bump-sh.svg"></a> <a href="https://bump.sh/fastapi?utm_source=fastapi&utm_medium=referral&utm_campaign=sponsor" target="_blank" title="Automate FastAPI documentation generation with Bump.sh"><img src="https://fastapi.tiangolo.com/img/sponsors/bump-sh.svg"></a>
<a href="https://github.com/scalar/scalar/?utm_source=fastapi&utm_medium=website&utm_campaign=main-badge" target="_blank" title="Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files"><img src="https://fastapi.tiangolo.com/img/sponsors/scalar.svg"></a> <a href="https://github.com/scalar/scalar/?utm_source=fastapi&utm_medium=website&utm_campaign=main-badge" target="_blank" title="Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files"><img src="https://fastapi.tiangolo.com/img/sponsors/scalar.svg"></a>
<a href="https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=mainbadge" target="_blank" title="Auth, user management and more for your B2B product"><img src="https://fastapi.tiangolo.com/img/sponsors/propelauth.png"></a> <a href="https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=mainbadge" target="_blank" title="Auth, user management and more for your B2B product"><img src="https://fastapi.tiangolo.com/img/sponsors/propelauth.png"></a>
<a href="https://docs.withcoherence.com/configuration/frameworks/?utm_medium=advertising&utm_source=fastapi&utm_campaign=docs#fastapi-example" target="_blank" title="Coherence"><img src="https://fastapi.tiangolo.com/img/sponsors/coherence.png"></a> <a href="https://www.withcoherence.com/?utm_medium=advertising&utm_source=fastapi&utm_campaign=website" target="_blank" title="Coherence"><img src="https://fastapi.tiangolo.com/img/sponsors/coherence.png"></a>
<a href="https://www.mongodb.com/developer/languages/python/python-quickstart-fastapi/?utm_campaign=fastapi_framework&utm_source=fastapi_sponsorship&utm_medium=web_referral" target="_blank" title="Simplify Full Stack Development with FastAPI & MongoDB"><img src="https://fastapi.tiangolo.com/img/sponsors/mongodb.png"></a> <a href="https://www.mongodb.com/developer/languages/python/python-quickstart-fastapi/?utm_campaign=fastapi_framework&utm_source=fastapi_sponsorship&utm_medium=web_referral" target="_blank" title="Simplify Full Stack Development with FastAPI & MongoDB"><img src="https://fastapi.tiangolo.com/img/sponsors/mongodb.png"></a>
<a href="https://konghq.com/products/kong-konnect?utm_medium=referral&utm_source=github&utm_campaign=platform&utm_content=fast-api" target="_blank" title="Kong Konnect - API management platform"><img src="https://fastapi.tiangolo.com/img/sponsors/kong.png"></a>
<a href="https://zuplo.link/fastapi-gh" target="_blank" title="Zuplo: Scale, Protect, Document, and Monetize your FastAPI"><img src="https://fastapi.tiangolo.com/img/sponsors/zuplo.png"></a> <a href="https://zuplo.link/fastapi-gh" target="_blank" title="Zuplo: Scale, Protect, Document, and Monetize your FastAPI"><img src="https://fastapi.tiangolo.com/img/sponsors/zuplo.png"></a>
<a href="https://fine.dev?ref=fastapibadge" target="_blank" title="Fine's AI FastAPI Workflow: Effortlessly Deploy and Integrate FastAPI into Your Project"><img src="https://fastapi.tiangolo.com/img/sponsors/fine.png"></a>
<a href="https://liblab.com?utm_source=fastapi" target="_blank" title="liblab - Generate SDKs from FastAPI"><img src="https://fastapi.tiangolo.com/img/sponsors/liblab.png"></a> <a href="https://liblab.com?utm_source=fastapi" target="_blank" title="liblab - Generate SDKs from FastAPI"><img src="https://fastapi.tiangolo.com/img/sponsors/liblab.png"></a>
<a href="https://github.com/deepset-ai/haystack/" target="_blank" title="Build powerful search from composable, open source building blocks"><img src="https://fastapi.tiangolo.com/img/sponsors/haystack-fastapi.svg"></a> <a href="https://github.com/deepset-ai/haystack/" target="_blank" title="Build powerful search from composable, open source building blocks"><img src="https://fastapi.tiangolo.com/img/sponsors/haystack-fastapi.svg"></a>
<a href="https://databento.com/" target="_blank" title="Pay as you go for market data"><img src="https://fastapi.tiangolo.com/img/sponsors/databento.svg"></a> <a href="https://databento.com/" target="_blank" title="Pay as you go for market data"><img src="https://fastapi.tiangolo.com/img/sponsors/databento.svg"></a>
@ -132,6 +130,8 @@ FastAPI stands on the shoulders of giants:
## Installation ## Installation
Create and activate a <a href="https://fastapi.tiangolo.com/virtual-environments/" class="external-link" target="_blank">virtual environment</a> and then install FastAPI:
<div class="termy"> <div class="termy">
```console ```console
@ -392,7 +392,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. * 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. * 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`). * 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 `name` that should be a `str`.
* Check that it has a required attribute `price` that has to be a `float`. * 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. * Check that it has an optional attribute `is_offer`, that should be a `bool`, if present.
@ -462,7 +462,7 @@ When you install FastAPI with `pip install "fastapi[standard]"` it comes the `st
Used by Pydantic: Used by Pydantic:
* <a href="https://github.com/JoshData/python-email-validator" target="_blank"><code>email_validator</code></a> - for email validation. * <a href="https://github.com/JoshData/python-email-validator" target="_blank"><code>email-validator</code></a> - for email validation.
Used by Starlette: Used by Starlette:

185
docs/az/docs/fastapi-people.md

@ -1,185 +0,0 @@
---
hide:
- navigation
---
# FastAPI İnsanlar
FastAPI-ın bütün mənşəli insanları qəbul edən heyrətamiz icması var.
## Yaradıcı - İcraçı
Salam! 👋
Bu mənəm:
{% if people %}
<div class="user-list user-list-center">
{% for user in people.maintainers %}
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Cavablar: {{ user.answers }}</div><div class="count">Pull Request-lər: {{ user.prs }}</div></div>
{% endfor %}
</div>
{% endif %}
Mən **FastAPI**-ın yaradıcısı və icraçısıyam. Əlavə məlumat almaq üçün [Yardım FastAPI - Yardım alın - Müəlliflə əlaqə qurun](help-fastapi.md#connect-with-the-author){.internal-link target=_blank} səhifəsinə baxa bilərsiniz.
...Burada isə sizə icmanı göstərmək istəyirəm.
---
**FastAPI** icmadan çoxlu dəstək alır və mən onların əməyini vurğulamaq istəyirəm.
Bu insanlar:
* [GitHub-da başqalarının suallarına kömək edirlər](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank}.
* [Pull Request-lər yaradırlar](help-fastapi.md#create-a-pull-request){.internal-link target=_blank}.
* Pull Request-ləri ([xüsusilə tərcümələr üçün vacib olan](contributing.md#translations){.internal-link target=_blank}.) nəzərdən keçirirlər.
Bu insanlara təşəkkür edirəm. 👏 🙇
## Keçən ayın ən fəal istifadəçiləri
Bu istifadəçilər keçən ay [GitHub-da başqalarının suallarına](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank} ən çox kömək edənlərdir. ☕
{% if people %}
<div class="user-list user-list-center">
{% for user in people.last_month_experts[:10] %}
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Cavablandırılmış suallar: {{ user.count }}</div></div>
{% endfor %}
</div>
{% endif %}
## Mütəxəssislər
Burada **FastAPI Mütəxəssisləri** var. 🤓
Bu istifadəçilər indiyə qədər [GitHub-da başqalarının suallarına](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank} ən çox kömək edənlərdir.
Onlar bir çox insanlara kömək edərək mütəxəssis olduqlarını sübut ediblər. ✨
{% if people %}
<div class="user-list user-list-center">
{% for user in people.experts[:50] %}
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Cavablandırılmış suallar: {{ user.count }}</div></div>
{% endfor %}
</div>
{% endif %}
## Ən yaxşı əməkdaşlar
Burada **Ən yaxşı əməkdaşlar** var. 👷
Bu istifadəçilərin ən çox *birləşdirilmiş* [Pull Request-ləri var](help-fastapi.md#create-a-pull-request){.internal-link target=_blank}.
Onlar mənbə kodu, sənədləmə, tərcümələr və s. barədə əmək göstərmişlər. 📦
{% if people %}
<div class="user-list user-list-center">
{% for user in people.top_contributors[:50] %}
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Pull Request-lər: {{ user.count }}</div></div>
{% endfor %}
</div>
{% endif %}
Bundan başqa bir neçə (yüzdən çox) əməkdaş var ki, onları <a href="https://github.com/fastapi/fastapi/graphs/contributors" class="external-link" target="_blank">FastAPI GitHub Əməkdaşlar səhifəsində</a> görə bilərsiniz. 👷
## Ən çox rəy verənlər
Bu istifadəçilər **ən çox rəy verənlər**dir.
### Tərcümələr üçün rəylər
Mən yalnız bir neçə dildə danışıram (və çox da yaxşı deyil 😅). Bu səbəbdən, rəy verənlər sənədlərin [**tərcümələrini təsdiqləmək üçün gücə malik olanlar**](contributing.md#translations){.internal-link target=_blank}dır. Onlar olmadan, bir çox dilə tərcümə olunmuş sənədlər olmazdı.
---
Başqalarının Pull Request-lərinə **Ən çox rəy verənlər** 🕵️ kodun, sənədlərin və xüsusilə də **tərcümələrin** keyfiyyətini təmin edirlər.
{% if people %}
<div class="user-list user-list-center">
{% for user in people.top_translations_reviewers[:50] %}
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Rəylər: {{ user.count }}</div></div>
{% endfor %}
</div>
{% endif %}
## Sponsorlar
Bunlar **Sponsorlar**dır. 😎
Onlar mənim **FastAPI** (və digər) işlərimi əsasən <a href="https://github.com/sponsors/tiangolo" class="external-link" target="_blank">GitHub Sponsorlar</a> vasitəsilə dəstəkləyirlər.
{% if sponsors %}
{% if sponsors.gold %}
### Qızıl Sponsorlar
{% for sponsor in sponsors.gold -%}
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
{% endfor %}
{% endif %}
{% if sponsors.silver %}
### Gümüş Sponsorlar
{% for sponsor in sponsors.silver -%}
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
{% endfor %}
{% endif %}
{% if sponsors.bronze %}
### Bürünc Sponsorlar
{% for sponsor in sponsors.bronze -%}
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
{% endfor %}
{% endif %}
{% endif %}
### Fərdi Sponsorlar
{% if github_sponsors %}
{% for group in github_sponsors.sponsors %}
<div class="user-list user-list-center">
{% for user in group %}
{% if user.login not in sponsors_badge.logins %}
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a></div>
{% endif %}
{% endfor %}
</div>
{% endfor %}
{% endif %}
## Məlumatlar haqqında - texniki detallar
Bu səhifənin əsas məqsədi, icmanın başqalarına kömək etmək üçün göstərdiyi əməyi vurğulamaqdır.
Xüsusilə də normalda daha az görünən və bir çox hallarda daha çətin olan, başqalarının suallarına kömək etmək və tərcümələrlə bağlı Pull Request-lərə rəy vermək kimi səy göstərmək.
Bu səhifənin məlumatları hər ay hesablanır və siz <a href="https://github.com/fastapi/fastapi/blob/master/.github/actions/people/app/main.py" class="external-link" target="_blank">buradan mənbə kodunu</a> oxuya bilərsiniz.
Burada sponsorların əməyini də vurğulamaq istəyirəm.
Mən həmçinin alqoritmi, bölmələri, eşikləri və s. yeniləmək hüququnu da qoruyuram (hər ehtimala qarşı 🤷).

2
docs/az/docs/index.md

@ -442,7 +442,7 @@ Müstəqil TechEmpower meyarları göstərir ki, Uvicorn üzərində işləyən
Pydantic tərəfindən istifadə olunanlar: Pydantic tərəfindən istifadə olunanlar:
* <a href="https://github.com/JoshData/python-email-validator" target="_blank"><code>email_validator</code></a> - e-poçtun yoxlanılması üçün. * <a href="https://github.com/JoshData/python-email-validator" target="_blank"><code>email-validator</code></a> - e-poçtun yoxlanılması üçün.
* <a href="https://docs.pydantic.dev/latest/usage/pydantic_settings/" target="_blank"><code>pydantic-settings</code></a> - parametrlərin idarə edilməsi üçün. * <a href="https://docs.pydantic.dev/latest/usage/pydantic_settings/" target="_blank"><code>pydantic-settings</code></a> - parametrlərin idarə edilməsi üçün.
* <a href="https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/" target="_blank"><code>pydantic-extra-types</code></a> - Pydantic ilə istifadə edilə bilən əlavə tiplər üçün. * <a href="https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/" target="_blank"><code>pydantic-extra-types</code></a> - Pydantic ilə istifadə edilə bilən əlavə tiplər üçün.

2
docs/bn/docs/index.md

@ -439,7 +439,7 @@ item: Item
Pydantic দ্বারা ব্যবহৃত: Pydantic দ্বারা ব্যবহৃত:
- <a href="https://github.com/JoshData/python-email-validator" target="_blank"><code>email_validator</code></a> - ইমেল যাচাইকরণের জন্য। - <a href="https://github.com/JoshData/python-email-validator" target="_blank"><code>email-validator</code></a> - ইমেল যাচাইকরণের জন্য।
স্টারলেট দ্বারা ব্যবহৃত: স্টারলেট দ্বারা ব্যবহৃত:

167
docs/bn/docs/python-types.md

@ -12,15 +12,18 @@ Python-এ ঐচ্ছিক "টাইপ হিন্ট" (যা "টাই
তবে, আপনি যদি কখনো **FastAPI** ব্যবহার নাও করেন, তবুও এগুলি সম্পর্কে একটু শেখা আপনার উপকারে আসবে। তবে, আপনি যদি কখনো **FastAPI** ব্যবহার নাও করেন, তবুও এগুলি সম্পর্কে একটু শেখা আপনার উপকারে আসবে।
!!! Note /// note
যদি আপনি একজন Python বিশেষজ্ঞ হন, এবং টাইপ হিন্ট সম্পর্কে সবকিছু জানেন, তাহলে পরবর্তী অধ্যায়ে চলে যান। যদি আপনি একজন Python বিশেষজ্ঞ হন, এবং টাইপ হিন্ট সম্পর্কে সবকিছু জানেন, তাহলে পরবর্তী অধ্যায়ে চলে যান।
///
## প্রেরণা ## প্রেরণা
চলুন একটি সাধারণ উদাহরণ দিয়ে শুরু করি: চলুন একটি সাধারণ উদাহরণ দিয়ে শুরু করি:
```Python ```Python
{!../../../docs_src/python_types/tutorial001.py!} {!../../docs_src/python_types/tutorial001.py!}
``` ```
এই প্রোগ্রামটি কল করলে আউটপুট হয়: এই প্রোগ্রামটি কল করলে আউটপুট হয়:
@ -36,7 +39,7 @@ John Doe
* তাদেরকে মাঝখানে একটি স্পেস দিয়ে <abbr title="একটার পরে একটা একত্রিত করা">concatenate</abbr> করে। * তাদেরকে মাঝখানে একটি স্পেস দিয়ে <abbr title="একটার পরে একটা একত্রিত করা">concatenate</abbr> করে।
```Python hl_lines="2" ```Python hl_lines="2"
{!../../../docs_src/python_types/tutorial001.py!} {!../../docs_src/python_types/tutorial001.py!}
``` ```
### এটি সম্পাদনা করুন ### এটি সম্পাদনা করুন
@ -80,7 +83,7 @@ John Doe
এগুলিই "টাইপ হিন্ট": এগুলিই "টাইপ হিন্ট":
```Python hl_lines="1" ```Python hl_lines="1"
{!../../../docs_src/python_types/tutorial002.py!} {!../../docs_src/python_types/tutorial002.py!}
``` ```
এটি ডিফল্ট ভ্যালু ঘোষণা করার মত নয় যেমন: এটি ডিফল্ট ভ্যালু ঘোষণা করার মত নয় যেমন:
@ -110,7 +113,7 @@ John Doe
এই ফাংশনটি দেখুন, এটিতে ইতিমধ্যে টাইপ হিন্ট রয়েছে: এই ফাংশনটি দেখুন, এটিতে ইতিমধ্যে টাইপ হিন্ট রয়েছে:
```Python hl_lines="1" ```Python hl_lines="1"
{!../../../docs_src/python_types/tutorial003.py!} {!../../docs_src/python_types/tutorial003.py!}
``` ```
এডিটর ভেরিয়েবলগুলির টাইপ জানার কারণে, আপনি শুধুমাত্র অটোকমপ্লিশনই পান না, আপনি এরর চেকও পান: এডিটর ভেরিয়েবলগুলির টাইপ জানার কারণে, আপনি শুধুমাত্র অটোকমপ্লিশনই পান না, আপনি এরর চেকও পান:
@ -120,7 +123,7 @@ John Doe
এখন আপনি জানেন যে আপনাকে এটি ঠিক করতে হবে, `age`-কে একটি স্ট্রিং হিসেবে রূপান্তর করতে `str(age)` ব্যবহার করতে হবে: এখন আপনি জানেন যে আপনাকে এটি ঠিক করতে হবে, `age`-কে একটি স্ট্রিং হিসেবে রূপান্তর করতে `str(age)` ব্যবহার করতে হবে:
```Python hl_lines="2" ```Python hl_lines="2"
{!../../../docs_src/python_types/tutorial004.py!} {!../../docs_src/python_types/tutorial004.py!}
``` ```
## টাইপ ঘোষণা ## টাইপ ঘোষণা
@ -141,7 +144,7 @@ John Doe
* `bytes` * `bytes`
```Python hl_lines="1" ```Python hl_lines="1"
{!../../../docs_src/python_types/tutorial005.py!} {!../../docs_src/python_types/tutorial005.py!}
``` ```
### টাইপ প্যারামিটার সহ জেনেরিক টাইপ ### টাইপ প্যারামিটার সহ জেনেরিক টাইপ
@ -170,7 +173,7 @@ Python যত এগিয়ে যাচ্ছে, **নতুন সংস্
উদাহরণস্বরূপ, একটি ভেরিয়েবলকে `str`-এর একটি `list` হিসেবে সংজ্ঞায়িত করা যাক। উদাহরণস্বরূপ, একটি ভেরিয়েবলকে `str`-এর একটি `list` হিসেবে সংজ্ঞায়িত করা যাক।
=== "Python 3.9+" //// tab | Python 3.9+
ভেরিয়েবলটি ঘোষণা করুন, একই কোলন (`:`) সিনট্যাক্স ব্যবহার করে। ভেরিয়েবলটি ঘোষণা করুন, একই কোলন (`:`) সিনট্যাক্স ব্যবহার করে।
@ -179,15 +182,17 @@ Python যত এগিয়ে যাচ্ছে, **নতুন সংস্
যেহেতু লিস্ট এমন একটি টাইপ যা অভ্যন্তরীণ টাইপগুলি ধারণ করে, আপনি তাদের স্কোয়ার ব্রাকেটের ভিতরে ব্যবহার করুন: যেহেতু লিস্ট এমন একটি টাইপ যা অভ্যন্তরীণ টাইপগুলি ধারণ করে, আপনি তাদের স্কোয়ার ব্রাকেটের ভিতরে ব্যবহার করুন:
```Python hl_lines="1" ```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial006_py39.py!} {!> ../../docs_src/python_types/tutorial006_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
`typing` থেকে `List` (বড় হাতের `L` দিয়ে) ইমপোর্ট করুন: `typing` থেকে `List` (বড় হাতের `L` দিয়ে) ইমপোর্ট করুন:
``` Python hl_lines="1" ``` Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial006.py!} {!> ../../docs_src/python_types/tutorial006.py!}
``` ```
ভেরিয়েবলটি ঘোষণা করুন, একই কোলন (`:`) সিনট্যাক্স ব্যবহার করে। ভেরিয়েবলটি ঘোষণা করুন, একই কোলন (`:`) সিনট্যাক্স ব্যবহার করে।
@ -197,19 +202,27 @@ Python যত এগিয়ে যাচ্ছে, **নতুন সংস্
যেহেতু লিস্ট এমন একটি টাইপ যা অভ্যন্তরীণ টাইপগুলি ধারণ করে, আপনি তাদের স্কোয়ার ব্রাকেটের ভিতরে করুন: যেহেতু লিস্ট এমন একটি টাইপ যা অভ্যন্তরীণ টাইপগুলি ধারণ করে, আপনি তাদের স্কোয়ার ব্রাকেটের ভিতরে করুন:
```Python hl_lines="4" ```Python hl_lines="4"
{!> ../../../docs_src/python_types/tutorial006.py!} {!> ../../docs_src/python_types/tutorial006.py!}
``` ```
!!! Info ////
/// info
স্কোয়ার ব্রাকেট এর ভিতরে ব্যবহৃত এইসব অভন্তরীন টাইপগুলোকে "ইন্টারনাল টাইপ" বলে। স্কোয়ার ব্রাকেট এর ভিতরে ব্যবহৃত এইসব অভন্তরীন টাইপগুলোকে "ইন্টারনাল টাইপ" বলে।
এই উদাহরণে, এটি হচ্ছে `List`(অথবা পাইথন ৩.৯ বা তার উপরের সংস্করণের ক্ষেত্রে `list`) এ পাস করা টাইপ প্যারামিটার। এই উদাহরণে, এটি হচ্ছে `List`(অথবা পাইথন ৩.৯ বা তার উপরের সংস্করণের ক্ষেত্রে `list`) এ পাস করা টাইপ প্যারামিটার।
///
এর অর্থ হচ্ছে: "ভেরিয়েবল `items` একটি `list`, এবং এই লিস্টের প্রতিটি আইটেম একটি `str`।" এর অর্থ হচ্ছে: "ভেরিয়েবল `items` একটি `list`, এবং এই লিস্টের প্রতিটি আইটেম একটি `str`।"
!!! Tip /// tip
যদি আপনি Python 3.9 বা তার উপরে ব্যবহার করেন, আপনার `typing` থেকে `List` আমদানি করতে হবে না, আপনি সাধারণ `list` ওই টাইপের পরিবর্তে ব্যবহার করতে পারেন। যদি আপনি Python 3.9 বা তার উপরে ব্যবহার করেন, আপনার `typing` থেকে `List` আমদানি করতে হবে না, আপনি সাধারণ `list` ওই টাইপের পরিবর্তে ব্যবহার করতে পারেন।
///
এর মাধ্যমে, আপনার এডিটর লিস্ট থেকে আইটেম প্রসেস করার সময় সাপোর্ট প্রদান করতে পারবে: এর মাধ্যমে, আপনার এডিটর লিস্ট থেকে আইটেম প্রসেস করার সময় সাপোর্ট প্রদান করতে পারবে:
<img src="/img/python-types/image05.png"> <img src="/img/python-types/image05.png">
@ -224,18 +237,22 @@ Python যত এগিয়ে যাচ্ছে, **নতুন সংস্
আপনি `tuple` এবং `set` ঘোষণা করার জন্য একই প্রক্রিয়া অনুসরণ করবেন: আপনি `tuple` এবং `set` ঘোষণা করার জন্য একই প্রক্রিয়া অনুসরণ করবেন:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="1" ```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial007_py39.py!} {!> ../../docs_src/python_types/tutorial007_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial007.py!} {!> ../../docs_src/python_types/tutorial007.py!}
``` ```
////
এর মানে হল: এর মানে হল:
* ভেরিয়েবল `items_t` হল একটি `tuple` যা ৩টি আইটেম ধারণ করে, একটি `int`, অন্য একটি `int`, এবং একটি `str` * ভেরিয়েবল `items_t` হল একটি `tuple` যা ৩টি আইটেম ধারণ করে, একটি `int`, অন্য একটি `int`, এবং একটি `str`
@ -249,18 +266,21 @@ Python যত এগিয়ে যাচ্ছে, **নতুন সংস্
দ্বিতীয় টাইপ প্যারামিটারটি হল `dict`-এর মানগুলির জন্য: দ্বিতীয় টাইপ প্যারামিটারটি হল `dict`-এর মানগুলির জন্য:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="1" ```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial008_py39.py!} {!> ../../docs_src/python_types/tutorial008_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial008.py!} {!> ../../docs_src/python_types/tutorial008.py!}
``` ```
////
এর মানে হল: এর মানে হল:
@ -276,18 +296,22 @@ Python 3.6 এবং তার উপরের সংস্করণগুলি
Python 3.10-এ একটি **নতুন সিনট্যাক্স** আছে যেখানে আপনি সম্ভাব্য টাইপগুলিকে একটি <abbr title="উল্লম্ব বারালকে 'বিটওয়াইজ বা অপারেটর' বলা হয়, কিন্তু সেই অর্থ এখানে প্রাসঙ্গিক নয়">ভার্টিকাল বার (`|`)</abbr> দ্বারা পৃথক করতে পারেন। Python 3.10-এ একটি **নতুন সিনট্যাক্স** আছে যেখানে আপনি সম্ভাব্য টাইপগুলিকে একটি <abbr title="উল্লম্ব বারালকে 'বিটওয়াইজ বা অপারেটর' বলা হয়, কিন্তু সেই অর্থ এখানে প্রাসঙ্গিক নয়">ভার্টিকাল বার (`|`)</abbr> দ্বারা পৃথক করতে পারেন।
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="1" ```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial008b_py310.py!} {!> ../../docs_src/python_types/tutorial008b_py310.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial008b.py!} {!> ../../docs_src/python_types/tutorial008b.py!}
``` ```
////
উভয় ক্ষেত্রেই এর মানে হল যে `item` হতে পারে একটি `int` অথবা `str` উভয় ক্ষেত্রেই এর মানে হল যে `item` হতে পারে একটি `int` অথবা `str`
#### সম্ভবত `None` #### সম্ভবত `None`
@ -297,7 +321,7 @@ Python 3.10-এ একটি **নতুন সিনট্যাক্স** আ
Python 3.6 এবং তার উপরের সংস্করণগুলিতে (Python 3.10 অনতর্ভুক্ত) আপনি `typing` মডিউল থেকে `Optional` ইমপোর্ট করে এটি ঘোষণা এবং ব্যবহার করতে পারেন। Python 3.6 এবং তার উপরের সংস্করণগুলিতে (Python 3.10 অনতর্ভুক্ত) আপনি `typing` মডিউল থেকে `Optional` ইমপোর্ট করে এটি ঘোষণা এবং ব্যবহার করতে পারেন।
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!../../../docs_src/python_types/tutorial009.py!} {!../../docs_src/python_types/tutorial009.py!}
``` ```
`Optional[str]` ব্যবহার করা মানে হল শুধু `str` নয়, এটি হতে পারে `None`-ও, যা আপনার এডিটরকে সেই ত্রুটিগুলি শনাক্ত করতে সাহায্য করবে যেখানে আপনি ধরে নিচ্ছেন যে একটি মান সবসময় `str` হবে, অথচ এটি `None`-ও হতে পারেও। `Optional[str]` ব্যবহার করা মানে হল শুধু `str` নয়, এটি হতে পারে `None`-ও, যা আপনার এডিটরকে সেই ত্রুটিগুলি শনাক্ত করতে সাহায্য করবে যেখানে আপনি ধরে নিচ্ছেন যে একটি মান সবসময় `str` হবে, অথচ এটি `None`-ও হতে পারেও।
@ -306,24 +330,30 @@ Python 3.6 এবং তার উপরের সংস্করণগুলি
এর মানে হল, Python 3.10-এ, আপনি টাইপগুলির ইউনিয়ন ঘোষণা করতে `Something | None` ব্যবহার করতে পারেন: এর মানে হল, Python 3.10-এ, আপনি টাইপগুলির ইউনিয়ন ঘোষণা করতে `Something | None` ব্যবহার করতে পারেন:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="1" ```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial009_py310.py!} {!> ../../docs_src/python_types/tutorial009_py310.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial009.py!} {!> ../../docs_src/python_types/tutorial009.py!}
``` ```
=== "Python 3.8+ বিকল্প" ////
//// tab | Python 3.8+ বিকল্প
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial009b.py!} {!> ../../docs_src/python_types/tutorial009b.py!}
``` ```
////
#### `Union` বা `Optional` ব্যবহার #### `Union` বা `Optional` ব্যবহার
যদি আপনি Python 3.10-এর নীচের সংস্করণ ব্যবহার করেন, তবে এখানে আমার খুবই **ব্যক্তিগত** দৃষ্টিভঙ্গি থেকে একটি টিপস: যদি আপনি Python 3.10-এর নীচের সংস্করণ ব্যবহার করেন, তবে এখানে আমার খুবই **ব্যক্তিগত** দৃষ্টিভঙ্গি থেকে একটি টিপস:
@ -340,7 +370,7 @@ Python 3.6 এবং তার উপরের সংস্করণগুলি
একটি উদাহরণ হিসেবে, এই ফাংশনটি নিন: একটি উদাহরণ হিসেবে, এই ফাংশনটি নিন:
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!../../../docs_src/python_types/tutorial009c.py!} {!../../docs_src/python_types/tutorial009c.py!}
``` ```
`name` প্যারামিটারটি `Optional[str]` হিসেবে সংজ্ঞায়িত হয়েছে, কিন্তু এটি **অপশনাল নয়**, আপনি প্যারামিটার ছাড়া ফাংশনটি কল করতে পারবেন না: `name` প্যারামিটারটি `Optional[str]` হিসেবে সংজ্ঞায়িত হয়েছে, কিন্তু এটি **অপশনাল নয়**, আপনি প্যারামিটার ছাড়া ফাংশনটি কল করতে পারবেন না:
@ -358,7 +388,7 @@ say_hi(name=None) # এটি কাজ করে, None বৈধ 🎉
সুখবর হল, একবার আপনি Python 3.10 ব্যবহার করা শুরু করলে, আপনাকে এগুলোর ব্যাপারে আর চিন্তা করতে হবে না, যেহুতু আপনি | ব্যবহার করেই ইউনিয়ন ঘোষণা করতে পারবেন: সুখবর হল, একবার আপনি Python 3.10 ব্যবহার করা শুরু করলে, আপনাকে এগুলোর ব্যাপারে আর চিন্তা করতে হবে না, যেহুতু আপনি | ব্যবহার করেই ইউনিয়ন ঘোষণা করতে পারবেন:
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!../../../docs_src/python_types/tutorial009c_py310.py!} {!../../docs_src/python_types/tutorial009c_py310.py!}
``` ```
এবং তারপর আপনাকে নামগুলি যেমন `Optional` এবং `Union` নিয়ে আর চিন্তা করতে হবে না। 😎 এবং তারপর আপনাকে নামগুলি যেমন `Optional` এবং `Union` নিয়ে আর চিন্তা করতে হবে না। 😎
@ -367,7 +397,8 @@ say_hi(name=None) # এটি কাজ করে, None বৈধ 🎉
স্কোয়ার ব্র্যাকেটে টাইপ প্যারামিটার নেওয়া এই টাইপগুলিকে **জেনেরিক টাইপ** বা **জেনেরিকস** বলা হয়, যেমন: স্কোয়ার ব্র্যাকেটে টাইপ প্যারামিটার নেওয়া এই টাইপগুলিকে **জেনেরিক টাইপ** বা **জেনেরিকস** বলা হয়, যেমন:
=== "Python 3.10+" //// tab | Python 3.10+
আপনি সেই একই বিল্টইন টাইপ জেনেরিক্স হিসেবে ব্যবহার করতে পারবেন(ভিতরে টাইপ সহ স্কয়ারে ব্রাকেট দিয়ে): আপনি সেই একই বিল্টইন টাইপ জেনেরিক্স হিসেবে ব্যবহার করতে পারবেন(ভিতরে টাইপ সহ স্কয়ারে ব্রাকেট দিয়ে):
* `list` * `list`
@ -383,7 +414,9 @@ say_hi(name=None) # এটি কাজ করে, None বৈধ 🎉
Python 3.10-এ, `Union` এবং `Optional` জেনেরিকস ব্যবহার করার বিকল্প হিসেবে, আপনি টাইপগুলির ইউনিয়ন ঘোষণা করতে <abbr title="উল্লম্ব বারালকে 'বিটওয়াইজ বা অপারেটর' বলা হয়, কিন্তু সেই অর্থ এখানে প্রাসঙ্গিক নয়">ভার্টিকাল বার (`|`)</abbr> ব্যবহার করতে পারেন, যা ওদের থেকে অনেক ভালো এবং সহজ। Python 3.10-এ, `Union` এবং `Optional` জেনেরিকস ব্যবহার করার বিকল্প হিসেবে, আপনি টাইপগুলির ইউনিয়ন ঘোষণা করতে <abbr title="উল্লম্ব বারালকে 'বিটওয়াইজ বা অপারেটর' বলা হয়, কিন্তু সেই অর্থ এখানে প্রাসঙ্গিক নয়">ভার্টিকাল বার (`|`)</abbr> ব্যবহার করতে পারেন, যা ওদের থেকে অনেক ভালো এবং সহজ।
=== "Python 3.9+" ////
//// tab | Python 3.9+
আপনি সেই একই বিল্টইন টাইপ জেনেরিক্স হিসেবে ব্যবহার করতে পারবেন(ভিতরে টাইপ সহ স্কয়ারে ব্রাকেট দিয়ে): আপনি সেই একই বিল্টইন টাইপ জেনেরিক্স হিসেবে ব্যবহার করতে পারবেন(ভিতরে টাইপ সহ স্কয়ারে ব্রাকেট দিয়ে):
@ -398,7 +431,9 @@ say_hi(name=None) # এটি কাজ করে, None বৈধ 🎉
* `Optional` * `Optional`
* ...এবং অন্যান্য। * ...এবং অন্যান্য।
=== "Python 3.8+" ////
//// tab | Python 3.8+
* `List` * `List`
* `Tuple` * `Tuple`
@ -408,6 +443,8 @@ say_hi(name=None) # এটি কাজ করে, None বৈধ 🎉
* `Optional` * `Optional`
* ...এবং অন্যান্য। * ...এবং অন্যান্য।
////
### ক্লাস হিসেবে টাইপস ### ক্লাস হিসেবে টাইপস
আপনি একটি ভেরিয়েবলের টাইপ হিসেবে একটি ক্লাস ঘোষণা করতে পারেন। আপনি একটি ভেরিয়েবলের টাইপ হিসেবে একটি ক্লাস ঘোষণা করতে পারেন।
@ -415,13 +452,13 @@ say_hi(name=None) # এটি কাজ করে, None বৈধ 🎉
ধরুন আপনার কাছে `Person` নামে একটি ক্লাস আছে, যার একটি নাম আছে: ধরুন আপনার কাছে `Person` নামে একটি ক্লাস আছে, যার একটি নাম আছে:
```Python hl_lines="1-3" ```Python hl_lines="1-3"
{!../../../docs_src/python_types/tutorial010.py!} {!../../docs_src/python_types/tutorial010.py!}
``` ```
তারপর আপনি একটি ভেরিয়েবলকে `Person` টাইপের হিসেবে ঘোষণা করতে পারেন: তারপর আপনি একটি ভেরিয়েবলকে `Person` টাইপের হিসেবে ঘোষণা করতে পারেন:
```Python hl_lines="6" ```Python hl_lines="6"
{!../../../docs_src/python_types/tutorial010.py!} {!../../docs_src/python_types/tutorial010.py!}
``` ```
এবং তারপর, আবার, আপনি এডিটর সাপোর্ট পেয়ে যাবেন: এবং তারপর, আবার, আপনি এডিটর সাপোর্ট পেয়ে যাবেন:
@ -446,56 +483,72 @@ say_hi(name=None) # এটি কাজ করে, None বৈধ 🎉
অফিসিয়াল Pydantic ডক্স থেকে একটি উদাহরণ: অফিসিয়াল Pydantic ডক্স থেকে একটি উদাহরণ:
=== "Python 3.10+" //// tab | Python 3.10+
```Python ```Python
{!> ../../../docs_src/python_types/tutorial011_py310.py!} {!> ../../docs_src/python_types/tutorial011_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python ```Python
{!> ../../../docs_src/python_types/tutorial011_py39.py!} {!> ../../docs_src/python_types/tutorial011_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python ```Python
{!> ../../../docs_src/python_types/tutorial011.py!} {!> ../../docs_src/python_types/tutorial011.py!}
``` ```
!!! Info ////
/// info
[Pydantic সম্পর্কে আরও জানতে, এর ডকুমেন্টেশন দেখুন](https://docs.pydantic.dev/)। [Pydantic সম্পর্কে আরও জানতে, এর ডকুমেন্টেশন দেখুন](https://docs.pydantic.dev/)।
///
**FastAPI** মূলত Pydantic-এর উপর নির্মিত। **FastAPI** মূলত Pydantic-এর উপর নির্মিত।
আপনি এই সমস্ত কিছুর অনেক বাস্তবসম্মত উদাহরণ পাবেন [টিউটোরিয়াল - ইউজার গাইডে](https://fastapi.tiangolo.com/tutorial/)। আপনি এই সমস্ত কিছুর অনেক বাস্তবসম্মত উদাহরণ পাবেন [টিউটোরিয়াল - ইউজার গাইডে](https://fastapi.tiangolo.com/tutorial/)।
!!! Tip /// tip
যখন আপনি `Optional` বা `Union[Something, None]` ব্যবহার করেন এবং কোনো ডিফল্ট মান না থাকে, Pydantic-এর একটি বিশেষ আচরণ রয়েছে, আপনি Pydantic ডকুমেন্টেশনে [Required Optional fields](https://docs.pydantic.dev/latest/concepts/models/#required-optional-fields) সম্পর্কে আরও পড়তে পারেন। যখন আপনি `Optional` বা `Union[Something, None]` ব্যবহার করেন এবং কোনো ডিফল্ট মান না থাকে, Pydantic-এর একটি বিশেষ আচরণ রয়েছে, আপনি Pydantic ডকুমেন্টেশনে [Required Optional fields](https://docs.pydantic.dev/latest/concepts/models/#required-optional-fields) সম্পর্কে আরও পড়তে পারেন।
///
## মেটাডাটা অ্যানোটেশন সহ টাইপ হিন্টস ## মেটাডাটা অ্যানোটেশন সহ টাইপ হিন্টস
Python-এ এমন একটি ফিচার আছে যা `Annotated` ব্যবহার করে এই টাইপ হিন্টগুলিতে **অতিরিক্ত মেটাডাটা** রাখতে দেয়। Python-এ এমন একটি ফিচার আছে যা `Annotated` ব্যবহার করে এই টাইপ হিন্টগুলিতে **অতিরিক্ত মেটাডাটা** রাখতে দেয়।
=== "Python 3.9+" //// tab | Python 3.9+
Python 3.9-এ, `Annotated` স্ট্যান্ডার্ড লাইব্রেরিতে অন্তর্ভুক্ত, তাই আপনি এটি `typing` থেকে ইমপোর্ট করতে পারেন। Python 3.9-এ, `Annotated` স্ট্যান্ডার্ড লাইব্রেরিতে অন্তর্ভুক্ত, তাই আপনি এটি `typing` থেকে ইমপোর্ট করতে পারেন।
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial013_py39.py!} {!> ../../docs_src/python_types/tutorial013_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
Python 3.9-এর নীচের সংস্করণগুলিতে, আপনি `Annotated`-কে `typing_extensions` থেকে ইমপোর্ট করেন। Python 3.9-এর নীচের সংস্করণগুলিতে, আপনি `Annotated`-কে `typing_extensions` থেকে ইমপোর্ট করেন।
এটি **FastAPI** এর সাথে ইতিমদ্ধে ইনস্টল হয়ে থাকবে। এটি **FastAPI** এর সাথে ইতিমদ্ধে ইনস্টল হয়ে থাকবে।
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial013.py!} {!> ../../docs_src/python_types/tutorial013.py!}
``` ```
////
Python নিজে এই `Annotated` দিয়ে কিছুই করে না। এবং এডিটর এবং অন্যান্য টুলগুলির জন্য, টাইপটি এখনও `str` Python নিজে এই `Annotated` দিয়ে কিছুই করে না। এবং এডিটর এবং অন্যান্য টুলগুলির জন্য, টাইপটি এখনও `str`
কিন্তু আপনি এই `Annotated` এর মধ্যকার জায়গাটির মধ্যে **FastAPI**-এ কীভাবে আপনার অ্যাপ্লিকেশন আচরণ করুক তা সম্পর্কে অতিরিক্ত মেটাডাটা প্রদান করার জন্য ব্যবহার করতে পারেন। কিন্তু আপনি এই `Annotated` এর মধ্যকার জায়গাটির মধ্যে **FastAPI**-এ কীভাবে আপনার অ্যাপ্লিকেশন আচরণ করুক তা সম্পর্কে অতিরিক্ত মেটাডাটা প্রদান করার জন্য ব্যবহার করতে পারেন।
@ -506,11 +559,14 @@ Python নিজে এই `Annotated` দিয়ে কিছুই করে
পরবর্তীতে আপনি দেখবেন এটি কতটা **শক্তিশালী** হতে পারে। পরবর্তীতে আপনি দেখবেন এটি কতটা **শক্তিশালী** হতে পারে।
!!! Tip /// tip
এটি **স্ট্যান্ডার্ড Python** হওয়ার মানে হল আপনি আপনার এডিটরে, আপনি যে টুলগুলি কোড বিশ্লেষণ এবং রিফ্যাক্টর করার জন্য ব্যবহার করেন তাতে **সেরা সম্ভাব্য ডেভেলপার এক্সপেরিয়েন্স** পাবেন। ✨ এটি **স্ট্যান্ডার্ড Python** হওয়ার মানে হল আপনি আপনার এডিটরে, আপনি যে টুলগুলি কোড বিশ্লেষণ এবং রিফ্যাক্টর করার জন্য ব্যবহার করেন তাতে **সেরা সম্ভাব্য ডেভেলপার এক্সপেরিয়েন্স** পাবেন। ✨
এবং এছাড়াও আপনার কোড অন্যান্য অনেক Python টুল এবং লাইব্রেরিগুলির সাথে খুব সামঞ্জস্যপূর্ণ হবে। 🚀 এবং এছাড়াও আপনার কোড অন্যান্য অনেক Python টুল এবং লাইব্রেরিগুলির সাথে খুব সামঞ্জস্যপূর্ণ হবে। 🚀
///
## **FastAPI**-এ টাইপ হিন্টস ## **FastAPI**-এ টাইপ হিন্টস
**FastAPI** এই টাইপ হিন্টগুলি ব্যবহার করে বেশ কিছু জিনিস করে। **FastAPI** এই টাইপ হিন্টগুলি ব্যবহার করে বেশ কিছু জিনিস করে।
@ -533,5 +589,8 @@ Python নিজে এই `Annotated` দিয়ে কিছুই করে
গুরুত্বপূর্ণ বিষয় হল, আপনি যদি স্ট্যান্ডার্ড Python টাইপগুলি ব্যবহার করেন, তবে আরও বেশি ক্লাস, ডেকোরেটর ইত্যাদি যোগ না করেই একই স্থানে **FastAPI** আপনার অনেক কাজ করে দিবে। গুরুত্বপূর্ণ বিষয় হল, আপনি যদি স্ট্যান্ডার্ড Python টাইপগুলি ব্যবহার করেন, তবে আরও বেশি ক্লাস, ডেকোরেটর ইত্যাদি যোগ না করেই একই স্থানে **FastAPI** আপনার অনেক কাজ করে দিবে।
!!! Info /// info
যদি আপনি টিউটোরিয়ালের সমস্ত বিষয় পড়ে ফেলে থাকেন এবং টাইপ সম্পর্কে আরও জানতে চান, তবে একটি ভালো রিসোর্স হল [mypy এর "cheat sheet"](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html)। এই "cheat sheet" এ আপনি Python টাইপ হিন্ট সম্পর্কে বেসিক থেকে উন্নত লেভেলের ধারণা পেতে পারেন, যা আপনার কোডে টাইপ সেফটি এবং স্পষ্টতা বাড়াতে সাহায্য করবে। যদি আপনি টিউটোরিয়ালের সমস্ত বিষয় পড়ে ফেলে থাকেন এবং টাইপ সম্পর্কে আরও জানতে চান, তবে একটি ভালো রিসোর্স হল [mypy এর "cheat sheet"](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html)। এই "cheat sheet" এ আপনি Python টাইপ হিন্ট সম্পর্কে বেসিক থেকে উন্নত লেভেলের ধারণা পেতে পারেন, যা আপনার কোডে টাইপ সেফটি এবং স্পষ্টতা বাড়াতে সাহায্য করবে।
///

33
docs/de/docs/advanced/additional-responses.md

@ -1,10 +1,13 @@
# Zusätzliche Responses in OpenAPI # Zusätzliche Responses in OpenAPI
!!! warning "Achtung" /// warning | "Achtung"
Dies ist ein eher fortgeschrittenes Thema. Dies ist ein eher fortgeschrittenes Thema.
Wenn Sie mit **FastAPI** beginnen, benötigen Sie dies möglicherweise nicht. Wenn Sie mit **FastAPI** beginnen, benötigen Sie dies möglicherweise nicht.
///
Sie können zusätzliche Responses mit zusätzlichen Statuscodes, Medientypen, Beschreibungen, usw. deklarieren. Sie können zusätzliche Responses mit zusätzlichen Statuscodes, Medientypen, Beschreibungen, usw. deklarieren.
Diese zusätzlichen Responses werden in das OpenAPI-Schema aufgenommen, sodass sie auch in der API-Dokumentation erscheinen. Diese zusätzlichen Responses werden in das OpenAPI-Schema aufgenommen, sodass sie auch in der API-Dokumentation erscheinen.
@ -24,13 +27,17 @@ Jedes dieser Response-`dict`s kann einen Schlüssel `model` haben, welcher ein P
Um beispielsweise eine weitere Response mit dem Statuscode `404` und einem Pydantic-Modell `Message` zu deklarieren, können Sie schreiben: Um beispielsweise eine weitere Response mit dem Statuscode `404` und einem Pydantic-Modell `Message` zu deklarieren, können Sie schreiben:
```Python hl_lines="18 22" ```Python hl_lines="18 22"
{!../../../docs_src/additional_responses/tutorial001.py!} {!../../docs_src/additional_responses/tutorial001.py!}
``` ```
!!! note "Hinweis" /// note | "Hinweis"
Beachten Sie, dass Sie die `JSONResponse` direkt zurückgeben müssen. 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.
@ -42,6 +49,8 @@ Um beispielsweise eine weitere Response mit dem Statuscode `404` und einem Pydan
* Ein Schlüssel `schema`, der als Wert das JSON-Schema aus dem Modell hat, hier ist die richtige Stelle. * 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. * **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: Die generierten Responses in der OpenAPI für diese *Pfadoperation* lauten:
```JSON hl_lines="3-12" ```JSON hl_lines="3-12"
@ -169,17 +178,23 @@ Sie können denselben `responses`-Parameter verwenden, um verschiedene Medientyp
Sie können beispielsweise einen zusätzlichen Medientyp `image/png` hinzufügen und damit deklarieren, dass Ihre *Pfadoperation* ein JSON-Objekt (mit dem Medientyp `application/json`) oder ein PNG-Bild zurückgeben kann: Sie können beispielsweise einen zusätzlichen Medientyp `image/png` hinzufügen und damit deklarieren, dass Ihre *Pfadoperation* ein JSON-Objekt (mit dem Medientyp `application/json`) oder ein PNG-Bild zurückgeben kann:
```Python hl_lines="19-24 28" ```Python hl_lines="19-24 28"
{!../../../docs_src/additional_responses/tutorial002.py!} {!../../docs_src/additional_responses/tutorial002.py!}
``` ```
!!! note "Hinweis" /// note | "Hinweis"
Beachten Sie, dass Sie das Bild direkt mit einer `FileResponse` zurückgeben müssen. Beachten Sie, dass Sie das Bild direkt mit einer `FileResponse` zurückgeben müssen.
!!! info ///
/// info
Sofern Sie in Ihrem Parameter `responses` nicht explizit einen anderen Medientyp angeben, geht FastAPI davon aus, dass die Response denselben Medientyp wie die Haupt-Response-Klasse hat (Standardmäßig `application/json`). 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 ## Informationen kombinieren
Sie können auch Response-Informationen von mehreren Stellen kombinieren, einschließlich der Parameter `response_model`, `status_code` und `responses`. Sie können auch Response-Informationen von mehreren Stellen kombinieren, einschließlich der Parameter `response_model`, `status_code` und `responses`.
@ -193,7 +208,7 @@ Sie können beispielsweise eine Response mit dem Statuscode `404` deklarieren, d
Und eine Response mit dem Statuscode `200`, die Ihr `response_model` verwendet, aber ein benutzerdefiniertes Beispiel (`example`) enthält: Und eine Response mit dem Statuscode `200`, die Ihr `response_model` verwendet, aber ein benutzerdefiniertes Beispiel (`example`) enthält:
```Python hl_lines="20-31" ```Python hl_lines="20-31"
{!../../../docs_src/additional_responses/tutorial003.py!} {!../../docs_src/additional_responses/tutorial003.py!}
``` ```
Es wird alles kombiniert und in Ihre OpenAPI eingebunden und in der API-Dokumentation angezeigt: Es wird alles kombiniert und in Ihre OpenAPI eingebunden und in der API-Dokumentation angezeigt:
@ -229,7 +244,7 @@ Mit dieser Technik können Sie einige vordefinierte Responses in Ihren *Pfadoper
Zum Beispiel: Zum Beispiel:
```Python hl_lines="13-17 26" ```Python hl_lines="13-17 26"
{!../../../docs_src/additional_responses/tutorial004.py!} {!../../docs_src/additional_responses/tutorial004.py!}
``` ```
## Weitere Informationen zu OpenAPI-Responses ## Weitere Informationen zu OpenAPI-Responses

50
docs/de/docs/advanced/additional-status-codes.md

@ -14,54 +14,76 @@ 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: 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" ```Python hl_lines="4 25"
{!> ../../../docs_src/additional_status_codes/tutorial001_an_py310.py!} {!> ../../docs_src/additional_status_codes/tutorial001_an_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="4 25" ```Python hl_lines="4 25"
{!> ../../../docs_src/additional_status_codes/tutorial001_an_py39.py!} {!> ../../docs_src/additional_status_codes/tutorial001_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="4 26" ```Python hl_lines="4 26"
{!> ../../../docs_src/additional_status_codes/tutorial001_an.py!} {!> ../../docs_src/additional_status_codes/tutorial001_an.py!}
``` ```
=== "Python 3.10+ nicht annotiert" ////
//// tab | 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="2 23" ```Python hl_lines="2 23"
{!> ../../../docs_src/additional_status_codes/tutorial001_py310.py!} {!> ../../docs_src/additional_status_codes/tutorial001_py310.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="4 25" ```Python hl_lines="4 25"
{!> ../../../docs_src/additional_status_codes/tutorial001.py!} {!> ../../docs_src/additional_status_codes/tutorial001.py!}
``` ```
!!! warning "Achtung" ////
/// warning | "Achtung"
Wenn Sie eine `Response` direkt zurückgeben, wie im obigen Beispiel, wird sie direkt zurückgegeben. Wenn Sie eine `Response` direkt zurückgeben, wie im obigen Beispiel, wird sie direkt zurückgegeben.
Sie wird nicht mit einem Modell usw. serialisiert. 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). 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" ///
/// note | "Technische Details"
Sie können auch `from starlette.responses import JSONResponse` verwenden. Sie können auch `from starlette.responses import JSONResponse` verwenden.
**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette. Das Gleiche gilt für `status`. **FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette. Das Gleiche gilt für `status`.
///
## OpenAPI- und API-Dokumentation ## OpenAPI- und API-Dokumentation
Wenn Sie zusätzliche Statuscodes und Responses direkt zurückgeben, werden diese nicht in das OpenAPI-Schema (die API-Dokumentation) aufgenommen, da FastAPI keine Möglichkeit hat, im Voraus zu wissen, was Sie zurückgeben werden. Wenn Sie zusätzliche Statuscodes und Responses direkt zurückgeben, werden diese nicht in das OpenAPI-Schema (die API-Dokumentation) aufgenommen, da FastAPI keine Möglichkeit hat, im Voraus zu wissen, was Sie zurückgeben werden.

97
docs/de/docs/advanced/advanced-dependencies.md

@ -18,81 +18,108 @@ Nicht die Klasse selbst (die bereits aufrufbar ist), sondern eine Instanz dieser
Dazu deklarieren wir eine Methode `__call__`: Dazu deklarieren wir eine Methode `__call__`:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="12" ```Python hl_lines="12"
{!> ../../../docs_src/dependencies/tutorial011_an_py39.py!} {!> ../../docs_src/dependencies/tutorial011_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="11" ```Python hl_lines="11"
{!> ../../../docs_src/dependencies/tutorial011_an.py!} {!> ../../docs_src/dependencies/tutorial011_an.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="10" ```Python hl_lines="10"
{!> ../../../docs_src/dependencies/tutorial011.py!} {!> ../../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. In diesem Fall ist dieses `__call__` das, was **FastAPI** verwendet, um nach zusätzlichen Parametern und Unterabhängigkeiten zu suchen, und das ist es auch, was später aufgerufen wird, um einen Wert an den Parameter in Ihrer *Pfadoperation-Funktion* zu übergeben.
## Die Instanz parametrisieren ## Die Instanz parametrisieren
Und jetzt können wir `__init__` verwenden, um die Parameter der Instanz zu deklarieren, die wir zum `Parametrisieren` der Abhängigkeit verwenden können: Und jetzt können wir `__init__` verwenden, um die Parameter der Instanz zu deklarieren, die wir zum `Parametrisieren` der Abhängigkeit verwenden können:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="9" ```Python hl_lines="9"
{!> ../../../docs_src/dependencies/tutorial011_an_py39.py!} {!> ../../docs_src/dependencies/tutorial011_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="8" ```Python hl_lines="8"
{!> ../../../docs_src/dependencies/tutorial011_an.py!} {!> ../../docs_src/dependencies/tutorial011_an.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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" ```Python hl_lines="7"
{!> ../../../docs_src/dependencies/tutorial011.py!} {!> ../../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. In diesem Fall wird **FastAPI** `__init__` nie berühren oder sich darum kümmern, wir werden es direkt in unserem Code verwenden.
## Eine Instanz erstellen ## Eine Instanz erstellen
Wir könnten eine Instanz dieser Klasse erstellen mit: Wir könnten eine Instanz dieser Klasse erstellen mit:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="18" ```Python hl_lines="18"
{!> ../../../docs_src/dependencies/tutorial011_an_py39.py!} {!> ../../docs_src/dependencies/tutorial011_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="17" ```Python hl_lines="17"
{!> ../../../docs_src/dependencies/tutorial011_an.py!} {!> ../../docs_src/dependencies/tutorial011_an.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="16" ```Python hl_lines="16"
{!> ../../../docs_src/dependencies/tutorial011.py!} {!> ../../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`. Und auf diese Weise können wir unsere Abhängigkeit „parametrisieren“, die jetzt `"bar"` enthält, als das Attribut `checker.fixed_content`.
## Die Instanz als Abhängigkeit verwenden ## Die Instanz als Abhängigkeit verwenden
@ -107,28 +134,38 @@ 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`: ... 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" ```Python hl_lines="22"
{!> ../../../docs_src/dependencies/tutorial011_an_py39.py!} {!> ../../docs_src/dependencies/tutorial011_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="21" ```Python hl_lines="21"
{!> ../../../docs_src/dependencies/tutorial011_an.py!} {!> ../../docs_src/dependencies/tutorial011_an.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="20" ```Python hl_lines="20"
{!> ../../../docs_src/dependencies/tutorial011.py!} {!> ../../docs_src/dependencies/tutorial011.py!}
``` ```
!!! tip "Tipp" ////
/// tip | "Tipp"
Das alles mag gekünstelt wirken. Und es ist möglicherweise noch nicht ganz klar, welchen Nutzen das hat. 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.
@ -136,3 +173,5 @@ checker(q="somequery")
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.
///

30
docs/de/docs/advanced/async-tests.md

@ -33,13 +33,13 @@ Betrachten wir als einfaches Beispiel eine Dateistruktur ähnlich der in [Größ
Die Datei `main.py` hätte als Inhalt: Die Datei `main.py` hätte als Inhalt:
```Python ```Python
{!../../../docs_src/async_tests/main.py!} {!../../docs_src/async_tests/main.py!}
``` ```
Die Datei `test_main.py` hätte die Tests für `main.py`, das könnte jetzt so aussehen: Die Datei `test_main.py` hätte die Tests für `main.py`, das könnte jetzt so aussehen:
```Python ```Python
{!../../../docs_src/async_tests/test_main.py!} {!../../docs_src/async_tests/test_main.py!}
``` ```
## Es ausführen ## Es ausführen
@ -61,16 +61,19 @@ $ pytest
Der Marker `@pytest.mark.anyio` teilt pytest mit, dass diese Testfunktion asynchron aufgerufen werden soll: Der Marker `@pytest.mark.anyio` teilt pytest mit, dass diese Testfunktion asynchron aufgerufen werden soll:
```Python hl_lines="7" ```Python hl_lines="7"
{!../../../docs_src/async_tests/test_main.py!} {!../../docs_src/async_tests/test_main.py!}
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Beachten Sie, dass die Testfunktion jetzt `async def` ist und nicht nur `def` wie zuvor, wenn Sie den `TestClient` verwenden. 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. Dann können wir einen `AsyncClient` mit der App erstellen und mit `await` asynchrone Requests an ihn senden.
```Python hl_lines="9-10" ```Python hl_lines="9-12"
{!../../../docs_src/async_tests/test_main.py!} {!../../docs_src/async_tests/test_main.py!}
``` ```
Das ist das Äquivalent zu: Das ist das Äquivalent zu:
@ -81,15 +84,24 @@ response = client.get('/')
... welches wir verwendet haben, um unsere Requests mit dem `TestClient` zu machen. ... welches wir verwendet haben, um unsere Requests mit dem `TestClient` zu machen.
!!! tip "Tipp" /// tip | "Tipp"
Beachten Sie, dass wir async/await mit dem neuen `AsyncClient` verwenden – der Request ist asynchron. Beachten Sie, dass wir async/await mit dem neuen `AsyncClient` verwenden – der Request ist asynchron.
!!! warning "Achtung" ///
/// 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 <a href="https://github.com/florimondmanca/asgi-lifespan#usage" class="external-link" target="_blank">florimondmanca/asgi-lifespan</a>. 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 <a href="https://github.com/florimondmanca/asgi-lifespan#usage" class="external-link" target="_blank">florimondmanca/asgi-lifespan</a>.
///
## Andere asynchrone Funktionsaufrufe ## 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. 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" /// 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 <a href="https://stackoverflow.com/questions/41584243/runtimeerror-task-attached-to-a-different-loop" class="external-link" target="_blank">MongoDBs MotorClient</a>), 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. Wenn Sie einen `RuntimeError: Task attached to a different loop` erhalten, wenn Sie asynchrone Funktionsaufrufe in Ihre Tests integrieren (z. B. bei Verwendung von <a href="https://stackoverflow.com/questions/41584243/runtimeerror-task-attached-to-a-different-loop" class="external-link" target="_blank">MongoDBs MotorClient</a>), 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.
///

45
docs/de/docs/advanced/behind-a-proxy.md

@ -19,7 +19,7 @@ In diesem Fall würde der ursprüngliche Pfad `/app` tatsächlich unter `/api/v1
Auch wenn Ihr gesamter Code unter der Annahme geschrieben ist, dass es nur `/app` gibt. Auch wenn Ihr gesamter Code unter der Annahme geschrieben ist, dass es nur `/app` gibt.
```Python hl_lines="6" ```Python hl_lines="6"
{!../../../docs_src/behind_a_proxy/tutorial001.py!} {!../../docs_src/behind_a_proxy/tutorial001.py!}
``` ```
Und der Proxy würde das **Pfadpräfix** on-the-fly **"entfernen**", bevor er die Anfrage an Uvicorn übermittelt, dafür sorgend, dass Ihre Anwendung davon überzeugt ist, dass sie unter `/app` bereitgestellt wird, sodass Sie nicht Ihren gesamten Code dahingehend aktualisieren müssen, das Präfix `/api/v1` zu verwenden. Und der Proxy würde das **Pfadpräfix** on-the-fly **"entfernen**", bevor er die Anfrage an Uvicorn übermittelt, dafür sorgend, dass Ihre Anwendung davon überzeugt ist, dass sie unter `/app` bereitgestellt wird, sodass Sie nicht Ihren gesamten Code dahingehend aktualisieren müssen, das Präfix `/api/v1` zu verwenden.
@ -43,9 +43,12 @@ browser --> proxy
proxy --> server proxy --> server
``` ```
!!! tip "Tipp" /// 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 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: 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:
```JSON hl_lines="4-8" ```JSON hl_lines="4-8"
@ -81,11 +84,14 @@ $ uvicorn main:app --root-path /api/v1
Falls Sie Hypercorn verwenden, das hat auch die Option `--root-path`. Falls Sie Hypercorn verwenden, das hat auch die Option `--root-path`.
!!! note "Technische Details" /// note | "Technische Details"
Die ASGI-Spezifikation definiert einen `root_path` für diesen Anwendungsfall. 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` ### Überprüfen des aktuellen `root_path`
Sie können den aktuellen `root_path` abrufen, der von Ihrer Anwendung für jede Anfrage verwendet wird. Er ist Teil des `scope`-Dictionarys (das ist Teil der ASGI-Spezifikation). Sie können den aktuellen `root_path` abrufen, der von Ihrer Anwendung für jede Anfrage verwendet wird. Er ist Teil des `scope`-Dictionarys (das ist Teil der ASGI-Spezifikation).
@ -93,7 +99,7 @@ Sie können den aktuellen `root_path` abrufen, der von Ihrer Anwendung für jede
Hier fügen wir ihn, nur zu Demonstrationszwecken, in die Nachricht ein. Hier fügen wir ihn, nur zu Demonstrationszwecken, in die Nachricht ein.
```Python hl_lines="8" ```Python hl_lines="8"
{!../../../docs_src/behind_a_proxy/tutorial001.py!} {!../../docs_src/behind_a_proxy/tutorial001.py!}
``` ```
Wenn Sie Uvicorn dann starten mit: Wenn Sie Uvicorn dann starten mit:
@ -122,7 +128,7 @@ wäre die Response etwa:
Falls Sie keine Möglichkeit haben, eine Kommandozeilenoption wie `--root-path` oder ähnlich zu übergeben, können Sie als Alternative beim Erstellen Ihrer FastAPI-Anwendung den Parameter `root_path` setzen: Falls Sie keine Möglichkeit haben, eine Kommandozeilenoption wie `--root-path` oder ähnlich zu übergeben, können Sie als Alternative beim Erstellen Ihrer FastAPI-Anwendung den Parameter `root_path` setzen:
```Python hl_lines="3" ```Python hl_lines="3"
{!../../../docs_src/behind_a_proxy/tutorial002.py!} {!../../docs_src/behind_a_proxy/tutorial002.py!}
``` ```
Die Übergabe des `root_path` an `FastAPI` wäre das Äquivalent zur Übergabe der `--root-path`-Kommandozeilenoption an Uvicorn oder Hypercorn. Die Übergabe des `root_path` an `FastAPI` wäre das Äquivalent zur Übergabe der `--root-path`-Kommandozeilenoption an Uvicorn oder Hypercorn.
@ -172,9 +178,12 @@ Dann erstellen Sie eine Datei `traefik.toml` mit:
Dadurch wird Traefik angewiesen, Port 9999 abzuhören und eine andere Datei `routes.toml` zu verwenden. Dadurch wird Traefik angewiesen, Port 9999 abzuhören und eine andere Datei `routes.toml` zu verwenden.
!!! tip "Tipp" /// tip | "Tipp"
Wir verwenden Port 9999 anstelle des Standard-HTTP-Ports 80, damit Sie ihn nicht mit Administratorrechten (`sudo`) ausführen müssen. 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`: Erstellen Sie nun die andere Datei `routes.toml`:
```TOML hl_lines="5 12 20" ```TOML hl_lines="5 12 20"
@ -239,9 +248,12 @@ Wenn Sie nun zur URL mit dem Port für Uvicorn gehen: <a href="http://127.0.0.1:
} }
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Beachten Sie, dass, obwohl Sie unter `http://127.0.0.1:8000/app` darauf zugreifen, als `root_path` angezeigt wird `/api/v1`, welches aus der Option `--root-path` stammt. Beachten Sie, dass, obwohl Sie unter `http://127.0.0.1:8000/app` darauf zugreifen, als `root_path` angezeigt wird `/api/v1`, welches aus der Option `--root-path` stammt.
///
Öffnen Sie nun die URL mit dem Port für Traefik, einschließlich des Pfadpräfixes: <a href="http://127.0.0.1:9999/api/v1/app" class="external-link" target="_blank">http://127.0.0.1:9999/api/v1/app</a>. Öffnen Sie nun die URL mit dem Port für Traefik, einschließlich des Pfadpräfixes: <a href="http://127.0.0.1:9999/api/v1/app" class="external-link" target="_blank">http://127.0.0.1:9999/api/v1/app</a>.
Wir bekommen die gleiche Response: Wir bekommen die gleiche Response:
@ -283,9 +295,12 @@ Dies liegt daran, dass FastAPI diesen `root_path` verwendet, um den Default-`ser
## Zusätzliche Server ## Zusätzliche Server
!!! warning "Achtung" /// warning | "Achtung"
Dies ist ein fortgeschrittener Anwendungsfall. Überspringen Sie das gerne. 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`. Standardmäßig erstellt **FastAPI** einen `server` im OpenAPI-Schema mit der URL für den `root_path`.
Sie können aber auch andere alternative `server` bereitstellen, beispielsweise wenn Sie möchten, dass *dieselbe* Dokumentationsoberfläche mit einer Staging- und Produktionsumgebung interagiert. Sie können aber auch andere alternative `server` bereitstellen, beispielsweise wenn Sie möchten, dass *dieselbe* Dokumentationsoberfläche mit einer Staging- und Produktionsumgebung interagiert.
@ -295,7 +310,7 @@ Wenn Sie eine benutzerdefinierte Liste von Servern (`servers`) übergeben und es
Zum Beispiel: Zum Beispiel:
```Python hl_lines="4-7" ```Python hl_lines="4-7"
{!../../../docs_src/behind_a_proxy/tutorial003.py!} {!../../docs_src/behind_a_proxy/tutorial003.py!}
``` ```
Erzeugt ein OpenAPI-Schema, wie: Erzeugt ein OpenAPI-Schema, wie:
@ -323,22 +338,28 @@ Erzeugt ein OpenAPI-Schema, wie:
} }
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Beachten Sie den automatisch generierten Server mit dem `URL`-Wert `/api/v1`, welcher vom `root_path` stammt. Beachten Sie den automatisch generierten Server mit dem `URL`-Wert `/api/v1`, welcher vom `root_path` stammt.
///
In der Dokumentationsoberfläche unter <a href="http://127.0.0.1:9999/api/v1/docs" class="external-link" target="_blank">http://127.0.0.1:9999/api/v1/docs</a> würde es so aussehen: In der Dokumentationsoberfläche unter <a href="http://127.0.0.1:9999/api/v1/docs" class="external-link" target="_blank">http://127.0.0.1:9999/api/v1/docs</a> würde es so aussehen:
<img src="/img/tutorial/behind-a-proxy/image03.png"> <img src="/img/tutorial/behind-a-proxy/image03.png">
!!! tip "Tipp" /// tip | "Tipp"
Die Dokumentationsoberfläche interagiert mit dem von Ihnen ausgewählten Server. Die Dokumentationsoberfläche interagiert mit dem von Ihnen ausgewählten Server.
///
### Den automatischen Server von `root_path` deaktivieren ### Den automatischen Server von `root_path` deaktivieren
Wenn Sie nicht möchten, dass **FastAPI** einen automatischen Server inkludiert, welcher `root_path` verwendet, können Sie den Parameter `root_path_in_servers=False` verwenden: Wenn Sie nicht möchten, dass **FastAPI** einen automatischen Server inkludiert, welcher `root_path` verwendet, können Sie den Parameter `root_path_in_servers=False` verwenden:
```Python hl_lines="9" ```Python hl_lines="9"
{!../../../docs_src/behind_a_proxy/tutorial004.py!} {!../../docs_src/behind_a_proxy/tutorial004.py!}
``` ```
Dann wird er nicht in das OpenAPI-Schema aufgenommen. Dann wird er nicht in das OpenAPI-Schema aufgenommen.

87
docs/de/docs/advanced/custom-response.md

@ -12,9 +12,12 @@ 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. 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" /// 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. 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 ## `ORJSONResponse` verwenden
Um beispielsweise noch etwas Leistung herauszuholen, können Sie <a href="https://github.com/ijl/orjson" class="external-link" target="_blank">`orjson`</a> installieren und verwenden, und die Response als `ORJSONResponse` deklarieren. Um beispielsweise noch etwas Leistung herauszuholen, können Sie <a href="https://github.com/ijl/orjson" class="external-link" target="_blank">`orjson`</a> installieren und verwenden, und die Response als `ORJSONResponse` deklarieren.
@ -28,19 +31,25 @@ Das liegt daran, dass FastAPI standardmäßig jedes enthaltene Element überprü
Wenn Sie jedoch sicher sind, dass der von Ihnen zurückgegebene Inhalt **mit JSON serialisierbar** ist, können Sie ihn direkt an die Response-Klasse übergeben und die zusätzliche Arbeit vermeiden, die FastAPI hätte, indem es Ihren zurückgegebenen Inhalt durch den `jsonable_encoder` leitet, bevor es ihn an die Response-Klasse übergibt. Wenn Sie jedoch sicher sind, dass der von Ihnen zurückgegebene Inhalt **mit JSON serialisierbar** ist, können Sie ihn direkt an die Response-Klasse übergeben und die zusätzliche Arbeit vermeiden, die FastAPI hätte, indem es Ihren zurückgegebenen Inhalt durch den `jsonable_encoder` leitet, bevor es ihn an die Response-Klasse übergibt.
```Python hl_lines="2 7" ```Python hl_lines="2 7"
{!../../../docs_src/custom_response/tutorial001b.py!} {!../../docs_src/custom_response/tutorial001b.py!}
``` ```
!!! info /// info
Der Parameter `response_class` wird auch verwendet, um den „Medientyp“ der Response zu definieren. 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. In diesem Fall wird der HTTP-Header `Content-Type` auf `application/json` gesetzt.
Und er wird als solcher in OpenAPI dokumentiert. Und er wird als solcher in OpenAPI dokumentiert.
!!! tip "Tipp" ///
/// tip | "Tipp"
Die `ORJSONResponse` ist derzeit nur in FastAPI verfügbar, nicht in Starlette. Die `ORJSONResponse` ist derzeit nur in FastAPI verfügbar, nicht in Starlette.
///
## HTML-Response ## HTML-Response
Um eine Response mit HTML direkt von **FastAPI** zurückzugeben, verwenden Sie `HTMLResponse`. Um eine Response mit HTML direkt von **FastAPI** zurückzugeben, verwenden Sie `HTMLResponse`.
@ -49,16 +58,19 @@ Um eine Response mit HTML direkt von **FastAPI** zurückzugeben, verwenden Sie `
* Übergeben Sie `HTMLResponse` als den Parameter `response_class` Ihres *Pfadoperation-Dekorators*. * Übergeben Sie `HTMLResponse` als den Parameter `response_class` Ihres *Pfadoperation-Dekorators*.
```Python hl_lines="2 7" ```Python hl_lines="2 7"
{!../../../docs_src/custom_response/tutorial002.py!} {!../../docs_src/custom_response/tutorial002.py!}
``` ```
!!! info /// info
Der Parameter `response_class` wird auch verwendet, um den „Medientyp“ der Response zu definieren. Der Parameter `response_class` wird auch verwendet, um den „Medientyp“ der Response zu definieren.
In diesem Fall wird der HTTP-Header `Content-Type` auf `text/html` gesetzt. In diesem Fall wird der HTTP-Header `Content-Type` auf `text/html` gesetzt.
Und er wird als solcher in OpenAPI dokumentiert. Und er wird als solcher in OpenAPI dokumentiert.
///
### Eine `Response` zurückgeben ### Eine `Response` zurückgeben
Wie in [Eine Response direkt zurückgeben](response-directly.md){.internal-link target=_blank} gezeigt, können Sie die Response auch direkt in Ihrer *Pfadoperation* überschreiben, indem Sie diese zurückgeben. Wie in [Eine Response direkt zurückgeben](response-directly.md){.internal-link target=_blank} gezeigt, können Sie die Response auch direkt in Ihrer *Pfadoperation* überschreiben, indem Sie diese zurückgeben.
@ -66,15 +78,21 @@ Wie in [Eine Response direkt zurückgeben](response-directly.md){.internal-link
Das gleiche Beispiel von oben, das eine `HTMLResponse` zurückgibt, könnte so aussehen: Das gleiche Beispiel von oben, das eine `HTMLResponse` zurückgibt, könnte so aussehen:
```Python hl_lines="2 7 19" ```Python hl_lines="2 7 19"
{!../../../docs_src/custom_response/tutorial003.py!} {!../../docs_src/custom_response/tutorial003.py!}
``` ```
!!! warning "Achtung" /// 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. 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 ### In OpenAPI dokumentieren und `Response` überschreiben
Wenn Sie die Response innerhalb der Funktion überschreiben und gleichzeitig den „Medientyp“ in OpenAPI dokumentieren möchten, können Sie den `response_class`-Parameter verwenden UND ein `Response`-Objekt zurückgeben. Wenn Sie die Response innerhalb der Funktion überschreiben und gleichzeitig den „Medientyp“ in OpenAPI dokumentieren möchten, können Sie den `response_class`-Parameter verwenden UND ein `Response`-Objekt zurückgeben.
@ -86,7 +104,7 @@ Die `response_class` wird dann nur zur Dokumentation der OpenAPI-Pfadoperation*
Es könnte zum Beispiel so etwas sein: Es könnte zum Beispiel so etwas sein:
```Python hl_lines="7 21 23" ```Python hl_lines="7 21 23"
{!../../../docs_src/custom_response/tutorial004.py!} {!../../docs_src/custom_response/tutorial004.py!}
``` ```
In diesem Beispiel generiert die Funktion `generate_html_response()` bereits eine `Response` und gibt sie zurück, anstatt das HTML in einem `str` zurückzugeben. In diesem Beispiel generiert die Funktion `generate_html_response()` bereits eine `Response` und gibt sie zurück, anstatt das HTML in einem `str` zurückzugeben.
@ -103,11 +121,14 @@ 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. Bedenken Sie, dass Sie `Response` verwenden können, um alles andere zurückzugeben, oder sogar eine benutzerdefinierte Unterklasse zu erstellen.
!!! note "Technische Details" /// note | "Technische Details"
Sie können auch `from starlette.responses import HTMLResponse` verwenden. 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` ### `Response`
Die Hauptklasse `Response`, alle anderen Responses erben von ihr. Die Hauptklasse `Response`, alle anderen Responses erben von ihr.
@ -124,7 +145,7 @@ Sie akzeptiert die folgenden Parameter:
FastAPI (eigentlich Starlette) fügt automatisch einen Content-Length-Header ein. Außerdem wird es einen Content-Type-Header einfügen, der auf dem media_type basiert, und für Texttypen einen Zeichensatz (charset) anfügen. FastAPI (eigentlich Starlette) fügt automatisch einen Content-Length-Header ein. Außerdem wird es einen Content-Type-Header einfügen, der auf dem media_type basiert, und für Texttypen einen Zeichensatz (charset) anfügen.
```Python hl_lines="1 18" ```Python hl_lines="1 18"
{!../../../docs_src/response_directly/tutorial002.py!} {!../../docs_src/response_directly/tutorial002.py!}
``` ```
### `HTMLResponse` ### `HTMLResponse`
@ -136,7 +157,7 @@ Nimmt Text oder Bytes entgegen und gibt eine HTML-Response zurück, wie Sie oben
Nimmt Text oder Bytes entgegen und gibt eine Plain-Text-Response zurück. Nimmt Text oder Bytes entgegen und gibt eine Plain-Text-Response zurück.
```Python hl_lines="2 7 9" ```Python hl_lines="2 7 9"
{!../../../docs_src/custom_response/tutorial005.py!} {!../../docs_src/custom_response/tutorial005.py!}
``` ```
### `JSONResponse` ### `JSONResponse`
@ -153,16 +174,22 @@ Eine schnelle alternative JSON-Response mit <a href="https://github.com/ijl/orjs
Eine alternative JSON-Response mit <a href="https://github.com/ultrajson/ultrajson" class="external-link" target="_blank">`ujson`</a>. Eine alternative JSON-Response mit <a href="https://github.com/ultrajson/ultrajson" class="external-link" target="_blank">`ujson`</a>.
!!! warning "Achtung" /// warning | "Achtung"
`ujson` ist bei der Behandlung einiger Sonderfälle weniger sorgfältig als Pythons eingebaute Implementierung. `ujson` ist bei der Behandlung einiger Sonderfälle weniger sorgfältig als Pythons eingebaute Implementierung.
///
```Python hl_lines="2 7" ```Python hl_lines="2 7"
{!../../../docs_src/custom_response/tutorial001.py!} {!../../docs_src/custom_response/tutorial001.py!}
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Möglicherweise ist `ORJSONResponse` eine schnellere Alternative. Möglicherweise ist `ORJSONResponse` eine schnellere Alternative.
///
### `RedirectResponse` ### `RedirectResponse`
Gibt eine HTTP-Weiterleitung (HTTP-Redirect) zurück. Verwendet standardmäßig den Statuscode 307 – Temporäre Weiterleitung (Temporary Redirect). Gibt eine HTTP-Weiterleitung (HTTP-Redirect) zurück. Verwendet standardmäßig den Statuscode 307 – Temporäre Weiterleitung (Temporary Redirect).
@ -170,7 +197,7 @@ Gibt eine HTTP-Weiterleitung (HTTP-Redirect) zurück. Verwendet standardmäßig
Sie können eine `RedirectResponse` direkt zurückgeben: Sie können eine `RedirectResponse` direkt zurückgeben:
```Python hl_lines="2 9" ```Python hl_lines="2 9"
{!../../../docs_src/custom_response/tutorial006.py!} {!../../docs_src/custom_response/tutorial006.py!}
``` ```
--- ---
@ -179,7 +206,7 @@ Oder Sie können sie im Parameter `response_class` verwenden:
```Python hl_lines="2 7 9" ```Python hl_lines="2 7 9"
{!../../../docs_src/custom_response/tutorial006b.py!} {!../../docs_src/custom_response/tutorial006b.py!}
``` ```
Wenn Sie das tun, können Sie die URL direkt von Ihrer *Pfadoperation*-Funktion zurückgeben. Wenn Sie das tun, können Sie die URL direkt von Ihrer *Pfadoperation*-Funktion zurückgeben.
@ -191,7 +218,7 @@ In diesem Fall ist der verwendete `status_code` der Standardcode für die `Redir
Sie können den Parameter `status_code` auch in Kombination mit dem Parameter `response_class` verwenden: Sie können den Parameter `status_code` auch in Kombination mit dem Parameter `response_class` verwenden:
```Python hl_lines="2 7 9" ```Python hl_lines="2 7 9"
{!../../../docs_src/custom_response/tutorial006c.py!} {!../../docs_src/custom_response/tutorial006c.py!}
``` ```
### `StreamingResponse` ### `StreamingResponse`
@ -199,7 +226,7 @@ Sie können den Parameter `status_code` auch in Kombination mit dem Parameter `r
Nimmt einen asynchronen Generator oder einen normalen Generator/Iterator und streamt den Responsebody. Nimmt einen asynchronen Generator oder einen normalen Generator/Iterator und streamt den Responsebody.
```Python hl_lines="2 14" ```Python hl_lines="2 14"
{!../../../docs_src/custom_response/tutorial007.py!} {!../../docs_src/custom_response/tutorial007.py!}
``` ```
#### Verwendung von `StreamingResponse` mit dateiähnlichen Objekten #### Verwendung von `StreamingResponse` mit dateiähnlichen Objekten
@ -211,7 +238,7 @@ Auf diese Weise müssen Sie nicht alles zuerst in den Arbeitsspeicher lesen und
Das umfasst viele Bibliotheken zur Interaktion mit Cloud-Speicher, Videoverarbeitung und anderen. Das umfasst viele Bibliotheken zur Interaktion mit Cloud-Speicher, Videoverarbeitung und anderen.
```{ .python .annotate hl_lines="2 10-12 14" } ```{ .python .annotate hl_lines="2 10-12 14" }
{!../../../docs_src/custom_response/tutorial008.py!} {!../../docs_src/custom_response/tutorial008.py!}
``` ```
1. Das ist die Generatorfunktion. Es handelt sich um eine „Generatorfunktion“, da sie `yield`-Anweisungen enthält. 1. Das ist die Generatorfunktion. Es handelt sich um eine „Generatorfunktion“, da sie `yield`-Anweisungen enthält.
@ -222,9 +249,12 @@ 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. 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" /// 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. Beachten Sie, dass wir, da wir Standard-`open()` verwenden, welches `async` und `await` nicht unterstützt, hier die Pfadoperation mit normalen `def` deklarieren.
///
### `FileResponse` ### `FileResponse`
Streamt eine Datei asynchron als Response. Streamt eine Datei asynchron als Response.
@ -239,13 +269,13 @@ Nimmt zur Instanziierung einen anderen Satz von Argumenten entgegen als die ande
Datei-Responses enthalten die entsprechenden `Content-Length`-, `Last-Modified`- und `ETag`-Header. Datei-Responses enthalten die entsprechenden `Content-Length`-, `Last-Modified`- und `ETag`-Header.
```Python hl_lines="2 10" ```Python hl_lines="2 10"
{!../../../docs_src/custom_response/tutorial009.py!} {!../../docs_src/custom_response/tutorial009.py!}
``` ```
Sie können auch den Parameter `response_class` verwenden: Sie können auch den Parameter `response_class` verwenden:
```Python hl_lines="2 8 10" ```Python hl_lines="2 8 10"
{!../../../docs_src/custom_response/tutorial009b.py!} {!../../docs_src/custom_response/tutorial009b.py!}
``` ```
In diesem Fall können Sie den Dateipfad direkt von Ihrer *Pfadoperation*-Funktion zurückgeben. In diesem Fall können Sie den Dateipfad direkt von Ihrer *Pfadoperation*-Funktion zurückgeben.
@ -261,7 +291,7 @@ Sie möchten etwa, dass Ihre Response eingerücktes und formatiertes JSON zurüc
Sie könnten eine `CustomORJSONResponse` erstellen. Das Wichtigste, was Sie tun müssen, ist, eine `Response.render(content)`-Methode zu erstellen, die den Inhalt als `bytes` zurückgibt: Sie könnten eine `CustomORJSONResponse` erstellen. Das Wichtigste, was Sie tun müssen, ist, eine `Response.render(content)`-Methode zu erstellen, die den Inhalt als `bytes` zurückgibt:
```Python hl_lines="9-14 17" ```Python hl_lines="9-14 17"
{!../../../docs_src/custom_response/tutorial009c.py!} {!../../docs_src/custom_response/tutorial009c.py!}
``` ```
Statt: Statt:
@ -289,12 +319,15 @@ Der Parameter, der das definiert, ist `default_response_class`.
Im folgenden Beispiel verwendet **FastAPI** standardmäßig `ORJSONResponse` in allen *Pfadoperationen*, anstelle von `JSONResponse`. Im folgenden Beispiel verwendet **FastAPI** standardmäßig `ORJSONResponse` in allen *Pfadoperationen*, anstelle von `JSONResponse`.
```Python hl_lines="2 4" ```Python hl_lines="2 4"
{!../../../docs_src/custom_response/tutorial010.py!} {!../../docs_src/custom_response/tutorial010.py!}
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Sie können dennoch weiterhin `response_class` in *Pfadoperationen* überschreiben, wie bisher. Sie können dennoch weiterhin `response_class` in *Pfadoperationen* überschreiben, wie bisher.
///
## Zusätzliche Dokumentation ## Zusätzliche Dokumentation
Sie können auch den Medientyp und viele andere Details in OpenAPI mit `responses` deklarieren: [Zusätzliche Responses in OpenAPI](additional-responses.md){.internal-link target=_blank}. Sie können auch den Medientyp und viele andere Details in OpenAPI mit `responses` deklarieren: [Zusätzliche Responses in OpenAPI](additional-responses.md){.internal-link target=_blank}.

11
docs/de/docs/advanced/dataclasses.md

@ -5,7 +5,7 @@ FastAPI basiert auf **Pydantic** und ich habe Ihnen gezeigt, wie Sie Pydantic-Mo
Aber FastAPI unterstützt auf die gleiche Weise auch die Verwendung von <a href="https://docs.python.org/3/library/dataclasses.html" class="external-link" target="_blank">`dataclasses`</a>: Aber FastAPI unterstützt auf die gleiche Weise auch die Verwendung von <a href="https://docs.python.org/3/library/dataclasses.html" class="external-link" target="_blank">`dataclasses`</a>:
```Python hl_lines="1 7-12 19-20" ```Python hl_lines="1 7-12 19-20"
{!../../../docs_src/dataclasses/tutorial001.py!} {!../../docs_src/dataclasses/tutorial001.py!}
``` ```
Das ist dank **Pydantic** ebenfalls möglich, da es <a href="https://pydantic-docs.helpmanual.io/usage/dataclasses/#use-of-stdlib-dataclasses-with-basemodel" class="external-link" target="_blank">`dataclasses` intern unterstützt</a>. Das ist dank **Pydantic** ebenfalls möglich, da es <a href="https://pydantic-docs.helpmanual.io/usage/dataclasses/#use-of-stdlib-dataclasses-with-basemodel" class="external-link" target="_blank">`dataclasses` intern unterstützt</a>.
@ -20,19 +20,22 @@ 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. Das funktioniert genauso wie mit Pydantic-Modellen. Und tatsächlich wird es unter der Haube mittels Pydantic auf die gleiche Weise bewerkstelligt.
!!! info /// info
Bedenken Sie, dass Datenklassen nicht alles können, was Pydantic-Modelle können. Bedenken Sie, dass Datenklassen nicht alles können, was Pydantic-Modelle können.
Daher müssen Sie möglicherweise weiterhin Pydantic-Modelle 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. 🤓 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` ## Datenklassen als `response_model`
Sie können `dataclasses` auch im Parameter `response_model` verwenden: Sie können `dataclasses` auch im Parameter `response_model` verwenden:
```Python hl_lines="1 7-13 19" ```Python hl_lines="1 7-13 19"
{!../../../docs_src/dataclasses/tutorial002.py!} {!../../docs_src/dataclasses/tutorial002.py!}
``` ```
Die Datenklasse wird automatisch in eine Pydantic-Datenklasse konvertiert. Die Datenklasse wird automatisch in eine Pydantic-Datenklasse konvertiert.
@ -50,7 +53,7 @@ In einigen Fällen müssen Sie möglicherweise immer noch Pydantics Version von
In diesem Fall können Sie einfach die Standard-`dataclasses` durch `pydantic.dataclasses` ersetzen, was einen direkten Ersatz darstellt: In diesem Fall können Sie einfach die Standard-`dataclasses` durch `pydantic.dataclasses` ersetzen, was einen direkten Ersatz darstellt:
```{ .python .annotate hl_lines="1 5 8-11 14-17 23-25 28" } ```{ .python .annotate hl_lines="1 5 8-11 14-17 23-25 28" }
{!../../../docs_src/dataclasses/tutorial003.py!} {!../../docs_src/dataclasses/tutorial003.py!}
``` ```
1. Wir importieren `field` weiterhin von Standard-`dataclasses`. 1. Wir importieren `field` weiterhin von Standard-`dataclasses`.

37
docs/de/docs/advanced/events.md

@ -31,24 +31,27 @@ Beginnen wir mit einem Beispiel und sehen es uns dann im Detail an.
Wir erstellen eine asynchrone Funktion `lifespan()` mit `yield` wie folgt: Wir erstellen eine asynchrone Funktion `lifespan()` mit `yield` wie folgt:
```Python hl_lines="16 19" ```Python hl_lines="16 19"
{!../../../docs_src/events/tutorial003.py!} {!../../docs_src/events/tutorial003.py!}
``` ```
Hier simulieren wir das langsame *Hochfahren*, das Laden des Modells, indem wir die (Fake-)Modellfunktion vor dem `yield` in das Dictionary mit Modellen für maschinelles Lernen einfügen. Dieser Code wird ausgeführt, **bevor** die Anwendung **beginnt, Requests entgegenzunehmen**, während des *Hochfahrens*. Hier simulieren wir das langsame *Hochfahren*, das Laden des Modells, indem wir die (Fake-)Modellfunktion vor dem `yield` in das Dictionary mit Modellen für maschinelles Lernen einfügen. Dieser Code wird ausgeführt, **bevor** die Anwendung **beginnt, Requests entgegenzunehmen**, während des *Hochfahrens*.
Und dann, direkt nach dem `yield`, entladen wir das Modell. Dieser Code wird unmittelbar vor dem *Herunterfahren* ausgeführt, **nachdem** die Anwendung **die Bearbeitung von Requests abgeschlossen hat**. Dadurch könnten beispielsweise Ressourcen wie Arbeitsspeicher oder eine GPU freigegeben werden. Und dann, direkt nach dem `yield`, entladen wir das Modell. Dieser Code wird 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" /// tip | "Tipp"
Das *Herunterfahren* würde erfolgen, wenn Sie die Anwendung **stoppen**. 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. 🤷 Möglicherweise müssen Sie eine neue Version starten, oder Sie haben es einfach satt, sie auszuführen. 🤷
///
### Lifespan-Funktion ### Lifespan-Funktion
Das Erste, was auffällt, ist, dass wir eine asynchrone Funktion mit `yield` definieren. Das ist sehr ähnlich zu Abhängigkeiten mit `yield`. Das Erste, was auffällt, ist, dass wir eine asynchrone Funktion mit `yield` definieren. Das ist sehr ähnlich zu Abhängigkeiten mit `yield`.
```Python hl_lines="14-19" ```Python hl_lines="14-19"
{!../../../docs_src/events/tutorial003.py!} {!../../docs_src/events/tutorial003.py!}
``` ```
Der erste Teil der Funktion, vor dem `yield`, wird ausgeführt **bevor** die Anwendung startet. Der erste Teil der Funktion, vor dem `yield`, wird ausgeführt **bevor** die Anwendung startet.
@ -62,7 +65,7 @@ Wie Sie sehen, ist die Funktion mit einem `@asynccontextmanager` versehen.
Dadurch wird die Funktion in einen sogenannten „**asynchronen Kontextmanager**“ umgewandelt. Dadurch wird die Funktion in einen sogenannten „**asynchronen Kontextmanager**“ umgewandelt.
```Python hl_lines="1 13" ```Python hl_lines="1 13"
{!../../../docs_src/events/tutorial003.py!} {!../../docs_src/events/tutorial003.py!}
``` ```
Ein **Kontextmanager** in Python ist etwas, das Sie in einer `with`-Anweisung verwenden können, zum Beispiel kann `open()` als Kontextmanager verwendet werden: Ein **Kontextmanager** in Python ist etwas, das Sie in einer `with`-Anweisung verwenden können, zum Beispiel kann `open()` als Kontextmanager verwendet werden:
@ -86,16 +89,19 @@ In unserem obigen Codebeispiel verwenden wir ihn nicht direkt, sondern übergebe
Der Parameter `lifespan` der `FastAPI`-App benötigt einen **asynchronen Kontextmanager**, wir können ihm also unseren neuen asynchronen Kontextmanager `lifespan` übergeben. Der Parameter `lifespan` der `FastAPI`-App benötigt einen **asynchronen Kontextmanager**, wir können ihm also unseren neuen asynchronen Kontextmanager `lifespan` übergeben.
```Python hl_lines="22" ```Python hl_lines="22"
{!../../../docs_src/events/tutorial003.py!} {!../../docs_src/events/tutorial003.py!}
``` ```
## Alternative Events (deprecated) ## Alternative Events (deprecated)
!!! warning "Achtung" /// warning | "Achtung"
Der empfohlene Weg, das *Hochfahren* und *Herunterfahren* zu handhaben, ist die Verwendung des `lifespan`-Parameters der `FastAPI`-App, wie oben beschrieben. Wenn Sie einen `lifespan`-Parameter übergeben, werden die `startup`- und `shutdown`-Eventhandler nicht mehr aufgerufen. Es ist entweder alles `lifespan` oder alles Events, nicht beides. Der empfohlene Weg, 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. Es gibt eine alternative Möglichkeit, diese Logik zu definieren, sodass sie beim *Hochfahren* und beim *Herunterfahren* ausgeführt wird.
Sie können <abbr title="Eventhandler – Ereignisbehandler: Funktion, die bei jedem Eintreten eines bestimmten Ereignisses ausgeführt wird">Eventhandler</abbr> (Funktionen) definieren, die ausgeführt werden sollen, bevor die Anwendung hochgefahren wird oder wenn die Anwendung heruntergefahren wird. Sie können <abbr title="Eventhandler – Ereignisbehandler: Funktion, die bei jedem Eintreten eines bestimmten Ereignisses ausgeführt wird">Eventhandler</abbr> (Funktionen) definieren, die ausgeführt werden sollen, bevor die Anwendung hochgefahren wird oder wenn die Anwendung heruntergefahren wird.
@ -107,7 +113,7 @@ Diese Funktionen können mit `async def` oder normalem `def` deklariert werden.
Um eine Funktion hinzuzufügen, die vor dem Start der Anwendung ausgeführt werden soll, deklarieren Sie diese mit dem Event `startup`: Um eine Funktion hinzuzufügen, die vor dem Start der Anwendung ausgeführt werden soll, deklarieren Sie diese mit dem Event `startup`:
```Python hl_lines="8" ```Python hl_lines="8"
{!../../../docs_src/events/tutorial001.py!} {!../../docs_src/events/tutorial001.py!}
``` ```
In diesem Fall initialisiert die Eventhandler-Funktion `startup` die „Datenbank“ der Items (nur ein `dict`) mit einigen Werten. In diesem Fall initialisiert die Eventhandler-Funktion `startup` die „Datenbank“ der Items (nur ein `dict`) mit einigen Werten.
@ -121,15 +127,19 @@ Und Ihre Anwendung empfängt erst dann Anfragen, wenn alle `startup`-Eventhandle
Um eine Funktion hinzuzufügen, die beim Herunterfahren der Anwendung ausgeführt werden soll, deklarieren Sie sie mit dem Event `shutdown`: Um eine Funktion hinzuzufügen, die beim Herunterfahren der Anwendung ausgeführt werden soll, deklarieren Sie sie mit dem Event `shutdown`:
```Python hl_lines="6" ```Python hl_lines="6"
{!../../../docs_src/events/tutorial002.py!} {!../../docs_src/events/tutorial002.py!}
``` ```
Hier schreibt die `shutdown`-Eventhandler-Funktion eine Textzeile `"Application shutdown"` in eine Datei `log.txt`. Hier schreibt die `shutdown`-Eventhandler-Funktion eine Textzeile `"Application shutdown"` in eine Datei `log.txt`.
!!! info /// info
In der Funktion `open()` bedeutet `mode="a"` „append“ („anhängen“), sodass die Zeile nach dem, was sich in dieser Datei befindet, hinzugefügt wird, ohne den vorherigen Inhalt zu überschreiben. 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" ///
/// tip | "Tipp"
Beachten Sie, dass wir in diesem Fall eine Standard-Python-Funktion `open()` verwenden, die mit einer Datei interagiert. 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. Es handelt sich also um I/O (Input/Output), welches „Warten“ erfordert, bis Dinge auf die Festplatte geschrieben werden.
@ -138,6 +148,8 @@ Hier schreibt die `shutdown`-Eventhandler-Funktion eine Textzeile `"Application
Daher deklarieren wir die Eventhandler-Funktion mit Standard-`def` statt mit `async def`. Daher deklarieren wir die Eventhandler-Funktion mit Standard-`def` statt mit `async def`.
///
### `startup` und `shutdown` zusammen ### `startup` und `shutdown` zusammen
Es besteht eine hohe Wahrscheinlichkeit, dass die Logik für Ihr *Hochfahren* und *Herunterfahren* miteinander verknüpft ist. Vielleicht möchten Sie etwas beginnen und es dann beenden, eine Ressource laden und sie dann freigeben usw. Es besteht eine hohe Wahrscheinlichkeit, dass die Logik für Ihr *Hochfahren* und *Herunterfahren* miteinander verknüpft ist. Vielleicht möchten Sie etwas beginnen und es dann beenden, eine Ressource laden und sie dann freigeben usw.
@ -152,11 +164,14 @@ Nur ein technisches Detail für die neugierigen Nerds. 🤓
In der technischen ASGI-Spezifikation ist dies Teil des <a href="https://asgi.readthedocs.io/en/latest/specs/lifespan.html" class="external-link" target="_blank">Lifespan Protokolls</a> und definiert Events namens `startup` und `shutdown`. In der technischen ASGI-Spezifikation ist dies Teil des <a href="https://asgi.readthedocs.io/en/latest/specs/lifespan.html" class="external-link" target="_blank">Lifespan Protokolls</a> und definiert Events namens `startup` und `shutdown`.
!!! info /// info
Weitere Informationen zu Starlettes `lifespan`-Handlern finden Sie in <a href="https://www.starlette.io/lifespan/" class="external-link" target="_blank">Starlettes Lifespan-Dokumentation</a>. Weitere Informationen zu Starlettes `lifespan`-Handlern finden Sie in <a href="https://www.starlette.io/lifespan/" class="external-link" target="_blank">Starlettes Lifespan-Dokumentation</a>.
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 ## Unteranwendungen
🚨 Beachten Sie, dass diese Lifespan-Events (Hochfahren und Herunterfahren) nur für die Hauptanwendung ausgeführt werden, nicht für [Unteranwendungen – Mounts](sub-applications.md){.internal-link target=_blank}. 🚨 Beachten Sie, dass diese Lifespan-Events (Hochfahren und Herunterfahren) nur für die Hauptanwendung ausgeführt werden, nicht für [Unteranwendungen – Mounts](sub-applications.md){.internal-link target=_blank}.

53
docs/de/docs/advanced/generate-clients.md

@ -28,18 +28,22 @@ Es gibt auch mehrere andere Unternehmen, welche ähnliche Dienste anbieten und d
Beginnen wir mit einer einfachen FastAPI-Anwendung: Beginnen wir mit einer einfachen FastAPI-Anwendung:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="7-9 12-13 16-17 21" ```Python hl_lines="7-9 12-13 16-17 21"
{!> ../../../docs_src/generate_clients/tutorial001_py39.py!} {!> ../../docs_src/generate_clients/tutorial001_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="9-11 14-15 18 19 23" ```Python hl_lines="9-11 14-15 18 19 23"
{!> ../../../docs_src/generate_clients/tutorial001.py!} {!> ../../docs_src/generate_clients/tutorial001.py!}
``` ```
////
Beachten Sie, dass die *Pfadoperationen* die Modelle definieren, welche diese für die Request- und Response-<abbr title="Die eigentlichen Nutzdaten, abzüglich der Metadaten">Payload</abbr> verwenden, indem sie die Modelle `Item` und `ResponseMessage` verwenden. Beachten Sie, dass die *Pfadoperationen* die Modelle definieren, welche diese für die Request- und Response-<abbr title="Die eigentlichen Nutzdaten, abzüglich der Metadaten">Payload</abbr> verwenden, indem sie die Modelle `Item` und `ResponseMessage` verwenden.
### API-Dokumentation ### API-Dokumentation
@ -123,9 +127,12 @@ Sie erhalten außerdem automatische Vervollständigung für die zu sendende Payl
<img src="/img/tutorial/generate-clients/image03.png"> <img src="/img/tutorial/generate-clients/image03.png">
!!! tip "Tipp" /// tip | "Tipp"
Beachten Sie die automatische Vervollständigung für `name` und `price`, welche in der FastAPI-Anwendung im `Item`-Modell definiert wurden. Beachten Sie die automatische Vervollständigung für `name` und `price`, welche in der FastAPI-Anwendung im `Item`-Modell definiert wurden.
///
Sie erhalten Inline-Fehlerberichte für die von Ihnen gesendeten Daten: Sie erhalten Inline-Fehlerberichte für die von Ihnen gesendeten Daten:
<img src="/img/tutorial/generate-clients/image04.png"> <img src="/img/tutorial/generate-clients/image04.png">
@ -140,18 +147,22 @@ 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: 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" ```Python hl_lines="21 26 34"
{!> ../../../docs_src/generate_clients/tutorial002_py39.py!} {!> ../../docs_src/generate_clients/tutorial002_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="23 28 36" ```Python hl_lines="23 28 36"
{!> ../../../docs_src/generate_clients/tutorial002.py!} {!> ../../docs_src/generate_clients/tutorial002.py!}
``` ```
////
### Einen TypeScript-Client mit Tags generieren ### Einen TypeScript-Client mit Tags generieren
Wenn Sie unter Verwendung von Tags einen Client für eine FastAPI-Anwendung generieren, wird normalerweise auch der Client-Code anhand der Tags getrennt. Wenn Sie unter Verwendung von Tags einen Client für eine FastAPI-Anwendung generieren, wird normalerweise auch der Client-Code anhand der Tags getrennt.
@ -197,18 +208,22 @@ 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: 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" ```Python hl_lines="6-7 10"
{!> ../../../docs_src/generate_clients/tutorial003_py39.py!} {!> ../../docs_src/generate_clients/tutorial003_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="8-9 12" ```Python hl_lines="8-9 12"
{!> ../../../docs_src/generate_clients/tutorial003.py!} {!> ../../docs_src/generate_clients/tutorial003.py!}
``` ```
////
### Einen TypeScript-Client mit benutzerdefinierten Operation-IDs generieren ### Einen TypeScript-Client mit benutzerdefinierten Operation-IDs generieren
Wenn Sie nun den Client erneut generieren, werden Sie feststellen, dass er über die verbesserten Methodennamen verfügt: Wenn Sie nun den Client erneut generieren, werden Sie feststellen, dass er über die verbesserten Methodennamen verfügt:
@ -229,18 +244,22 @@ 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**: 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 ```Python
{!> ../../../docs_src/generate_clients/tutorial004.py!} {!> ../../docs_src/generate_clients/tutorial004.py!}
``` ```
=== "Node.js" ////
//// tab | Node.js
```Javascript ```Javascript
{!> ../../../docs_src/generate_clients/tutorial004.js!} {!> ../../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. Damit würden die Operation-IDs von Dingen wie `items-get_items` in `get_items` umbenannt, sodass der Client-Generator einfachere Methodennamen generieren kann.
### Einen TypeScript-Client mit der modifizierten OpenAPI generieren ### Einen TypeScript-Client mit der modifizierten OpenAPI generieren

5
docs/de/docs/advanced/index.md

@ -6,11 +6,14 @@ Das Haupt-[Tutorial – Benutzerhandbuch](../tutorial/index.md){.internal-link t
In den nächsten Abschnitten sehen Sie weitere Optionen, Konfigurationen und zusätzliche Funktionen. In den nächsten Abschnitten sehen Sie weitere Optionen, Konfigurationen und zusätzliche Funktionen.
!!! tip "Tipp" /// tip | "Tipp"
Die nächsten Abschnitte sind **nicht unbedingt „fortgeschritten“**. 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. Und es ist möglich, dass für Ihren Anwendungsfall die Lösung in einem davon liegt.
///
## Lesen Sie zuerst das Tutorial ## Lesen Sie zuerst das Tutorial
Sie können immer noch die meisten Funktionen in **FastAPI** mit den Kenntnissen aus dem Haupt-[Tutorial – Benutzerhandbuch](../tutorial/index.md){.internal-link target=_blank} nutzen. Sie können immer noch die meisten Funktionen in **FastAPI** mit den Kenntnissen aus dem Haupt-[Tutorial – Benutzerhandbuch](../tutorial/index.md){.internal-link target=_blank} nutzen.

12
docs/de/docs/advanced/middleware.md

@ -43,11 +43,14 @@ 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. **FastAPI** enthält mehrere Middlewares für gängige Anwendungsfälle. Wir werden als Nächstes sehen, wie man sie verwendet.
!!! note "Technische Details" /// note | "Technische Details"
Für die nächsten Beispiele könnten Sie auch `from starlette.middleware.something import SomethingMiddleware` verwenden. 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. **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` ## `HTTPSRedirectMiddleware`
Erzwingt, dass alle eingehenden Requests entweder `https` oder `wss` sein müssen. Erzwingt, dass alle eingehenden Requests entweder `https` oder `wss` sein müssen.
@ -55,7 +58,7 @@ Erzwingt, dass alle eingehenden Requests entweder `https` oder `wss` sein müsse
Alle eingehenden Requests an `http` oder `ws` werden stattdessen an das sichere Schema umgeleitet. Alle eingehenden Requests an `http` oder `ws` werden stattdessen an das sichere Schema umgeleitet.
```Python hl_lines="2 6" ```Python hl_lines="2 6"
{!../../../docs_src/advanced_middleware/tutorial001.py!} {!../../docs_src/advanced_middleware/tutorial001.py!}
``` ```
## `TrustedHostMiddleware` ## `TrustedHostMiddleware`
@ -63,7 +66,7 @@ Alle eingehenden Requests an `http` oder `ws` werden stattdessen an das sichere
Erzwingt, dass alle eingehenden Requests einen korrekt gesetzten `Host`-Header haben, um sich vor HTTP-Host-Header-Angriffen zu schützen. Erzwingt, dass alle eingehenden Requests einen korrekt gesetzten `Host`-Header haben, um sich vor HTTP-Host-Header-Angriffen zu schützen.
```Python hl_lines="2 6-8" ```Python hl_lines="2 6-8"
{!../../../docs_src/advanced_middleware/tutorial002.py!} {!../../docs_src/advanced_middleware/tutorial002.py!}
``` ```
Die folgenden Argumente werden unterstützt: Die folgenden Argumente werden unterstützt:
@ -79,7 +82,7 @@ Verarbeitet GZip-Responses für alle Requests, die `"gzip"` im `Accept-Encoding`
Diese Middleware verarbeitet sowohl Standard- als auch Streaming-Responses. Diese Middleware verarbeitet sowohl Standard- als auch Streaming-Responses.
```Python hl_lines="2 6" ```Python hl_lines="2 6"
{!../../../docs_src/advanced_middleware/tutorial003.py!} {!../../docs_src/advanced_middleware/tutorial003.py!}
``` ```
Die folgenden Argumente werden unterstützt: Die folgenden Argumente werden unterstützt:
@ -92,7 +95,6 @@ Es gibt viele andere ASGI-Middlewares.
Zum Beispiel: Zum Beispiel:
* <a href="https://docs.sentry.io/platforms/python/guides/fastapi/" class="external-link" target="_blank">Sentry</a>
* <a href="https://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.py" class="external-link" target="_blank">Uvicorns `ProxyHeadersMiddleware`</a> * <a href="https://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.py" class="external-link" target="_blank">Uvicorns `ProxyHeadersMiddleware`</a>
* <a href="https://github.com/florimondmanca/msgpack-asgi" class="external-link" target="_blank">MessagePack</a> * <a href="https://github.com/florimondmanca/msgpack-asgi" class="external-link" target="_blank">MessagePack</a>

33
docs/de/docs/advanced/openapi-callbacks.md

@ -32,12 +32,15 @@ Sie verfügt über eine *Pfadoperation*, die einen `Invoice`-Body empfängt, und
Dieser Teil ist ziemlich normal, der größte Teil des Codes ist Ihnen wahrscheinlich bereits bekannt: Dieser Teil ist ziemlich normal, der größte Teil des Codes ist Ihnen wahrscheinlich bereits bekannt:
```Python hl_lines="9-13 36-53" ```Python hl_lines="9-13 36-53"
{!../../../docs_src/openapi_callbacks/tutorial001.py!} {!../../docs_src/openapi_callbacks/tutorial001.py!}
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Der Query-Parameter `callback_url` verwendet einen Pydantic-<a href="https://docs.pydantic.dev/latest/api/networks/" class="external-link" target="_blank">Url</a>-Typ. Der Query-Parameter `callback_url` verwendet einen Pydantic-<a href="https://docs.pydantic.dev/latest/api/networks/" class="external-link" target="_blank">Url</a>-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. 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.
## Dokumentation des Callbacks ## Dokumentation des Callbacks
@ -61,11 +64,14 @@ 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. In diesem Beispiel wird nicht der Callback selbst implementiert (das könnte nur eine Codezeile sein), sondern nur der Dokumentationsteil.
!!! tip "Tipp" /// tip | "Tipp"
Der eigentliche Callback ist nur ein HTTP-Request. Der eigentliche Callback ist nur ein HTTP-Request.
Wenn Sie den Callback selbst implementieren, können Sie beispielsweise <a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX</a> oder <a href="https://requests.readthedocs.io/" class="external-link" target="_blank">Requests</a> verwenden. Wenn Sie den Callback selbst implementieren, können Sie beispielsweise <a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX</a> oder <a href="https://requests.readthedocs.io/" class="external-link" target="_blank">Requests</a> verwenden.
///
## Schreiben des Codes, der den Callback dokumentiert ## Schreiben des Codes, der den Callback dokumentiert
Dieser Code wird nicht in Ihrer Anwendung ausgeführt, wir benötigen ihn nur, um zu *dokumentieren*, wie diese *externe API* aussehen soll. Dieser Code wird nicht in Ihrer Anwendung ausgeführt, wir benötigen ihn nur, um zu *dokumentieren*, wie diese *externe API* aussehen soll.
@ -74,17 +80,20 @@ 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). 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" /// 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 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 ### Einen Callback-`APIRouter` erstellen
Erstellen Sie zunächst einen neuen `APIRouter`, der einen oder mehrere Callbacks enthält. Erstellen Sie zunächst einen neuen `APIRouter`, der einen oder mehrere Callbacks enthält.
```Python hl_lines="3 25" ```Python hl_lines="3 25"
{!../../../docs_src/openapi_callbacks/tutorial001.py!} {!../../docs_src/openapi_callbacks/tutorial001.py!}
``` ```
### Die Callback-*Pfadoperation* erstellen ### Die Callback-*Pfadoperation* erstellen
@ -97,7 +106,7 @@ Sie sollte wie eine normale FastAPI-*Pfadoperation* aussehen:
* Und sie könnte auch eine Deklaration der Response enthalten, die zurückgegeben werden soll, z. B. `response_model=InvoiceEventReceived`. * Und sie könnte auch eine Deklaration der Response enthalten, die zurückgegeben werden soll, z. B. `response_model=InvoiceEventReceived`.
```Python hl_lines="16-18 21-22 28-32" ```Python hl_lines="16-18 21-22 28-32"
{!../../../docs_src/openapi_callbacks/tutorial001.py!} {!../../docs_src/openapi_callbacks/tutorial001.py!}
``` ```
Es gibt zwei Hauptunterschiede zu einer normalen *Pfadoperation*: Es gibt zwei Hauptunterschiede zu einer normalen *Pfadoperation*:
@ -154,9 +163,12 @@ und sie würde eine Response von dieser *externen API* mit einem JSON-Body wie d
} }
``` ```
!!! tip "Tipp" /// 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`). 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 ### Den Callback-Router hinzufügen
An diesem Punkt haben Sie die benötigte(n) *Callback-Pfadoperation(en)* (diejenige(n), die der *externe Entwickler* in der *externen API* implementieren sollte) im Callback-Router, den Sie oben erstellt haben. An diesem Punkt haben Sie die benötigte(n) *Callback-Pfadoperation(en)* (diejenige(n), die der *externe Entwickler* in der *externen API* implementieren sollte) im Callback-Router, den Sie oben erstellt haben.
@ -164,12 +176,15 @@ An diesem Punkt haben Sie die benötigte(n) *Callback-Pfadoperation(en)* (diejen
Verwenden Sie nun den Parameter `callbacks` im *Pfadoperation-Dekorator Ihrer API*, um das Attribut `.routes` (das ist eigentlich nur eine `list`e von Routen/*Pfadoperationen*) dieses Callback-Routers zu übergeben: Verwenden Sie nun den Parameter `callbacks` im *Pfadoperation-Dekorator Ihrer API*, um das Attribut `.routes` (das ist eigentlich nur eine `list`e von Routen/*Pfadoperationen*) dieses Callback-Routers zu übergeben:
```Python hl_lines="35" ```Python hl_lines="35"
{!../../../docs_src/openapi_callbacks/tutorial001.py!} {!../../docs_src/openapi_callbacks/tutorial001.py!}
``` ```
!!! tip "Tipp" /// 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`. 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 ### Es in der Dokumentation ansehen
Jetzt können Sie Ihre Anwendung mit Uvicorn starten und auf <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a> gehen. Jetzt können Sie Ihre Anwendung mit Uvicorn starten und auf <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a> gehen.

12
docs/de/docs/advanced/openapi-webhooks.md

@ -22,22 +22,28 @@ 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. 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 /// 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. Webhooks sind in OpenAPI 3.1.0 und höher verfügbar und werden von FastAPI `0.99.0` und höher unterstützt.
///
## Eine Anwendung mit Webhooks ## Eine Anwendung mit Webhooks
Wenn Sie eine **FastAPI**-Anwendung erstellen, gibt es ein `webhooks`-Attribut, mit dem Sie *Webhooks* definieren können, genauso wie Sie *Pfadoperationen* definieren würden, zum Beispiel mit `@app.webhooks.post()`. Wenn Sie eine **FastAPI**-Anwendung erstellen, gibt es ein `webhooks`-Attribut, mit dem Sie *Webhooks* definieren können, genauso wie Sie *Pfadoperationen* definieren würden, zum Beispiel mit `@app.webhooks.post()`.
```Python hl_lines="9-13 36-53" ```Python hl_lines="9-13 36-53"
{!../../../docs_src/openapi_webhooks/tutorial001.py!} {!../../docs_src/openapi_webhooks/tutorial001.py!}
``` ```
Die von Ihnen definierten Webhooks landen im **OpenAPI**-Schema und der automatischen **Dokumentations-Oberfläche**. Die von Ihnen definierten Webhooks landen im **OpenAPI**-Schema und der automatischen **Dokumentations-Oberfläche**.
!!! info /// info
Das `app.webhooks`-Objekt ist eigentlich nur ein `APIRouter`, derselbe Typ, den Sie verwenden würden, wenn Sie Ihre Anwendung mit mehreren Dateien strukturieren. Das `app.webhooks`-Objekt ist eigentlich nur ein `APIRouter`, derselbe Typ, den Sie verwenden würden, wenn Sie Ihre 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`. 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`.
Das liegt daran, dass erwartet wird, dass **Ihre Benutzer** den tatsächlichen **URL-Pfad**, an dem diese den Webhook-Request empfangen möchten, auf andere Weise definieren (z. B. über ein Web-Dashboard). Das liegt daran, dass erwartet wird, dass **Ihre Benutzer** den tatsächlichen **URL-Pfad**, an dem diese den Webhook-Request empfangen möchten, auf andere Weise definieren (z. B. über ein Web-Dashboard).

76
docs/de/docs/advanced/path-operation-advanced-configuration.md

@ -2,15 +2,18 @@
## OpenAPI operationId ## OpenAPI operationId
!!! warning "Achtung" /// warning | "Achtung"
Wenn Sie kein „Experte“ für OpenAPI sind, brauchen Sie dies wahrscheinlich nicht. 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. Mit dem Parameter `operation_id` können Sie die OpenAPI `operationId` festlegen, die in Ihrer *Pfadoperation* verwendet werden soll.
Sie müssten sicherstellen, dass sie für jede Operation eindeutig ist. Sie müssten sicherstellen, dass sie für jede Operation eindeutig ist.
```Python hl_lines="6" ```Python hl_lines="6"
{!../../../docs_src/path_operation_advanced_configuration/tutorial001.py!} {!../../docs_src/path_operation_advanced_configuration/tutorial001.py!}
``` ```
### Verwendung des Namens der *Pfadoperation-Funktion* als operationId ### Verwendung des Namens der *Pfadoperation-Funktion* als operationId
@ -20,23 +23,29 @@ Wenn Sie die Funktionsnamen Ihrer API als `operationId`s verwenden möchten, kö
Sie sollten dies tun, nachdem Sie alle Ihre *Pfadoperationen* hinzugefügt haben. Sie sollten dies tun, nachdem Sie alle Ihre *Pfadoperationen* hinzugefügt haben.
```Python hl_lines="2 12-21 24" ```Python hl_lines="2 12-21 24"
{!../../../docs_src/path_operation_advanced_configuration/tutorial002.py!} {!../../docs_src/path_operation_advanced_configuration/tutorial002.py!}
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Wenn Sie `app.openapi()` manuell aufrufen, sollten Sie vorher die `operationId`s aktualisiert haben. Wenn Sie `app.openapi()` manuell aufrufen, sollten Sie vorher die `operationId`s aktualisiert haben.
!!! warning "Achtung" ///
/// warning | "Achtung"
Wenn Sie dies tun, müssen Sie sicherstellen, dass jede Ihrer *Pfadoperation-Funktionen* einen eindeutigen Namen hat. 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 ## Von OpenAPI ausschließen
Um eine *Pfadoperation* aus dem generierten OpenAPI-Schema (und damit aus den automatischen Dokumentationssystemen) auszuschließen, verwenden Sie den Parameter `include_in_schema` und setzen Sie ihn auf `False`: Um eine *Pfadoperation* aus dem generierten OpenAPI-Schema (und damit aus den automatischen Dokumentationssystemen) auszuschließen, verwenden Sie den Parameter `include_in_schema` und setzen Sie ihn auf `False`:
```Python hl_lines="6" ```Python hl_lines="6"
{!../../../docs_src/path_operation_advanced_configuration/tutorial003.py!} {!../../docs_src/path_operation_advanced_configuration/tutorial003.py!}
``` ```
## Fortgeschrittene Beschreibung mittels Docstring ## Fortgeschrittene Beschreibung mittels Docstring
@ -48,7 +57,7 @@ Das Hinzufügen eines `\f` (ein maskiertes „Form Feed“-Zeichen) führt dazu,
Sie wird nicht in der Dokumentation angezeigt, aber andere Tools (z. B. Sphinx) können den Rest verwenden. Sie wird nicht in der Dokumentation angezeigt, aber andere Tools (z. B. Sphinx) können den Rest verwenden.
```Python hl_lines="19-29" ```Python hl_lines="19-29"
{!../../../docs_src/path_operation_advanced_configuration/tutorial004.py!} {!../../docs_src/path_operation_advanced_configuration/tutorial004.py!}
``` ```
## Zusätzliche Responses ## Zusätzliche Responses
@ -65,20 +74,26 @@ 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. 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" /// note | "Technische Details"
In der OpenAPI-Spezifikation wird das <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#operation-object" class="external-link" target="_blank">Operationsobjekt</a> genannt. In der OpenAPI-Spezifikation wird das <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#operation-object" class="external-link" target="_blank">Operationsobjekt</a> genannt.
///
Es hat alle Informationen zur *Pfadoperation* und wird zur Erstellung der automatischen Dokumentation verwendet. Es hat alle Informationen zur *Pfadoperation* und wird zur Erstellung der automatischen Dokumentation verwendet.
Es enthält `tags`, `parameters`, `requestBody`, `responses`, usw. 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. Dieses *Pfadoperation*-spezifische OpenAPI-Schema wird normalerweise automatisch von **FastAPI** generiert, Sie können es aber auch erweitern.
!!! tip "Tipp" /// tip | "Tipp"
Dies ist ein Low-Level Erweiterungspunkt. Dies ist ein Low-Level Erweiterungspunkt.
Wenn Sie nur zusätzliche Responses deklarieren müssen, können Sie dies bequemer mit [Zusätzliche Responses in OpenAPI](additional-responses.md){.internal-link target=_blank} tun. 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. Sie können das OpenAPI-Schema für eine *Pfadoperation* erweitern, indem Sie den Parameter `openapi_extra` verwenden.
### OpenAPI-Erweiterungen ### OpenAPI-Erweiterungen
@ -86,7 +101,7 @@ Sie können das OpenAPI-Schema für eine *Pfadoperation* erweitern, indem Sie de
Dieses `openapi_extra` kann beispielsweise hilfreich sein, um <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#specificationExtensions" class="external-link" target="_blank">OpenAPI-Erweiterungen</a> zu deklarieren: Dieses `openapi_extra` kann beispielsweise hilfreich sein, um <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#specificationExtensions" class="external-link" target="_blank">OpenAPI-Erweiterungen</a> zu deklarieren:
```Python hl_lines="6" ```Python hl_lines="6"
{!../../../docs_src/path_operation_advanced_configuration/tutorial005.py!} {!../../docs_src/path_operation_advanced_configuration/tutorial005.py!}
``` ```
Wenn Sie die automatische API-Dokumentation öffnen, wird Ihre Erweiterung am Ende der spezifischen *Pfadoperation* angezeigt. Wenn Sie die automatische API-Dokumentation öffnen, wird Ihre Erweiterung am Ende der spezifischen *Pfadoperation* angezeigt.
@ -135,7 +150,7 @@ Sie könnten sich beispielsweise dafür entscheiden, den Request mit Ihrem eigen
Das könnte man mit `openapi_extra` machen: Das könnte man mit `openapi_extra` machen:
```Python hl_lines="20-37 39-40" ```Python hl_lines="20-37 39-40"
{!../../../docs_src/path_operation_advanced_configuration/tutorial006.py!} {!../../docs_src/path_operation_advanced_configuration/tutorial006.py!}
``` ```
In diesem Beispiel haben wir kein Pydantic-Modell deklariert. Tatsächlich wird der Requestbody nicht einmal als JSON <abbr title="von einem einfachen Format, wie Bytes, in Python-Objekte konvertieren">geparst</abbr>, sondern direkt als `bytes` gelesen und die Funktion `magic_data_reader ()` wäre dafür verantwortlich, ihn in irgendeiner Weise zu parsen. In diesem Beispiel haben wir kein Pydantic-Modell deklariert. Tatsächlich wird der Requestbody nicht einmal als JSON <abbr title="von einem einfachen Format, wie Bytes, in Python-Objekte konvertieren">geparst</abbr>, sondern direkt als `bytes` gelesen und die Funktion `magic_data_reader ()` wäre dafür verantwortlich, ihn in irgendeiner Weise zu parsen.
@ -150,43 +165,60 @@ 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: 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" ```Python hl_lines="17-22 24"
{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007.py!} {!> ../../docs_src/path_operation_advanced_configuration/tutorial007.py!}
``` ```
=== "Pydantic v1" ////
//// tab | Pydantic v1
```Python hl_lines="17-22 24" ```Python hl_lines="17-22 24"
{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py!} {!> ../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py!}
``` ```
!!! info ////
/// info
In Pydantic Version 1 hieß die Methode zum Abrufen des JSON-Schemas für ein Modell `Item.schema()`, in Pydantic Version 2 heißt die Methode `Item.model_json_schema()`. 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. 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.
Dann verwenden wir den Request direkt und extrahieren den Body als `bytes`. Das bedeutet, dass FastAPI nicht einmal versucht, den Request-Payload als JSON zu parsen. Dann verwenden wir den Request direkt und extrahieren den Body als `bytes`. Das bedeutet, dass FastAPI nicht einmal versucht, den Request-Payload als JSON zu parsen.
Und dann parsen wir in unserem Code diesen YAML-Inhalt direkt und verwenden dann wieder dasselbe Pydantic-Modell, um den YAML-Inhalt zu validieren: 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" ```Python hl_lines="26-33"
{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007.py!} {!> ../../docs_src/path_operation_advanced_configuration/tutorial007.py!}
``` ```
=== "Pydantic v1" ////
//// tab | Pydantic v1
```Python hl_lines="26-33" ```Python hl_lines="26-33"
{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py!} {!> ../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py!}
``` ```
!!! info ////
/// info
In Pydantic Version 1 war die Methode zum Parsen und Validieren eines Objekts `Item.parse_obj()`, in Pydantic Version 2 heißt die Methode `Item.model_validate()`. 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()`.
!!! tip "Tipp" ///
/// tip | "Tipp"
Hier verwenden wir dasselbe Pydantic-Modell wieder. 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.
///

2
docs/de/docs/advanced/response-change-status-code.md

@ -21,7 +21,7 @@ Sie können einen Parameter vom Typ `Response` in Ihrer *Pfadoperation-Funktion*
Anschließend können Sie den `status_code` in diesem *vorübergehenden* Response-Objekt festlegen. Anschließend können Sie den `status_code` in diesem *vorübergehenden* Response-Objekt festlegen.
```Python hl_lines="1 9 12" ```Python hl_lines="1 9 12"
{!../../../docs_src/response_change_status_code/tutorial001.py!} {!../../docs_src/response_change_status_code/tutorial001.py!}
``` ```
Und dann können Sie wie gewohnt jedes benötigte Objekt zurückgeben (ein `dict`, ein Datenbankmodell usw.). Und dann können Sie wie gewohnt jedes benötigte Objekt zurückgeben (ein `dict`, ein Datenbankmodell usw.).

14
docs/de/docs/advanced/response-cookies.md

@ -7,7 +7,7 @@ Sie können einen Parameter vom Typ `Response` in Ihrer *Pfadoperation-Funktion*
Und dann können Sie Cookies in diesem *vorübergehenden* Response-Objekt setzen. Und dann können Sie Cookies in diesem *vorübergehenden* Response-Objekt setzen.
```Python hl_lines="1 8-9" ```Python hl_lines="1 8-9"
{!../../../docs_src/response_cookies/tutorial002.py!} {!../../docs_src/response_cookies/tutorial002.py!}
``` ```
Anschließend können Sie wie gewohnt jedes gewünschte Objekt zurückgeben (ein `dict`, ein Datenbankmodell, usw.). Anschließend können Sie wie gewohnt jedes gewünschte Objekt zurückgeben (ein `dict`, ein Datenbankmodell, usw.).
@ -27,23 +27,29 @@ Dazu können Sie eine Response erstellen, wie unter [Eine Response direkt zurüc
Setzen Sie dann Cookies darin und geben Sie sie dann zurück: Setzen Sie dann Cookies darin und geben Sie sie dann zurück:
```Python hl_lines="10-12" ```Python hl_lines="10-12"
{!../../../docs_src/response_cookies/tutorial001.py!} {!../../docs_src/response_cookies/tutorial001.py!}
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Beachten Sie, dass, wenn Sie eine Response direkt zurückgeben, anstatt den `Response`-Parameter zu verwenden, FastAPI diese direkt zurückgibt. Beachten Sie, dass, wenn Sie eine Response direkt zurückgeben, anstatt den `Response`-Parameter zu verwenden, FastAPI diese direkt zurückgibt.
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. 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. Und auch, dass Sie keine Daten senden, die durch ein `response_model` hätten gefiltert werden sollen.
///
### Mehr Informationen ### Mehr Informationen
!!! note "Technische Details" /// note | "Technische Details"
Sie können auch `from starlette.responses import Response` oder `from starlette.responses import JSONResponse` verwenden. 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 <a href="https://www.starlette.io/responses/#set-cookie" class="external-link" target="_blank">Dokumentation in Starlette</a> an. Um alle verfügbaren Parameter und Optionen anzuzeigen, sehen Sie sich deren <a href="https://www.starlette.io/responses/#set-cookie" class="external-link" target="_blank">Dokumentation in Starlette</a> an.

14
docs/de/docs/advanced/response-directly.md

@ -14,9 +14,12 @@ Das kann beispielsweise nützlich sein, um benutzerdefinierte Header oder Cookie
Tatsächlich können Sie jede `Response` oder jede Unterklasse davon zurückgeben. Tatsächlich können Sie jede `Response` oder jede Unterklasse davon zurückgeben.
!!! tip "Tipp" /// tip | "Tipp"
`JSONResponse` selbst ist eine Unterklasse von `Response`. `JSONResponse` selbst ist eine Unterklasse von `Response`.
///
Und wenn Sie eine `Response` zurückgeben, wird **FastAPI** diese direkt weiterleiten. Und wenn Sie eine `Response` zurückgeben, wird **FastAPI** diese direkt weiterleiten.
Es wird keine Datenkonvertierung mit Pydantic-Modellen durchführen, es wird den Inhalt nicht in irgendeinen Typ konvertieren, usw. Es wird keine Datenkonvertierung mit Pydantic-Modellen durchführen, es wird den Inhalt nicht in irgendeinen Typ konvertieren, usw.
@ -32,14 +35,17 @@ Sie können beispielsweise kein Pydantic-Modell in eine `JSONResponse` einfügen
In diesen Fällen können Sie den `jsonable_encoder` verwenden, um Ihre Daten zu konvertieren, bevor Sie sie an eine Response übergeben: In diesen Fällen können Sie den `jsonable_encoder` verwenden, um Ihre Daten zu konvertieren, bevor Sie sie an eine Response übergeben:
```Python hl_lines="6-7 21-22" ```Python hl_lines="6-7 21-22"
{!../../../docs_src/response_directly/tutorial001.py!} {!../../docs_src/response_directly/tutorial001.py!}
``` ```
!!! note "Technische Details" /// note | "Technische Details"
Sie können auch `from starlette.responses import JSONResponse` verwenden. 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 ## Eine benutzerdefinierte `Response` zurückgeben
Das obige Beispiel zeigt alle Teile, die Sie benötigen, ist aber noch nicht sehr nützlich, da Sie das `item` einfach direkt hätten zurückgeben können, und **FastAPI** würde es für Sie in eine `JSONResponse` einfügen, es in ein `dict` konvertieren, usw. All das standardmäßig. Das obige Beispiel zeigt alle Teile, die Sie benötigen, ist aber noch nicht sehr nützlich, da Sie das `item` einfach direkt hätten zurückgeben können, und **FastAPI** würde es für Sie in eine `JSONResponse` einfügen, es in ein `dict` konvertieren, usw. All das standardmäßig.
@ -51,7 +57,7 @@ Nehmen wir an, Sie möchten eine <a href="https://en.wikipedia.org/wiki/XML" cla
Sie könnten Ihren XML-Inhalt als String in eine `Response` einfügen und sie zurückgeben: Sie könnten Ihren XML-Inhalt als String in eine `Response` einfügen und sie zurückgeben:
```Python hl_lines="1 18" ```Python hl_lines="1 18"
{!../../../docs_src/response_directly/tutorial002.py!} {!../../docs_src/response_directly/tutorial002.py!}
``` ```
## Anmerkungen ## Anmerkungen

9
docs/de/docs/advanced/response-headers.md

@ -7,7 +7,7 @@ Sie können einen Parameter vom Typ `Response` in Ihrer *Pfadoperation-Funktion*
Und dann können Sie Header in diesem *vorübergehenden* Response-Objekt festlegen. Und dann können Sie Header in diesem *vorübergehenden* Response-Objekt festlegen.
```Python hl_lines="1 7-8" ```Python hl_lines="1 7-8"
{!../../../docs_src/response_headers/tutorial002.py!} {!../../docs_src/response_headers/tutorial002.py!}
``` ```
Anschließend können Sie wie gewohnt jedes gewünschte Objekt zurückgeben (ein `dict`, ein Datenbankmodell, usw.). Anschließend können Sie wie gewohnt jedes gewünschte Objekt zurückgeben (ein `dict`, ein Datenbankmodell, usw.).
@ -25,16 +25,19 @@ Sie können auch Header hinzufügen, wenn Sie eine `Response` direkt zurückgebe
Erstellen Sie eine Response wie in [Eine Response direkt zurückgeben](response-directly.md){.internal-link target=_blank} beschrieben und übergeben Sie die Header als zusätzlichen Parameter: Erstellen Sie eine Response wie in [Eine Response direkt zurückgeben](response-directly.md){.internal-link target=_blank} beschrieben und übergeben Sie die Header als zusätzlichen Parameter:
```Python hl_lines="10-12" ```Python hl_lines="10-12"
{!../../../docs_src/response_headers/tutorial001.py!} {!../../docs_src/response_headers/tutorial001.py!}
``` ```
!!! note "Technische Details" /// note | "Technische Details"
Sie können auch `from starlette.responses import Response` oder `from starlette.responses import JSONResponse` verwenden. 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.
///
## Benutzerdefinierte Header ## Benutzerdefinierte Header
Beachten Sie, dass benutzerdefinierte proprietäre Header <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">mittels des Präfix 'X-'</a> hinzugefügt werden können. Beachten Sie, dass benutzerdefinierte proprietäre Header <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">mittels des Präfix 'X-'</a> hinzugefügt werden können.

69
docs/de/docs/advanced/security/http-basic-auth.md

@ -20,27 +20,36 @@ Wenn Sie dann den Benutzernamen und das Passwort eingeben, sendet der Browser di
* Diese gibt ein Objekt vom Typ `HTTPBasicCredentials` zurück: * Diese gibt ein Objekt vom Typ `HTTPBasicCredentials` zurück:
* Es enthält den gesendeten `username` und das gesendete `password`. * Es enthält den gesendeten `username` und das gesendete `password`.
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="4 8 12" ```Python hl_lines="4 8 12"
{!> ../../../docs_src/security/tutorial006_an_py39.py!} {!> ../../docs_src/security/tutorial006_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="2 7 11" ```Python hl_lines="2 7 11"
{!> ../../../docs_src/security/tutorial006_an.py!} {!> ../../docs_src/security/tutorial006_an.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="2 6 10" ```Python hl_lines="2 6 10"
{!> ../../../docs_src/security/tutorial006.py!} {!> ../../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: 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:
<img src="/img/tutorial/security/image12.png"> <img src="/img/tutorial/security/image12.png">
@ -59,27 +68,36 @@ 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. 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" ```Python hl_lines="1 12-24"
{!> ../../../docs_src/security/tutorial007_an_py39.py!} {!> ../../docs_src/security/tutorial007_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="1 12-24" ```Python hl_lines="1 12-24"
{!> ../../../docs_src/security/tutorial007_an.py!} {!> ../../docs_src/security/tutorial007_an.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="1 11-21" ```Python hl_lines="1 11-21"
{!> ../../../docs_src/security/tutorial007.py!} {!> ../../docs_src/security/tutorial007.py!}
``` ```
////
Dies wäre das gleiche wie: Dies wäre das gleiche wie:
```Python ```Python
@ -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: 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" ```Python hl_lines="26-30"
{!> ../../../docs_src/security/tutorial007_an_py39.py!} {!> ../../docs_src/security/tutorial007_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="26-30" ```Python hl_lines="26-30"
{!> ../../../docs_src/security/tutorial007_an.py!} {!> ../../docs_src/security/tutorial007_an.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="23-27" ```Python hl_lines="23-27"
{!> ../../../docs_src/security/tutorial007.py!} {!> ../../docs_src/security/tutorial007.py!}
``` ```
////

5
docs/de/docs/advanced/security/index.md

@ -4,11 +4,14 @@
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. 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" /// tip | "Tipp"
Die nächsten Abschnitte sind **nicht unbedingt „fortgeschritten“**. 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. Und es ist möglich, dass für Ihren Anwendungsfall die Lösung in einem davon liegt.
///
## Lesen Sie zuerst das Tutorial ## Lesen Sie zuerst das Tutorial
In den nächsten Abschnitten wird davon ausgegangen, dass Sie das Haupt-[Tutorial – Benutzerhandbuch: Sicherheit](../../tutorial/security/index.md){.internal-link target=_blank} bereits gelesen haben. In den nächsten Abschnitten wird davon ausgegangen, dass Sie das Haupt-[Tutorial – Benutzerhandbuch: Sicherheit](../../tutorial/security/index.md){.internal-link target=_blank} bereits gelesen haben.

442
docs/de/docs/advanced/security/oauth2-scopes.md

@ -10,7 +10,8 @@ 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. In diesem Abschnitt erfahren Sie, wie Sie Authentifizierung und Autorisierung mit demselben OAuth2, mit Scopes in Ihrer **FastAPI**-Anwendung verwalten.
!!! warning "Achtung" /// warning | "Achtung"
Dies ist ein mehr oder weniger fortgeschrittener Abschnitt. Wenn Sie gerade erst anfangen, können Sie ihn überspringen. Dies ist ein mehr oder weniger fortgeschrittener Abschnitt. Wenn Sie gerade erst anfangen, können Sie ihn überspringen.
Sie benötigen nicht unbedingt OAuth2-Scopes, und Sie können die Authentifizierung und Autorisierung handhaben wie Sie möchten. Sie benötigen nicht unbedingt OAuth2-Scopes, und Sie können die Authentifizierung und Autorisierung handhaben wie Sie möchten.
@ -23,6 +24,8 @@ In diesem Abschnitt erfahren Sie, wie Sie Authentifizierung und Autorisierung mi
Aber wenn Sie wissen, dass Sie es brauchen oder neugierig sind, lesen Sie weiter. Aber wenn Sie wissen, dass Sie es brauchen oder neugierig sind, lesen Sie weiter.
///
## OAuth2-Scopes und OpenAPI ## OAuth2-Scopes und OpenAPI
Die OAuth2-Spezifikation definiert „Scopes“ als eine Liste von durch Leerzeichen getrennten Strings. Die OAuth2-Spezifikation definiert „Scopes“ als eine Liste von durch Leerzeichen getrennten Strings.
@ -43,7 +46,8 @@ Er wird normalerweise verwendet, um bestimmte Sicherheitsberechtigungen zu dekla
* `instagram_basic` wird von Facebook / Instagram verwendet. * `instagram_basic` wird von Facebook / Instagram verwendet.
* `https://www.googleapis.com/auth/drive` wird von Google verwendet. * `https://www.googleapis.com/auth/drive` wird von Google verwendet.
!!! info /// info
In OAuth2 ist ein „Scope“ nur ein String, der eine bestimmte erforderliche Berechtigung deklariert. 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.
@ -52,55 +56,78 @@ Er wird normalerweise verwendet, um bestimmte Sicherheitsberechtigungen zu dekla
Für OAuth2 sind es einfach nur Strings. Für OAuth2 sind es einfach nur Strings.
///
## Gesamtübersicht ## 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: 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" ```Python hl_lines="4 8 12 46 64 105 107-115 121-124 128-134 139 155"
{!> ../../../docs_src/security/tutorial005_an_py310.py!} {!> ../../docs_src/security/tutorial005_an_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155" ```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!} {!> ../../docs_src/security/tutorial005_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="2 4 8 12 47 65 106 108-116 122-125 129-135 140 156" ```Python hl_lines="2 4 8 12 47 65 106 108-116 122-125 129-135 140 156"
{!> ../../../docs_src/security/tutorial005_an.py!} {!> ../../docs_src/security/tutorial005_an.py!}
``` ```
=== "Python 3.10+ nicht annotiert" ////
//// tab | 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" ```Python hl_lines="3 7 11 45 63 104 106-114 120-123 127-133 138 154"
{!> ../../../docs_src/security/tutorial005_py310.py!} {!> ../../docs_src/security/tutorial005_py310.py!}
``` ```
=== "Python 3.9+ nicht annotiert" ////
//// tab | 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="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155" ```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155"
{!> ../../../docs_src/security/tutorial005_py39.py!} {!> ../../docs_src/security/tutorial005_py39.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155" ```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155"
{!> ../../../docs_src/security/tutorial005.py!} {!> ../../docs_src/security/tutorial005.py!}
``` ```
////
Sehen wir uns diese Änderungen nun Schritt für Schritt an. Sehen wir uns diese Änderungen nun Schritt für Schritt an.
## OAuth2-Sicherheitsschema ## OAuth2-Sicherheitsschema
@ -109,52 +136,72 @@ 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: 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" ```Python hl_lines="62-65"
{!> ../../../docs_src/security/tutorial005_an_py310.py!} {!> ../../docs_src/security/tutorial005_an_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="62-65" ```Python hl_lines="62-65"
{!> ../../../docs_src/security/tutorial005_an_py39.py!} {!> ../../docs_src/security/tutorial005_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="63-66" ```Python hl_lines="63-66"
{!> ../../../docs_src/security/tutorial005_an.py!} {!> ../../docs_src/security/tutorial005_an.py!}
``` ```
=== "Python 3.10+ nicht annotiert" ////
//// tab | 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="61-64" ```Python hl_lines="61-64"
{!> ../../../docs_src/security/tutorial005_py310.py!} {!> ../../docs_src/security/tutorial005_py310.py!}
``` ```
////
=== "Python 3.9+ nicht annotiert" //// tab | 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="62-65" ```Python hl_lines="62-65"
{!> ../../../docs_src/security/tutorial005_py39.py!} {!> ../../docs_src/security/tutorial005_py39.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="62-65" ```Python hl_lines="62-65"
{!> ../../../docs_src/security/tutorial005.py!} {!> ../../docs_src/security/tutorial005.py!}
``` ```
////
Da wir diese Scopes jetzt deklarieren, werden sie in der API-Dokumentation angezeigt, wenn Sie sich einloggen/autorisieren. Da wir diese Scopes jetzt deklarieren, werden sie in der API-Dokumentation angezeigt, wenn Sie sich einloggen/autorisieren.
Und Sie können auswählen, auf welche Scopes Sie Zugriff haben möchten: `me` und `items`. Und Sie können auswählen, auf welche Scopes Sie Zugriff haben möchten: `me` und `items`.
@ -171,56 +218,80 @@ Wir verwenden immer noch dasselbe `OAuth2PasswordRequestForm`. Es enthält eine
Und wir geben die Scopes als Teil des JWT-Tokens zurück. Und wir geben die Scopes als Teil des JWT-Tokens zurück.
!!! danger "Gefahr" /// danger | "Gefahr"
Der Einfachheit halber fügen wir hier die empfangenen Scopes direkt zum Token hinzu. 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+" ///
//// tab | Python 3.10+
```Python hl_lines="155" ```Python hl_lines="155"
{!> ../../../docs_src/security/tutorial005_an_py310.py!} {!> ../../docs_src/security/tutorial005_an_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="155" ```Python hl_lines="155"
{!> ../../../docs_src/security/tutorial005_an_py39.py!} {!> ../../docs_src/security/tutorial005_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="156" ```Python hl_lines="156"
{!> ../../../docs_src/security/tutorial005_an.py!} {!> ../../docs_src/security/tutorial005_an.py!}
``` ```
=== "Python 3.10+ nicht annotiert" ////
//// tab | 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="154" ```Python hl_lines="154"
{!> ../../../docs_src/security/tutorial005_py310.py!} {!> ../../docs_src/security/tutorial005_py310.py!}
``` ```
=== "Python 3.9+ nicht annotiert" ////
//// tab | 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="155" ```Python hl_lines="155"
{!> ../../../docs_src/security/tutorial005_py39.py!} {!> ../../docs_src/security/tutorial005_py39.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="155" ```Python hl_lines="155"
{!> ../../../docs_src/security/tutorial005.py!} {!> ../../docs_src/security/tutorial005.py!}
``` ```
////
## Scopes in *Pfadoperationen* und Abhängigkeiten deklarieren ## Scopes in *Pfadoperationen* und Abhängigkeiten deklarieren
Jetzt deklarieren wir, dass die *Pfadoperation* für `/users/me/items/` den Scope `items` erfordert. Jetzt deklarieren wir, dass die *Pfadoperation* für `/users/me/items/` den Scope `items` erfordert.
@ -237,63 +308,90 @@ 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). In diesem Fall erfordert sie den Scope `me` (sie könnte mehr als einen Scope erfordern).
!!! note "Hinweis" /// note | "Hinweis"
Sie müssen nicht unbedingt an verschiedenen Stellen verschiedene Scopes hinzufügen. 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. Wir tun dies hier, um zu demonstrieren, wie **FastAPI** auf verschiedenen Ebenen deklarierte Scopes verarbeitet.
=== "Python 3.10+" ///
//// tab | Python 3.10+
```Python hl_lines="4 139 170" ```Python hl_lines="4 139 170"
{!> ../../../docs_src/security/tutorial005_an_py310.py!} {!> ../../docs_src/security/tutorial005_an_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="4 139 170" ```Python hl_lines="4 139 170"
{!> ../../../docs_src/security/tutorial005_an_py39.py!} {!> ../../docs_src/security/tutorial005_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="4 140 171" ```Python hl_lines="4 140 171"
{!> ../../../docs_src/security/tutorial005_an.py!} {!> ../../docs_src/security/tutorial005_an.py!}
``` ```
=== "Python 3.10+ nicht annotiert" ////
//// tab | 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 138 167" ```Python hl_lines="3 138 167"
{!> ../../../docs_src/security/tutorial005_py310.py!} {!> ../../docs_src/security/tutorial005_py310.py!}
``` ```
=== "Python 3.9+ nicht annotiert" ////
//// tab | 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="4 139 168" ```Python hl_lines="4 139 168"
{!> ../../../docs_src/security/tutorial005_py39.py!} {!> ../../docs_src/security/tutorial005_py39.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="4 139 168" ```Python hl_lines="4 139 168"
{!> ../../../docs_src/security/tutorial005.py!} {!> ../../docs_src/security/tutorial005.py!}
``` ```
!!! info "Technische Details" ////
/// 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. `Security` ist tatsächlich eine Unterklasse von `Depends` und hat nur noch einen zusätzlichen Parameter, den wir später kennenlernen werden.
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. 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. 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 ## `SecurityScopes` verwenden
Aktualisieren Sie nun die Abhängigkeit `get_current_user`. Aktualisieren Sie nun die Abhängigkeit `get_current_user`.
@ -308,51 +406,72 @@ 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). 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" ```Python hl_lines="8 105"
{!> ../../../docs_src/security/tutorial005_an_py310.py!} {!> ../../docs_src/security/tutorial005_an_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="8 105" ```Python hl_lines="8 105"
{!> ../../../docs_src/security/tutorial005_an_py39.py!} {!> ../../docs_src/security/tutorial005_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="8 106" ```Python hl_lines="8 106"
{!> ../../../docs_src/security/tutorial005_an.py!} {!> ../../docs_src/security/tutorial005_an.py!}
``` ```
=== "Python 3.10+ nicht annotiert" ////
//// tab | 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="7 104" ```Python hl_lines="7 104"
{!> ../../../docs_src/security/tutorial005_py310.py!} {!> ../../docs_src/security/tutorial005_py310.py!}
``` ```
=== "Python 3.9+ nicht annotiert" ////
//// tab | 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="8 105" ```Python hl_lines="8 105"
{!> ../../../docs_src/security/tutorial005_py39.py!} {!> ../../docs_src/security/tutorial005_py39.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="8 105" ```Python hl_lines="8 105"
{!> ../../../docs_src/security/tutorial005.py!} {!> ../../docs_src/security/tutorial005.py!}
``` ```
////
## Die `scopes` verwenden ## Die `scopes` verwenden
Der Parameter `security_scopes` wird vom Typ `SecurityScopes` sein. Der Parameter `security_scopes` wird vom Typ `SecurityScopes` sein.
@ -365,51 +484,72 @@ 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). 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" ```Python hl_lines="105 107-115"
{!> ../../../docs_src/security/tutorial005_an_py310.py!} {!> ../../docs_src/security/tutorial005_an_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="105 107-115" ```Python hl_lines="105 107-115"
{!> ../../../docs_src/security/tutorial005_an_py39.py!} {!> ../../docs_src/security/tutorial005_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="106 108-116" ```Python hl_lines="106 108-116"
{!> ../../../docs_src/security/tutorial005_an.py!} {!> ../../docs_src/security/tutorial005_an.py!}
``` ```
=== "Python 3.10+ nicht annotiert" ////
//// tab | 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="104 106-114" ```Python hl_lines="104 106-114"
{!> ../../../docs_src/security/tutorial005_py310.py!} {!> ../../docs_src/security/tutorial005_py310.py!}
``` ```
=== "Python 3.9+ nicht annotiert" ////
//// tab | 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="105 107-115" ```Python hl_lines="105 107-115"
{!> ../../../docs_src/security/tutorial005_py39.py!} {!> ../../docs_src/security/tutorial005_py39.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="105 107-115" ```Python hl_lines="105 107-115"
{!> ../../../docs_src/security/tutorial005.py!} {!> ../../docs_src/security/tutorial005.py!}
``` ```
////
## Den `username` und das Format der Daten überprüfen ## Den `username` und das Format der Daten überprüfen
Wir verifizieren, dass wir einen `username` erhalten, und extrahieren die Scopes. Wir verifizieren, dass wir einen `username` erhalten, und extrahieren die Scopes.
@ -424,102 +564,144 @@ 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. 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" ```Python hl_lines="46 116-127"
{!> ../../../docs_src/security/tutorial005_an_py310.py!} {!> ../../docs_src/security/tutorial005_an_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="46 116-127" ```Python hl_lines="46 116-127"
{!> ../../../docs_src/security/tutorial005_an_py39.py!} {!> ../../docs_src/security/tutorial005_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="47 117-128" ```Python hl_lines="47 117-128"
{!> ../../../docs_src/security/tutorial005_an.py!} {!> ../../docs_src/security/tutorial005_an.py!}
``` ```
=== "Python 3.10+ nicht annotiert" ////
//// tab | 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="45 115-126" ```Python hl_lines="45 115-126"
{!> ../../../docs_src/security/tutorial005_py310.py!} {!> ../../docs_src/security/tutorial005_py310.py!}
``` ```
=== "Python 3.9+ nicht annotiert" ////
//// tab | 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" ```Python hl_lines="46 116-127"
{!> ../../../docs_src/security/tutorial005_py39.py!} {!> ../../docs_src/security/tutorial005_py39.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="46 116-127" ```Python hl_lines="46 116-127"
{!> ../../../docs_src/security/tutorial005.py!} {!> ../../docs_src/security/tutorial005.py!}
``` ```
////
## Die `scopes` verifizieren ## Die `scopes` verifizieren
Wir überprüfen nun, ob das empfangenen Token alle Scopes enthält, die von dieser Abhängigkeit und deren Verwendern (einschließlich *Pfadoperationen*) gefordert werden. Andernfalls lösen wir eine `HTTPException` aus. Wir überprüfen nun, ob das empfangenen Token alle Scopes enthält, die von dieser Abhängigkeit und deren Verwendern (einschließlich *Pfadoperationen*) gefordert werden. Andernfalls lösen wir eine `HTTPException` aus.
Hierzu verwenden wir `security_scopes.scopes`, das eine `list`e mit allen diesen Scopes als `str` enthält. 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" ```Python hl_lines="128-134"
{!> ../../../docs_src/security/tutorial005_an_py310.py!} {!> ../../docs_src/security/tutorial005_an_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="128-134" ```Python hl_lines="128-134"
{!> ../../../docs_src/security/tutorial005_an_py39.py!} {!> ../../docs_src/security/tutorial005_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="129-135" ```Python hl_lines="129-135"
{!> ../../../docs_src/security/tutorial005_an.py!} {!> ../../docs_src/security/tutorial005_an.py!}
``` ```
=== "Python 3.10+ nicht annotiert" ////
//// tab | 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="127-133" ```Python hl_lines="127-133"
{!> ../../../docs_src/security/tutorial005_py310.py!} {!> ../../docs_src/security/tutorial005_py310.py!}
``` ```
=== "Python 3.9+ nicht annotiert" ////
//// tab | 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="128-134" ```Python hl_lines="128-134"
{!> ../../../docs_src/security/tutorial005_py39.py!} {!> ../../docs_src/security/tutorial005_py39.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="128-134" ```Python hl_lines="128-134"
{!> ../../../docs_src/security/tutorial005.py!} {!> ../../docs_src/security/tutorial005.py!}
``` ```
////
## Abhängigkeitsbaum und Scopes ## Abhängigkeitsbaum und Scopes
Sehen wir uns diesen Abhängigkeitsbaum und die Scopes noch einmal an. Sehen wir uns diesen Abhängigkeitsbaum und die Scopes noch einmal an.
@ -545,11 +727,14 @@ 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` 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. * `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" /// 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. 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`. ## Weitere Details zu `SecurityScopes`.
Sie können `SecurityScopes` an jeder Stelle und an mehreren Stellen verwenden, es muss sich nicht in der „Wurzel“-Abhängigkeit befinden. Sie können `SecurityScopes` an jeder Stelle und an mehreren Stellen verwenden, es muss sich nicht in der „Wurzel“-Abhängigkeit befinden.
@ -586,11 +771,14 @@ 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. 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" /// note | "Hinweis"
Es ist üblich, dass jeder Authentifizierungsanbieter seine Flows anders benennt, um sie zu einem Teil seiner Marke zu machen. 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`. **FastAPI** enthält Werkzeuge für alle diese OAuth2-Authentifizierungs-Flows in `fastapi.security.oauth2`.
## `Security` in Dekorator-`dependencies` ## `Security` in Dekorator-`dependencies`

181
docs/de/docs/advanced/settings.md

@ -8,14 +8,17 @@ Aus diesem Grund werden diese üblicherweise in Umgebungsvariablen bereitgestell
## Umgebungsvariablen ## Umgebungsvariablen
!!! tip "Tipp" /// 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. 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 <a href="https://de.wikipedia.org/wiki/Umgebungsvariable" class="external-link" target="_blank">Umgebungsvariable</a> (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. Eine <a href="https://de.wikipedia.org/wiki/Umgebungsvariable" class="external-link" target="_blank">Umgebungsvariable</a> (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: Sie können Umgebungsvariablen in der Shell erstellen und verwenden, ohne Python zu benötigen:
=== "Linux, macOS, Windows Bash" //// tab | Linux, macOS, Windows Bash
<div class="termy"> <div class="termy">
@ -31,7 +34,9 @@ Sie können Umgebungsvariablen in der Shell erstellen und verwenden, ohne Python
</div> </div>
=== "Windows PowerShell" ////
//// tab | Windows PowerShell
<div class="termy"> <div class="termy">
@ -47,6 +52,8 @@ Sie können Umgebungsvariablen in der Shell erstellen und verwenden, ohne Python
</div> </div>
////
### Umgebungsvariablen mit Python auslesen ### Umgebungsvariablen mit Python auslesen
Sie können Umgebungsvariablen auch außerhalb von Python im Terminal (oder mit einer anderen Methode) erstellen und diese dann mit Python auslesen. Sie können Umgebungsvariablen auch außerhalb von Python im Terminal (oder mit einer anderen Methode) erstellen und diese dann mit Python auslesen.
@ -60,11 +67,14 @@ name = os.getenv("MY_NAME", "World")
print(f"Hello {name} from Python") print(f"Hello {name} from Python")
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Das zweite Argument für <a href="https://docs.python.org/3.8/library/os.html#os.getenv" class="external-link" target="_blank">`os.getenv()`</a> ist der zurückzugebende Defaultwert. Das zweite Argument für <a href="https://docs.python.org/3.8/library/os.html#os.getenv" class="external-link" target="_blank">`os.getenv()`</a> 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: Dann könnten Sie dieses Python-Programm aufrufen:
<div class="termy"> <div class="termy">
@ -114,9 +124,12 @@ Hello World from Python
</div> </div>
!!! tip "Tipp" /// tip | "Tipp"
Weitere Informationen dazu finden Sie unter <a href="https://12factor.net/config" class="external-link" target="_blank">The Twelve-Factor App: Config</a>. Weitere Informationen dazu finden Sie unter <a href="https://12factor.net/config" class="external-link" target="_blank">The Twelve-Factor App: Config</a>.
///
### Typen und Validierung ### Typen und Validierung
Diese Umgebungsvariablen können nur Text-Zeichenketten verarbeiten, da sie außerhalb von Python liegen und mit anderen Programmen und dem Rest des Systems (und sogar mit verschiedenen Betriebssystemen wie Linux, Windows, macOS) kompatibel sein müssen. Diese Umgebungsvariablen können nur Text-Zeichenketten verarbeiten, da sie außerhalb von Python liegen und mit anderen Programmen und dem Rest des Systems (und sogar mit verschiedenen Betriebssystemen wie Linux, Windows, macOS) kompatibel sein müssen.
@ -151,9 +164,12 @@ $ pip install "fastapi[all]"
</div> </div>
!!! info /// info
In Pydantic v1 war das im Hauptpackage enthalten. Jetzt wird es als unabhängiges Package verteilt, sodass Sie wählen können, ob Sie es installieren möchten oder nicht, falls Sie die Funktionalität nicht benötigen. In Pydantic v1 war das im Hauptpackage enthalten. Jetzt wird es als unabhängiges Package verteilt, sodass Sie wählen können, ob Sie es installieren möchten oder nicht, falls Sie die Funktionalität nicht benötigen.
///
### Das `Settings`-Objekt erstellen ### Das `Settings`-Objekt erstellen
Importieren Sie `BaseSettings` aus Pydantic und erstellen Sie eine Unterklasse, ganz ähnlich wie bei einem Pydantic-Modell. Importieren Sie `BaseSettings` aus Pydantic und erstellen Sie eine Unterklasse, ganz ähnlich wie bei einem Pydantic-Modell.
@ -162,24 +178,34 @@ Auf die gleiche Weise wie bei Pydantic-Modellen deklarieren Sie Klassenattribute
Sie können dieselben Validierungs-Funktionen und -Tools verwenden, die Sie für Pydantic-Modelle verwenden, z. B. verschiedene Datentypen und zusätzliche Validierungen mit `Field()`. Sie können dieselben Validierungs-Funktionen und -Tools verwenden, die Sie für Pydantic-Modelle verwenden, z. B. verschiedene Datentypen und zusätzliche Validierungen mit `Field()`.
=== "Pydantic v2" //// tab | Pydantic v2
```Python hl_lines="2 5-8 11" ```Python hl_lines="2 5-8 11"
{!> ../../../docs_src/settings/tutorial001.py!} {!> ../../docs_src/settings/tutorial001.py!}
``` ```
=== "Pydantic v1" ////
//// tab | Pydantic v1
/// info
!!! info
In Pydantic v1 würden Sie `BaseSettings` direkt von `pydantic` statt von `pydantic_settings` importieren. In Pydantic v1 würden Sie `BaseSettings` direkt von `pydantic` statt von `pydantic_settings` importieren.
///
```Python hl_lines="2 5-8 11" ```Python hl_lines="2 5-8 11"
{!> ../../../docs_src/settings/tutorial001_pv1.py!} {!> ../../docs_src/settings/tutorial001_pv1.py!}
``` ```
!!! tip "Tipp" ////
/// tip | "Tipp"
Für ein schnelles Copy-and-paste verwenden Sie nicht dieses Beispiel, sondern das letzte unten. Für ein schnelles Copy-and-paste verwenden Sie nicht dieses Beispiel, sondern das letzte unten.
///
Wenn Sie dann eine Instanz dieser `Settings`-Klasse erstellen (in diesem Fall als `settings`-Objekt), liest Pydantic die Umgebungsvariablen ohne Berücksichtigung der Groß- und Kleinschreibung. Eine Variable `APP_NAME` in Großbuchstaben wird also als Attribut `app_name` gelesen. Wenn Sie dann eine Instanz dieser `Settings`-Klasse erstellen (in diesem Fall als `settings`-Objekt), liest Pydantic die Umgebungsvariablen ohne Berücksichtigung der Groß- und Kleinschreibung. Eine Variable `APP_NAME` in Großbuchstaben wird also als Attribut `app_name` gelesen.
Als Nächstes werden die Daten konvertiert und validiert. Wenn Sie also dieses `settings`-Objekt verwenden, verfügen Sie über Daten mit den von Ihnen deklarierten Typen (z. B. ist `items_per_user` ein `int`). Als Nächstes werden die Daten konvertiert und validiert. Wenn Sie also dieses `settings`-Objekt verwenden, verfügen Sie über Daten mit den von Ihnen deklarierten Typen (z. B. ist `items_per_user` ein `int`).
@ -189,7 +215,7 @@ Als Nächstes werden die Daten konvertiert und validiert. Wenn Sie also dieses `
Dann können Sie das neue `settings`-Objekt in Ihrer Anwendung verwenden: Dann können Sie das neue `settings`-Objekt in Ihrer Anwendung verwenden:
```Python hl_lines="18-20" ```Python hl_lines="18-20"
{!../../../docs_src/settings/tutorial001.py!} {!../../docs_src/settings/tutorial001.py!}
``` ```
### Den Server ausführen ### Den Server ausführen
@ -206,9 +232,12 @@ $ ADMIN_EMAIL="[email protected]" APP_NAME="ChimichangApp" uvicorn main:app
</div> </div>
!!! tip "Tipp" /// tip | "Tipp"
Um mehrere Umgebungsvariablen für einen einzelnen Befehl festzulegen, trennen Sie diese einfach durch ein Leerzeichen und fügen Sie alle vor dem Befehl ein. Um mehrere Umgebungsvariablen für einen einzelnen Befehl festzulegen, trennen Sie diese einfach durch ein Leerzeichen und fügen Sie alle vor dem Befehl ein.
///
Und dann würde die Einstellung `admin_email` auf `"[email protected]"` gesetzt. Und dann würde die Einstellung `admin_email` auf `"[email protected]"` gesetzt.
Der `app_name` wäre `"ChimichangApp"`. Der `app_name` wäre `"ChimichangApp"`.
@ -222,18 +251,21 @@ Sie könnten diese Einstellungen in eine andere Moduldatei einfügen, wie Sie in
Sie könnten beispielsweise eine Datei `config.py` haben mit: Sie könnten beispielsweise eine Datei `config.py` haben mit:
```Python ```Python
{!../../../docs_src/settings/app01/config.py!} {!../../docs_src/settings/app01/config.py!}
``` ```
Und dann verwenden Sie diese in einer Datei `main.py`: Und dann verwenden Sie diese in einer Datei `main.py`:
```Python hl_lines="3 11-13" ```Python hl_lines="3 11-13"
{!../../../docs_src/settings/app01/main.py!} {!../../docs_src/settings/app01/main.py!}
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Sie benötigen außerdem eine Datei `__init__.py`, wie in [Größere Anwendungen – mehrere Dateien](../tutorial/bigger-applications.md){.internal-link target=_blank} gesehen. Sie benötigen außerdem eine Datei `__init__.py`, wie in [Größere Anwendungen – mehrere Dateien](../tutorial/bigger-applications.md){.internal-link target=_blank} gesehen.
///
## Einstellungen in einer Abhängigkeit ## Einstellungen in einer Abhängigkeit
In manchen Fällen kann es nützlich sein, die Einstellungen mit einer Abhängigkeit bereitzustellen, anstatt ein globales Objekt `settings` zu haben, das überall verwendet wird. In manchen Fällen kann es nützlich sein, die Einstellungen mit einer Abhängigkeit bereitzustellen, anstatt ein globales Objekt `settings` zu haben, das überall verwendet wird.
@ -245,7 +277,7 @@ Dies könnte besonders beim Testen nützlich sein, da es sehr einfach ist, eine
Ausgehend vom vorherigen Beispiel könnte Ihre Datei `config.py` so aussehen: Ausgehend vom vorherigen Beispiel könnte Ihre Datei `config.py` so aussehen:
```Python hl_lines="10" ```Python hl_lines="10"
{!../../../docs_src/settings/app02/config.py!} {!../../docs_src/settings/app02/config.py!}
``` ```
Beachten Sie, dass wir jetzt keine Standardinstanz `settings = Settings()` erstellen. Beachten Sie, dass wir jetzt keine Standardinstanz `settings = Settings()` erstellen.
@ -254,61 +286,82 @@ Beachten Sie, dass wir jetzt keine Standardinstanz `settings = Settings()` erste
Jetzt erstellen wir eine Abhängigkeit, die ein neues `config.Settings()` zurückgibt. Jetzt erstellen wir eine Abhängigkeit, die ein neues `config.Settings()` zurückgibt.
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="6 12-13" ```Python hl_lines="6 12-13"
{!> ../../../docs_src/settings/app02_an_py39/main.py!} {!> ../../docs_src/settings/app02_an_py39/main.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="6 12-13" ```Python hl_lines="6 12-13"
{!> ../../../docs_src/settings/app02_an/main.py!} {!> ../../docs_src/settings/app02_an/main.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="5 11-12" ```Python hl_lines="5 11-12"
{!> ../../../docs_src/settings/app02/main.py!} {!> ../../docs_src/settings/app02/main.py!}
``` ```
!!! tip "Tipp" ////
/// tip | "Tipp"
Wir werden das `@lru_cache` in Kürze besprechen. Wir werden das `@lru_cache` in Kürze besprechen.
Im Moment nehmen Sie an, dass `get_settings()` eine normale Funktion ist. Im Moment nehmen Sie an, dass `get_settings()` eine normale Funktion ist.
///
Und dann können wir das von der *Pfadoperation-Funktion* als Abhängigkeit einfordern und es überall dort verwenden, wo wir es brauchen. Und dann können wir das von der *Pfadoperation-Funktion* als Abhängigkeit einfordern und es überall dort verwenden, wo wir es brauchen.
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="17 19-21" ```Python hl_lines="17 19-21"
{!> ../../../docs_src/settings/app02_an_py39/main.py!} {!> ../../docs_src/settings/app02_an_py39/main.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="17 19-21" ```Python hl_lines="17 19-21"
{!> ../../../docs_src/settings/app02_an/main.py!} {!> ../../docs_src/settings/app02_an/main.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="16 18-20" ```Python hl_lines="16 18-20"
{!> ../../../docs_src/settings/app02/main.py!} {!> ../../docs_src/settings/app02/main.py!}
``` ```
////
### Einstellungen und Tests ### Einstellungen und Tests
Dann wäre es sehr einfach, beim Testen ein anderes Einstellungsobjekt bereitzustellen, indem man eine Abhängigkeitsüberschreibung für `get_settings` erstellt: Dann wäre es sehr einfach, beim Testen ein anderes Einstellungsobjekt bereitzustellen, indem man eine Abhängigkeitsüberschreibung für `get_settings` erstellt:
```Python hl_lines="9-10 13 21" ```Python hl_lines="9-10 13 21"
{!../../../docs_src/settings/app02/test_main.py!} {!../../docs_src/settings/app02/test_main.py!}
``` ```
Bei der Abhängigkeitsüberschreibung legen wir einen neuen Wert für `admin_email` fest, wenn wir das neue `Settings`-Objekt erstellen, und geben dann dieses neue Objekt zurück. Bei der Abhängigkeitsüberschreibung legen wir einen neuen Wert für `admin_email` fest, wenn wir das neue `Settings`-Objekt erstellen, und geben dann dieses neue Objekt zurück.
@ -321,16 +374,22 @@ Wenn Sie viele Einstellungen haben, die sich möglicherweise oft ändern, vielle
Diese Praxis ist so weit verbreitet, dass sie einen Namen hat. Diese Umgebungsvariablen werden üblicherweise in einer Datei `.env` abgelegt und die Datei wird „dotenv“ genannt. Diese Praxis ist so weit verbreitet, dass sie einen Namen hat. Diese Umgebungsvariablen werden üblicherweise in einer Datei `.env` abgelegt und die Datei wird „dotenv“ genannt.
!!! tip "Tipp" /// tip | "Tipp"
Eine Datei, die mit einem Punkt (`.`) beginnt, ist eine versteckte Datei in Unix-ähnlichen Systemen wie Linux und macOS. Eine Datei, die mit einem Punkt (`.`) beginnt, ist eine versteckte Datei in Unix-ähnlichen Systemen wie Linux und macOS.
Aber eine dotenv-Datei muss nicht unbedingt genau diesen Dateinamen haben. Aber eine dotenv-Datei muss nicht unbedingt genau diesen Dateinamen haben.
///
Pydantic unterstützt das Lesen dieser Dateitypen mithilfe einer externen Bibliothek. Weitere Informationen finden Sie unter <a href="https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support" class="external-link" target="_blank">Pydantic Settings: Dotenv (.env) support</a>. Pydantic unterstützt das Lesen dieser Dateitypen mithilfe einer externen Bibliothek. Weitere Informationen finden Sie unter <a href="https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support" class="external-link" target="_blank">Pydantic Settings: Dotenv (.env) support</a>.
!!! tip "Tipp" /// tip | "Tipp"
Damit das funktioniert, müssen Sie `pip install python-dotenv` ausführen. Damit das funktioniert, müssen Sie `pip install python-dotenv` ausführen.
///
### Die `.env`-Datei ### Die `.env`-Datei
Sie könnten eine `.env`-Datei haben, mit: Sie könnten eine `.env`-Datei haben, mit:
@ -344,27 +403,40 @@ APP_NAME="ChimichangApp"
Und dann aktualisieren Sie Ihre `config.py` mit: Und dann aktualisieren Sie Ihre `config.py` mit:
=== "Pydantic v2" //// tab | Pydantic v2
```Python hl_lines="9" ```Python hl_lines="9"
{!> ../../../docs_src/settings/app03_an/config.py!} {!> ../../docs_src/settings/app03_an/config.py!}
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Das Attribut `model_config` wird nur für die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter <a href="https://docs.pydantic.dev/latest/concepts/config/" class="external-link" target="_blank">Pydantic: Configuration</a>. Das Attribut `model_config` wird nur für die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter <a href="https://docs.pydantic.dev/latest/concepts/config/" class="external-link" target="_blank">Pydantic: Configuration</a>.
=== "Pydantic v1" ///
////
//// tab | Pydantic v1
```Python hl_lines="9-10" ```Python hl_lines="9-10"
{!> ../../../docs_src/settings/app03_an/config_pv1.py!} {!> ../../docs_src/settings/app03_an/config_pv1.py!}
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Die Klasse `Config` wird nur für die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter <a href="https://docs.pydantic.dev/1.10/usage/model_config/" class="external-link" target="_blank">Pydantic Model Config</a>. Die Klasse `Config` wird nur für die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter <a href="https://docs.pydantic.dev/1.10/usage/model_config/" class="external-link" target="_blank">Pydantic Model Config</a>.
!!! info ///
////
/// info
In Pydantic Version 1 erfolgte die Konfiguration in einer internen Klasse `Config`, in Pydantic Version 2 erfolgt sie in einem Attribut `model_config`. Dieses Attribut akzeptiert ein `dict`. Um automatische Codevervollständigung und Inline-Fehlerberichte zu erhalten, können Sie `SettingsConfigDict` importieren und verwenden, um dieses `dict` zu definieren. In Pydantic Version 1 erfolgte die Konfiguration in einer internen Klasse `Config`, in Pydantic Version 2 erfolgt sie in einem Attribut `model_config`. Dieses Attribut akzeptiert ein `dict`. Um automatische Codevervollständigung und Inline-Fehlerberichte zu erhalten, können Sie `SettingsConfigDict` importieren und verwenden, um dieses `dict` zu definieren.
///
Hier definieren wir die Konfiguration `env_file` innerhalb Ihrer Pydantic-`Settings`-Klasse und setzen den Wert auf den Dateinamen mit der dotenv-Datei, die wir verwenden möchten. Hier definieren wir die Konfiguration `env_file` innerhalb Ihrer Pydantic-`Settings`-Klasse und setzen den Wert auf den Dateinamen mit der dotenv-Datei, die wir verwenden möchten.
### Die `Settings` nur einmal laden mittels `lru_cache` ### Die `Settings` nur einmal laden mittels `lru_cache`
@ -390,27 +462,36 @@ würden wir dieses Objekt für jeden Request erstellen und die `.env`-Datei für
Da wir jedoch den `@lru_cache`-Dekorator oben verwenden, wird das `Settings`-Objekt nur einmal erstellt, nämlich beim ersten Aufruf. ✔️ Da wir jedoch den `@lru_cache`-Dekorator oben verwenden, wird das `Settings`-Objekt nur einmal erstellt, nämlich beim ersten Aufruf. ✔️
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="1 11" ```Python hl_lines="1 11"
{!> ../../../docs_src/settings/app03_an_py39/main.py!} {!> ../../docs_src/settings/app03_an_py39/main.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="1 11" ```Python hl_lines="1 11"
{!> ../../../docs_src/settings/app03_an/main.py!} {!> ../../docs_src/settings/app03_an/main.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="1 10" ```Python hl_lines="1 10"
{!> ../../../docs_src/settings/app03/main.py!} {!> ../../docs_src/settings/app03/main.py!}
``` ```
////
Dann wird bei allen nachfolgenden Aufrufen von `get_settings()`, in den Abhängigkeiten für darauffolgende Requests, dasselbe Objekt zurückgegeben, das beim ersten Aufruf zurückgegeben wurde, anstatt den Code von `get_settings()` erneut auszuführen und ein neues `Settings`-Objekt zu erstellen. Dann wird bei allen nachfolgenden Aufrufen von `get_settings()`, in den Abhängigkeiten für darauffolgende Requests, dasselbe Objekt zurückgegeben, das beim ersten Aufruf zurückgegeben wurde, anstatt den Code von `get_settings()` erneut auszuführen und ein neues `Settings`-Objekt zu erstellen.
#### Technische Details zu `lru_cache` #### Technische Details zu `lru_cache`

6
docs/de/docs/advanced/sub-applications.md

@ -11,7 +11,7 @@ Wenn Sie zwei unabhängige FastAPI-Anwendungen mit deren eigenen unabhängigen O
Erstellen Sie zunächst die Hauptanwendung **FastAPI** und deren *Pfadoperationen*: Erstellen Sie zunächst die Hauptanwendung **FastAPI** und deren *Pfadoperationen*:
```Python hl_lines="3 6-8" ```Python hl_lines="3 6-8"
{!../../../docs_src/sub_applications/tutorial001.py!} {!../../docs_src/sub_applications/tutorial001.py!}
``` ```
### Unteranwendung ### Unteranwendung
@ -21,7 +21,7 @@ Erstellen Sie dann Ihre Unteranwendung und deren *Pfadoperationen*.
Diese Unteranwendung ist nur eine weitere Standard-FastAPI-Anwendung, aber diese wird „gemountet“: Diese Unteranwendung ist nur eine weitere Standard-FastAPI-Anwendung, aber diese wird „gemountet“:
```Python hl_lines="11 14-16" ```Python hl_lines="11 14-16"
{!../../../docs_src/sub_applications/tutorial001.py!} {!../../docs_src/sub_applications/tutorial001.py!}
``` ```
### Die Unteranwendung mounten ### Die Unteranwendung mounten
@ -31,7 +31,7 @@ Mounten Sie in Ihrer Top-Level-Anwendung `app` die Unteranwendung `subapi`.
In diesem Fall wird sie im Pfad `/subapi` gemountet: In diesem Fall wird sie im Pfad `/subapi` gemountet:
```Python hl_lines="11 19" ```Python hl_lines="11 19"
{!../../../docs_src/sub_applications/tutorial001.py!} {!../../docs_src/sub_applications/tutorial001.py!}
``` ```
### Es in der automatischen API-Dokumentation betrachten ### Es in der automatischen API-Dokumentation betrachten

23
docs/de/docs/advanced/templates.md

@ -28,28 +28,37 @@ $ pip install jinja2
* Verwenden Sie die von Ihnen erstellten `templates`, um eine `TemplateResponse` zu rendern und zurückzugeben, übergeben Sie den Namen des Templates, das Requestobjekt und ein „Kontext“-Dictionary mit Schlüssel-Wert-Paaren, die innerhalb des Jinja2-Templates verwendet werden sollen. * Verwenden Sie die von Ihnen erstellten `templates`, um eine `TemplateResponse` zu rendern und zurückzugeben, übergeben Sie den Namen des Templates, das Requestobjekt und ein „Kontext“-Dictionary mit Schlüssel-Wert-Paaren, die innerhalb des Jinja2-Templates verwendet werden sollen.
```Python hl_lines="4 11 15-18" ```Python hl_lines="4 11 15-18"
{!../../../docs_src/templates/tutorial001.py!} {!../../docs_src/templates/tutorial001.py!}
``` ```
!!! note "Hinweis" /// note | "Hinweis"
Vor FastAPI 0.108.0 und Starlette 0.29.0 war `name` der erste Parameter. Vor FastAPI 0.108.0 und Starlette 0.29.0 war `name` der erste Parameter.
Außerdem wurde in früheren Versionen das `request`-Objekt als Teil der Schlüssel-Wert-Paare im Kontext für Jinja2 übergeben. Außerdem wurde in früheren Versionen das `request`-Objekt als Teil der Schlüssel-Wert-Paare im Kontext für Jinja2 übergeben.
!!! tip "Tipp" ///
/// tip | "Tipp"
Durch die Deklaration von `response_class=HTMLResponse` kann die Dokumentationsoberfläche erkennen, dass die Response HTML sein wird. Durch die Deklaration von `response_class=HTMLResponse` kann die Dokumentationsoberfläche erkennen, dass die Response HTML sein wird.
!!! note "Technische Details" ///
/// note | "Technische Details"
Sie können auch `from starlette.templating import Jinja2Templates` verwenden. Sie können auch `from starlette.templating import Jinja2Templates` verwenden.
**FastAPI** bietet dasselbe `starlette.templating` auch via `fastapi.templating` an, als Annehmlichkeit für Sie, den Entwickler. Es kommt aber direkt von Starlette. Das Gleiche gilt für `Request` und `StaticFiles`. **FastAPI** bietet dasselbe `starlette.templating` auch via `fastapi.templating` an, als Annehmlichkeit für Sie, den Entwickler. Es kommt aber direkt von Starlette. Das Gleiche gilt für `Request` und `StaticFiles`.
///
## Templates erstellen ## Templates erstellen
Dann können Sie unter `templates/item.html` ein Template erstellen, mit z. B. folgendem Inhalt: Dann können Sie unter `templates/item.html` ein Template erstellen, mit z. B. folgendem Inhalt:
```jinja hl_lines="7" ```jinja hl_lines="7"
{!../../../docs_src/templates/templates/item.html!} {!../../docs_src/templates/templates/item.html!}
``` ```
### Template-Kontextwerte ### Template-Kontextwerte
@ -103,13 +112,13 @@ Mit beispielsweise der ID `42` würde dies Folgendes ergeben:
Sie können `url_for()` innerhalb des Templates auch beispielsweise mit den `StaticFiles` verwenden, die Sie mit `name="static"` gemountet haben. Sie können `url_for()` innerhalb des Templates auch beispielsweise mit den `StaticFiles` verwenden, die Sie mit `name="static"` gemountet haben.
```jinja hl_lines="4" ```jinja hl_lines="4"
{!../../../docs_src/templates/templates/item.html!} {!../../docs_src/templates/templates/item.html!}
``` ```
In diesem Beispiel würde das zu einer CSS-Datei unter `static/styles.css` verlinken, mit folgendem Inhalt: In diesem Beispiel würde das zu einer CSS-Datei unter `static/styles.css` verlinken, mit folgendem Inhalt:
```CSS hl_lines="4" ```CSS hl_lines="4"
{!../../../docs_src/templates/static/styles.css!} {!../../docs_src/templates/static/styles.css!}
``` ```
Und da Sie `StaticFiles` verwenden, wird diese CSS-Datei automatisch von Ihrer **FastAPI**-Anwendung unter der URL `/static/styles.css` bereitgestellt. Und da Sie `StaticFiles` verwenden, wird diese CSS-Datei automatisch von Ihrer **FastAPI**-Anwendung unter der URL `/static/styles.css` bereitgestellt.

50
docs/de/docs/advanced/testing-dependencies.md

@ -28,54 +28,76 @@ Um eine Abhängigkeit für das Testen zu überschreiben, geben Sie als Schlüsse
Und dann ruft **FastAPI** diese Überschreibung anstelle der ursprünglichen Abhängigkeit auf. Und dann ruft **FastAPI** diese Überschreibung anstelle der ursprünglichen Abhängigkeit auf.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="26-27 30" ```Python hl_lines="26-27 30"
{!> ../../../docs_src/dependency_testing/tutorial001_an_py310.py!} {!> ../../docs_src/dependency_testing/tutorial001_an_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="28-29 32" ```Python hl_lines="28-29 32"
{!> ../../../docs_src/dependency_testing/tutorial001_an_py39.py!} {!> ../../docs_src/dependency_testing/tutorial001_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="29-30 33" ```Python hl_lines="29-30 33"
{!> ../../../docs_src/dependency_testing/tutorial001_an.py!} {!> ../../docs_src/dependency_testing/tutorial001_an.py!}
``` ```
=== "Python 3.10+ nicht annotiert" ////
//// tab | 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="24-25 28" ```Python hl_lines="24-25 28"
{!> ../../../docs_src/dependency_testing/tutorial001_py310.py!} {!> ../../docs_src/dependency_testing/tutorial001_py310.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="28-29 32" ```Python hl_lines="28-29 32"
{!> ../../../docs_src/dependency_testing/tutorial001.py!} {!> ../../docs_src/dependency_testing/tutorial001.py!}
``` ```
!!! tip "Tipp" ////
/// tip | "Tipp"
Sie können eine Überschreibung für eine Abhängigkeit festlegen, die an einer beliebigen Stelle in Ihrer **FastAPI**-Anwendung verwendet wird. Sie können eine Überschreibung für eine Abhängigkeit festlegen, die an einer beliebigen Stelle in Ihrer **FastAPI**-Anwendung verwendet wird.
Die ursprüngliche Abhängigkeit könnte in einer *Pfadoperation-Funktion*, einem *Pfadoperation-Dekorator* (wenn Sie den Rückgabewert nicht verwenden), einem `.include_router()`-Aufruf, usw. verwendet werden. Die ursprüngliche Abhängigkeit könnte in einer *Pfadoperation-Funktion*, einem *Pfadoperation-Dekorator* (wenn Sie den Rückgabewert nicht verwenden), einem `.include_router()`-Aufruf, usw. verwendet werden.
FastAPI kann sie in jedem Fall überschreiben. FastAPI kann sie in jedem Fall überschreiben.
///
Anschließend können Sie Ihre Überschreibungen zurücksetzen (entfernen), indem Sie `app.dependency_overrides` auf ein leeres `dict` setzen: Anschließend können Sie Ihre Überschreibungen zurücksetzen (entfernen), indem Sie `app.dependency_overrides` auf ein leeres `dict` setzen:
```Python ```Python
app.dependency_overrides = {} app.dependency_overrides = {}
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Wenn Sie eine Abhängigkeit nur während einiger Tests überschreiben möchten, können Sie die Überschreibung zu Beginn des Tests (innerhalb der Testfunktion) festlegen und am Ende (am Ende der Testfunktion) zurücksetzen. Wenn Sie eine Abhängigkeit nur während einiger Tests überschreiben möchten, können Sie die Überschreibung zu Beginn des Tests (innerhalb der Testfunktion) festlegen und am Ende (am Ende der Testfunktion) zurücksetzen.
///

2
docs/de/docs/advanced/testing-events.md

@ -3,5 +3,5 @@
Wenn Sie in Ihren Tests Ihre Event-Handler (`startup` und `shutdown`) ausführen wollen, können Sie den `TestClient` mit einer `with`-Anweisung verwenden: Wenn Sie in Ihren Tests Ihre Event-Handler (`startup` und `shutdown`) ausführen wollen, können Sie den `TestClient` mit einer `with`-Anweisung verwenden:
```Python hl_lines="9-12 20-24" ```Python hl_lines="9-12 20-24"
{!../../../docs_src/app_testing/tutorial003.py!} {!../../docs_src/app_testing/tutorial003.py!}
``` ```

7
docs/de/docs/advanced/testing-websockets.md

@ -5,8 +5,11 @@ Sie können den schon bekannten `TestClient` zum Testen von WebSockets verwenden
Dazu verwenden Sie den `TestClient` in einer `with`-Anweisung, eine Verbindung zum WebSocket herstellend: Dazu verwenden Sie den `TestClient` in einer `with`-Anweisung, eine Verbindung zum WebSocket herstellend:
```Python hl_lines="27-31" ```Python hl_lines="27-31"
{!../../../docs_src/app_testing/tutorial002.py!} {!../../docs_src/app_testing/tutorial002.py!}
``` ```
!!! note "Hinweis" /// note | "Hinweis"
Weitere Informationen finden Sie in der Starlette-Dokumentation zum <a href="https://www.starlette.io/testclient/#testing-websocket-sessions" class="external-link" target="_blank">Testen von WebSockets</a>. Weitere Informationen finden Sie in der Starlette-Dokumentation zum <a href="https://www.starlette.io/testclient/#testing-websocket-sessions" class="external-link" target="_blank">Testen von WebSockets</a>.
///

12
docs/de/docs/advanced/using-request-directly.md

@ -30,23 +30,29 @@ Angenommen, Sie möchten auf die IP-Adresse/den Host des Clients in Ihrer *Pfado
Dazu müssen Sie direkt auf den Request zugreifen. Dazu müssen Sie direkt auf den Request zugreifen.
```Python hl_lines="1 7-8" ```Python hl_lines="1 7-8"
{!../../../docs_src/using_request_directly/tutorial001.py!} {!../../docs_src/using_request_directly/tutorial001.py!}
``` ```
Durch die Deklaration eines *Pfadoperation-Funktionsparameters*, dessen Typ der `Request` ist, weiß **FastAPI**, dass es den `Request` diesem Parameter übergeben soll. Durch die Deklaration eines *Pfadoperation-Funktionsparameters*, dessen Typ der `Request` ist, weiß **FastAPI**, dass es den `Request` diesem Parameter übergeben soll.
!!! tip "Tipp" /// tip | "Tipp"
Beachten Sie, dass wir in diesem Fall einen Pfad-Parameter zusätzlich zum Request-Parameter deklarieren. Beachten Sie, dass wir in diesem Fall einen Pfad-Parameter zusätzlich zum Request-Parameter deklarieren.
Der Pfad-Parameter wird also extrahiert, validiert, in den spezifizierten Typ konvertiert und mit OpenAPI annotiert. Der Pfad-Parameter wird also extrahiert, validiert, in den spezifizierten Typ konvertiert und mit OpenAPI annotiert.
Auf die gleiche Weise können Sie wie gewohnt jeden anderen Parameter deklarieren und zusätzlich auch den `Request` erhalten. Auf die gleiche Weise können Sie wie gewohnt jeden anderen Parameter deklarieren und zusätzlich auch den `Request` erhalten.
///
## `Request`-Dokumentation ## `Request`-Dokumentation
Weitere Details zum <a href="https://www.starlette.io/requests/" class="external-link" target="_blank">`Request`-Objekt finden Sie in der offiziellen Starlette-Dokumentation</a>. Weitere Details zum <a href="https://www.starlette.io/requests/" class="external-link" target="_blank">`Request`-Objekt finden Sie in der offiziellen Starlette-Dokumentation</a>.
!!! note "Technische Details" /// note | "Technische Details"
Sie können auch `from starlette.requests import Request` verwenden. Sie können auch `from starlette.requests import Request` verwenden.
**FastAPI** stellt es direkt zur Verfügung, als Komfort für Sie, den Entwickler. Es kommt aber direkt von Starlette. **FastAPI** stellt es direkt zur Verfügung, als Komfort für Sie, den Entwickler. Es kommt aber direkt von Starlette.
///

78
docs/de/docs/advanced/websockets.md

@ -39,7 +39,7 @@ In der Produktion hätten Sie eine der oben genannten Optionen.
Aber es ist die einfachste Möglichkeit, sich auf die Serverseite von WebSockets zu konzentrieren und ein funktionierendes Beispiel zu haben: Aber es ist die einfachste Möglichkeit, sich auf die Serverseite von WebSockets zu konzentrieren und ein funktionierendes Beispiel zu haben:
```Python hl_lines="2 6-38 41-43" ```Python hl_lines="2 6-38 41-43"
{!../../../docs_src/websockets/tutorial001.py!} {!../../docs_src/websockets/tutorial001.py!}
``` ```
## Einen `websocket` erstellen ## Einen `websocket` erstellen
@ -47,20 +47,23 @@ Aber es ist die einfachste Möglichkeit, sich auf die Serverseite von WebSockets
Erstellen Sie in Ihrer **FastAPI**-Anwendung einen `websocket`: Erstellen Sie in Ihrer **FastAPI**-Anwendung einen `websocket`:
```Python hl_lines="1 46-47" ```Python hl_lines="1 46-47"
{!../../../docs_src/websockets/tutorial001.py!} {!../../docs_src/websockets/tutorial001.py!}
``` ```
!!! note "Technische Details" /// note | "Technische Details"
Sie können auch `from starlette.websockets import WebSocket` verwenden. Sie können auch `from starlette.websockets import WebSocket` verwenden.
**FastAPI** stellt den gleichen `WebSocket` direkt zur Verfügung, als Annehmlichkeit für Sie, den Entwickler. Er kommt aber direkt von Starlette. **FastAPI** stellt den gleichen `WebSocket` direkt zur Verfügung, als Annehmlichkeit für Sie, den Entwickler. Er kommt aber direkt von Starlette.
///
## Nachrichten erwarten und Nachrichten senden ## Nachrichten erwarten und Nachrichten senden
In Ihrer WebSocket-Route können Sie Nachrichten `await`en und Nachrichten senden. In Ihrer WebSocket-Route können Sie Nachrichten `await`en und Nachrichten senden.
```Python hl_lines="48-52" ```Python hl_lines="48-52"
{!../../../docs_src/websockets/tutorial001.py!} {!../../docs_src/websockets/tutorial001.py!}
``` ```
Sie können Binär-, Text- und JSON-Daten empfangen und senden. Sie können Binär-, Text- und JSON-Daten empfangen und senden.
@ -112,47 +115,66 @@ In WebSocket-Endpunkten können Sie Folgendes aus `fastapi` importieren und verw
Diese funktionieren auf die gleiche Weise wie für andere FastAPI-Endpunkte/*Pfadoperationen*: Diese funktionieren auf die gleiche Weise wie für andere FastAPI-Endpunkte/*Pfadoperationen*:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="68-69 82" ```Python hl_lines="68-69 82"
{!> ../../../docs_src/websockets/tutorial002_an_py310.py!} {!> ../../docs_src/websockets/tutorial002_an_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="68-69 82" ```Python hl_lines="68-69 82"
{!> ../../../docs_src/websockets/tutorial002_an_py39.py!} {!> ../../docs_src/websockets/tutorial002_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="69-70 83" ```Python hl_lines="69-70 83"
{!> ../../../docs_src/websockets/tutorial002_an.py!} {!> ../../docs_src/websockets/tutorial002_an.py!}
``` ```
=== "Python 3.10+ nicht annotiert" ////
//// tab | 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="66-67 79" ```Python hl_lines="66-67 79"
{!> ../../../docs_src/websockets/tutorial002_py310.py!} {!> ../../docs_src/websockets/tutorial002_py310.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="68-69 81" ```Python hl_lines="68-69 81"
{!> ../../../docs_src/websockets/tutorial002.py!} {!> ../../docs_src/websockets/tutorial002.py!}
``` ```
!!! info ////
/// info
Da es sich um einen WebSocket handelt, macht es keinen Sinn, eine `HTTPException` auszulösen, stattdessen lösen wir eine `WebSocketException` aus. Da es sich um einen WebSocket handelt, macht es keinen Sinn, eine `HTTPException` auszulösen, stattdessen lösen wir eine `WebSocketException` aus.
Sie können einen „Closing“-Code verwenden, aus den <a href="https://tools.ietf.org/html/rfc6455#section-7.4.1" class="external-link" target="_blank">gültigen Codes, die in der Spezifikation definiert sind</a>. Sie können einen „Closing“-Code verwenden, aus den <a href="https://tools.ietf.org/html/rfc6455#section-7.4.1" class="external-link" target="_blank">gültigen Codes, die in der Spezifikation definiert sind</a>.
///
### WebSockets mit Abhängigkeiten ausprobieren ### WebSockets mit Abhängigkeiten ausprobieren
Wenn Ihre Datei `main.py` heißt, führen Sie Ihre Anwendung mit Folgendem aus: Wenn Ihre Datei `main.py` heißt, führen Sie Ihre Anwendung mit Folgendem aus:
@ -174,9 +196,12 @@ Dort können Sie einstellen:
* Die „Item ID“, die im Pfad verwendet wird. * Die „Item ID“, die im Pfad verwendet wird.
* Das „Token“, das als Query-Parameter verwendet wird. * Das „Token“, das als Query-Parameter verwendet wird.
!!! tip "Tipp" /// tip | "Tipp"
Beachten Sie, dass der Query-„Token“ von einer Abhängigkeit verarbeitet wird. Beachten Sie, dass der Query-„Token“ von einer Abhängigkeit verarbeitet wird.
///
Damit können Sie den WebSocket verbinden und dann Nachrichten senden und empfangen: Damit können Sie den WebSocket verbinden und dann Nachrichten senden und empfangen:
<img src="/img/tutorial/websockets/image05.png"> <img src="/img/tutorial/websockets/image05.png">
@ -185,18 +210,22 @@ Damit können Sie den WebSocket verbinden und dann Nachrichten senden und empfan
Wenn eine WebSocket-Verbindung geschlossen wird, löst `await websocket.receive_text()` eine `WebSocketDisconnect`-Exception aus, die Sie dann wie in folgendem Beispiel abfangen und behandeln können. Wenn eine WebSocket-Verbindung geschlossen wird, löst `await websocket.receive_text()` eine `WebSocketDisconnect`-Exception aus, die Sie dann wie in folgendem Beispiel abfangen und behandeln können.
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="79-81" ```Python hl_lines="79-81"
{!> ../../../docs_src/websockets/tutorial003_py39.py!} {!> ../../docs_src/websockets/tutorial003_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="81-83" ```Python hl_lines="81-83"
{!> ../../../docs_src/websockets/tutorial003.py!} {!> ../../docs_src/websockets/tutorial003.py!}
``` ```
////
Zum Ausprobieren: Zum Ausprobieren:
* Öffnen Sie die Anwendung mit mehreren Browser-Tabs. * Öffnen Sie die Anwendung mit mehreren Browser-Tabs.
@ -209,13 +238,16 @@ Das wird die Ausnahme `WebSocketDisconnect` auslösen und alle anderen Clients e
Client #1596980209979 left the chat Client #1596980209979 left the chat
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Die obige Anwendung ist ein minimales und einfaches Beispiel, das zeigt, wie Nachrichten verarbeitet und an mehrere WebSocket-Verbindungen gesendet werden. Die obige Anwendung ist ein minimales und einfaches Beispiel, das zeigt, wie Nachrichten verarbeitet und an mehrere WebSocket-Verbindungen gesendet werden.
Beachten Sie jedoch, dass, da alles nur im Speicher in einer einzigen Liste verwaltet wird, es nur funktioniert, während der Prozess ausgeführt wird, und nur mit einem einzelnen Prozess. Beachten Sie jedoch, dass, da alles nur im Speicher in einer einzigen Liste verwaltet wird, es nur funktioniert, während der Prozess ausgeführt wird, und nur mit einem einzelnen Prozess.
Wenn Sie etwas benötigen, das sich leicht in FastAPI integrieren lässt, aber robuster ist und von Redis, PostgreSQL und anderen unterstützt wird, sehen Sie sich <a href="https://github.com/encode/broadcaster" class="external-link" target="_blank">encode/broadcaster</a> an. Wenn Sie etwas benötigen, das sich leicht in FastAPI integrieren lässt, aber robuster ist und von Redis, PostgreSQL und anderen unterstützt wird, sehen Sie sich <a href="https://github.com/encode/broadcaster" class="external-link" target="_blank">encode/broadcaster</a> an.
///
## Mehr Informationen ## Mehr Informationen
Weitere Informationen zu Optionen finden Sie in der Dokumentation von Starlette: Weitere Informationen zu Optionen finden Sie in der Dokumentation von Starlette:

2
docs/de/docs/advanced/wsgi.md

@ -13,7 +13,7 @@ Wrappen Sie dann die WSGI-Anwendung (z. B. Flask) mit der Middleware.
Und dann mounten Sie das auf einem Pfad. Und dann mounten Sie das auf einem Pfad.
```Python hl_lines="2-3 23" ```Python hl_lines="2-3 23"
{!../../../docs_src/wsgi/tutorial001.py!} {!../../docs_src/wsgi/tutorial001.py!}
``` ```
## Es ansehen ## Es ansehen

121
docs/de/docs/alternatives.md

@ -30,13 +30,18 @@ Es wird von vielen Unternehmen verwendet, darunter Mozilla, Red Hat und Eventbri
Es war eines der ersten Beispiele für **automatische API-Dokumentation**, und dies war insbesondere eine der ersten Ideen, welche „die Suche nach“ **FastAPI** inspirierten. Es war eines der ersten Beispiele für **automatische API-Dokumentation**, und dies war insbesondere eine der ersten Ideen, welche „die Suche nach“ **FastAPI** inspirierten.
!!! note "Hinweis" /// note | "Hinweis"
Das Django REST Framework wurde von Tom Christie erstellt. Derselbe Schöpfer von Starlette und Uvicorn, auf denen **FastAPI** basiert. Das Django REST Framework wurde von Tom Christie erstellt. Derselbe Schöpfer von Starlette und Uvicorn, auf denen **FastAPI** basiert.
///
/// check | "Inspirierte **FastAPI**"
!!! check "Inspirierte **FastAPI**"
Eine automatische API-Dokumentationsoberfläche zu haben. Eine automatische API-Dokumentationsoberfläche zu haben.
///
### <a href="https://flask.palletsprojects.com" class="external-link" target="_blank">Flask</a> ### <a href="https://flask.palletsprojects.com" class="external-link" target="_blank">Flask</a>
Flask ist ein „Mikroframework“, es enthält weder Datenbankintegration noch viele der Dinge, die standardmäßig in Django enthalten sind. Flask ist ein „Mikroframework“, es enthält weder Datenbankintegration noch viele der Dinge, die standardmäßig in Django enthalten sind.
@ -51,11 +56,13 @@ Diese Entkopplung der Teile und die Tatsache, dass es sich um ein „Mikroframew
Angesichts der Einfachheit von Flask schien es eine gute Ergänzung zum Erstellen von APIs zu sein. Als Nächstes musste ein „Django REST Framework“ für Flask gefunden werden. Angesichts der Einfachheit von Flask schien es eine gute Ergänzung zum Erstellen von APIs zu sein. Als Nächstes musste ein „Django REST Framework“ für Flask gefunden werden.
!!! check "Inspirierte **FastAPI**" /// check | "Inspirierte **FastAPI**"
Ein Mikroframework zu sein. Es einfach zu machen, die benötigten Tools und Teile zu kombinieren. Ein Mikroframework zu sein. Es einfach zu machen, die benötigten Tools und Teile zu kombinieren.
Über ein einfaches und benutzerfreundliches Routingsystem zu verfügen. Über ein einfaches und benutzerfreundliches Routingsystem zu verfügen.
///
### <a href="https://requests.readthedocs.io" class="external-link" target="_blank">Requests</a> ### <a href="https://requests.readthedocs.io" class="external-link" target="_blank">Requests</a>
@ -91,11 +98,13 @@ def read_url():
Sehen Sie sich die Ähnlichkeiten in `requests.get(...)` und `@app.get(...)` an. Sehen Sie sich die Ähnlichkeiten in `requests.get(...)` und `@app.get(...)` an.
!!! check "Inspirierte **FastAPI**" /// check | "Inspirierte **FastAPI**"
* Über eine einfache und intuitive API zu verfügen. * Über eine einfache und intuitive API zu verfügen.
* HTTP-Methodennamen (Operationen) direkt, auf einfache und intuitive Weise zu verwenden. * HTTP-Methodennamen (Operationen) direkt, auf einfache und intuitive Weise zu verwenden.
* Vernünftige Standardeinstellungen zu haben, aber auch mächtige Einstellungsmöglichkeiten. * Vernünftige Standardeinstellungen zu haben, aber auch mächtige Einstellungsmöglichkeiten.
///
### <a href="https://swagger.io/" class="external-link" target="_blank">Swagger</a> / <a href="https://github.com/OAI/OpenAPI-Specification/" class="external-link" target="_blank">OpenAPI</a> ### <a href="https://swagger.io/" class="external-link" target="_blank">Swagger</a> / <a href="https://github.com/OAI/OpenAPI-Specification/" class="external-link" target="_blank">OpenAPI</a>
@ -109,7 +118,8 @@ Irgendwann wurde Swagger an die Linux Foundation übergeben und in OpenAPI umben
Aus diesem Grund spricht man bei Version 2.0 häufig von „Swagger“ und ab Version 3 von „OpenAPI“. Aus diesem Grund spricht man bei Version 2.0 häufig von „Swagger“ und ab Version 3 von „OpenAPI“.
!!! check "Inspirierte **FastAPI**" /// check | "Inspirierte **FastAPI**"
Einen offenen Standard für API-Spezifikationen zu übernehmen und zu verwenden, anstelle eines benutzerdefinierten Schemas. Einen offenen Standard für API-Spezifikationen zu übernehmen und zu verwenden, anstelle eines benutzerdefinierten Schemas.
Und Standard-basierte Tools für die Oberfläche zu integrieren: Und Standard-basierte Tools für die Oberfläche zu integrieren:
@ -119,6 +129,8 @@ Aus diesem Grund spricht man bei Version 2.0 häufig von „Swagger“ und ab Ve
Diese beiden wurden ausgewählt, weil sie ziemlich beliebt und stabil sind, aber bei einer schnellen Suche könnten Sie Dutzende alternativer Benutzeroberflächen für OpenAPI finden (welche Sie mit **FastAPI** verwenden können). Diese beiden wurden ausgewählt, weil sie ziemlich beliebt und stabil sind, aber bei einer schnellen Suche könnten Sie Dutzende alternativer Benutzeroberflächen für OpenAPI finden (welche Sie mit **FastAPI** verwenden können).
///
### Flask REST Frameworks ### Flask REST Frameworks
Es gibt mehrere Flask REST Frameworks, aber nachdem ich die Zeit und Arbeit investiert habe, sie zu untersuchen, habe ich festgestellt, dass viele nicht mehr unterstützt werden oder abgebrochen wurden und dass mehrere fortbestehende Probleme sie unpassend machten. Es gibt mehrere Flask REST Frameworks, aber nachdem ich die Zeit und Arbeit investiert habe, sie zu untersuchen, habe ich festgestellt, dass viele nicht mehr unterstützt werden oder abgebrochen wurden und dass mehrere fortbestehende Probleme sie unpassend machten.
@ -135,9 +147,12 @@ Für diese Funktionen wurde Marshmallow entwickelt. Es ist eine großartige Bibl
Aber sie wurde erstellt, bevor Typhinweise in Python existierten. Um also ein <abbr title="die Definition, wie Daten geformt sein werden sollen">Schema</abbr> zu definieren, müssen Sie bestimmte Werkzeuge und Klassen verwenden, die von Marshmallow bereitgestellt werden. Aber sie wurde erstellt, bevor Typhinweise in Python existierten. Um also ein <abbr title="die Definition, wie Daten geformt sein werden sollen">Schema</abbr> zu definieren, müssen Sie bestimmte Werkzeuge und Klassen verwenden, die von Marshmallow bereitgestellt werden.
!!! check "Inspirierte **FastAPI**" /// check | "Inspirierte **FastAPI**"
Code zu verwenden, um „Schemas“ zu definieren, welche Datentypen und Validierung automatisch bereitstellen. Code zu verwenden, um „Schemas“ zu definieren, welche Datentypen und Validierung automatisch bereitstellen.
///
### <a href="https://webargs.readthedocs.io/en/latest/" class="external-link" target="_blank">Webargs</a> ### <a href="https://webargs.readthedocs.io/en/latest/" class="external-link" target="_blank">Webargs</a>
Eine weitere wichtige Funktion, die von APIs benötigt wird, ist das <abbr title="Lesen und Konvertieren nach Python-Daten">Parsen</abbr> von Daten aus eingehenden Requests. Eine weitere wichtige Funktion, die von APIs benötigt wird, ist das <abbr title="Lesen und Konvertieren nach Python-Daten">Parsen</abbr> von Daten aus eingehenden Requests.
@ -148,12 +163,18 @@ Es verwendet unter der Haube Marshmallow, um die Datenvalidierung durchzuführen
Es ist ein großartiges Tool und ich habe es auch oft verwendet, bevor ich **FastAPI** hatte. Es ist ein großartiges Tool und ich habe es auch oft verwendet, bevor ich **FastAPI** hatte.
!!! info /// info
Webargs wurde von denselben Marshmallow-Entwicklern erstellt. Webargs wurde von denselben Marshmallow-Entwicklern erstellt.
!!! check "Inspirierte **FastAPI**" ///
/// check | "Inspirierte **FastAPI**"
Eingehende Requestdaten automatisch zu validieren. Eingehende Requestdaten automatisch zu validieren.
///
### <a href="https://apispec.readthedocs.io/en/stable/" class="external-link" target="_blank">APISpec</a> ### <a href="https://apispec.readthedocs.io/en/stable/" class="external-link" target="_blank">APISpec</a>
Marshmallow und Webargs bieten Validierung, Parsen und Serialisierung als Plugins. Marshmallow und Webargs bieten Validierung, Parsen und Serialisierung als Plugins.
@ -172,13 +193,18 @@ Aber dann haben wir wieder das Problem einer Mikrosyntax innerhalb eines Python-
Der Texteditor kann dabei nicht viel helfen. Und wenn wir Parameter oder Marshmallow-Schemas ändern und vergessen, auch den YAML-Docstring zu ändern, wäre das generierte Schema veraltet. Der Texteditor kann dabei nicht viel helfen. Und wenn wir Parameter oder Marshmallow-Schemas ändern und vergessen, auch den YAML-Docstring zu ändern, wäre das generierte Schema veraltet.
!!! info /// info
APISpec wurde von denselben Marshmallow-Entwicklern erstellt. APISpec wurde von denselben Marshmallow-Entwicklern erstellt.
///
/// check | "Inspirierte **FastAPI**"
!!! check "Inspirierte **FastAPI**"
Den offenen Standard für APIs, OpenAPI, zu unterstützen. Den offenen Standard für APIs, OpenAPI, zu unterstützen.
///
### <a href="https://flask-apispec.readthedocs.io/en/latest/" class="external-link" target="_blank">Flask-apispec</a> ### <a href="https://flask-apispec.readthedocs.io/en/latest/" class="external-link" target="_blank">Flask-apispec</a>
Hierbei handelt es sich um ein Flask-Plugin, welches Webargs, Marshmallow und APISpec miteinander verbindet. Hierbei handelt es sich um ein Flask-Plugin, welches Webargs, Marshmallow und APISpec miteinander verbindet.
@ -199,12 +225,18 @@ Die Verwendung führte zur Entwicklung mehrerer Flask-Full-Stack-Generatoren. Di
Und dieselben Full-Stack-Generatoren bildeten die Basis der [**FastAPI**-Projektgeneratoren](project-generation.md){.internal-link target=_blank}. Und dieselben Full-Stack-Generatoren bildeten die Basis der [**FastAPI**-Projektgeneratoren](project-generation.md){.internal-link target=_blank}.
!!! info /// info
Flask-apispec wurde von denselben Marshmallow-Entwicklern erstellt. Flask-apispec wurde von denselben Marshmallow-Entwicklern erstellt.
!!! check "Inspirierte **FastAPI**" ///
/// check | "Inspirierte **FastAPI**"
Das OpenAPI-Schema automatisch zu generieren, aus demselben Code, welcher die Serialisierung und Validierung definiert. Das OpenAPI-Schema automatisch zu generieren, aus demselben Code, welcher die Serialisierung und Validierung definiert.
///
### <a href="https://nestjs.com/" class="external-link" target="_blank">NestJS</a> (und <a href="https://angular.io/" class="external-link" target="_blank">Angular</a>) ### <a href="https://nestjs.com/" class="external-link" target="_blank">NestJS</a> (und <a href="https://angular.io/" class="external-link" target="_blank">Angular</a>)
Dies ist nicht einmal Python, NestJS ist ein von Angular inspiriertes JavaScript (TypeScript) NodeJS Framework. Dies ist nicht einmal Python, NestJS ist ein von Angular inspiriertes JavaScript (TypeScript) NodeJS Framework.
@ -219,25 +251,34 @@ Da TypeScript-Daten jedoch nach der Kompilierung nach JavaScript nicht erhalten
Es kann nicht sehr gut mit verschachtelten Modellen umgehen. Wenn es sich beim JSON-Body in der Anfrage also um ein JSON-Objekt mit inneren Feldern handelt, die wiederum verschachtelte JSON-Objekte sind, kann er nicht richtig dokumentiert und validiert werden. Es kann nicht sehr gut mit verschachtelten Modellen umgehen. Wenn es sich beim JSON-Body in der Anfrage also um ein JSON-Objekt mit inneren Feldern handelt, die wiederum verschachtelte JSON-Objekte sind, kann er nicht richtig dokumentiert und validiert werden.
!!! check "Inspirierte **FastAPI**" /// check | "Inspirierte **FastAPI**"
Python-Typen zu verwenden, um eine hervorragende Editorunterstützung zu erhalten. Python-Typen zu verwenden, um eine hervorragende Editorunterstützung zu erhalten.
Über ein leistungsstarkes Dependency Injection System zu verfügen. Eine Möglichkeit zu finden, Codeverdoppelung zu minimieren. Über ein leistungsstarkes Dependency Injection System zu verfügen. Eine Möglichkeit zu finden, Codeverdoppelung zu minimieren.
///
### <a href="https://sanic.readthedocs.io/en/latest/" class="external-link" target="_blank">Sanic</a> ### <a href="https://sanic.readthedocs.io/en/latest/" class="external-link" target="_blank">Sanic</a>
Es war eines der ersten extrem schnellen Python-Frameworks, welches auf `asyncio` basierte. Es wurde so gestaltet, dass es Flask sehr ähnlich ist. Es war eines der ersten extrem schnellen Python-Frameworks, welches auf `asyncio` basierte. Es wurde so gestaltet, dass es Flask sehr ähnlich ist.
!!! note "Technische Details" /// note | "Technische Details"
Es verwendete <a href="https://github.com/MagicStack/uvloop" class="external-link" target="_blank">`uvloop`</a> anstelle der standardmäßigen Python-`asyncio`-Schleife. Das hat es so schnell gemacht. Es verwendete <a href="https://github.com/MagicStack/uvloop" class="external-link" target="_blank">`uvloop`</a> anstelle der standardmäßigen Python-`asyncio`-Schleife. Das hat es so schnell gemacht.
Hat eindeutig Uvicorn und Starlette inspiriert, welche derzeit in offenen Benchmarks schneller als Sanic sind. Hat eindeutig Uvicorn und Starlette inspiriert, welche derzeit in offenen Benchmarks schneller als Sanic sind.
!!! check "Inspirierte **FastAPI**" ///
/// check | "Inspirierte **FastAPI**"
Einen Weg zu finden, eine hervorragende Performanz zu haben. Einen Weg zu finden, eine hervorragende Performanz zu haben.
Aus diesem Grund basiert **FastAPI** auf Starlette, da dieses das schnellste verfügbare Framework ist (getestet in Benchmarks von Dritten). Aus diesem Grund basiert **FastAPI** auf Starlette, da dieses das schnellste verfügbare Framework ist (getestet in Benchmarks von Dritten).
///
### <a href="https://falconframework.org/" class="external-link" target="_blank">Falcon</a> ### <a href="https://falconframework.org/" class="external-link" target="_blank">Falcon</a>
Falcon ist ein weiteres leistungsstarkes Python-Framework. Es ist minimalistisch konzipiert und dient als Grundlage für andere Frameworks wie Hug. Falcon ist ein weiteres leistungsstarkes Python-Framework. Es ist minimalistisch konzipiert und dient als Grundlage für andere Frameworks wie Hug.
@ -246,13 +287,16 @@ Es ist so konzipiert, dass es über Funktionen verfügt, welche zwei Parameter e
Daher müssen Datenvalidierung, Serialisierung und Dokumentation im Code und nicht automatisch erfolgen. Oder sie müssen als Framework oberhalb von Falcon implementiert werden, so wie Hug. Dieselbe Unterscheidung findet auch in anderen Frameworks statt, die vom Design von Falcon inspiriert sind und ein Requestobjekt und ein Responseobjekt als Parameter haben. Daher müssen Datenvalidierung, Serialisierung und Dokumentation im Code und nicht automatisch erfolgen. Oder sie müssen als Framework oberhalb von Falcon implementiert werden, so wie Hug. Dieselbe Unterscheidung findet auch in anderen Frameworks statt, die vom Design von Falcon inspiriert sind und ein Requestobjekt und ein Responseobjekt als Parameter haben.
!!! check "Inspirierte **FastAPI**" /// check | "Inspirierte **FastAPI**"
Wege zu finden, eine großartige Performanz zu erzielen. Wege zu finden, eine großartige Performanz zu erzielen.
Zusammen mit Hug (da Hug auf Falcon basiert), einen `response`-Parameter in Funktionen zu deklarieren. Zusammen mit Hug (da Hug auf Falcon basiert), einen `response`-Parameter in Funktionen zu deklarieren.
Obwohl er in FastAPI optional ist und hauptsächlich zum Festlegen von Headern, Cookies und alternativen Statuscodes verwendet wird. Obwohl er in FastAPI optional ist und hauptsächlich zum Festlegen von Headern, Cookies und alternativen Statuscodes verwendet wird.
///
### <a href="https://moltenframework.com/" class="external-link" target="_blank">Molten</a> ### <a href="https://moltenframework.com/" class="external-link" target="_blank">Molten</a>
Ich habe Molten in den ersten Phasen der Entwicklung von **FastAPI** entdeckt. Und es hat ganz ähnliche Ideen: Ich habe Molten in den ersten Phasen der Entwicklung von **FastAPI** entdeckt. Und es hat ganz ähnliche Ideen:
@ -269,11 +313,14 @@ Das Dependency Injection System erfordert eine Vorab-Registrierung der Abhängig
Routen werden an einer einzigen Stelle deklariert, indem Funktionen verwendet werden, die an anderen Stellen deklariert wurden (anstatt Dekoratoren zu verwenden, welche direkt über der Funktion platziert werden können, welche den Endpunkt verarbeitet). Dies ähnelt eher der Vorgehensweise von Django als der Vorgehensweise von Flask (und Starlette). Es trennt im Code Dinge, die relativ eng miteinander gekoppelt sind. Routen werden an einer einzigen Stelle deklariert, indem Funktionen verwendet werden, die an anderen Stellen deklariert wurden (anstatt Dekoratoren zu verwenden, welche direkt über der Funktion platziert werden können, welche den Endpunkt verarbeitet). Dies ähnelt eher der Vorgehensweise von Django als der Vorgehensweise von Flask (und Starlette). Es trennt im Code Dinge, die relativ eng miteinander gekoppelt sind.
!!! check "Inspirierte **FastAPI**" /// check | "Inspirierte **FastAPI**"
Zusätzliche Validierungen für Datentypen zu definieren, mithilfe des „Default“-Werts von Modellattributen. Dies verbessert die Editorunterstützung und war zuvor in Pydantic nicht verfügbar. Zusätzliche Validierungen für Datentypen zu definieren, mithilfe des „Default“-Werts von Modellattributen. Dies verbessert die Editorunterstützung und war zuvor in Pydantic nicht verfügbar.
Das hat tatsächlich dazu geführt, dass Teile von Pydantic aktualisiert wurden, um denselben Validierungsdeklarationsstil zu unterstützen (diese gesamte Funktionalität ist jetzt bereits in Pydantic verfügbar). Das hat tatsächlich dazu geführt, dass Teile von Pydantic aktualisiert wurden, um denselben Validierungsdeklarationsstil zu unterstützen (diese gesamte Funktionalität ist jetzt bereits in Pydantic verfügbar).
///
### <a href="https://www.hug.rest/" class="external-link" target="_blank">Hug</a> ### <a href="https://www.hug.rest/" class="external-link" target="_blank">Hug</a>
Hug war eines der ersten Frameworks, welches die Deklaration von API-Parametertypen mithilfe von Python-Typhinweisen implementierte. Das war eine großartige Idee, die andere Tools dazu inspirierte, dasselbe zu tun. Hug war eines der ersten Frameworks, welches die Deklaration von API-Parametertypen mithilfe von Python-Typhinweisen implementierte. Das war eine großartige Idee, die andere Tools dazu inspirierte, dasselbe zu tun.
@ -288,16 +335,22 @@ Es verfügt über eine interessante, ungewöhnliche Funktion: Mit demselben Fram
Da es auf dem bisherigen Standard für synchrone Python-Webframeworks (WSGI) basiert, kann es nicht mit Websockets und anderen Dingen umgehen, verfügt aber dennoch über eine hohe Performanz. Da es auf dem bisherigen Standard für synchrone Python-Webframeworks (WSGI) basiert, kann es nicht mit Websockets und anderen Dingen umgehen, verfügt aber dennoch über eine hohe Performanz.
!!! info /// info
Hug wurde von Timothy Crosley erstellt, dem gleichen Schöpfer von <a href="https://github.com/timothycrosley/isort" class="external-link" target="_blank">`isort`</a>, einem großartigen Tool zum automatischen Sortieren von Importen in Python-Dateien. Hug wurde von Timothy Crosley erstellt, dem gleichen Schöpfer von <a href="https://github.com/timothycrosley/isort" class="external-link" target="_blank">`isort`</a>, einem großartigen Tool zum automatischen Sortieren von Importen in Python-Dateien.
!!! check "Ideen, die **FastAPI** inspiriert haben" ///
/// check | "Ideen, die **FastAPI** inspiriert haben"
Hug inspirierte Teile von APIStar und war eines der Tools, die ich am vielversprechendsten fand, neben APIStar. Hug inspirierte Teile von APIStar und war eines der Tools, die ich am vielversprechendsten fand, neben APIStar.
Hug hat dazu beigetragen, **FastAPI** dazu zu inspirieren, Python-Typhinweise zum Deklarieren von Parametern zu verwenden und ein Schema zu generieren, das die API automatisch definiert. Hug hat dazu beigetragen, **FastAPI** dazu zu inspirieren, Python-Typhinweise zum Deklarieren von Parametern zu verwenden und ein Schema zu generieren, das die API automatisch definiert.
Hug inspirierte **FastAPI** dazu, einen `response`-Parameter in Funktionen zu deklarieren, um Header und Cookies zu setzen. Hug inspirierte **FastAPI** dazu, einen `response`-Parameter in Funktionen zu deklarieren, um Header und Cookies zu setzen.
///
### <a href="https://github.com/encode/apistar" class="external-link" target="_blank">APIStar</a> (≦ 0.5) ### <a href="https://github.com/encode/apistar" class="external-link" target="_blank">APIStar</a> (≦ 0.5)
Kurz bevor ich mich entschied, **FastAPI** zu erstellen, fand ich den **APIStar**-Server. Er hatte fast alles, was ich suchte, und ein tolles Design. Kurz bevor ich mich entschied, **FastAPI** zu erstellen, fand ich den **APIStar**-Server. Er hatte fast alles, was ich suchte, und ein tolles Design.
@ -322,14 +375,18 @@ Es handelte sich nicht länger um ein API-Webframework, da sich der Entwickler a
Jetzt handelt es sich bei APIStar um eine Reihe von Tools zur Validierung von OpenAPI-Spezifikationen, nicht um ein Webframework. Jetzt handelt es sich bei APIStar um eine Reihe von Tools zur Validierung von OpenAPI-Spezifikationen, nicht um ein Webframework.
!!! info /// info
APIStar wurde von Tom Christie erstellt. Derselbe, welcher Folgendes erstellt hat: APIStar wurde von Tom Christie erstellt. Derselbe, welcher Folgendes erstellt hat:
* Django REST Framework * Django REST Framework
* Starlette (auf welchem **FastAPI** basiert) * Starlette (auf welchem **FastAPI** basiert)
* Uvicorn (verwendet von Starlette und **FastAPI**) * Uvicorn (verwendet von Starlette und **FastAPI**)
!!! check "Inspirierte **FastAPI**" ///
/// check | "Inspirierte **FastAPI**"
Zu existieren. Zu existieren.
Die Idee, mehrere Dinge (Datenvalidierung, Serialisierung und Dokumentation) mit denselben Python-Typen zu deklarieren, welche gleichzeitig eine hervorragende Editorunterstützung bieten, hielt ich für eine brillante Idee. Die Idee, mehrere Dinge (Datenvalidierung, Serialisierung und Dokumentation) mit denselben Python-Typen zu deklarieren, welche gleichzeitig eine hervorragende Editorunterstützung bieten, hielt ich für eine brillante Idee.
@ -340,6 +397,8 @@ Jetzt handelt es sich bei APIStar um eine Reihe von Tools zur Validierung von Op
Ich betrachte **FastAPI** als einen „spirituellen Nachfolger“ von APIStar, welcher die Funktionen, das Typsystem und andere Teile verbessert und erweitert, basierend auf den Erkenntnissen aus all diesen früheren Tools. Ich betrachte **FastAPI** als einen „spirituellen Nachfolger“ von APIStar, welcher die Funktionen, das Typsystem und andere Teile verbessert und erweitert, basierend auf den Erkenntnissen aus all diesen früheren Tools.
///
## Verwendet von **FastAPI** ## Verwendet von **FastAPI**
### <a href="https://pydantic-docs.helpmanual.io/" class="external-link" target="_blank">Pydantic</a> ### <a href="https://pydantic-docs.helpmanual.io/" class="external-link" target="_blank">Pydantic</a>
@ -350,11 +409,14 @@ Das macht es äußerst intuitiv.
Es ist vergleichbar mit Marshmallow. Obwohl es in Benchmarks schneller als Marshmallow ist. Und da es auf den gleichen Python-Typhinweisen basiert, ist die Editorunterstützung großartig. Es ist vergleichbar mit Marshmallow. Obwohl es in Benchmarks schneller als Marshmallow ist. Und da es auf den gleichen Python-Typhinweisen basiert, ist die Editorunterstützung großartig.
!!! check "**FastAPI** verwendet es, um" /// check | "**FastAPI** verwendet es, um"
Die gesamte Datenvalidierung, Datenserialisierung und automatische Modelldokumentation (basierend auf JSON Schema) zu erledigen. Die gesamte Datenvalidierung, Datenserialisierung und automatische Modelldokumentation (basierend auf JSON Schema) zu erledigen.
**FastAPI** nimmt dann, abgesehen von all den anderen Dingen, die es tut, dieses JSON-Schema und fügt es in OpenAPI ein. **FastAPI** nimmt dann, abgesehen von all den anderen Dingen, die es tut, dieses JSON-Schema und fügt es in OpenAPI ein.
///
### <a href="https://www.starlette.io/" class="external-link" target="_blank">Starlette</a> ### <a href="https://www.starlette.io/" class="external-link" target="_blank">Starlette</a>
Starlette ist ein leichtgewichtiges <abbr title="Der neue Standard für die Erstellung asynchroner Python-Webanwendungen">ASGI</abbr>-Framework/Toolkit, welches sich ideal für die Erstellung hochperformanter asynchroner Dienste eignet. Starlette ist ein leichtgewichtiges <abbr title="Der neue Standard für die Erstellung asynchroner Python-Webanwendungen">ASGI</abbr>-Framework/Toolkit, welches sich ideal für die Erstellung hochperformanter asynchroner Dienste eignet.
@ -382,18 +444,24 @@ Es bietet jedoch keine automatische Datenvalidierung, Serialisierung oder Dokume
Das ist eines der wichtigsten Dinge, welche **FastAPI** hinzufügt, alles basierend auf Python-Typhinweisen (mit Pydantic). Das, plus, das Dependency Injection System, Sicherheitswerkzeuge, OpenAPI-Schemagenerierung, usw. Das ist eines der wichtigsten Dinge, welche **FastAPI** hinzufügt, alles basierend auf Python-Typhinweisen (mit Pydantic). Das, plus, das Dependency Injection System, Sicherheitswerkzeuge, OpenAPI-Schemagenerierung, usw.
!!! note "Technische Details" /// note | "Technische Details"
ASGI ist ein neuer „Standard“, welcher von Mitgliedern des Django-Kernteams entwickelt wird. Es handelt sich immer noch nicht um einen „Python-Standard“ (ein PEP), obwohl sie gerade dabei sind, das zu tun. ASGI ist ein neuer „Standard“, welcher von Mitgliedern des Django-Kernteams entwickelt wird. Es handelt sich immer noch nicht um einen „Python-Standard“ (ein PEP), obwohl sie gerade dabei sind, das zu tun.
Dennoch wird es bereits von mehreren Tools als „Standard“ verwendet. Das verbessert die Interoperabilität erheblich, da Sie Uvicorn mit jeden anderen ASGI-Server (wie Daphne oder Hypercorn) tauschen oder ASGI-kompatible Tools wie `python-socketio` hinzufügen können. Dennoch wird es bereits von mehreren Tools als „Standard“ verwendet. Das verbessert die Interoperabilität erheblich, da Sie Uvicorn mit jeden anderen ASGI-Server (wie Daphne oder Hypercorn) tauschen oder ASGI-kompatible Tools wie `python-socketio` hinzufügen können.
!!! check "**FastAPI** verwendet es, um" ///
/// check | "**FastAPI** verwendet es, um"
Alle Kern-Webaspekte zu handhaben. Und fügt Funktionen obenauf. Alle Kern-Webaspekte zu handhaben. Und fügt Funktionen obenauf.
Die Klasse `FastAPI` selbst erbt direkt von der Klasse `Starlette`. Die Klasse `FastAPI` selbst erbt direkt von der Klasse `Starlette`.
Alles, was Sie also mit Starlette machen können, können Sie direkt mit **FastAPI** machen, da es sich im Grunde um Starlette auf Steroiden handelt. Alles, was Sie also mit Starlette machen können, können Sie direkt mit **FastAPI** machen, da es sich im Grunde um Starlette auf Steroiden handelt.
///
### <a href="https://www.uvicorn.org/" class="external-link" target="_blank">Uvicorn</a> ### <a href="https://www.uvicorn.org/" class="external-link" target="_blank">Uvicorn</a>
Uvicorn ist ein blitzschneller ASGI-Server, der auf uvloop und httptools basiert. Uvicorn ist ein blitzschneller ASGI-Server, der auf uvloop und httptools basiert.
@ -402,13 +470,16 @@ Es handelt sich nicht um ein Webframework, sondern um einen Server. Beispielswei
Es ist der empfohlene Server für Starlette und **FastAPI**. Es ist der empfohlene Server für Starlette und **FastAPI**.
!!! check "**FastAPI** empfiehlt es als" /// check | "**FastAPI** empfiehlt es als"
Hauptwebserver zum Ausführen von **FastAPI**-Anwendungen. Hauptwebserver zum Ausführen von **FastAPI**-Anwendungen.
Sie können ihn mit Gunicorn kombinieren, um einen asynchronen Multiprozess-Server zu erhalten. Sie können ihn mit Gunicorn kombinieren, um einen asynchronen Multiprozess-Server zu erhalten.
Weitere Details finden Sie im Abschnitt [Deployment](deployment/index.md){.internal-link target=_blank}. Weitere Details finden Sie im Abschnitt [Deployment](deployment/index.md){.internal-link target=_blank}.
///
## Benchmarks und Geschwindigkeit ## Benchmarks und Geschwindigkeit
Um den Unterschied zwischen Uvicorn, Starlette und FastAPI zu verstehen, zu vergleichen und zu sehen, lesen Sie den Abschnitt über [Benchmarks](benchmarks.md){.internal-link target=_blank}. Um den Unterschied zwischen Uvicorn, Starlette und FastAPI zu verstehen, zu vergleichen und zu sehen, lesen Sie den Abschnitt über [Benchmarks](benchmarks.md){.internal-link target=_blank}.

20
docs/de/docs/async.md

@ -21,9 +21,12 @@ async def read_results():
return results return results
``` ```
!!! note /// note
Sie können `await` nur innerhalb von Funktionen verwenden, die mit `async def` erstellt wurden. Sie können `await` nur innerhalb von Funktionen verwenden, die mit `async def` erstellt wurden.
///
--- ---
Wenn Sie eine Bibliothek eines Dritten verwenden, die mit etwas kommuniziert (einer Datenbank, einer API, dem Dateisystem, usw.) und welche die Verwendung von `await` nicht unterstützt (dies ist derzeit bei den meisten Datenbankbibliotheken der Fall), dann deklarieren Sie Ihre *Pfadoperation-Funktionen* ganz normal nur mit `def`, etwa: Wenn Sie eine Bibliothek eines Dritten verwenden, die mit etwas kommuniziert (einer Datenbank, einer API, dem Dateisystem, usw.) und welche die Verwendung von `await` nicht unterstützt (dies ist derzeit bei den meisten Datenbankbibliotheken der Fall), dann deklarieren Sie Ihre *Pfadoperation-Funktionen* ganz normal nur mit `def`, etwa:
@ -136,9 +139,12 @@ Sie und Ihr Schwarm essen die Burger und haben eine schöne Zeit. ✨
<img src="/img/async/concurrent-burgers/concurrent-burgers-07.png" class="illustration"> <img src="/img/async/concurrent-burgers/concurrent-burgers-07.png" class="illustration">
!!! info /// info
Die wunderschönen Illustrationen stammen von <a href="https://www.instagram.com/ketrinadrawsalot" class="external-link" target="_blank">Ketrina Thompson</a>. 🎨 Die wunderschönen Illustrationen stammen von <a href="https://www.instagram.com/ketrinadrawsalot" class="external-link" target="_blank">Ketrina Thompson</a>. 🎨
///
--- ---
Stellen Sie sich vor, Sie wären das Computersystem / Programm 🤖 in dieser Geschichte. Stellen Sie sich vor, Sie wären das Computersystem / Programm 🤖 in dieser Geschichte.
@ -199,9 +205,12 @@ Sie essen sie und sind fertig. ⏹
Es wurde nicht viel geredet oder geflirtet, da die meiste Zeit mit Warten 🕙 vor der Theke verbracht wurde. 😞 Es wurde nicht viel geredet oder geflirtet, da die meiste Zeit mit Warten 🕙 vor der Theke verbracht wurde. 😞
!!! info /// info
Die wunderschönen Illustrationen stammen von <a href="https://www.instagram.com/ketrinadrawsalot" class="external-link" target="_blank">Ketrina Thompson</a>. 🎨 Die wunderschönen Illustrationen stammen von <a href="https://www.instagram.com/ketrinadrawsalot" class="external-link" target="_blank">Ketrina Thompson</a>. 🎨
///
--- ---
In diesem Szenario der parallelen Hamburger sind Sie ein Computersystem / Programm 🤖 mit zwei Prozessoren (Sie und Ihr Schwarm), die beide warten 🕙 und ihre Aufmerksamkeit darauf verwenden, „lange Zeit vor der Theke zu warten“ 🕙. In diesem Szenario der parallelen Hamburger sind Sie ein Computersystem / Programm 🤖 mit zwei Prozessoren (Sie und Ihr Schwarm), die beide warten 🕙 und ihre Aufmerksamkeit darauf verwenden, „lange Zeit vor der Theke zu warten“ 🕙.
@ -392,13 +401,16 @@ All das ist es, was FastAPI (via Starlette) befeuert und es eine so beeindrucken
## Sehr technische Details ## Sehr technische Details
!!! warning "Achtung" /// warning | "Achtung"
Das folgende können Sie wahrscheinlich überspringen. Das folgende können Sie wahrscheinlich überspringen.
Dies sind sehr technische Details darüber, wie **FastAPI** unter der Haube funktioniert. Dies sind sehr technische Details darüber, wie **FastAPI** unter der Haube funktioniert.
Wenn Sie über gute technische Kenntnisse verfügen (Coroutinen, Threads, Blocking, usw.) und neugierig sind, wie FastAPI mit `async def`s im Vergleich zu normalen `def`s umgeht, fahren Sie fort. Wenn Sie über gute technische Kenntnisse verfügen (Coroutinen, Threads, Blocking, usw.) und neugierig sind, wie FastAPI mit `async def`s im Vergleich zu normalen `def`s umgeht, fahren Sie fort.
///
### Pfadoperation-Funktionen ### Pfadoperation-Funktionen
Wenn Sie eine *Pfadoperation-Funktion* mit normalem `def` anstelle von `async def` deklarieren, wird sie in einem externen Threadpool ausgeführt, der dann `await`et wird, anstatt direkt aufgerufen zu werden (da dies den Server blockieren würde). Wenn Sie eine *Pfadoperation-Funktion* mit normalem `def` anstelle von `async def` deklarieren, wird sie in einem externen Threadpool ausgeführt, der dann `await`et wird, anstatt direkt aufgerufen zu werden (da dies den Server blockieren würde).

65
docs/de/docs/contributing.md

@ -24,7 +24,7 @@ Das erstellt ein Verzeichnis `./env/` mit den Python-Binärdateien und Sie könn
Aktivieren Sie die neue Umgebung mit: Aktivieren Sie die neue Umgebung mit:
=== "Linux, macOS" //// tab | Linux, macOS
<div class="termy"> <div class="termy">
@ -34,7 +34,9 @@ Aktivieren Sie die neue Umgebung mit:
</div> </div>
=== "Windows PowerShell" ////
//// tab | Windows PowerShell
<div class="termy"> <div class="termy">
@ -44,7 +46,9 @@ Aktivieren Sie die neue Umgebung mit:
</div> </div>
=== "Windows Bash" ////
//// tab | Windows Bash
Oder, wenn Sie Bash für Windows verwenden (z. B. <a href="https://gitforwindows.org/" class="external-link" target="_blank">Git Bash</a>): Oder, wenn Sie Bash für Windows verwenden (z. B. <a href="https://gitforwindows.org/" class="external-link" target="_blank">Git Bash</a>):
@ -56,9 +60,11 @@ Aktivieren Sie die neue Umgebung mit:
</div> </div>
////
Um zu überprüfen, ob es funktioniert hat, geben Sie ein: Um zu überprüfen, ob es funktioniert hat, geben Sie ein:
=== "Linux, macOS, Windows Bash" //// tab | Linux, macOS, Windows Bash
<div class="termy"> <div class="termy">
@ -70,7 +76,9 @@ Um zu überprüfen, ob es funktioniert hat, geben Sie ein:
</div> </div>
=== "Windows PowerShell" ////
//// tab | Windows PowerShell
<div class="termy"> <div class="termy">
@ -82,6 +90,8 @@ Um zu überprüfen, ob es funktioniert hat, geben Sie ein:
</div> </div>
////
Wenn die `pip` Binärdatei unter `env/bin/pip` angezeigt wird, hat es funktioniert. 🎉 Wenn die `pip` Binärdatei unter `env/bin/pip` angezeigt wird, hat es funktioniert. 🎉
Stellen Sie sicher, dass Sie über die neueste Version von pip in Ihrer lokalen Umgebung verfügen, um Fehler bei den nächsten Schritten zu vermeiden: Stellen Sie sicher, dass Sie über die neueste Version von pip in Ihrer lokalen Umgebung verfügen, um Fehler bei den nächsten Schritten zu vermeiden:
@ -96,11 +106,14 @@ $ python -m pip install --upgrade pip
</div> </div>
!!! tip "Tipp" /// tip | "Tipp"
Aktivieren Sie jedes Mal, wenn Sie ein neues Package mit `pip` in dieser Umgebung installieren, die Umgebung erneut. Aktivieren Sie jedes Mal, wenn Sie ein neues Package mit `pip` in dieser Umgebung installieren, die Umgebung erneut.
Dadurch wird sichergestellt, dass Sie, wenn Sie ein von diesem Package installiertes Terminalprogramm verwenden, das Programm aus Ihrer lokalen Umgebung verwenden und kein anderes, das global installiert sein könnte. Dadurch wird sichergestellt, dass Sie, wenn Sie ein von diesem Package installiertes Terminalprogramm verwenden, das Programm aus Ihrer lokalen Umgebung verwenden und kein anderes, das global installiert sein könnte.
///
### Benötigtes mit pip installieren ### Benötigtes mit pip installieren
Nachdem Sie die Umgebung wie oben beschrieben aktiviert haben: Nachdem Sie die Umgebung wie oben beschrieben aktiviert haben:
@ -125,11 +138,14 @@ Und wenn Sie diesen lokalen FastAPI-Quellcode aktualisieren und dann die Python-
Auf diese Weise müssen Sie Ihre lokale Version nicht „installieren“, um jede Änderung testen zu können. Auf diese Weise müssen Sie Ihre lokale Version nicht „installieren“, um jede Änderung testen zu können.
!!! note "Technische Details" /// note | "Technische Details"
Das geschieht nur, wenn Sie die Installation mit der enthaltenen `requirements.txt` durchführen, anstatt `pip install fastapi` direkt auszuführen. Das geschieht nur, wenn Sie die Installation mit der enthaltenen `requirements.txt` durchführen, anstatt `pip install fastapi` direkt auszuführen.
Das liegt daran, dass in der Datei `requirements.txt` die lokale Version von FastAPI mit der Option `-e` für die Installation im „editierbaren“ Modus markiert ist. Das liegt daran, dass in der Datei `requirements.txt` die lokale Version von FastAPI mit der Option `-e` für die Installation im „editierbaren“ Modus markiert ist.
///
### Den Code formatieren ### Den Code formatieren
Es gibt ein Skript, das, wenn Sie es ausführen, Ihren gesamten Code formatiert und bereinigt: Es gibt ein Skript, das, wenn Sie es ausführen, Ihren gesamten Code formatiert und bereinigt:
@ -170,7 +186,8 @@ Das stellt die Dokumentation unter `http://127.0.0.1:8008` bereit.
Auf diese Weise können Sie die Dokumentation/Quelldateien bearbeiten und die Änderungen live sehen. Auf diese Weise können Sie die Dokumentation/Quelldateien bearbeiten und die Änderungen live sehen.
!!! tip "Tipp" /// tip | "Tipp"
Alternativ können Sie die Schritte des Skripts auch manuell ausführen. Alternativ können Sie die Schritte des Skripts auch manuell ausführen.
Gehen Sie in das Verzeichnis für die entsprechende Sprache. Das für die englischsprachige Hauptdokumentation befindet sich unter `docs/en/`: Gehen Sie in das Verzeichnis für die entsprechende Sprache. Das für die englischsprachige Hauptdokumentation befindet sich unter `docs/en/`:
@ -185,6 +202,8 @@ Auf diese Weise können Sie die Dokumentation/Quelldateien bearbeiten und die Ä
$ mkdocs serve --dev-addr 8008 $ mkdocs serve --dev-addr 8008
``` ```
///
#### Typer-CLI (optional) #### Typer-CLI (optional)
Die Anleitung hier zeigt Ihnen, wie Sie das Skript unter `./scripts/docs.py` direkt mit dem `python` Programm verwenden. Die Anleitung hier zeigt Ihnen, wie Sie das Skript unter `./scripts/docs.py` direkt mit dem `python` Programm verwenden.
@ -210,9 +229,12 @@ Die Dokumentation verwendet <a href="https://www.mkdocs.org/" class="external-li
Und es gibt zusätzliche Tools/Skripte für Übersetzungen, in `./scripts/docs.py`. Und es gibt zusätzliche Tools/Skripte für Übersetzungen, in `./scripts/docs.py`.
!!! tip "Tipp" /// tip | "Tipp"
Sie müssen sich den Code in `./scripts/docs.py` nicht anschauen, verwenden Sie ihn einfach in der Kommandozeile. Sie müssen sich den Code in `./scripts/docs.py` nicht anschauen, verwenden Sie ihn einfach in der Kommandozeile.
///
Die gesamte Dokumentation befindet sich im Markdown-Format im Verzeichnis `./docs/en/`. Die gesamte Dokumentation befindet sich im Markdown-Format im Verzeichnis `./docs/en/`.
Viele der Tutorials enthalten Codeblöcke. Viele der Tutorials enthalten Codeblöcke.
@ -261,11 +283,14 @@ Hier sind die Schritte, die Ihnen bei Übersetzungen helfen.
* Sehen Sie diese Pull Requests durch (Review), schlagen Sie Änderungen vor, oder segnen Sie sie ab (Approval). Bei den Sprachen, die ich nicht spreche, warte ich, bis mehrere andere die Übersetzung durchgesehen haben, bevor ich den Pull Request merge. * Sehen Sie diese Pull Requests durch (Review), schlagen Sie Änderungen vor, oder segnen Sie sie ab (Approval). Bei den Sprachen, die ich nicht spreche, warte ich, bis mehrere andere die Übersetzung durchgesehen haben, bevor ich den Pull Request merge.
!!! tip "Tipp" /// tip | "Tipp"
Sie können <a href="https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/commenting-on-a-pull-request" class="external-link" target="_blank">Kommentare mit Änderungsvorschlägen</a> zu vorhandenen Pull Requests hinzufügen. Sie können <a href="https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/commenting-on-a-pull-request" class="external-link" target="_blank">Kommentare mit Änderungsvorschlägen</a> zu vorhandenen Pull Requests hinzufügen.
Schauen Sie sich die Dokumentation an, <a href="https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-request-reviews" class="external-link" target="_blank">wie man ein Review zu einem Pull Request hinzufügt</a>, welches den PR absegnet oder Änderungen vorschlägt. Schauen Sie sich die Dokumentation an, <a href="https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-request-reviews" class="external-link" target="_blank">wie man ein Review zu einem Pull Request hinzufügt</a>, welches den PR absegnet oder Änderungen vorschlägt.
///
* Überprüfen Sie, ob es eine <a href="https://github.com/fastapi/fastapi/discussions/categories/translations" class="external-link" target="_blank">GitHub-Diskussion</a> gibt, die Übersetzungen für Ihre Sprache koordiniert. Sie können sie abonnieren, und wenn ein neuer Pull Request zum Review vorliegt, wird der Diskussion automatisch ein Kommentar hinzugefügt. * Überprüfen Sie, ob es eine <a href="https://github.com/fastapi/fastapi/discussions/categories/translations" class="external-link" target="_blank">GitHub-Diskussion</a> gibt, die Übersetzungen für Ihre Sprache koordiniert. Sie können sie abonnieren, und wenn ein neuer Pull Request zum Review vorliegt, wird der Diskussion automatisch ein Kommentar hinzugefügt.
* Wenn Sie Seiten übersetzen, fügen Sie einen einzelnen Pull Request pro übersetzter Seite hinzu. Dadurch wird es für andere viel einfacher, ihn zu durchzusehen. * Wenn Sie Seiten übersetzen, fügen Sie einen einzelnen Pull Request pro übersetzter Seite hinzu. Dadurch wird es für andere viel einfacher, ihn zu durchzusehen.
@ -278,9 +303,12 @@ Angenommen, Sie möchten eine Seite für eine Sprache übersetzen, die bereits
Im Spanischen lautet der Zwei-Buchstaben-Code `es`. Das Verzeichnis für spanische Übersetzungen befindet sich also unter `docs/es/`. Im Spanischen lautet der Zwei-Buchstaben-Code `es`. Das Verzeichnis für spanische Übersetzungen befindet sich also unter `docs/es/`.
!!! tip "Tipp" /// tip | "Tipp"
Die Haupt („offizielle“) Sprache ist Englisch und befindet sich unter `docs/en/`. Die Haupt („offizielle“) Sprache ist Englisch und befindet sich unter `docs/en/`.
///
Führen Sie nun den Live-Server für die Dokumentation auf Spanisch aus: Führen Sie nun den Live-Server für die Dokumentation auf Spanisch aus:
<div class="termy"> <div class="termy">
@ -296,7 +324,8 @@ $ python ./scripts/docs.py live es
</div> </div>
!!! tip "Tipp" /// tip | "Tipp"
Alternativ können Sie die Schritte des Skripts auch manuell ausführen. Alternativ können Sie die Schritte des Skripts auch manuell ausführen.
Gehen Sie in das Sprachverzeichnis, für die spanischen Übersetzungen ist das `docs/es/`: Gehen Sie in das Sprachverzeichnis, für die spanischen Übersetzungen ist das `docs/es/`:
@ -311,6 +340,8 @@ $ python ./scripts/docs.py live es
$ mkdocs serve --dev-addr 8008 $ mkdocs serve --dev-addr 8008
``` ```
///
Jetzt können Sie auf <a href="http://127.0.0.1:8008" class="external-link" target="_blank">http://127.0.0.1:8008</a> gehen und Ihre Änderungen live sehen. Jetzt können Sie auf <a href="http://127.0.0.1:8008" class="external-link" target="_blank">http://127.0.0.1:8008</a> gehen und Ihre Änderungen live sehen.
Sie werden sehen, dass jede Sprache alle Seiten hat. Einige Seiten sind jedoch nicht übersetzt und haben oben eine Info-Box, dass die Übersetzung noch fehlt. Sie werden sehen, dass jede Sprache alle Seiten hat. Einige Seiten sind jedoch nicht übersetzt und haben oben eine Info-Box, dass die Übersetzung noch fehlt.
@ -329,9 +360,12 @@ docs/en/docs/features.md
docs/es/docs/features.md docs/es/docs/features.md
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Beachten Sie, dass die einzige Änderung in Pfad und Dateiname der Sprachcode ist, von `en` zu `es`. Beachten Sie, dass die einzige Änderung in Pfad und Dateiname der Sprachcode ist, von `en` zu `es`.
///
Wenn Sie in Ihrem Browser nachsehen, werden Sie feststellen, dass die Dokumentation jetzt Ihren neuen Abschnitt anzeigt (die Info-Box oben ist verschwunden). 🎉 Wenn Sie in Ihrem Browser nachsehen, werden Sie feststellen, dass die Dokumentation jetzt Ihren neuen Abschnitt anzeigt (die Info-Box oben ist verschwunden). 🎉
Jetzt können Sie alles übersetzen und beim Speichern sehen, wie es aussieht. Jetzt können Sie alles übersetzen und beim Speichern sehen, wie es aussieht.
@ -365,9 +399,12 @@ Obiges Kommando hat eine Datei `docs/ht/mkdocs.yml` mit einer Minimal-Konfigurat
INHERIT: ../en/mkdocs.yml INHERIT: ../en/mkdocs.yml
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Sie können diese Datei mit diesem Inhalt auch einfach manuell erstellen. Sie können diese Datei mit diesem Inhalt auch einfach manuell erstellen.
///
Das Kommando hat auch eine Dummy-Datei `docs/ht/index.md` für die Hauptseite erstellt. Sie können mit der Übersetzung dieser Datei beginnen. Das Kommando hat auch eine Dummy-Datei `docs/ht/index.md` für die Hauptseite erstellt. Sie können mit der Übersetzung dieser Datei beginnen.
Sie können nun mit den obigen Instruktionen für eine „vorhandene Sprache“ fortfahren. Sie können nun mit den obigen Instruktionen für eine „vorhandene Sprache“ fortfahren.

20
docs/de/docs/deployment/concepts.md

@ -151,11 +151,14 @@ Und dennoch möchten Sie wahrscheinlich nicht, dass die Anwendung tot bleibt, we
Aber in den Fällen mit wirklich schwerwiegenden Fehlern, die den laufenden **Prozess** zum Absturz bringen, benötigen Sie eine externe Komponente, die den Prozess **neu startet**, zumindest ein paar Mal ... Aber in den Fällen mit wirklich schwerwiegenden Fehlern, die den laufenden **Prozess** zum Absturz bringen, benötigen Sie eine externe Komponente, die den Prozess **neu startet**, zumindest ein paar Mal ...
!!! tip "Tipp" /// tip | "Tipp"
... Obwohl es wahrscheinlich keinen Sinn macht, sie immer wieder neu zu starten, wenn die gesamte Anwendung einfach **sofort abstürzt**. Aber in diesen Fällen werden Sie es wahrscheinlich während der Entwicklung oder zumindest direkt nach dem Deployment bemerken. ... Obwohl es wahrscheinlich keinen Sinn macht, sie immer wieder neu zu starten, wenn die gesamte Anwendung einfach **sofort abstürzt**. Aber in diesen Fällen werden Sie es wahrscheinlich während der Entwicklung oder zumindest direkt nach dem Deployment bemerken.
Konzentrieren wir uns also auf die Hauptfälle, in denen die Anwendung in bestimmten Fällen **in der Zukunft** völlig abstürzen könnte und es dann dennoch sinnvoll ist, sie neu zu starten. Konzentrieren wir uns also auf die Hauptfälle, in denen die Anwendung in bestimmten Fällen **in der Zukunft** völlig abstürzen könnte und es dann dennoch sinnvoll ist, sie neu zu starten.
///
Sie möchten wahrscheinlich, dass eine **externe Komponente** für den Neustart Ihrer Anwendung verantwortlich ist, da zu diesem Zeitpunkt dieselbe Anwendung mit Uvicorn und Python bereits abgestürzt ist und es daher nichts im selben Code derselben Anwendung gibt, was etwas dagegen tun kann. Sie möchten wahrscheinlich, dass eine **externe Komponente** für den Neustart Ihrer Anwendung verantwortlich ist, da zu diesem Zeitpunkt dieselbe Anwendung mit Uvicorn und Python bereits abgestürzt ist und es daher nichts im selben Code derselben Anwendung gibt, was etwas dagegen tun kann.
### Beispieltools zum automatischen Neustart ### Beispieltools zum automatischen Neustart
@ -238,11 +241,14 @@ Hier sind einige mögliche Kombinationen und Strategien:
* **Cloud-Dienste**, welche das für Sie erledigen * **Cloud-Dienste**, welche das für Sie erledigen
* Der Cloud-Dienst wird wahrscheinlich **die Replikation für Sie übernehmen**. Er würde Sie möglicherweise **einen auszuführenden Prozess** oder ein **zu verwendendes Container-Image** definieren lassen, in jedem Fall wäre es höchstwahrscheinlich **ein einzelner Uvicorn-Prozess**, und der Cloud-Dienst wäre auch verantwortlich für die Replikation. * Der Cloud-Dienst wird wahrscheinlich **die Replikation für Sie übernehmen**. Er würde Sie möglicherweise **einen auszuführenden Prozess** oder ein **zu verwendendes Container-Image** definieren lassen, in jedem Fall wäre es höchstwahrscheinlich **ein einzelner Uvicorn-Prozess**, und der Cloud-Dienst wäre auch verantwortlich für die Replikation.
!!! tip "Tipp" /// tip | "Tipp"
Machen Sie sich keine Sorgen, wenn einige dieser Punkte zu **Containern**, Docker oder Kubernetes noch nicht viel Sinn ergeben. Machen Sie sich keine Sorgen, wenn einige dieser Punkte zu **Containern**, Docker oder Kubernetes noch nicht viel Sinn ergeben.
Ich werde Ihnen in einem zukünftigen Kapitel mehr über Container-Images, Docker, Kubernetes, usw. erzählen: [FastAPI in Containern – Docker](docker.md){.internal-link target=_blank}. Ich werde Ihnen in einem zukünftigen Kapitel mehr über Container-Images, Docker, Kubernetes, usw. erzählen: [FastAPI in Containern – Docker](docker.md){.internal-link target=_blank}.
///
## Schritte vor dem Start ## Schritte vor dem Start
Es gibt viele Fälle, in denen Sie, **bevor Sie Ihre Anwendung starten**, einige Schritte ausführen möchten. Es gibt viele Fälle, in denen Sie, **bevor Sie Ihre Anwendung starten**, einige Schritte ausführen möchten.
@ -257,11 +263,14 @@ Und Sie müssen sicherstellen, dass es sich um einen einzelnen Prozess handelt,
Natürlich gibt es Fälle, in denen es kein Problem darstellt, die Vorab-Schritte mehrmals auszuführen. In diesem Fall ist die Handhabung viel einfacher. Natürlich gibt es Fälle, in denen es kein Problem darstellt, die Vorab-Schritte mehrmals auszuführen. In diesem Fall ist die Handhabung viel einfacher.
!!! tip "Tipp" /// tip | "Tipp"
Bedenken Sie außerdem, dass Sie, abhängig von Ihrer Einrichtung, in manchen Fällen **gar keine Vorab-Schritte** benötigen, bevor Sie die Anwendung starten. Bedenken Sie außerdem, dass Sie, abhängig von Ihrer Einrichtung, in manchen Fällen **gar keine Vorab-Schritte** benötigen, bevor Sie die Anwendung starten.
In diesem Fall müssen Sie sich darüber keine Sorgen machen. 🤷 In diesem Fall müssen Sie sich darüber keine Sorgen machen. 🤷
///
### Beispiele für Strategien für Vorab-Schritte ### Beispiele für Strategien für Vorab-Schritte
Es hängt **stark** davon ab, wie Sie **Ihr System bereitstellen**, und hängt wahrscheinlich mit der Art und Weise zusammen, wie Sie Programme starten, Neustarts durchführen, usw. Es hängt **stark** davon ab, wie Sie **Ihr System bereitstellen**, und hängt wahrscheinlich mit der Art und Weise zusammen, wie Sie Programme starten, Neustarts durchführen, usw.
@ -272,9 +281,12 @@ Hier sind einige mögliche Ideen:
* Ein Bash-Skript, das die Vorab-Schritte ausführt und dann Ihre Anwendung startet * Ein Bash-Skript, das die Vorab-Schritte ausführt und dann Ihre Anwendung startet
* Sie benötigen immer noch eine Möglichkeit, *dieses* Bash-Skript zu starten/neu zu starten, Fehler zu erkennen, usw. * Sie benötigen immer noch eine Möglichkeit, *dieses* Bash-Skript zu starten/neu zu starten, Fehler zu erkennen, usw.
!!! tip "Tipp" /// tip | "Tipp"
Konkretere Beispiele hierfür mit Containern gebe ich Ihnen in einem späteren Kapitel: [FastAPI in Containern – Docker](docker.md){.internal-link target=_blank}. Konkretere Beispiele hierfür mit Containern gebe ich Ihnen in einem späteren Kapitel: [FastAPI in Containern – Docker](docker.md){.internal-link target=_blank}.
///
## Ressourcennutzung ## Ressourcennutzung
Ihr(e) Server ist (sind) eine **Ressource**, welche Sie mit Ihren Programmen, der Rechenzeit auf den CPUs und dem verfügbaren RAM-Speicher verbrauchen oder **nutzen** können. Ihr(e) Server ist (sind) eine **Ressource**, welche Sie mit Ihren Programmen, der Rechenzeit auf den CPUs und dem verfügbaren RAM-Speicher verbrauchen oder **nutzen** können.

55
docs/de/docs/deployment/docker.md

@ -4,9 +4,12 @@ Beim Deployment von FastAPI-Anwendungen besteht ein gängiger Ansatz darin, ein
Die Verwendung von Linux-Containern bietet mehrere Vorteile, darunter **Sicherheit**, **Replizierbarkeit**, **Einfachheit** und andere. Die Verwendung von Linux-Containern bietet mehrere Vorteile, darunter **Sicherheit**, **Replizierbarkeit**, **Einfachheit** und andere.
!!! tip "Tipp" /// tip | "Tipp"
Sie haben es eilig und kennen sich bereits aus? Springen Sie zum [`Dockerfile` unten 👇](#ein-docker-image-fur-fastapi-erstellen). Sie haben es eilig und kennen sich bereits aus? Springen Sie zum [`Dockerfile` unten 👇](#ein-docker-image-fur-fastapi-erstellen).
///
<Details> <Details>
<summary>Dockerfile-Vorschau 👀</summary> <summary>Dockerfile-Vorschau 👀</summary>
@ -130,11 +133,14 @@ Successfully installed fastapi pydantic uvicorn
</div> </div>
!!! info /// info
Es gibt andere Formate und Tools zum Definieren und Installieren von Paketabhängigkeiten. Es gibt andere Formate und Tools zum Definieren und Installieren von Paketabhängigkeiten.
Ich zeige Ihnen später in einem Abschnitt unten ein Beispiel unter Verwendung von Poetry. 👇 Ich zeige Ihnen später in einem Abschnitt unten ein Beispiel unter Verwendung von Poetry. 👇
///
### Den **FastAPI**-Code erstellen ### Den **FastAPI**-Code erstellen
* Erstellen Sie ein `app`-Verzeichnis und betreten Sie es. * Erstellen Sie ein `app`-Verzeichnis und betreten Sie es.
@ -199,9 +205,12 @@ CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
Die Option `--no-cache-dir` weist `pip` an, die heruntergeladenen Pakete nicht lokal zu speichern, da dies nur benötigt wird, sollte `pip` erneut ausgeführt werden, um dieselben Pakete zu installieren, aber das ist beim Arbeiten mit Containern nicht der Fall. Die Option `--no-cache-dir` weist `pip` an, die heruntergeladenen Pakete nicht lokal zu speichern, da dies nur benötigt wird, sollte `pip` erneut ausgeführt werden, um dieselben Pakete zu installieren, aber das ist beim Arbeiten mit Containern nicht der Fall.
!!! note "Hinweis" /// note | Hinweis
Das `--no-cache-dir` bezieht sich nur auf `pip`, es hat nichts mit Docker oder Containern zu tun. Das `--no-cache-dir` bezieht sich nur auf `pip`, es hat nichts mit Docker oder Containern zu tun.
///
Die Option `--upgrade` weist `pip` an, die Packages zu aktualisieren, wenn sie bereits installiert sind. Die Option `--upgrade` weist `pip` an, die Packages zu aktualisieren, wenn sie bereits installiert sind.
Da der vorherige Schritt des Kopierens der Datei vom **Docker-Cache** erkannt werden konnte, wird dieser Schritt auch **den Docker-Cache verwenden**, sofern verfügbar. Da der vorherige Schritt des Kopierens der Datei vom **Docker-Cache** erkannt werden konnte, wird dieser Schritt auch **den Docker-Cache verwenden**, sofern verfügbar.
@ -222,9 +231,12 @@ CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
Da das Programm unter `/code` gestartet wird und sich darin das Verzeichnis `./app` mit Ihrem Code befindet, kann **Uvicorn** `app` sehen und aus `app.main` **importieren**. Da das Programm unter `/code` gestartet wird und sich darin das Verzeichnis `./app` mit Ihrem Code befindet, kann **Uvicorn** `app` sehen und aus `app.main` **importieren**.
!!! tip "Tipp" /// tip | "Tipp"
Lernen Sie, was jede Zeile bewirkt, indem Sie auf die Zahlenblasen im Code klicken. 👆 Lernen Sie, was jede Zeile bewirkt, indem Sie auf die Zahlenblasen im Code klicken. 👆
///
Sie sollten jetzt eine Verzeichnisstruktur wie diese haben: Sie sollten jetzt eine Verzeichnisstruktur wie diese haben:
``` ```
@ -293,11 +305,14 @@ $ docker build -t myimage .
</div> </div>
!!! tip "Tipp" /// tip | "Tipp"
Beachten Sie das `.` am Ende, es entspricht `./` und teilt Docker mit, welches Verzeichnis zum Erstellen des Containerimages verwendet werden soll. Beachten Sie das `.` am Ende, es entspricht `./` und teilt Docker mit, welches Verzeichnis zum Erstellen des Containerimages verwendet werden soll.
In diesem Fall handelt es sich um dasselbe aktuelle Verzeichnis (`.`). In diesem Fall handelt es sich um dasselbe aktuelle Verzeichnis (`.`).
///
### Den Docker-Container starten ### Den Docker-Container starten
* Führen Sie einen Container basierend auf Ihrem Image aus: * Führen Sie einen Container basierend auf Ihrem Image aus:
@ -394,9 +409,12 @@ Wenn wir uns nur auf das **Containerimage** für eine FastAPI-Anwendung (und sp
Es könnte sich um einen anderen Container handeln, zum Beispiel mit <a href="https://traefik.io/" class="external-link" target="_blank">Traefik</a>, welcher **HTTPS** und **automatischen** Erwerb von **Zertifikaten** handhabt. Es könnte sich um einen anderen Container handeln, zum Beispiel mit <a href="https://traefik.io/" class="external-link" target="_blank">Traefik</a>, welcher **HTTPS** und **automatischen** Erwerb von **Zertifikaten** handhabt.
!!! tip "Tipp" /// tip | "Tipp"
Traefik verfügt über Integrationen mit Docker, Kubernetes und anderen, sodass Sie damit ganz einfach HTTPS für Ihre Container einrichten und konfigurieren können. Traefik verfügt über Integrationen mit Docker, Kubernetes und anderen, sodass Sie damit ganz einfach HTTPS für Ihre Container einrichten und konfigurieren können.
///
Alternativ könnte HTTPS von einem Cloud-Anbieter als einer seiner Dienste gehandhabt werden (während die Anwendung weiterhin in einem Container ausgeführt wird). Alternativ könnte HTTPS von einem Cloud-Anbieter als einer seiner Dienste gehandhabt werden (während die Anwendung weiterhin in einem Container ausgeführt wird).
## Beim Hochfahren ausführen und Neustarts ## Beim Hochfahren ausführen und Neustarts
@ -423,9 +441,12 @@ Bei der Verwendung von Containern ist normalerweise eine Komponente vorhanden, *
Da diese Komponente die **Last** an Requests aufnehmen und diese (hoffentlich) **ausgewogen** auf die Worker verteilen würde, wird sie üblicherweise auch **Load Balancer** – Lastverteiler – genannt. Da diese Komponente die **Last** an Requests aufnehmen und diese (hoffentlich) **ausgewogen** auf die Worker verteilen würde, wird sie üblicherweise auch **Load Balancer** – Lastverteiler – genannt.
!!! tip "Tipp" /// tip | "Tipp"
Die gleiche **TLS-Terminierungsproxy**-Komponente, die für HTTPS verwendet wird, wäre wahrscheinlich auch ein **Load Balancer**. Die gleiche **TLS-Terminierungsproxy**-Komponente, die für HTTPS verwendet wird, wäre wahrscheinlich auch ein **Load Balancer**.
///
Und wenn Sie mit Containern arbeiten, verfügt das gleiche System, mit dem Sie diese starten und verwalten, bereits über interne Tools, um die **Netzwerkkommunikation** (z. B. HTTP-Requests) von diesem **Load Balancer** (das könnte auch ein **TLS-Terminierungsproxy** sein) zu den Containern mit Ihrer Anwendung weiterzuleiten. Und wenn Sie mit Containern arbeiten, verfügt das gleiche System, mit dem Sie diese starten und verwalten, bereits über interne Tools, um die **Netzwerkkommunikation** (z. B. HTTP-Requests) von diesem **Load Balancer** (das könnte auch ein **TLS-Terminierungsproxy** sein) zu den Containern mit Ihrer Anwendung weiterzuleiten.
### Ein Load Balancer – mehrere Workercontainer ### Ein Load Balancer – mehrere Workercontainer
@ -503,9 +524,12 @@ Wenn Sie Container (z. B. Docker, Kubernetes) verwenden, können Sie hauptsächl
Wenn Sie **mehrere Container** haben, von denen wahrscheinlich jeder einen **einzelnen Prozess** ausführt (z. B. in einem **Kubernetes**-Cluster), dann möchten Sie wahrscheinlich einen **separaten Container** haben, welcher die Arbeit der **Vorab-Schritte** in einem einzelnen Container, mit einem einzelnenen Prozess ausführt, **bevor** die replizierten Workercontainer ausgeführt werden. Wenn Sie **mehrere Container** haben, von denen wahrscheinlich jeder einen **einzelnen Prozess** ausführt (z. B. in einem **Kubernetes**-Cluster), dann möchten Sie wahrscheinlich einen **separaten Container** haben, welcher die Arbeit der **Vorab-Schritte** in einem einzelnen Container, mit einem einzelnenen Prozess ausführt, **bevor** die replizierten Workercontainer ausgeführt werden.
!!! info /// info
Wenn Sie Kubernetes verwenden, wäre dies wahrscheinlich ein <a href="https://kubernetes.io/docs/concepts/workloads/pods/init-containers/" class="external-link" target="_blank">Init-Container</a>. Wenn Sie Kubernetes verwenden, wäre dies wahrscheinlich ein <a href="https://kubernetes.io/docs/concepts/workloads/pods/init-containers/" class="external-link" target="_blank">Init-Container</a>.
///
Wenn es in Ihrem Anwendungsfall kein Problem darstellt, diese vorherigen Schritte **mehrmals parallel** auszuführen (z. B. wenn Sie keine Datenbankmigrationen ausführen, sondern nur prüfen, ob die Datenbank bereits bereit ist), können Sie sie auch einfach in jedem Container direkt vor dem Start des Hauptprozesses einfügen. Wenn es in Ihrem Anwendungsfall kein Problem darstellt, diese vorherigen Schritte **mehrmals parallel** auszuführen (z. B. wenn Sie keine Datenbankmigrationen ausführen, sondern nur prüfen, ob die Datenbank bereits bereit ist), können Sie sie auch einfach in jedem Container direkt vor dem Start des Hauptprozesses einfügen.
### Einzelner Container ### Einzelner Container
@ -520,18 +544,24 @@ Dieses Image wäre vor allem in den oben beschriebenen Situationen nützlich: [C
* <a href="https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker" class="external-link" target="_blank">tiangolo/uvicorn-gunicorn-fastapi</a>. * <a href="https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker" class="external-link" target="_blank">tiangolo/uvicorn-gunicorn-fastapi</a>.
!!! warning "Achtung" /// warning | "Achtung"
Es besteht eine hohe Wahrscheinlichkeit, dass Sie dieses oder ein ähnliches Basisimage **nicht** benötigen und es besser wäre, wenn Sie das Image von Grund auf neu erstellen würden, wie [oben beschrieben in: Ein Docker-Image für FastAPI erstellen](#ein-docker-image-fur-fastapi-erstellen). Es besteht eine hohe Wahrscheinlichkeit, dass Sie dieses oder ein ähnliches Basisimage **nicht** benötigen und es besser wäre, wenn Sie das Image von Grund auf neu erstellen würden, wie [oben beschrieben in: Ein Docker-Image für FastAPI erstellen](#ein-docker-image-fur-fastapi-erstellen).
///
Dieses Image verfügt über einen **Auto-Tuning**-Mechanismus, um die **Anzahl der Arbeitsprozesse** basierend auf den verfügbaren CPU-Kernen festzulegen. Dieses Image verfügt über einen **Auto-Tuning**-Mechanismus, um die **Anzahl der Arbeitsprozesse** basierend auf den verfügbaren CPU-Kernen festzulegen.
Es verfügt über **vernünftige Standardeinstellungen**, aber Sie können trotzdem alle Konfigurationen mit **Umgebungsvariablen** oder Konfigurationsdateien ändern und aktualisieren. Es verfügt über **vernünftige Standardeinstellungen**, aber Sie können trotzdem alle Konfigurationen mit **Umgebungsvariablen** oder Konfigurationsdateien ändern und aktualisieren.
Es unterstützt auch die Ausführung von <a href="https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker#pre_start_path" class="external-link" target="_blank">**Vorab-Schritten vor dem Start** </a> mit einem Skript. Es unterstützt auch die Ausführung von <a href="https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker#pre_start_path" class="external-link" target="_blank">**Vorab-Schritten vor dem Start** </a> mit einem Skript.
!!! tip "Tipp" /// tip | "Tipp"
Um alle Konfigurationen und Optionen anzuzeigen, gehen Sie zur Docker-Image-Seite: <a href="https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker" class="external-link" target="_blank">tiangolo/uvicorn-gunicorn-fastapi</a>. Um alle Konfigurationen und Optionen anzuzeigen, gehen Sie zur Docker-Image-Seite: <a href="https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker" class="external-link" target="_blank">tiangolo/uvicorn-gunicorn-fastapi</a>.
///
### Anzahl der Prozesse auf dem offiziellen Docker-Image ### Anzahl der Prozesse auf dem offiziellen Docker-Image
Die **Anzahl der Prozesse** auf diesem Image wird **automatisch** anhand der verfügbaren CPU-**Kerne** berechnet. Die **Anzahl der Prozesse** auf diesem Image wird **automatisch** anhand der verfügbaren CPU-**Kerne** berechnet.
@ -657,9 +687,12 @@ CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
11. Führe den Befehl `uvicorn` aus und weise ihn an, das aus `app.main` importierte `app`-Objekt zu verwenden. 11. Führe den Befehl `uvicorn` aus und weise ihn an, das aus `app.main` importierte `app`-Objekt zu verwenden.
!!! tip "Tipp" /// tip | "Tipp"
Klicken Sie auf die Zahlenblasen, um zu sehen, was jede Zeile bewirkt. Klicken Sie auf die Zahlenblasen, um zu sehen, was jede Zeile bewirkt.
///
Eine **Docker-Phase** ist ein Teil eines `Dockerfile`s, welcher als **temporäres Containerimage** fungiert und nur zum Generieren einiger Dateien für die spätere Verwendung verwendet wird. Eine **Docker-Phase** ist ein Teil eines `Dockerfile`s, welcher als **temporäres Containerimage** fungiert und nur zum Generieren einiger Dateien für die spätere Verwendung verwendet wird.
Die erste Phase wird nur zur **Installation von Poetry** und zur **Generierung der `requirements.txt`** mit deren Projektabhängigkeiten aus der Datei `pyproject.toml` von Poetry verwendet. Die erste Phase wird nur zur **Installation von Poetry** und zur **Generierung der `requirements.txt`** mit deren Projektabhängigkeiten aus der Datei `pyproject.toml` von Poetry verwendet.

15
docs/de/docs/deployment/https.md

@ -4,9 +4,12 @@ Es ist leicht anzunehmen, dass HTTPS etwas ist, was einfach nur „aktiviert“
Aber es ist viel komplexer als das. Aber es ist viel komplexer als das.
!!! tip "Tipp" /// tip | "Tipp"
Wenn Sie es eilig haben oder es Ihnen egal ist, fahren Sie mit den nächsten Abschnitten fort, um Schritt-für-Schritt-Anleitungen für die Einrichtung der verschiedenen Technologien zu erhalten. Wenn Sie es eilig haben oder es Ihnen egal ist, fahren Sie mit den nächsten Abschnitten fort, um Schritt-für-Schritt-Anleitungen für die Einrichtung der verschiedenen Technologien zu erhalten.
///
Um **die Grundlagen von HTTPS** aus Sicht des Benutzers zu erlernen, schauen Sie sich <a href="https://howhttps.works/" class="external-link" target="_blank">https://howhttps.works/</a> an. Um **die Grundlagen von HTTPS** aus Sicht des Benutzers zu erlernen, schauen Sie sich <a href="https://howhttps.works/" class="external-link" target="_blank">https://howhttps.works/</a> an.
Aus **Sicht des Entwicklers** sollten Sie beim Nachdenken über HTTPS Folgendes beachten: Aus **Sicht des Entwicklers** sollten Sie beim Nachdenken über HTTPS Folgendes beachten:
@ -68,9 +71,12 @@ In dem oder den DNS-Server(n) würden Sie einen Eintrag (einen „`A record`“)
Sie würden dies wahrscheinlich nur einmal tun, beim ersten Mal, wenn Sie alles einrichten. Sie würden dies wahrscheinlich nur einmal tun, beim ersten Mal, wenn Sie alles einrichten.
!!! tip "Tipp" /// tip | "Tipp"
Dieser Domainnamen-Aspekt liegt weit vor HTTPS, aber da alles von der Domain und der IP-Adresse abhängt, lohnt es sich, das hier zu erwähnen. Dieser Domainnamen-Aspekt liegt weit vor HTTPS, aber da alles von der Domain und der IP-Adresse abhängt, lohnt es sich, das hier zu erwähnen.
///
### DNS ### DNS
Konzentrieren wir uns nun auf alle tatsächlichen HTTPS-Aspekte. Konzentrieren wir uns nun auf alle tatsächlichen HTTPS-Aspekte.
@ -115,9 +121,12 @@ Danach verfügen der Client und der Server über eine **verschlüsselte TCP-Verb
Und genau das ist **HTTPS**, es ist einfach **HTTP** innerhalb einer **sicheren TLS-Verbindung**, statt einer puren (unverschlüsselten) TCP-Verbindung. Und genau das ist **HTTPS**, es ist einfach **HTTP** innerhalb einer **sicheren TLS-Verbindung**, statt einer puren (unverschlüsselten) TCP-Verbindung.
!!! tip "Tipp" /// tip | "Tipp"
Beachten Sie, dass die Verschlüsselung der Kommunikation auf der **TCP-Ebene** und nicht auf der HTTP-Ebene erfolgt. Beachten Sie, dass die Verschlüsselung der Kommunikation auf der **TCP-Ebene** und nicht auf der HTTP-Ebene erfolgt.
///
### HTTPS-Request ### HTTPS-Request
Da Client und Server (sprich, der Browser und der TLS-Terminierungsproxy) nun über eine **verschlüsselte TCP-Verbindung** verfügen, können sie die **HTTP-Kommunikation** starten. Da Client und Server (sprich, der Browser und der TLS-Terminierungsproxy) nun über eine **verschlüsselte TCP-Verbindung** verfügen, können sie die **HTTP-Kommunikation** starten.

26
docs/de/docs/deployment/manually.md

@ -22,7 +22,7 @@ Wenn man sich auf die entfernte Maschine bezieht, wird sie üblicherweise als **
Sie können einen ASGI-kompatiblen Server installieren mit: Sie können einen ASGI-kompatiblen Server installieren mit:
=== "Uvicorn" //// tab | Uvicorn
* <a href="https://www.uvicorn.org/" class="external-link" target="_blank">Uvicorn</a>, ein blitzschneller ASGI-Server, basierend auf uvloop und httptools. * <a href="https://www.uvicorn.org/" class="external-link" target="_blank">Uvicorn</a>, ein blitzschneller ASGI-Server, basierend auf uvloop und httptools.
@ -36,12 +36,17 @@ Sie können einen ASGI-kompatiblen Server installieren mit:
</div> </div>
!!! tip "Tipp" /// tip | "Tipp"
Durch das Hinzufügen von `standard` installiert und verwendet Uvicorn einige empfohlene zusätzliche Abhängigkeiten. Durch das Hinzufügen von `standard` installiert und verwendet Uvicorn einige empfohlene zusätzliche Abhängigkeiten.
Inklusive `uvloop`, einen hochperformanten Drop-in-Ersatz für `asyncio`, welcher für einen großen Leistungsschub bei der Nebenläufigkeit sorgt. Inklusive `uvloop`, einen hochperformanten Drop-in-Ersatz für `asyncio`, welcher für einen großen Leistungsschub bei der Nebenläufigkeit sorgt.
=== "Hypercorn" ///
////
//// tab | Hypercorn
* <a href="https://github.com/pgjones/hypercorn" class="external-link" target="_blank">Hypercorn</a>, ein ASGI-Server, der auch mit HTTP/2 kompatibel ist. * <a href="https://github.com/pgjones/hypercorn" class="external-link" target="_blank">Hypercorn</a>, ein ASGI-Server, der auch mit HTTP/2 kompatibel ist.
@ -57,11 +62,13 @@ Sie können einen ASGI-kompatiblen Server installieren mit:
... oder jeden anderen ASGI-Server. ... oder jeden anderen ASGI-Server.
////
## Das Serverprogramm ausführen ## Das Serverprogramm ausführen
Anschließend können Sie Ihre Anwendung auf die gleiche Weise ausführen, wie Sie es in den Tutorials getan haben, jedoch ohne die Option `--reload`, z. B.: Anschließend können Sie Ihre Anwendung auf die gleiche Weise ausführen, wie Sie es in den Tutorials getan haben, jedoch ohne die Option `--reload`, z. B.:
=== "Uvicorn" //// tab | Uvicorn
<div class="termy"> <div class="termy">
@ -73,7 +80,9 @@ Anschließend können Sie Ihre Anwendung auf die gleiche Weise ausführen, wie S
</div> </div>
=== "Hypercorn" ////
//// tab | Hypercorn
<div class="termy"> <div class="termy">
@ -85,13 +94,18 @@ Anschließend können Sie Ihre Anwendung auf die gleiche Weise ausführen, wie S
</div> </div>
!!! warning "Achtung" ////
/// warning | "Achtung"
Denken Sie daran, die Option `--reload` zu entfernen, wenn Sie diese verwendet haben. Denken Sie daran, die Option `--reload` zu entfernen, wenn Sie diese verwendet haben.
Die Option `--reload` verbraucht viel mehr Ressourcen, ist instabiler, usw. Die Option `--reload` verbraucht viel mehr Ressourcen, ist instabiler, usw.
Sie hilft sehr während der **Entwicklung**, aber Sie sollten sie **nicht** in der **Produktion** verwenden. Sie hilft sehr während der **Entwicklung**, aber Sie sollten sie **nicht** in der **Produktion** verwenden.
///
## Hypercorn mit Trio ## Hypercorn mit Trio
Starlette und **FastAPI** basieren auf <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a>, welches diese sowohl mit der Python-Standardbibliothek <a href="https://docs.python.org/3/library/asyncio-task.html" class="external-link" target="_blank">asyncio</a>, als auch mit <a href="https://trio.readthedocs.io/en/stable/" class="external-link" target="_blank">Trio</a> kompatibel macht. Starlette und **FastAPI** basieren auf <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a>, welches diese sowohl mit der Python-Standardbibliothek <a href="https://docs.python.org/3/library/asyncio-task.html" class="external-link" target="_blank">asyncio</a>, als auch mit <a href="https://trio.readthedocs.io/en/stable/" class="external-link" target="_blank">Trio</a> kompatibel macht.

5
docs/de/docs/deployment/server-workers.md

@ -17,11 +17,14 @@ Wie Sie im vorherigen Kapitel über [Deployment-Konzepte](concepts.md){.internal
Hier zeige ich Ihnen, wie Sie <a href="https://gunicorn.org/" class="external-link" target="_blank">**Gunicorn**</a> mit **Uvicorn Workerprozessen** verwenden. Hier zeige ich Ihnen, wie Sie <a href="https://gunicorn.org/" class="external-link" target="_blank">**Gunicorn**</a> mit **Uvicorn Workerprozessen** verwenden.
!!! info /// info
Wenn Sie Container verwenden, beispielsweise mit Docker oder Kubernetes, erzähle ich Ihnen mehr darüber im nächsten Kapitel: [FastAPI in Containern – Docker](docker.md){.internal-link target=_blank}. Wenn Sie Container verwenden, beispielsweise mit Docker oder Kubernetes, erzähle ich Ihnen mehr darüber im nächsten Kapitel: [FastAPI in Containern – Docker](docker.md){.internal-link target=_blank}.
Insbesondere wenn die Anwendung auf **Kubernetes** läuft, werden Sie Gunicorn wahrscheinlich **nicht** verwenden wollen und stattdessen **einen einzelnen Uvicorn-Prozess pro Container** ausführen wollen, aber ich werde Ihnen später in diesem Kapitel mehr darüber erzählen. Insbesondere wenn die Anwendung auf **Kubernetes** läuft, werden Sie Gunicorn wahrscheinlich **nicht** verwenden wollen und stattdessen **einen einzelnen Uvicorn-Prozess pro Container** ausführen wollen, aber ich werde Ihnen später in diesem Kapitel mehr darüber erzählen.
///
## Gunicorn mit Uvicorn-Workern ## Gunicorn mit Uvicorn-Workern
**Gunicorn** ist hauptsächlich ein Anwendungsserver, der den **WSGI-Standard** verwendet. Das bedeutet, dass Gunicorn Anwendungen wie Flask und Django ausliefern kann. Gunicorn selbst ist nicht mit **FastAPI** kompatibel, da FastAPI den neuesten **<a href="https://asgi.readthedocs.io/en/latest/" class="external-link" target="_blank">ASGI-Standard</a>** verwendet. **Gunicorn** ist hauptsächlich ein Anwendungsserver, der den **WSGI-Standard** verwendet. Das bedeutet, dass Gunicorn Anwendungen wie Flask und Django ausliefern kann. Gunicorn selbst ist nicht mit **FastAPI** kompatibel, da FastAPI den neuesten **<a href="https://asgi.readthedocs.io/en/latest/" class="external-link" target="_blank">ASGI-Standard</a>** verwendet.

10
docs/de/docs/deployment/versions.md

@ -42,9 +42,12 @@ Gemäß den Konventionen zur semantischen Versionierung könnte jede Version unt
FastAPI folgt auch der Konvention, dass jede „PATCH“-Versionsänderung für Bugfixes und abwärtskompatible Änderungen gedacht ist. FastAPI folgt auch der Konvention, dass jede „PATCH“-Versionsänderung für Bugfixes und abwärtskompatible Änderungen gedacht ist.
!!! tip "Tipp" /// tip | "Tipp"
Der „PATCH“ ist die letzte Zahl, zum Beispiel ist in `0.2.3` die PATCH-Version `3`. Der „PATCH“ ist die letzte Zahl, zum Beispiel ist in `0.2.3` die PATCH-Version `3`.
///
Sie sollten also in der Lage sein, eine Version wie folgt anzupinnen: Sie sollten also in der Lage sein, eine Version wie folgt anzupinnen:
```txt ```txt
@ -53,9 +56,12 @@ fastapi>=0.45.0,<0.46.0
Nicht abwärtskompatible Änderungen und neue Funktionen werden in „MINOR“-Versionen hinzugefügt. Nicht abwärtskompatible Änderungen und neue Funktionen werden in „MINOR“-Versionen hinzugefügt.
!!! tip "Tipp" /// tip | "Tipp"
„MINOR“ ist die Zahl in der Mitte, zum Beispiel ist in `0.2.3` die MINOR-Version `2`. „MINOR“ ist die Zahl in der Mitte, zum Beispiel ist in `0.2.3` die MINOR-Version `2`.
///
## Upgrade der FastAPI-Versionen ## Upgrade der FastAPI-Versionen
Sie sollten Tests für Ihre Anwendung hinzufügen. Sie sollten Tests für Ihre Anwendung hinzufügen.

36
docs/de/docs/external-links.md

@ -1,36 +0,0 @@
# Externe Links und Artikel
**FastAPI** hat eine großartige Community, die ständig wächst.
Es gibt viele Beiträge, Artikel, Tools und Projekte zum Thema **FastAPI**.
Hier ist eine unvollständige Liste einiger davon.
!!! tip "Tipp"
Wenn Sie einen Artikel, ein Projekt, ein Tool oder irgendetwas im Zusammenhang mit **FastAPI** haben, was hier noch nicht aufgeführt ist, erstellen Sie einen <a href="https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml" class="external-link" target="_blank">Pull Request und fügen Sie es hinzu</a>.
!!! note "Hinweis Deutsche Übersetzung"
Die folgenden Überschriften und Links werden aus einer <a href="https://github.com/fastapi/fastapi/blob/master/docs/en/data/external_links.yml" class="external-link" target="_blank">anderen Datei</a> gelesen und sind daher nicht ins Deutsche übersetzt.
{% for section_name, section_content in external_links.items() %}
## {{ section_name }}
{% for lang_name, lang_content in section_content.items() %}
### {{ lang_name }}
{% for item in lang_content %}
* <a href="{{ item.link }}" class="external-link" target="_blank">{{ item.title }}</a> by <a href="{{ item.author_link }}" class="external-link" target="_blank">{{ item.author }}</a>.
{% endfor %}
{% endfor %}
{% endfor %}
## Projekte
Die neuesten GitHub-Projekte zum Thema `fastapi`:
<div class="github-topic-projects">
</div>

176
docs/de/docs/fastapi-people.md

@ -1,176 +0,0 @@
---
hide:
- navigation
---
# FastAPI Leute
FastAPI hat eine großartige Gemeinschaft, die Menschen mit unterschiedlichstem Hintergrund willkommen heißt.
## Erfinder - Betreuer
Hey! 👋
Das bin ich:
{% if people %}
<div class="user-list user-list-center">
{% for user in people.maintainers %}
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Answers: {{ user.answers }}</div><div class="count">Pull Requests: {{ user.prs }}</div></div>
{% endfor %}
</div>
{% endif %}
Ich bin der Erfinder und Betreuer von **FastAPI**. Sie können mehr darüber in [FastAPI helfen – Hilfe erhalten – Mit dem Autor vernetzen](help-fastapi.md#mit-dem-autor-vernetzen){.internal-link target=_blank} erfahren.
... Aber hier möchte ich Ihnen die Gemeinschaft vorstellen.
---
**FastAPI** erhält eine Menge Unterstützung aus der Gemeinschaft. Und ich möchte ihre Beiträge hervorheben.
Das sind die Menschen, die:
* [Anderen bei Fragen auf GitHub helfen](help-fastapi.md#anderen-bei-fragen-auf-github-helfen){.internal-link target=_blank}.
* [<abbr title='Pull Request – „Zieh-Anfrage“: Geänderten Quellcode senden, mit dem Vorschlag, ihn mit dem aktuellen Quellcode zu verschmelzen'>Pull Requests</abbr> erstellen](help-fastapi.md#einen-pull-request-erstellen){.internal-link target=_blank}.
* Pull Requests überprüfen (Review), [besonders wichtig für Übersetzungen](contributing.md#ubersetzungen){.internal-link target=_blank}.
Eine Runde Applaus für sie. 👏 🙇
## Aktivste Benutzer im letzten Monat
Hier die Benutzer, die im letzten Monat am meisten [anderen mit Fragen auf Github](help-fastapi.md#anderen-bei-fragen-auf-github-helfen){.internal-link target=_blank} geholfen haben. ☕
{% if people %}
<div class="user-list user-list-center">
{% for user in people.last_month_active %}
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Fragen beantwortet: {{ user.count }}</div></div>
{% endfor %}
</div>
{% endif %}
## Experten
Hier die **FastAPI-Experten**. 🤓
Das sind die Benutzer, die *insgesamt* [anderen am meisten mit Fragen auf GitHub geholfen haben](help-fastapi.md#anderen-bei-fragen-auf-github-helfen){.internal-link target=_blank}.
Sie haben bewiesen, dass sie Experten sind, weil sie vielen anderen geholfen haben. ✨
{% if people %}
<div class="user-list user-list-center">
{% for user in people.experts %}
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Fragen beantwortet: {{ user.count }}</div></div>
{% endfor %}
</div>
{% endif %}
## Top-Mitwirkende
Hier sind die **Top-Mitwirkenden**. 👷
Diese Benutzer haben [die meisten Pull Requests erstellt](help-fastapi.md#einen-pull-request-erstellen){.internal-link target=_blank} welche *<abbr title="Mergen – Zusammenführen: Unterschiedliche Versionen eines Quellcodes zusammenführen">gemerged</abbr>* wurden.
Sie haben Quellcode, Dokumentation, Übersetzungen, usw. beigesteuert. 📦
{% if people %}
<div class="user-list user-list-center">
{% for user in people.top_contributors %}
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Pull Requests: {{ user.count }}</div></div>
{% endfor %}
</div>
{% endif %}
Es gibt viele andere Mitwirkende (mehr als hundert), Sie können sie alle auf der <a href="https://github.com/fastapi/fastapi/graphs/contributors" class="external-link" target="_blank">FastAPI GitHub Contributors-Seite</a> sehen. 👷
## Top-Rezensenten
Diese Benutzer sind die **Top-Rezensenten**. 🕵️
### Rezensionen für Übersetzungen
Ich spreche nur ein paar Sprachen (und nicht sehr gut 😅). Daher bestätigen Reviewer [**Übersetzungen der Dokumentation**](contributing.md#ubersetzungen){.internal-link target=_blank}. Ohne sie gäbe es keine Dokumentation in mehreren anderen Sprachen.
---
Die **Top-Reviewer** 🕵️ haben die meisten Pull Requests von anderen überprüft und stellen die Qualität des Codes, der Dokumentation und insbesondere der **Übersetzungen** sicher.
{% if people %}
<div class="user-list user-list-center">
{% for user in people.top_reviewers %}
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Reviews: {{ user.count }}</div></div>
{% endfor %}
</div>
{% endif %}
## Sponsoren
Dies sind die **Sponsoren**. 😎
Sie unterstützen meine Arbeit an **FastAPI** (und andere), hauptsächlich durch <a href="https://github.com/sponsors/tiangolo" class="external-link" target="_blank">GitHub-Sponsoren</a>.
### Gold Sponsoren
{% if sponsors %}
{% for sponsor in sponsors.gold -%}
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}"></a>
{% endfor %}
{% endif %}
### Silber Sponsoren
{% if sponsors %}
{% for sponsor in sponsors.silver -%}
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}"></a>
{% endfor %}
{% endif %}
{% if people %}
{% if people.sponsors_50 %}
### Bronze Sponsoren
<div class="user-list user-list-center">
{% for user in people.sponsors_50 %}
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a></div>
{% endfor %}
</div>
{% endif %}
{% endif %}
### Individuelle Sponsoren
{% if people %}
<div class="user-list user-list-center">
{% for user in people.sponsors %}
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a></div>
{% endfor %}
</div>
{% endif %}
## Über diese Daten - technische Details
Der Hauptzweck dieser Seite ist es zu zeigen, wie die Gemeinschaft anderen hilft.
Das beinhaltet auch Hilfe, die normalerweise weniger sichtbar und in vielen Fällen mühsamer ist, wie, anderen bei Problemen zu helfen und Pull Requests mit Übersetzungen zu überprüfen.
Diese Daten werden jeden Monat berechnet, Sie können den <a href="https://github.com/fastapi/fastapi/blob/master/.github/actions/people/app/main.py" class="external-link" target="_blank">Quellcode hier lesen</a>.
Hier weise ich auch auf Beiträge von Sponsoren hin.
Ich behalte mir auch das Recht vor, den Algorithmus, die Abschnitte, die Schwellenwerte usw. zu aktualisieren (nur für den Fall 🤷).

7
docs/de/docs/features.md

@ -6,7 +6,7 @@
### Basiert auf offenen Standards ### Basiert auf offenen Standards
* <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank"><strong>OpenAPI</strong></a> für die Erstellung von APIs, inklusive Deklarationen von <abbr title="auch genannt Endpunkte, Routen">Pfad</abbr>-<abbr title="gemeint sind HTTP-Methoden wie POST, GET, PUT, DELETE">Operationen</abbr>, Parametern, Body-Anfragen, Sicherheit, usw. * <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank"><strong>OpenAPI</strong></a> für die Erstellung von APIs, inklusive Deklarationen von <abbr title="auch genannt Endpunkte, Routen">Pfad</abbr>-<abbr title="gemeint sind HTTP-Methoden wie POST, GET, PUT, DELETE">Operationen</abbr>, Parametern, Requestbodys, Sicherheit, usw.
* Automatische Dokumentation der Datenmodelle mit <a href="https://json-schema.org/" class="external-link" target="_blank"><strong>JSON Schema</strong></a> (da OpenAPI selbst auf JSON Schema basiert). * Automatische Dokumentation der Datenmodelle mit <a href="https://json-schema.org/" class="external-link" target="_blank"><strong>JSON Schema</strong></a> (da OpenAPI selbst auf JSON Schema basiert).
* Um diese Standards herum entworfen, nach sorgfältigem Studium. Statt einer nachträglichen Schicht darüber. * Um diese Standards herum entworfen, nach sorgfältigem Studium. Statt einer nachträglichen Schicht darüber.
* Dies ermöglicht auch automatische **Client-Code-Generierung** in vielen Sprachen. * Dies ermöglicht auch automatische **Client-Code-Generierung** in vielen Sprachen.
@ -64,11 +64,14 @@ second_user_data = {
my_second_user: User = User(**second_user_data) my_second_user: User = User(**second_user_data)
``` ```
!!! info /// info
`**second_user_data` bedeutet: `**second_user_data` bedeutet:
Nimm die Schlüssel-Wert-Paare des `second_user_data` <abbr title="Dictionary – Wörterbuch: In anderen Programmiersprachen auch Hash, Map, Objekt, Assoziatives Array genannt">Dicts</abbr> und übergib sie direkt als Schlüsselwort-Argumente. Äquivalent zu: `User(id=4, name="Mary", joined="2018-11-30")`. Nimm die Schlüssel-Wert-Paare des `second_user_data` <abbr title="Dictionary – Wörterbuch: In anderen Programmiersprachen auch Hash, Map, Objekt, Assoziatives Array genannt">Dicts</abbr> und übergib sie direkt als Schlüsselwort-Argumente. Äquivalent zu: `User(id=4, name="Mary", joined="2018-11-30")`.
///
### Editor Unterstützung ### Editor Unterstützung
Das ganze Framework wurde so entworfen, dass es einfach und intuitiv zu benutzen ist; alle Entscheidungen wurden auf mehreren Editoren getestet, sogar vor der Implementierung, um die bestmögliche Entwicklererfahrung zu gewährleisten. Das ganze Framework wurde so entworfen, dass es einfach und intuitiv zu benutzen ist; alle Entscheidungen wurden auf mehreren Editoren getestet, sogar vor der Implementierung, um die bestmögliche Entwicklererfahrung zu gewährleisten.

10
docs/de/docs/help-fastapi.md

@ -169,13 +169,16 @@ Und wenn es irgendeinen anderen Stil- oder Konsistenz-Bedarf gibt, bitte ich dir
* Schreiben Sie dann einen **Kommentar** und berichten, dass Sie das getan haben. So weiß ich, dass Sie ihn wirklich überprüft haben. * Schreiben Sie dann einen **Kommentar** und berichten, dass Sie das getan haben. So weiß ich, dass Sie ihn wirklich überprüft haben.
!!! info /// info
Leider kann ich PRs, nur weil sie von Mehreren gutgeheißen wurden, nicht einfach vertrauen. Leider kann ich PRs, nur weil sie von Mehreren gutgeheißen wurden, nicht einfach vertrauen.
Es ist mehrmals passiert, dass es PRs mit drei, fünf oder mehr Zustimmungen gibt, wahrscheinlich weil die Beschreibung ansprechend ist, aber wenn ich die PRs überprüfe, sind sie tatsächlich fehlerhaft, haben einen Bug, oder lösen das Problem nicht, welches sie behaupten, zu lösen. 😅 Es ist mehrmals passiert, dass es PRs mit drei, fünf oder mehr Zustimmungen gibt, wahrscheinlich weil die Beschreibung ansprechend ist, aber wenn ich die PRs überprüfe, sind sie tatsächlich fehlerhaft, haben einen Bug, oder lösen das Problem nicht, welches sie behaupten, zu lösen. 😅
Daher ist es wirklich wichtig, dass Sie den Code tatsächlich lesen und ausführen und mir in den Kommentaren mitteilen, dass Sie dies getan haben. 🤓 Daher ist es wirklich wichtig, dass Sie den Code tatsächlich lesen und ausführen und mir in den Kommentaren mitteilen, dass Sie dies getan haben. 🤓
///
* Wenn der PR irgendwie vereinfacht werden kann, fragen Sie ruhig danach, aber seien Sie nicht zu wählerisch, es gibt viele subjektive Standpunkte (und ich habe auch meinen eigenen 🙈), also ist es besser, wenn man sich auf die wesentlichen Dinge konzentriert. * Wenn der PR irgendwie vereinfacht werden kann, fragen Sie ruhig danach, aber seien Sie nicht zu wählerisch, es gibt viele subjektive Standpunkte (und ich habe auch meinen eigenen 🙈), also ist es besser, wenn man sich auf die wesentlichen Dinge konzentriert.
### Tests ### Tests
@ -225,11 +228,14 @@ Wenn Sie mir dabei helfen können, **helfen Sie mir, FastAPI am Laufen zu erhalt
Treten Sie dem 👥 <a href="https://discord.gg/VQjSZaeJmf" class="external-link" target="_blank">Discord-Chatserver</a> 👥 bei und treffen Sie sich mit anderen Mitgliedern der FastAPI-Community. Treten Sie dem 👥 <a href="https://discord.gg/VQjSZaeJmf" class="external-link" target="_blank">Discord-Chatserver</a> 👥 bei und treffen Sie sich mit anderen Mitgliedern der FastAPI-Community.
!!! tip "Tipp" /// tip | "Tipp"
Wenn Sie Fragen haben, stellen Sie sie bei <a href="https://github.com/fastapi/fastapi/discussions/new?category=questions" class="external-link" target="_blank">GitHub Diskussionen</a>, es besteht eine viel bessere Chance, dass Sie hier Hilfe von den [FastAPI-Experten](fastapi-people.md#experten){.internal-link target=_blank} erhalten. Wenn Sie Fragen haben, stellen Sie sie bei <a href="https://github.com/fastapi/fastapi/discussions/new?category=questions" class="external-link" target="_blank">GitHub Diskussionen</a>, es besteht eine viel bessere Chance, dass Sie hier Hilfe von den [FastAPI-Experten](fastapi-people.md#experten){.internal-link target=_blank} erhalten.
Nutzen Sie den Chat nur für andere allgemeine Gespräche. Nutzen Sie den Chat nur für andere allgemeine Gespräche.
///
### Den Chat nicht für Fragen verwenden ### Den Chat nicht für Fragen verwenden
Bedenken Sie, da Chats mehr „freie Konversation“ ermöglichen, dass es verlockend ist, Fragen zu stellen, die zu allgemein und schwierig zu beantworten sind, sodass Sie möglicherweise keine Antworten erhalten. Bedenken Sie, da Chats mehr „freie Konversation“ ermöglichen, dass es verlockend ist, Fragen zu stellen, die zu allgemein und schwierig zu beantworten sind, sodass Sie möglicherweise keine Antworten erhalten.

2
docs/de/docs/how-to/conditional-openapi.md

@ -30,7 +30,7 @@ Sie können problemlos dieselben Pydantic-Einstellungen verwenden, um Ihre gener
Zum Beispiel: Zum Beispiel:
```Python hl_lines="6 11" ```Python hl_lines="6 11"
{!../../../docs_src/conditional_openapi/tutorial001.py!} {!../../docs_src/conditional_openapi/tutorial001.py!}
``` ```
Hier deklarieren wir die Einstellung `openapi_url` mit dem gleichen Defaultwert `"/openapi.json"`. Hier deklarieren wir die Einstellung `openapi_url` mit dem gleichen Defaultwert `"/openapi.json"`.

12
docs/de/docs/how-to/configure-swagger-ui.md

@ -1,6 +1,6 @@
# Swagger-Oberfläche konfigurieren # Swagger-Oberfläche konfigurieren
Sie können einige zusätzliche <a href="https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration" class="external-link" target="_blank">Parameter der Swagger-Oberfläche</a> konfigurieren. Sie können einige zusätzliche <a href="https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/" class="external-link" target="_blank">Parameter der Swagger-Oberfläche</a> konfigurieren.
Um diese zu konfigurieren, übergeben Sie das Argument `swagger_ui_parameters` beim Erstellen des `FastAPI()`-App-Objekts oder an die Funktion `get_swagger_ui_html()`. Um diese zu konfigurieren, übergeben Sie das Argument `swagger_ui_parameters` beim Erstellen des `FastAPI()`-App-Objekts oder an die Funktion `get_swagger_ui_html()`.
@ -19,7 +19,7 @@ Ohne Änderung der Einstellungen ist die Syntaxhervorhebung standardmäßig akti
Sie können sie jedoch deaktivieren, indem Sie `syntaxHighlight` auf `False` setzen: Sie können sie jedoch deaktivieren, indem Sie `syntaxHighlight` auf `False` setzen:
```Python hl_lines="3" ```Python hl_lines="3"
{!../../../docs_src/configure_swagger_ui/tutorial001.py!} {!../../docs_src/configure_swagger_ui/tutorial001.py!}
``` ```
... und dann zeigt die Swagger-Oberfläche die Syntaxhervorhebung nicht mehr an: ... und dann zeigt die Swagger-Oberfläche die Syntaxhervorhebung nicht mehr an:
@ -31,7 +31,7 @@ Sie können sie jedoch deaktivieren, indem Sie `syntaxHighlight` auf `False` set
Auf die gleiche Weise könnten Sie das Theme der Syntaxhervorhebung mit dem Schlüssel `syntaxHighlight.theme` festlegen (beachten Sie, dass er einen Punkt in der Mitte hat): Auf die gleiche Weise könnten Sie das Theme der Syntaxhervorhebung mit dem Schlüssel `syntaxHighlight.theme` festlegen (beachten Sie, dass er einen Punkt in der Mitte hat):
```Python hl_lines="3" ```Python hl_lines="3"
{!../../../docs_src/configure_swagger_ui/tutorial002.py!} {!../../docs_src/configure_swagger_ui/tutorial002.py!}
``` ```
Obige Konfiguration würde das Theme für die Farbe der Syntaxhervorhebung ändern: Obige Konfiguration würde das Theme für die Farbe der Syntaxhervorhebung ändern:
@ -45,7 +45,7 @@ FastAPI enthält einige Defaultkonfigurationsparameter, die für die meisten Anw
Es umfasst die folgenden Defaultkonfigurationen: Es umfasst die folgenden Defaultkonfigurationen:
```Python ```Python
{!../../../fastapi/openapi/docs.py[ln:7-23]!} {!../../fastapi/openapi/docs.py[ln:7-23]!}
``` ```
Sie können jede davon überschreiben, indem Sie im Argument `swagger_ui_parameters` einen anderen Wert festlegen. Sie können jede davon überschreiben, indem Sie im Argument `swagger_ui_parameters` einen anderen Wert festlegen.
@ -53,12 +53,12 @@ Sie können jede davon überschreiben, indem Sie im Argument `swagger_ui_paramet
Um beispielsweise `deepLinking` zu deaktivieren, könnten Sie folgende Einstellungen an `swagger_ui_parameters` übergeben: Um beispielsweise `deepLinking` zu deaktivieren, könnten Sie folgende Einstellungen an `swagger_ui_parameters` übergeben:
```Python hl_lines="3" ```Python hl_lines="3"
{!../../../docs_src/configure_swagger_ui/tutorial003.py!} {!../../docs_src/configure_swagger_ui/tutorial003.py!}
``` ```
## Andere Parameter der Swagger-Oberfläche ## Andere Parameter der Swagger-Oberfläche
Um alle anderen möglichen Konfigurationen zu sehen, die Sie verwenden können, lesen Sie die offizielle <a href="https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration" class="external-link" target="_blank">Dokumentation für die Parameter der Swagger-Oberfläche</a>. Um alle anderen möglichen Konfigurationen zu sehen, die Sie verwenden können, lesen Sie die offizielle <a href="https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/" class="external-link" target="_blank">Dokumentation für die Parameter der Swagger-Oberfläche</a>.
## JavaScript-basierte Einstellungen ## JavaScript-basierte Einstellungen

24
docs/de/docs/how-to/custom-docs-ui-assets.md

@ -19,7 +19,7 @@ Der erste Schritt besteht darin, die automatischen Dokumentationen zu deaktivier
Um diese zu deaktivieren, setzen Sie deren URLs beim Erstellen Ihrer `FastAPI`-App auf `None`: Um diese zu deaktivieren, setzen Sie deren URLs beim Erstellen Ihrer `FastAPI`-App auf `None`:
```Python hl_lines="8" ```Python hl_lines="8"
{!../../../docs_src/custom_docs_ui/tutorial001.py!} {!../../docs_src/custom_docs_ui/tutorial001.py!}
``` ```
### Die benutzerdefinierten Dokumentationen hinzufügen ### Die benutzerdefinierten Dokumentationen hinzufügen
@ -37,22 +37,25 @@ Sie können die internen Funktionen von FastAPI wiederverwenden, um die HTML-Sei
Und genau so für ReDoc ... Und genau so für ReDoc ...
```Python hl_lines="2-6 11-19 22-24 27-33" ```Python hl_lines="2-6 11-19 22-24 27-33"
{!../../../docs_src/custom_docs_ui/tutorial001.py!} {!../../docs_src/custom_docs_ui/tutorial001.py!}
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Die *Pfadoperation* für `swagger_ui_redirect` ist ein Hilfsmittel bei der Verwendung von OAuth2. Die *Pfadoperation* für `swagger_ui_redirect` ist ein Hilfsmittel bei der Verwendung von OAuth2.
Wenn Sie Ihre API mit einem OAuth2-Anbieter integrieren, können Sie sich authentifizieren und mit den erworbenen Anmeldeinformationen zur API-Dokumentation zurückkehren. Und mit ihr interagieren, die echte OAuth2-Authentifizierung verwendend. Wenn Sie Ihre API mit einem OAuth2-Anbieter integrieren, können Sie sich authentifizieren und mit den erworbenen Anmeldeinformationen zur API-Dokumentation zurückkehren. Und mit ihr interagieren, die echte OAuth2-Authentifizierung verwendend.
Swagger UI erledigt das hinter den Kulissen für Sie, benötigt aber diesen „Umleitungs“-Helfer. Swagger UI erledigt das hinter den Kulissen für Sie, benötigt aber diesen „Umleitungs“-Helfer.
///
### Eine *Pfadoperation* erstellen, um es zu testen ### Eine *Pfadoperation* erstellen, um es zu testen
Um nun testen zu können, ob alles funktioniert, erstellen Sie eine *Pfadoperation*: Um nun testen zu können, ob alles funktioniert, erstellen Sie eine *Pfadoperation*:
```Python hl_lines="36-38" ```Python hl_lines="36-38"
{!../../../docs_src/custom_docs_ui/tutorial001.py!} {!../../docs_src/custom_docs_ui/tutorial001.py!}
``` ```
### Es ausprobieren ### Es ausprobieren
@ -122,7 +125,7 @@ Danach könnte Ihre Dateistruktur wie folgt aussehen:
* „Mounten“ Sie eine `StaticFiles()`-Instanz in einem bestimmten Pfad. * „Mounten“ Sie eine `StaticFiles()`-Instanz in einem bestimmten Pfad.
```Python hl_lines="7 11" ```Python hl_lines="7 11"
{!../../../docs_src/custom_docs_ui/tutorial002.py!} {!../../docs_src/custom_docs_ui/tutorial002.py!}
``` ```
### Die statischen Dateien testen ### Die statischen Dateien testen
@ -156,7 +159,7 @@ Wie bei der Verwendung eines benutzerdefinierten CDN besteht der erste Schritt d
Um diese zu deaktivieren, setzen Sie deren URLs beim Erstellen Ihrer `FastAPI`-App auf `None`: Um diese zu deaktivieren, setzen Sie deren URLs beim Erstellen Ihrer `FastAPI`-App auf `None`:
```Python hl_lines="9" ```Python hl_lines="9"
{!../../../docs_src/custom_docs_ui/tutorial002.py!} {!../../docs_src/custom_docs_ui/tutorial002.py!}
``` ```
### Die benutzerdefinierten Dokumentationen, mit statischen Dateien, hinzufügen ### Die benutzerdefinierten Dokumentationen, mit statischen Dateien, hinzufügen
@ -174,22 +177,25 @@ Auch hier können Sie die internen Funktionen von FastAPI wiederverwenden, um di
Und genau so für ReDoc ... Und genau so für ReDoc ...
```Python hl_lines="2-6 14-22 25-27 30-36" ```Python hl_lines="2-6 14-22 25-27 30-36"
{!../../../docs_src/custom_docs_ui/tutorial002.py!} {!../../docs_src/custom_docs_ui/tutorial002.py!}
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Die *Pfadoperation* für `swagger_ui_redirect` ist ein Hilfsmittel bei der Verwendung von OAuth2. Die *Pfadoperation* für `swagger_ui_redirect` ist ein Hilfsmittel bei der Verwendung von OAuth2.
Wenn Sie Ihre API mit einem OAuth2-Anbieter integrieren, können Sie sich authentifizieren und mit den erworbenen Anmeldeinformationen zur API-Dokumentation zurückkehren. Und mit ihr interagieren, die echte OAuth2-Authentifizierung verwendend. Wenn Sie Ihre API mit einem OAuth2-Anbieter integrieren, können Sie sich authentifizieren und mit den erworbenen Anmeldeinformationen zur API-Dokumentation zurückkehren. Und mit ihr interagieren, die echte OAuth2-Authentifizierung verwendend.
Swagger UI erledigt das hinter den Kulissen für Sie, benötigt aber diesen „Umleitungs“-Helfer. Swagger UI erledigt das hinter den Kulissen für Sie, benötigt aber diesen „Umleitungs“-Helfer.
///
### Eine *Pfadoperation* erstellen, um statische Dateien zu testen ### Eine *Pfadoperation* erstellen, um statische Dateien zu testen
Um nun testen zu können, ob alles funktioniert, erstellen Sie eine *Pfadoperation*: Um nun testen zu können, ob alles funktioniert, erstellen Sie eine *Pfadoperation*:
```Python hl_lines="39-41" ```Python hl_lines="39-41"
{!../../../docs_src/custom_docs_ui/tutorial002.py!} {!../../docs_src/custom_docs_ui/tutorial002.py!}
``` ```
### Benutzeroberfläche, mit statischen Dateien, testen ### Benutzeroberfläche, mit statischen Dateien, testen

32
docs/de/docs/how-to/custom-request-and-route.md

@ -6,11 +6,14 @@ Das kann insbesondere eine gute Alternative zur Logik in einer Middleware sein.
Wenn Sie beispielsweise den Requestbody lesen oder manipulieren möchten, bevor er von Ihrer Anwendung verarbeitet wird. Wenn Sie beispielsweise den Requestbody lesen oder manipulieren möchten, bevor er von Ihrer Anwendung verarbeitet wird.
!!! danger "Gefahr" /// danger | "Gefahr"
Dies ist eine „fortgeschrittene“ Funktion. Dies ist eine „fortgeschrittene“ Funktion.
Wenn Sie gerade erst mit **FastAPI** beginnen, möchten Sie diesen Abschnitt vielleicht überspringen. Wenn Sie gerade erst mit **FastAPI** beginnen, möchten Sie diesen Abschnitt vielleicht überspringen.
///
## Anwendungsfälle ## Anwendungsfälle
Einige Anwendungsfälle sind: Einige Anwendungsfälle sind:
@ -27,9 +30,12 @@ Und eine `APIRoute`-Unterklasse zur Verwendung dieser benutzerdefinierten Reques
### Eine benutzerdefinierte `GzipRequest`-Klasse erstellen ### Eine benutzerdefinierte `GzipRequest`-Klasse erstellen
!!! tip "Tipp" /// tip | "Tipp"
Dies ist nur ein einfaches Beispiel, um zu demonstrieren, wie es funktioniert. Wenn Sie Gzip-Unterstützung benötigen, können Sie die bereitgestellte [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware){.internal-link target=_blank} verwenden. Dies ist nur ein einfaches Beispiel, um zu demonstrieren, wie es funktioniert. Wenn Sie Gzip-Unterstützung benötigen, können Sie die bereitgestellte [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware){.internal-link target=_blank} verwenden.
///
Zuerst erstellen wir eine `GzipRequest`-Klasse, welche die Methode `Request.body()` überschreibt, um den Body bei Vorhandensein eines entsprechenden Headers zu dekomprimieren. Zuerst erstellen wir eine `GzipRequest`-Klasse, welche die Methode `Request.body()` überschreibt, um den Body bei Vorhandensein eines entsprechenden Headers zu dekomprimieren.
Wenn der Header kein `gzip` enthält, wird nicht versucht, den Body zu dekomprimieren. Wenn der Header kein `gzip` enthält, wird nicht versucht, den Body zu dekomprimieren.
@ -37,7 +43,7 @@ Wenn der Header kein `gzip` enthält, wird nicht versucht, den Body zu dekomprim
Auf diese Weise kann dieselbe Routenklasse gzip-komprimierte oder unkomprimierte Requests verarbeiten. Auf diese Weise kann dieselbe Routenklasse gzip-komprimierte oder unkomprimierte Requests verarbeiten.
```Python hl_lines="8-15" ```Python hl_lines="8-15"
{!../../../docs_src/custom_request_and_route/tutorial001.py!} {!../../docs_src/custom_request_and_route/tutorial001.py!}
``` ```
### Eine benutzerdefinierte `GzipRoute`-Klasse erstellen ### Eine benutzerdefinierte `GzipRoute`-Klasse erstellen
@ -51,10 +57,11 @@ Diese Methode gibt eine Funktion zurück. Und diese Funktion empfängt einen Req
Hier verwenden wir sie, um aus dem ursprünglichen Request einen `GzipRequest` zu erstellen. Hier verwenden wir sie, um aus dem ursprünglichen Request einen `GzipRequest` zu erstellen.
```Python hl_lines="18-26" ```Python hl_lines="18-26"
{!../../../docs_src/custom_request_and_route/tutorial001.py!} {!../../docs_src/custom_request_and_route/tutorial001.py!}
``` ```
!!! note "Technische Details" /// note | "Technische Details"
Ein `Request` hat ein `request.scope`-Attribut, welches einfach ein Python-`dict` ist, welches die mit dem Request verbundenen Metadaten enthält. Ein `Request` hat ein `request.scope`-Attribut, welches einfach ein Python-`dict` ist, welches die mit dem Request verbundenen Metadaten enthält.
Ein `Request` hat auch ein `request.receive`, welches eine Funktion ist, die den Hauptteil des Requests empfängt. Ein `Request` hat auch ein `request.receive`, welches eine Funktion ist, die den Hauptteil des Requests empfängt.
@ -65,6 +72,8 @@ Hier verwenden wir sie, um aus dem ursprünglichen Request einen `GzipRequest` z
Um mehr über den `Request` zu erfahren, schauen Sie sich <a href="https://www.starlette.io/requests/" class="external-link" target="_blank">Starlettes Dokumentation zu Requests</a> an. Um mehr über den `Request` zu erfahren, schauen Sie sich <a href="https://www.starlette.io/requests/" class="external-link" target="_blank">Starlettes Dokumentation zu Requests</a> an.
///
Das Einzige, was die von `GzipRequest.get_route_handler` zurückgegebene Funktion anders macht, ist die Konvertierung von `Request` in ein `GzipRequest`. Das Einzige, was die von `GzipRequest.get_route_handler` zurückgegebene Funktion anders macht, ist die Konvertierung von `Request` in ein `GzipRequest`.
Dabei kümmert sich unser `GzipRequest` um die Dekomprimierung der Daten (falls erforderlich), bevor diese an unsere *Pfadoperationen* weitergegeben werden. Dabei kümmert sich unser `GzipRequest` um die Dekomprimierung der Daten (falls erforderlich), bevor diese an unsere *Pfadoperationen* weitergegeben werden.
@ -75,23 +84,26 @@ Aufgrund unserer Änderungen in `GzipRequest.body` wird der Requestbody jedoch b
## Zugriff auf den Requestbody in einem Exceptionhandler ## Zugriff auf den Requestbody in einem Exceptionhandler
!!! tip "Tipp" /// tip | "Tipp"
Um dasselbe Problem zu lösen, ist es wahrscheinlich viel einfacher, den `body` in einem benutzerdefinierten Handler für `RequestValidationError` zu verwenden ([Fehlerbehandlung](../tutorial/handling-errors.md#den-requestvalidationerror-body-verwenden){.internal-link target=_blank}). Um dasselbe Problem zu lösen, ist es wahrscheinlich viel einfacher, den `body` in einem benutzerdefinierten Handler für `RequestValidationError` zu verwenden ([Fehlerbehandlung](../tutorial/handling-errors.md#den-requestvalidationerror-body-verwenden){.internal-link target=_blank}).
Dieses Beispiel ist jedoch immer noch gültig und zeigt, wie mit den internen Komponenten interagiert wird. Dieses Beispiel ist jedoch immer noch gültig und zeigt, wie mit den internen Komponenten interagiert wird.
///
Wir können denselben Ansatz auch verwenden, um in einem Exceptionhandler auf den Requestbody zuzugreifen. Wir können denselben Ansatz auch verwenden, um in einem Exceptionhandler auf den Requestbody zuzugreifen.
Alles, was wir tun müssen, ist, den Request innerhalb eines `try`/`except`-Blocks zu handhaben: Alles, was wir tun müssen, ist, den Request innerhalb eines `try`/`except`-Blocks zu handhaben:
```Python hl_lines="13 15" ```Python hl_lines="13 15"
{!../../../docs_src/custom_request_and_route/tutorial002.py!} {!../../docs_src/custom_request_and_route/tutorial002.py!}
``` ```
Wenn eine Exception auftritt, befindet sich die `Request`-Instanz weiterhin im Gültigkeitsbereich, sodass wir den Requestbody lesen und bei der Fehlerbehandlung verwenden können: Wenn eine Exception auftritt, befindet sich die `Request`-Instanz weiterhin im Gültigkeitsbereich, sodass wir den Requestbody lesen und bei der Fehlerbehandlung verwenden können:
```Python hl_lines="16-18" ```Python hl_lines="16-18"
{!../../../docs_src/custom_request_and_route/tutorial002.py!} {!../../docs_src/custom_request_and_route/tutorial002.py!}
``` ```
## Benutzerdefinierte `APIRoute`-Klasse in einem Router ## Benutzerdefinierte `APIRoute`-Klasse in einem Router
@ -99,11 +111,11 @@ Wenn eine Exception auftritt, befindet sich die `Request`-Instanz weiterhin im G
Sie können auch den Parameter `route_class` eines `APIRouter` festlegen: Sie können auch den Parameter `route_class` eines `APIRouter` festlegen:
```Python hl_lines="26" ```Python hl_lines="26"
{!../../../docs_src/custom_request_and_route/tutorial003.py!} {!../../docs_src/custom_request_and_route/tutorial003.py!}
``` ```
In diesem Beispiel verwenden die *Pfadoperationen* unter dem `router` die benutzerdefinierte `TimedRoute`-Klasse und haben in der Response einen zusätzlichen `X-Response-Time`-Header mit der Zeit, die zum Generieren der Response benötigt wurde: In diesem Beispiel verwenden die *Pfadoperationen* unter dem `router` die benutzerdefinierte `TimedRoute`-Klasse und haben in der Response einen zusätzlichen `X-Response-Time`-Header mit der Zeit, die zum Generieren der Response benötigt wurde:
```Python hl_lines="13-20" ```Python hl_lines="13-20"
{!../../../docs_src/custom_request_and_route/tutorial003.py!} {!../../docs_src/custom_request_and_route/tutorial003.py!}
``` ```

15
docs/de/docs/how-to/extending-openapi.md

@ -27,9 +27,12 @@ Und diese Funktion `get_openapi()` erhält als Parameter:
* `description`: Die Beschreibung Ihrer API. Dies kann Markdown enthalten und wird in der Dokumentation angezeigt. * `description`: Die Beschreibung Ihrer API. Dies kann Markdown enthalten und wird in der Dokumentation angezeigt.
* `routes`: Eine Liste von Routen, dies sind alle registrierten *Pfadoperationen*. Sie stammen von `app.routes`. * `routes`: Eine Liste von Routen, dies sind alle registrierten *Pfadoperationen*. Sie stammen von `app.routes`.
!!! info /// info
Der Parameter `summary` ist in OpenAPI 3.1.0 und höher verfügbar und wird von FastAPI 0.99.0 und höher unterstützt. Der Parameter `summary` ist in OpenAPI 3.1.0 und höher verfügbar und wird von FastAPI 0.99.0 und höher unterstützt.
///
## Überschreiben der Standardeinstellungen ## Überschreiben der Standardeinstellungen
Mithilfe der oben genannten Informationen können Sie dieselbe Hilfsfunktion verwenden, um das OpenAPI-Schema zu generieren und jeden benötigten Teil zu überschreiben. Mithilfe der oben genannten Informationen können Sie dieselbe Hilfsfunktion verwenden, um das OpenAPI-Schema zu generieren und jeden benötigten Teil zu überschreiben.
@ -41,7 +44,7 @@ Fügen wir beispielsweise <a href="https://github.com/Rebilly/ReDoc/blob/master/
Schreiben Sie zunächst wie gewohnt Ihre ganze **FastAPI**-Anwendung: Schreiben Sie zunächst wie gewohnt Ihre ganze **FastAPI**-Anwendung:
```Python hl_lines="1 4 7-9" ```Python hl_lines="1 4 7-9"
{!../../../docs_src/extending_openapi/tutorial001.py!} {!../../docs_src/extending_openapi/tutorial001.py!}
``` ```
### Das OpenAPI-Schema generieren ### Das OpenAPI-Schema generieren
@ -49,7 +52,7 @@ Schreiben Sie zunächst wie gewohnt Ihre ganze **FastAPI**-Anwendung:
Verwenden Sie dann dieselbe Hilfsfunktion, um das OpenAPI-Schema innerhalb einer `custom_openapi()`-Funktion zu generieren: Verwenden Sie dann dieselbe Hilfsfunktion, um das OpenAPI-Schema innerhalb einer `custom_openapi()`-Funktion zu generieren:
```Python hl_lines="2 15-21" ```Python hl_lines="2 15-21"
{!../../../docs_src/extending_openapi/tutorial001.py!} {!../../docs_src/extending_openapi/tutorial001.py!}
``` ```
### Das OpenAPI-Schema ändern ### Das OpenAPI-Schema ändern
@ -57,7 +60,7 @@ Verwenden Sie dann dieselbe Hilfsfunktion, um das OpenAPI-Schema innerhalb einer
Jetzt können Sie die ReDoc-Erweiterung hinzufügen und dem `info`-„Objekt“ im OpenAPI-Schema ein benutzerdefiniertes `x-logo` hinzufügen: Jetzt können Sie die ReDoc-Erweiterung hinzufügen und dem `info`-„Objekt“ im OpenAPI-Schema ein benutzerdefiniertes `x-logo` hinzufügen:
```Python hl_lines="22-24" ```Python hl_lines="22-24"
{!../../../docs_src/extending_openapi/tutorial001.py!} {!../../docs_src/extending_openapi/tutorial001.py!}
``` ```
### Zwischenspeichern des OpenAPI-Schemas ### Zwischenspeichern des OpenAPI-Schemas
@ -69,7 +72,7 @@ Auf diese Weise muss Ihre Anwendung das Schema nicht jedes Mal generieren, wenn
Es wird nur einmal generiert und dann wird dasselbe zwischengespeicherte Schema für die nächsten Requests verwendet. Es wird nur einmal generiert und dann wird dasselbe zwischengespeicherte Schema für die nächsten Requests verwendet.
```Python hl_lines="13-14 25-26" ```Python hl_lines="13-14 25-26"
{!../../../docs_src/extending_openapi/tutorial001.py!} {!../../docs_src/extending_openapi/tutorial001.py!}
``` ```
### Die Methode überschreiben ### Die Methode überschreiben
@ -77,7 +80,7 @@ Es wird nur einmal generiert und dann wird dasselbe zwischengespeicherte Schema
Jetzt können Sie die Methode `.openapi()` durch Ihre neue Funktion ersetzen. Jetzt können Sie die Methode `.openapi()` durch Ihre neue Funktion ersetzen.
```Python hl_lines="29" ```Python hl_lines="29"
{!../../../docs_src/extending_openapi/tutorial001.py!} {!../../docs_src/extending_openapi/tutorial001.py!}
``` ```
### Testen ### Testen

12
docs/de/docs/how-to/graphql.md

@ -4,13 +4,16 @@ Da **FastAPI** auf dem **ASGI**-Standard basiert, ist es sehr einfach, jede **Gr
Sie können normale FastAPI-*Pfadoperationen* mit GraphQL in derselben Anwendung kombinieren. Sie können normale FastAPI-*Pfadoperationen* mit GraphQL in derselben Anwendung kombinieren.
!!! tip "Tipp" /// tip | "Tipp"
**GraphQL** löst einige sehr spezifische Anwendungsfälle. **GraphQL** löst einige sehr spezifische Anwendungsfälle.
Es hat **Vorteile** und **Nachteile** im Vergleich zu gängigen **Web-APIs**. Es hat **Vorteile** und **Nachteile** im Vergleich zu gängigen **Web-APIs**.
Wiegen Sie ab, ob die **Vorteile** für Ihren Anwendungsfall die **Nachteile** ausgleichen. 🤓 Wiegen Sie ab, ob die **Vorteile** für Ihren Anwendungsfall die **Nachteile** ausgleichen. 🤓
///
## GraphQL-Bibliotheken ## GraphQL-Bibliotheken
Hier sind einige der **GraphQL**-Bibliotheken, welche **ASGI** unterstützen. Diese könnten Sie mit **FastAPI** verwenden: Hier sind einige der **GraphQL**-Bibliotheken, welche **ASGI** unterstützen. Diese könnten Sie mit **FastAPI** verwenden:
@ -33,7 +36,7 @@ Abhängig von Ihrem Anwendungsfall bevorzugen Sie vielleicht eine andere Bibliot
Hier ist eine kleine Vorschau, wie Sie Strawberry mit FastAPI integrieren können: Hier ist eine kleine Vorschau, wie Sie Strawberry mit FastAPI integrieren können:
```Python hl_lines="3 22 25-26" ```Python hl_lines="3 22 25-26"
{!../../../docs_src/graphql/tutorial001.py!} {!../../docs_src/graphql/tutorial001.py!}
``` ```
Weitere Informationen zu Strawberry finden Sie in der <a href="https://strawberry.rocks/" class="external-link" target="_blank">Strawberry-Dokumentation</a>. Weitere Informationen zu Strawberry finden Sie in der <a href="https://strawberry.rocks/" class="external-link" target="_blank">Strawberry-Dokumentation</a>.
@ -46,9 +49,12 @@ Frühere Versionen von Starlette enthielten eine `GraphQLApp`-Klasse zur Integra
Das wurde von Starlette deprecated, aber wenn Sie Code haben, der das verwendet, können Sie einfach zu <a href="https://github.com/ciscorn/starlette-graphene3" class="external-link" target="_blank">starlette-graphene3</a> **migrieren**, welches denselben Anwendungsfall abdeckt und über eine **fast identische Schnittstelle** verfügt. Das wurde von Starlette deprecated, aber wenn Sie Code haben, der das verwendet, können Sie einfach zu <a href="https://github.com/ciscorn/starlette-graphene3" class="external-link" target="_blank">starlette-graphene3</a> **migrieren**, welches denselben Anwendungsfall abdeckt und über eine **fast identische Schnittstelle** verfügt.
!!! tip "Tipp" /// tip | "Tipp"
Wenn Sie GraphQL benötigen, würde ich Ihnen trotzdem empfehlen, sich <a href="https://strawberry.rocks/" class="external-link" target="_blank">Strawberry</a> anzuschauen, da es auf Typannotationen basiert, statt auf benutzerdefinierten Klassen und Typen. Wenn Sie GraphQL benötigen, würde ich Ihnen trotzdem empfehlen, sich <a href="https://strawberry.rocks/" class="external-link" target="_blank">Strawberry</a> anzuschauen, da es auf Typannotationen basiert, statt auf benutzerdefinierten Klassen und Typen.
///
## Mehr darüber lernen ## Mehr darüber lernen
Weitere Informationen zu **GraphQL** finden Sie in der <a href="https://graphql.org/" class="external-link" target="_blank">offiziellen GraphQL-Dokumentation</a>. Weitere Informationen zu **GraphQL** finden Sie in der <a href="https://graphql.org/" class="external-link" target="_blank">offiziellen GraphQL-Dokumentation</a>.

5
docs/de/docs/how-to/index.md

@ -6,5 +6,8 @@ Die meisten dieser Ideen sind mehr oder weniger **unabhängig**, und in den meis
Wenn etwas für Ihr Projekt interessant und nützlich erscheint, lesen Sie es, andernfalls überspringen Sie es einfach. Wenn etwas für Ihr Projekt interessant und nützlich erscheint, lesen Sie es, andernfalls überspringen Sie es einfach.
!!! tip "Tipp" /// tip | "Tipp"
Wenn Sie strukturiert **FastAPI lernen** möchten (empfohlen), lesen Sie stattdessen Kapitel für Kapitel das [Tutorial – Benutzerhandbuch](../tutorial/index.md){.internal-link target=_blank}. Wenn Sie strukturiert **FastAPI lernen** möchten (empfohlen), lesen Sie stattdessen Kapitel für Kapitel das [Tutorial – Benutzerhandbuch](../tutorial/index.md){.internal-link target=_blank}.
///

89
docs/de/docs/how-to/separate-openapi-schemas.md

@ -10,10 +10,10 @@ Sehen wir uns an, wie das funktioniert und wie Sie es bei Bedarf ändern können
Nehmen wir an, Sie haben ein Pydantic-Modell mit Defaultwerten wie dieses: Nehmen wir an, Sie haben ein Pydantic-Modell mit Defaultwerten wie dieses:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="7" ```Python hl_lines="7"
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py[ln:1-7]!} {!> ../../docs_src/separate_openapi_schemas/tutorial001_py310.py[ln:1-7]!}
# Code unterhalb weggelassen 👇 # Code unterhalb weggelassen 👇
``` ```
@ -22,15 +22,17 @@ Nehmen wir an, Sie haben ein Pydantic-Modell mit Defaultwerten wie dieses:
<summary>👀 Vollständige Dateivorschau</summary> <summary>👀 Vollständige Dateivorschau</summary>
```Python ```Python
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py!} {!> ../../docs_src/separate_openapi_schemas/tutorial001_py310.py!}
``` ```
</details> </details>
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="9" ```Python hl_lines="9"
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py[ln:1-9]!} {!> ../../docs_src/separate_openapi_schemas/tutorial001_py39.py[ln:1-9]!}
# Code unterhalb weggelassen 👇 # Code unterhalb weggelassen 👇
``` ```
@ -39,15 +41,17 @@ Nehmen wir an, Sie haben ein Pydantic-Modell mit Defaultwerten wie dieses:
<summary>👀 Vollständige Dateivorschau</summary> <summary>👀 Vollständige Dateivorschau</summary>
```Python ```Python
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py!} {!> ../../docs_src/separate_openapi_schemas/tutorial001_py39.py!}
``` ```
</details> </details>
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="9" ```Python hl_lines="9"
{!> ../../../docs_src/separate_openapi_schemas/tutorial001.py[ln:1-9]!} {!> ../../docs_src/separate_openapi_schemas/tutorial001.py[ln:1-9]!}
# Code unterhalb weggelassen 👇 # Code unterhalb weggelassen 👇
``` ```
@ -56,19 +60,21 @@ Nehmen wir an, Sie haben ein Pydantic-Modell mit Defaultwerten wie dieses:
<summary>👀 Vollständige Dateivorschau</summary> <summary>👀 Vollständige Dateivorschau</summary>
```Python ```Python
{!> ../../../docs_src/separate_openapi_schemas/tutorial001.py!} {!> ../../docs_src/separate_openapi_schemas/tutorial001.py!}
``` ```
</details> </details>
////
### Modell für Eingabe ### Modell für Eingabe
Wenn Sie dieses Modell wie hier als Eingabe verwenden: Wenn Sie dieses Modell wie hier als Eingabe verwenden:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="14" ```Python hl_lines="14"
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py[ln:1-15]!} {!> ../../docs_src/separate_openapi_schemas/tutorial001_py310.py[ln:1-15]!}
# Code unterhalb weggelassen 👇 # Code unterhalb weggelassen 👇
``` ```
@ -77,15 +83,17 @@ Wenn Sie dieses Modell wie hier als Eingabe verwenden:
<summary>👀 Vollständige Dateivorschau</summary> <summary>👀 Vollständige Dateivorschau</summary>
```Python ```Python
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py!} {!> ../../docs_src/separate_openapi_schemas/tutorial001_py310.py!}
``` ```
</details> </details>
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="16" ```Python hl_lines="16"
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py[ln:1-17]!} {!> ../../docs_src/separate_openapi_schemas/tutorial001_py39.py[ln:1-17]!}
# Code unterhalb weggelassen 👇 # Code unterhalb weggelassen 👇
``` ```
@ -94,15 +102,17 @@ Wenn Sie dieses Modell wie hier als Eingabe verwenden:
<summary>👀 Vollständige Dateivorschau</summary> <summary>👀 Vollständige Dateivorschau</summary>
```Python ```Python
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py!} {!> ../../docs_src/separate_openapi_schemas/tutorial001_py39.py!}
``` ```
</details> </details>
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="16" ```Python hl_lines="16"
{!> ../../../docs_src/separate_openapi_schemas/tutorial001.py[ln:1-17]!} {!> ../../docs_src/separate_openapi_schemas/tutorial001.py[ln:1-17]!}
# Code unterhalb weggelassen 👇 # Code unterhalb weggelassen 👇
``` ```
@ -111,11 +121,13 @@ Wenn Sie dieses Modell wie hier als Eingabe verwenden:
<summary>👀 Vollständige Dateivorschau</summary> <summary>👀 Vollständige Dateivorschau</summary>
```Python ```Python
{!> ../../../docs_src/separate_openapi_schemas/tutorial001.py!} {!> ../../docs_src/separate_openapi_schemas/tutorial001.py!}
``` ```
</details> </details>
////
... dann ist das Feld `description` **nicht erforderlich**. Weil es den Defaultwert `None` hat. ... dann ist das Feld `description` **nicht erforderlich**. Weil es den Defaultwert `None` hat.
### Eingabemodell in der Dokumentation ### Eingabemodell in der Dokumentation
@ -130,24 +142,30 @@ Sie können überprüfen, dass das Feld `description` in der Dokumentation kein
Wenn Sie jedoch dasselbe Modell als Ausgabe verwenden, wie hier: Wenn Sie jedoch dasselbe Modell als Ausgabe verwenden, wie hier:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="19" ```Python hl_lines="19"
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py!} {!> ../../docs_src/separate_openapi_schemas/tutorial001_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="21" ```Python hl_lines="21"
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py!} {!> ../../docs_src/separate_openapi_schemas/tutorial001_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="21" ```Python hl_lines="21"
{!> ../../../docs_src/separate_openapi_schemas/tutorial001.py!} {!> ../../docs_src/separate_openapi_schemas/tutorial001.py!}
``` ```
////
... dann, weil `description` einen Defaultwert hat, wird es, wenn Sie für dieses Feld **nichts zurückgeben**, immer noch diesen **Defaultwert** haben. ... dann, weil `description` einen Defaultwert hat, wird es, wenn Sie für dieses Feld **nichts zurückgeben**, immer noch diesen **Defaultwert** haben.
### Modell für Ausgabe-Responsedaten ### Modell für Ausgabe-Responsedaten
@ -199,27 +217,36 @@ Der Hauptanwendungsfall hierfür besteht wahrscheinlich darin, dass Sie das mal
In diesem Fall können Sie diese Funktion in **FastAPI** mit dem Parameter `separate_input_output_schemas=False` deaktivieren. In diesem Fall können Sie diese Funktion in **FastAPI** mit dem Parameter `separate_input_output_schemas=False` deaktivieren.
!!! info /// info
Unterstützung für `separate_input_output_schemas` wurde in FastAPI `0.102.0` hinzugefügt. 🤓 Unterstützung für `separate_input_output_schemas` wurde in FastAPI `0.102.0` hinzugefügt. 🤓
=== "Python 3.10+" ///
//// tab | Python 3.10+
```Python hl_lines="10" ```Python hl_lines="10"
{!> ../../../docs_src/separate_openapi_schemas/tutorial002_py310.py!} {!> ../../docs_src/separate_openapi_schemas/tutorial002_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="12" ```Python hl_lines="12"
{!> ../../../docs_src/separate_openapi_schemas/tutorial002_py39.py!} {!> ../../docs_src/separate_openapi_schemas/tutorial002_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="12" ```Python hl_lines="12"
{!> ../../../docs_src/separate_openapi_schemas/tutorial002.py!} {!> ../../docs_src/separate_openapi_schemas/tutorial002.py!}
``` ```
////
### Gleiches Schema für Eingabe- und Ausgabemodelle in der Dokumentation ### Gleiches Schema für Eingabe- und Ausgabemodelle in der Dokumentation
Und jetzt wird es ein einziges Schema für die Eingabe und Ausgabe des Modells geben, nur `Item`, und es wird `description` als **nicht erforderlich** kennzeichnen: Und jetzt wird es ein einziges Schema für die Eingabe und Ausgabe des Modells geben, nur `Item`, und es wird `description` als **nicht erforderlich** kennzeichnen:

2
docs/de/docs/index.md

@ -449,7 +449,7 @@ Um mehr darüber zu erfahren, siehe den Abschnitt <a href="https://fastapi.tiang
Wird von Pydantic verwendet: Wird von Pydantic verwendet:
* <a href="https://github.com/JoshData/python-email-validator" target="_blank"><code>email_validator</code></a> - für E-Mail-Validierung. * <a href="https://github.com/JoshData/python-email-validator" target="_blank"><code>email-validator</code></a> - für E-Mail-Validierung.
* <a href="https://docs.pydantic.dev/latest/usage/pydantic_settings/" target="_blank"><code>pydantic-settings</code></a> - für die Verwaltung von Einstellungen. * <a href="https://docs.pydantic.dev/latest/usage/pydantic_settings/" target="_blank"><code>pydantic-settings</code></a> - für die Verwaltung von Einstellungen.
* <a href="https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/" target="_blank"><code>pydantic-extra-types</code></a> - für zusätzliche Typen, mit Pydantic zu verwenden. * <a href="https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/" target="_blank"><code>pydantic-extra-types</code></a> - für zusätzliche Typen, mit Pydantic zu verwenden.

5
docs/de/docs/newsletter.md

@ -1,5 +0,0 @@
# FastAPI und Freunde Newsletter
<iframe data-w-type="embedded" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="https://xr4n4.mjt.lu/wgt/xr4n4/hj5/form?c=40a44fa4" width="100%" style="height: 0;"></iframe>
<script type="text/javascript" src="https://app.mailjet.com/pas-nc-embedded-v1.js"></script>

167
docs/de/docs/python-types.md

@ -12,15 +12,18 @@ Dies ist lediglich eine **schnelle Anleitung / Auffrischung** über Pythons Typh
Aber selbst wenn Sie **FastAPI** nie verwenden, wird es für Sie nützlich sein, ein wenig darüber zu lernen. Aber selbst wenn Sie **FastAPI** nie verwenden, wird es für Sie nützlich sein, ein wenig darüber zu lernen.
!!! note "Hinweis" /// note | "Hinweis"
Wenn Sie ein Python-Experte sind und bereits alles über Typhinweise wissen, überspringen Sie dieses Kapitel und fahren Sie mit dem nächsten fort. Wenn Sie ein Python-Experte sind und bereits alles über Typhinweise wissen, überspringen Sie dieses Kapitel und fahren Sie mit dem nächsten fort.
///
## Motivation ## Motivation
Fangen wir mit einem einfachen Beispiel an: Fangen wir mit einem einfachen Beispiel an:
```Python ```Python
{!../../../docs_src/python_types/tutorial001.py!} {!../../docs_src/python_types/tutorial001.py!}
``` ```
Dieses Programm gibt aus: Dieses Programm gibt aus:
@ -36,7 +39,7 @@ Die Funktion macht Folgendes:
* <abbr title="Füge zu einer Einheit zusammen, eins nach dem anderen.">Verkettet</abbr> sie mit einem Leerzeichen in der Mitte. * <abbr title="Füge zu einer Einheit zusammen, eins nach dem anderen.">Verkettet</abbr> sie mit einem Leerzeichen in der Mitte.
```Python hl_lines="2" ```Python hl_lines="2"
{!../../../docs_src/python_types/tutorial001.py!} {!../../docs_src/python_types/tutorial001.py!}
``` ```
### Bearbeiten Sie es ### Bearbeiten Sie es
@ -80,7 +83,7 @@ Das war's.
Das sind die „Typhinweise“: Das sind die „Typhinweise“:
```Python hl_lines="1" ```Python hl_lines="1"
{!../../../docs_src/python_types/tutorial002.py!} {!../../docs_src/python_types/tutorial002.py!}
``` ```
Das ist nicht das gleiche wie das Deklarieren von Defaultwerten, wie es hier der Fall ist: Das ist nicht das gleiche wie das Deklarieren von Defaultwerten, wie es hier der Fall ist:
@ -110,7 +113,7 @@ Hier können Sie durch die Optionen blättern, bis Sie diejenige finden, bei der
Sehen Sie sich diese Funktion an, sie hat bereits Typhinweise: Sehen Sie sich diese Funktion an, sie hat bereits Typhinweise:
```Python hl_lines="1" ```Python hl_lines="1"
{!../../../docs_src/python_types/tutorial003.py!} {!../../docs_src/python_types/tutorial003.py!}
``` ```
Da der Editor die Typen der Variablen kennt, erhalten Sie nicht nur Code-Vervollständigung, sondern auch eine Fehlerprüfung: Da der Editor die Typen der Variablen kennt, erhalten Sie nicht nur Code-Vervollständigung, sondern auch eine Fehlerprüfung:
@ -120,7 +123,7 @@ Da der Editor die Typen der Variablen kennt, erhalten Sie nicht nur Code-Vervoll
Jetzt, da Sie wissen, dass Sie das reparieren müssen, konvertieren Sie `age` mittels `str(age)` in einen String: Jetzt, da Sie wissen, dass Sie das reparieren müssen, konvertieren Sie `age` mittels `str(age)` in einen String:
```Python hl_lines="2" ```Python hl_lines="2"
{!../../../docs_src/python_types/tutorial004.py!} {!../../docs_src/python_types/tutorial004.py!}
``` ```
## Deklarieren von Typen ## Deklarieren von Typen
@ -141,7 +144,7 @@ Zum Beispiel diese:
* `bytes` * `bytes`
```Python hl_lines="1" ```Python hl_lines="1"
{!../../../docs_src/python_types/tutorial005.py!} {!../../docs_src/python_types/tutorial005.py!}
``` ```
### Generische Typen mit Typ-Parametern ### Generische Typen mit Typ-Parametern
@ -170,7 +173,7 @@ Wenn Sie über die **neueste Version von Python** verfügen, verwenden Sie die B
Definieren wir zum Beispiel eine Variable, die eine `list` von `str` – eine Liste von Strings – sein soll. Definieren wir zum Beispiel eine Variable, die eine `list` von `str` – eine Liste von Strings – sein soll.
=== "Python 3.9+" //// tab | Python 3.9+
Deklarieren Sie die Variable mit der gleichen Doppelpunkt-Syntax (`:`). Deklarieren Sie die Variable mit der gleichen Doppelpunkt-Syntax (`:`).
@ -179,15 +182,17 @@ Definieren wir zum Beispiel eine Variable, die eine `list` von `str` – eine Li
Da die Liste ein Typ ist, welcher innere Typen enthält, werden diese von eckigen Klammern umfasst: Da die Liste ein Typ ist, welcher innere Typen enthält, werden diese von eckigen Klammern umfasst:
```Python hl_lines="1" ```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial006_py39.py!} {!> ../../docs_src/python_types/tutorial006_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
Von `typing` importieren Sie `List` (mit Großbuchstaben `L`): Von `typing` importieren Sie `List` (mit Großbuchstaben `L`):
```Python hl_lines="1" ```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial006.py!} {!> ../../docs_src/python_types/tutorial006.py!}
``` ```
Deklarieren Sie die Variable mit der gleichen Doppelpunkt-Syntax (`:`). Deklarieren Sie die Variable mit der gleichen Doppelpunkt-Syntax (`:`).
@ -197,19 +202,27 @@ Definieren wir zum Beispiel eine Variable, die eine `list` von `str` – eine Li
Da die Liste ein Typ ist, welcher innere Typen enthält, werden diese von eckigen Klammern umfasst: Da die Liste ein Typ ist, welcher innere Typen enthält, werden diese von eckigen Klammern umfasst:
```Python hl_lines="4" ```Python hl_lines="4"
{!> ../../../docs_src/python_types/tutorial006.py!} {!> ../../docs_src/python_types/tutorial006.py!}
``` ```
!!! tip "Tipp" ////
/// tip | "Tipp"
Die inneren Typen in den eckigen Klammern werden als „Typ-Parameter“ bezeichnet. Die inneren Typen in den eckigen Klammern werden als „Typ-Parameter“ bezeichnet.
In diesem Fall ist `str` der Typ-Parameter, der an `List` übergeben wird (oder `list` in Python 3.9 und darüber). In diesem Fall ist `str` der Typ-Parameter, der an `List` übergeben wird (oder `list` in Python 3.9 und darüber).
///
Das bedeutet: Die Variable `items` ist eine Liste – `list` – und jedes der Elemente in dieser Liste ist ein String – `str`. Das bedeutet: Die Variable `items` ist eine Liste – `list` – und jedes der Elemente in dieser Liste ist ein String – `str`.
!!! tip "Tipp" /// tip | "Tipp"
Wenn Sie Python 3.9 oder höher verwenden, müssen Sie `List` nicht von `typing` importieren, Sie können stattdessen den regulären `list`-Typ verwenden. Wenn Sie Python 3.9 oder höher verwenden, müssen Sie `List` nicht von `typing` importieren, Sie können stattdessen den regulären `list`-Typ verwenden.
///
Auf diese Weise kann Ihr Editor Sie auch bei der Bearbeitung von Einträgen aus der Liste unterstützen: Auf diese Weise kann Ihr Editor Sie auch bei der Bearbeitung von Einträgen aus der Liste unterstützen:
<img src="/img/python-types/image05.png"> <img src="/img/python-types/image05.png">
@ -224,18 +237,22 @@ Und trotzdem weiß der Editor, dass es sich um ein `str` handelt, und bietet ent
Das Gleiche gilt für die Deklaration eines Tupels – `tuple` – und einer Menge – `set`: Das Gleiche gilt für die Deklaration eines Tupels – `tuple` – und einer Menge – `set`:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="1" ```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial007_py39.py!} {!> ../../docs_src/python_types/tutorial007_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial007.py!} {!> ../../docs_src/python_types/tutorial007.py!}
``` ```
////
Das bedeutet: Das bedeutet:
* Die Variable `items_t` ist ein `tuple` mit 3 Elementen, einem `int`, einem weiteren `int` und einem `str`. * Die Variable `items_t` ist ein `tuple` mit 3 Elementen, einem `int`, einem weiteren `int` und einem `str`.
@ -249,18 +266,22 @@ Der erste Typ-Parameter ist für die Schlüssel des `dict`.
Der zweite Typ-Parameter ist für die Werte des `dict`: Der zweite Typ-Parameter ist für die Werte des `dict`:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="1" ```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial008_py39.py!} {!> ../../docs_src/python_types/tutorial008_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial008.py!} {!> ../../docs_src/python_types/tutorial008.py!}
``` ```
////
Das bedeutet: Das bedeutet:
* Die Variable `prices` ist ein `dict`: * Die Variable `prices` ist ein `dict`:
@ -275,18 +296,22 @@ In Python 3.6 und höher (inklusive Python 3.10) können Sie den `Union`-Typ von
In Python 3.10 gibt es zusätzlich eine **neue Syntax**, die es erlaubt, die möglichen Typen getrennt von einem <abbr title='Allgemein: „oder“. In anderem Zusammenhang auch „Bitweises ODER“, aber letztere Bedeutung ist hier nicht relevant'>vertikalen Balken (`|`)</abbr> aufzulisten. In Python 3.10 gibt es zusätzlich eine **neue Syntax**, die es erlaubt, die möglichen Typen getrennt von einem <abbr title='Allgemein: „oder“. In anderem Zusammenhang auch „Bitweises ODER“, aber letztere Bedeutung ist hier nicht relevant'>vertikalen Balken (`|`)</abbr> aufzulisten.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="1" ```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial008b_py310.py!} {!> ../../docs_src/python_types/tutorial008b_py310.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial008b.py!} {!> ../../docs_src/python_types/tutorial008b.py!}
``` ```
////
In beiden Fällen bedeutet das, dass `item` ein `int` oder ein `str` sein kann. In beiden Fällen bedeutet das, dass `item` ein `int` oder ein `str` sein kann.
#### Vielleicht `None` #### Vielleicht `None`
@ -296,7 +321,7 @@ Sie können deklarieren, dass ein Wert ein `str`, aber vielleicht auch `None` se
In Python 3.6 und darüber (inklusive Python 3.10) können Sie das deklarieren, indem Sie `Optional` vom `typing` Modul importieren und verwenden. In Python 3.6 und darüber (inklusive Python 3.10) können Sie das deklarieren, indem Sie `Optional` vom `typing` Modul importieren und verwenden.
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!../../../docs_src/python_types/tutorial009.py!} {!../../docs_src/python_types/tutorial009.py!}
``` ```
Wenn Sie `Optional[str]` anstelle von nur `str` verwenden, wird Ihr Editor Ihnen dabei helfen, Fehler zu erkennen, bei denen Sie annehmen könnten, dass ein Wert immer eine String (`str`) ist, obwohl er auch `None` sein könnte. Wenn Sie `Optional[str]` anstelle von nur `str` verwenden, wird Ihr Editor Ihnen dabei helfen, Fehler zu erkennen, bei denen Sie annehmen könnten, dass ein Wert immer eine String (`str`) ist, obwohl er auch `None` sein könnte.
@ -305,24 +330,30 @@ Wenn Sie `Optional[str]` anstelle von nur `str` verwenden, wird Ihr Editor Ihnen
Das bedeutet auch, dass Sie in Python 3.10 `Something | None` verwenden können: Das bedeutet auch, dass Sie in Python 3.10 `Something | None` verwenden können:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="1" ```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial009_py310.py!} {!> ../../docs_src/python_types/tutorial009_py310.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial009.py!} {!> ../../docs_src/python_types/tutorial009.py!}
``` ```
=== "Python 3.8+ Alternative" ////
//// tab | Python 3.8+ Alternative
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial009b.py!} {!> ../../docs_src/python_types/tutorial009b.py!}
``` ```
////
#### `Union` oder `Optional` verwenden? #### `Union` oder `Optional` verwenden?
Wenn Sie eine Python-Version unterhalb 3.10 verwenden, hier ist mein sehr **subjektiver** Standpunkt dazu: Wenn Sie eine Python-Version unterhalb 3.10 verwenden, hier ist mein sehr **subjektiver** Standpunkt dazu:
@ -339,7 +370,7 @@ Es geht nur um Wörter und Namen. Aber diese Worte können beeinflussen, wie Sie
Nehmen wir zum Beispiel diese Funktion: Nehmen wir zum Beispiel diese Funktion:
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!../../../docs_src/python_types/tutorial009c.py!} {!../../docs_src/python_types/tutorial009c.py!}
``` ```
Der Parameter `name` ist definiert als `Optional[str]`, aber er ist **nicht optional**, Sie können die Funktion nicht ohne diesen Parameter aufrufen: Der Parameter `name` ist definiert als `Optional[str]`, aber er ist **nicht optional**, Sie können die Funktion nicht ohne diesen Parameter aufrufen:
@ -357,7 +388,7 @@ say_hi(name=None) # Das funktioniert, None is gültig 🎉
Die gute Nachricht ist, dass Sie sich darüber keine Sorgen mehr machen müssen, wenn Sie Python 3.10 verwenden, da Sie einfach `|` verwenden können, um Vereinigungen von Typen zu definieren: Die gute Nachricht ist, dass Sie sich darüber keine Sorgen mehr machen müssen, wenn Sie Python 3.10 verwenden, da Sie einfach `|` verwenden können, um Vereinigungen von Typen zu definieren:
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!../../../docs_src/python_types/tutorial009c_py310.py!} {!../../docs_src/python_types/tutorial009c_py310.py!}
``` ```
Und dann müssen Sie sich nicht mehr um Namen wie `Optional` und `Union` kümmern. 😎 Und dann müssen Sie sich nicht mehr um Namen wie `Optional` und `Union` kümmern. 😎
@ -366,7 +397,7 @@ Und dann müssen Sie sich nicht mehr um Namen wie `Optional` und `Union` kümmer
Diese Typen, die Typ-Parameter in eckigen Klammern akzeptieren, werden **generische Typen** oder **Generics** genannt. Diese Typen, die Typ-Parameter in eckigen Klammern akzeptieren, werden **generische Typen** oder **Generics** genannt.
=== "Python 3.10+" //// tab | Python 3.10+
Sie können die eingebauten Typen als Generics verwenden (mit eckigen Klammern und Typen darin): Sie können die eingebauten Typen als Generics verwenden (mit eckigen Klammern und Typen darin):
@ -383,7 +414,9 @@ Diese Typen, die Typ-Parameter in eckigen Klammern akzeptieren, werden **generis
In Python 3.10 können Sie als Alternative zu den Generics `Union` und `Optional` den <abbr title='Allgemein: „oder“. In anderem Zusammenhang auch „Bitweises ODER“, aber letztere Bedeutung ist hier nicht relevant'>vertikalen Balken (`|`)</abbr> verwenden, um Vereinigungen von Typen zu deklarieren, das ist besser und einfacher. In Python 3.10 können Sie als Alternative zu den Generics `Union` und `Optional` den <abbr title='Allgemein: „oder“. In anderem Zusammenhang auch „Bitweises ODER“, aber letztere Bedeutung ist hier nicht relevant'>vertikalen Balken (`|`)</abbr> verwenden, um Vereinigungen von Typen zu deklarieren, das ist besser und einfacher.
=== "Python 3.9+" ////
//// tab | Python 3.9+
Sie können die eingebauten Typen als Generics verwenden (mit eckigen Klammern und Typen darin): Sie können die eingebauten Typen als Generics verwenden (mit eckigen Klammern und Typen darin):
@ -398,7 +431,9 @@ Diese Typen, die Typ-Parameter in eckigen Klammern akzeptieren, werden **generis
* `Optional` * `Optional`
* ... und andere. * ... und andere.
=== "Python 3.8+" ////
//// tab | Python 3.8+
* `List` * `List`
* `Tuple` * `Tuple`
@ -408,6 +443,8 @@ Diese Typen, die Typ-Parameter in eckigen Klammern akzeptieren, werden **generis
* `Optional` * `Optional`
* ... und andere. * ... und andere.
////
### Klassen als Typen ### Klassen als Typen
Sie können auch eine Klasse als Typ einer Variablen deklarieren. Sie können auch eine Klasse als Typ einer Variablen deklarieren.
@ -415,13 +452,13 @@ Sie können auch eine Klasse als Typ einer Variablen deklarieren.
Nehmen wir an, Sie haben eine Klasse `Person`, mit einem Namen: Nehmen wir an, Sie haben eine Klasse `Person`, mit einem Namen:
```Python hl_lines="1-3" ```Python hl_lines="1-3"
{!../../../docs_src/python_types/tutorial010.py!} {!../../docs_src/python_types/tutorial010.py!}
``` ```
Dann können Sie eine Variable vom Typ `Person` deklarieren: Dann können Sie eine Variable vom Typ `Person` deklarieren:
```Python hl_lines="6" ```Python hl_lines="6"
{!../../../docs_src/python_types/tutorial010.py!} {!../../docs_src/python_types/tutorial010.py!}
``` ```
Und wiederum bekommen Sie die volle Editor-Unterstützung: Und wiederum bekommen Sie die volle Editor-Unterstützung:
@ -446,56 +483,72 @@ Und Sie erhalten volle Editor-Unterstützung für dieses Objekt.
Ein Beispiel aus der offiziellen Pydantic Dokumentation: Ein Beispiel aus der offiziellen Pydantic Dokumentation:
=== "Python 3.10+" //// tab | Python 3.10+
```Python ```Python
{!> ../../../docs_src/python_types/tutorial011_py310.py!} {!> ../../docs_src/python_types/tutorial011_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python ```Python
{!> ../../../docs_src/python_types/tutorial011_py39.py!} {!> ../../docs_src/python_types/tutorial011_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python ```Python
{!> ../../../docs_src/python_types/tutorial011.py!} {!> ../../docs_src/python_types/tutorial011.py!}
``` ```
!!! info ////
/// info
Um mehr über <a href="https://pydantic-docs.helpmanual.io/" class="external-link" target="_blank">Pydantic zu erfahren, schauen Sie sich dessen Dokumentation an</a>. Um mehr über <a href="https://pydantic-docs.helpmanual.io/" class="external-link" target="_blank">Pydantic zu erfahren, schauen Sie sich dessen Dokumentation an</a>.
///
**FastAPI** basiert vollständig auf Pydantic. **FastAPI** basiert vollständig auf Pydantic.
Viel mehr von all dem werden Sie in praktischer Anwendung im [Tutorial - Benutzerhandbuch](tutorial/index.md){.internal-link target=_blank} sehen. Viel mehr von all dem werden Sie in praktischer Anwendung im [Tutorial - Benutzerhandbuch](tutorial/index.md){.internal-link target=_blank} sehen.
!!! tip "Tipp" /// tip | "Tipp"
Pydantic verhält sich speziell, wenn Sie `Optional` oder `Union[Etwas, None]` ohne einen Default-Wert verwenden. Sie können darüber in der Pydantic Dokumentation unter <a href="https://docs.pydantic.dev/2.3/usage/models/#required-fields" class="external-link" target="_blank">Required fields</a> mehr erfahren. Pydantic verhält sich speziell, wenn Sie `Optional` oder `Union[Etwas, None]` ohne einen Default-Wert verwenden. Sie können darüber in der Pydantic Dokumentation unter <a href="https://docs.pydantic.dev/2.3/usage/models/#required-fields" class="external-link" target="_blank">Required fields</a> mehr erfahren.
///
## Typhinweise mit Metadaten-Annotationen ## Typhinweise mit Metadaten-Annotationen
Python bietet auch die Möglichkeit, **zusätzliche Metadaten** in Typhinweisen unterzubringen, mittels `Annotated`. Python bietet auch die Möglichkeit, **zusätzliche Metadaten** in Typhinweisen unterzubringen, mittels `Annotated`.
=== "Python 3.9+" //// tab | Python 3.9+
In Python 3.9 ist `Annotated` ein Teil der Standardbibliothek, Sie können es von `typing` importieren. In Python 3.9 ist `Annotated` ein Teil der Standardbibliothek, Sie können es von `typing` importieren.
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial013_py39.py!} {!> ../../docs_src/python_types/tutorial013_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
In Versionen niedriger als Python 3.9 importieren Sie `Annotated` von `typing_extensions`. In Versionen niedriger als Python 3.9 importieren Sie `Annotated` von `typing_extensions`.
Es wird bereits mit **FastAPI** installiert sein. Es wird bereits mit **FastAPI** installiert sein.
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial013.py!} {!> ../../docs_src/python_types/tutorial013.py!}
``` ```
////
Python selbst macht nichts mit `Annotated`. Für Editoren und andere Tools ist der Typ immer noch `str`. Python selbst macht nichts mit `Annotated`. Für Editoren und andere Tools ist der Typ immer noch `str`.
Aber Sie können `Annotated` nutzen, um **FastAPI** mit Metadaten zu versorgen, die ihm sagen, wie sich ihre Anwendung verhalten soll. Aber Sie können `Annotated` nutzen, um **FastAPI** mit Metadaten zu versorgen, die ihm sagen, wie sich ihre Anwendung verhalten soll.
@ -506,11 +559,14 @@ Im Moment müssen Sie nur wissen, dass `Annotated` existiert, und dass es Standa
Später werden Sie sehen, wie **mächtig** es sein kann. Später werden Sie sehen, wie **mächtig** es sein kann.
!!! tip "Tipp" /// tip | "Tipp"
Der Umstand, dass es **Standard-Python** ist, bedeutet, dass Sie immer noch die **bestmögliche Entwickler-Erfahrung** in ihrem Editor haben, sowie mit den Tools, die Sie nutzen, um ihren Code zu analysieren, zu refaktorisieren, usw. ✨ Der Umstand, dass es **Standard-Python** ist, bedeutet, dass Sie immer noch die **bestmögliche Entwickler-Erfahrung** in ihrem Editor haben, sowie mit den Tools, die Sie nutzen, um ihren Code zu analysieren, zu refaktorisieren, usw. ✨
Und ebenfalls, dass Ihr Code sehr kompatibel mit vielen anderen Python-Tools und -Bibliotheken sein wird. 🚀 Und ebenfalls, dass Ihr Code sehr kompatibel mit vielen anderen Python-Tools und -Bibliotheken sein wird. 🚀
///
## Typhinweise in **FastAPI** ## Typhinweise in **FastAPI**
**FastAPI** macht sich diese Typhinweise zunutze, um mehrere Dinge zu tun. **FastAPI** macht sich diese Typhinweise zunutze, um mehrere Dinge zu tun.
@ -533,5 +589,8 @@ Das mag alles abstrakt klingen. Machen Sie sich keine Sorgen. Sie werden all das
Das Wichtigste ist, dass **FastAPI** durch die Verwendung von Standard-Python-Typen an einer einzigen Stelle (anstatt weitere Klassen, Dekoratoren usw. hinzuzufügen) einen Großteil der Arbeit für Sie erledigt. Das Wichtigste ist, dass **FastAPI** durch die Verwendung von Standard-Python-Typen an einer einzigen Stelle (anstatt weitere Klassen, Dekoratoren usw. hinzuzufügen) einen Großteil der Arbeit für Sie erledigt.
!!! info /// info
Wenn Sie bereits das ganze Tutorial durchgearbeitet haben und mehr über Typen erfahren wollen, dann ist eine gute Ressource <a href="https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html" class="external-link" target="_blank">der „Cheat Sheet“ von `mypy`</a>. Wenn Sie bereits das ganze Tutorial durchgearbeitet haben und mehr über Typen erfahren wollen, dann ist eine gute Ressource <a href="https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html" class="external-link" target="_blank">der „Cheat Sheet“ von `mypy`</a>.
///

24
docs/de/docs/reference/apirouter.md

@ -1,24 +0,0 @@
# `APIRouter`-Klasse
Hier sind die Referenzinformationen für die Klasse `APIRouter` mit all ihren Parametern, Attributen und Methoden.
Sie können die `APIRouter`-Klasse direkt von `fastapi` importieren:
```python
from fastapi import APIRouter
```
::: fastapi.APIRouter
options:
members:
- websocket
- include_router
- get
- put
- post
- delete
- options
- head
- patch
- trace
- on_event

11
docs/de/docs/reference/background.md

@ -1,11 +0,0 @@
# Hintergrundtasks – `BackgroundTasks`
Sie können einen Parameter in einer *Pfadoperation-Funktion* oder einer Abhängigkeitsfunktion mit dem Typ `BackgroundTasks` deklarieren und diesen danach verwenden, um die Ausführung von Hintergrundtasks nach dem Senden der Response zu definieren.
Sie können `BackgroundTasks` direkt von `fastapi` importieren:
```python
from fastapi import BackgroundTasks
```
::: fastapi.BackgroundTasks

29
docs/de/docs/reference/dependencies.md

@ -1,29 +0,0 @@
# Abhängigkeiten – `Depends()` und `Security()`
## `Depends()`
Abhängigkeiten werden hauptsächlich mit der speziellen Funktion `Depends()` behandelt, die ein Callable entgegennimmt.
Hier finden Sie deren Referenz und Parameter.
Sie können sie direkt von `fastapi` importieren:
```python
from fastapi import Depends
```
::: fastapi.Depends
## `Security()`
In vielen Szenarien können Sie die Sicherheit (Autorisierung, Authentifizierung usw.) mit Abhängigkeiten handhaben, indem Sie `Depends()` verwenden.
Wenn Sie jedoch auch OAuth2-Scopes deklarieren möchten, können Sie `Security()` anstelle von `Depends()` verwenden.
Sie können `Security()` direkt von `fastapi` importieren:
```python
from fastapi import Security
```
::: fastapi.Security

3
docs/de/docs/reference/encoders.md

@ -1,3 +0,0 @@
# Encoder – `jsonable_encoder`
::: fastapi.encoders.jsonable_encoder

20
docs/de/docs/reference/exceptions.md

@ -1,20 +0,0 @@
# Exceptions – `HTTPException` und `WebSocketException`
Dies sind die <abbr title="Exception – Ausnahme, Fehler: Python-Objekt, das einen Fehler nebst Metadaten repräsentiert">Exceptions</abbr>, die Sie auslösen können, um dem Client Fehler zu berichten.
Wenn Sie eine Exception auslösen, wird, wie es bei normalem Python der Fall wäre, der Rest der Ausführung abgebrochen. Auf diese Weise können Sie diese Exceptions von überall im Code werfen, um einen Request abzubrechen und den Fehler dem Client anzuzeigen.
Sie können Folgendes verwenden:
* `HTTPException`
* `WebSocketException`
Diese Exceptions können direkt von `fastapi` importiert werden:
```python
from fastapi import HTTPException, WebSocketException
```
::: fastapi.HTTPException
::: fastapi.WebSocketException

31
docs/de/docs/reference/fastapi.md

@ -1,31 +0,0 @@
# `FastAPI`-Klasse
Hier sind die Referenzinformationen für die Klasse `FastAPI` mit all ihren Parametern, Attributen und Methoden.
Sie können die `FastAPI`-Klasse direkt von `fastapi` importieren:
```python
from fastapi import FastAPI
```
::: fastapi.FastAPI
options:
members:
- openapi_version
- webhooks
- state
- dependency_overrides
- openapi
- websocket
- include_router
- get
- put
- post
- delete
- options
- head
- patch
- trace
- on_event
- middleware
- exception_handler

11
docs/de/docs/reference/httpconnection.md

@ -1,11 +0,0 @@
# `HTTPConnection`-Klasse
Wenn Sie Abhängigkeiten definieren möchten, die sowohl mit HTTP als auch mit WebSockets kompatibel sein sollen, können Sie einen Parameter definieren, der eine `HTTPConnection` anstelle eines `Request` oder eines `WebSocket` akzeptiert.
Sie können diese von `fastapi.requests` importieren:
```python
from fastapi.requests import HTTPConnection
```
::: fastapi.requests.HTTPConnection

8
docs/de/docs/reference/index.md

@ -1,8 +0,0 @@
# Referenz – Code-API
Hier ist die Referenz oder Code-API, die Klassen, Funktionen, Parameter, Attribute und alle FastAPI-Teile, die Sie in Ihren Anwendungen verwenden können.
Wenn Sie **FastAPI** lernen möchten, ist es viel besser, das [FastAPI-Tutorial](https://fastapi.tiangolo.com/tutorial/) zu lesen.
!!! note "Hinweis Deutsche Übersetzung"
Die nachfolgende API wird aus der Quelltext-Dokumentation erstellt, daher sind nur die Einleitungen auf Deutsch.

45
docs/de/docs/reference/middleware.md

@ -1,45 +0,0 @@
# Middleware
Es gibt mehrere Middlewares, die direkt von Starlette bereitgestellt werden.
Lesen Sie mehr darüber in der [FastAPI-Dokumentation über Middleware](../advanced/middleware.md).
::: fastapi.middleware.cors.CORSMiddleware
Kann von `fastapi` importiert werden:
```python
from fastapi.middleware.cors import CORSMiddleware
```
::: fastapi.middleware.gzip.GZipMiddleware
Kann von `fastapi` importiert werden:
```python
from fastapi.middleware.gzip import GZipMiddleware
```
::: fastapi.middleware.httpsredirect.HTTPSRedirectMiddleware
Kann von `fastapi` importiert werden:
```python
from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware
```
::: fastapi.middleware.trustedhost.TrustedHostMiddleware
Kann von `fastapi` importiert werden:
```python
from fastapi.middleware.trustedhost import TrustedHostMiddleware
```
::: fastapi.middleware.wsgi.WSGIMiddleware
Kann von `fastapi` importiert werden:
```python
from fastapi.middleware.wsgi import WSGIMiddleware
```

11
docs/de/docs/reference/openapi/docs.md

@ -1,11 +0,0 @@
# OpenAPI `docs`
Werkzeuge zur Verwaltung der automatischen OpenAPI-UI-Dokumentation, einschließlich Swagger UI (standardmäßig unter `/docs`) und ReDoc (standardmäßig unter `/redoc`).
::: fastapi.openapi.docs.get_swagger_ui_html
::: fastapi.openapi.docs.get_redoc_html
::: fastapi.openapi.docs.get_swagger_ui_oauth2_redirect_html
::: fastapi.openapi.docs.swagger_ui_default_parameters

5
docs/de/docs/reference/openapi/index.md

@ -1,5 +0,0 @@
# OpenAPI
Es gibt mehrere Werkzeuge zur Handhabung von OpenAPI.
Normalerweise müssen Sie diese nicht verwenden, es sei denn, Sie haben einen bestimmten fortgeschrittenen Anwendungsfall, welcher das erfordert.

5
docs/de/docs/reference/openapi/models.md

@ -1,5 +0,0 @@
# OpenAPI-`models`
OpenAPI Pydantic-Modelle, werden zum Generieren und Validieren der generierten OpenAPI verwendet.
::: fastapi.openapi.models

35
docs/de/docs/reference/parameters.md

@ -1,35 +0,0 @@
# Request-Parameter
Hier die Referenzinformationen für die Request-Parameter.
Dies sind die Sonderfunktionen, die Sie mittels `Annotated` in *Pfadoperation-Funktion*-Parameter oder Abhängigkeitsfunktionen einfügen können, um Daten aus dem Request abzurufen.
Dies beinhaltet:
* `Query()`
* `Path()`
* `Body()`
* `Cookie()`
* `Header()`
* `Form()`
* `File()`
Sie können diese alle direkt von `fastapi` importieren:
```python
from fastapi import Body, Cookie, File, Form, Header, Path, Query
```
::: fastapi.Query
::: fastapi.Path
::: fastapi.Body
::: fastapi.Cookie
::: fastapi.Header
::: fastapi.Form
::: fastapi.File

14
docs/de/docs/reference/request.md

@ -1,14 +0,0 @@
# `Request`-Klasse
Sie können einen Parameter in einer *Pfadoperation-Funktion* oder einer Abhängigkeit als vom Typ `Request` deklarieren und dann direkt auf das Requestobjekt zugreifen, ohne jegliche Validierung, usw.
Sie können es direkt von `fastapi` importieren:
```python
from fastapi import Request
```
!!! tip "Tipp"
Wenn Sie Abhängigkeiten definieren möchten, die sowohl mit HTTP als auch mit WebSockets kompatibel sein sollen, können Sie einen Parameter definieren, der eine `HTTPConnection` anstelle eines `Request` oder eines `WebSocket` akzeptiert.
::: fastapi.Request

13
docs/de/docs/reference/response.md

@ -1,13 +0,0 @@
# `Response`-Klasse
Sie können einen Parameter in einer *Pfadoperation-Funktion* oder einer Abhängigkeit als `Response` deklarieren und dann Daten für die Response wie Header oder Cookies festlegen.
Diese können Sie auch direkt verwenden, um eine Instanz davon zu erstellen und diese von Ihren *Pfadoperationen* zurückzugeben.
Sie können sie direkt von `fastapi` importieren:
```python
from fastapi import Response
```
::: fastapi.Response

164
docs/de/docs/reference/responses.md

@ -1,164 +0,0 @@
# Benutzerdefinierte Responseklassen – File, HTML, Redirect, Streaming, usw.
Es gibt mehrere benutzerdefinierte Responseklassen, von denen Sie eine Instanz erstellen und diese direkt von Ihren *Pfadoperationen* zurückgeben können.
Lesen Sie mehr darüber in der [FastAPI-Dokumentation zu benutzerdefinierten Responses – HTML, Stream, Datei, andere](../advanced/custom-response.md).
Sie können diese direkt von `fastapi.responses` importieren:
```python
from fastapi.responses import (
FileResponse,
HTMLResponse,
JSONResponse,
ORJSONResponse,
PlainTextResponse,
RedirectResponse,
Response,
StreamingResponse,
UJSONResponse,
)
```
## FastAPI-Responses
Es gibt einige benutzerdefinierte FastAPI-Responseklassen, welche Sie verwenden können, um die JSON-Performanz zu optimieren.
::: fastapi.responses.UJSONResponse
options:
members:
- charset
- status_code
- media_type
- body
- background
- raw_headers
- render
- init_headers
- headers
- set_cookie
- delete_cookie
::: fastapi.responses.ORJSONResponse
options:
members:
- charset
- status_code
- media_type
- body
- background
- raw_headers
- render
- init_headers
- headers
- set_cookie
- delete_cookie
## Starlette-Responses
::: fastapi.responses.FileResponse
options:
members:
- chunk_size
- charset
- status_code
- media_type
- body
- background
- raw_headers
- render
- init_headers
- headers
- set_cookie
- delete_cookie
::: fastapi.responses.HTMLResponse
options:
members:
- charset
- status_code
- media_type
- body
- background
- raw_headers
- render
- init_headers
- headers
- set_cookie
- delete_cookie
::: fastapi.responses.JSONResponse
options:
members:
- charset
- status_code
- media_type
- body
- background
- raw_headers
- render
- init_headers
- headers
- set_cookie
- delete_cookie
::: fastapi.responses.PlainTextResponse
options:
members:
- charset
- status_code
- media_type
- body
- background
- raw_headers
- render
- init_headers
- headers
- set_cookie
- delete_cookie
::: fastapi.responses.RedirectResponse
options:
members:
- charset
- status_code
- media_type
- body
- background
- raw_headers
- render
- init_headers
- headers
- set_cookie
- delete_cookie
::: fastapi.responses.Response
options:
members:
- charset
- status_code
- media_type
- body
- background
- raw_headers
- render
- init_headers
- headers
- set_cookie
- delete_cookie
::: fastapi.responses.StreamingResponse
options:
members:
- body_iterator
- charset
- status_code
- media_type
- body
- background
- raw_headers
- render
- init_headers
- headers
- set_cookie
- delete_cookie

73
docs/de/docs/reference/security/index.md

@ -1,73 +0,0 @@
# Sicherheitstools
Wenn Sie Abhängigkeiten mit OAuth2-Scopes deklarieren müssen, verwenden Sie `Security()`.
Aber Sie müssen immer noch definieren, was das <abbr title="Das von dem abhängt, die zu verwendende Abhängigkeit">Dependable</abbr>, das Callable ist, welches Sie als Parameter an `Depends()` oder `Security()` übergeben.
Es gibt mehrere Tools, mit denen Sie diese Dependables erstellen können, und sie werden in OpenAPI integriert, sodass sie in der Oberfläche der automatischen Dokumentation angezeigt werden und von automatisch generierten Clients und SDKs, usw., verwendet werden können.
Sie können sie von `fastapi.security` importieren:
```python
from fastapi.security import (
APIKeyCookie,
APIKeyHeader,
APIKeyQuery,
HTTPAuthorizationCredentials,
HTTPBasic,
HTTPBasicCredentials,
HTTPBearer,
HTTPDigest,
OAuth2,
OAuth2AuthorizationCodeBearer,
OAuth2PasswordBearer,
OAuth2PasswordRequestForm,
OAuth2PasswordRequestFormStrict,
OpenIdConnect,
SecurityScopes,
)
```
## API-Schlüssel-Sicherheitsschemas
::: fastapi.security.APIKeyCookie
::: fastapi.security.APIKeyHeader
::: fastapi.security.APIKeyQuery
## HTTP-Authentifizierungsschemas
::: fastapi.security.HTTPBasic
::: fastapi.security.HTTPBearer
::: fastapi.security.HTTPDigest
## HTTP-Anmeldeinformationen
::: fastapi.security.HTTPAuthorizationCredentials
::: fastapi.security.HTTPBasicCredentials
## OAuth2-Authentifizierung
::: fastapi.security.OAuth2
::: fastapi.security.OAuth2AuthorizationCodeBearer
::: fastapi.security.OAuth2PasswordBearer
## OAuth2-Passwortformulare
::: fastapi.security.OAuth2PasswordRequestForm
::: fastapi.security.OAuth2PasswordRequestFormStrict
## OAuth2-Sicherheitsscopes in Abhängigkeiten
::: fastapi.security.SecurityScopes
## OpenID Connect
::: fastapi.security.OpenIdConnect

13
docs/de/docs/reference/staticfiles.md

@ -1,13 +0,0 @@
# Statische Dateien – `StaticFiles`
Sie können die `StaticFiles`-Klasse verwenden, um statische Dateien wie JavaScript, CSS, Bilder, usw. bereitzustellen.
Lesen Sie mehr darüber in der [FastAPI-Dokumentation zu statischen Dateien](../tutorial/static-files.md).
Sie können sie direkt von `fastapi.staticfiles` importieren:
```python
from fastapi.staticfiles import StaticFiles
```
::: fastapi.staticfiles.StaticFiles

36
docs/de/docs/reference/status.md

@ -1,36 +0,0 @@
# Statuscodes
Sie können das Modul `status` von `fastapi` importieren:
```python
from fastapi import status
```
`status` wird direkt von Starlette bereitgestellt.
Es enthält eine Gruppe benannter Konstanten (Variablen) mit ganzzahligen Statuscodes.
Zum Beispiel:
* 200: `status.HTTP_200_OK`
* 403: `status.HTTP_403_FORBIDDEN`
* usw.
Es kann praktisch sein, schnell auf HTTP- (und WebSocket-)Statuscodes in Ihrer Anwendung zuzugreifen, indem Sie die automatische Vervollständigung für den Namen verwenden, ohne sich die Zahlen für die Statuscodes merken zu müssen.
Lesen Sie mehr darüber in der [FastAPI-Dokumentation zu Response-Statuscodes](../tutorial/response-status-code.md).
## Beispiel
```python
from fastapi import FastAPI, status
app = FastAPI()
@app.get("/items/", status_code=status.HTTP_418_IM_A_TEAPOT)
def read_items():
return [{"name": "Plumbus"}, {"name": "Portal Gun"}]
```
::: fastapi.status

13
docs/de/docs/reference/templating.md

@ -1,13 +0,0 @@
# Templating – `Jinja2Templates`
Sie können die `Jinja2Templates`-Klasse verwenden, um Jinja-Templates zu rendern.
Lesen Sie mehr darüber in der [FastAPI-Dokumentation zu Templates](../advanced/templates.md).
Sie können die Klasse direkt von `fastapi.templating` importieren:
```python
from fastapi.templating import Jinja2Templates
```
::: fastapi.templating.Jinja2Templates

13
docs/de/docs/reference/testclient.md

@ -1,13 +0,0 @@
# Testclient – `TestClient`
Sie können die `TestClient`-Klasse verwenden, um FastAPI-Anwendungen zu testen, ohne eine tatsächliche HTTP- und Socket-Verbindung zu erstellen, Sie kommunizieren einfach direkt mit dem FastAPI-Code.
Lesen Sie mehr darüber in der [FastAPI-Dokumentation über Testen](../tutorial/testing.md).
Sie können sie direkt von `fastapi.testclient` importieren:
```python
from fastapi.testclient import TestClient
```
::: fastapi.testclient.TestClient

22
docs/de/docs/reference/uploadfile.md

@ -1,22 +0,0 @@
# `UploadFile`-Klasse
Sie können *Pfadoperation-Funktionsparameter* als Parameter vom Typ `UploadFile` definieren, um Dateien aus dem Request zu erhalten.
Sie können es direkt von `fastapi` importieren:
```python
from fastapi import UploadFile
```
::: fastapi.UploadFile
options:
members:
- file
- filename
- size
- headers
- content_type
- read
- write
- seek
- close

64
docs/de/docs/reference/websockets.md

@ -1,64 +0,0 @@
# WebSockets
Bei der Definition von WebSockets deklarieren Sie normalerweise einen Parameter vom Typ `WebSocket` und können damit Daten vom Client lesen und an ihn senden. Er wird direkt von Starlette bereitgestellt, Sie können ihn aber von `fastapi` importieren:
```python
from fastapi import WebSocket
```
!!! tip "Tipp"
Wenn Sie Abhängigkeiten definieren möchten, die sowohl mit HTTP als auch mit WebSockets kompatibel sein sollen, können Sie einen Parameter definieren, der eine `HTTPConnection` anstelle eines `Request` oder eines `WebSocket` akzeptiert.
::: fastapi.WebSocket
options:
members:
- scope
- app
- url
- base_url
- headers
- query_params
- path_params
- cookies
- client
- state
- url_for
- client_state
- application_state
- receive
- send
- accept
- receive_text
- receive_bytes
- receive_json
- iter_text
- iter_bytes
- iter_json
- send_text
- send_bytes
- send_json
- close
Wenn ein Client die Verbindung trennt, wird eine `WebSocketDisconnect`-Exception ausgelöst, die Sie abfangen können.
Sie können diese direkt von `fastapi` importieren:
```python
from fastapi import WebSocketDisconnect
```
::: fastapi.WebSocketDisconnect
## WebSockets – zusätzliche Klassen
Zusätzliche Klassen für die Handhabung von WebSockets.
Werden direkt von Starlette bereitgestellt, Sie können sie jedoch von `fastapi` importieren:
```python
from fastapi.websockets import WebSocketDisconnect, WebSocketState
```
::: fastapi.websockets.WebSocketDisconnect
::: fastapi.websockets.WebSocketState

46
docs/de/docs/tutorial/background-tasks.md

@ -16,7 +16,7 @@ Hierzu zählen beispielsweise:
Importieren Sie zunächst `BackgroundTasks` und definieren Sie einen Parameter in Ihrer *Pfadoperation-Funktion* mit der Typdeklaration `BackgroundTasks`: Importieren Sie zunächst `BackgroundTasks` und definieren Sie einen Parameter in Ihrer *Pfadoperation-Funktion* mit der Typdeklaration `BackgroundTasks`:
```Python hl_lines="1 13" ```Python hl_lines="1 13"
{!../../../docs_src/background_tasks/tutorial001.py!} {!../../docs_src/background_tasks/tutorial001.py!}
``` ```
**FastAPI** erstellt für Sie das Objekt vom Typ `BackgroundTasks` und übergibt es als diesen Parameter. **FastAPI** erstellt für Sie das Objekt vom Typ `BackgroundTasks` und übergibt es als diesen Parameter.
@ -34,7 +34,7 @@ In diesem Fall schreibt die Taskfunktion in eine Datei (den Versand einer E-Mail
Und da der Schreibvorgang nicht `async` und `await` verwendet, definieren wir die Funktion mit normalem `def`: Und da der Schreibvorgang nicht `async` und `await` verwendet, definieren wir die Funktion mit normalem `def`:
```Python hl_lines="6-9" ```Python hl_lines="6-9"
{!../../../docs_src/background_tasks/tutorial001.py!} {!../../docs_src/background_tasks/tutorial001.py!}
``` ```
## Den Hintergrundtask hinzufügen ## Den Hintergrundtask hinzufügen
@ -42,7 +42,7 @@ Und da der Schreibvorgang nicht `async` und `await` verwendet, definieren wir di
Übergeben Sie innerhalb Ihrer *Pfadoperation-Funktion* Ihre Taskfunktion mit der Methode `.add_task()` an das *Hintergrundtasks*-Objekt: Übergeben Sie innerhalb Ihrer *Pfadoperation-Funktion* Ihre Taskfunktion mit der Methode `.add_task()` an das *Hintergrundtasks*-Objekt:
```Python hl_lines="14" ```Python hl_lines="14"
{!../../../docs_src/background_tasks/tutorial001.py!} {!../../docs_src/background_tasks/tutorial001.py!}
``` ```
`.add_task()` erhält als Argumente: `.add_task()` erhält als Argumente:
@ -57,42 +57,58 @@ Die Verwendung von `BackgroundTasks` funktioniert auch mit dem <abbr title="Einb
**FastAPI** weiß, was jeweils zu tun ist und wie dasselbe Objekt wiederverwendet werden kann, sodass alle Hintergrundtasks zusammengeführt und anschließend im Hintergrund ausgeführt werden: **FastAPI** weiß, was jeweils zu tun ist und wie dasselbe Objekt wiederverwendet werden kann, sodass alle Hintergrundtasks zusammengeführt und anschließend im Hintergrund ausgeführt werden:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="13 15 22 25" ```Python hl_lines="13 15 22 25"
{!> ../../../docs_src/background_tasks/tutorial002_an_py310.py!} {!> ../../docs_src/background_tasks/tutorial002_an_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="13 15 22 25" ```Python hl_lines="13 15 22 25"
{!> ../../../docs_src/background_tasks/tutorial002_an_py39.py!} {!> ../../docs_src/background_tasks/tutorial002_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="14 16 23 26" ```Python hl_lines="14 16 23 26"
{!> ../../../docs_src/background_tasks/tutorial002_an.py!} {!> ../../docs_src/background_tasks/tutorial002_an.py!}
``` ```
=== "Python 3.10+ nicht annotiert" ////
//// tab | 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="11 13 20 23" ```Python hl_lines="11 13 20 23"
{!> ../../../docs_src/background_tasks/tutorial002_py310.py!} {!> ../../docs_src/background_tasks/tutorial002_py310.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="13 15 22 25" ```Python hl_lines="13 15 22 25"
{!> ../../../docs_src/background_tasks/tutorial002.py!} {!> ../../docs_src/background_tasks/tutorial002.py!}
``` ```
////
In obigem Beispiel werden die Nachrichten, *nachdem* die Response gesendet wurde, in die Datei `log.txt` geschrieben. In obigem Beispiel werden die Nachrichten, *nachdem* die Response gesendet wurde, in die Datei `log.txt` geschrieben.
Wenn im Request ein Query-Parameter enthalten war, wird dieser in einem Hintergrundtask in das Log geschrieben. Wenn im Request ein Query-Parameter enthalten war, wird dieser in einem Hintergrundtask in das Log geschrieben.

117
docs/de/docs/tutorial/bigger-applications.md

@ -4,9 +4,12 @@ Wenn Sie eine Anwendung oder eine Web-API erstellen, ist es selten der Fall, das
**FastAPI** bietet ein praktisches Werkzeug zur Strukturierung Ihrer Anwendung bei gleichzeitiger Wahrung der Flexibilität. **FastAPI** bietet ein praktisches Werkzeug zur Strukturierung Ihrer Anwendung bei gleichzeitiger Wahrung der Flexibilität.
!!! info /// info
Wenn Sie von Flask kommen, wäre dies das Äquivalent zu Flasks Blueprints. Wenn Sie von Flask kommen, wäre dies das Äquivalent zu Flasks Blueprints.
///
## Eine Beispiel-Dateistruktur ## Eine Beispiel-Dateistruktur
Nehmen wir an, Sie haben eine Dateistruktur wie diese: Nehmen wir an, Sie haben eine Dateistruktur wie diese:
@ -26,7 +29,8 @@ Nehmen wir an, Sie haben eine Dateistruktur wie diese:
│   └── admin.py │   └── admin.py
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Es gibt mehrere `__init__.py`-Dateien: eine in jedem Verzeichnis oder Unterverzeichnis. Es gibt mehrere `__init__.py`-Dateien: eine in jedem Verzeichnis oder Unterverzeichnis.
Das ermöglicht den Import von Code aus einer Datei in eine andere. Das ermöglicht den Import von Code aus einer Datei in eine andere.
@ -37,6 +41,8 @@ Nehmen wir an, Sie haben eine Dateistruktur wie diese:
from app.routers import items from app.routers import items
``` ```
///
* Das Verzeichnis `app` enthält alles. Und es hat eine leere Datei `app/__init__.py`, es handelt sich also um ein „Python-Package“ (eine Sammlung von „Python-Modulen“): `app`. * Das Verzeichnis `app` enthält alles. Und es hat eine leere Datei `app/__init__.py`, es handelt sich also um ein „Python-Package“ (eine Sammlung von „Python-Modulen“): `app`.
* Es enthält eine Datei `app/main.py`. Da sie sich in einem Python-Package (einem Verzeichnis mit einer Datei `__init__.py`) befindet, ist sie ein „Modul“ dieses Packages: `app.main`. * Es enthält eine Datei `app/main.py`. Da sie sich in einem Python-Package (einem Verzeichnis mit einer Datei `__init__.py`) befindet, ist sie ein „Modul“ dieses Packages: `app.main`.
* Es gibt auch eine Datei `app/dependencies.py`, genau wie `app/main.py` ist sie ein „Modul“: `app.dependencies`. * Es gibt auch eine Datei `app/dependencies.py`, genau wie `app/main.py` ist sie ein „Modul“: `app.dependencies`.
@ -80,7 +86,7 @@ Sie können die *Pfadoperationen* für dieses Modul mit `APIRouter` erstellen.
Sie importieren ihn und erstellen eine „Instanz“ auf die gleiche Weise wie mit der Klasse `FastAPI`: Sie importieren ihn und erstellen eine „Instanz“ auf die gleiche Weise wie mit der Klasse `FastAPI`:
```Python hl_lines="1 3" title="app/routers/users.py" ```Python hl_lines="1 3" title="app/routers/users.py"
{!../../../docs_src/bigger_applications/app/routers/users.py!} {!../../docs_src/bigger_applications/app/routers/users.py!}
``` ```
### *Pfadoperationen* mit `APIRouter` ### *Pfadoperationen* mit `APIRouter`
@ -90,7 +96,7 @@ Und dann verwenden Sie ihn, um Ihre *Pfadoperationen* zu deklarieren.
Verwenden Sie ihn auf die gleiche Weise wie die Klasse `FastAPI`: Verwenden Sie ihn auf die gleiche Weise wie die Klasse `FastAPI`:
```Python hl_lines="6 11 16" title="app/routers/users.py" ```Python hl_lines="6 11 16" title="app/routers/users.py"
{!../../../docs_src/bigger_applications/app/routers/users.py!} {!../../docs_src/bigger_applications/app/routers/users.py!}
``` ```
Sie können sich `APIRouter` als eine „Mini-`FastAPI`“-Klasse vorstellen. Sie können sich `APIRouter` als eine „Mini-`FastAPI`“-Klasse vorstellen.
@ -99,9 +105,12 @@ Alle die gleichen Optionen werden unterstützt.
Alle die gleichen `parameters`, `responses`, `dependencies`, `tags`, usw. Alle die gleichen `parameters`, `responses`, `dependencies`, `tags`, usw.
!!! tip "Tipp" /// tip | "Tipp"
In diesem Beispiel heißt die Variable `router`, aber Sie können ihr einen beliebigen Namen geben. In diesem Beispiel heißt die Variable `router`, aber Sie können ihr einen beliebigen Namen geben.
///
Wir werden diesen `APIRouter` in die Hauptanwendung `FastAPI` einbinden, aber zuerst kümmern wir uns um die Abhängigkeiten und einen anderen `APIRouter`. Wir werden diesen `APIRouter` in die Hauptanwendung `FastAPI` einbinden, aber zuerst kümmern wir uns um die Abhängigkeiten und einen anderen `APIRouter`.
## Abhängigkeiten ## Abhängigkeiten
@ -112,32 +121,44 @@ Also fügen wir sie in ihr eigenes `dependencies`-Modul (`app/dependencies.py`)
Wir werden nun eine einfache Abhängigkeit verwenden, um einen benutzerdefinierten `X-Token`-Header zu lesen: Wir werden nun eine einfache Abhängigkeit verwenden, um einen benutzerdefinierten `X-Token`-Header zu lesen:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="3 6-8" title="app/dependencies.py" ```Python hl_lines="3 6-8" title="app/dependencies.py"
{!> ../../../docs_src/bigger_applications/app_an_py39/dependencies.py!} {!> ../../docs_src/bigger_applications/app_an_py39/dependencies.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="1 5-7" title="app/dependencies.py" ```Python hl_lines="1 5-7" title="app/dependencies.py"
{!> ../../../docs_src/bigger_applications/app_an/dependencies.py!} {!> ../../docs_src/bigger_applications/app_an/dependencies.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="1 4-6" title="app/dependencies.py" ```Python hl_lines="1 4-6" title="app/dependencies.py"
{!> ../../../docs_src/bigger_applications/app/dependencies.py!} {!> ../../docs_src/bigger_applications/app/dependencies.py!}
``` ```
!!! tip "Tipp" ////
/// tip | "Tipp"
Um dieses Beispiel zu vereinfachen, verwenden wir einen erfundenen Header. Um dieses Beispiel zu vereinfachen, verwenden wir einen erfundenen Header.
Aber in der Praxis werden Sie mit den integrierten [Sicherheits-Werkzeugen](security/index.md){.internal-link target=_blank} bessere Ergebnisse erzielen. Aber in der Praxis werden Sie mit den integrierten [Sicherheits-Werkzeugen](security/index.md){.internal-link target=_blank} bessere Ergebnisse erzielen.
///
## Ein weiteres Modul mit `APIRouter`. ## Ein weiteres Modul mit `APIRouter`.
Nehmen wir an, Sie haben im Modul unter `app/routers/items.py` auch die Endpunkte, die für die Verarbeitung von Artikeln („Items“) aus Ihrer Anwendung vorgesehen sind. Nehmen wir an, Sie haben im Modul unter `app/routers/items.py` auch die Endpunkte, die für die Verarbeitung von Artikeln („Items“) aus Ihrer Anwendung vorgesehen sind.
@ -161,7 +182,7 @@ Wir wissen, dass alle *Pfadoperationen* in diesem Modul folgendes haben:
Anstatt also alles zu jeder *Pfadoperation* hinzuzufügen, können wir es dem `APIRouter` hinzufügen. Anstatt also alles zu jeder *Pfadoperation* hinzuzufügen, können wir es dem `APIRouter` hinzufügen.
```Python hl_lines="5-10 16 21" title="app/routers/items.py" ```Python hl_lines="5-10 16 21" title="app/routers/items.py"
{!../../../docs_src/bigger_applications/app/routers/items.py!} {!../../docs_src/bigger_applications/app/routers/items.py!}
``` ```
Da der Pfad jeder *Pfadoperation* mit `/` beginnen muss, wie in: Da der Pfad jeder *Pfadoperation* mit `/` beginnen muss, wie in:
@ -180,9 +201,12 @@ Wir können auch eine Liste von `tags` und zusätzliche `responses` hinzufügen,
Und wir können eine Liste von `dependencies` hinzufügen, die allen *Pfadoperationen* im Router hinzugefügt und für jeden an sie gerichteten Request ausgeführt/aufgelöst werden. Und wir können eine Liste von `dependencies` hinzufügen, die allen *Pfadoperationen* im Router hinzugefügt und für jeden an sie gerichteten Request ausgeführt/aufgelöst werden.
!!! tip "Tipp" /// tip | "Tipp"
Beachten Sie, dass ähnlich wie bei [Abhängigkeiten in *Pfadoperation-Dekoratoren*](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank} kein Wert an Ihre *Pfadoperation-Funktion* übergeben wird. Beachten Sie, dass ähnlich wie bei [Abhängigkeiten in *Pfadoperation-Dekoratoren*](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank} kein Wert an Ihre *Pfadoperation-Funktion* übergeben wird.
///
Das Endergebnis ist, dass die Pfade für diese Artikel jetzt wie folgt lauten: Das Endergebnis ist, dass die Pfade für diese Artikel jetzt wie folgt lauten:
* `/items/` * `/items/`
@ -198,12 +222,18 @@ Das Endergebnis ist, dass die Pfade für diese Artikel jetzt wie folgt lauten:
* Zuerst werden die Router-Abhängigkeiten ausgeführt, dann die [`dependencies` im Dekorator](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank} und dann die normalen Parameterabhängigkeiten. * Zuerst werden die Router-Abhängigkeiten ausgeführt, dann die [`dependencies` im Dekorator](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank} und dann die normalen Parameterabhängigkeiten.
* Sie können auch [`Security`-Abhängigkeiten mit `scopes`](../advanced/security/oauth2-scopes.md){.internal-link target=_blank} hinzufügen. * Sie können auch [`Security`-Abhängigkeiten mit `scopes`](../advanced/security/oauth2-scopes.md){.internal-link target=_blank} hinzufügen.
!!! tip "Tipp" /// tip | "Tipp"
`dependencies` im `APIRouter` können beispielsweise verwendet werden, um eine Authentifizierung für eine ganze Gruppe von *Pfadoperationen* zu erfordern. Selbst wenn die Abhängigkeiten nicht jeder einzeln hinzugefügt werden. `dependencies` im `APIRouter` können beispielsweise verwendet werden, um eine Authentifizierung für eine ganze Gruppe von *Pfadoperationen* zu erfordern. Selbst wenn die Abhängigkeiten nicht jeder einzeln hinzugefügt werden.
!!! check ///
/// check
Die Parameter `prefix`, `tags`, `responses` und `dependencies` sind (wie in vielen anderen Fällen) nur ein Feature von **FastAPI**, um Ihnen dabei zu helfen, Codeverdoppelung zu vermeiden. Die Parameter `prefix`, `tags`, `responses` und `dependencies` sind (wie in vielen anderen Fällen) nur ein Feature von **FastAPI**, um Ihnen dabei zu helfen, Codeverdoppelung zu vermeiden.
///
### Die Abhängigkeiten importieren ### Die Abhängigkeiten importieren
Der folgende Code befindet sich im Modul `app.routers.items`, also in der Datei `app/routers/items.py`. Der folgende Code befindet sich im Modul `app.routers.items`, also in der Datei `app/routers/items.py`.
@ -213,14 +243,17 @@ Und wir müssen die Abhängigkeitsfunktion aus dem Modul `app.dependencies` impo
Daher verwenden wir einen relativen Import mit `..` für die Abhängigkeiten: Daher verwenden wir einen relativen Import mit `..` für die Abhängigkeiten:
```Python hl_lines="3" title="app/routers/items.py" ```Python hl_lines="3" title="app/routers/items.py"
{!../../../docs_src/bigger_applications/app/routers/items.py!} {!../../docs_src/bigger_applications/app/routers/items.py!}
``` ```
#### Wie relative Importe funktionieren #### Wie relative Importe funktionieren
!!! tip "Tipp" /// tip | "Tipp"
Wenn Sie genau wissen, wie Importe funktionieren, fahren Sie mit dem nächsten Abschnitt unten fort. Wenn Sie genau wissen, wie Importe funktionieren, fahren Sie mit dem nächsten Abschnitt unten fort.
///
Ein einzelner Punkt `.`, wie in: Ein einzelner Punkt `.`, wie in:
```Python ```Python
@ -283,14 +316,17 @@ Wir fügen weder das Präfix `/items` noch `tags=["items"]` zu jeder *Pfadoperat
Aber wir können immer noch _mehr_ `tags` hinzufügen, die auf eine bestimmte *Pfadoperation* angewendet werden, sowie einige zusätzliche `responses`, die speziell für diese *Pfadoperation* gelten: Aber wir können immer noch _mehr_ `tags` hinzufügen, die auf eine bestimmte *Pfadoperation* angewendet werden, sowie einige zusätzliche `responses`, die speziell für diese *Pfadoperation* gelten:
```Python hl_lines="30-31" title="app/routers/items.py" ```Python hl_lines="30-31" title="app/routers/items.py"
{!../../../docs_src/bigger_applications/app/routers/items.py!} {!../../docs_src/bigger_applications/app/routers/items.py!}
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Diese letzte Pfadoperation wird eine Kombination von Tags haben: `["items", "custom"]`. Diese letzte Pfadoperation wird eine Kombination von Tags haben: `["items", "custom"]`.
Und sie wird auch beide Responses in der Dokumentation haben, eine für `404` und eine für `403`. Und sie wird auch beide Responses in der Dokumentation haben, eine für `404` und eine für `403`.
///
## Das Haupt-`FastAPI`. ## Das Haupt-`FastAPI`.
Sehen wir uns nun das Modul unter `app/main.py` an. Sehen wir uns nun das Modul unter `app/main.py` an.
@ -308,7 +344,7 @@ Sie importieren und erstellen wie gewohnt eine `FastAPI`-Klasse.
Und wir können sogar [globale Abhängigkeiten](dependencies/global-dependencies.md){.internal-link target=_blank} deklarieren, die mit den Abhängigkeiten für jeden `APIRouter` kombiniert werden: Und wir können sogar [globale Abhängigkeiten](dependencies/global-dependencies.md){.internal-link target=_blank} deklarieren, die mit den Abhängigkeiten für jeden `APIRouter` kombiniert werden:
```Python hl_lines="1 3 7" title="app/main.py" ```Python hl_lines="1 3 7" title="app/main.py"
{!../../../docs_src/bigger_applications/app/main.py!} {!../../docs_src/bigger_applications/app/main.py!}
``` ```
### Den `APIRouter` importieren ### Den `APIRouter` importieren
@ -316,7 +352,7 @@ Und wir können sogar [globale Abhängigkeiten](dependencies/global-dependencies
Jetzt importieren wir die anderen Submodule, die `APIRouter` haben: Jetzt importieren wir die anderen Submodule, die `APIRouter` haben:
```Python hl_lines="4-5" title="app/main.py" ```Python hl_lines="4-5" title="app/main.py"
{!../../../docs_src/bigger_applications/app/main.py!} {!../../docs_src/bigger_applications/app/main.py!}
``` ```
Da es sich bei den Dateien `app/routers/users.py` und `app/routers/items.py` um Submodule handelt, die Teil desselben Python-Packages `app` sind, können wir einen einzelnen Punkt `.` verwenden, um sie mit „relativen Imports“ zu importieren. Da es sich bei den Dateien `app/routers/users.py` und `app/routers/items.py` um Submodule handelt, die Teil desselben Python-Packages `app` sind, können wir einen einzelnen Punkt `.` verwenden, um sie mit „relativen Imports“ zu importieren.
@ -345,7 +381,8 @@ Wir könnten sie auch wie folgt importieren:
from app.routers import items, users from app.routers import items, users
``` ```
!!! info /// info
Die erste Version ist ein „relativer Import“: Die erste Version ist ein „relativer Import“:
```Python ```Python
@ -360,6 +397,8 @@ from app.routers import items, users
Um mehr über Python-Packages und -Module zu erfahren, lesen Sie <a href="https://docs.python.org/3/tutorial/modules.html" class="external-link" target="_blank">die offizielle Python-Dokumentation über Module</a>. Um mehr über Python-Packages und -Module zu erfahren, lesen Sie <a href="https://docs.python.org/3/tutorial/modules.html" class="external-link" target="_blank">die offizielle Python-Dokumentation über Module</a>.
///
### Namenskollisionen vermeiden ### Namenskollisionen vermeiden
Wir importieren das Submodul `items` direkt, anstatt nur seine Variable `router` zu importieren. Wir importieren das Submodul `items` direkt, anstatt nur seine Variable `router` zu importieren.
@ -378,7 +417,7 @@ würde der `router` von `users` den von `items` überschreiben und wir könnten
Um also beide in derselben Datei verwenden zu können, importieren wir die Submodule direkt: Um also beide in derselben Datei verwenden zu können, importieren wir die Submodule direkt:
```Python hl_lines="5" title="app/main.py" ```Python hl_lines="5" title="app/main.py"
{!../../../docs_src/bigger_applications/app/main.py!} {!../../docs_src/bigger_applications/app/main.py!}
``` ```
@ -387,30 +426,39 @@ Um also beide in derselben Datei verwenden zu können, importieren wir die Submo
Inkludieren wir nun die `router` aus diesen Submodulen `users` und `items`: Inkludieren wir nun die `router` aus diesen Submodulen `users` und `items`:
```Python hl_lines="10-11" title="app/main.py" ```Python hl_lines="10-11" title="app/main.py"
{!../../../docs_src/bigger_applications/app/main.py!} {!../../docs_src/bigger_applications/app/main.py!}
``` ```
!!! info /// info
`users.router` enthält den `APIRouter` in der Datei `app/routers/users.py`. `users.router` enthält den `APIRouter` in der Datei `app/routers/users.py`.
Und `items.router` enthält den `APIRouter` in der Datei `app/routers/items.py`. Und `items.router` enthält den `APIRouter` in der Datei `app/routers/items.py`.
///
Mit `app.include_router()` können wir jeden `APIRouter` zur Hauptanwendung `FastAPI` hinzufügen. Mit `app.include_router()` können wir jeden `APIRouter` zur Hauptanwendung `FastAPI` hinzufügen.
Es wird alle Routen von diesem Router als Teil von dieser inkludieren. Es wird alle Routen von diesem Router als Teil von dieser inkludieren.
!!! note "Technische Details" /// note | "Technische Details"
Tatsächlich wird intern eine *Pfadoperation* für jede *Pfadoperation* erstellt, die im `APIRouter` deklariert wurde. Tatsächlich wird intern eine *Pfadoperation* für jede *Pfadoperation* erstellt, die im `APIRouter` deklariert wurde.
Hinter den Kulissen wird es also tatsächlich so funktionieren, als ob alles dieselbe einzige Anwendung wäre. Hinter den Kulissen wird es also tatsächlich so funktionieren, als ob alles dieselbe einzige Anwendung wäre.
!!! check ///
/// check
Bei der Einbindung von Routern müssen Sie sich keine Gedanken über die Performanz machen. Bei der Einbindung von Routern müssen Sie sich keine Gedanken über die Performanz machen.
Dies dauert Mikrosekunden und geschieht nur beim Start. Dies dauert Mikrosekunden und geschieht nur beim Start.
Es hat also keinen Einfluss auf die Leistung. ⚡ Es hat also keinen Einfluss auf die Leistung. ⚡
///
### Einen `APIRouter` mit benutzerdefinierten `prefix`, `tags`, `responses` und `dependencies` einfügen ### Einen `APIRouter` mit benutzerdefinierten `prefix`, `tags`, `responses` und `dependencies` einfügen
Stellen wir uns nun vor, dass Ihre Organisation Ihnen die Datei `app/internal/admin.py` gegeben hat. Stellen wir uns nun vor, dass Ihre Organisation Ihnen die Datei `app/internal/admin.py` gegeben hat.
@ -420,7 +468,7 @@ Sie enthält einen `APIRouter` mit einigen administrativen *Pfadoperationen*, di
In diesem Beispiel wird es ganz einfach sein. Nehmen wir jedoch an, dass wir, da sie mit anderen Projekten in der Organisation geteilt wird, sie nicht ändern und kein `prefix`, `dependencies`, `tags`, usw. direkt zum `APIRouter` hinzufügen können: In diesem Beispiel wird es ganz einfach sein. Nehmen wir jedoch an, dass wir, da sie mit anderen Projekten in der Organisation geteilt wird, sie nicht ändern und kein `prefix`, `dependencies`, `tags`, usw. direkt zum `APIRouter` hinzufügen können:
```Python hl_lines="3" title="app/internal/admin.py" ```Python hl_lines="3" title="app/internal/admin.py"
{!../../../docs_src/bigger_applications/app/internal/admin.py!} {!../../docs_src/bigger_applications/app/internal/admin.py!}
``` ```
Aber wir möchten immer noch ein benutzerdefiniertes `prefix` festlegen, wenn wir den `APIRouter` einbinden, sodass alle seine *Pfadoperationen* mit `/admin` beginnen, wir möchten es mit den `dependencies` sichern, die wir bereits für dieses Projekt haben, und wir möchten `tags` und `responses` hinzufügen. Aber wir möchten immer noch ein benutzerdefiniertes `prefix` festlegen, wenn wir den `APIRouter` einbinden, sodass alle seine *Pfadoperationen* mit `/admin` beginnen, wir möchten es mit den `dependencies` sichern, die wir bereits für dieses Projekt haben, und wir möchten `tags` und `responses` hinzufügen.
@ -428,7 +476,7 @@ Aber wir möchten immer noch ein benutzerdefiniertes `prefix` festlegen, wenn wi
Wir können das alles deklarieren, ohne den ursprünglichen `APIRouter` ändern zu müssen, indem wir diese Parameter an `app.include_router()` übergeben: Wir können das alles deklarieren, ohne den ursprünglichen `APIRouter` ändern zu müssen, indem wir diese Parameter an `app.include_router()` übergeben:
```Python hl_lines="14-17" title="app/main.py" ```Python hl_lines="14-17" title="app/main.py"
{!../../../docs_src/bigger_applications/app/main.py!} {!../../docs_src/bigger_applications/app/main.py!}
``` ```
Auf diese Weise bleibt der ursprüngliche `APIRouter` unverändert, sodass wir dieselbe `app/internal/admin.py`-Datei weiterhin mit anderen Projekten in der Organisation teilen können. Auf diese Weise bleibt der ursprüngliche `APIRouter` unverändert, sodass wir dieselbe `app/internal/admin.py`-Datei weiterhin mit anderen Projekten in der Organisation teilen können.
@ -451,12 +499,13 @@ Wir können *Pfadoperationen* auch direkt zur `FastAPI`-App hinzufügen.
Hier machen wir es ... nur um zu zeigen, dass wir es können 🤷: Hier machen wir es ... nur um zu zeigen, dass wir es können 🤷:
```Python hl_lines="21-23" title="app/main.py" ```Python hl_lines="21-23" title="app/main.py"
{!../../../docs_src/bigger_applications/app/main.py!} {!../../docs_src/bigger_applications/app/main.py!}
``` ```
und es wird korrekt funktionieren, zusammen mit allen anderen *Pfadoperationen*, die mit `app.include_router()` hinzugefügt wurden. und es wird korrekt funktionieren, zusammen mit allen anderen *Pfadoperationen*, die mit `app.include_router()` hinzugefügt wurden.
!!! info "Sehr technische Details" /// info | "Sehr technische Details"
**Hinweis**: Dies ist ein sehr technisches Detail, das Sie wahrscheinlich **einfach überspringen** können. **Hinweis**: Dies ist ein sehr technisches Detail, das Sie wahrscheinlich **einfach überspringen** können.
--- ---
@ -467,6 +516,8 @@ und es wird korrekt funktionieren, zusammen mit allen anderen *Pfadoperationen*,
Da wir sie nicht einfach isolieren und unabhängig vom Rest „mounten“ können, werden die *Pfadoperationen* „geklont“ (neu erstellt) und nicht direkt einbezogen. Da wir sie nicht einfach isolieren und unabhängig vom Rest „mounten“ können, werden die *Pfadoperationen* „geklont“ (neu erstellt) und nicht direkt einbezogen.
///
## Es in der automatischen API-Dokumentation ansehen ## Es in der automatischen API-Dokumentation ansehen
Führen Sie nun `uvicorn` aus, indem Sie das Modul `app.main` und die Variable `app` verwenden: Führen Sie nun `uvicorn` aus, indem Sie das Modul `app.main` und die Variable `app` verwenden:

100
docs/de/docs/tutorial/body-fields.md

@ -6,88 +6,124 @@ So wie Sie zusätzliche Validation und Metadaten in Parametern der **Pfadoperati
Importieren Sie es zuerst: Importieren Sie es zuerst:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="4" ```Python hl_lines="4"
{!> ../../../docs_src/body_fields/tutorial001_an_py310.py!} {!> ../../docs_src/body_fields/tutorial001_an_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="4" ```Python hl_lines="4"
{!> ../../../docs_src/body_fields/tutorial001_an_py39.py!} {!> ../../docs_src/body_fields/tutorial001_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="4" ```Python hl_lines="4"
{!> ../../../docs_src/body_fields/tutorial001_an.py!} {!> ../../docs_src/body_fields/tutorial001_an.py!}
``` ```
=== "Python 3.10+ nicht annotiert" ////
//// tab | 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="2" ```Python hl_lines="2"
{!> ../../../docs_src/body_fields/tutorial001_py310.py!} {!> ../../docs_src/body_fields/tutorial001_py310.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="4" ```Python hl_lines="4"
{!> ../../../docs_src/body_fields/tutorial001.py!} {!> ../../docs_src/body_fields/tutorial001.py!}
``` ```
!!! warning "Achtung" ////
/// warning | "Achtung"
Beachten Sie, dass `Field` direkt von `pydantic` importiert wird, nicht von `fastapi`, wie die anderen (`Query`, `Path`, `Body`, usw.) Beachten Sie, dass `Field` direkt von `pydantic` importiert wird, nicht von `fastapi`, wie die anderen (`Query`, `Path`, `Body`, usw.)
///
## Modellattribute deklarieren ## Modellattribute deklarieren
Dann können Sie `Field` mit Modellattributen deklarieren: Dann können Sie `Field` mit Modellattributen deklarieren:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="11-14" ```Python hl_lines="11-14"
{!> ../../../docs_src/body_fields/tutorial001_an_py310.py!} {!> ../../docs_src/body_fields/tutorial001_an_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="11-14" ```Python hl_lines="11-14"
{!> ../../../docs_src/body_fields/tutorial001_an_py39.py!} {!> ../../docs_src/body_fields/tutorial001_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="12-15" ```Python hl_lines="12-15"
{!> ../../../docs_src/body_fields/tutorial001_an.py!} {!> ../../docs_src/body_fields/tutorial001_an.py!}
``` ```
=== "Python 3.10+ nicht annotiert" ////
//// tab | 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="9-12" ```Python hl_lines="9-12"
{!> ../../../docs_src/body_fields/tutorial001_py310.py!} {!> ../../docs_src/body_fields/tutorial001_py310.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="11-14" ```Python hl_lines="11-14"
{!> ../../../docs_src/body_fields/tutorial001.py!} {!> ../../docs_src/body_fields/tutorial001.py!}
``` ```
////
`Field` funktioniert genauso wie `Query`, `Path` und `Body`, es hat die gleichen Parameter, usw. `Field` funktioniert genauso wie `Query`, `Path` und `Body`, es hat die gleichen Parameter, usw.
!!! note "Technische Details" /// note | "Technische Details"
Tatsächlich erstellen `Query`, `Path` und andere, die sie kennenlernen werden, Instanzen von Unterklassen einer allgemeinen Klasse `Param`, die ihrerseits eine Unterklasse von Pydantics `FieldInfo`-Klasse ist. Tatsächlich erstellen `Query`, `Path` und andere, die sie kennenlernen werden, Instanzen von Unterklassen einer allgemeinen Klasse `Param`, die ihrerseits eine Unterklasse von Pydantics `FieldInfo`-Klasse ist.
Und Pydantics `Field` gibt ebenfalls eine Instanz von `FieldInfo` zurück. Und Pydantics `Field` gibt ebenfalls eine Instanz von `FieldInfo` zurück.
@ -96,18 +132,26 @@ Dann können Sie `Field` mit Modellattributen deklarieren:
Denken Sie daran, dass `Query`, `Path` und andere von `fastapi` tatsächlich Funktionen sind, die spezielle Klassen zurückgeben. Denken Sie daran, dass `Query`, `Path` und andere von `fastapi` tatsächlich Funktionen sind, die spezielle Klassen zurückgeben.
!!! tip "Tipp" ///
/// tip | "Tipp"
Beachten Sie, dass jedes Modellattribut mit einem Typ, Defaultwert und `Field` die gleiche Struktur hat wie ein Parameter einer Pfadoperation-Funktion, nur mit `Field` statt `Path`, `Query`, `Body`. Beachten Sie, dass jedes Modellattribut mit einem Typ, Defaultwert und `Field` die gleiche Struktur hat wie ein Parameter einer Pfadoperation-Funktion, nur mit `Field` statt `Path`, `Query`, `Body`.
///
## Zusätzliche Information hinzufügen ## Zusätzliche Information hinzufügen
Sie können zusätzliche Information in `Field`, `Query`, `Body`, usw. deklarieren. Und es wird im generierten JSON-Schema untergebracht. Sie können zusätzliche Information in `Field`, `Query`, `Body`, usw. deklarieren. Und es wird im generierten JSON-Schema untergebracht.
Sie werden später mehr darüber lernen, wie man zusätzliche Information unterbringt, wenn Sie lernen, Beispiele zu deklarieren. Sie werden später mehr darüber lernen, wie man zusätzliche Information unterbringt, wenn Sie lernen, Beispiele zu deklarieren.
!!! warning "Achtung" /// warning | "Achtung"
Extra-Schlüssel, die `Field` überreicht werden, werden auch im resultierenden OpenAPI-Schema Ihrer Anwendung gelistet. Da diese Schlüssel nicht notwendigerweise Teil der OpenAPI-Spezifikation sind, könnten einige OpenAPI-Tools, wie etwa [der OpenAPI-Validator](https://validator.swagger.io/), nicht mit Ihrem generierten Schema funktionieren. Extra-Schlüssel, die `Field` überreicht werden, werden auch im resultierenden OpenAPI-Schema Ihrer Anwendung gelistet. Da diese Schlüssel nicht notwendigerweise Teil der OpenAPI-Spezifikation sind, könnten einige OpenAPI-Tools, wie etwa [der OpenAPI-Validator](https://validator.swagger.io/), nicht mit Ihrem generierten Schema funktionieren.
///
## Zusammenfassung ## Zusammenfassung
Sie können Pydantics `Field` verwenden, um zusätzliche Validierungen und Metadaten für Modellattribute zu deklarieren. Sie können Pydantics `Field` verwenden, um zusätzliche Validierungen und Metadaten für Modellattribute zu deklarieren.

187
docs/de/docs/tutorial/body-multiple-params.md

@ -8,45 +8,64 @@ Zuerst einmal, Sie können `Path`-, `Query`- und Requestbody-Parameter-Deklarati
Und Sie können auch Body-Parameter als optional kennzeichnen, indem Sie den Defaultwert auf `None` setzen: Und Sie können auch Body-Parameter als optional kennzeichnen, indem Sie den Defaultwert auf `None` setzen:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="18-20" ```Python hl_lines="18-20"
{!> ../../../docs_src/body_multiple_params/tutorial001_an_py310.py!} {!> ../../docs_src/body_multiple_params/tutorial001_an_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="18-20" ```Python hl_lines="18-20"
{!> ../../../docs_src/body_multiple_params/tutorial001_an_py39.py!} {!> ../../docs_src/body_multiple_params/tutorial001_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="19-21" ```Python hl_lines="19-21"
{!> ../../../docs_src/body_multiple_params/tutorial001_an.py!} {!> ../../docs_src/body_multiple_params/tutorial001_an.py!}
``` ```
=== "Python 3.10+ nicht annotiert" ////
//// tab | 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="17-19" ```Python hl_lines="17-19"
{!> ../../../docs_src/body_multiple_params/tutorial001_py310.py!} {!> ../../docs_src/body_multiple_params/tutorial001_py310.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="19-21" ```Python hl_lines="19-21"
{!> ../../../docs_src/body_multiple_params/tutorial001.py!} {!> ../../docs_src/body_multiple_params/tutorial001.py!}
``` ```
!!! note "Hinweis" ////
/// note | "Hinweis"
Beachten Sie, dass in diesem Fall das `item`, welches vom Body genommen wird, optional ist. Da es `None` als Defaultwert hat. Beachten Sie, dass in diesem Fall das `item`, welches vom Body genommen wird, optional ist. Da es `None` als Defaultwert hat.
///
## Mehrere Body-Parameter ## Mehrere Body-Parameter
Im vorherigen Beispiel erwartete die *Pfadoperation* einen JSON-Body mit den Attributen eines `Item`s, etwa: Im vorherigen Beispiel erwartete die *Pfadoperation* einen JSON-Body mit den Attributen eines `Item`s, etwa:
@ -62,18 +81,22 @@ Im vorherigen Beispiel erwartete die *Pfadoperation* einen JSON-Body mit den Att
Aber Sie können auch mehrere Body-Parameter deklarieren, z. B. `item` und `user`: Aber Sie können auch mehrere Body-Parameter deklarieren, z. B. `item` und `user`:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="20" ```Python hl_lines="20"
{!> ../../../docs_src/body_multiple_params/tutorial002_py310.py!} {!> ../../docs_src/body_multiple_params/tutorial002_py310.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="22" ```Python hl_lines="22"
{!> ../../../docs_src/body_multiple_params/tutorial002.py!} {!> ../../docs_src/body_multiple_params/tutorial002.py!}
``` ```
////
In diesem Fall wird **FastAPI** bemerken, dass es mehr als einen Body-Parameter in der Funktion gibt (zwei Parameter, die Pydantic-Modelle sind). In diesem Fall wird **FastAPI** bemerken, dass es mehr als einen Body-Parameter in der Funktion gibt (zwei Parameter, die Pydantic-Modelle sind).
Es wird deshalb die Parameternamen als Schlüssel (Feldnamen) im Body verwenden, und erwartet einen Body wie folgt: Es wird deshalb die Parameternamen als Schlüssel (Feldnamen) im Body verwenden, und erwartet einen Body wie folgt:
@ -93,9 +116,12 @@ Es wird deshalb die Parameternamen als Schlüssel (Feldnamen) im Body verwenden,
} }
``` ```
!!! note "Hinweis" /// note | "Hinweis"
Beachten Sie, dass, obwohl `item` wie zuvor deklariert wurde, es nun unter einem Schlüssel `item` im Body erwartet wird. Beachten Sie, dass, obwohl `item` wie zuvor deklariert wurde, es nun unter einem Schlüssel `item` im Body erwartet wird.
///
**FastAPI** wird die automatische Konvertierung des Requests übernehmen, sodass der Parameter `item` seinen spezifischen Inhalt bekommt, genau so wie der Parameter `user`. **FastAPI** wird die automatische Konvertierung des Requests übernehmen, sodass der Parameter `item` seinen spezifischen Inhalt bekommt, genau so wie der Parameter `user`.
Es wird die Validierung dieser zusammengesetzten Daten übernehmen, und sie im OpenAPI-Schema und der automatischen Dokumentation dokumentieren. Es wird die Validierung dieser zusammengesetzten Daten übernehmen, und sie im OpenAPI-Schema und der automatischen Dokumentation dokumentieren.
@ -110,42 +136,58 @@ Wenn Sie diesen Parameter einfach so hinzufügen, wird **FastAPI** annehmen, das
Aber Sie können **FastAPI** instruieren, ihn als weiteren Body-Schlüssel zu erkennen, indem Sie `Body` verwenden: Aber Sie können **FastAPI** instruieren, ihn als weiteren Body-Schlüssel zu erkennen, indem Sie `Body` verwenden:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="23" ```Python hl_lines="23"
{!> ../../../docs_src/body_multiple_params/tutorial003_an_py310.py!} {!> ../../docs_src/body_multiple_params/tutorial003_an_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="23" ```Python hl_lines="23"
{!> ../../../docs_src/body_multiple_params/tutorial003_an_py39.py!} {!> ../../docs_src/body_multiple_params/tutorial003_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="24" ```Python hl_lines="24"
{!> ../../../docs_src/body_multiple_params/tutorial003_an.py!} {!> ../../docs_src/body_multiple_params/tutorial003_an.py!}
``` ```
=== "Python 3.10+ nicht annotiert" ////
//// tab | 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="20" ```Python hl_lines="20"
{!> ../../../docs_src/body_multiple_params/tutorial003_py310.py!} {!> ../../docs_src/body_multiple_params/tutorial003_py310.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="22" ```Python hl_lines="22"
{!> ../../../docs_src/body_multiple_params/tutorial003.py!} {!> ../../docs_src/body_multiple_params/tutorial003.py!}
``` ```
////
In diesem Fall erwartet **FastAPI** einen Body wie: In diesem Fall erwartet **FastAPI** einen Body wie:
```JSON ```JSON
@ -184,45 +226,64 @@ q: str | None = None
Zum Beispiel: Zum Beispiel:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="27" ```Python hl_lines="27"
{!> ../../../docs_src/body_multiple_params/tutorial004_an_py310.py!} {!> ../../docs_src/body_multiple_params/tutorial004_an_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="27" ```Python hl_lines="27"
{!> ../../../docs_src/body_multiple_params/tutorial004_an_py39.py!} {!> ../../docs_src/body_multiple_params/tutorial004_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="28" ```Python hl_lines="28"
{!> ../../../docs_src/body_multiple_params/tutorial004_an.py!} {!> ../../docs_src/body_multiple_params/tutorial004_an.py!}
``` ```
=== "Python 3.10+ nicht annotiert" ////
//// tab | 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="25" ```Python hl_lines="25"
{!> ../../../docs_src/body_multiple_params/tutorial004_py310.py!} {!> ../../docs_src/body_multiple_params/tutorial004_py310.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="27" ```Python hl_lines="27"
{!> ../../../docs_src/body_multiple_params/tutorial004.py!} {!> ../../docs_src/body_multiple_params/tutorial004.py!}
``` ```
!!! info ////
/// info
`Body` hat die gleichen zusätzlichen Validierungs- und Metadaten-Parameter wie `Query` und `Path` und andere, die Sie später kennenlernen. `Body` hat die gleichen zusätzlichen Validierungs- und Metadaten-Parameter wie `Query` und `Path` und andere, die Sie später kennenlernen.
///
## Einen einzelnen Body-Parameter einbetten ## Einen einzelnen Body-Parameter einbetten
Nehmen wir an, Sie haben nur einen einzelnen `item`-Body-Parameter, ein Pydantic-Modell `Item`. Nehmen wir an, Sie haben nur einen einzelnen `item`-Body-Parameter, ein Pydantic-Modell `Item`.
@ -237,42 +298,58 @@ item: Item = Body(embed=True)
so wie in: so wie in:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="17" ```Python hl_lines="17"
{!> ../../../docs_src/body_multiple_params/tutorial005_an_py310.py!} {!> ../../docs_src/body_multiple_params/tutorial005_an_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="17" ```Python hl_lines="17"
{!> ../../../docs_src/body_multiple_params/tutorial005_an_py39.py!} {!> ../../docs_src/body_multiple_params/tutorial005_an_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="18" ```Python hl_lines="18"
{!> ../../../docs_src/body_multiple_params/tutorial005_an.py!} {!> ../../docs_src/body_multiple_params/tutorial005_an.py!}
``` ```
=== "Python 3.10+ nicht annotiert" ////
//// tab | 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="15" ```Python hl_lines="15"
{!> ../../../docs_src/body_multiple_params/tutorial005_py310.py!} {!> ../../docs_src/body_multiple_params/tutorial005_py310.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
//// 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="17" ```Python hl_lines="17"
{!> ../../../docs_src/body_multiple_params/tutorial005.py!} {!> ../../docs_src/body_multiple_params/tutorial005.py!}
``` ```
////
In diesem Fall erwartet **FastAPI** einen Body wie: In diesem Fall erwartet **FastAPI** einen Body wie:
```JSON hl_lines="2" ```JSON hl_lines="2"

179
docs/de/docs/tutorial/body-nested-models.md

@ -6,18 +6,22 @@ Mit **FastAPI** können Sie (dank Pydantic) beliebig tief verschachtelte Modelle
Sie können ein Attribut als Kindtyp definieren, zum Beispiel eine Python-`list`e. Sie können ein Attribut als Kindtyp definieren, zum Beispiel eine Python-`list`e.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="12" ```Python hl_lines="12"
{!> ../../../docs_src/body_nested_models/tutorial001_py310.py!} {!> ../../docs_src/body_nested_models/tutorial001_py310.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="14" ```Python hl_lines="14"
{!> ../../../docs_src/body_nested_models/tutorial001.py!} {!> ../../docs_src/body_nested_models/tutorial001.py!}
``` ```
////
Das bewirkt, dass `tags` eine Liste ist, wenngleich es nichts über den Typ der Elemente der Liste aussagt. Das bewirkt, dass `tags` eine Liste ist, wenngleich es nichts über den Typ der Elemente der Liste aussagt.
## Listen mit Typ-Parametern als Felder ## Listen mit Typ-Parametern als Felder
@ -31,7 +35,7 @@ In Python 3.9 oder darüber können Sie einfach `list` verwenden, um diese Typan
In Python-Versionen vor 3.9 (3.6 und darüber), müssen Sie zuerst `List` von Pythons Standardmodul `typing` importieren. In Python-Versionen vor 3.9 (3.6 und darüber), müssen Sie zuerst `List` von Pythons Standardmodul `typing` importieren.
```Python hl_lines="1" ```Python hl_lines="1"
{!> ../../../docs_src/body_nested_models/tutorial002.py!} {!> ../../docs_src/body_nested_models/tutorial002.py!}
``` ```
### Eine `list`e mit einem Typ-Parameter deklarieren ### Eine `list`e mit einem Typ-Parameter deklarieren
@ -61,24 +65,30 @@ Verwenden Sie dieselbe Standardsyntax für Modellattribute mit inneren Typen.
In unserem Beispiel können wir also bewirken, dass `tags` spezifisch eine „Liste von Strings“ ist: In unserem Beispiel können wir also bewirken, dass `tags` spezifisch eine „Liste von Strings“ ist:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="12" ```Python hl_lines="12"
{!> ../../../docs_src/body_nested_models/tutorial002_py310.py!} {!> ../../docs_src/body_nested_models/tutorial002_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="14" ```Python hl_lines="14"
{!> ../../../docs_src/body_nested_models/tutorial002_py39.py!} {!> ../../docs_src/body_nested_models/tutorial002_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="14" ```Python hl_lines="14"
{!> ../../../docs_src/body_nested_models/tutorial002.py!} {!> ../../docs_src/body_nested_models/tutorial002.py!}
``` ```
////
## Set-Typen ## Set-Typen
Aber dann denken wir darüber nach und stellen fest, dass sich die Tags nicht wiederholen sollen, es sollen eindeutige Strings sein. Aber dann denken wir darüber nach und stellen fest, dass sich die Tags nicht wiederholen sollen, es sollen eindeutige Strings sein.
@ -87,24 +97,30 @@ Python hat einen Datentyp speziell für Mengen eindeutiger Dinge: das <abbr titl
Deklarieren wir also `tags` als Set von Strings. Deklarieren wir also `tags` als Set von Strings.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="12" ```Python hl_lines="12"
{!> ../../../docs_src/body_nested_models/tutorial003_py310.py!} {!> ../../docs_src/body_nested_models/tutorial003_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="14" ```Python hl_lines="14"
{!> ../../../docs_src/body_nested_models/tutorial003_py39.py!} {!> ../../docs_src/body_nested_models/tutorial003_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="1 14" ```Python hl_lines="1 14"
{!> ../../../docs_src/body_nested_models/tutorial003.py!} {!> ../../docs_src/body_nested_models/tutorial003.py!}
``` ```
////
Jetzt, selbst wenn Sie einen Request mit duplizierten Daten erhalten, werden diese zu einem Set eindeutiger Dinge konvertiert. Jetzt, selbst wenn Sie einen Request mit duplizierten Daten erhalten, werden diese zu einem Set eindeutiger Dinge konvertiert.
Und wann immer Sie diese Daten ausgeben, selbst wenn die Quelle Duplikate hatte, wird es als Set von eindeutigen Dingen ausgegeben. Und wann immer Sie diese Daten ausgeben, selbst wenn die Quelle Duplikate hatte, wird es als Set von eindeutigen Dingen ausgegeben.
@ -125,46 +141,58 @@ Alles das beliebig tief verschachtelt.
Wir können zum Beispiel ein `Image`-Modell definieren. Wir können zum Beispiel ein `Image`-Modell definieren.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="7-9" ```Python hl_lines="7-9"
{!> ../../../docs_src/body_nested_models/tutorial004_py310.py!} {!> ../../docs_src/body_nested_models/tutorial004_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="9-11" ```Python hl_lines="9-11"
{!> ../../../docs_src/body_nested_models/tutorial004_py39.py!} {!> ../../docs_src/body_nested_models/tutorial004_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="9-11" ```Python hl_lines="9-11"
{!> ../../../docs_src/body_nested_models/tutorial004.py!} {!> ../../docs_src/body_nested_models/tutorial004.py!}
``` ```
////
### Das Kindmodell als Typ verwenden ### Das Kindmodell als Typ verwenden
Und dann können wir es als Typ eines Attributes verwenden. Und dann können wir es als Typ eines Attributes verwenden.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="18" ```Python hl_lines="18"
{!> ../../../docs_src/body_nested_models/tutorial004_py310.py!} {!> ../../docs_src/body_nested_models/tutorial004_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="20" ```Python hl_lines="20"
{!> ../../../docs_src/body_nested_models/tutorial004_py39.py!} {!> ../../docs_src/body_nested_models/tutorial004_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="20" ```Python hl_lines="20"
{!> ../../../docs_src/body_nested_models/tutorial004.py!} {!> ../../docs_src/body_nested_models/tutorial004.py!}
``` ```
////
Das würde bedeuten, dass **FastAPI** einen Body erwartet wie: Das würde bedeuten, dass **FastAPI** einen Body erwartet wie:
```JSON ```JSON
@ -196,48 +224,60 @@ Um alle Optionen kennenzulernen, die Sie haben, schauen Sie sich <a href="https:
Da wir zum Beispiel im `Image`-Modell ein Feld `url` haben, können wir deklarieren, dass das eine Instanz von Pydantics `HttpUrl` sein soll, anstelle eines `str`: Da wir zum Beispiel im `Image`-Modell ein Feld `url` haben, können wir deklarieren, dass das eine Instanz von Pydantics `HttpUrl` sein soll, anstelle eines `str`:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="2 8" ```Python hl_lines="2 8"
{!> ../../../docs_src/body_nested_models/tutorial005_py310.py!} {!> ../../docs_src/body_nested_models/tutorial005_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="4 10" ```Python hl_lines="4 10"
{!> ../../../docs_src/body_nested_models/tutorial005_py39.py!} {!> ../../docs_src/body_nested_models/tutorial005_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="4 10" ```Python hl_lines="4 10"
{!> ../../../docs_src/body_nested_models/tutorial005.py!} {!> ../../docs_src/body_nested_models/tutorial005.py!}
``` ```
////
Es wird getestet, ob der String eine gültige URL ist, und als solche wird er in JSON Schema / OpenAPI dokumentiert. Es wird getestet, ob der String eine gültige URL ist, und als solche wird er in JSON Schema / OpenAPI dokumentiert.
## Attribute mit Listen von Kindmodellen ## Attribute mit Listen von Kindmodellen
Sie können Pydantic-Modelle auch als Typen innerhalb von `list`, `set`, usw. verwenden: Sie können Pydantic-Modelle auch als Typen innerhalb von `list`, `set`, usw. verwenden:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="18" ```Python hl_lines="18"
{!> ../../../docs_src/body_nested_models/tutorial006_py310.py!} {!> ../../docs_src/body_nested_models/tutorial006_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="20" ```Python hl_lines="20"
{!> ../../../docs_src/body_nested_models/tutorial006_py39.py!} {!> ../../docs_src/body_nested_models/tutorial006_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="20" ```Python hl_lines="20"
{!> ../../../docs_src/body_nested_models/tutorial006.py!} {!> ../../docs_src/body_nested_models/tutorial006.py!}
``` ```
////
Das wird einen JSON-Body erwarten (konvertieren, validieren, dokumentieren), wie: Das wird einen JSON-Body erwarten (konvertieren, validieren, dokumentieren), wie:
```JSON hl_lines="11" ```JSON hl_lines="11"
@ -264,34 +304,46 @@ Das wird einen JSON-Body erwarten (konvertieren, validieren, dokumentieren), wie
} }
``` ```
!!! info /// info
Beachten Sie, dass der `images`-Schlüssel jetzt eine Liste von Bild-Objekten hat. Beachten Sie, dass der `images`-Schlüssel jetzt eine Liste von Bild-Objekten hat.
///
## Tief verschachtelte Modelle ## Tief verschachtelte Modelle
Sie können beliebig tief verschachtelte Modelle definieren: Sie können beliebig tief verschachtelte Modelle definieren:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="7 12 18 21 25" ```Python hl_lines="7 12 18 21 25"
{!> ../../../docs_src/body_nested_models/tutorial007_py310.py!} {!> ../../docs_src/body_nested_models/tutorial007_py310.py!}
``` ```
=== "Python 3.9+" ////
//// tab | Python 3.9+
```Python hl_lines="9 14 20 23 27" ```Python hl_lines="9 14 20 23 27"
{!> ../../../docs_src/body_nested_models/tutorial007_py39.py!} {!> ../../docs_src/body_nested_models/tutorial007_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="9 14 20 23 27" ```Python hl_lines="9 14 20 23 27"
{!> ../../../docs_src/body_nested_models/tutorial007.py!} {!> ../../docs_src/body_nested_models/tutorial007.py!}
``` ```
!!! info ////
/// info
Beachten Sie, wie `Offer` eine Liste von `Item`s hat, von denen jedes seinerseits eine optionale Liste von `Image`s hat. Beachten Sie, wie `Offer` eine Liste von `Item`s hat, von denen jedes seinerseits eine optionale Liste von `Image`s hat.
///
## Bodys aus reinen Listen ## Bodys aus reinen Listen
Wenn Sie möchten, dass das äußerste Element des JSON-Bodys ein JSON-`array` (eine Python-`list`e) ist, können Sie den Typ im Funktionsparameter deklarieren, mit der gleichen Syntax wie in Pydantic-Modellen: Wenn Sie möchten, dass das äußerste Element des JSON-Bodys ein JSON-`array` (eine Python-`list`e) ist, können Sie den Typ im Funktionsparameter deklarieren, mit der gleichen Syntax wie in Pydantic-Modellen:
@ -308,18 +360,22 @@ images: list[Image]
so wie in: so wie in:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="13" ```Python hl_lines="13"
{!> ../../../docs_src/body_nested_models/tutorial008_py39.py!} {!> ../../docs_src/body_nested_models/tutorial008_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="15" ```Python hl_lines="15"
{!> ../../../docs_src/body_nested_models/tutorial008.py!} {!> ../../docs_src/body_nested_models/tutorial008.py!}
``` ```
////
## Editor-Unterstützung überall ## Editor-Unterstützung überall
Und Sie erhalten Editor-Unterstützung überall. Und Sie erhalten Editor-Unterstützung überall.
@ -348,19 +404,24 @@ Das schauen wir uns mal an.
Im folgenden Beispiel akzeptieren Sie irgendein `dict`, solange es `int`-Schlüssel und `float`-Werte hat. Im folgenden Beispiel akzeptieren Sie irgendein `dict`, solange es `int`-Schlüssel und `float`-Werte hat.
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="7" ```Python hl_lines="7"
{!> ../../../docs_src/body_nested_models/tutorial009_py39.py!} {!> ../../docs_src/body_nested_models/tutorial009_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="9" ```Python hl_lines="9"
{!> ../../../docs_src/body_nested_models/tutorial009.py!} {!> ../../docs_src/body_nested_models/tutorial009.py!}
``` ```
!!! tip "Tipp" ////
/// tip | "Tipp"
Bedenken Sie, dass JSON nur `str` als Schlüssel unterstützt. Bedenken Sie, dass JSON nur `str` als Schlüssel unterstützt.
Aber Pydantic hat automatische Datenkonvertierung. Aber Pydantic hat automatische Datenkonvertierung.
@ -369,6 +430,8 @@ Im folgenden Beispiel akzeptieren Sie irgendein `dict`, solange es `int`-Schlüs
Und das `dict` welches Sie als `weights` erhalten, wird `int`-Schlüssel und `float`-Werte haben. Und das `dict` welches Sie als `weights` erhalten, wird `int`-Schlüssel und `float`-Werte haben.
///
## Zusammenfassung ## Zusammenfassung
Mit **FastAPI** haben Sie die maximale Flexibilität von Pydantic-Modellen, während Ihr Code einfach, kurz und elegant bleibt. Mit **FastAPI** haben Sie die maximale Flexibilität von Pydantic-Modellen, während Ihr Code einfach, kurz und elegant bleibt.

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save