Browse Source

๐Ÿ”ง Update docs setup with latest configs and plugins (#11953)

pull/11956/head
Sebastiรกn Ramรญrez 10 months ago
committed by GitHub
parent
commit
0cd844d387
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 23
      .github/workflows/build-docs.yml
  2. 303
      docs/bn/docs/python-types.md
  3. 51
      docs/de/docs/advanced/additional-responses.md
  4. 84
      docs/de/docs/advanced/additional-status-codes.md
  5. 161
      docs/de/docs/advanced/advanced-dependencies.md
  6. 28
      docs/de/docs/advanced/async-tests.md
  7. 51
      docs/de/docs/advanced/behind-a-proxy.md
  8. 87
      docs/de/docs/advanced/custom-response.md
  9. 11
      docs/de/docs/advanced/dataclasses.md
  10. 47
      docs/de/docs/advanced/events.md
  11. 87
      docs/de/docs/advanced/generate-clients.md
  12. 9
      docs/de/docs/advanced/index.md
  13. 9
      docs/de/docs/advanced/middleware.md
  14. 39
      docs/de/docs/advanced/openapi-callbacks.md
  15. 14
      docs/de/docs/advanced/openapi-webhooks.md
  16. 102
      docs/de/docs/advanced/path-operation-advanced-configuration.md
  17. 22
      docs/de/docs/advanced/response-cookies.md
  18. 16
      docs/de/docs/advanced/response-directly.md
  19. 11
      docs/de/docs/advanced/response-headers.md
  20. 111
      docs/de/docs/advanced/security/http-basic-auth.md
  21. 9
      docs/de/docs/advanced/security/index.md
  22. 724
      docs/de/docs/advanced/security/oauth2-scopes.md
  23. 299
      docs/de/docs/advanced/settings.md
  24. 25
      docs/de/docs/advanced/templates.md
  25. 82
      docs/de/docs/advanced/testing-dependencies.md
  26. 7
      docs/de/docs/advanced/testing-websockets.md
  27. 20
      docs/de/docs/advanced/using-request-directly.md
  28. 120
      docs/de/docs/advanced/websockets.md
  29. 227
      docs/de/docs/alternatives.md
  30. 32
      docs/de/docs/async.md
  31. 177
      docs/de/docs/contributing.md
  32. 34
      docs/de/docs/deployment/concepts.md
  33. 74
      docs/de/docs/deployment/docker.md
  34. 21
      docs/de/docs/deployment/https.md
  35. 90
      docs/de/docs/deployment/manually.md
  36. 9
      docs/de/docs/deployment/server-workers.md
  37. 14
      docs/de/docs/deployment/versions.md
  38. 14
      docs/de/docs/external-links.md
  39. 9
      docs/de/docs/features.md
  40. 20
      docs/de/docs/help-fastapi.md
  41. 22
      docs/de/docs/how-to/custom-docs-ui-assets.md
  42. 40
      docs/de/docs/how-to/custom-request-and-route.md
  43. 7
      docs/de/docs/how-to/extending-openapi.md
  44. 18
      docs/de/docs/how-to/graphql.md
  45. 7
      docs/de/docs/how-to/index.md
  46. 211
      docs/de/docs/how-to/separate-openapi-schemas.md
  47. 303
      docs/de/docs/python-types.md
  48. 7
      docs/de/docs/reference/index.md
  49. 7
      docs/de/docs/reference/request.md
  50. 7
      docs/de/docs/reference/websockets.md
  51. 64
      docs/de/docs/tutorial/background-tasks.md
  52. 181
      docs/de/docs/tutorial/bigger-applications.md
  53. 162
      docs/de/docs/tutorial/body-fields.md
  54. 297
      docs/de/docs/tutorial/body-multiple-params.md
  55. 297
      docs/de/docs/tutorial/body-nested-models.md
  56. 171
      docs/de/docs/tutorial/body-updates.md
  57. 159
      docs/de/docs/tutorial/body.md
  58. 144
      docs/de/docs/tutorial/cookie-params.md
  59. 619
      docs/de/docs/tutorial/dependencies/classes-as-dependencies.md
  60. 168
      docs/de/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
  61. 222
      docs/de/docs/tutorial/dependencies/dependencies-with-yield.md
  62. 37
      docs/de/docs/tutorial/dependencies/global-dependencies.md
  63. 265
      docs/de/docs/tutorial/dependencies/index.md
  64. 243
      docs/de/docs/tutorial/dependencies/sub-dependencies.md
  65. 27
      docs/de/docs/tutorial/encoder.md
  66. 128
      docs/de/docs/tutorial/extra-data-types.md
  67. 132
      docs/de/docs/tutorial/extra-models.md
  68. 64
      docs/de/docs/tutorial/first-steps.md
  69. 36
      docs/de/docs/tutorial/handling-errors.md
  70. 296
      docs/de/docs/tutorial/header-params.md
  71. 25
      docs/de/docs/tutorial/index.md
  72. 21
      docs/de/docs/tutorial/metadata.md
  73. 27
      docs/de/docs/tutorial/middleware.md
  74. 182
      docs/de/docs/tutorial/path-operation-configuration.md
  75. 356
      docs/de/docs/tutorial/path-params-numeric-validations.md
  76. 66
      docs/de/docs/tutorial/path-params.md
  77. 1067
      docs/de/docs/tutorial/query-params-str-validations.md
  78. 94
      docs/de/docs/tutorial/query-params.md
  79. 390
      docs/de/docs/tutorial/request-files.md
  80. 92
      docs/de/docs/tutorial/request-forms-and-files.md
  81. 117
      docs/de/docs/tutorial/request-forms.md
  82. 412
      docs/de/docs/tutorial/response-model.md
  83. 46
      docs/de/docs/tutorial/response-status-code.md
  84. 324
      docs/de/docs/tutorial/schema-extra-example.md
  85. 180
      docs/de/docs/tutorial/security/first-steps.md
  86. 375
      docs/de/docs/tutorial/security/get-current-user.md
  87. 15
      docs/de/docs/tutorial/security/index.md
  88. 308
      docs/de/docs/tutorial/security/oauth2-jwt.md
  89. 412
      docs/de/docs/tutorial/security/simple-oauth2.md
  90. 9
      docs/de/docs/tutorial/static-files.md
  91. 109
      docs/de/docs/tutorial/testing.md
  92. 51
      docs/em/docs/advanced/additional-responses.md
  93. 20
      docs/em/docs/advanced/additional-status-codes.md
  94. 13
      docs/em/docs/advanced/advanced-dependencies.md
  95. 21
      docs/em/docs/advanced/async-tests.md
  96. 51
      docs/em/docs/advanced/behind-a-proxy.md
  97. 87
      docs/em/docs/advanced/custom-response.md
  98. 11
      docs/em/docs/advanced/dataclasses.md
  99. 45
      docs/em/docs/advanced/events.md
  100. 67
      docs/em/docs/advanced/generate-clients.md

23
.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

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

@ -12,8 +12,11 @@ Python-เฆ เฆเฆšเงเฆ›เฆฟเฆ• "เฆŸเฆพเฆ‡เฆช เฆนเฆฟเฆจเงเฆŸ" (เฆฏเฆพ "เฆŸเฆพเฆ‡
เฆคเฆฌเง‡, เฆ†เฆชเฆจเฆฟ เฆฏเฆฆเฆฟ เฆ•เฆ–เฆจเง‹ **FastAPI** เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆจเฆพเฆ“ เฆ•เฆฐเง‡เฆจ, เฆคเฆฌเงเฆ“ เฆเฆ—เงเฆฒเฆฟ เฆธเฆฎเงเฆชเฆฐเงเฆ•เง‡ เฆเฆ•เฆŸเง เฆถเง‡เฆ–เฆพ เฆ†เฆชเฆจเฆพเฆฐ เฆ‰เฆชเฆ•เฆพเฆฐเง‡ เฆ†เฆธเฆฌเง‡เฅค เฆคเฆฌเง‡, เฆ†เฆชเฆจเฆฟ เฆฏเฆฆเฆฟ เฆ•เฆ–เฆจเง‹ **FastAPI** เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆจเฆพเฆ“ เฆ•เฆฐเง‡เฆจ, เฆคเฆฌเงเฆ“ เฆเฆ—เงเฆฒเฆฟ เฆธเฆฎเงเฆชเฆฐเงเฆ•เง‡ เฆเฆ•เฆŸเง เฆถเง‡เฆ–เฆพ เฆ†เฆชเฆจเฆพเฆฐ เฆ‰เฆชเฆ•เฆพเฆฐเง‡ เฆ†เฆธเฆฌเง‡เฅค
!!! Note /// note
เฆฏเฆฆเฆฟ เฆ†เฆชเฆจเฆฟ เฆเฆ•เฆœเฆจ Python เฆฌเฆฟเฆถเง‡เฆทเฆœเงเฆž เฆนเฆจ, เฆเฆฌเฆ‚ เฆŸเฆพเฆ‡เฆช เฆนเฆฟเฆจเงเฆŸ เฆธเฆฎเงเฆชเฆฐเงเฆ•เง‡ เฆธเฆฌเฆ•เฆฟเฆ›เง เฆœเฆพเฆจเง‡เฆจ, เฆคเฆพเฆนเฆฒเง‡ เฆชเฆฐเฆฌเฆฐเงเฆคเง€ เฆ…เฆงเงเฆฏเฆพเฆฏเฆผเง‡ เฆšเฆฒเง‡ เฆฏเฆพเฆจเฅค
เฆฏเฆฆเฆฟ เฆ†เฆชเฆจเฆฟ เฆเฆ•เฆœเฆจ Python เฆฌเฆฟเฆถเง‡เฆทเฆœเงเฆž เฆนเฆจ, เฆเฆฌเฆ‚ เฆŸเฆพเฆ‡เฆช เฆนเฆฟเฆจเงเฆŸ เฆธเฆฎเงเฆชเฆฐเงเฆ•เง‡ เฆธเฆฌเฆ•เฆฟเฆ›เง เฆœเฆพเฆจเง‡เฆจ, เฆคเฆพเฆนเฆฒเง‡ เฆชเฆฐเฆฌเฆฐเงเฆคเง€ เฆ…เฆงเงเฆฏเฆพเฆฏเฆผเง‡ เฆšเฆฒเง‡ เฆฏเฆพเฆจเฅค
///
## เฆชเงเฆฐเง‡เฆฐเฆฃเฆพ ## เฆชเงเฆฐเง‡เฆฐเฆฃเฆพ
@ -170,45 +173,55 @@ Python เฆฏเฆค เฆเฆ—เฆฟเฆฏเฆผเง‡ เฆฏเฆพเฆšเงเฆ›เง‡, **เฆจเฆคเงเฆจ เฆธเฆ‚เฆธเง
เฆ‰เฆฆเฆพเฆนเฆฐเฆฃเฆธเงเฆฌเฆฐเง‚เฆช, เฆเฆ•เฆŸเฆฟ เฆญเง‡เฆฐเฆฟเฆฏเฆผเง‡เฆฌเฆฒเฆ•เง‡ `str`-เฆเฆฐ เฆเฆ•เฆŸเฆฟ `list` เฆนเฆฟเฆธเง‡เฆฌเง‡ เฆธเฆ‚เฆœเงเฆžเฆพเฆฏเฆผเฆฟเฆค เฆ•เฆฐเฆพ เฆฏเฆพเฆ•เฅค เฆ‰เฆฆเฆพเฆนเฆฐเฆฃเฆธเงเฆฌเฆฐเง‚เฆช, เฆเฆ•เฆŸเฆฟ เฆญเง‡เฆฐเฆฟเฆฏเฆผเง‡เฆฌเฆฒเฆ•เง‡ `str`-เฆเฆฐ เฆเฆ•เฆŸเฆฟ `list` เฆนเฆฟเฆธเง‡เฆฌเง‡ เฆธเฆ‚เฆœเงเฆžเฆพเฆฏเฆผเฆฟเฆค เฆ•เฆฐเฆพ เฆฏเฆพเฆ•เฅค
=== "Python 3.9+" //// tab | Python 3.9+
เฆญเง‡เฆฐเฆฟเฆฏเฆผเง‡เฆฌเฆฒเฆŸเฆฟ เฆ˜เง‹เฆทเฆฃเฆพ เฆ•เฆฐเงเฆจ, เฆเฆ•เฆ‡ เฆ•เง‹เฆฒเฆจ (`:`) เฆธเฆฟเฆจเฆŸเงเฆฏเฆพเฆ•เงเฆธ เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆ•เฆฐเง‡เฅค เฆญเง‡เฆฐเฆฟเฆฏเฆผเง‡เฆฌเฆฒเฆŸเฆฟ เฆ˜เง‹เฆทเฆฃเฆพ เฆ•เฆฐเงเฆจ, เฆเฆ•เฆ‡ เฆ•เง‹เฆฒเฆจ (`:`) เฆธเฆฟเฆจเฆŸเงเฆฏเฆพเฆ•เงเฆธ เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆ•เฆฐเง‡เฅค
เฆŸเฆพเฆ‡เฆช เฆนเฆฟเฆธเง‡เฆฌเง‡, `list` เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆ•เฆฐเงเฆจเฅค เฆŸเฆพเฆ‡เฆช เฆนเฆฟเฆธเง‡เฆฌเง‡, `list` เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆ•เฆฐเงเฆจเฅค
เฆฏเง‡เฆนเง‡เฆคเง เฆฒเฆฟเฆธเงเฆŸ เฆเฆฎเฆจ เฆเฆ•เฆŸเฆฟ เฆŸเฆพเฆ‡เฆช เฆฏเฆพ เฆ…เฆญเงเฆฏเฆจเงเฆคเฆฐเง€เฆฃ เฆŸเฆพเฆ‡เฆชเฆ—เงเฆฒเฆฟ เฆงเฆพเฆฐเฆฃ เฆ•เฆฐเง‡, เฆ†เฆชเฆจเฆฟ เฆคเฆพเฆฆเง‡เฆฐ เฆธเงเฆ•เง‹เฆฏเฆผเฆพเฆฐ เฆฌเงเฆฐเฆพเฆ•เง‡เฆŸเง‡เฆฐ เฆญเฆฟเฆคเฆฐเง‡ เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆ•เฆฐเงเฆจ: เฆฏเง‡เฆนเง‡เฆคเง เฆฒเฆฟเฆธเงเฆŸ เฆเฆฎเฆจ เฆเฆ•เฆŸเฆฟ เฆŸเฆพเฆ‡เฆช เฆฏเฆพ เฆ…เฆญเงเฆฏเฆจเงเฆคเฆฐเง€เฆฃ เฆŸเฆพเฆ‡เฆชเฆ—เงเฆฒเฆฟ เฆงเฆพเฆฐเฆฃ เฆ•เฆฐเง‡, เฆ†เฆชเฆจเฆฟ เฆคเฆพเฆฆเง‡เฆฐ เฆธเงเฆ•เง‹เฆฏเฆผเฆพเฆฐ เฆฌเงเฆฐเฆพเฆ•เง‡เฆŸเง‡เฆฐ เฆญเฆฟเฆคเฆฐเง‡ เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆ•เฆฐเงเฆจ:
```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+" ////
`typing` เฆฅเง‡เฆ•เง‡ `List` (เฆฌเฆกเฆผ เฆนเฆพเฆคเง‡เฆฐ `L` เฆฆเฆฟเฆฏเฆผเง‡) เฆ‡เฆฎเฆชเง‹เฆฐเงเฆŸ เฆ•เฆฐเงเฆจ: //// tab | Python 3.8+
``` Python hl_lines="1" `typing` เฆฅเง‡เฆ•เง‡ `List` (เฆฌเฆกเฆผ เฆนเฆพเฆคเง‡เฆฐ `L` เฆฆเฆฟเฆฏเฆผเง‡) เฆ‡เฆฎเฆชเง‹เฆฐเงเฆŸ เฆ•เฆฐเงเฆจ:
{!> ../../../docs_src/python_types/tutorial006.py!}
```
เฆญเง‡เฆฐเฆฟเฆฏเฆผเง‡เฆฌเฆฒเฆŸเฆฟ เฆ˜เง‹เฆทเฆฃเฆพ เฆ•เฆฐเงเฆจ, เฆเฆ•เฆ‡ เฆ•เง‹เฆฒเฆจ (`:`) เฆธเฆฟเฆจเฆŸเงเฆฏเฆพเฆ•เงเฆธ เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆ•เฆฐเง‡เฅค ``` Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial006.py!}
```
เฆŸเฆพเฆ‡เฆช เฆนเฆฟเฆธเง‡เฆฌเง‡, `typing` เฆฅเง‡เฆ•เง‡ เฆ†เฆชเฆจเฆพเฆฐ เฆ‡เฆฎเงเฆชเง‹เฆฐเงเฆŸ เฆ•เฆฐเฆพ `List` เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆ•เฆฐเงเฆจเฅค เฆญเง‡เฆฐเฆฟเฆฏเฆผเง‡เฆฌเฆฒเฆŸเฆฟ เฆ˜เง‹เฆทเฆฃเฆพ เฆ•เฆฐเงเฆจ, เฆเฆ•เฆ‡ เฆ•เง‹เฆฒเฆจ (`:`) เฆธเฆฟเฆจเฆŸเงเฆฏเฆพเฆ•เงเฆธ เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆ•เฆฐเง‡เฅค
เฆŸเฆพเฆ‡เฆช เฆนเฆฟเฆธเง‡เฆฌเง‡, `typing` เฆฅเง‡เฆ•เง‡ เฆ†เฆชเฆจเฆพเฆฐ เฆ‡เฆฎเงเฆชเง‹เฆฐเงเฆŸ เฆ•เฆฐเฆพ `List` เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆ•เฆฐเงเฆจเฅค
เฆฏเง‡เฆนเง‡เฆคเง เฆฒเฆฟเฆธเงเฆŸ เฆเฆฎเฆจ เฆเฆ•เฆŸเฆฟ เฆŸเฆพเฆ‡เฆช เฆฏเฆพ เฆ…เฆญเงเฆฏเฆจเงเฆคเฆฐเง€เฆฃ เฆŸเฆพเฆ‡เฆชเฆ—เงเฆฒเฆฟ เฆงเฆพเฆฐเฆฃ เฆ•เฆฐเง‡, เฆ†เฆชเฆจเฆฟ เฆคเฆพเฆฆเง‡เฆฐ เฆธเงเฆ•เง‹เฆฏเฆผเฆพเฆฐ เฆฌเงเฆฐเฆพเฆ•เง‡เฆŸเง‡เฆฐ เฆญเฆฟเฆคเฆฐเง‡ เฆ•เฆฐเงเฆจ:
```Python hl_lines="4"
{!> ../../../docs_src/python_types/tutorial006.py!}
```
เฆฏเง‡เฆนเง‡เฆคเง เฆฒเฆฟเฆธเงเฆŸ เฆเฆฎเฆจ เฆเฆ•เฆŸเฆฟ เฆŸเฆพเฆ‡เฆช เฆฏเฆพ เฆ…เฆญเงเฆฏเฆจเงเฆคเฆฐเง€เฆฃ เฆŸเฆพเฆ‡เฆชเฆ—เงเฆฒเฆฟ เฆงเฆพเฆฐเฆฃ เฆ•เฆฐเง‡, เฆ†เฆชเฆจเฆฟ เฆคเฆพเฆฆเง‡เฆฐ เฆธเงเฆ•เง‹เฆฏเฆผเฆพเฆฐ เฆฌเงเฆฐเฆพเฆ•เง‡เฆŸเง‡เฆฐ เฆญเฆฟเฆคเฆฐเง‡ เฆ•เฆฐเงเฆจ: ////
```Python hl_lines="4" /// info
{!> ../../../docs_src/python_types/tutorial006.py!}
```
!!! 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` เฆ“เฆ‡ เฆŸเฆพเฆ‡เฆชเง‡เฆฐ เฆชเฆฐเฆฟเฆฌเฆฐเงเฆคเง‡ เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆ•เฆฐเฆคเง‡ เฆชเฆพเฆฐเง‡เฆจเฅค
///
เฆเฆฐ เฆฎเฆพเฆงเงเฆฏเฆฎเง‡, เฆ†เฆชเฆจเฆพเฆฐ เฆเฆกเฆฟเฆŸเฆฐ เฆฒเฆฟเฆธเงเฆŸ เฆฅเง‡เฆ•เง‡ เฆ†เฆ‡เฆŸเง‡เฆฎ เฆชเงเฆฐเฆธเง‡เฆธ เฆ•เฆฐเฆพเฆฐ เฆธเฆฎเฆฏเฆผ เฆธเฆพเฆชเง‹เฆฐเงเฆŸ เฆชเงเฆฐเฆฆเฆพเฆจ เฆ•เฆฐเฆคเง‡ เฆชเฆพเฆฐเฆฌเง‡: เฆเฆฐ เฆฎเฆพเฆงเงเฆฏเฆฎเง‡, เฆ†เฆชเฆจเฆพเฆฐ เฆเฆกเฆฟเฆŸเฆฐ เฆฒเฆฟเฆธเงเฆŸ เฆฅเง‡เฆ•เง‡ เฆ†เฆ‡เฆŸเง‡เฆฎ เฆชเงเฆฐเฆธเง‡เฆธ เฆ•เฆฐเฆพเฆฐ เฆธเฆฎเฆฏเฆผ เฆธเฆพเฆชเง‹เฆฐเงเฆŸ เฆชเงเฆฐเฆฆเฆพเฆจ เฆ•เฆฐเฆคเง‡ เฆชเฆพเฆฐเฆฌเง‡:
@ -224,17 +237,21 @@ Python เฆฏเฆค เฆเฆ—เฆฟเฆฏเฆผเง‡ เฆฏเฆพเฆšเงเฆ›เง‡, **เฆจเฆคเงเฆจ เฆธเฆ‚เฆธเง
เฆ†เฆชเฆจเฆฟ `tuple` เฆเฆฌเฆ‚ `set` เฆ˜เง‹เฆทเฆฃเฆพ เฆ•เฆฐเฆพเฆฐ เฆœเฆจเงเฆฏ เฆเฆ•เฆ‡ เฆชเงเฆฐเฆ•เงเฆฐเฆฟเฆฏเฆผเฆพ เฆ…เฆจเงเฆธเฆฐเฆฃ เฆ•เฆฐเฆฌเง‡เฆจ: เฆ†เฆชเฆจเฆฟ `tuple` เฆเฆฌเฆ‚ `set` เฆ˜เง‹เฆทเฆฃเฆพ เฆ•เฆฐเฆพเฆฐ เฆœเฆจเงเฆฏ เฆเฆ•เฆ‡ เฆชเงเฆฐเฆ•เงเฆฐเฆฟเฆฏเฆผเฆพ เฆ…เฆจเงเฆธเฆฐเฆฃ เฆ•เฆฐเฆฌเง‡เฆจ:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial007_py39.py!}
```
```Python hl_lines="1" ////
{!> ../../../docs_src/python_types/tutorial007_py39.py!}
```
=== "Python 3.8+" //// tab | Python 3.8+
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial007.py!} {!> ../../../docs_src/python_types/tutorial007.py!}
``` ```
////
เฆเฆฐ เฆฎเฆพเฆจเง‡ เฆนเฆฒ: เฆเฆฐ เฆฎเฆพเฆจเง‡ เฆนเฆฒ:
@ -249,18 +266,21 @@ Python เฆฏเฆค เฆเฆ—เฆฟเฆฏเฆผเง‡ เฆฏเฆพเฆšเงเฆ›เง‡, **เฆจเฆคเงเฆจ เฆธเฆ‚เฆธเง
เฆฆเงเฆฌเฆฟเฆคเง€เฆฏเฆผ เฆŸเฆพเฆ‡เฆช เฆชเงเฆฏเฆพเฆฐเฆพเฆฎเฆฟเฆŸเฆพเฆฐเฆŸเฆฟ เฆนเฆฒ `dict`-เฆเฆฐ เฆฎเฆพเฆจเฆ—เงเฆฒเฆฟเฆฐ เฆœเฆจเงเฆฏ: เฆฆเงเฆฌเฆฟเฆคเง€เฆฏเฆผ เฆŸเฆพเฆ‡เฆช เฆชเงเฆฏเฆพเฆฐเฆพเฆฎเฆฟเฆŸเฆพเฆฐเฆŸเฆฟ เฆนเฆฒ `dict`-เฆเฆฐ เฆฎเฆพเฆจเฆ—เงเฆฒเฆฟเฆฐ เฆœเฆจเงเฆฏ:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial008_py39.py!}
```
```Python hl_lines="1" ////
{!> ../../../docs_src/python_types/tutorial008_py39.py!}
```
=== "Python 3.8+" //// tab | Python 3.8+
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial008.py!} {!> ../../../docs_src/python_types/tutorial008.py!}
``` ```
////
เฆเฆฐ เฆฎเฆพเฆจเง‡ เฆนเฆฒ: เฆเฆฐ เฆฎเฆพเฆจเง‡ เฆนเฆฒ:
@ -276,17 +296,21 @@ 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"
{!> ../../../docs_src/python_types/tutorial008b_py310.py!}
```
////
```Python hl_lines="1" //// tab | Python 3.8+
{!> ../../../docs_src/python_types/tutorial008b_py310.py!}
```
=== "Python 3.8+" ```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial008b.py!}
```
```Python hl_lines="1 4" ////
{!> ../../../docs_src/python_types/tutorial008b.py!}
```
เฆ‰เฆญเฆฏเฆผ เฆ•เงเฆทเง‡เฆคเงเฆฐเง‡เฆ‡ เฆเฆฐ เฆฎเฆพเฆจเง‡ เฆนเฆฒ เฆฏเง‡ `item` เฆนเฆคเง‡ เฆชเฆพเฆฐเง‡ เฆเฆ•เฆŸเฆฟ `int` เฆ…เฆฅเฆฌเฆพ `str`เฅค เฆ‰เฆญเฆฏเฆผ เฆ•เงเฆทเง‡เฆคเงเฆฐเง‡เฆ‡ เฆเฆฐ เฆฎเฆพเฆจเง‡ เฆนเฆฒ เฆฏเง‡ `item` เฆนเฆคเง‡ เฆชเฆพเฆฐเง‡ เฆเฆ•เฆŸเฆฟ `int` เฆ…เฆฅเฆฌเฆพ `str`เฅค
@ -306,23 +330,29 @@ 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+" ////
```Python hl_lines="1 4" //// tab | Python 3.8+
{!> ../../../docs_src/python_types/tutorial009.py!}
```
=== "Python 3.8+ เฆฌเฆฟเฆ•เฆฒเงเฆช" ```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial009.py!}
```
```Python hl_lines="1 4" ////
{!> ../../../docs_src/python_types/tutorial009b.py!}
``` //// tab | Python 3.8+ เฆฌเฆฟเฆ•เฆฒเงเฆช
```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial009b.py!}
```
////
#### `Union` เฆฌเฆพ `Optional` เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ #### `Union` เฆฌเฆพ `Optional` เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ
@ -367,46 +397,53 @@ say_hi(name=None) # เฆเฆŸเฆฟ เฆ•เฆพเฆœ เฆ•เฆฐเง‡, None เฆฌเงˆเฆง ๐ŸŽ‰
เฆธเงเฆ•เง‹เฆฏเฆผเฆพเฆฐ เฆฌเงเฆฐเงเฆฏเฆพเฆ•เง‡เฆŸเง‡ เฆŸเฆพเฆ‡เฆช เฆชเงเฆฏเฆพเฆฐเฆพเฆฎเฆฟเฆŸเฆพเฆฐ เฆจเง‡เฆ“เฆฏเฆผเฆพ เฆเฆ‡ เฆŸเฆพเฆ‡เฆชเฆ—เงเฆฒเฆฟเฆ•เง‡ **เฆœเง‡เฆจเง‡เฆฐเฆฟเฆ• เฆŸเฆพเฆ‡เฆช** เฆฌเฆพ **เฆœเง‡เฆจเง‡เฆฐเฆฟเฆ•เฆธ** เฆฌเฆฒเฆพ เฆนเฆฏเฆผ, เฆฏเง‡เฆฎเฆจ: เฆธเงเฆ•เง‹เฆฏเฆผเฆพเฆฐ เฆฌเงเฆฐเงเฆฏเฆพเฆ•เง‡เฆŸเง‡ เฆŸเฆพเฆ‡เฆช เฆชเงเฆฏเฆพเฆฐเฆพเฆฎเฆฟเฆŸเฆพเฆฐ เฆจเง‡เฆ“เฆฏเฆผเฆพ เฆเฆ‡ เฆŸเฆพเฆ‡เฆชเฆ—เงเฆฒเฆฟเฆ•เง‡ **เฆœเง‡เฆจเง‡เฆฐเฆฟเฆ• เฆŸเฆพเฆ‡เฆช** เฆฌเฆพ **เฆœเง‡เฆจเง‡เฆฐเฆฟเฆ•เฆธ** เฆฌเฆฒเฆพ เฆนเฆฏเฆผ, เฆฏเง‡เฆฎเฆจ:
=== "Python 3.10+" //// tab | Python 3.10+
เฆ†เฆชเฆจเฆฟ เฆธเง‡เฆ‡ เฆเฆ•เฆ‡ เฆฌเฆฟเฆฒเงเฆŸเฆ‡เฆจ เฆŸเฆพเฆ‡เฆช เฆœเง‡เฆจเง‡เฆฐเฆฟเฆ•เงเฆธ เฆนเฆฟเฆธเง‡เฆฌเง‡ เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆ•เฆฐเฆคเง‡ เฆชเฆพเฆฐเฆฌเง‡เฆจ(เฆญเฆฟเฆคเฆฐเง‡ เฆŸเฆพเฆ‡เฆช เฆธเฆน เฆธเงเฆ•เฆฏเฆผเฆพเฆฐเง‡ เฆฌเงเฆฐเฆพเฆ•เง‡เฆŸ เฆฆเฆฟเฆฏเฆผเง‡):
เฆ†เฆชเฆจเฆฟ เฆธเง‡เฆ‡ เฆเฆ•เฆ‡ เฆฌเฆฟเฆฒเงเฆŸเฆ‡เฆจ เฆŸเฆพเฆ‡เฆช เฆœเง‡เฆจเง‡เฆฐเฆฟเฆ•เงเฆธ เฆนเฆฟเฆธเง‡เฆฌเง‡ เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆ•เฆฐเฆคเง‡ เฆชเฆพเฆฐเฆฌเง‡เฆจ(เฆญเฆฟเฆคเฆฐเง‡ เฆŸเฆพเฆ‡เฆช เฆธเฆน เฆธเงเฆ•เฆฏเฆผเฆพเฆฐเง‡ เฆฌเงเฆฐเฆพเฆ•เง‡เฆŸ เฆฆเฆฟเฆฏเฆผเง‡):
* `list`
* `tuple`
* `set`
* `dict`
เฆเฆฌเฆ‚ Python 3.8 เฆเฆฐ เฆฎเฆคเง‹เฆ‡, `typing` เฆฎเฆกเฆฟเฆ‰เฆฒ เฆฅเง‡เฆ•เง‡:
* `list` * `Union`
* `tuple` * `Optional` (Python 3.8 เฆเฆฐ เฆฎเฆคเง‹เฆ‡)
* `set` * ...เฆเฆฌเฆ‚ เฆ…เฆจเงเฆฏเฆพเฆจเงเฆฏเฅค
* `dict`
เฆเฆฌเฆ‚ Python 3.8 เฆเฆฐ เฆฎเฆคเง‹เฆ‡, `typing` เฆฎเฆกเฆฟเฆ‰เฆฒ เฆฅเง‡เฆ•เง‡: Python 3.10-เฆ, `Union` เฆเฆฌเฆ‚ `Optional` เฆœเง‡เฆจเง‡เฆฐเฆฟเฆ•เฆธ เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆ•เฆฐเฆพเฆฐ เฆฌเฆฟเฆ•เฆฒเงเฆช เฆนเฆฟเฆธเง‡เฆฌเง‡, เฆ†เฆชเฆจเฆฟ เฆŸเฆพเฆ‡เฆชเฆ—เงเฆฒเฆฟเฆฐ เฆ‡เฆ‰เฆจเฆฟเฆฏเฆผเฆจ เฆ˜เง‹เฆทเฆฃเฆพ เฆ•เฆฐเฆคเง‡ <abbr title="เฆ‰เฆฒเงเฆฒเฆฎเงเฆฌ เฆฌเฆพเฆฐเฆพเฆฒเฆ•เง‡ 'เฆฌเฆฟเฆŸเฆ“เฆฏเฆผเฆพเฆ‡เฆœ เฆฌเฆพ เฆ…เฆชเฆพเฆฐเง‡เฆŸเฆฐ' เฆฌเฆฒเฆพ เฆนเฆฏเฆผ, เฆ•เฆฟเฆจเงเฆคเง เฆธเง‡เฆ‡ เฆ…เฆฐเงเฆฅ เฆเฆ–เฆพเฆจเง‡ เฆชเงเฆฐเฆพเฆธเฆ™เงเฆ—เฆฟเฆ• เฆจเฆฏเฆผ">เฆญเฆพเฆฐเงเฆŸเฆฟเฆ•เฆพเฆฒ เฆฌเฆพเฆฐ (`|`)</abbr> เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆ•เฆฐเฆคเง‡ เฆชเฆพเฆฐเง‡เฆจ, เฆฏเฆพ เฆ“เฆฆเง‡เฆฐ เฆฅเง‡เฆ•เง‡ เฆ…เฆจเง‡เฆ• เฆญเฆพเฆฒเง‹ เฆเฆฌเฆ‚ เฆธเฆนเฆœเฅค
* `Union` ////
* `Optional` (Python 3.8 เฆเฆฐ เฆฎเฆคเง‹เฆ‡)
* ...เฆเฆฌเฆ‚ เฆ…เฆจเงเฆฏเฆพเฆจเงเฆฏเฅค
Python 3.10-เฆ, `Union` เฆเฆฌเฆ‚ `Optional` เฆœเง‡เฆจเง‡เฆฐเฆฟเฆ•เฆธ เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆ•เฆฐเฆพเฆฐ เฆฌเฆฟเฆ•เฆฒเงเฆช เฆนเฆฟเฆธเง‡เฆฌเง‡, เฆ†เฆชเฆจเฆฟ เฆŸเฆพเฆ‡เฆชเฆ—เงเฆฒเฆฟเฆฐ เฆ‡เฆ‰เฆจเฆฟเฆฏเฆผเฆจ เฆ˜เง‹เฆทเฆฃเฆพ เฆ•เฆฐเฆคเง‡ <abbr title="เฆ‰เฆฒเงเฆฒเฆฎเงเฆฌ เฆฌเฆพเฆฐเฆพเฆฒเฆ•เง‡ 'เฆฌเฆฟเฆŸเฆ“เฆฏเฆผเฆพเฆ‡เฆœ เฆฌเฆพ เฆ…เฆชเฆพเฆฐเง‡เฆŸเฆฐ' เฆฌเฆฒเฆพ เฆนเฆฏเฆผ, เฆ•เฆฟเฆจเงเฆคเง เฆธเง‡เฆ‡ เฆ…เฆฐเงเฆฅ เฆเฆ–เฆพเฆจเง‡ เฆชเงเฆฐเฆพเฆธเฆ™เงเฆ—เฆฟเฆ• เฆจเฆฏเฆผ">เฆญเฆพเฆฐเงเฆŸเฆฟเฆ•เฆพเฆฒ เฆฌเฆพเฆฐ (`|`)</abbr> เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆ•เฆฐเฆคเง‡ เฆชเฆพเฆฐเง‡เฆจ, เฆฏเฆพ เฆ“เฆฆเง‡เฆฐ เฆฅเง‡เฆ•เง‡ เฆ…เฆจเง‡เฆ• เฆญเฆพเฆฒเง‹ เฆเฆฌเฆ‚ เฆธเฆนเฆœเฅค //// tab | Python 3.9+
=== "Python 3.9+" เฆ†เฆชเฆจเฆฟ เฆธเง‡เฆ‡ เฆเฆ•เฆ‡ เฆฌเฆฟเฆฒเงเฆŸเฆ‡เฆจ เฆŸเฆพเฆ‡เฆช เฆœเง‡เฆจเง‡เฆฐเฆฟเฆ•เงเฆธ เฆนเฆฟเฆธเง‡เฆฌเง‡ เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆ•เฆฐเฆคเง‡ เฆชเฆพเฆฐเฆฌเง‡เฆจ(เฆญเฆฟเฆคเฆฐเง‡ เฆŸเฆพเฆ‡เฆช เฆธเฆน เฆธเงเฆ•เฆฏเฆผเฆพเฆฐเง‡ เฆฌเงเฆฐเฆพเฆ•เง‡เฆŸ เฆฆเฆฟเฆฏเฆผเง‡):
เฆ†เฆชเฆจเฆฟ เฆธเง‡เฆ‡ เฆเฆ•เฆ‡ เฆฌเฆฟเฆฒเงเฆŸเฆ‡เฆจ เฆŸเฆพเฆ‡เฆช เฆœเง‡เฆจเง‡เฆฐเฆฟเฆ•เงเฆธ เฆนเฆฟเฆธเง‡เฆฌเง‡ เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆ•เฆฐเฆคเง‡ เฆชเฆพเฆฐเฆฌเง‡เฆจ(เฆญเฆฟเฆคเฆฐเง‡ เฆŸเฆพเฆ‡เฆช เฆธเฆน เฆธเงเฆ•เฆฏเฆผเฆพเฆฐเง‡ เฆฌเงเฆฐเฆพเฆ•เง‡เฆŸ เฆฆเฆฟเฆฏเฆผเง‡): * `list`
* `tuple`
* `set`
* `dict`
* `list` เฆเฆฌเฆ‚ Python 3.8 เฆเฆฐ เฆฎเฆคเง‹เฆ‡, `typing` เฆฎเฆกเฆฟเฆ‰เฆฒ เฆฅเง‡เฆ•เง‡:
* `tuple`
* `set`
* `dict`
เฆเฆฌเฆ‚ Python 3.8 เฆเฆฐ เฆฎเฆคเง‹เฆ‡, `typing` เฆฎเฆกเฆฟเฆ‰เฆฒ เฆฅเง‡เฆ•เง‡: * `Union`
* `Optional`
* ...เฆเฆฌเฆ‚ เฆ…เฆจเงเฆฏเฆพเฆจเงเฆฏเฅค
* `Union` ////
* `Optional`
* ...เฆเฆฌเฆ‚ เฆ…เฆจเงเฆฏเฆพเฆจเงเฆฏเฅค
=== "Python 3.8+" //// tab | Python 3.8+
* `List` * `List`
* `Tuple` * `Tuple`
* `Set` * `Set`
* `Dict` * `Dict`
* `Union` * `Union`
* `Optional` * `Optional`
* ...เฆเฆฌเฆ‚ เฆ…เฆจเงเฆฏเฆพเฆจเงเฆฏเฅค * ...เฆเฆฌเฆ‚ เฆ…เฆจเงเฆฏเฆพเฆจเงเฆฏเฅค
////
### เฆ•เงเฆฒเฆพเฆธ เฆนเฆฟเฆธเง‡เฆฌเง‡ เฆŸเฆพเฆ‡เฆชเฆธ ### เฆ•เงเฆฒเฆพเฆธ เฆนเฆฟเฆธเง‡เฆฌเง‡ เฆŸเฆพเฆ‡เฆชเฆธ
@ -446,55 +483,71 @@ say_hi(name=None) # เฆเฆŸเฆฟ เฆ•เฆพเฆœ เฆ•เฆฐเง‡, None เฆฌเงˆเฆง ๐ŸŽ‰
เฆ…เฆซเฆฟเฆธเฆฟเฆฏเฆผเฆพเฆฒ Pydantic เฆกเฆ•เงเฆธ เฆฅเง‡เฆ•เง‡ เฆเฆ•เฆŸเฆฟ เฆ‰เฆฆเฆพเฆนเฆฐเฆฃ: เฆ…เฆซเฆฟเฆธเฆฟเฆฏเฆผเฆพเฆฒ Pydantic เฆกเฆ•เงเฆธ เฆฅเง‡เฆ•เง‡ เฆเฆ•เฆŸเฆฟ เฆ‰เฆฆเฆพเฆนเฆฐเฆฃ:
=== "Python 3.10+" //// tab | Python 3.10+
```Python
{!> ../../../docs_src/python_types/tutorial011_py310.py!}
```
////
//// tab | Python 3.9+
```Python
{!> ../../../docs_src/python_types/tutorial011_py39.py!}
```
////
```Python //// tab | Python 3.8+
{!> ../../../docs_src/python_types/tutorial011_py310.py!}
```
=== "Python 3.9+" ```Python
{!> ../../../docs_src/python_types/tutorial011.py!}
```
```Python ////
{!> ../../../docs_src/python_types/tutorial011_py39.py!}
```
=== "Python 3.8+" /// info
```Python [Pydantic เฆธเฆฎเงเฆชเฆฐเงเฆ•เง‡ เฆ†เฆฐเฆ“ เฆœเฆพเฆจเฆคเง‡, เฆเฆฐ เฆกเฆ•เงเฆฎเง‡เฆจเงเฆŸเง‡เฆถเฆจ เฆฆเง‡เฆ–เงเฆจ](https://docs.pydantic.dev/)เฅค
{!> ../../../docs_src/python_types/tutorial011.py!}
```
!!! Info ///
[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 hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial013_py39.py!}
```
Python 3.9-เฆ, `Annotated` เฆธเงเฆŸเงเฆฏเฆพเฆจเงเฆกเฆพเฆฐเงเฆก เฆฒเฆพเฆ‡เฆฌเงเฆฐเง‡เฆฐเฆฟเฆคเง‡ เฆ…เฆจเงเฆคเฆฐเงเฆญเงเฆ•เงเฆค, เฆคเฆพเฆ‡ เฆ†เฆชเฆจเฆฟ เฆเฆŸเฆฟ `typing` เฆฅเง‡เฆ•เง‡ เฆ‡เฆฎเฆชเง‹เฆฐเงเฆŸ เฆ•เฆฐเฆคเง‡ เฆชเฆพเฆฐเง‡เฆจเฅค ////
```Python hl_lines="1 4" //// tab | Python 3.8+
{!> ../../../docs_src/python_types/tutorial013_py39.py!}
```
=== "Python 3.8+" Python 3.9-เฆเฆฐ เฆจเง€เฆšเง‡เฆฐ เฆธเฆ‚เฆธเงเฆ•เฆฐเฆฃเฆ—เงเฆฒเฆฟเฆคเง‡, เฆ†เฆชเฆจเฆฟ `Annotated`-เฆ•เง‡ `typing_extensions` เฆฅเง‡เฆ•เง‡ เฆ‡เฆฎเฆชเง‹เฆฐเงเฆŸ เฆ•เฆฐเง‡เฆจเฅค
Python 3.9-เฆเฆฐ เฆจเง€เฆšเง‡เฆฐ เฆธเฆ‚เฆธเงเฆ•เฆฐเฆฃเฆ—เงเฆฒเฆฟเฆคเง‡, เฆ†เฆชเฆจเฆฟ `Annotated`-เฆ•เง‡ `typing_extensions` เฆฅเง‡เฆ•เง‡ เฆ‡เฆฎเฆชเง‹เฆฐเงเฆŸ เฆ•เฆฐเง‡เฆจเฅค เฆเฆŸเฆฟ **FastAPI** เฆเฆฐ เฆธเฆพเฆฅเง‡ เฆ‡เฆคเฆฟเฆฎเฆฆเงเฆงเง‡ เฆ‡เฆจเฆธเงเฆŸเฆฒ เฆนเฆฏเฆผเง‡ เฆฅเฆพเฆ•เฆฌเง‡เฅค
เฆเฆŸเฆฟ **FastAPI** เฆเฆฐ เฆธเฆพเฆฅเง‡ เฆ‡เฆคเฆฟเฆฎเฆฆเงเฆงเง‡ เฆ‡เฆจเฆธเงเฆŸเฆฒ เฆนเฆฏเฆผเง‡ เฆฅเฆพเฆ•เฆฌเง‡เฅค ```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial013.py!}
```
```Python hl_lines="1 4" ////
{!> ../../../docs_src/python_types/tutorial013.py!}
```
Python เฆจเฆฟเฆœเง‡ เฆเฆ‡ `Annotated` เฆฆเฆฟเฆฏเฆผเง‡ เฆ•เฆฟเฆ›เงเฆ‡ เฆ•เฆฐเง‡ เฆจเฆพเฅค เฆเฆฌเฆ‚ เฆเฆกเฆฟเฆŸเฆฐ เฆเฆฌเฆ‚ เฆ…เฆจเงเฆฏเฆพเฆจเงเฆฏ เฆŸเงเฆฒเฆ—เงเฆฒเฆฟเฆฐ เฆœเฆจเงเฆฏ, เฆŸเฆพเฆ‡เฆชเฆŸเฆฟ เฆเฆ–เฆจเฆ“ `str`เฅค Python เฆจเฆฟเฆœเง‡ เฆเฆ‡ `Annotated` เฆฆเฆฟเฆฏเฆผเง‡ เฆ•เฆฟเฆ›เงเฆ‡ เฆ•เฆฐเง‡ เฆจเฆพเฅค เฆเฆฌเฆ‚ เฆเฆกเฆฟเฆŸเฆฐ เฆเฆฌเฆ‚ เฆ…เฆจเงเฆฏเฆพเฆจเงเฆฏ เฆŸเงเฆฒเฆ—เงเฆฒเฆฟเฆฐ เฆœเฆจเงเฆฏ, เฆŸเฆพเฆ‡เฆชเฆŸเฆฟ เฆเฆ–เฆจเฆ“ `str`เฅค
@ -506,10 +559,13 @@ Python เฆจเฆฟเฆœเง‡ เฆเฆ‡ `Annotated` เฆฆเฆฟเฆฏเฆผเง‡ เฆ•เฆฟเฆ›เงเฆ‡ เฆ•เฆฐเง‡
เฆชเฆฐเฆฌเฆฐเงเฆคเง€เฆคเง‡ เฆ†เฆชเฆจเฆฟ เฆฆเง‡เฆ–เฆฌเง‡เฆจ เฆเฆŸเฆฟ เฆ•เฆคเฆŸเฆพ **เฆถเฆ•เงเฆคเฆฟเฆถเฆพเฆฒเง€** เฆนเฆคเง‡ เฆชเฆพเฆฐเง‡เฅค เฆชเฆฐเฆฌเฆฐเงเฆคเง€เฆคเง‡ เฆ†เฆชเฆจเฆฟ เฆฆเง‡เฆ–เฆฌเง‡เฆจ เฆเฆŸเฆฟ เฆ•เฆคเฆŸเฆพ **เฆถเฆ•เงเฆคเฆฟเฆถเฆพเฆฒเง€** เฆนเฆคเง‡ เฆชเฆพเฆฐเง‡เฅค
!!! Tip /// tip
เฆเฆŸเฆฟ **เฆธเงเฆŸเงเฆฏเฆพเฆจเงเฆกเฆพเฆฐเงเฆก Python** เฆนเฆ“เฆฏเฆผเฆพเฆฐ เฆฎเฆพเฆจเง‡ เฆนเฆฒ เฆ†เฆชเฆจเฆฟ เฆ†เฆชเฆจเฆพเฆฐ เฆเฆกเฆฟเฆŸเฆฐเง‡, เฆ†เฆชเฆจเฆฟ เฆฏเง‡ เฆŸเงเฆฒเฆ—เงเฆฒเฆฟ เฆ•เง‹เฆก เฆฌเฆฟเฆถเงเฆฒเง‡เฆทเฆฃ เฆเฆฌเฆ‚ เฆฐเฆฟเฆซเงเฆฏเฆพเฆ•เงเฆŸเฆฐ เฆ•เฆฐเฆพเฆฐ เฆœเฆจเงเฆฏ เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆ•เฆฐเง‡เฆจ เฆคเฆพเฆคเง‡ **เฆธเง‡เฆฐเฆพ เฆธเฆฎเงเฆญเฆพเฆฌเงเฆฏ เฆกเง‡เฆญเง‡เฆฒเฆชเฆพเฆฐ เฆเฆ•เงเฆธเฆชเง‡เฆฐเฆฟเฆฏเฆผเง‡เฆจเงเฆธ** เฆชเฆพเฆฌเง‡เฆจเฅค โœจ
เฆเฆฌเฆ‚ เฆเฆ›เฆพเฆกเฆผเฆพเฆ“ เฆ†เฆชเฆจเฆพเฆฐ เฆ•เง‹เฆก เฆ…เฆจเงเฆฏเฆพเฆจเงเฆฏ เฆ…เฆจเง‡เฆ• Python เฆŸเงเฆฒ เฆเฆฌเฆ‚ เฆฒเฆพเฆ‡เฆฌเงเฆฐเง‡เฆฐเฆฟเฆ—เงเฆฒเฆฟเฆฐ เฆธเฆพเฆฅเง‡ เฆ–เงเฆฌ เฆธเฆพเฆฎเฆžเงเฆœเฆธเงเฆฏเฆชเง‚เฆฐเงเฆฃ เฆนเฆฌเง‡เฅค ๐Ÿš€ เฆเฆŸเฆฟ **เฆธเงเฆŸเงเฆฏเฆพเฆจเงเฆกเฆพเฆฐเงเฆก Python** เฆนเฆ“เฆฏเฆผเฆพเฆฐ เฆฎเฆพเฆจเง‡ เฆนเฆฒ เฆ†เฆชเฆจเฆฟ เฆ†เฆชเฆจเฆพเฆฐ เฆเฆกเฆฟเฆŸเฆฐเง‡, เฆ†เฆชเฆจเฆฟ เฆฏเง‡ เฆŸเงเฆฒเฆ—เงเฆฒเฆฟ เฆ•เง‹เฆก เฆฌเฆฟเฆถเงเฆฒเง‡เฆทเฆฃ เฆเฆฌเฆ‚ เฆฐเฆฟเฆซเงเฆฏเฆพเฆ•เงเฆŸเฆฐ เฆ•เฆฐเฆพเฆฐ เฆœเฆจเงเฆฏ เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆ•เฆฐเง‡เฆจ เฆคเฆพเฆคเง‡ **เฆธเง‡เฆฐเฆพ เฆธเฆฎเงเฆญเฆพเฆฌเงเฆฏ เฆกเง‡เฆญเง‡เฆฒเฆชเฆพเฆฐ เฆเฆ•เงเฆธเฆชเง‡เฆฐเฆฟเฆฏเฆผเง‡เฆจเงเฆธ** เฆชเฆพเฆฌเง‡เฆจเฅค โœจ
เฆเฆฌเฆ‚ เฆเฆ›เฆพเฆกเฆผเฆพเฆ“ เฆ†เฆชเฆจเฆพเฆฐ เฆ•เง‹เฆก เฆ…เฆจเงเฆฏเฆพเฆจเงเฆฏ เฆ…เฆจเง‡เฆ• Python เฆŸเงเฆฒ เฆเฆฌเฆ‚ เฆฒเฆพเฆ‡เฆฌเงเฆฐเง‡เฆฐเฆฟเฆ—เงเฆฒเฆฟเฆฐ เฆธเฆพเฆฅเง‡ เฆ–เงเฆฌ เฆธเฆพเฆฎเฆžเงเฆœเฆธเงเฆฏเฆชเง‚เฆฐเงเฆฃ เฆนเฆฌเง‡เฅค ๐Ÿš€
///
## **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 เฆŸเฆพเฆ‡เฆช เฆนเฆฟเฆจเงเฆŸ เฆธเฆฎเงเฆชเฆฐเงเฆ•เง‡ เฆฌเง‡เฆธเฆฟเฆ• เฆฅเง‡เฆ•เง‡ เฆ‰เฆจเงเฆจเฆค เฆฒเง‡เฆญเง‡เฆฒเง‡เฆฐ เฆงเฆพเฆฐเฆฃเฆพ เฆชเง‡เฆคเง‡ เฆชเฆพเฆฐเง‡เฆจ, เฆฏเฆพ เฆ†เฆชเฆจเฆพเฆฐ เฆ•เง‹เฆกเง‡ เฆŸเฆพเฆ‡เฆช เฆธเง‡เฆซเฆŸเฆฟ เฆเฆฌเฆ‚ เฆธเงเฆชเฆทเงเฆŸเฆคเฆพ เฆฌเฆพเฆกเฆผเฆพเฆคเง‡ เฆธเฆพเฆนเฆพเฆฏเงเฆฏ เฆ•เฆฐเฆฌเง‡เฅค
///

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

@ -1,9 +1,12 @@
# Zusรคtzliche Responses in OpenAPI # Zusรคtzliche Responses in OpenAPI
!!! warning "Achtung" /// warning | "Achtung"
Dies ist ein eher fortgeschrittenes Thema.
Wenn Sie mit **FastAPI** beginnen, benรถtigen Sie dies mรถglicherweise nicht. Dies ist ein eher fortgeschrittenes Thema.
Wenn Sie mit **FastAPI** beginnen, benรถtigen Sie dies mรถglicherweise nicht.
///
Sie kรถnnen zusรคtzliche Responses mit zusรคtzlichen Statuscodes, Medientypen, Beschreibungen, usw. deklarieren. Sie kรถnnen zusรคtzliche Responses mit zusรคtzlichen Statuscodes, Medientypen, Beschreibungen, usw. deklarieren.
@ -27,20 +30,26 @@ Um beispielsweise eine weitere Response mit dem Statuscode `404` und einem Pydan
{!../../../docs_src/additional_responses/tutorial001.py!} {!../../../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.
Die richtige Stelle ist: Die richtige Stelle ist:
* Im Schlรผssel `content`, der als Wert ein weiteres JSON-Objekt (`dict`) hat, welches Folgendes enthรคlt: * Im Schlรผssel `content`, der als Wert ein weiteres JSON-Objekt (`dict`) hat, welches Folgendes enthรคlt:
* Ein Schlรผssel mit dem Medientyp, z. B. `application/json`, der als Wert ein weiteres JSON-Objekt hat, welches Folgendes enthรคlt: * Ein Schlรผssel mit dem Medientyp, z. B. `application/json`, der als Wert ein weiteres JSON-Objekt hat, welches Folgendes enthรคlt:
* Ein Schlรผssel `schema`, der als Wert das JSON-Schema aus dem Modell hat, hier ist die richtige Stelle. * 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:
@ -172,13 +181,19 @@ Sie kรถnnen beispielsweise einen zusรคtzlichen Medientyp `image/png` hinzufรผgen
{!../../../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
Sofern Sie in Ihrem Parameter `responses` nicht explizit einen anderen Medientyp angeben, geht FastAPI davon aus, dass die Response denselben Medientyp wie die Haupt-Response-Klasse hat (StandardmรครŸig `application/json`).
!!! info 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.
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. ///
## Informationen kombinieren ## Informationen kombinieren

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

@ -14,53 +14,75 @@ Sie mรถchten aber auch, dass sie neue Artikel akzeptiert. Und wenn die Elemente
Um dies zu erreichen, importieren Sie `JSONResponse`, und geben Sie Ihren Inhalt direkt zurรผck, indem Sie den gewรผnschten `status_code` setzen: 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+" ////
```Python hl_lines="4 25" //// tab | Python 3.9+
{!> ../../../docs_src/additional_status_codes/tutorial001_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="4 25"
{!> ../../../docs_src/additional_status_codes/tutorial001_an_py39.py!}
```
```Python hl_lines="4 26" ////
{!> ../../../docs_src/additional_status_codes/tutorial001_an.py!}
```
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.8+
!!! tip "Tipp" ```Python hl_lines="4 26"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/additional_status_codes/tutorial001_an.py!}
```
```Python hl_lines="2 23" ////
{!> ../../../docs_src/additional_status_codes/tutorial001_py310.py!}
```
=== "Python 3.8+ nicht annotiert" //// tab | Python 3.10+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="4 25" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/additional_status_codes/tutorial001.py!}
```
!!! warning "Achtung" ///
Wenn Sie eine `Response` direkt zurรผckgeben, wie im obigen Beispiel, wird sie direkt zurรผckgegeben.
Sie wird nicht mit einem Modell usw. serialisiert. ```Python hl_lines="2 23"
{!> ../../../docs_src/additional_status_codes/tutorial001_py310.py!}
```
Stellen Sie sicher, dass sie die gewรผnschten Daten enthรคlt und dass die Werte gรผltiges JSON sind (wenn Sie `JSONResponse` verwenden). ////
!!! note "Technische Details" //// tab | Python 3.8+ nicht annotiert
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`. /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="4 25"
{!> ../../../docs_src/additional_status_codes/tutorial001.py!}
```
////
/// warning | "Achtung"
Wenn Sie eine `Response` direkt zurรผckgeben, wie im obigen Beispiel, wird sie direkt zurรผckgegeben.
Sie wird nicht mit einem Modell usw. serialisiert.
Stellen Sie sicher, dass sie die gewรผnschten Daten enthรคlt und dass die Werte gรผltiges JSON sind (wenn Sie `JSONResponse` verwenden).
///
/// note | "Technische Details"
Sie kรถnnen auch `from starlette.responses import JSONResponse` verwenden.
**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit fรผr Sie, den Entwickler. Die meisten verfรผgbaren Responses kommen aber direkt von Starlette. Das Gleiche gilt fรผr `status`.
///
## OpenAPI- und API-Dokumentation ## OpenAPI- und API-Dokumentation

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

@ -18,26 +18,35 @@ Nicht die Klasse selbst (die bereits aufrufbar ist), sondern eine Instanz dieser
Dazu deklarieren wir eine Methode `__call__`: 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!}
``` ```
////
//// tab | Python 3.8+
```Python hl_lines="11"
{!> ../../../docs_src/dependencies/tutorial011_an.py!}
```
=== "Python 3.8+" ////
```Python hl_lines="11" //// tab | Python 3.8+ nicht annotiert
{!> ../../../docs_src/dependencies/tutorial011_an.py!}
```
=== "Python 3.8+ nicht annotiert" /// tip | "Tipp"
!!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="10" ///
{!> ../../../docs_src/dependencies/tutorial011.py!}
``` ```Python hl_lines="10"
{!> ../../../docs_src/dependencies/tutorial011.py!}
```
////
In diesem Fall ist dieses `__call__` das, was **FastAPI** verwendet, um nach zusรคtzlichen Parametern und Unterabhรคngigkeiten zu suchen, und das ist es auch, was spรคter aufgerufen wird, um einen Wert an den Parameter in Ihrer *Pfadoperation-Funktion* zu รผbergeben. In diesem Fall ist dieses `__call__` das, was **FastAPI** verwendet, um nach zusรคtzlichen Parametern und Unterabhรคngigkeiten zu suchen, und das ist es auch, was spรคter aufgerufen wird, um einen Wert an den Parameter in Ihrer *Pfadoperation-Funktion* zu รผbergeben.
@ -45,26 +54,35 @@ In diesem Fall ist dieses `__call__` das, was **FastAPI** verwendet, um nach zus
Und jetzt kรถnnen wir `__init__` verwenden, um die Parameter der Instanz zu deklarieren, die wir zum `Parametrisieren` der Abhรคngigkeit verwenden kรถnnen: 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+" ////
```Python hl_lines="8" //// tab | Python 3.8+
{!> ../../../docs_src/dependencies/tutorial011_an.py!}
```
=== "Python 3.8+ nicht annotiert" ```Python hl_lines="8"
{!> ../../../docs_src/dependencies/tutorial011_an.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
!!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="7" ///
{!> ../../../docs_src/dependencies/tutorial011.py!}
``` ```Python hl_lines="7"
{!> ../../../docs_src/dependencies/tutorial011.py!}
```
////
In diesem Fall wird **FastAPI** `__init__` nie berรผhren oder sich darum kรผmmern, wir werden es direkt in unserem Code verwenden. In diesem Fall wird **FastAPI** `__init__` nie berรผhren oder sich darum kรผmmern, wir werden es direkt in unserem Code verwenden.
@ -72,26 +90,35 @@ In diesem Fall wird **FastAPI** `__init__` nie berรผhren oder sich darum kรผmmer
Wir kรถnnten eine Instanz dieser Klasse erstellen mit: Wir kรถnnten eine Instanz dieser Klasse erstellen mit:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="18"
{!> ../../../docs_src/dependencies/tutorial011_an_py39.py!}
```
////
```Python hl_lines="18" //// tab | Python 3.8+
{!> ../../../docs_src/dependencies/tutorial011_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="17"
{!> ../../../docs_src/dependencies/tutorial011_an.py!}
```
```Python hl_lines="17" ////
{!> ../../../docs_src/dependencies/tutorial011_an.py!}
```
=== "Python 3.8+ nicht annotiert" //// tab | Python 3.8+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="16" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/dependencies/tutorial011.py!}
``` ///
```Python hl_lines="16"
{!> ../../../docs_src/dependencies/tutorial011.py!}
```
////
Und auf diese Weise kรถnnen wir unsere Abhรคngigkeit โ€žparametrisierenโ€œ, die jetzt `"bar"` enthรคlt, als das Attribut `checker.fixed_content`. Und auf diese Weise kรถnnen wir unsere Abhรคngigkeit โ€žparametrisierenโ€œ, die jetzt `"bar"` enthรคlt, als das Attribut `checker.fixed_content`.
@ -107,32 +134,44 @@ checker(q="somequery")
... und รผbergibt, was immer das als Wert dieser Abhรคngigkeit in unserer *Pfadoperation-Funktion* zurรผckgibt, als den Parameter `fixed_content_included`: ... und รผbergibt, was immer das als Wert dieser Abhรคngigkeit in unserer *Pfadoperation-Funktion* zurรผckgibt, als den Parameter `fixed_content_included`:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="22"
{!> ../../../docs_src/dependencies/tutorial011_an_py39.py!}
```
```Python hl_lines="22" ////
{!> ../../../docs_src/dependencies/tutorial011_an_py39.py!}
```
=== "Python 3.8+" //// tab | Python 3.8+
```Python hl_lines="21" ```Python hl_lines="21"
{!> ../../../docs_src/dependencies/tutorial011_an.py!} {!> ../../../docs_src/dependencies/tutorial011_an.py!}
``` ```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="20"
{!> ../../../docs_src/dependencies/tutorial011.py!}
```
=== "Python 3.8+ nicht annotiert" ////
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="20" Das alles mag gekรผnstelt wirken. Und es ist mรถglicherweise noch nicht ganz klar, welchen Nutzen das hat.
{!> ../../../docs_src/dependencies/tutorial011.py!}
```
!!! tip "Tipp" Diese Beispiele sind bewusst einfach gehalten, zeigen aber, wie alles funktioniert.
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. 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. ///

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

@ -64,8 +64,11 @@ Der Marker `@pytest.mark.anyio` teilt pytest mit, dass diese Testfunktion asynch
{!../../../docs_src/async_tests/test_main.py!} {!../../../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.
@ -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.
///

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

@ -43,8 +43,11 @@ 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:
@ -81,10 +84,13 @@ $ 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`
@ -172,8 +178,11 @@ Dann erstellen Sie eine Datei `traefik.toml` mit:
Dadurch wird Traefik angewiesen, Port 9999 abzuhรถren und eine andere Datei `routes.toml` zu verwenden. 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`:
@ -239,8 +248,11 @@ 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>.
@ -283,8 +295,11 @@ 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`.
@ -323,15 +338,21 @@ 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

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

@ -12,8 +12,11 @@ Der Inhalt, den Sie von Ihrer *Pfadoperation-Funktion* zurรผckgeben, wird in die
Und wenn diese `Response` einen JSON-Medientyp (`application/json`) hat, wie es bei `JSONResponse` und `UJSONResponse` der Fall ist, werden die von Ihnen zurรผckgegebenen Daten automatisch mit jedem Pydantic `response_model` konvertiert (und gefiltert), das Sie im *Pfadoperation-Dekorator* deklariert haben. 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
@ -31,15 +34,21 @@ Wenn Sie jedoch sicher sind, dass der von Ihnen zurรผckgegebene Inhalt **mit JSO
{!../../../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.
Und er wird als solcher in OpenAPI dokumentiert.
///
In diesem Fall wird der HTTP-Header `Content-Type` auf `application/json` gesetzt. /// tip | "Tipp"
Und er wird als solcher in OpenAPI dokumentiert. Die `ORJSONResponse` ist derzeit nur in FastAPI verfรผgbar, nicht in Starlette.
!!! tip "Tipp" ///
Die `ORJSONResponse` ist derzeit nur in FastAPI verfรผgbar, nicht in Starlette.
## HTML-Response ## HTML-Response
@ -52,12 +61,15 @@ Um eine Response mit HTML direkt von **FastAPI** zurรผckzugeben, verwenden Sie `
{!../../../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.
In diesem Fall wird der HTTP-Header `Content-Type` auf `text/html` gesetzt. Der Parameter `response_class` wird auch verwendet, um den โ€žMedientypโ€œ der Response zu definieren.
Und er wird als solcher in OpenAPI dokumentiert. In diesem Fall wird der HTTP-Header `Content-Type` auf `text/html` gesetzt.
Und er wird als solcher in OpenAPI dokumentiert.
///
### Eine `Response` zurรผckgeben ### Eine `Response` zurรผckgeben
@ -69,11 +81,17 @@ Das gleiche Beispiel von oben, das eine `HTMLResponse` zurรผckgibt, kรถnnte so a
{!../../../docs_src/custom_response/tutorial003.py!} {!../../../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
@ -103,10 +121,13 @@ Hier sind einige der verfรผgbaren Responses.
Bedenken Sie, dass Sie `Response` verwenden kรถnnen, um alles andere zurรผckzugeben, oder sogar eine benutzerdefinierte Unterklasse zu erstellen. 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`
@ -153,15 +174,21 @@ 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`
@ -222,8 +249,11 @@ Das umfasst viele Bibliotheken zur Interaktion mit Cloud-Speicher, Videoverarbei
Auf diese Weise kรถnnen wir das Ganze in einen `with`-Block einfรผgen und so sicherstellen, dass das dateiartige Objekt nach Abschluss geschlossen wird. 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`
@ -292,8 +322,11 @@ Im folgenden Beispiel verwendet **FastAPI** standardmรครŸig `ORJSONResponse` in
{!../../../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

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

@ -20,12 +20,15 @@ Und natรผrlich wird das gleiche unterstรผtzt:
Das funktioniert genauso wie mit Pydantic-Modellen. Und tatsรคchlich wird es unter der Haube mittels Pydantic auf die gleiche Weise bewerkstelligt. 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.
Daher mรผssen Sie mรถglicherweise weiterhin Pydantic-Modelle verwenden. Bedenken Sie, dass Datenklassen nicht alles kรถnnen, was Pydantic-Modelle kรถnnen.
Wenn Sie jedoch eine Menge Datenklassen herumliegen haben, ist dies ein guter Trick, um sie fรผr eine Web-API mithilfe von FastAPI zu verwenden. ๐Ÿค“ Daher mรผssen Sie mรถglicherweise weiterhin Pydantic-Modelle verwenden.
Wenn Sie jedoch eine Menge Datenklassen herumliegen haben, ist dies ein guter Trick, um sie fรผr eine Web-API mithilfe von FastAPI zu verwenden. ๐Ÿค“
///
## Datenklassen als `response_model` ## Datenklassen als `response_model`

47
docs/de/docs/advanced/events.md

@ -38,10 +38,13 @@ Hier simulieren wir das langsame *Hochfahren*, das Laden des Modells, indem wir
Und dann, direkt nach dem `yield`, entladen wir das Modell. Dieser Code wird unmittelbar vor dem *Herunterfahren* ausgefรผhrt, **nachdem** die Anwendung **die Bearbeitung von Requests abgeschlossen hat**. Dadurch kรถnnten beispielsweise Ressourcen wie Arbeitsspeicher oder eine GPU freigegeben werden. 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**.
Mรถglicherweise mรผssen Sie eine neue Version starten, oder Sie haben es einfach satt, sie auszufรผhren. ๐Ÿคท Das *Herunterfahren* wรผrde erfolgen, wenn Sie die Anwendung **stoppen**.
Mรถglicherweise mรผssen Sie eine neue Version starten, oder Sie haben es einfach satt, sie auszufรผhren. ๐Ÿคท
///
### Lifespan-Funktion ### Lifespan-Funktion
@ -91,10 +94,13 @@ Der Parameter `lifespan` der `FastAPI`-App benรถtigt einen **asynchronen Kontext
## 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.
@ -126,17 +132,23 @@ Um eine Funktion hinzuzufรผgen, die beim Herunterfahren der Anwendung ausgefรผhr
Hier schreibt die `shutdown`-Eventhandler-Funktion eine Textzeile `"Application shutdown"` in eine Datei `log.txt`. 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" ///
Beachten Sie, dass wir in diesem Fall eine Standard-Python-Funktion `open()` verwenden, die mit einer Datei interagiert.
Es handelt sich also um I/O (Input/Output), welches โ€žWartenโ€œ erfordert, bis Dinge auf die Festplatte geschrieben werden. /// tip | "Tipp"
Aber `open()` verwendet nicht `async` und `await`. Beachten Sie, dass wir in diesem Fall eine Standard-Python-Funktion `open()` verwenden, die mit einer Datei interagiert.
Daher deklarieren wir die Eventhandler-Funktion mit Standard-`def` statt mit `async def`. Es handelt sich also um I/O (Input/Output), welches โ€žWartenโ€œ erfordert, bis Dinge auf die Festplatte geschrieben werden.
Aber `open()` verwendet nicht `async` und `await`.
Daher deklarieren wir die Eventhandler-Funktion mit Standard-`def` statt mit `async def`.
///
### `startup` und `shutdown` zusammen ### `startup` und `shutdown` zusammen
@ -152,10 +164,13 @@ Nur ein technisches Detail fรผr die neugierigen Nerds. ๐Ÿค“
In der technischen ASGI-Spezifikation ist dies Teil des <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

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

@ -28,17 +28,21 @@ 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.
@ -123,8 +127,11 @@ 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:
@ -140,17 +147,21 @@ In vielen Fรคllen wird Ihre FastAPI-Anwendung grรถรŸer sein und Sie werden wahrs
Beispielsweise kรถnnten Sie einen Abschnitt fรผr **Items (Artikel)** und einen weiteren Abschnitt fรผr **Users (Benutzer)** haben, und diese kรถnnten durch Tags getrennt sein: Beispielsweise kรถnnten Sie einen Abschnitt fรผr **Items (Artikel)** und einen weiteren Abschnitt fรผr **Users (Benutzer)** haben, und diese kรถnnten durch Tags getrennt sein:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="21 26 34"
{!> ../../../docs_src/generate_clients/tutorial002_py39.py!}
```
////
```Python hl_lines="21 26 34" //// tab | Python 3.8+
{!> ../../../docs_src/generate_clients/tutorial002_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="23 28 36"
{!> ../../../docs_src/generate_clients/tutorial002.py!}
```
```Python hl_lines="23 28 36" ////
{!> ../../../docs_src/generate_clients/tutorial002.py!}
```
### Einen TypeScript-Client mit Tags generieren ### Einen TypeScript-Client mit Tags generieren
@ -197,17 +208,21 @@ Hier verwendet sie beispielsweise den ersten Tag (Sie werden wahrscheinlich nur
AnschlieรŸend kรถnnen Sie diese benutzerdefinierte Funktion als Parameter `generate_unique_id_function` an **FastAPI** รผbergeben: AnschlieรŸend kรถnnen Sie diese benutzerdefinierte Funktion als Parameter `generate_unique_id_function` an **FastAPI** รผbergeben:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="6-7 10"
{!> ../../../docs_src/generate_clients/tutorial003_py39.py!}
```
```Python hl_lines="6-7 10" ////
{!> ../../../docs_src/generate_clients/tutorial003_py39.py!}
```
=== "Python 3.8+" //// tab | Python 3.8+
```Python hl_lines="8-9 12"
{!> ../../../docs_src/generate_clients/tutorial003.py!}
```
```Python hl_lines="8-9 12" ////
{!> ../../../docs_src/generate_clients/tutorial003.py!}
```
### Einen TypeScript-Client mit benutzerdefinierten Operation-IDs generieren ### Einen TypeScript-Client mit benutzerdefinierten Operation-IDs generieren
@ -229,17 +244,21 @@ Aber fรผr den generierten Client kรถnnten wir die OpenAPI-Operation-IDs direkt v
Wir kรถnnten das OpenAPI-JSON in eine Datei `openapi.json` herunterladen und dann mit einem Skript wie dem folgenden **den vorangestellten Tag entfernen**: 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
{!> ../../../docs_src/generate_clients/tutorial004.js!}
```
```Javascript ////
{!> ../../../docs_src/generate_clients/tutorial004.js!}
```
Damit wรผrden die Operation-IDs von Dingen wie `items-get_items` in `get_items` umbenannt, sodass der Client-Generator einfachere Methodennamen generieren kann. Damit wรผrden die Operation-IDs von Dingen wie `items-get_items` in `get_items` umbenannt, sodass der Client-Generator einfachere Methodennamen generieren kann.

9
docs/de/docs/advanced/index.md

@ -6,10 +6,13 @@ Das Haupt-[Tutorial โ€“ Benutzerhandbuch](../tutorial/index.md){.internal-link t
In den nรคchsten Abschnitten sehen Sie weitere Optionen, Konfigurationen und zusรคtzliche Funktionen. 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โ€œ**.
Und es ist mรถglich, dass fรผr Ihren Anwendungsfall die Lรถsung in einem davon liegt. Die nรคchsten Abschnitte sind **nicht unbedingt โ€žfortgeschrittenโ€œ**.
Und es ist mรถglich, dass fรผr Ihren Anwendungsfall die Lรถsung in einem davon liegt.
///
## Lesen Sie zuerst das Tutorial ## Lesen Sie zuerst das Tutorial

9
docs/de/docs/advanced/middleware.md

@ -43,10 +43,13 @@ app.add_middleware(UnicornMiddleware, some_config="rainbow")
**FastAPI** enthรคlt mehrere Middlewares fรผr gรคngige Anwendungsfรคlle. Wir werden als Nรคchstes sehen, wie man sie verwendet. **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.
**FastAPI** bietet mehrere Middlewares via `fastapi.middleware` an, als Annehmlichkeit fรผr Sie, den Entwickler. Die meisten verfรผgbaren Middlewares kommen aber direkt von Starlette. Fรผr die nรคchsten Beispiele kรถnnten Sie auch `from starlette.middleware.something import SomethingMiddleware` verwenden.
**FastAPI** bietet mehrere Middlewares via `fastapi.middleware` an, als Annehmlichkeit fรผr Sie, den Entwickler. Die meisten verfรผgbaren Middlewares kommen aber direkt von Starlette.
///
## `HTTPSRedirectMiddleware` ## `HTTPSRedirectMiddleware`

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

@ -35,8 +35,11 @@ Dieser Teil ist ziemlich normal, der grรถรŸte Teil des Codes ist Ihnen wahrschei
{!../../../docs_src/openapi_callbacks/tutorial001.py!} {!../../../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.
@ -61,10 +64,13 @@ Diese Dokumentation wird in der Swagger-Oberflรคche unter `/docs` in Ihrer API a
In diesem Beispiel wird nicht der Callback selbst implementiert (das kรถnnte nur eine Codezeile sein), sondern nur der Dokumentationsteil. 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
@ -74,10 +80,13 @@ Sie wissen jedoch bereits, wie Sie mit **FastAPI** ganz einfach eine automatisch
Daher werden wir dasselbe Wissen nutzen, um zu dokumentieren, wie die *externe API* aussehen sollte ... indem wir die *Pfadoperation(en)* erstellen, welche die externe API implementieren soll (die, welche Ihre API aufruft). 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
@ -154,8 +163,11 @@ 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
@ -167,8 +179,11 @@ Verwenden Sie nun den Parameter `callbacks` im *Pfadoperation-Dekorator Ihrer AP
{!../../../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

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

@ -22,8 +22,11 @@ Mit **FastAPI** kรถnnen Sie mithilfe von OpenAPI die Namen dieser Webhooks, die
Dies kann es Ihren Benutzern viel einfacher machen, **deren APIs zu implementieren**, um Ihre **Webhook**-Requests zu empfangen. Mรถglicherweise kรถnnen diese sogar einen Teil des eigenem API-Codes automatisch generieren. 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
@ -35,8 +38,11 @@ Wenn Sie eine **FastAPI**-Anwendung erstellen, gibt es ein `webhooks`-Attribut,
Die von Ihnen definierten Webhooks landen im **OpenAPI**-Schema und der automatischen **Dokumentations-Oberflรคche**. 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`.

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

@ -2,8 +2,11 @@
## 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.
@ -23,13 +26,19 @@ Sie sollten dies tun, nachdem Sie alle Ihre *Pfadoperationen* hinzugefรผgt haben
{!../../../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"
Wenn Sie dies tun, mรผssen Sie sicherstellen, dass jede Ihrer *Pfadoperation-Funktionen* einen eindeutigen Namen hat.
!!! warning "Achtung" Auch wenn diese sich in unterschiedlichen Modulen (Python-Dateien) befinden.
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. ///
## Von OpenAPI ausschlieรŸen ## Von OpenAPI ausschlieรŸen
@ -65,8 +74,11 @@ Es gibt hier in der Dokumentation ein ganzes Kapitel darรผber, Sie kรถnnen es un
Wenn Sie in Ihrer Anwendung eine *Pfadoperation* deklarieren, generiert **FastAPI** automatisch die relevanten Metadaten dieser *Pfadoperation*, die in das OpenAPI-Schema aufgenommen werden sollen. 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.
@ -74,10 +86,13 @@ Es enthรคlt `tags`, `parameters`, `requestBody`, `responses`, usw.
Dieses *Pfadoperation*-spezifische OpenAPI-Schema wird normalerweise automatisch von **FastAPI** generiert, Sie kรถnnen es aber auch erweitern. 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.
@ -150,20 +165,27 @@ Und Sie kรถnnten dies auch tun, wenn der Datentyp in der Anfrage nicht JSON ist.
In der folgenden Anwendung verwenden wir beispielsweise weder die integrierte Funktionalitรคt von FastAPI zum Extrahieren des JSON-Schemas aus Pydantic-Modellen noch die automatische Validierung fรผr JSON. Tatsรคchlich deklarieren wir den Request-Content-Type als YAML und nicht als JSON: In der folgenden Anwendung verwenden wir beispielsweise weder die integrierte Funktionalitรคt von FastAPI zum Extrahieren des JSON-Schemas aus Pydantic-Modellen noch die automatische Validierung fรผr JSON. Tatsรคchlich deklarieren wir den Request-Content-Type als YAML und nicht als JSON:
=== "Pydantic v2" //// tab | Pydantic v2
```Python hl_lines="17-22 24"
{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007.py!}
```
////
//// tab | Pydantic v1
```Python hl_lines="17-22 24"
{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py!}
```
```Python hl_lines="17-22 24" ////
{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007.py!}
```
=== "Pydantic v1" /// info
```Python hl_lines="17-22 24" 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()`.
{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py!}
```
!!! info ///
In Pydantic Version 1 hieรŸ die Methode zum Abrufen des JSON-Schemas fรผr ein Modell `Item.schema()`, in Pydantic Version 2 heiรŸt die Methode `Item.model_json_schema()`.
Obwohl wir nicht die standardmรครŸig integrierte Funktionalitรคt verwenden, verwenden wir dennoch ein Pydantic-Modell, um das JSON-Schema fรผr die Daten, die wir in YAML empfangen mรถchten, manuell zu generieren. Obwohl wir nicht die standardmรครŸig integrierte Funktionalitรคt verwenden, verwenden wir dennoch ein Pydantic-Modell, um das JSON-Schema fรผr die Daten, die wir in YAML empfangen mรถchten, manuell zu generieren.
@ -171,22 +193,32 @@ Dann verwenden wir den Request direkt und extrahieren den Body als `bytes`. Das
Und dann parsen wir in unserem Code diesen YAML-Inhalt direkt und verwenden dann wieder dasselbe Pydantic-Modell, um den YAML-Inhalt zu validieren: Und dann parsen wir in unserem Code diesen YAML-Inhalt direkt und verwenden dann wieder dasselbe Pydantic-Modell, um den YAML-Inhalt zu validieren:
=== "Pydantic v2" //// tab | Pydantic v2
```Python hl_lines="26-33"
{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007.py!}
```
////
//// tab | Pydantic v1
```Python hl_lines="26-33"
{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py!}
```
////
/// info
```Python hl_lines="26-33" 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()`.
{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007.py!}
```
=== "Pydantic v1" ///
```Python hl_lines="26-33" /// tip | "Tipp"
{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py!}
```
!!! info Hier verwenden wir dasselbe Pydantic-Modell wieder.
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" Aber genauso hรคtten wir es auch auf andere Weise validieren kรถnnen.
Hier verwenden wir dasselbe Pydantic-Modell wieder.
Aber genauso hรคtten wir es auch auf andere Weise validieren kรถnnen. ///

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

@ -30,20 +30,26 @@ Setzen Sie dann Cookies darin und geben Sie sie dann zurรผck:
{!../../../docs_src/response_cookies/tutorial001.py!} {!../../../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.
Sie mรผssen also sicherstellen, dass Ihre Daten vom richtigen Typ sind. Z. B. sollten diese mit JSON kompatibel sein, wenn Sie eine `JSONResponse` zurรผckgeben. Beachten Sie, dass, wenn Sie eine Response direkt zurรผckgeben, anstatt den `Response`-Parameter zu verwenden, FastAPI diese direkt zurรผckgibt.
Und auch, dass Sie keine Daten senden, die durch ein `response_model` hรคtten gefiltert werden sollen. Sie mรผssen also sicherstellen, dass Ihre Daten vom richtigen Typ sind. Z. B. sollten diese mit JSON kompatibel sein, wenn Sie eine `JSONResponse` zurรผckgeben.
Und auch, dass Sie keine Daten senden, die durch ein `response_model` hรคtten gefiltert werden sollen.
///
### Mehr Informationen ### 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.

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

@ -14,8 +14,11 @@ Das kann beispielsweise nรผtzlich sein, um benutzerdefinierte Header oder Cookie
Tatsรคchlich kรถnnen Sie jede `Response` oder jede Unterklasse davon zurรผckgeben. 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.
@ -35,10 +38,13 @@ In diesen Fรคllen kรถnnen Sie den `jsonable_encoder` verwenden, um Ihre Daten zu
{!../../../docs_src/response_directly/tutorial001.py!} {!../../../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

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

@ -28,12 +28,15 @@ Erstellen Sie eine Response wie in [Eine Response direkt zurรผckgeben](response-
{!../../../docs_src/response_headers/tutorial001.py!} {!../../../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.
**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit fรผr Sie, den Entwickler. Die meisten verfรผgbaren Responses kommen aber direkt von Starlette. Sie kรถnnen auch `from starlette.responses import Response` oder `from starlette.responses import JSONResponse` verwenden.
Und da die `Response` hรคufig zum Setzen von Headern und Cookies verwendet wird, stellt **FastAPI** diese auch unter `fastapi.Response` bereit. **FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit fรผr Sie, den Entwickler. Die meisten verfรผgbaren Responses kommen aber direkt von Starlette.
Und da die `Response` hรคufig zum Setzen von Headern und Cookies verwendet wird, stellt **FastAPI** diese auch unter `fastapi.Response` bereit.
///
## Benutzerdefinierte Header ## Benutzerdefinierte Header

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

@ -20,26 +20,35 @@ Wenn Sie dann den Benutzernamen und das Passwort eingeben, sendet der Browser di
* Diese gibt ein Objekt vom Typ `HTTPBasicCredentials` zurรผck: * 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!}
``` ```
////
//// tab | Python 3.8+
```Python hl_lines="2 7 11"
{!> ../../../docs_src/security/tutorial006_an.py!}
```
////
=== "Python 3.8+" //// tab | Python 3.8+ nicht annotiert
```Python hl_lines="2 7 11" /// tip | "Tipp"
{!> ../../../docs_src/security/tutorial006_an.py!}
```
=== "Python 3.8+ nicht annotiert" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
!!! tip "Tipp" ///
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="2 6 10" ```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:
@ -59,26 +68,35 @@ Um dies zu lรถsen, konvertieren wir zunรคchst den `username` und das `password`
Dann kรถnnen wir `secrets.compare_digest()` verwenden, um sicherzustellen, dass `credentials.username` `"stanleyjobson"` und `credentials.password` `"swordfish"` ist. Dann kรถnnen wir `secrets.compare_digest()` verwenden, um sicherzustellen, dass `credentials.username` `"stanleyjobson"` und `credentials.password` `"swordfish"` ist.
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="1 12-24"
{!> ../../../docs_src/security/tutorial007_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="1 12-24" ```Python hl_lines="1 12-24"
{!> ../../../docs_src/security/tutorial007_an_py39.py!} {!> ../../../docs_src/security/tutorial007_an.py!}
``` ```
////
//// tab | Python 3.8+ nicht annotiert
=== "Python 3.8+" /// tip | "Tipp"
```Python hl_lines="1 12-24" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/security/tutorial007_an.py!}
```
=== "Python 3.8+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="1 11-21"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/security/tutorial007.py!}
```
```Python hl_lines="1 11-21" ////
{!> ../../../docs_src/security/tutorial007.py!}
```
Dies wรคre das gleiche wie: Dies wรคre das gleiche wie:
@ -142,23 +160,32 @@ So ist Ihr Anwendungscode, dank der Verwendung von `secrets.compare_digest()`, v
Nachdem Sie festgestellt haben, dass die Anmeldeinformationen falsch sind, geben Sie eine `HTTPException` mit dem Statuscode 401 zurรผck (derselbe, der auch zurรผckgegeben wird, wenn keine Anmeldeinformationen angegeben werden) und fรผgen den Header `WWW-Authenticate` hinzu, damit der Browser die Anmeldeaufforderung erneut anzeigt: Nachdem Sie festgestellt haben, dass die Anmeldeinformationen falsch sind, geben Sie eine `HTTPException` mit dem Statuscode 401 zurรผck (derselbe, der auch zurรผckgegeben wird, wenn keine Anmeldeinformationen angegeben werden) und fรผgen den Header `WWW-Authenticate` hinzu, damit der Browser die Anmeldeaufforderung erneut anzeigt:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="26-30"
{!> ../../../docs_src/security/tutorial007_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="26-30"
{!> ../../../docs_src/security/tutorial007_an.py!}
```
////
```Python hl_lines="26-30" //// tab | Python 3.8+ nicht annotiert
{!> ../../../docs_src/security/tutorial007_an_py39.py!}
```
=== "Python 3.8+" /// tip | "Tipp"
```Python hl_lines="26-30" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/security/tutorial007_an.py!}
```
=== "Python 3.8+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="23-27"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/security/tutorial007.py!}
```
```Python hl_lines="23-27" ////
{!> ../../../docs_src/security/tutorial007.py!}
```

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

@ -4,10 +4,13 @@
Neben den in [Tutorial โ€“ Benutzerhandbuch: Sicherheit](../../tutorial/security/index.md){.internal-link target=_blank} behandelten Funktionen gibt es noch einige zusรคtzliche Funktionen zur Handhabung der Sicherheit. 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โ€œ**.
Und es ist mรถglich, dass fรผr Ihren Anwendungsfall die Lรถsung in einem davon liegt. Die nรคchsten Abschnitte sind **nicht unbedingt โ€žfortgeschrittenโ€œ**.
Und es ist mรถglich, dass fรผr Ihren Anwendungsfall die Lรถsung in einem davon liegt.
///
## Lesen Sie zuerst das Tutorial ## Lesen Sie zuerst das Tutorial

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

@ -10,18 +10,21 @@ Jedes Mal, wenn Sie sich mit Facebook, Google, GitHub, Microsoft oder Twitter an
In diesem Abschnitt erfahren Sie, wie Sie Authentifizierung und Autorisierung mit demselben OAuth2, mit Scopes in Ihrer **FastAPI**-Anwendung verwalten. 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.
Sie benรถtigen nicht unbedingt OAuth2-Scopes, und Sie kรถnnen die Authentifizierung und Autorisierung handhaben wie Sie mรถchten. Dies ist ein mehr oder weniger fortgeschrittener Abschnitt. Wenn Sie gerade erst anfangen, kรถnnen Sie ihn รผberspringen.
Aber OAuth2 mit Scopes kann bequem in Ihre API (mit OpenAPI) und deren API-Dokumentation integriert werden. Sie benรถtigen nicht unbedingt OAuth2-Scopes, und Sie kรถnnen die Authentifizierung und Autorisierung handhaben wie Sie mรถchten.
Dennoch, verwenden Sie solche Scopes oder andere Sicherheits-/Autorisierungsanforderungen in Ihrem Code so wie Sie es mรถchten. Aber OAuth2 mit Scopes kann bequem in Ihre API (mit OpenAPI) und deren API-Dokumentation integriert werden.
In vielen Fรคllen kann OAuth2 mit Scopes ein Overkill sein. Dennoch, verwenden Sie solche Scopes oder andere Sicherheits-/Autorisierungsanforderungen in Ihrem Code so wie Sie es mรถchten.
Aber wenn Sie wissen, dass Sie es brauchen oder neugierig sind, lesen Sie weiter. In vielen Fรคllen kann OAuth2 mit Scopes ein Overkill sein.
Aber wenn Sie wissen, dass Sie es brauchen oder neugierig sind, lesen Sie weiter.
///
## OAuth2-Scopes und OpenAPI ## OAuth2-Scopes und OpenAPI
@ -43,63 +46,87 @@ 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. Diese Details sind implementierungsspezifisch.
Diese Details sind implementierungsspezifisch. Fรผr OAuth2 sind es einfach nur Strings.
Fรผr OAuth2 sind es einfach nur Strings. ///
## Gesamtรผbersicht ## 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"
{!> ../../../docs_src/security/tutorial005_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155"
{!> ../../../docs_src/security/tutorial005_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="2 4 8 12 47 65 106 108-116 122-125 129-135 140 156"
{!> ../../../docs_src/security/tutorial005_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
```Python hl_lines="4 8 12 46 64 105 107-115 121-124 128-134 139 155" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/security/tutorial005_an_py310.py!}
```
=== "Python 3.9+" ///
```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155" ```Python hl_lines="3 7 11 45 63 104 106-114 120-123 127-133 138 154"
{!> ../../../docs_src/security/tutorial005_an_py39.py!} {!> ../../../docs_src/security/tutorial005_py310.py!}
``` ```
=== "Python 3.8+" ////
```Python hl_lines="2 4 8 12 47 65 106 108-116 122-125 129-135 140 156" //// tab | Python 3.9+ nicht annotiert
{!> ../../../docs_src/security/tutorial005_an.py!}
```
=== "Python 3.10+ nicht annotiert" /// tip | "Tipp"
!!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="3 7 11 45 63 104 106-114 120-123 127-133 138 154" ///
{!> ../../../docs_src/security/tutorial005_py310.py!}
```
=== "Python 3.9+ nicht annotiert" ```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155"
{!> ../../../docs_src/security/tutorial005_py39.py!}
```
!!! tip "Tipp" ////
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155" //// tab | Python 3.8+ nicht annotiert
{!> ../../../docs_src/security/tutorial005_py39.py!}
```
=== "Python 3.8+ nicht annotiert" /// tip | "Tipp"
!!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155" ///
{!> ../../../docs_src/security/tutorial005.py!}
``` ```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155"
{!> ../../../docs_src/security/tutorial005.py!}
```
////
Sehen wir uns diese ร„nderungen nun Schritt fรผr Schritt an. Sehen wir uns diese ร„nderungen nun Schritt fรผr Schritt an.
@ -109,51 +136,71 @@ Die erste ร„nderung ist, dass wir jetzt das OAuth2-Sicherheitsschema mit zwei ve
Der `scopes`-Parameter erhรคlt ein `dict` mit jedem Scope als Schlรผssel und dessen Beschreibung als Wert: Der `scopes`-Parameter erhรคlt ein `dict` mit jedem Scope als Schlรผssel und dessen Beschreibung als Wert:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="62-65"
{!> ../../../docs_src/security/tutorial005_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="62-65"
{!> ../../../docs_src/security/tutorial005_an_py39.py!}
```
////
```Python hl_lines="62-65" //// tab | Python 3.8+
{!> ../../../docs_src/security/tutorial005_an_py310.py!}
```
=== "Python 3.9+" ```Python hl_lines="63-66"
{!> ../../../docs_src/security/tutorial005_an.py!}
```
```Python hl_lines="62-65" ////
{!> ../../../docs_src/security/tutorial005_an_py39.py!}
```
=== "Python 3.8+" //// tab | Python 3.10+ nicht annotiert
```Python hl_lines="63-66" /// tip | "Tipp"
{!> ../../../docs_src/security/tutorial005_an.py!}
```
=== "Python 3.10+ nicht annotiert" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
!!! tip "Tipp" ///
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="61-64" ```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.
```Python hl_lines="62-65" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/security/tutorial005_py39.py!}
```
=== "Python 3.8+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="62-65"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/security/tutorial005_py39.py!}
```
```Python hl_lines="62-65" ////
{!> ../../../docs_src/security/tutorial005.py!}
``` //// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="62-65"
{!> ../../../docs_src/security/tutorial005.py!}
```
////
Da wir diese Scopes jetzt deklarieren, werden sie in der API-Dokumentation angezeigt, wenn Sie sich einloggen/autorisieren. Da wir diese Scopes jetzt deklarieren, werden sie in der API-Dokumentation angezeigt, wenn Sie sich einloggen/autorisieren.
@ -171,55 +218,79 @@ Wir verwenden immer noch dasselbe `OAuth2PasswordRequestForm`. Es enthรคlt eine
Und wir geben die Scopes als Teil des JWT-Tokens zurรผck. 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+" ///
```Python hl_lines="155" //// tab | Python 3.10+
{!> ../../../docs_src/security/tutorial005_an_py310.py!}
```
=== "Python 3.9+" ```Python hl_lines="155"
{!> ../../../docs_src/security/tutorial005_an_py310.py!}
```
```Python hl_lines="155" ////
{!> ../../../docs_src/security/tutorial005_an_py39.py!}
```
=== "Python 3.8+" //// tab | Python 3.9+
```Python hl_lines="156" ```Python hl_lines="155"
{!> ../../../docs_src/security/tutorial005_an.py!} {!> ../../../docs_src/security/tutorial005_an_py39.py!}
``` ```
=== "Python 3.10+ nicht annotiert" ////
!!! tip "Tipp" //// tab | Python 3.8+
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="154" ```Python hl_lines="156"
{!> ../../../docs_src/security/tutorial005_py310.py!} {!> ../../../docs_src/security/tutorial005_an.py!}
``` ```
=== "Python 3.9+ nicht annotiert" ////
!!! tip "Tipp" //// tab | Python 3.10+ nicht annotiert
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="155" /// tip | "Tipp"
{!> ../../../docs_src/security/tutorial005_py39.py!}
```
=== "Python 3.8+ nicht annotiert" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
!!! tip "Tipp" ///
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="155" ```Python hl_lines="154"
{!> ../../../docs_src/security/tutorial005.py!} {!> ../../../docs_src/security/tutorial005_py310.py!}
``` ```
////
//// tab | Python 3.9+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="155"
{!> ../../../docs_src/security/tutorial005_py39.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="155"
{!> ../../../docs_src/security/tutorial005.py!}
```
////
## Scopes in *Pfadoperationen* und Abhรคngigkeiten deklarieren ## Scopes in *Pfadoperationen* und Abhรคngigkeiten deklarieren
@ -237,62 +308,89 @@ Und die Abhรคngigkeitsfunktion `get_current_active_user` kann auch Unterabhรคngi
In diesem Fall erfordert sie den Scope `me` (sie kรถnnte mehr als einen Scope erfordern). 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.
///
//// tab | Python 3.10+
```Python hl_lines="4 139 170"
{!> ../../../docs_src/security/tutorial005_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="4 139 170"
{!> ../../../docs_src/security/tutorial005_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="4 140 171"
{!> ../../../docs_src/security/tutorial005_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Wir tun dies hier, um zu demonstrieren, wie **FastAPI** auf verschiedenen Ebenen deklarierte Scopes verarbeitet. Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
=== "Python 3.10+" ///
```Python hl_lines="4 139 170" ```Python hl_lines="3 138 167"
{!> ../../../docs_src/security/tutorial005_an_py310.py!} {!> ../../../docs_src/security/tutorial005_py310.py!}
``` ```
=== "Python 3.9+" ////
```Python hl_lines="4 139 170" //// tab | Python 3.9+ nicht annotiert
{!> ../../../docs_src/security/tutorial005_an_py39.py!}
```
=== "Python 3.8+" /// tip | "Tipp"
```Python hl_lines="4 140 171" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/security/tutorial005_an.py!}
```
=== "Python 3.10+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="4 139 168"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/security/tutorial005_py39.py!}
```
```Python hl_lines="3 138 167" ////
{!> ../../../docs_src/security/tutorial005_py310.py!}
```
=== "Python 3.9+ nicht annotiert" //// tab | Python 3.8+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="4 139 168" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/security/tutorial005_py39.py!}
```
=== "Python 3.8+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="4 139 168"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/security/tutorial005.py!}
```
```Python hl_lines="4 139 168" ////
{!> ../../../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.
Durch die Verwendung von `Security` anstelle von `Depends` weiรŸ **FastAPI** jedoch, dass es Sicherheits-Scopes deklarieren, intern verwenden und die API mit OpenAPI dokumentieren kann. `Security` ist tatsรคchlich eine Unterklasse von `Depends` und hat nur noch einen zusรคtzlichen Parameter, den wir spรคter kennenlernen werden.
Wenn Sie jedoch `Query`, `Path`, `Depends`, `Security` und andere von `fastapi` importieren, handelt es sich tatsรคchlich um Funktionen, die spezielle Klassen zurรผckgeben. Durch die Verwendung von `Security` anstelle von `Depends` weiรŸ **FastAPI** jedoch, dass es Sicherheits-Scopes deklarieren, intern verwenden und die API mit OpenAPI dokumentieren kann.
Wenn Sie jedoch `Query`, `Path`, `Depends`, `Security` und andere von `fastapi` importieren, handelt es sich tatsรคchlich um Funktionen, die spezielle Klassen zurรผckgeben.
///
## `SecurityScopes` verwenden ## `SecurityScopes` verwenden
@ -308,50 +406,71 @@ Wir deklarieren auch einen speziellen Parameter vom Typ `SecurityScopes`, der au
Diese `SecurityScopes`-Klasse รคhnelt `Request` (`Request` wurde verwendet, um das Request-Objekt direkt zu erhalten). Diese `SecurityScopes`-Klasse รคhnelt `Request` (`Request` wurde verwendet, um das Request-Objekt direkt zu erhalten).
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="8 105"
{!> ../../../docs_src/security/tutorial005_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="8 105"
{!> ../../../docs_src/security/tutorial005_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="8 106"
{!> ../../../docs_src/security/tutorial005_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="8 105" ```Python hl_lines="7 104"
{!> ../../../docs_src/security/tutorial005_an_py310.py!} {!> ../../../docs_src/security/tutorial005_py310.py!}
``` ```
=== "Python 3.9+" ////
```Python hl_lines="8 105" //// tab | Python 3.9+ nicht annotiert
{!> ../../../docs_src/security/tutorial005_an_py39.py!}
```
=== "Python 3.8+" /// tip | "Tipp"
```Python hl_lines="8 106" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/security/tutorial005_an.py!}
```
=== "Python 3.10+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="8 105"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/security/tutorial005_py39.py!}
```
```Python hl_lines="7 104" ////
{!> ../../../docs_src/security/tutorial005_py310.py!}
```
=== "Python 3.9+ nicht annotiert" //// tab | Python 3.8+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="8 105" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/security/tutorial005_py39.py!}
```
=== "Python 3.8+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="8 105"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/security/tutorial005.py!}
```
```Python hl_lines="8 105" ////
{!> ../../../docs_src/security/tutorial005.py!}
```
## Die `scopes` verwenden ## Die `scopes` verwenden
@ -365,50 +484,71 @@ Wir erstellen eine `HTTPException`, die wir spรคter an mehreren Stellen wiederve
In diese Exception fรผgen wir (falls vorhanden) die erforderlichen Scopes als durch Leerzeichen getrennten String ein (unter Verwendung von `scope_str`). Wir fรผgen diesen String mit den Scopes in den Header `WWW-Authenticate` ein (das ist Teil der Spezifikation). 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+" ////
```Python hl_lines="105 107-115" //// tab | Python 3.9+
{!> ../../../docs_src/security/tutorial005_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="105 107-115"
{!> ../../../docs_src/security/tutorial005_an_py39.py!}
```
```Python hl_lines="106 108-116" ////
{!> ../../../docs_src/security/tutorial005_an.py!}
```
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.8+
!!! tip "Tipp" ```Python hl_lines="106 108-116"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/security/tutorial005_an.py!}
```
```Python hl_lines="104 106-114" ////
{!> ../../../docs_src/security/tutorial005_py310.py!}
```
=== "Python 3.9+ nicht annotiert" //// tab | Python 3.10+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="105 107-115" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/security/tutorial005_py39.py!}
```
=== "Python 3.8+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="104 106-114"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/security/tutorial005_py310.py!}
```
```Python hl_lines="105 107-115" ////
{!> ../../../docs_src/security/tutorial005.py!}
``` //// tab | Python 3.9+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="105 107-115"
{!> ../../../docs_src/security/tutorial005_py39.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="105 107-115"
{!> ../../../docs_src/security/tutorial005.py!}
```
////
## Den `username` und das Format der Daten รผberprรผfen ## Den `username` und das Format der Daten รผberprรผfen
@ -424,50 +564,71 @@ Anstelle beispielsweise eines `dict`s oder etwas anderem, was spรคter in der Anw
Wir verifizieren auch, dass wir einen Benutzer mit diesem Benutzernamen haben, und wenn nicht, lรถsen wir dieselbe Exception aus, die wir zuvor erstellt haben. Wir verifizieren auch, dass wir einen Benutzer mit diesem Benutzernamen haben, und wenn nicht, lรถsen wir dieselbe Exception aus, die wir zuvor erstellt haben.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="46 116-127"
{!> ../../../docs_src/security/tutorial005_an_py310.py!}
```
```Python hl_lines="46 116-127" ////
{!> ../../../docs_src/security/tutorial005_an_py310.py!}
```
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="46 116-127" ```Python hl_lines="46 116-127"
{!> ../../../docs_src/security/tutorial005_an_py39.py!} {!> ../../../docs_src/security/tutorial005_an_py39.py!}
``` ```
=== "Python 3.8+" ////
```Python hl_lines="47 117-128" //// tab | Python 3.8+
{!> ../../../docs_src/security/tutorial005_an.py!}
```
=== "Python 3.10+ nicht annotiert" ```Python hl_lines="47 117-128"
{!> ../../../docs_src/security/tutorial005_an.py!}
```
!!! tip "Tipp" ////
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="45 115-126" //// tab | Python 3.10+ nicht annotiert
{!> ../../../docs_src/security/tutorial005_py310.py!}
```
=== "Python 3.9+ nicht annotiert" /// tip | "Tipp"
!!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="46 116-127" ///
{!> ../../../docs_src/security/tutorial005_py39.py!}
```
=== "Python 3.8+ nicht annotiert" ```Python hl_lines="45 115-126"
{!> ../../../docs_src/security/tutorial005_py310.py!}
```
!!! tip "Tipp" ////
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="46 116-127" //// tab | Python 3.9+ nicht annotiert
{!> ../../../docs_src/security/tutorial005.py!}
``` /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="46 116-127"
{!> ../../../docs_src/security/tutorial005_py39.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="46 116-127"
{!> ../../../docs_src/security/tutorial005.py!}
```
////
## Die `scopes` verifizieren ## Die `scopes` verifizieren
@ -475,50 +636,71 @@ Wir รผberprรผfen nun, ob das empfangenen Token alle Scopes enthรคlt, die von die
Hierzu verwenden wir `security_scopes.scopes`, das eine `list`e mit allen diesen Scopes als `str` enthรคlt. Hierzu verwenden wir `security_scopes.scopes`, das eine `list`e mit allen diesen Scopes als `str` enthรคlt.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="128-134"
{!> ../../../docs_src/security/tutorial005_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="128-134" ```Python hl_lines="128-134"
{!> ../../../docs_src/security/tutorial005_an_py310.py!} {!> ../../../docs_src/security/tutorial005_an_py39.py!}
``` ```
=== "Python 3.9+" ////
```Python hl_lines="128-134" //// tab | Python 3.8+
{!> ../../../docs_src/security/tutorial005_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="129-135"
{!> ../../../docs_src/security/tutorial005_an.py!}
```
```Python hl_lines="129-135" ////
{!> ../../../docs_src/security/tutorial005_an.py!}
```
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.10+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="127-133" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/security/tutorial005_py310.py!}
```
=== "Python 3.9+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="127-133"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/security/tutorial005_py310.py!}
```
```Python hl_lines="128-134" ////
{!> ../../../docs_src/security/tutorial005_py39.py!}
```
=== "Python 3.8+ nicht annotiert" //// tab | Python 3.9+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="128-134" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/security/tutorial005.py!}
``` ///
```Python hl_lines="128-134"
{!> ../../../docs_src/security/tutorial005_py39.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="128-134"
{!> ../../../docs_src/security/tutorial005.py!}
```
////
## Abhรคngigkeitsbaum und Scopes ## Abhรคngigkeitsbaum und Scopes
@ -545,10 +727,13 @@ So sieht die Hierarchie der Abhรคngigkeiten und Scopes aus:
* `security_scopes.scopes` enthรคlt `["me"]` fรผr die *Pfadoperation* `read_users_me`, da das in der Abhรคngigkeit `get_current_active_user` deklariert ist. * `security_scopes.scopes` 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`.
@ -586,10 +771,13 @@ Am hรคufigsten ist der โ€žImplicitโ€œ-Flow.
Am sichersten ist der โ€žCodeโ€œ-Flow, die Implementierung ist jedoch komplexer, da mehr Schritte erforderlich sind. Da er komplexer ist, schlagen viele Anbieter letztendlich den โ€žImplicitโ€œ-Flow vor. 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`.

299
docs/de/docs/advanced/settings.md

@ -8,44 +8,51 @@ 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">
```console ```console
// Sie kรถnnten eine Umgebungsvariable MY_NAME erstellen mittels // Sie kรถnnten eine Umgebungsvariable MY_NAME erstellen mittels
$ export MY_NAME="Wade Wilson" $ export MY_NAME="Wade Wilson"
// Dann kรถnnten Sie diese mit anderen Programmen verwenden, etwa // Dann kรถnnten Sie diese mit anderen Programmen verwenden, etwa
$ echo "Hello $MY_NAME" $ echo "Hello $MY_NAME"
Hello Wade Wilson
```
</div>
Hello Wade Wilson ////
```
</div> //// tab | Windows PowerShell
=== "Windows PowerShell" <div class="termy">
<div class="termy"> ```console
// Erstelle eine Umgebungsvariable MY_NAME
$ $Env:MY_NAME = "Wade Wilson"
```console // Verwende sie mit anderen Programmen, etwa
// Erstelle eine Umgebungsvariable MY_NAME $ echo "Hello $Env:MY_NAME"
$ $Env:MY_NAME = "Wade Wilson"
// Verwende sie mit anderen Programmen, etwa Hello Wade Wilson
$ echo "Hello $Env:MY_NAME" ```
Hello Wade Wilson </div>
```
</div> ////
### Umgebungsvariablen mit Python auslesen ### Umgebungsvariablen mit Python auslesen
@ -60,10 +67,13 @@ 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:
@ -114,8 +124,11 @@ 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
@ -151,8 +164,11 @@ $ 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
@ -162,23 +178,33 @@ 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"
{!> ../../../docs_src/settings/tutorial001.py!}
```
////
//// tab | Pydantic v1
```Python hl_lines="2 5-8 11" /// info
{!> ../../../docs_src/settings/tutorial001.py!}
``` In Pydantic v1 wรผrden Sie `BaseSettings` direkt von `pydantic` statt von `pydantic_settings` importieren.
///
```Python hl_lines="2 5-8 11"
{!> ../../../docs_src/settings/tutorial001_pv1.py!}
```
=== "Pydantic v1" ////
!!! info /// tip | "Tipp"
In Pydantic v1 wรผrden Sie `BaseSettings` direkt von `pydantic` statt von `pydantic_settings` importieren.
```Python hl_lines="2 5-8 11" Fรผr ein schnelles Copy-and-paste verwenden Sie nicht dieses Beispiel, sondern das letzte unten.
{!> ../../../docs_src/settings/tutorial001_pv1.py!}
```
!!! tip "Tipp" ///
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.
@ -206,8 +232,11 @@ $ 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.
@ -231,8 +260,11 @@ Und dann verwenden Sie diese in einer Datei `main.py`:
{!../../../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
@ -254,54 +286,75 @@ 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+" ////
```Python hl_lines="6 12-13" //// tab | Python 3.8+
{!> ../../../docs_src/settings/app02_an/main.py!}
```
=== "Python 3.8+ nicht annotiert" ```Python hl_lines="6 12-13"
{!> ../../../docs_src/settings/app02_an/main.py!}
```
////
!!! tip "Tipp" //// tab | Python 3.8+ nicht annotiert
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="5 11-12" /// tip | "Tipp"
{!> ../../../docs_src/settings/app02/main.py!}
```
!!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
Wir werden das `@lru_cache` in Kรผrze besprechen.
Im Moment nehmen Sie an, dass `get_settings()` eine normale Funktion ist. ///
```Python hl_lines="5 11-12"
{!> ../../../docs_src/settings/app02/main.py!}
```
////
/// tip | "Tipp"
Wir werden das `@lru_cache` in Kรผrze besprechen.
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"
{!> ../../../docs_src/settings/app02_an_py39/main.py!}
```
////
//// tab | Python 3.8+
```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/main.py!}
``` ```
////
=== "Python 3.8+" //// tab | Python 3.8+ nicht annotiert
```Python hl_lines="17 19-21" /// tip | "Tipp"
{!> ../../../docs_src/settings/app02_an/main.py!}
```
=== "Python 3.8+ nicht annotiert" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
!!! tip "Tipp" ///
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="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
@ -321,15 +374,21 @@ 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
@ -344,26 +403,39 @@ 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>.
=== "Pydantic v1" 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>.
```Python hl_lines="9-10" ///
{!> ../../../docs_src/settings/app03_an/config_pv1.py!}
```
!!! 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>.
!!! info //// tab | Pydantic v1
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.
```Python hl_lines="9-10"
{!> ../../../docs_src/settings/app03_an/config_pv1.py!}
```
/// 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>.
///
////
/// 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.
///
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.
@ -390,26 +462,35 @@ 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!}
``` ```
////
//// tab | Python 3.8+
```Python hl_lines="1 11"
{!> ../../../docs_src/settings/app03_an/main.py!}
```
////
=== "Python 3.8+" //// tab | Python 3.8+ nicht annotiert
```Python hl_lines="1 11" /// tip | "Tipp"
{!> ../../../docs_src/settings/app03_an/main.py!}
```
=== "Python 3.8+ nicht annotiert" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
!!! tip "Tipp" ///
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="1 10"
{!> ../../../docs_src/settings/app03/main.py!}
```
```Python hl_lines="1 10" ////
{!> ../../../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.

25
docs/de/docs/advanced/templates.md

@ -31,18 +31,27 @@ $ pip install jinja2
{!../../../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.
AuรŸerdem wurde in frรผheren Versionen das `request`-Objekt als Teil der Schlรผssel-Wert-Paare im Kontext fรผr Jinja2 รผbergeben. Vor FastAPI 0.108.0 und Starlette 0.29.0 war `name` der erste Parameter.
!!! tip "Tipp" AuรŸerdem wurde in frรผheren Versionen das `request`-Objekt als Teil der Schlรผssel-Wert-Paare im Kontext fรผr Jinja2 รผbergeben.
Durch die Deklaration von `response_class=HTMLResponse` kann die Dokumentationsoberflรคche erkennen, dass die Response HTML sein wird.
!!! note "Technische Details" ///
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`. /// tip | "Tipp"
Durch die Deklaration von `response_class=HTMLResponse` kann die Dokumentationsoberflรคche erkennen, dass die Response HTML sein wird.
///
/// note | "Technische Details"
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`.
///
## Templates erstellen ## Templates erstellen

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

@ -28,48 +28,67 @@ 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!}
``` ```
////
//// tab | Python 3.9+
```Python hl_lines="28-29 32"
{!> ../../../docs_src/dependency_testing/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="29-30 33"
{!> ../../../docs_src/dependency_testing/tutorial001_an.py!}
```
=== "Python 3.9+" ////
```Python hl_lines="28-29 32" //// tab | Python 3.10+ nicht annotiert
{!> ../../../docs_src/dependency_testing/tutorial001_an_py39.py!}
```
=== "Python 3.8+" /// tip | "Tipp"
```Python hl_lines="29-30 33" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/dependency_testing/tutorial001_an.py!}
```
=== "Python 3.10+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="24-25 28"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/dependency_testing/tutorial001_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
```Python hl_lines="24-25 28" /// tip | "Tipp"
{!> ../../../docs_src/dependency_testing/tutorial001_py310.py!}
```
=== "Python 3.8+ nicht annotiert" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
!!! tip "Tipp" ///
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="28-29 32"
{!> ../../../docs_src/dependency_testing/tutorial001.py!}
```
```Python hl_lines="28-29 32" ////
{!> ../../../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.
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. Sie kรถnnen eine รœberschreibung fรผr eine Abhรคngigkeit festlegen, die an einer beliebigen Stelle in Ihrer **FastAPI**-Anwendung verwendet wird.
FastAPI kann sie in jedem Fall รผberschreiben. 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.
///
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:
@ -77,5 +96,8 @@ AnschlieรŸend kรถnnen Sie Ihre รœberschreibungen zurรผcksetzen (entfernen), inde
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.
///

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

@ -8,5 +8,8 @@ Dazu verwenden Sie den `TestClient` in einer `with`-Anweisung, eine Verbindung z
{!../../../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>.
///

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

@ -35,18 +35,24 @@ Dazu mรผssen Sie direkt auf den Request zugreifen.
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.
Der Pfad-Parameter wird also extrahiert, validiert, in den spezifizierten Typ konvertiert und mit OpenAPI annotiert. Beachten Sie, dass wir in diesem Fall einen Pfad-Parameter zusรคtzlich zum Request-Parameter deklarieren.
Auf die gleiche Weise kรถnnen Sie wie gewohnt jeden anderen Parameter deklarieren und zusรคtzlich auch den `Request` erhalten. 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.
///
## `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. ///

120
docs/de/docs/advanced/websockets.md

@ -50,10 +50,13 @@ Erstellen Sie in Ihrer **FastAPI**-Anwendung einen `websocket`:
{!../../../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.
**FastAPI** stellt den gleichen `WebSocket` direkt zur Verfรผgung, als Annehmlichkeit fรผr Sie, den Entwickler. Er kommt aber direkt von Starlette. 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.
///
## Nachrichten erwarten und Nachrichten senden ## Nachrichten erwarten und Nachrichten senden
@ -112,46 +115,65 @@ 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"
{!> ../../../docs_src/websockets/tutorial002_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="68-69 82"
{!> ../../../docs_src/websockets/tutorial002_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="69-70 83"
{!> ../../../docs_src/websockets/tutorial002_an.py!}
```
////
```Python hl_lines="68-69 82" //// tab | Python 3.10+ nicht annotiert
{!> ../../../docs_src/websockets/tutorial002_an_py310.py!}
```
=== "Python 3.9+" /// tip | "Tipp"
```Python hl_lines="68-69 82" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/websockets/tutorial002_an_py39.py!}
```
=== "Python 3.8+" ///
```Python hl_lines="69-70 83" ```Python hl_lines="66-67 79"
{!> ../../../docs_src/websockets/tutorial002_an.py!} {!> ../../../docs_src/websockets/tutorial002_py310.py!}
``` ```
////
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.8+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="66-67 79" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/websockets/tutorial002_py310.py!}
```
=== "Python 3.8+ nicht annotiert" ///
```Python hl_lines="68-69 81"
{!> ../../../docs_src/websockets/tutorial002.py!}
```
!!! tip "Tipp" ////
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="68-69 81" /// info
{!> ../../../docs_src/websockets/tutorial002.py!}
```
!!! 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
@ -174,8 +196,11 @@ 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:
@ -185,17 +210,21 @@ 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!}
``` ```
////
//// tab | Python 3.8+
=== "Python 3.8+" ```Python hl_lines="81-83"
{!> ../../../docs_src/websockets/tutorial003.py!}
```
```Python hl_lines="81-83" ////
{!> ../../../docs_src/websockets/tutorial003.py!}
```
Zum Ausprobieren: Zum Ausprobieren:
@ -209,12 +238,15 @@ 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

227
docs/de/docs/alternatives.md

@ -30,12 +30,17 @@ 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**" ///
Eine automatische API-Dokumentationsoberflรคche zu haben.
/// check | "Inspirierte **FastAPI**"
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>
@ -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.
รœber ein einfaches und benutzerfreundliches Routingsystem zu verfรผgen. 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.
///
### <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.
* HTTP-Methodennamen (Operationen) direkt, auf einfache und intuitive Weise zu verwenden. * รœber eine einfache und intuitive API zu verfรผgen.
* Vernรผnftige Standardeinstellungen zu haben, aber auch mรคchtige Einstellungsmรถglichkeiten. * HTTP-Methodennamen (Operationen) direkt, auf einfache und intuitive Weise zu verwenden.
* 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,15 +118,18 @@ 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:
* <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a> * <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a>
* <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a> * <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a>
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
@ -135,8 +147,11 @@ 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>
@ -148,11 +163,17 @@ 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>
@ -172,12 +193,17 @@ 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>
@ -199,11 +225,17 @@ 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>)
@ -219,24 +251,33 @@ 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**" ///
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). /// check | "Inspirierte **FastAPI**"
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).
///
### <a href="https://falconframework.org/" class="external-link" target="_blank">Falcon</a> ### <a href="https://falconframework.org/" class="external-link" target="_blank">Falcon</a>
@ -246,12 +287,15 @@ 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.
Zusammen mit Hug (da Hug auf Falcon basiert), einen `response`-Parameter in Funktionen zu deklarieren. Wege zu finden, eine groรŸartige Performanz zu erzielen.
Obwohl er in FastAPI optional ist und hauptsรคchlich zum Festlegen von Headern, Cookies und alternativen Statuscodes verwendet wird. 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.
///
### <a href="https://moltenframework.com/" class="external-link" target="_blank">Molten</a> ### <a href="https://moltenframework.com/" class="external-link" target="_blank">Molten</a>
@ -269,10 +313,13 @@ 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>
@ -288,15 +335,21 @@ 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 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 Teile von APIStar und war eines der Tools, die ich am vielversprechendsten fand, neben APIStar.
Hug inspirierte **FastAPI** dazu, einen `response`-Parameter in Funktionen zu deklarieren, um Header und Cookies zu setzen. 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.
///
### <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)
@ -322,23 +375,29 @@ 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**" ///
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. /// check | "Inspirierte **FastAPI**"
Und nach einer langen Suche nach einem รคhnlichen Framework und dem Testen vieler verschiedener Alternativen, war APIStar die beste verfรผgbare Option. Zu existieren.
Dann hรถrte APIStar auf, als Server zu existieren, und Starlette wurde geschaffen, welches eine neue, bessere Grundlage fรผr ein solches System bildete. Das war die finale Inspiration fรผr die Entwicklung von **FastAPI**. 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.
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. Und nach einer langen Suche nach einem รคhnlichen Framework und dem Testen vieler verschiedener Alternativen, war APIStar die beste verfรผgbare Option.
Dann hรถrte APIStar auf, als Server zu existieren, und Starlette wurde geschaffen, welches eine neue, bessere Grundlage fรผr ein solches System bildete. Das war die finale Inspiration fรผr die Entwicklung von **FastAPI**.
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**
@ -350,10 +409,13 @@ 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.
**FastAPI** nimmt dann, abgesehen von all den anderen Dingen, die es tut, dieses JSON-Schema und fรผgt es in OpenAPI ein. 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.
///
### <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>
@ -382,17 +444,23 @@ 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" ///
Alle Kern-Webaspekte zu handhaben. Und fรผgt Funktionen obenauf.
Die Klasse `FastAPI` selbst erbt direkt von der Klasse `Starlette`. /// check | "**FastAPI** verwendet es, um"
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. Alle Kern-Webaspekte zu handhaben. Und fรผgt Funktionen obenauf.
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.
///
### <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>
@ -402,12 +470,15 @@ 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

32
docs/de/docs/async.md

@ -21,8 +21,11 @@ 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.
///
--- ---
@ -136,8 +139,11 @@ 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>. ๐ŸŽจ
///
--- ---
@ -199,8 +205,11 @@ 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>. ๐ŸŽจ
///
--- ---
@ -392,12 +401,15 @@ 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

177
docs/de/docs/contributing.md

@ -24,63 +24,73 @@ 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">
```console ```console
$ source ./env/bin/activate $ source ./env/bin/activate
``` ```
</div> </div>
=== "Windows PowerShell" ////
<div class="termy"> //// tab | Windows PowerShell
```console <div class="termy">
$ .\env\Scripts\Activate.ps1
```
</div> ```console
$ .\env\Scripts\Activate.ps1
```
=== "Windows Bash" </div>
////
//// 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>):
<div class="termy"> <div class="termy">
```console
$ source ./env/Scripts/activate
```
```console </div>
$ source ./env/Scripts/activate
```
</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">
```console ```console
$ which pip $ which pip
some/directory/fastapi/env/bin/pip some/directory/fastapi/env/bin/pip
``` ```
</div> </div>
=== "Windows PowerShell" ////
<div class="termy"> //// tab | Windows PowerShell
```console <div class="termy">
$ Get-Command pip
some/directory/fastapi/env/bin/pip ```console
``` $ Get-Command pip
some/directory/fastapi/env/bin/pip
```
</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. ๐ŸŽ‰
@ -96,10 +106,13 @@ $ 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
@ -125,10 +138,13 @@ 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
@ -170,20 +186,23 @@ 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.
Gehen Sie in das Verzeichnis fรผr die entsprechende Sprache. Das fรผr die englischsprachige Hauptdokumentation befindet sich unter `docs/en/`: Alternativ kรถnnen Sie die Schritte des Skripts auch manuell ausfรผhren.
```console Gehen Sie in das Verzeichnis fรผr die entsprechende Sprache. Das fรผr die englischsprachige Hauptdokumentation befindet sich unter `docs/en/`:
$ cd docs/en/
```
Fรผhren Sie dann `mkdocs` in diesem Verzeichnis aus: ```console
$ cd docs/en/
```
```console Fรผhren Sie dann `mkdocs` in diesem Verzeichnis aus:
$ mkdocs serve --dev-addr 8008
``` ```console
$ mkdocs serve --dev-addr 8008
```
///
#### Typer-CLI (optional) #### Typer-CLI (optional)
@ -210,8 +229,11 @@ 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/`.
@ -261,10 +283,13 @@ 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.
@ -278,8 +303,11 @@ 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:
@ -296,20 +324,23 @@ $ 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/`:
```console
$ cd docs/es/
```
```console Dann fรผhren Sie in dem Verzeichnis `mkdocs` aus:
$ cd docs/es/
```
Dann fรผhren Sie in dem Verzeichnis `mkdocs` aus: ```console
$ mkdocs serve --dev-addr 8008
```
```console ///
$ 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.
@ -329,8 +360,11 @@ 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). ๐ŸŽ‰
@ -365,8 +399,11 @@ 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.

34
docs/de/docs/deployment/concepts.md

@ -151,10 +151,13 @@ 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.
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. ... 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.
///
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.
@ -238,10 +241,13 @@ 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
@ -257,10 +263,13 @@ 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.
In diesem Fall mรผssen Sie sich darรผber keine Sorgen machen. ๐Ÿคท 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. ๐Ÿคท
///
### Beispiele fรผr Strategien fรผr Vorab-Schritte ### Beispiele fรผr Strategien fรผr Vorab-Schritte
@ -272,8 +281,11 @@ 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

74
docs/de/docs/deployment/docker.md

@ -4,8 +4,11 @@ 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,10 +133,13 @@ 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
@ -222,8 +228,11 @@ 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,10 +302,13 @@ $ 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
@ -394,8 +406,11 @@ 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).
@ -423,8 +438,11 @@ 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.
@ -503,8 +521,11 @@ 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.
@ -520,8 +541,11 @@ 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.
@ -529,8 +553,11 @@ Es verfรผgt รผber **vernรผnftige Standardeinstellungen**, aber Sie kรถnnen trotz
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
@ -657,8 +684,11 @@ 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.

21
docs/de/docs/deployment/https.md

@ -4,8 +4,11 @@ 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.
@ -68,8 +71,11 @@ 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
@ -115,8 +121,11 @@ 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

90
docs/de/docs/deployment/manually.md

@ -22,75 +22,89 @@ 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.
<div class="termy"> <div class="termy">
```console
$ pip install "uvicorn[standard]"
```console ---> 100%
$ pip install "uvicorn[standard]" ```
</div>
---> 100% /// tip | "Tipp"
```
</div> Durch das Hinzufรผgen von `standard` installiert und verwendet Uvicorn einige empfohlene zusรคtzliche Abhรคngigkeiten.
!!! tip "Tipp" Inklusive `uvloop`, einen hochperformanten Drop-in-Ersatz fรผr `asyncio`, welcher fรผr einen groรŸen Leistungsschub bei der Nebenlรคufigkeit sorgt.
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. ///
=== "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. //// tab | Hypercorn
<div class="termy"> * <a href="https://github.com/pgjones/hypercorn" class="external-link" target="_blank">Hypercorn</a>, ein ASGI-Server, der auch mit HTTP/2 kompatibel ist.
```console <div class="termy">
$ pip install hypercorn
```console
$ pip install hypercorn
---> 100%
```
---> 100% </div>
```
</div> ... 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">
```console ```console
$ uvicorn main:app --host 0.0.0.0 --port 80 $ uvicorn main:app --host 0.0.0.0 --port 80
<span style="color: green;">INFO</span>: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit) <span style="color: green;">INFO</span>: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)
``` ```
</div> </div>
////
=== "Hypercorn" //// tab | Hypercorn
<div class="termy"> <div class="termy">
```console
$ hypercorn main:app --bind 0.0.0.0:80
Running on 0.0.0.0:8080 over http (CTRL + C to quit)
```
</div>
```console ////
$ hypercorn main:app --bind 0.0.0.0:80
Running on 0.0.0.0:8080 over http (CTRL + C to quit) /// warning | "Achtung"
```
</div> Denken Sie daran, die Option `--reload` zu entfernen, wenn Sie diese verwendet haben.
!!! warning "Achtung" Die Option `--reload` verbraucht viel mehr Ressourcen, ist instabiler, usw.
Denken Sie daran, die Option `--reload` zu entfernen, wenn Sie diese verwendet haben.
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

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

@ -17,10 +17,13 @@ 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}.
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. 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.
///
## Gunicorn mit Uvicorn-Workern ## Gunicorn mit Uvicorn-Workern

14
docs/de/docs/deployment/versions.md

@ -42,8 +42,11 @@ 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:
@ -53,8 +56,11 @@ 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

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

@ -6,11 +6,17 @@ Es gibt viele Beitrรคge, Artikel, Tools und Projekte zum Thema **FastAPI**.
Hier ist eine unvollstรคndige Liste einiger davon. Hier ist eine unvollstรคndige Liste einiger davon.
!!! tip "Tipp" /// 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" 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>.
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.
///
/// 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() %} {% for section_name, section_content in external_links.items() %}

9
docs/de/docs/features.md

@ -64,10 +64,13 @@ 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:
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")`. `**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")`.
///
### Editor Unterstรผtzung ### Editor Unterstรผtzung

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

@ -169,12 +169,15 @@ 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.
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. ๐Ÿ˜… Leider kann ich PRs, nur weil sie von Mehreren gutgeheiรŸen wurden, nicht einfach vertrauen.
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. ๐Ÿค“ 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. ๐Ÿค“
///
* 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.
@ -225,10 +228,13 @@ 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

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

@ -40,12 +40,15 @@ Und genau so fรผr ReDoc ...
{!../../../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.
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. Die *Pfadoperation* fรผr `swagger_ui_redirect` ist ein Hilfsmittel bei der Verwendung von OAuth2.
Swagger UI erledigt das hinter den Kulissen fรผr Sie, benรถtigt aber diesen โ€žUmleitungsโ€œ-Helfer. 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.
///
### Eine *Pfadoperation* erstellen, um es zu testen ### Eine *Pfadoperation* erstellen, um es zu testen
@ -177,12 +180,15 @@ Und genau so fรผr ReDoc ...
{!../../../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

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

@ -6,10 +6,13 @@ 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.
Wenn Sie gerade erst mit **FastAPI** beginnen, mรถchten Sie diesen Abschnitt vielleicht รผberspringen. Dies ist eine โ€žfortgeschritteneโ€œ Funktion.
Wenn Sie gerade erst mit **FastAPI** beginnen, mรถchten Sie diesen Abschnitt vielleicht รผberspringen.
///
## Anwendungsfรคlle ## Anwendungsfรคlle
@ -27,8 +30,11 @@ 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.
@ -54,16 +60,19 @@ Hier verwenden wir sie, um aus dem ursprรผnglichen Request einen `GzipRequest` z
{!../../../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 auch ein `request.receive`, welches eine Funktion ist, die den Hauptteil des Requests empfรคngt. Ein `Request` hat ein `request.scope`-Attribut, welches einfach ein Python-`dict` ist, welches die mit dem Request verbundenen Metadaten enthรคlt.
Das `scope`-`dict` und die `receive`-Funktion sind beide Teil der ASGI-Spezifikation. Ein `Request` hat auch ein `request.receive`, welches eine Funktion ist, die den Hauptteil des Requests empfรคngt.
Und diese beiden Dinge, `scope` und `receive`, werden benรถtigt, um eine neue `Request`-Instanz zu erstellen. Das `scope`-`dict` und die `receive`-Funktion sind beide Teil der ASGI-Spezifikation.
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. Und diese beiden Dinge, `scope` und `receive`, werden benรถtigt, um eine neue `Request`-Instanz zu erstellen.
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`.
@ -75,10 +84,13 @@ 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.

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

@ -27,8 +27,11 @@ 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

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

@ -4,12 +4,15 @@ 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.
Es hat **Vorteile** und **Nachteile** im Vergleich zu gรคngigen **Web-APIs**. **GraphQL** lรถst einige sehr spezifische Anwendungsfรคlle.
Wiegen Sie ab, ob die **Vorteile** fรผr Ihren Anwendungsfall die **Nachteile** ausgleichen. ๐Ÿค“ 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. ๐Ÿค“
///
## GraphQL-Bibliotheken ## GraphQL-Bibliotheken
@ -46,8 +49,11 @@ 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

7
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}.
///

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

@ -10,111 +10,123 @@ 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 ๐Ÿ‘‡
``` ```
<details> <details>
<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+" ////
```Python hl_lines="9" //// tab | Python 3.9+
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py[ln:1-9]!}
# Code unterhalb weggelassen ๐Ÿ‘‡ ```Python hl_lines="9"
``` {!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py[ln:1-9]!}
<details> # Code unterhalb weggelassen ๐Ÿ‘‡
<summary>๐Ÿ‘€ Vollstรคndige Dateivorschau</summary> ```
```Python <details>
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py!} <summary>๐Ÿ‘€ Vollstรคndige Dateivorschau</summary>
```
</details> ```Python
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py!}
```
=== "Python 3.8+" </details>
```Python hl_lines="9" ////
{!> ../../../docs_src/separate_openapi_schemas/tutorial001.py[ln:1-9]!}
# Code unterhalb weggelassen ๐Ÿ‘‡ //// tab | Python 3.8+
```
<details> ```Python hl_lines="9"
<summary>๐Ÿ‘€ Vollstรคndige Dateivorschau</summary> {!> ../../../docs_src/separate_openapi_schemas/tutorial001.py[ln:1-9]!}
```Python # Code unterhalb weggelassen ๐Ÿ‘‡
{!> ../../../docs_src/separate_openapi_schemas/tutorial001.py!} ```
```
</details> <details>
<summary>๐Ÿ‘€ Vollstรคndige Dateivorschau</summary>
```Python
{!> ../../../docs_src/separate_openapi_schemas/tutorial001.py!}
```
</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"
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py[ln:1-15]!}
```Python hl_lines="14" # Code unterhalb weggelassen ๐Ÿ‘‡
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py[ln:1-15]!} ```
# Code unterhalb weggelassen ๐Ÿ‘‡ <details>
``` <summary>๐Ÿ‘€ Vollstรคndige Dateivorschau</summary>
<details> ```Python
<summary>๐Ÿ‘€ Vollstรคndige Dateivorschau</summary> {!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py!}
```
```Python </details>
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py!}
```
</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 ๐Ÿ‘‡
``` ```
<details> <details>
<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+" ////
```Python hl_lines="16" //// tab | Python 3.8+
{!> ../../../docs_src/separate_openapi_schemas/tutorial001.py[ln:1-17]!}
# Code unterhalb weggelassen ๐Ÿ‘‡ ```Python hl_lines="16"
``` {!> ../../../docs_src/separate_openapi_schemas/tutorial001.py[ln:1-17]!}
<details> # Code unterhalb weggelassen ๐Ÿ‘‡
<summary>๐Ÿ‘€ Vollstรคndige Dateivorschau</summary> ```
```Python <details>
{!> ../../../docs_src/separate_openapi_schemas/tutorial001.py!} <summary>๐Ÿ‘€ Vollstรคndige Dateivorschau</summary>
```
</details> ```Python
{!> ../../../docs_src/separate_openapi_schemas/tutorial001.py!}
```
</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.
@ -130,23 +142,29 @@ 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"
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py!}
```
```Python hl_lines="19" ////
{!> ../../../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+" ////
```Python hl_lines="21" //// tab | Python 3.8+
{!> ../../../docs_src/separate_openapi_schemas/tutorial001.py!}
``` ```Python hl_lines="21"
{!> ../../../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.
@ -199,26 +217,35 @@ 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. ๐Ÿค“
///
//// tab | Python 3.10+
```Python hl_lines="10"
{!> ../../../docs_src/separate_openapi_schemas/tutorial002_py310.py!}
```
////
=== "Python 3.10+" //// tab | Python 3.9+
```Python hl_lines="10" ```Python hl_lines="12"
{!> ../../../docs_src/separate_openapi_schemas/tutorial002_py310.py!} {!> ../../../docs_src/separate_openapi_schemas/tutorial002_py39.py!}
``` ```
=== "Python 3.9+" ////
```Python hl_lines="12" //// tab | Python 3.8+
{!> ../../../docs_src/separate_openapi_schemas/tutorial002_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="12"
{!> ../../../docs_src/separate_openapi_schemas/tutorial002.py!}
```
```Python hl_lines="12" ////
{!> ../../../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

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

@ -12,8 +12,11 @@ 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
@ -170,45 +173,55 @@ 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 (`:`).
Als Typ nehmen Sie `list`. Als Typ nehmen Sie `list`.
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+" ////
Von `typing` importieren Sie `List` (mit GroรŸbuchstaben `L`): //// tab | Python 3.8+
```Python hl_lines="1" Von `typing` importieren Sie `List` (mit GroรŸbuchstaben `L`):
{!> ../../../docs_src/python_types/tutorial006.py!}
```
Deklarieren Sie die Variable mit der gleichen Doppelpunkt-Syntax (`:`). ```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial006.py!}
```
Deklarieren Sie die Variable mit der gleichen Doppelpunkt-Syntax (`:`).
Als Typ nehmen Sie das `List`, das Sie von `typing` importiert haben. Als Typ nehmen Sie das `List`, das Sie von `typing` importiert haben.
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"
{!> ../../../docs_src/python_types/tutorial006.py!}
```
```Python hl_lines="4" ////
{!> ../../../docs_src/python_types/tutorial006.py!}
```
!!! tip "Tipp" /// tip | "Tipp"
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). 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).
///
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:
@ -224,17 +237,21 @@ 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+" ////
```Python hl_lines="1 4" //// tab | Python 3.8+
{!> ../../../docs_src/python_types/tutorial007.py!}
``` ```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial007.py!}
```
////
Das bedeutet: Das bedeutet:
@ -249,17 +266,21 @@ 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"
{!> ../../../docs_src/python_types/tutorial008_py39.py!}
```
////
```Python hl_lines="1" //// tab | Python 3.8+
{!> ../../../docs_src/python_types/tutorial008_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial008.py!}
```
```Python hl_lines="1 4" ////
{!> ../../../docs_src/python_types/tutorial008.py!}
```
Das bedeutet: Das bedeutet:
@ -275,17 +296,21 @@ 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!}
``` ```
////
//// tab | Python 3.8+
=== "Python 3.8+" ```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial008b.py!}
```
```Python hl_lines="1 4" ////
{!> ../../../docs_src/python_types/tutorial008b.py!}
```
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.
@ -305,23 +330,29 @@ 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"
{!> ../../../docs_src/python_types/tutorial009_py310.py!}
```
////
```Python hl_lines="1" //// tab | Python 3.8+
{!> ../../../docs_src/python_types/tutorial009_py310.py!}
```
=== "Python 3.8+" ```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial009.py!}
```
```Python hl_lines="1 4" ////
{!> ../../../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?
@ -366,47 +397,53 @@ 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):
* `list`
* `tuple`
* `set`
* `dict`
Sie kรถnnen die eingebauten Typen als Generics verwenden (mit eckigen Klammern und Typen darin): Verwenden Sie fรผr den Rest, wie unter Python 3.8, das `typing`-Modul:
* `list` * `Union`
* `tuple` * `Optional` (so wie unter Python 3.8)
* `set` * ... und andere.
* `dict`
Verwenden Sie fรผr den Rest, wie unter Python 3.8, das `typing`-Modul: 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.
* `Union` ////
* `Optional` (so wie unter Python 3.8)
* ... und andere.
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. //// tab | Python 3.9+
=== "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): * `list`
* `tuple`
* `set`
* `dict`
* `list` Verwenden Sie fรผr den Rest, wie unter Python 3.8, das `typing`-Modul:
* `tuple`
* `set`
* `dict`
Verwenden Sie fรผr den Rest, wie unter Python 3.8, das `typing`-Modul: * `Union`
* `Optional`
* ... und andere.
* `Union` ////
* `Optional`
* ... und andere.
=== "Python 3.8+" //// tab | Python 3.8+
* `List` * `List`
* `Tuple` * `Tuple`
* `Set` * `Set`
* `Dict` * `Dict`
* `Union` * `Union`
* `Optional` * `Optional`
* ... und andere. * ... und andere.
////
### Klassen als Typen ### Klassen als Typen
@ -446,55 +483,71 @@ 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
{!> ../../../docs_src/python_types/tutorial011_py310.py!}
```
```Python ////
{!> ../../../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+" ////
```Python //// tab | Python 3.8+
{!> ../../../docs_src/python_types/tutorial011.py!}
```
!!! info ```Python
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>. {!> ../../../docs_src/python_types/tutorial011.py!}
```
////
/// 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>.
///
**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.
```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial013_py39.py!}
```
In Python 3.9 ist `Annotated` ein Teil der Standardbibliothek, Sie kรถnnen es von `typing` importieren. ////
```Python hl_lines="1 4" //// tab | Python 3.8+
{!> ../../../docs_src/python_types/tutorial013_py39.py!}
```
=== "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"
{!> ../../../docs_src/python_types/tutorial013.py!}
```
```Python hl_lines="1 4" ////
{!> ../../../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`.
@ -506,10 +559,13 @@ 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. โœจ
Und ebenfalls, dass Ihr Code sehr kompatibel mit vielen anderen Python-Tools und -Bibliotheken sein wird. ๐Ÿš€ Der Umstand, dass es **Standard-Python** ist, bedeutet, dass Sie immer noch die **bestmรถgliche Entwickler-Erfahrung** in ihrem Editor haben, sowie mit den Tools, die Sie nutzen, um ihren Code zu analysieren, zu refaktorisieren, usw. โœจ
Und ebenfalls, dass Ihr Code sehr kompatibel mit vielen anderen Python-Tools und -Bibliotheken sein wird. ๐Ÿš€
///
## Typhinweise in **FastAPI** ## Typhinweise in **FastAPI**
@ -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>.
///

7
docs/de/docs/reference/index.md

@ -4,5 +4,8 @@ Hier ist die Referenz oder Code-API, die Klassen, Funktionen, Parameter, Attribu
Wenn Sie **FastAPI** lernen mรถchten, ist es viel besser, das [FastAPI-Tutorial](https://fastapi.tiangolo.com/tutorial/) zu lesen. Wenn Sie **FastAPI** lernen mรถchten, ist es viel besser, das [FastAPI-Tutorial](https://fastapi.tiangolo.com/tutorial/) zu lesen.
!!! note "Hinweis Deutsche รœbersetzung" /// note | "Hinweis Deutsche รœbersetzung"
Die nachfolgende API wird aus der Quelltext-Dokumentation erstellt, daher sind nur die Einleitungen auf Deutsch.
Die nachfolgende API wird aus der Quelltext-Dokumentation erstellt, daher sind nur die Einleitungen auf Deutsch.
///

7
docs/de/docs/reference/request.md

@ -8,7 +8,10 @@ Sie kรถnnen es direkt von `fastapi` importieren:
from fastapi import Request from fastapi import Request
``` ```
!!! tip "Tipp" /// 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.
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 ::: fastapi.Request

7
docs/de/docs/reference/websockets.md

@ -6,8 +6,11 @@ Bei der Definition von WebSockets deklarieren Sie normalerweise einen Parameter
from fastapi import WebSocket from fastapi import WebSocket
``` ```
!!! tip "Tipp" /// 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.
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 ::: fastapi.WebSocket
options: options:

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

@ -57,41 +57,57 @@ 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!}
``` ```
////
//// tab | Python 3.9+
```Python hl_lines="13 15 22 25"
{!> ../../../docs_src/background_tasks/tutorial002_an_py39.py!}
```
////
//// tab | Python 3.8+
=== "Python 3.9+" ```Python hl_lines="14 16 23 26"
{!> ../../../docs_src/background_tasks/tutorial002_an.py!}
```
////
```Python hl_lines="13 15 22 25" //// tab | Python 3.10+ nicht annotiert
{!> ../../../docs_src/background_tasks/tutorial002_an_py39.py!}
```
=== "Python 3.8+" /// tip | "Tipp"
```Python hl_lines="14 16 23 26" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/background_tasks/tutorial002_an.py!}
```
=== "Python 3.10+ nicht annotiert" ///
```Python hl_lines="11 13 20 23"
{!> ../../../docs_src/background_tasks/tutorial002_py310.py!}
```
!!! tip "Tipp" ////
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="11 13 20 23" //// tab | Python 3.8+ nicht annotiert
{!> ../../../docs_src/background_tasks/tutorial002_py310.py!}
```
=== "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"
{!> ../../../docs_src/background_tasks/tutorial002.py!}
```
```Python hl_lines="13 15 22 25" ////
{!> ../../../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.

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

@ -4,8 +4,11 @@ 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
@ -26,16 +29,19 @@ 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.
In `app/main.py` kรถnnten Sie beispielsweise eine Zeile wie diese haben: In `app/main.py` kรถnnten Sie beispielsweise eine Zeile wie diese haben:
```
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`.
@ -99,8 +105,11 @@ 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`.
@ -112,31 +121,43 @@ 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"
{!> ../../../docs_src/bigger_applications/app_an_py39/dependencies.py!}
```
```Python hl_lines="3 6-8" title="app/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" ////
!!! tip "Tipp" //// tab | Python 3.8+ nicht annotiert
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="1 4-6" title="app/dependencies.py" /// tip | "Tipp"
{!> ../../../docs_src/bigger_applications/app/dependencies.py!}
```
!!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
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. ///
```Python hl_lines="1 4-6" title="app/dependencies.py"
{!> ../../../docs_src/bigger_applications/app/dependencies.py!}
```
////
/// tip | "Tipp"
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.
///
## Ein weiteres Modul mit `APIRouter`. ## Ein weiteres Modul mit `APIRouter`.
@ -180,8 +201,11 @@ 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:
@ -198,11 +222,17 @@ 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
@ -218,8 +248,11 @@ Daher verwenden wir einen relativen Import mit `..` fรผr die Abhรคngigkeiten:
#### 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:
@ -286,10 +319,13 @@ Aber wir kรถnnen immer noch _mehr_ `tags` hinzufรผgen, die auf eine bestimmte *P
{!../../../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"]`.
Und sie wird auch beide Responses in der Dokumentation haben, eine fรผr `404` und eine fรผr `403`. 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`.
///
## Das Haupt-`FastAPI`. ## Das Haupt-`FastAPI`.
@ -345,20 +381,23 @@ 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โ€œ:
```Python Die erste Version ist ein โ€žrelativer Importโ€œ:
from .routers import items, users
```
Die zweite Version ist ein โ€žabsoluter Importโ€œ: ```Python
from .routers import items, users
```
Die zweite Version ist ein โ€žabsoluter Importโ€œ:
```Python
from app.routers import items, users
```
```Python 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>.
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>. ///
### Namenskollisionen vermeiden ### Namenskollisionen vermeiden
@ -390,26 +429,35 @@ Inkludieren wir nun die `router` aus diesen Submodulen `users` und `items`:
{!../../../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.
Dies dauert Mikrosekunden und geschieht nur beim Start. Bei der Einbindung von Routern mรผssen Sie sich keine Gedanken รผber die Performanz machen.
Es hat also keinen Einfluss auf die Leistung. โšก Dies dauert Mikrosekunden und geschieht nur beim Start.
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
@ -456,16 +504,19 @@ Hier machen wir es ... nur um zu zeigen, dass wir es kรถnnen ๐Ÿคท:
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.
---
--- Die `APIRouter` sind nicht โ€žgemountetโ€œ, sie sind nicht vom Rest der Anwendung isoliert.
Die `APIRouter` sind nicht โ€žgemountetโ€œ, sie sind nicht vom Rest der Anwendung isoliert. Das liegt daran, dass wir deren *Pfadoperationen* in das OpenAPI-Schema und die Benutzeroberflรคchen einbinden mรถchten.
Das liegt daran, dass wir deren *Pfadoperationen* in das OpenAPI-Schema und die Benutzeroberflรคchen einbinden mรถchten. 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

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

@ -6,98 +6,139 @@ 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+" ////
```Python hl_lines="4" //// tab | Python 3.9+
{!> ../../../docs_src/body_fields/tutorial001_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="4"
{!> ../../../docs_src/body_fields/tutorial001_an_py39.py!}
```
```Python hl_lines="4" ////
{!> ../../../docs_src/body_fields/tutorial001_an.py!}
```
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.8+
!!! tip "Tipp" ```Python hl_lines="4"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/body_fields/tutorial001_an.py!}
```
```Python hl_lines="2" ////
{!> ../../../docs_src/body_fields/tutorial001_py310.py!}
```
=== "Python 3.8+ nicht annotiert" //// tab | Python 3.10+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="4" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/body_fields/tutorial001.py!}
```
!!! warning "Achtung" ///
Beachten Sie, dass `Field` direkt von `pydantic` importiert wird, nicht von `fastapi`, wie die anderen (`Query`, `Path`, `Body`, usw.)
```Python hl_lines="2"
{!> ../../../docs_src/body_fields/tutorial001_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="4"
{!> ../../../docs_src/body_fields/tutorial001.py!}
```
////
/// warning | "Achtung"
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"
{!> ../../../docs_src/body_fields/tutorial001_an_py310.py!}
```
////
```Python hl_lines="11-14" //// tab | Python 3.9+
{!> ../../../docs_src/body_fields/tutorial001_an_py310.py!}
```
=== "Python 3.9+" ```Python hl_lines="11-14"
{!> ../../../docs_src/body_fields/tutorial001_an_py39.py!}
```
```Python hl_lines="11-14" ////
{!> ../../../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" ////
!!! tip "Tipp" //// tab | Python 3.10+ nicht annotiert
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="9-12" /// tip | "Tipp"
{!> ../../../docs_src/body_fields/tutorial001_py310.py!}
```
=== "Python 3.8+ nicht annotiert" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
!!! tip "Tipp" ///
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="11-14" ```Python hl_lines="9-12"
{!> ../../../docs_src/body_fields/tutorial001.py!} {!> ../../../docs_src/body_fields/tutorial001_py310.py!}
``` ```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="11-14"
{!> ../../../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.
Und Pydantics `Field` gibt ebenfalls eine Instanz von `FieldInfo` zurรผck. 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.
`Body` gibt auch Instanzen einer Unterklasse von `FieldInfo` zurรผck. Und spรคter werden Sie andere sehen, die Unterklassen der `Body`-Klasse sind. Und Pydantics `Field` gibt ebenfalls eine Instanz von `FieldInfo` zurรผck.
Denken Sie daran, dass `Query`, `Path` und andere von `fastapi` tatsรคchlich Funktionen sind, die spezielle Klassen zurรผckgeben. `Body` gibt auch Instanzen einer Unterklasse von `FieldInfo` zurรผck. Und spรคter werden Sie andere sehen, die Unterklassen der `Body`-Klasse sind.
!!! tip "Tipp" Denken Sie daran, dass `Query`, `Path` und andere von `fastapi` tatsรคchlich Funktionen sind, die spezielle Klassen zurรผckgeben.
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`.
///
/// 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`.
///
## Zusรคtzliche Information hinzufรผgen ## Zusรคtzliche Information hinzufรผgen
@ -105,8 +146,11 @@ Sie kรถnnen zusรคtzliche Information in `Field`, `Query`, `Body`, usw. deklarier
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

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

@ -8,44 +8,63 @@ 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+" ////
```Python hl_lines="19-21" //// tab | Python 3.8+
{!> ../../../docs_src/body_multiple_params/tutorial001_an.py!}
``` ```Python hl_lines="19-21"
{!> ../../../docs_src/body_multiple_params/tutorial001_an.py!}
```
=== "Python 3.10+ nicht annotiert" ////
!!! tip "Tipp" //// tab | Python 3.10+ nicht annotiert
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="17-19" /// tip | "Tipp"
{!> ../../../docs_src/body_multiple_params/tutorial001_py310.py!}
``` Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="17-19"
{!> ../../../docs_src/body_multiple_params/tutorial001_py310.py!}
```
=== "Python 3.8+ nicht annotiert" ////
!!! tip "Tipp" //// tab | Python 3.8+ nicht annotiert
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="19-21" /// tip | "Tipp"
{!> ../../../docs_src/body_multiple_params/tutorial001.py!}
```
!!! note "Hinweis" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
Beachten Sie, dass in diesem Fall das `item`, welches vom Body genommen wird, optional ist. Da es `None` als Defaultwert hat.
///
```Python hl_lines="19-21"
{!> ../../../docs_src/body_multiple_params/tutorial001.py!}
```
////
/// note | "Hinweis"
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
@ -62,17 +81,21 @@ 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+" ////
```Python hl_lines="22" //// tab | Python 3.8+
{!> ../../../docs_src/body_multiple_params/tutorial002.py!}
``` ```Python hl_lines="22"
{!> ../../../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).
@ -93,8 +116,11 @@ 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`.
@ -110,41 +136,57 @@ 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"
{!> ../../../docs_src/body_multiple_params/tutorial003_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="23"
{!> ../../../docs_src/body_multiple_params/tutorial003_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="24"
{!> ../../../docs_src/body_multiple_params/tutorial003_an.py!}
```
////
```Python hl_lines="23" //// tab | Python 3.10+ nicht annotiert
{!> ../../../docs_src/body_multiple_params/tutorial003_an_py310.py!}
```
=== "Python 3.9+" /// tip | "Tipp"
```Python hl_lines="23" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/body_multiple_params/tutorial003_an_py39.py!}
```
=== "Python 3.8+" ///
```Python hl_lines="24" ```Python hl_lines="20"
{!> ../../../docs_src/body_multiple_params/tutorial003_an.py!} {!> ../../../docs_src/body_multiple_params/tutorial003_py310.py!}
``` ```
////
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.8+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="20" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/body_multiple_params/tutorial003_py310.py!}
```
=== "Python 3.8+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="22"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/body_multiple_params/tutorial003.py!}
```
```Python hl_lines="22" ////
{!> ../../../docs_src/body_multiple_params/tutorial003.py!}
```
In diesem Fall erwartet **FastAPI** einen Body wie: In diesem Fall erwartet **FastAPI** einen Body wie:
@ -184,44 +226,63 @@ 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+" ////
```Python hl_lines="27" //// tab | Python 3.9+
{!> ../../../docs_src/body_multiple_params/tutorial004_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="27"
{!> ../../../docs_src/body_multiple_params/tutorial004_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="28"
{!> ../../../docs_src/body_multiple_params/tutorial004_an.py!}
```
```Python hl_lines="28" ////
{!> ../../../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.
```Python hl_lines="25" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/body_multiple_params/tutorial004_py310.py!}
```
=== "Python 3.8+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="25"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/body_multiple_params/tutorial004_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="27"
{!> ../../../docs_src/body_multiple_params/tutorial004.py!}
```
```Python hl_lines="27" ////
{!> ../../../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
@ -237,41 +298,57 @@ item: Item = Body(embed=True)
so wie in: so wie in:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="17"
{!> ../../../docs_src/body_multiple_params/tutorial005_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="17"
{!> ../../../docs_src/body_multiple_params/tutorial005_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="18"
{!> ../../../docs_src/body_multiple_params/tutorial005_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
```Python hl_lines="17" /// tip | "Tipp"
{!> ../../../docs_src/body_multiple_params/tutorial005_an_py310.py!}
```
=== "Python 3.9+" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="17" ///
{!> ../../../docs_src/body_multiple_params/tutorial005_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="15"
{!> ../../../docs_src/body_multiple_params/tutorial005_py310.py!}
```
```Python hl_lines="18" ////
{!> ../../../docs_src/body_multiple_params/tutorial005_an.py!}
```
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.8+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="15" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/body_multiple_params/tutorial005_py310.py!}
```
=== "Python 3.8+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="17"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/body_multiple_params/tutorial005.py!}
```
```Python hl_lines="17" ////
{!> ../../../docs_src/body_multiple_params/tutorial005.py!}
```
In diesem Fall erwartet **FastAPI** einen Body wie: In diesem Fall erwartet **FastAPI** einen Body wie:

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

@ -6,17 +6,21 @@ 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"
{!> ../../../docs_src/body_nested_models/tutorial001.py!}
```
```Python hl_lines="14" ////
{!> ../../../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.
@ -61,23 +65,29 @@ 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"
{!> ../../../docs_src/body_nested_models/tutorial002_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="12" ```Python hl_lines="14"
{!> ../../../docs_src/body_nested_models/tutorial002_py310.py!} {!> ../../../docs_src/body_nested_models/tutorial002_py39.py!}
``` ```
=== "Python 3.9+" ////
```Python hl_lines="14" //// tab | Python 3.8+
{!> ../../../docs_src/body_nested_models/tutorial002_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="14"
{!> ../../../docs_src/body_nested_models/tutorial002.py!}
```
```Python hl_lines="14" ////
{!> ../../../docs_src/body_nested_models/tutorial002.py!}
```
## Set-Typen ## Set-Typen
@ -87,23 +97,29 @@ 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"
{!> ../../../docs_src/body_nested_models/tutorial003_py310.py!}
```
////
```Python hl_lines="12" //// tab | Python 3.9+
{!> ../../../docs_src/body_nested_models/tutorial003_py310.py!}
```
=== "Python 3.9+" ```Python hl_lines="14"
{!> ../../../docs_src/body_nested_models/tutorial003_py39.py!}
```
```Python hl_lines="14" ////
{!> ../../../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.
@ -125,45 +141,57 @@ 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"
{!> ../../../docs_src/body_nested_models/tutorial004_py310.py!}
```
////
```Python hl_lines="7-9" //// tab | Python 3.9+
{!> ../../../docs_src/body_nested_models/tutorial004_py310.py!}
```
=== "Python 3.9+" ```Python hl_lines="9-11"
{!> ../../../docs_src/body_nested_models/tutorial004_py39.py!}
```
////
```Python hl_lines="9-11" //// tab | Python 3.8+
{!> ../../../docs_src/body_nested_models/tutorial004_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="9-11"
{!> ../../../docs_src/body_nested_models/tutorial004.py!}
```
```Python hl_lines="9-11" ////
{!> ../../../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+" ////
```Python hl_lines="20" //// tab | Python 3.9+
{!> ../../../docs_src/body_nested_models/tutorial004_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="20"
{!> ../../../docs_src/body_nested_models/tutorial004_py39.py!}
```
////
```Python hl_lines="20" //// tab | Python 3.8+
{!> ../../../docs_src/body_nested_models/tutorial004.py!}
``` ```Python hl_lines="20"
{!> ../../../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:
@ -196,23 +224,29 @@ 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+" ////
```Python hl_lines="4 10" //// tab | Python 3.9+
{!> ../../../docs_src/body_nested_models/tutorial005_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="4 10"
{!> ../../../docs_src/body_nested_models/tutorial005_py39.py!}
```
```Python hl_lines="4 10" ////
{!> ../../../docs_src/body_nested_models/tutorial005.py!}
``` //// tab | Python 3.8+
```Python hl_lines="4 10"
{!> ../../../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.
@ -220,23 +254,29 @@ Es wird getestet, ob der String eine gรผltige URL ist, und als solche wird er in
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+" ////
```Python hl_lines="20" //// tab | Python 3.8+
{!> ../../../docs_src/body_nested_models/tutorial006.py!}
``` ```Python hl_lines="20"
{!> ../../../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:
@ -264,33 +304,45 @@ 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"
{!> ../../../docs_src/body_nested_models/tutorial007_py310.py!}
```
////
```Python hl_lines="7 12 18 21 25" //// tab | Python 3.9+
{!> ../../../docs_src/body_nested_models/tutorial007_py310.py!}
```
=== "Python 3.9+" ```Python hl_lines="9 14 20 23 27"
{!> ../../../docs_src/body_nested_models/tutorial007_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="9 14 20 23 27"
{!> ../../../docs_src/body_nested_models/tutorial007.py!}
```
```Python hl_lines="9 14 20 23 27" ////
{!> ../../../docs_src/body_nested_models/tutorial007_py39.py!}
```
=== "Python 3.8+" /// info
```Python hl_lines="9 14 20 23 27" Beachten Sie, wie `Offer` eine Liste von `Item`s hat, von denen jedes seinerseits eine optionale Liste von `Image`s hat.
{!> ../../../docs_src/body_nested_models/tutorial007.py!}
```
!!! info ///
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
@ -308,17 +360,21 @@ images: list[Image]
so wie in: so wie in:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="13"
{!> ../../../docs_src/body_nested_models/tutorial008_py39.py!}
```
```Python hl_lines="13" ////
{!> ../../../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
@ -348,26 +404,33 @@ 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"
{!> ../../../docs_src/body_nested_models/tutorial009_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="9"
{!> ../../../docs_src/body_nested_models/tutorial009.py!}
```
```Python hl_lines="7" ////
{!> ../../../docs_src/body_nested_models/tutorial009_py39.py!}
```
=== "Python 3.8+" /// tip | "Tipp"
```Python hl_lines="9" Bedenken Sie, dass JSON nur `str` als Schlรผssel unterstรผtzt.
{!> ../../../docs_src/body_nested_models/tutorial009.py!}
```
!!! tip "Tipp" Aber Pydantic hat automatische Datenkonvertierung.
Bedenken Sie, dass JSON nur `str` als Schlรผssel unterstรผtzt.
Aber Pydantic hat automatische Datenkonvertierung. Das bedeutet, dass Ihre API-Clients nur Strings senden kรถnnen, aber solange diese Strings nur Zahlen enthalten, wird Pydantic sie konvertieren und validieren.
Das bedeutet, dass Ihre API-Clients nur Strings senden kรถnnen, aber solange diese Strings nur Zahlen enthalten, wird Pydantic sie konvertieren und validieren. Und das `dict` welches Sie als `weights` erhalten, wird `int`-Schlรผssel und `float`-Werte haben.
Und das `dict` welches Sie als `weights` erhalten, wird `int`-Schlรผssel und `float`-Werte haben. ///
## Zusammenfassung ## Zusammenfassung

171
docs/de/docs/tutorial/body-updates.md

@ -6,23 +6,29 @@ Um einen Artikel zu aktualisieren, kรถnnen Sie die <a href="https://developer.mo
Sie kรถnnen den `jsonable_encoder` verwenden, um die empfangenen Daten in etwas zu konvertieren, das als JSON gespeichert werden kann (in z. B. einer NoSQL-Datenbank). Zum Beispiel, um ein `datetime` in einen `str` zu konvertieren. Sie kรถnnen den `jsonable_encoder` verwenden, um die empfangenen Daten in etwas zu konvertieren, das als JSON gespeichert werden kann (in z. B. einer NoSQL-Datenbank). Zum Beispiel, um ein `datetime` in einen `str` zu konvertieren.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="28-33" ```Python hl_lines="28-33"
{!> ../../../docs_src/body_updates/tutorial001_py310.py!} {!> ../../../docs_src/body_updates/tutorial001_py310.py!}
``` ```
////
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="30-35" ```Python hl_lines="30-35"
{!> ../../../docs_src/body_updates/tutorial001_py39.py!} {!> ../../../docs_src/body_updates/tutorial001_py39.py!}
``` ```
=== "Python 3.8+" ////
```Python hl_lines="30-35" //// tab | Python 3.8+
{!> ../../../docs_src/body_updates/tutorial001.py!}
``` ```Python hl_lines="30-35"
{!> ../../../docs_src/body_updates/tutorial001.py!}
```
////
`PUT` wird verwendet, um Daten zu empfangen, die die existierenden Daten ersetzen sollen. `PUT` wird verwendet, um Daten zu empfangen, die die existierenden Daten ersetzen sollen.
@ -48,14 +54,17 @@ Sie kรถnnen auch die <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/
Das bedeutet, sie senden nur die Daten, die Sie aktualisieren wollen, der Rest bleibt unverรคndert. Das bedeutet, sie senden nur die Daten, die Sie aktualisieren wollen, der Rest bleibt unverรคndert.
!!! note "Hinweis" /// note | "Hinweis"
`PATCH` wird seltener verwendet und ist weniger bekannt als `PUT`.
`PATCH` wird seltener verwendet und ist weniger bekannt als `PUT`.
Und viele Teams verwenden ausschlieรŸlich `PUT`, selbst fรผr nur Teil-Aktualisierungen. Und viele Teams verwenden ausschlieรŸlich `PUT`, selbst fรผr nur Teil-Aktualisierungen.
Es steht Ihnen **frei**, das zu verwenden, was Sie mรถchten, **FastAPI** legt Ihnen keine Einschrรคnkungen auf. Es steht Ihnen **frei**, das zu verwenden, was Sie mรถchten, **FastAPI** legt Ihnen keine Einschrรคnkungen auf.
Aber dieser Leitfaden zeigt Ihnen mehr oder weniger, wie die beiden normalerweise verwendet werden. Aber dieser Leitfaden zeigt Ihnen mehr oder weniger, wie die beiden normalerweise verwendet werden.
///
### Pydantics `exclude_unset`-Parameter verwenden ### Pydantics `exclude_unset`-Parameter verwenden
@ -63,61 +72,79 @@ Wenn Sie Teil-Aktualisierungen entgegennehmen, ist der `exclude_unset`-Parameter
Wie in `item.model_dump(exclude_unset=True)`. Wie in `item.model_dump(exclude_unset=True)`.
!!! info /// info
In Pydantic v1 hieรŸ diese Methode `.dict()`, in Pydantic v2 wurde sie deprecated (aber immer noch unterstรผtzt) und in `.model_dump()` umbenannt.
In Pydantic v1 hieรŸ diese Methode `.dict()`, in Pydantic v2 wurde sie deprecated (aber immer noch unterstรผtzt) und in `.model_dump()` umbenannt.
Die Beispiele hier verwenden `.dict()` fรผr die Kompatibilitรคt mit Pydantic v1, Sie sollten jedoch stattdessen `.model_dump()` verwenden, wenn Sie Pydantic v2 verwenden kรถnnen. Die Beispiele hier verwenden `.dict()` fรผr die Kompatibilitรคt mit Pydantic v1, Sie sollten jedoch stattdessen `.model_dump()` verwenden, wenn Sie Pydantic v2 verwenden kรถnnen.
///
Das wird ein `dict` erstellen, mit nur den Daten, die gesetzt wurden als das `item`-Modell erstellt wurde, Defaultwerte ausgeschlossen. Das wird ein `dict` erstellen, mit nur den Daten, die gesetzt wurden als das `item`-Modell erstellt wurde, Defaultwerte ausgeschlossen.
Sie kรถnnen das verwenden, um ein `dict` zu erstellen, das nur die (im Request) gesendeten Daten enthรคlt, ohne Defaultwerte: Sie kรถnnen das verwenden, um ein `dict` zu erstellen, das nur die (im Request) gesendeten Daten enthรคlt, ohne Defaultwerte:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="32"
{!> ../../../docs_src/body_updates/tutorial002_py310.py!}
```
////
```Python hl_lines="32" //// tab | Python 3.9+
{!> ../../../docs_src/body_updates/tutorial002_py310.py!}
```
=== "Python 3.9+" ```Python hl_lines="34"
{!> ../../../docs_src/body_updates/tutorial002_py39.py!}
```
////
```Python hl_lines="34" //// tab | Python 3.8+
{!> ../../../docs_src/body_updates/tutorial002_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="34"
{!> ../../../docs_src/body_updates/tutorial002.py!}
```
```Python hl_lines="34" ////
{!> ../../../docs_src/body_updates/tutorial002.py!}
```
### Pydantics `update`-Parameter verwenden ### Pydantics `update`-Parameter verwenden
Jetzt kรถnnen Sie eine Kopie des existierenden Modells mittels `.model_copy()` erstellen, wobei Sie dem `update`-Parameter ein `dict` mit den zu รคndernden Daten รผbergeben. Jetzt kรถnnen Sie eine Kopie des existierenden Modells mittels `.model_copy()` erstellen, wobei Sie dem `update`-Parameter ein `dict` mit den zu รคndernden Daten รผbergeben.
!!! info /// info
In Pydantic v1 hieรŸ diese Methode `.copy()`, in Pydantic v2 wurde sie deprecated (aber immer noch unterstรผtzt) und in `.model_copy()` umbenannt.
In Pydantic v1 hieรŸ diese Methode `.copy()`, in Pydantic v2 wurde sie deprecated (aber immer noch unterstรผtzt) und in `.model_copy()` umbenannt.
Die Beispiele hier verwenden `.copy()` fรผr die Kompatibilitรคt mit Pydantic v1, Sie sollten jedoch stattdessen `.model_copy()` verwenden, wenn Sie Pydantic v2 verwenden kรถnnen. Die Beispiele hier verwenden `.copy()` fรผr die Kompatibilitรคt mit Pydantic v1, Sie sollten jedoch stattdessen `.model_copy()` verwenden, wenn Sie Pydantic v2 verwenden kรถnnen.
///
Wie in `stored_item_model.model_copy(update=update_data)`: Wie in `stored_item_model.model_copy(update=update_data)`:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="33" ```Python hl_lines="33"
{!> ../../../docs_src/body_updates/tutorial002_py310.py!} {!> ../../../docs_src/body_updates/tutorial002_py310.py!}
``` ```
=== "Python 3.9+" ////
```Python hl_lines="35" //// tab | Python 3.9+
{!> ../../../docs_src/body_updates/tutorial002_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="35"
{!> ../../../docs_src/body_updates/tutorial002_py39.py!}
```
```Python hl_lines="35" ////
{!> ../../../docs_src/body_updates/tutorial002.py!}
``` //// tab | Python 3.8+
```Python hl_lines="35"
{!> ../../../docs_src/body_updates/tutorial002.py!}
```
////
### Rekapitulation zum teilweisen Ersetzen ### Rekapitulation zum teilweisen Ersetzen
@ -134,32 +161,44 @@ Zusammengefasst, um Teil-Ersetzungen vorzunehmen:
* Speichern Sie die Daten in Ihrer Datenbank. * Speichern Sie die Daten in Ihrer Datenbank.
* Geben Sie das aktualisierte Modell zurรผck. * Geben Sie das aktualisierte Modell zurรผck.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="28-35"
{!> ../../../docs_src/body_updates/tutorial002_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="30-37"
{!> ../../../docs_src/body_updates/tutorial002_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="30-37"
{!> ../../../docs_src/body_updates/tutorial002.py!}
```
```Python hl_lines="28-35" ////
{!> ../../../docs_src/body_updates/tutorial002_py310.py!}
```
=== "Python 3.9+" /// tip | "Tipp"
```Python hl_lines="30-37" Sie kรถnnen tatsรคchlich die gleiche Technik mit einer HTTP `PUT` Operation verwenden.
{!> ../../../docs_src/body_updates/tutorial002_py39.py!}
```
=== "Python 3.8+" Aber dieses Beispiel verwendet `PATCH`, da dieses fรผr solche Anwendungsfรคlle geschaffen wurde.
```Python hl_lines="30-37" ///
{!> ../../../docs_src/body_updates/tutorial002.py!}
```
!!! tip "Tipp" /// note | "Hinweis"
Sie kรถnnen tatsรคchlich die gleiche Technik mit einer HTTP `PUT` Operation verwenden.
Aber dieses Beispiel verwendet `PATCH`, da dieses fรผr solche Anwendungsfรคlle geschaffen wurde. Beachten Sie, dass das hereinkommende Modell immer noch validiert wird.
!!! note "Hinweis" Wenn Sie also Teil-Aktualisierungen empfangen wollen, die alle Attribute auslassen kรถnnen, mรผssen Sie ein Modell haben, dessen Attribute alle als optional gekennzeichnet sind (mit Defaultwerten oder `None`).
Beachten Sie, dass das hereinkommende Modell immer noch validiert wird.
Wenn Sie also Teil-Aktualisierungen empfangen wollen, die alle Attribute auslassen kรถnnen, mรผssen Sie ein Modell haben, dessen Attribute alle als optional gekennzeichnet sind (mit Defaultwerten oder `None`). Um zu unterscheiden zwischen Modellen fรผr **Aktualisierungen**, mit lauter optionalen Werten, und solchen fรผr die **Erzeugung**, mit benรถtigten Werten, kรถnnen Sie die Techniken verwenden, die in [Extramodelle](extra-models.md){.internal-link target=_blank} beschrieben wurden.
Um zu unterscheiden zwischen Modellen fรผr **Aktualisierungen**, mit lauter optionalen Werten, und solchen fรผr die **Erzeugung**, mit benรถtigten Werten, kรถnnen Sie die Techniken verwenden, die in [Extramodelle](extra-models.md){.internal-link target=_blank} beschrieben wurden. ///

159
docs/de/docs/tutorial/body.md

@ -8,28 +8,35 @@ Ihre API sendet fast immer einen **Response**body. Aber Clients senden nicht unb
Um einen **Request**body zu deklarieren, verwenden Sie <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a>-Modelle mit allen deren Fรคhigkeiten und Vorzรผgen. Um einen **Request**body zu deklarieren, verwenden Sie <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a>-Modelle mit allen deren Fรคhigkeiten und Vorzรผgen.
!!! info /// info
Um Daten zu versenden, sollten Sie eines von: `POST` (meistverwendet), `PUT`, `DELETE` oder `PATCH` verwenden.
Senden Sie einen Body mit einem `GET`-Request, dann fรผhrt das laut Spezifikation zu undefiniertem Verhalten. Trotzdem wird es von FastAPI unterstรผtzt, fรผr sehr komplexe/extreme Anwendungsfรคlle. Um Daten zu versenden, sollten Sie eines von: `POST` (meistverwendet), `PUT`, `DELETE` oder `PATCH` verwenden.
Da aber davon abgeraten wird, zeigt die interaktive Dokumentation mit Swagger-Benutzeroberflรคche die Dokumentation fรผr den Body auch nicht an, wenn `GET` verwendet wird. Dazwischengeschaltete Proxys unterstรผtzen es mรถglicherweise auch nicht. Senden Sie einen Body mit einem `GET`-Request, dann fรผhrt das laut Spezifikation zu undefiniertem Verhalten. Trotzdem wird es von FastAPI unterstรผtzt, fรผr sehr komplexe/extreme Anwendungsfรคlle.
Da aber davon abgeraten wird, zeigt die interaktive Dokumentation mit Swagger-Benutzeroberflรคche die Dokumentation fรผr den Body auch nicht an, wenn `GET` verwendet wird. Dazwischengeschaltete Proxys unterstรผtzen es mรถglicherweise auch nicht.
///
## Importieren Sie Pydantics `BaseModel` ## Importieren Sie Pydantics `BaseModel`
Zuerst mรผssen Sie `BaseModel` von `pydantic` importieren: Zuerst mรผssen Sie `BaseModel` von `pydantic` importieren:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="2"
{!> ../../../docs_src/body/tutorial001_py310.py!}
```
////
```Python hl_lines="2" //// tab | Python 3.8+
{!> ../../../docs_src/body/tutorial001_py310.py!}
```
=== "Python 3.8+" ```Python hl_lines="4"
{!> ../../../docs_src/body/tutorial001.py!}
```
```Python hl_lines="4" ////
{!> ../../../docs_src/body/tutorial001.py!}
```
## Erstellen Sie Ihr Datenmodell ## Erstellen Sie Ihr Datenmodell
@ -37,17 +44,21 @@ Dann deklarieren Sie Ihr Datenmodell als eine Klasse, die von `BaseModel` erbt.
Verwenden Sie Standard-Python-Typen fรผr die Klassenattribute: Verwenden Sie Standard-Python-Typen fรผr die Klassenattribute:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="5-9" ```Python hl_lines="5-9"
{!> ../../../docs_src/body/tutorial001_py310.py!} {!> ../../../docs_src/body/tutorial001_py310.py!}
``` ```
=== "Python 3.8+" ////
```Python hl_lines="7-11" //// tab | Python 3.8+
{!> ../../../docs_src/body/tutorial001.py!}
``` ```Python hl_lines="7-11"
{!> ../../../docs_src/body/tutorial001.py!}
```
////
Wie auch bei Query-Parametern gilt, wenn ein Modellattribut einen Defaultwert hat, ist das Attribut nicht erforderlich. Ansonsten ist es erforderlich. Verwenden Sie `None`, um es als optional zu kennzeichnen. Wie auch bei Query-Parametern gilt, wenn ein Modellattribut einen Defaultwert hat, ist das Attribut nicht erforderlich. Ansonsten ist es erforderlich. Verwenden Sie `None`, um es als optional zu kennzeichnen.
@ -75,17 +86,21 @@ Da `description` und `tax` optional sind (mit `None` als Defaultwert), wรคre fol
Um es zu Ihrer *Pfadoperation* hinzuzufรผgen, deklarieren Sie es auf die gleiche Weise, wie Sie Pfad- und Query-Parameter deklariert haben: Um es zu Ihrer *Pfadoperation* hinzuzufรผgen, deklarieren Sie es auf die gleiche Weise, wie Sie Pfad- und Query-Parameter deklariert haben:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="16" ```Python hl_lines="16"
{!> ../../../docs_src/body/tutorial001_py310.py!} {!> ../../../docs_src/body/tutorial001_py310.py!}
``` ```
=== "Python 3.8+" ////
```Python hl_lines="18" //// tab | Python 3.8+
{!> ../../../docs_src/body/tutorial001.py!}
``` ```Python hl_lines="18"
{!> ../../../docs_src/body/tutorial001.py!}
```
////
... und deklarieren Sie seinen Typ als das Modell, welches Sie erstellt haben, `Item`. ... und deklarieren Sie seinen Typ als das Modell, welches Sie erstellt haben, `Item`.
@ -134,32 +149,39 @@ Aber Sie bekommen die gleiche Editor-Unterstรผtzung in <a href="https://www.jetb
<img src="/img/tutorial/body/image05.png"> <img src="/img/tutorial/body/image05.png">
!!! tip "Tipp" /// tip | "Tipp"
Wenn Sie <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a> als Ihren Editor verwenden, probieren Sie das <a href="https://github.com/koxudaxi/pydantic-pycharm-plugin/" class="external-link" target="_blank">Pydantic PyCharm Plugin</a> aus.
Wenn Sie <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a> als Ihren Editor verwenden, probieren Sie das <a href="https://github.com/koxudaxi/pydantic-pycharm-plugin/" class="external-link" target="_blank">Pydantic PyCharm Plugin</a> aus.
Es verbessert die Editor-Unterstรผtzung fรผr Pydantic-Modelle, mit: Es verbessert die Editor-Unterstรผtzung fรผr Pydantic-Modelle, mit:
* Code-Vervollstรคndigung * Code-Vervollstรคndigung
* Typรผberprรผfungen * Typรผberprรผfungen
* Refaktorisierung * Refaktorisierung
* Suchen * Suchen
* Inspektionen * Inspektionen
///
## Das Modell verwenden ## Das Modell verwenden
Innerhalb der Funktion kรถnnen Sie alle Attribute des Modells direkt verwenden: Innerhalb der Funktion kรถnnen Sie alle Attribute des Modells direkt verwenden:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="19"
{!> ../../../docs_src/body/tutorial002_py310.py!}
```
////
```Python hl_lines="19" //// tab | Python 3.8+
{!> ../../../docs_src/body/tutorial002_py310.py!}
```
=== "Python 3.8+" ```Python hl_lines="21"
{!> ../../../docs_src/body/tutorial002.py!}
```
```Python hl_lines="21" ////
{!> ../../../docs_src/body/tutorial002.py!}
```
## Requestbody- + Pfad-Parameter ## Requestbody- + Pfad-Parameter
@ -167,17 +189,21 @@ Sie kรถnnen Pfad- und Requestbody-Parameter gleichzeitig deklarieren.
**FastAPI** erkennt, dass Funktionsparameter, die mit Pfad-Parametern รผbereinstimmen, **vom Pfad genommen** werden sollen, und dass Funktionsparameter, welche Pydantic-Modelle sind, **vom Requestbody genommen** werden sollen. **FastAPI** erkennt, dass Funktionsparameter, die mit Pfad-Parametern รผbereinstimmen, **vom Pfad genommen** werden sollen, und dass Funktionsparameter, welche Pydantic-Modelle sind, **vom Requestbody genommen** werden sollen.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="15-16"
{!> ../../../docs_src/body/tutorial003_py310.py!}
```
```Python hl_lines="15-16" ////
{!> ../../../docs_src/body/tutorial003_py310.py!}
```
=== "Python 3.8+" //// tab | Python 3.8+
```Python hl_lines="17-18" ```Python hl_lines="17-18"
{!> ../../../docs_src/body/tutorial003.py!} {!> ../../../docs_src/body/tutorial003.py!}
``` ```
////
## Requestbody- + Pfad- + Query-Parameter ## Requestbody- + Pfad- + Query-Parameter
@ -185,17 +211,21 @@ Sie kรถnnen auch zur gleichen Zeit **Body-**, **Pfad-** und **Query-Parameter**
**FastAPI** wird jeden Parameter korrekt erkennen und die Daten vom richtigen Ort holen. **FastAPI** wird jeden Parameter korrekt erkennen und die Daten vom richtigen Ort holen.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="16"
{!> ../../../docs_src/body/tutorial004_py310.py!}
```
```Python hl_lines="16" ////
{!> ../../../docs_src/body/tutorial004_py310.py!}
```
=== "Python 3.8+" //// tab | Python 3.8+
```Python hl_lines="18" ```Python hl_lines="18"
{!> ../../../docs_src/body/tutorial004.py!} {!> ../../../docs_src/body/tutorial004.py!}
``` ```
////
Die Funktionsparameter werden wie folgt erkannt: Die Funktionsparameter werden wie folgt erkannt:
@ -203,10 +233,13 @@ Die Funktionsparameter werden wie folgt erkannt:
* Wenn der Parameter ein **einfacher Typ** ist (wie `int`, `float`, `str`, `bool`, usw.), wird er als **Query**-Parameter interpretiert. * Wenn der Parameter ein **einfacher Typ** ist (wie `int`, `float`, `str`, `bool`, usw.), wird er als **Query**-Parameter interpretiert.
* Wenn der Parameter vom Typ eines **Pydantic-Modells** ist, wird er als Request**body** interpretiert. * Wenn der Parameter vom Typ eines **Pydantic-Modells** ist, wird er als Request**body** interpretiert.
!!! note "Hinweis" /// note | "Hinweis"
FastAPI weiรŸ, dass der Wert von `q` nicht erforderlich ist, wegen des definierten Defaultwertes `= None`
FastAPI weiรŸ, dass der Wert von `q` nicht erforderlich ist, wegen des definierten Defaultwertes `= None`
Das `Union` in `Union[str, None]` wird von FastAPI nicht verwendet, aber es erlaubt Ihrem Editor, Sie besser zu unterstรผtzen und Fehler zu erkennen.
Das `Union` in `Union[str, None]` wird von FastAPI nicht verwendet, aber es erlaubt Ihrem Editor, Sie besser zu unterstรผtzen und Fehler zu erkennen. ///
## Ohne Pydantic ## Ohne Pydantic

144
docs/de/docs/tutorial/cookie-params.md

@ -6,41 +6,57 @@ So wie `Query`- und `Path`-Parameter kรถnnen Sie auch <abbr title='Cookie โ€“
Importieren Sie zuerst `Cookie`: Importieren Sie zuerst `Cookie`:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="3" ```Python hl_lines="3"
{!> ../../../docs_src/cookie_params/tutorial001_an_py310.py!} {!> ../../../docs_src/cookie_params/tutorial001_an_py310.py!}
``` ```
=== "Python 3.9+" ////
```Python hl_lines="3" //// tab | Python 3.9+
{!> ../../../docs_src/cookie_params/tutorial001_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="3"
{!> ../../../docs_src/cookie_params/tutorial001_an_py39.py!}
```
```Python hl_lines="3" ////
{!> ../../../docs_src/cookie_params/tutorial001_an.py!}
```
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.8+
!!! tip "Tipp" ```Python hl_lines="3"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/cookie_params/tutorial001_an.py!}
```
```Python hl_lines="1" ////
{!> ../../../docs_src/cookie_params/tutorial001_py310.py!}
```
=== "Python 3.8+ nicht annotiert" //// tab | Python 3.10+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="3" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/cookie_params/tutorial001.py!}
``` ///
```Python hl_lines="1"
{!> ../../../docs_src/cookie_params/tutorial001_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="3"
{!> ../../../docs_src/cookie_params/tutorial001.py!}
```
////
## `Cookie`-Parameter deklarieren ## `Cookie`-Parameter deklarieren
@ -48,49 +64,71 @@ Dann deklarieren Sie Ihre Cookie-Parameter, auf die gleiche Weise, wie Sie auch
Der erste Wert ist der Typ. Sie kรถnnen `Cookie` die gehabten Extra Validierungs- und Beschreibungsparameter hinzufรผgen. Danach kรถnnen Sie einen Defaultwert vergeben: Der erste Wert ist der Typ. Sie kรถnnen `Cookie` die gehabten Extra Validierungs- und Beschreibungsparameter hinzufรผgen. Danach kรถnnen Sie einen Defaultwert vergeben:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="9"
{!> ../../../docs_src/cookie_params/tutorial001_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="9"
{!> ../../../docs_src/cookie_params/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="10"
{!> ../../../docs_src/cookie_params/tutorial001_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="7"
{!> ../../../docs_src/cookie_params/tutorial001_py310.py!}
```
```Python hl_lines="9" ////
{!> ../../../docs_src/cookie_params/tutorial001_an_py310.py!}
```
=== "Python 3.9+" //// tab | Python 3.8+ nicht annotiert
```Python hl_lines="9" /// tip | "Tipp"
{!> ../../../docs_src/cookie_params/tutorial001_an_py39.py!}
```
=== "Python 3.8+" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="10" ///
{!> ../../../docs_src/cookie_params/tutorial001_an.py!}
```
=== "Python 3.10+ nicht annotiert" ```Python hl_lines="9"
{!> ../../../docs_src/cookie_params/tutorial001.py!}
```
!!! tip "Tipp" ////
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="7" /// note | "Technische Details"
{!> ../../../docs_src/cookie_params/tutorial001_py310.py!}
```
=== "Python 3.8+ nicht annotiert" `Cookie` ist eine Schwesterklasse von `Path` und `Query`. Sie erbt von derselben gemeinsamen `Param`-Elternklasse.
!!! tip "Tipp" Aber erinnern Sie sich, dass, wenn Sie `Query`, `Path`, `Cookie` und andere von `fastapi` importieren, diese tatsรคchlich Funktionen sind, welche spezielle Klassen zurรผckgeben.
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="9" ///
{!> ../../../docs_src/cookie_params/tutorial001.py!}
```
!!! note "Technische Details" /// info
`Cookie` ist eine Schwesterklasse von `Path` und `Query`. Sie erbt von derselben gemeinsamen `Param`-Elternklasse.
Aber erinnern Sie sich, dass, wenn Sie `Query`, `Path`, `Cookie` und andere von `fastapi` importieren, diese tatsรคchlich Funktionen sind, welche spezielle Klassen zurรผckgeben. Um Cookies zu deklarieren, mรผssen Sie `Cookie` verwenden, da diese Parameter sonst als Query-Parameter interpretiert werden wรผrden.
!!! info ///
Um Cookies zu deklarieren, mรผssen Sie `Cookie` verwenden, da diese Parameter sonst als Query-Parameter interpretiert werden wรผrden.
## Zusammenfassung ## Zusammenfassung

619
docs/de/docs/tutorial/dependencies/classes-as-dependencies.md

@ -6,41 +6,57 @@ Bevor wir tiefer in das **Dependency Injection** System eintauchen, lassen Sie u
Im vorherigen Beispiel haben wir ein `dict` von unserer Abhรคngigkeit (โ€žDependableโ€œ) zurรผckgegeben: Im vorherigen Beispiel haben wir ein `dict` von unserer Abhรคngigkeit (โ€žDependableโ€œ) zurรผckgegeben:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="9" ```Python hl_lines="9"
{!> ../../../docs_src/dependencies/tutorial001_an_py310.py!} {!> ../../../docs_src/dependencies/tutorial001_an_py310.py!}
``` ```
////
//// tab | Python 3.9+
```Python hl_lines="11"
{!> ../../../docs_src/dependencies/tutorial001_an_py39.py!}
```
=== "Python 3.9+" ////
```Python hl_lines="11" //// tab | Python 3.8+
{!> ../../../docs_src/dependencies/tutorial001_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="12"
{!> ../../../docs_src/dependencies/tutorial001_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
```Python hl_lines="12" /// tip | "Tipp"
{!> ../../../docs_src/dependencies/tutorial001_an.py!}
```
=== "Python 3.10+ nicht annotiert" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
!!! tip "Tipp" ///
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="7"
{!> ../../../docs_src/dependencies/tutorial001_py310.py!}
```
```Python hl_lines="7" ////
{!> ../../../docs_src/dependencies/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.
```Python hl_lines="11" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/dependencies/tutorial001.py!}
``` ///
```Python hl_lines="11"
{!> ../../../docs_src/dependencies/tutorial001.py!}
```
////
Aber dann haben wir ein `dict` im Parameter `commons` der *Pfadoperation-Funktion*. Aber dann haben wir ein `dict` im Parameter `commons` der *Pfadoperation-Funktion*.
@ -103,117 +119,165 @@ Das gilt auch fรผr Callables ohne Parameter. So wie es auch fรผr *Pfadoperation-
Dann kรถnnen wir das โ€žDependableโ€œ `common_parameters` der Abhรคngigkeit von oben in die Klasse `CommonQueryParams` รคndern: Dann kรถnnen wir das โ€žDependableโ€œ `common_parameters` der Abhรคngigkeit von oben in die Klasse `CommonQueryParams` รคndern:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="11-15" ```Python hl_lines="11-15"
{!> ../../../docs_src/dependencies/tutorial002_an_py310.py!} {!> ../../../docs_src/dependencies/tutorial002_an_py310.py!}
``` ```
=== "Python 3.9+" ////
```Python hl_lines="11-15" //// tab | Python 3.9+
{!> ../../../docs_src/dependencies/tutorial002_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="11-15"
{!> ../../../docs_src/dependencies/tutorial002_an_py39.py!}
```
////
```Python hl_lines="12-16" //// tab | Python 3.8+
{!> ../../../docs_src/dependencies/tutorial002_an.py!}
```
=== "Python 3.10+ nicht annotiert" ```Python hl_lines="12-16"
{!> ../../../docs_src/dependencies/tutorial002_an.py!}
```
!!! tip "Tipp" ////
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="9-13" //// tab | Python 3.10+ nicht annotiert
{!> ../../../docs_src/dependencies/tutorial002_py310.py!}
```
=== "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-15" ///
{!> ../../../docs_src/dependencies/tutorial002.py!}
``` ```Python hl_lines="9-13"
{!> ../../../docs_src/dependencies/tutorial002_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="11-15"
{!> ../../../docs_src/dependencies/tutorial002.py!}
```
////
Achten Sie auf die Methode `__init__`, die zum Erstellen der Instanz der Klasse verwendet wird: Achten Sie auf die Methode `__init__`, die zum Erstellen der Instanz der Klasse verwendet wird:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="12"
{!> ../../../docs_src/dependencies/tutorial002_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="12"
{!> ../../../docs_src/dependencies/tutorial002_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="13"
{!> ../../../docs_src/dependencies/tutorial002_an.py!}
```
////
```Python hl_lines="12" //// tab | Python 3.10+ nicht annotiert
{!> ../../../docs_src/dependencies/tutorial002_an_py310.py!}
```
=== "Python 3.9+" /// tip | "Tipp"
```Python hl_lines="12" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/dependencies/tutorial002_an_py39.py!}
```
=== "Python 3.8+" ///
```Python hl_lines="13" ```Python hl_lines="10"
{!> ../../../docs_src/dependencies/tutorial002_an.py!} {!> ../../../docs_src/dependencies/tutorial002_py310.py!}
``` ```
=== "Python 3.10+ nicht annotiert" ////
!!! tip "Tipp" //// tab | Python 3.8+ nicht annotiert
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="10" /// tip | "Tipp"
{!> ../../../docs_src/dependencies/tutorial002_py310.py!}
```
=== "Python 3.8+ nicht annotiert" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
!!! tip "Tipp" ///
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="12"
{!> ../../../docs_src/dependencies/tutorial002.py!}
```
```Python hl_lines="12" ////
{!> ../../../docs_src/dependencies/tutorial002.py!}
```
... sie hat die gleichen Parameter wie unsere vorherige `common_parameters`: ... sie hat die gleichen Parameter wie unsere vorherige `common_parameters`:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="8" ```Python hl_lines="8"
{!> ../../../docs_src/dependencies/tutorial001_an_py310.py!} {!> ../../../docs_src/dependencies/tutorial001_an_py310.py!}
``` ```
////
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="9" ```Python hl_lines="9"
{!> ../../../docs_src/dependencies/tutorial001_an_py39.py!} {!> ../../../docs_src/dependencies/tutorial001_an_py39.py!}
``` ```
=== "Python 3.8+" ////
```Python hl_lines="10" //// tab | Python 3.8+
{!> ../../../docs_src/dependencies/tutorial001_an.py!}
``` ```Python hl_lines="10"
{!> ../../../docs_src/dependencies/tutorial001_an.py!}
```
=== "Python 3.10+ nicht annotiert" ////
!!! tip "Tipp" //// tab | Python 3.10+ nicht annotiert
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="6" /// tip | "Tipp"
{!> ../../../docs_src/dependencies/tutorial001_py310.py!}
```
=== "Python 3.8+ nicht annotiert" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
!!! tip "Tipp" ///
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="6"
{!> ../../../docs_src/dependencies/tutorial001_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="9"
{!> ../../../docs_src/dependencies/tutorial001.py!}
```
```Python hl_lines="9" ////
{!> ../../../docs_src/dependencies/tutorial001.py!}
```
Diese Parameter werden von **FastAPI** verwendet, um die Abhรคngigkeit โ€žaufzulรถsenโ€œ. Diese Parameter werden von **FastAPI** verwendet, um die Abhรคngigkeit โ€žaufzulรถsenโ€œ.
@ -229,41 +293,57 @@ In beiden Fรคllen werden die Daten konvertiert, validiert, im OpenAPI-Schema dok
Jetzt kรถnnen Sie Ihre Abhรคngigkeit mithilfe dieser Klasse deklarieren. Jetzt kรถnnen Sie Ihre Abhรคngigkeit mithilfe dieser Klasse deklarieren.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="19" ```Python hl_lines="19"
{!> ../../../docs_src/dependencies/tutorial002_an_py310.py!} {!> ../../../docs_src/dependencies/tutorial002_an_py310.py!}
``` ```
////
//// tab | Python 3.9+
```Python hl_lines="19"
{!> ../../../docs_src/dependencies/tutorial002_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="20"
{!> ../../../docs_src/dependencies/tutorial002_an.py!}
```
=== "Python 3.9+" ////
```Python hl_lines="19" //// tab | Python 3.10+ nicht annotiert
{!> ../../../docs_src/dependencies/tutorial002_an_py39.py!}
```
=== "Python 3.8+" /// tip | "Tipp"
```Python hl_lines="20" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/dependencies/tutorial002_an.py!}
```
=== "Python 3.10+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="17"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/dependencies/tutorial002_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
```Python hl_lines="17" /// tip | "Tipp"
{!> ../../../docs_src/dependencies/tutorial002_py310.py!}
```
=== "Python 3.8+ nicht annotiert" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
!!! tip "Tipp" ///
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="19"
{!> ../../../docs_src/dependencies/tutorial002.py!}
```
```Python hl_lines="19" ////
{!> ../../../docs_src/dependencies/tutorial002.py!}
```
**FastAPI** ruft die Klasse `CommonQueryParams` auf. Dadurch wird eine โ€žInstanzโ€œ dieser Klasse erstellt und die Instanz wird als Parameter `commons` an Ihre Funktion รผberreicht. **FastAPI** ruft die Klasse `CommonQueryParams` auf. Dadurch wird eine โ€žInstanzโ€œ dieser Klasse erstellt und die Instanz wird als Parameter `commons` an Ihre Funktion รผberreicht.
@ -271,20 +351,27 @@ Jetzt kรถnnen Sie Ihre Abhรคngigkeit mithilfe dieser Klasse deklarieren.
Beachten Sie, wie wir `CommonQueryParams` im obigen Code zweimal schreiben: Beachten Sie, wie wir `CommonQueryParams` im obigen Code zweimal schreiben:
=== "Python 3.8+" //// tab | Python 3.8+
```Python
commons: Annotated[CommonQueryParams, Depends(CommonQueryParams)]
```
////
```Python //// tab | Python 3.8+ nicht annotiert
commons: Annotated[CommonQueryParams, Depends(CommonQueryParams)]
```
=== "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 ///
commons: CommonQueryParams = Depends(CommonQueryParams)
``` ```Python
commons: CommonQueryParams = Depends(CommonQueryParams)
```
////
Das letzte `CommonQueryParams`, in: Das letzte `CommonQueryParams`, in:
@ -300,77 +387,107 @@ Aus diesem extrahiert FastAPI die deklarierten Parameter, und dieses ist es, was
In diesem Fall hat das erste `CommonQueryParams` in: In diesem Fall hat das erste `CommonQueryParams` in:
=== "Python 3.8+" //// tab | Python 3.8+
```Python
commons: Annotated[CommonQueryParams, ...
```
////
```Python //// tab | Python 3.8+ nicht annotiert
commons: Annotated[CommonQueryParams, ...
```
=== "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 ///
commons: CommonQueryParams ...
``` ```Python
commons: CommonQueryParams ...
```
////
... keine besondere Bedeutung fรผr **FastAPI**. FastAPI verwendet es nicht fรผr die Datenkonvertierung, -validierung, usw. (da es dafรผr `Depends(CommonQueryParams)` verwendet). ... keine besondere Bedeutung fรผr **FastAPI**. FastAPI verwendet es nicht fรผr die Datenkonvertierung, -validierung, usw. (da es dafรผr `Depends(CommonQueryParams)` verwendet).
Sie kรถnnten tatsรคchlich einfach schreiben: Sie kรถnnten tatsรคchlich einfach schreiben:
=== "Python 3.8+" //// tab | Python 3.8+
```Python
commons: Annotated[Any, Depends(CommonQueryParams)]
```
```Python ////
commons: Annotated[Any, Depends(CommonQueryParams)]
```
=== "Python 3.8+ nicht annotiert" //// tab | Python 3.8+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
commons = Depends(CommonQueryParams)
``` ///
```Python
commons = Depends(CommonQueryParams)
```
////
... wie in: ... wie in:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="19"
{!> ../../../docs_src/dependencies/tutorial003_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="19"
{!> ../../../docs_src/dependencies/tutorial003_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="19" ```Python hl_lines="20"
{!> ../../../docs_src/dependencies/tutorial003_an_py310.py!} {!> ../../../docs_src/dependencies/tutorial003_an.py!}
``` ```
////
=== "Python 3.9+" //// tab | Python 3.10+ nicht annotiert
```Python hl_lines="19" /// tip | "Tipp"
{!> ../../../docs_src/dependencies/tutorial003_an_py39.py!}
```
=== "Python 3.8+" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="20" ///
{!> ../../../docs_src/dependencies/tutorial003_an.py!}
```
=== "Python 3.10+ nicht annotiert" ```Python hl_lines="17"
{!> ../../../docs_src/dependencies/tutorial003_py310.py!}
```
!!! tip "Tipp" ////
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="17" //// tab | Python 3.8+ nicht annotiert
{!> ../../../docs_src/dependencies/tutorial003_py310.py!}
```
=== "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" ///
{!> ../../../docs_src/dependencies/tutorial003.py!}
``` ```Python hl_lines="19"
{!> ../../../docs_src/dependencies/tutorial003.py!}
```
////
Es wird jedoch empfohlen, den Typ zu deklarieren, da Ihr Editor so weiรŸ, was als Parameter `commons` รผbergeben wird, und Ihnen dann bei der Codevervollstรคndigung, Typprรผfungen, usw. helfen kann: Es wird jedoch empfohlen, den Typ zu deklarieren, da Ihr Editor so weiรŸ, was als Parameter `commons` รผbergeben wird, und Ihnen dann bei der Codevervollstรคndigung, Typprรผfungen, usw. helfen kann:
@ -380,20 +497,27 @@ Es wird jedoch empfohlen, den Typ zu deklarieren, da Ihr Editor so weiรŸ, was al
Aber Sie sehen, dass wir hier etwas Codeduplizierung haben, indem wir `CommonQueryParams` zweimal schreiben: Aber Sie sehen, dass wir hier etwas Codeduplizierung haben, indem wir `CommonQueryParams` zweimal schreiben:
=== "Python 3.8+" //// tab | Python 3.8+
```Python
commons: Annotated[CommonQueryParams, Depends(CommonQueryParams)]
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
```Python Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
commons: Annotated[CommonQueryParams, Depends(CommonQueryParams)]
```
=== "Python 3.8+ nicht annotiert" ///
!!! tip "Tipp" ```Python
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. commons: CommonQueryParams = Depends(CommonQueryParams)
```
```Python ////
commons: CommonQueryParams = Depends(CommonQueryParams)
```
**FastAPI** bietet eine Abkรผrzung fรผr diese Fรคlle, wo die Abhรคngigkeit *speziell* eine Klasse ist, welche **FastAPI** aufruft, um eine Instanz der Klasse selbst zu erstellen. **FastAPI** bietet eine Abkรผrzung fรผr diese Fรคlle, wo die Abhรคngigkeit *speziell* eine Klasse ist, welche **FastAPI** aufruft, um eine Instanz der Klasse selbst zu erstellen.
@ -401,81 +525,114 @@ In diesem speziellen Fall kรถnnen Sie Folgendes tun:
Anstatt zu schreiben: Anstatt zu schreiben:
=== "Python 3.8+" //// tab | Python 3.8+
```Python ```Python
commons: Annotated[CommonQueryParams, Depends(CommonQueryParams)] commons: Annotated[CommonQueryParams, Depends(CommonQueryParams)]
``` ```
////
=== "Python 3.8+ nicht annotiert" //// tab | Python 3.8+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
commons: CommonQueryParams = Depends(CommonQueryParams)
``` ///
```Python
commons: CommonQueryParams = Depends(CommonQueryParams)
```
////
... schreiben Sie: ... schreiben Sie:
=== "Python 3.8+" //// tab | Python 3.8+
```Python ```Python
commons: Annotated[CommonQueryParams, Depends()] commons: Annotated[CommonQueryParams, Depends()]
``` ```
=== "Python 3.8 nicht annotiert" ////
!!! tip "Tipp" //// tab | Python 3.8 nicht annotiert
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python /// tip | "Tipp"
commons: CommonQueryParams = Depends()
``` Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python
commons: CommonQueryParams = Depends()
```
////
Sie deklarieren die Abhรคngigkeit als Typ des Parameters und verwenden `Depends()` ohne Parameter, anstatt die vollstรคndige Klasse *erneut* in `Depends(CommonQueryParams)` schreiben zu mรผssen. Sie deklarieren die Abhรคngigkeit als Typ des Parameters und verwenden `Depends()` ohne Parameter, anstatt die vollstรคndige Klasse *erneut* in `Depends(CommonQueryParams)` schreiben zu mรผssen.
Dasselbe Beispiel wรผrde dann so aussehen: Dasselbe Beispiel wรผrde dann so aussehen:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="19"
{!> ../../../docs_src/dependencies/tutorial004_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="19"
{!> ../../../docs_src/dependencies/tutorial004_an_py39.py!}
```
////
```Python hl_lines="19" //// tab | Python 3.8+
{!> ../../../docs_src/dependencies/tutorial004_an_py310.py!}
```
=== "Python 3.9+" ```Python hl_lines="20"
{!> ../../../docs_src/dependencies/tutorial004_an.py!}
```
////
```Python hl_lines="19" //// tab | Python 3.10+ nicht annotiert
{!> ../../../docs_src/dependencies/tutorial004_an_py39.py!}
```
=== "Python 3.8+" /// tip | "Tipp"
```Python hl_lines="20" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/dependencies/tutorial004_an.py!}
```
=== "Python 3.10+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="17"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/dependencies/tutorial004_py310.py!}
```
```Python hl_lines="17" ////
{!> ../../../docs_src/dependencies/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.
```Python hl_lines="19" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/dependencies/tutorial004.py!}
``` ///
```Python hl_lines="19"
{!> ../../../docs_src/dependencies/tutorial004.py!}
```
////
... und **FastAPI** wird wissen, was zu tun ist. ... und **FastAPI** wird wissen, was zu tun ist.
!!! tip "Tipp" /// tip | "Tipp"
Wenn Sie das eher verwirrt, als Ihnen zu helfen, ignorieren Sie es, Sie *brauchen* es nicht.
Wenn Sie das eher verwirrt, als Ihnen zu helfen, ignorieren Sie es, Sie *brauchen* es nicht.
Es ist nur eine Abkรผrzung. Es geht **FastAPI** darum, Ihnen dabei zu helfen, Codeverdoppelung zu minimieren.
Es ist nur eine Abkรผrzung. Es geht **FastAPI** darum, Ihnen dabei zu helfen, Codeverdoppelung zu minimieren. ///

168
docs/de/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md

@ -14,40 +14,55 @@ Der *Pfadoperation-Dekorator* erhรคlt ein optionales Argument `dependencies`.
Es sollte eine `list`e von `Depends()` sein: Es sollte eine `list`e von `Depends()` sein:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="19" ```Python hl_lines="19"
{!> ../../../docs_src/dependencies/tutorial006_an_py39.py!} {!> ../../../docs_src/dependencies/tutorial006_an_py39.py!}
``` ```
=== "Python 3.8+" ////
```Python hl_lines="18" //// tab | Python 3.8+
{!> ../../../docs_src/dependencies/tutorial006_an.py!}
```
=== "Python 3.8 nicht annotiert" ```Python hl_lines="18"
{!> ../../../docs_src/dependencies/tutorial006_an.py!}
```
!!! tip "Tipp" ////
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="17" //// tab | Python 3.8 nicht annotiert
{!> ../../../docs_src/dependencies/tutorial006.py!}
``` /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="17"
{!> ../../../docs_src/dependencies/tutorial006.py!}
```
////
Diese Abhรคngigkeiten werden auf die gleiche Weise wie normale Abhรคngigkeiten ausgefรผhrt/aufgelรถst. Aber ihr Wert (falls sie einen zurรผckgeben) wird nicht an Ihre *Pfadoperation-Funktion* รผbergeben. Diese Abhรคngigkeiten werden auf die gleiche Weise wie normale Abhรคngigkeiten ausgefรผhrt/aufgelรถst. Aber ihr Wert (falls sie einen zurรผckgeben) wird nicht an Ihre *Pfadoperation-Funktion* รผbergeben.
!!! tip "Tipp" /// tip | "Tipp"
Einige Editoren prรผfen, ob Funktionsparameter nicht verwendet werden, und zeigen das als Fehler an.
Einige Editoren prรผfen, ob Funktionsparameter nicht verwendet werden, und zeigen das als Fehler an.
Wenn Sie `dependencies` im *Pfadoperation-Dekorator* verwenden, stellen Sie sicher, dass sie ausgefรผhrt werden, wรคhrend gleichzeitig Ihr Editor/Ihre Tools keine Fehlermeldungen ausgeben. Wenn Sie `dependencies` im *Pfadoperation-Dekorator* verwenden, stellen Sie sicher, dass sie ausgefรผhrt werden, wรคhrend gleichzeitig Ihr Editor/Ihre Tools keine Fehlermeldungen ausgeben.
Damit wird auch vermieden, neue Entwickler mรถglicherweise zu verwirren, die einen nicht verwendeten Parameter in Ihrem Code sehen und ihn fรผr unnรถtig halten kรถnnten. Damit wird auch vermieden, neue Entwickler mรถglicherweise zu verwirren, die einen nicht verwendeten Parameter in Ihrem Code sehen und ihn fรผr unnรถtig halten kรถnnten.
!!! info ///
In diesem Beispiel verwenden wir zwei erfundene benutzerdefinierte Header `X-Key` und `X-Token`.
Aber in realen Fรคllen wรผrden Sie bei der Implementierung von Sicherheit mehr Vorteile durch die Verwendung der integrierten [Sicherheits-Werkzeuge (siehe nรคchstes Kapitel)](../security/index.md){.internal-link target=_blank} erzielen. /// info
In diesem Beispiel verwenden wir zwei erfundene benutzerdefinierte Header `X-Key` und `X-Token`.
Aber in realen Fรคllen wรผrden Sie bei der Implementierung von Sicherheit mehr Vorteile durch die Verwendung der integrierten [Sicherheits-Werkzeuge (siehe nรคchstes Kapitel)](../security/index.md){.internal-link target=_blank} erzielen.
///
## Abhรคngigkeitsfehler und -Rรผckgabewerte ## Abhรคngigkeitsfehler und -Rรผckgabewerte
@ -57,51 +72,69 @@ Sie kรถnnen dieselben Abhรคngigkeits-*Funktionen* verwenden, die Sie normalerwei
Sie kรถnnen Anforderungen fรผr einen Request (wie Header) oder andere Unterabhรคngigkeiten deklarieren: Sie kรถnnen Anforderungen fรผr einen Request (wie Header) oder andere Unterabhรคngigkeiten deklarieren:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="8 13"
{!> ../../../docs_src/dependencies/tutorial006_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="8 13" ```Python hl_lines="7 12"
{!> ../../../docs_src/dependencies/tutorial006_an_py39.py!} {!> ../../../docs_src/dependencies/tutorial006_an.py!}
``` ```
=== "Python 3.8+" ////
```Python hl_lines="7 12" //// tab | Python 3.8 nicht annotiert
{!> ../../../docs_src/dependencies/tutorial006_an.py!}
```
=== "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="6 11" ///
{!> ../../../docs_src/dependencies/tutorial006.py!}
``` ```Python hl_lines="6 11"
{!> ../../../docs_src/dependencies/tutorial006.py!}
```
////
### Exceptions auslรถsen ### Exceptions auslรถsen
Die Abhรคngigkeiten kรถnnen Exceptions `raise`n, genau wie normale Abhรคngigkeiten: Die Abhรคngigkeiten kรถnnen Exceptions `raise`n, genau wie normale Abhรคngigkeiten:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="10 15"
{!> ../../../docs_src/dependencies/tutorial006_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="9 14"
{!> ../../../docs_src/dependencies/tutorial006_an.py!}
```
```Python hl_lines="10 15" ////
{!> ../../../docs_src/dependencies/tutorial006_an_py39.py!}
```
=== "Python 3.8+" //// tab | Python 3.8 nicht annotiert
```Python hl_lines="9 14" /// tip | "Tipp"
{!> ../../../docs_src/dependencies/tutorial006_an.py!}
```
=== "Python 3.8 nicht annotiert" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
!!! tip "Tipp" ///
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="8 13" ```Python hl_lines="8 13"
{!> ../../../docs_src/dependencies/tutorial006.py!} {!> ../../../docs_src/dependencies/tutorial006.py!}
``` ```
////
### Rรผckgabewerte ### Rรผckgabewerte
@ -109,26 +142,35 @@ Und sie kรถnnen Werte zurรผckgeben oder nicht, die Werte werden nicht verwendet.
Sie kรถnnen also eine normale Abhรคngigkeit (die einen Wert zurรผckgibt), die Sie bereits an anderer Stelle verwenden, wiederverwenden, und auch wenn der Wert nicht verwendet wird, wird die Abhรคngigkeit ausgefรผhrt: Sie kรถnnen also eine normale Abhรคngigkeit (die einen Wert zurรผckgibt), die Sie bereits an anderer Stelle verwenden, wiederverwenden, und auch wenn der Wert nicht verwendet wird, wird die Abhรคngigkeit ausgefรผhrt:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="11 16"
{!> ../../../docs_src/dependencies/tutorial006_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="10 15"
{!> ../../../docs_src/dependencies/tutorial006_an.py!}
```
////
```Python hl_lines="11 16" //// tab | Python 3.8 nicht annotiert
{!> ../../../docs_src/dependencies/tutorial006_an_py39.py!}
```
=== "Python 3.8+" /// tip | "Tipp"
```Python hl_lines="10 15" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/dependencies/tutorial006_an.py!}
```
=== "Python 3.8 nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="9 14"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/dependencies/tutorial006.py!}
```
```Python hl_lines="9 14" ////
{!> ../../../docs_src/dependencies/tutorial006.py!}
```
## Abhรคngigkeiten fรผr eine Gruppe von *Pfadoperationen* ## Abhรคngigkeiten fรผr eine Gruppe von *Pfadoperationen*

222
docs/de/docs/tutorial/dependencies/dependencies-with-yield.md

@ -4,18 +4,24 @@ FastAPI unterstรผtzt Abhรคngigkeiten, die nach Abschluss einige <abbr title="Man
Verwenden Sie dazu `yield` statt `return` und schreiben Sie die zusรคtzlichen Schritte / den zusรคtzlichen Code danach. Verwenden Sie dazu `yield` statt `return` und schreiben Sie die zusรคtzlichen Schritte / den zusรคtzlichen Code danach.
!!! tip "Tipp" /// tip | "Tipp"
Stellen Sie sicher, dass Sie `yield` nur einmal pro Abhรคngigkeit verwenden.
!!! note "Technische Details" Stellen Sie sicher, dass Sie `yield` nur einmal pro Abhรคngigkeit verwenden.
Jede Funktion, die dekoriert werden kann mit:
* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager" class="external-link" target="_blank">`@contextlib.contextmanager`</a> oder ///
* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager" class="external-link" target="_blank">`@contextlib.asynccontextmanager`</a>
kann auch als gรผltige **FastAPI**-Abhรคngigkeit verwendet werden. /// note | "Technische Details"
Tatsรคchlich verwendet FastAPI diese beiden Dekoratoren intern. Jede Funktion, die dekoriert werden kann mit:
* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager" class="external-link" target="_blank">`@contextlib.contextmanager`</a> oder
* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager" class="external-link" target="_blank">`@contextlib.asynccontextmanager`</a>
kann auch als gรผltige **FastAPI**-Abhรคngigkeit verwendet werden.
Tatsรคchlich verwendet FastAPI diese beiden Dekoratoren intern.
///
## Eine Datenbank-Abhรคngigkeit mit `yield`. ## Eine Datenbank-Abhรคngigkeit mit `yield`.
@ -39,10 +45,13 @@ Der auf die `yield`-Anweisung folgende Code wird ausgefรผhrt, nachdem die Respon
{!../../../docs_src/dependencies/tutorial007.py!} {!../../../docs_src/dependencies/tutorial007.py!}
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Sie kรถnnen `async`hrone oder regulรคre Funktionen verwenden.
Sie kรถnnen `async`hrone oder regulรคre Funktionen verwenden.
**FastAPI** wird bei jeder das Richtige tun, so wie auch bei normalen Abhรคngigkeiten.
**FastAPI** wird bei jeder das Richtige tun, so wie auch bei normalen Abhรคngigkeiten. ///
## Eine Abhรคngigkeit mit `yield` und `try`. ## Eine Abhรคngigkeit mit `yield` und `try`.
@ -66,26 +75,35 @@ Sie kรถnnen Unterabhรคngigkeiten und โ€žBรคumeโ€œ von Unterabhรคngigkeiten belie
Beispielsweise kann `dependency_c` von `dependency_b` und `dependency_b` von `dependency_a` abhรคngen: Beispielsweise kann `dependency_c` von `dependency_b` und `dependency_b` von `dependency_a` abhรคngen:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="6 14 22"
{!> ../../../docs_src/dependencies/tutorial008_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="5 13 21"
{!> ../../../docs_src/dependencies/tutorial008_an.py!}
```
////
```Python hl_lines="6 14 22" //// tab | Python 3.8+ nicht annotiert
{!> ../../../docs_src/dependencies/tutorial008_an_py39.py!}
```
=== "Python 3.8+" /// tip | "Tipp"
```Python hl_lines="5 13 21" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/dependencies/tutorial008_an.py!}
```
=== "Python 3.8+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="4 12 20"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/dependencies/tutorial008.py!}
```
```Python hl_lines="4 12 20" ////
{!> ../../../docs_src/dependencies/tutorial008.py!}
```
Und alle kรถnnen `yield` verwenden. Und alle kรถnnen `yield` verwenden.
@ -93,26 +111,35 @@ In diesem Fall benรถtigt `dependency_c` zum Ausfรผhren seines Exit-Codes, dass d
Und wiederum benรถtigt `dependency_b` den Wert von `dependency_a` (hier `dep_a` genannt) fรผr seinen Exit-Code. Und wiederum benรถtigt `dependency_b` den Wert von `dependency_a` (hier `dep_a` genannt) fรผr seinen Exit-Code.
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="18-19 26-27" ```Python hl_lines="18-19 26-27"
{!> ../../../docs_src/dependencies/tutorial008_an_py39.py!} {!> ../../../docs_src/dependencies/tutorial008_an_py39.py!}
``` ```
////
=== "Python 3.8+" //// tab | Python 3.8+
```Python hl_lines="17-18 25-26" ```Python hl_lines="17-18 25-26"
{!> ../../../docs_src/dependencies/tutorial008_an.py!} {!> ../../../docs_src/dependencies/tutorial008_an.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
!!! tip "Tipp" //// tab | Python 3.8+ nicht annotiert
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="16-17 24-25"
{!> ../../../docs_src/dependencies/tutorial008.py!}
```
```Python hl_lines="16-17 24-25" ////
{!> ../../../docs_src/dependencies/tutorial008.py!}
```
Auf die gleiche Weise kรถnnten Sie einige Abhรคngigkeiten mit `yield` und einige andere Abhรคngigkeiten mit `return` haben, und alle kรถnnen beliebig voneinander abhรคngen. Auf die gleiche Weise kรถnnten Sie einige Abhรคngigkeiten mit `yield` und einige andere Abhรคngigkeiten mit `return` haben, und alle kรถnnen beliebig voneinander abhรคngen.
@ -122,10 +149,13 @@ Sie kรถnnen beliebige Kombinationen von Abhรคngigkeiten haben.
**FastAPI** stellt sicher, dass alles in der richtigen Reihenfolge ausgefรผhrt wird. **FastAPI** stellt sicher, dass alles in der richtigen Reihenfolge ausgefรผhrt wird.
!!! note "Technische Details" /// note | "Technische Details"
Dieses funktioniert dank Pythons <a href="https://docs.python.org/3/library/contextlib.html" class="external-link" target="_blank">Kontextmanager</a>.
**FastAPI** verwendet sie intern, um das zu erreichen. Dieses funktioniert dank Pythons <a href="https://docs.python.org/3/library/contextlib.html" class="external-link" target="_blank">Kontextmanager</a>.
**FastAPI** verwendet sie intern, um das zu erreichen.
///
## Abhรคngigkeiten mit `yield` und `HTTPException`. ## Abhรคngigkeiten mit `yield` und `HTTPException`.
@ -133,32 +163,43 @@ Sie haben gesehen, dass Ihre Abhรคngigkeiten `yield` verwenden kรถnnen und `try`
Auf die gleiche Weise kรถnnten Sie im Exit-Code nach dem `yield` eine `HTTPException` oder รคhnliches auslรถsen. Auf die gleiche Weise kรถnnten Sie im Exit-Code nach dem `yield` eine `HTTPException` oder รคhnliches auslรถsen.
!!! tip "Tipp" /// tip | "Tipp"
Dies ist eine etwas fortgeschrittene Technik, die Sie in den meisten Fรคllen nicht wirklich benรถtigen, da Sie Exceptions (einschlieรŸlich `HTTPException`) innerhalb des restlichen Anwendungscodes auslรถsen kรถnnen, beispielsweise in der *Pfadoperation-Funktion*.
Dies ist eine etwas fortgeschrittene Technik, die Sie in den meisten Fรคllen nicht wirklich benรถtigen, da Sie Exceptions (einschlieรŸlich `HTTPException`) innerhalb des restlichen Anwendungscodes auslรถsen kรถnnen, beispielsweise in der *Pfadoperation-Funktion*. Aber es ist fรผr Sie da, wenn Sie es brauchen. ๐Ÿค“
Aber es ist fรผr Sie da, wenn Sie es brauchen. ๐Ÿค“ ///
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="18-22 31" ```Python hl_lines="18-22 31"
{!> ../../../docs_src/dependencies/tutorial008b_an_py39.py!} {!> ../../../docs_src/dependencies/tutorial008b_an_py39.py!}
``` ```
////
=== "Python 3.8+" //// tab | Python 3.8+
```Python hl_lines="17-21 30" ```Python hl_lines="17-21 30"
{!> ../../../docs_src/dependencies/tutorial008b_an.py!} {!> ../../../docs_src/dependencies/tutorial008b_an.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
!!! tip "Tipp" //// tab | Python 3.8+ nicht annotiert
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="16-20 29"
{!> ../../../docs_src/dependencies/tutorial008b.py!}
```
```Python hl_lines="16-20 29" ////
{!> ../../../docs_src/dependencies/tutorial008b.py!}
```
Eine Alternative zum Abfangen von Exceptions (und mรถglicherweise auch zum Auslรถsen einer weiteren `HTTPException`) besteht darin, einen [benutzerdefinierten Exceptionhandler](../handling-errors.md#benutzerdefinierte-exceptionhandler-definieren){.internal-link target=_blank} zu erstellen. Eine Alternative zum Abfangen von Exceptions (und mรถglicherweise auch zum Auslรถsen einer weiteren `HTTPException`) besteht darin, einen [benutzerdefinierten Exceptionhandler](../handling-errors.md#benutzerdefinierte-exceptionhandler-definieren){.internal-link target=_blank} zu erstellen.
@ -201,22 +242,31 @@ participant tasks as Hintergrundtasks
end end
``` ```
!!! info /// info
Es wird nur **eine Response** an den Client gesendet. Es kann eine Error-Response oder die Response der *Pfadoperation* sein.
Nachdem eine dieser Responses gesendet wurde, kann keine weitere Response gesendet werden. Es wird nur **eine Response** an den Client gesendet. Es kann eine Error-Response oder die Response der *Pfadoperation* sein.
!!! tip "Tipp" Nachdem eine dieser Responses gesendet wurde, kann keine weitere Response gesendet werden.
Obiges Diagramm verwendet `HTTPException`, aber Sie kรถnnen auch jede andere Exception auslรถsen, die Sie in einer Abhรคngigkeit mit `yield` abfangen, oder mit einem [benutzerdefinierten Exceptionhandler](../handling-errors.md#benutzerdefinierte-exceptionhandler-definieren){.internal-link target=_blank} erstellt haben.
Wenn Sie eine Exception auslรถsen, wird diese mit yield an die Abhรคngigkeiten รผbergeben, einschlieรŸlich `HTTPException`, und dann **erneut** an die Exceptionhandler. Wenn es fรผr diese Exception keinen Exceptionhandler gibt, wird sie von der internen Default-`ServerErrorMiddleware` gehandhabt, was einen HTTP-Statuscode 500 zurรผckgibt, um den Client darรผber zu informieren, dass ein Fehler auf dem Server aufgetreten ist. ///
/// tip | "Tipp"
Obiges Diagramm verwendet `HTTPException`, aber Sie kรถnnen auch jede andere Exception auslรถsen, die Sie in einer Abhรคngigkeit mit `yield` abfangen, oder mit einem [benutzerdefinierten Exceptionhandler](../handling-errors.md#benutzerdefinierte-exceptionhandler-definieren){.internal-link target=_blank} erstellt haben.
Wenn Sie eine Exception auslรถsen, wird diese mit yield an die Abhรคngigkeiten รผbergeben, einschlieรŸlich `HTTPException`, und dann **erneut** an die Exceptionhandler. Wenn es fรผr diese Exception keinen Exceptionhandler gibt, wird sie von der internen Default-`ServerErrorMiddleware` gehandhabt, was einen HTTP-Statuscode 500 zurรผckgibt, um den Client darรผber zu informieren, dass ein Fehler auf dem Server aufgetreten ist.
///
## Abhรคngigkeiten mit `yield`, `HTTPException` und Hintergrundtasks ## Abhรคngigkeiten mit `yield`, `HTTPException` und Hintergrundtasks
!!! warning "Achtung" /// warning | "Achtung"
Sie benรถtigen diese technischen Details hรถchstwahrscheinlich nicht, Sie kรถnnen diesen Abschnitt รผberspringen und weiter unten fortfahren.
Sie benรถtigen diese technischen Details hรถchstwahrscheinlich nicht, Sie kรถnnen diesen Abschnitt รผberspringen und weiter unten fortfahren.
Diese Details sind vor allem dann nรผtzlich, wenn Sie eine Version von FastAPI vor 0.106.0 verwendet haben und Ressourcen aus Abhรคngigkeiten mit `yield` in Hintergrundtasks verwendet haben.
Diese Details sind vor allem dann nรผtzlich, wenn Sie eine Version von FastAPI vor 0.106.0 verwendet haben und Ressourcen aus Abhรคngigkeiten mit `yield` in Hintergrundtasks verwendet haben. ///
Vor FastAPI 0.106.0 war das Auslรถsen von Exceptions nach `yield` nicht mรถglich, der Exit-Code in Abhรคngigkeiten mit `yield` wurde ausgefรผhrt, *nachdem* die Response gesendet wurde, die [Exceptionhandler](../handling-errors.md#benutzerdefinierte-exceptionhandler-definieren){.internal-link target=_blank} wรคren also bereits ausgefรผhrt worden. Vor FastAPI 0.106.0 war das Auslรถsen von Exceptions nach `yield` nicht mรถglich, der Exit-Code in Abhรคngigkeiten mit `yield` wurde ausgefรผhrt, *nachdem* die Response gesendet wurde, die [Exceptionhandler](../handling-errors.md#benutzerdefinierte-exceptionhandler-definieren){.internal-link target=_blank} wรคren also bereits ausgefรผhrt worden.
@ -224,11 +274,13 @@ Dies wurde hauptsรคchlich so konzipiert, damit die gleichen Objekte, die durch A
Da dies jedoch bedeuten wรผrde, darauf zu warten, dass die Response durch das Netzwerk reist, wรคhrend eine Ressource unnรถtigerweise in einer Abhรคngigkeit mit yield gehalten wird (z. B. eine Datenbankverbindung), wurde dies in FastAPI 0.106.0 geรคndert. Da dies jedoch bedeuten wรผrde, darauf zu warten, dass die Response durch das Netzwerk reist, wรคhrend eine Ressource unnรถtigerweise in einer Abhรคngigkeit mit yield gehalten wird (z. B. eine Datenbankverbindung), wurde dies in FastAPI 0.106.0 geรคndert.
!!! tip "Tipp" /// tip | "Tipp"
Darรผber hinaus handelt es sich bei einem Hintergrundtask normalerweise um einen unabhรคngigen Satz von Logik, der separat behandelt werden sollte, mit eigenen Ressourcen (z. B. einer eigenen Datenbankverbindung). Darรผber hinaus handelt es sich bei einem Hintergrundtask normalerweise um einen unabhรคngigen Satz von Logik, der separat behandelt werden sollte, mit eigenen Ressourcen (z. B. einer eigenen Datenbankverbindung).
Auf diese Weise erhalten Sie wahrscheinlich saubereren Code. Auf diese Weise erhalten Sie wahrscheinlich saubereren Code.
///
Wenn Sie sich frรผher auf dieses Verhalten verlassen haben, sollten Sie jetzt die Ressourcen fรผr Hintergrundtasks innerhalb des Hintergrundtasks selbst erstellen und intern nur Daten verwenden, die nicht von den Ressourcen von Abhรคngigkeiten mit `yield` abhรคngen. Wenn Sie sich frรผher auf dieses Verhalten verlassen haben, sollten Sie jetzt die Ressourcen fรผr Hintergrundtasks innerhalb des Hintergrundtasks selbst erstellen und intern nur Daten verwenden, die nicht von den Ressourcen von Abhรคngigkeiten mit `yield` abhรคngen.
@ -256,10 +308,13 @@ Wenn Sie eine Abhรคngigkeit mit `yield` erstellen, erstellt **FastAPI** dafรผr i
### Kontextmanager in Abhรคngigkeiten mit `yield` verwenden ### Kontextmanager in Abhรคngigkeiten mit `yield` verwenden
!!! warning "Achtung" /// warning | "Achtung"
Dies ist mehr oder weniger eine โ€žfortgeschritteneโ€œ Idee.
Dies ist mehr oder weniger eine โ€žfortgeschritteneโ€œ Idee.
Wenn Sie gerade erst mit **FastAPI** beginnen, mรถchten Sie das vielleicht vorerst รผberspringen.
Wenn Sie gerade erst mit **FastAPI** beginnen, mรถchten Sie das vielleicht vorerst รผberspringen. ///
In Python kรถnnen Sie Kontextmanager erstellen, indem Sie <a href="https://docs.python.org/3/reference/datamodel.html#context-managers" class="external-link" target="_blank">eine Klasse mit zwei Methoden erzeugen: `__enter__()` und `__exit__()`</a>. In Python kรถnnen Sie Kontextmanager erstellen, indem Sie <a href="https://docs.python.org/3/reference/datamodel.html#context-managers" class="external-link" target="_blank">eine Klasse mit zwei Methoden erzeugen: `__enter__()` und `__exit__()`</a>.
@ -269,16 +324,19 @@ Sie kรถnnen solche auch innerhalb von **FastAPI**-Abhรคngigkeiten mit `yield` ve
{!../../../docs_src/dependencies/tutorial010.py!} {!../../../docs_src/dependencies/tutorial010.py!}
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Andere Mรถglichkeiten, einen Kontextmanager zu erstellen, sind:
Andere Mรถglichkeiten, einen Kontextmanager zu erstellen, sind:
* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager" class="external-link" target="_blank">`@contextlib.contextmanager`</a> oder
* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager" class="external-link" target="_blank">`@contextlib.asynccontextmanager`</a>
* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager" class="external-link" target="_blank">`@contextlib.contextmanager`</a> oder Verwenden Sie diese, um eine Funktion zu dekorieren, die ein einziges `yield` hat.
* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager" class="external-link" target="_blank">`@contextlib.asynccontextmanager`</a>
Verwenden Sie diese, um eine Funktion zu dekorieren, die ein einziges `yield` hat. Das ist es auch, was **FastAPI** intern fรผr Abhรคngigkeiten mit `yield` verwendet.
Das ist es auch, was **FastAPI** intern fรผr Abhรคngigkeiten mit `yield` verwendet. Aber Sie mรผssen die Dekoratoren nicht fรผr FastAPI-Abhรคngigkeiten verwenden (und das sollten Sie auch nicht).
Aber Sie mรผssen die Dekoratoren nicht fรผr FastAPI-Abhรคngigkeiten verwenden (und das sollten Sie auch nicht). FastAPI erledigt das intern fรผr Sie.
FastAPI erledigt das intern fรผr Sie. ///

37
docs/de/docs/tutorial/dependencies/global-dependencies.md

@ -6,26 +6,35 @@ Bei einigen Anwendungstypen mรถchten Sie mรถglicherweise Abhรคngigkeiten zur ges
In diesem Fall werden sie auf alle *Pfadoperationen* in der Anwendung angewendet: In diesem Fall werden sie auf alle *Pfadoperationen* in der Anwendung angewendet:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="16" ```Python hl_lines="16"
{!> ../../../docs_src/dependencies/tutorial012_an_py39.py!} {!> ../../../docs_src/dependencies/tutorial012_an_py39.py!}
``` ```
=== "Python 3.8+" ////
```Python hl_lines="16" //// tab | Python 3.8+
{!> ../../../docs_src/dependencies/tutorial012_an.py!}
```
=== "Python 3.8 nicht annotiert" ```Python hl_lines="16"
{!> ../../../docs_src/dependencies/tutorial012_an.py!}
```
!!! tip "Tipp" ////
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="15" //// tab | Python 3.8 nicht annotiert
{!> ../../../docs_src/dependencies/tutorial012.py!}
``` /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="15"
{!> ../../../docs_src/dependencies/tutorial012.py!}
```
////
Und alle Ideen aus dem Abschnitt รผber das [Hinzufรผgen von `dependencies` zu den *Pfadoperation-Dekoratoren*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank} gelten weiterhin, aber in diesem Fall fรผr alle *Pfadoperationen* in der Anwendung. Und alle Ideen aus dem Abschnitt รผber das [Hinzufรผgen von `dependencies` zu den *Pfadoperation-Dekoratoren*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank} gelten weiterhin, aber in diesem Fall fรผr alle *Pfadoperationen* in der Anwendung.

265
docs/de/docs/tutorial/dependencies/index.md

@ -30,41 +30,57 @@ Aber so kรถnnen wir uns besser auf die Funktionsweise des **Dependency Injection
Konzentrieren wir uns zunรคchst auf die Abhรคngigkeit - die Dependency. Konzentrieren wir uns zunรคchst auf die Abhรคngigkeit - die Dependency.
Es handelt sich einfach um eine Funktion, die die gleichen Parameter entgegennimmt wie eine *Pfadoperation-Funktion*: Es handelt sich einfach um eine Funktion, die die gleichen Parameter entgegennimmt wie eine *Pfadoperation-Funktion*:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="8-9" ```Python hl_lines="8-9"
{!> ../../../docs_src/dependencies/tutorial001_an_py310.py!} {!> ../../../docs_src/dependencies/tutorial001_an_py310.py!}
``` ```
////
//// tab | Python 3.9+
```Python hl_lines="8-11"
{!> ../../../docs_src/dependencies/tutorial001_an_py39.py!}
```
////
=== "Python 3.9+" //// tab | Python 3.8+
```Python hl_lines="8-11" ```Python hl_lines="9-12"
{!> ../../../docs_src/dependencies/tutorial001_an_py39.py!} {!> ../../../docs_src/dependencies/tutorial001_an.py!}
``` ```
=== "Python 3.8+" ////
```Python hl_lines="9-12" //// tab | Python 3.10+ nicht annotiert
{!> ../../../docs_src/dependencies/tutorial001_an.py!}
```
=== "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="6-7" ///
{!> ../../../docs_src/dependencies/tutorial001_py310.py!}
```
=== "Python 3.8+ nicht annotiert" ```Python hl_lines="6-7"
{!> ../../../docs_src/dependencies/tutorial001_py310.py!}
```
!!! tip "Tipp" ////
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="8-11" //// tab | Python 3.8+ nicht annotiert
{!> ../../../docs_src/dependencies/tutorial001.py!}
``` /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="8-11"
{!> ../../../docs_src/dependencies/tutorial001.py!}
```
////
Das war's schon. Das war's schon.
@ -84,90 +100,125 @@ In diesem Fall erwartet diese Abhรคngigkeit:
Und dann wird einfach ein `dict` zurรผckgegeben, welches diese Werte enthรคlt. Und dann wird einfach ein `dict` zurรผckgegeben, welches diese Werte enthรคlt.
!!! info /// info
FastAPI unterstรผtzt (und empfiehlt die Verwendung von) `Annotated` seit Version 0.95.0.
FastAPI unterstรผtzt (und empfiehlt die Verwendung von) `Annotated` seit Version 0.95.0.
Wenn Sie eine รคltere Version haben, werden Sie Fehler angezeigt bekommen, wenn Sie versuchen, `Annotated` zu verwenden. Wenn Sie eine รคltere Version haben, werden Sie Fehler angezeigt bekommen, wenn Sie versuchen, `Annotated` zu verwenden.
Bitte [aktualisieren Sie FastAPI](../../deployment/versions.md#upgrade-der-fastapi-versionen){.internal-link target=_blank} daher mindestens zu Version 0.95.1, bevor Sie `Annotated` verwenden. Bitte [aktualisieren Sie FastAPI](../../deployment/versions.md#upgrade-der-fastapi-versionen){.internal-link target=_blank} daher mindestens zu Version 0.95.1, bevor Sie `Annotated` verwenden.
///
### `Depends` importieren ### `Depends` importieren
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="3"
{!> ../../../docs_src/dependencies/tutorial001_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="3"
{!> ../../../docs_src/dependencies/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="3"
{!> ../../../docs_src/dependencies/tutorial001_an.py!}
```
```Python hl_lines="3" ////
{!> ../../../docs_src/dependencies/tutorial001_an_py310.py!}
```
=== "Python 3.9+" //// tab | Python 3.10+ nicht annotiert
```Python hl_lines="3" /// tip | "Tipp"
{!> ../../../docs_src/dependencies/tutorial001_an_py39.py!}
```
=== "Python 3.8+" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="1"
{!> ../../../docs_src/dependencies/tutorial001_py310.py!}
```
```Python hl_lines="3" ////
{!> ../../../docs_src/dependencies/tutorial001_an.py!}
```
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.8+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="1" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/dependencies/tutorial001_py310.py!}
```
=== "Python 3.8+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="3"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/dependencies/tutorial001.py!}
```
```Python hl_lines="3" ////
{!> ../../../docs_src/dependencies/tutorial001.py!}
```
### Deklarieren der Abhรคngigkeit im <abbr title="Das Abhรคngige, der Verwender der Abhรคngigkeit">โ€žDependantโ€œ</abbr> ### Deklarieren der Abhรคngigkeit im <abbr title="Das Abhรคngige, der Verwender der Abhรคngigkeit">โ€žDependantโ€œ</abbr>
So wie auch `Body`, `Query`, usw., verwenden Sie `Depends` mit den Parametern Ihrer *Pfadoperation-Funktion*: So wie auch `Body`, `Query`, usw., verwenden Sie `Depends` mit den Parametern Ihrer *Pfadoperation-Funktion*:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="13 18"
{!> ../../../docs_src/dependencies/tutorial001_an_py310.py!}
```
////
```Python hl_lines="13 18" //// tab | Python 3.9+
{!> ../../../docs_src/dependencies/tutorial001_an_py310.py!}
```
=== "Python 3.9+" ```Python hl_lines="15 20"
{!> ../../../docs_src/dependencies/tutorial001_an_py39.py!}
```
////
```Python hl_lines="15 20" //// tab | Python 3.8+
{!> ../../../docs_src/dependencies/tutorial001_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="16 21"
{!> ../../../docs_src/dependencies/tutorial001_an.py!}
```
```Python hl_lines="16 21" ////
{!> ../../../docs_src/dependencies/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.
```Python hl_lines="11 16" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/dependencies/tutorial001_py310.py!}
```
=== "Python 3.8+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="11 16"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/dependencies/tutorial001_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="15 20"
{!> ../../../docs_src/dependencies/tutorial001.py!}
```
```Python hl_lines="15 20" ////
{!> ../../../docs_src/dependencies/tutorial001.py!}
```
Obwohl Sie `Depends` in den Parametern Ihrer Funktion genauso verwenden wie `Body`, `Query`, usw., funktioniert `Depends` etwas anders. Obwohl Sie `Depends` in den Parametern Ihrer Funktion genauso verwenden wie `Body`, `Query`, usw., funktioniert `Depends` etwas anders.
@ -179,8 +230,11 @@ Sie **rufen diese nicht direkt auf** (fรผgen Sie am Ende keine Klammern hinzu),
Und diese Funktion akzeptiert Parameter auf die gleiche Weise wie *Pfadoperation-Funktionen*. Und diese Funktion akzeptiert Parameter auf die gleiche Weise wie *Pfadoperation-Funktionen*.
!!! tip "Tipp" /// tip | "Tipp"
Im nรคchsten Kapitel erfahren Sie, welche anderen โ€žDingeโ€œ, auรŸer Funktionen, Sie als Abhรคngigkeiten verwenden kรถnnen.
Im nรคchsten Kapitel erfahren Sie, welche anderen โ€žDingeโ€œ, auรŸer Funktionen, Sie als Abhรคngigkeiten verwenden kรถnnen.
///
Immer wenn ein neuer Request eintrifft, kรผmmert sich **FastAPI** darum: Immer wenn ein neuer Request eintrifft, kรผmmert sich **FastAPI** darum:
@ -201,10 +255,13 @@ common_parameters --> read_users
Auf diese Weise schreiben Sie gemeinsam genutzten Code nur einmal, und **FastAPI** kรผmmert sich darum, ihn fรผr Ihre *Pfadoperationen* aufzurufen. Auf diese Weise schreiben Sie gemeinsam genutzten Code nur einmal, und **FastAPI** kรผmmert sich darum, ihn fรผr Ihre *Pfadoperationen* aufzurufen.
!!! check /// check
Beachten Sie, dass Sie keine spezielle Klasse erstellen und diese irgendwo an **FastAPI** รผbergeben mรผssen, um sie zu โ€žregistrierenโ€œ oder so รคhnlich.
Beachten Sie, dass Sie keine spezielle Klasse erstellen und diese irgendwo an **FastAPI** รผbergeben mรผssen, um sie zu โ€žregistrierenโ€œ oder so รคhnlich.
Sie รผbergeben es einfach an `Depends` und **FastAPI** weiรŸ, wie der Rest erledigt wird.
Sie รผbergeben es einfach an `Depends` und **FastAPI** weiรŸ, wie der Rest erledigt wird. ///
## `Annotated`-Abhรคngigkeiten wiederverwenden ## `Annotated`-Abhรคngigkeiten wiederverwenden
@ -218,28 +275,37 @@ commons: Annotated[dict, Depends(common_parameters)]
Da wir jedoch `Annotated` verwenden, kรถnnen wir diesen `Annotated`-Wert in einer Variablen speichern und an mehreren Stellen verwenden: Da wir jedoch `Annotated` verwenden, kรถnnen wir diesen `Annotated`-Wert in einer Variablen speichern und an mehreren Stellen verwenden:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="12 16 21"
{!> ../../../docs_src/dependencies/tutorial001_02_an_py310.py!}
```
////
```Python hl_lines="12 16 21" //// tab | Python 3.9+
{!> ../../../docs_src/dependencies/tutorial001_02_an_py310.py!}
```
=== "Python 3.9+" ```Python hl_lines="14 18 23"
{!> ../../../docs_src/dependencies/tutorial001_02_an_py39.py!}
```
////
```Python hl_lines="14 18 23" //// tab | Python 3.8+
{!> ../../../docs_src/dependencies/tutorial001_02_an_py39.py!}
``` ```Python hl_lines="15 19 24"
{!> ../../../docs_src/dependencies/tutorial001_02_an.py!}
```
=== "Python 3.8+" ////
```Python hl_lines="15 19 24" /// tip | "Tipp"
{!> ../../../docs_src/dependencies/tutorial001_02_an.py!}
```
!!! tip "Tipp" Das ist schlicht Standard-Python, es wird als โ€žTypaliasโ€œ bezeichnet und ist eigentlich nicht **FastAPI**-spezifisch.
Das ist schlicht Standard-Python, es wird als โ€žTypaliasโ€œ bezeichnet und ist eigentlich nicht **FastAPI**-spezifisch.
Da **FastAPI** jedoch auf Standard-Python, einschlieรŸlich `Annotated`, basiert, kรถnnen Sie diesen Trick in Ihrem Code verwenden. ๐Ÿ˜Ž Da **FastAPI** jedoch auf Standard-Python, einschlieรŸlich `Annotated`, basiert, kรถnnen Sie diesen Trick in Ihrem Code verwenden. ๐Ÿ˜Ž
///
Die Abhรคngigkeiten funktionieren weiterhin wie erwartet, und das **Beste daran** ist, dass die **Typinformationen erhalten bleiben**, was bedeutet, dass Ihr Editor Ihnen weiterhin **automatische Vervollstรคndigung**, **Inline-Fehler**, usw. bieten kann. Das Gleiche gilt fรผr andere Tools wie `mypy`. Die Abhรคngigkeiten funktionieren weiterhin wie erwartet, und das **Beste daran** ist, dass die **Typinformationen erhalten bleiben**, was bedeutet, dass Ihr Editor Ihnen weiterhin **automatische Vervollstรคndigung**, **Inline-Fehler**, usw. bieten kann. Das Gleiche gilt fรผr andere Tools wie `mypy`.
@ -255,8 +321,11 @@ Und Sie kรถnnen Abhรคngigkeiten mit `async def` innerhalb normaler `def`-*Pfadop
Es spielt keine Rolle. **FastAPI** weiรŸ, was zu tun ist. Es spielt keine Rolle. **FastAPI** weiรŸ, was zu tun ist.
!!! note "Hinweis" /// note | "Hinweis"
Wenn Ihnen das nichts sagt, lesen Sie den [Async: *โ€žIn Eile?โ€œ*](../../async.md#in-eile){.internal-link target=_blank}-Abschnitt รผber `async` und `await` in der Dokumentation.
Wenn Ihnen das nichts sagt, lesen Sie den [Async: *โ€žIn Eile?โ€œ*](../../async.md#in-eile){.internal-link target=_blank}-Abschnitt รผber `async` und `await` in der Dokumentation.
///
## Integriert in OpenAPI ## Integriert in OpenAPI

243
docs/de/docs/tutorial/dependencies/sub-dependencies.md

@ -10,41 +10,57 @@ Diese kรถnnen so **tief** verschachtelt sein, wie nรถtig.
Sie kรถnnten eine erste Abhรคngigkeit (โ€žDependableโ€œ) wie folgt erstellen: Sie kรถnnten eine erste Abhรคngigkeit (โ€žDependableโ€œ) wie folgt erstellen:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="8-9" ```Python hl_lines="8-9"
{!> ../../../docs_src/dependencies/tutorial005_an_py310.py!} {!> ../../../docs_src/dependencies/tutorial005_an_py310.py!}
``` ```
////
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="8-9"
{!> ../../../docs_src/dependencies/tutorial005_an_py39.py!}
```
```Python hl_lines="8-9" ////
{!> ../../../docs_src/dependencies/tutorial005_an_py39.py!}
``` //// tab | Python 3.8+
```Python hl_lines="9-10"
{!> ../../../docs_src/dependencies/tutorial005_an.py!}
```
=== "Python 3.8+" ////
//// tab | Python 3.10 nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="6-7"
{!> ../../../docs_src/dependencies/tutorial005_py310.py!}
```
```Python hl_lines="9-10" ////
{!> ../../../docs_src/dependencies/tutorial005_an.py!}
```
=== "Python 3.10 nicht annotiert" //// tab | Python 3.8 nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="6-7" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/dependencies/tutorial005_py310.py!}
```
=== "Python 3.8 nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="8-9"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/dependencies/tutorial005.py!}
```
```Python hl_lines="8-9" ////
{!> ../../../docs_src/dependencies/tutorial005.py!}
```
Diese deklariert einen optionalen Abfrageparameter `q` vom Typ `str` und gibt ihn dann einfach zurรผck. Diese deklariert einen optionalen Abfrageparameter `q` vom Typ `str` und gibt ihn dann einfach zurรผck.
@ -54,41 +70,57 @@ Das ist recht einfach (nicht sehr nรผtzlich), hilft uns aber dabei, uns auf die
Dann kรถnnen Sie eine weitere Abhรคngigkeitsfunktion (ein โ€žDependableโ€œ) erstellen, die gleichzeitig eine eigene Abhรคngigkeit deklariert (also auch ein โ€žDependantโ€œ ist): Dann kรถnnen Sie eine weitere Abhรคngigkeitsfunktion (ein โ€žDependableโ€œ) erstellen, die gleichzeitig eine eigene Abhรคngigkeit deklariert (also auch ein โ€žDependantโ€œ ist):
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="13"
{!> ../../../docs_src/dependencies/tutorial005_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="13"
{!> ../../../docs_src/dependencies/tutorial005_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="14"
{!> ../../../docs_src/dependencies/tutorial005_an.py!}
```
////
//// tab | Python 3.10 nicht annotiert
```Python hl_lines="13" /// tip | "Tipp"
{!> ../../../docs_src/dependencies/tutorial005_an_py310.py!}
```
=== "Python 3.9+" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="13" ///
{!> ../../../docs_src/dependencies/tutorial005_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="11"
{!> ../../../docs_src/dependencies/tutorial005_py310.py!}
```
```Python hl_lines="14" ////
{!> ../../../docs_src/dependencies/tutorial005_an.py!}
```
=== "Python 3.10 nicht annotiert" //// tab | Python 3.8 nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="11" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/dependencies/tutorial005_py310.py!}
```
=== "Python 3.8 nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="13"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/dependencies/tutorial005.py!}
```
```Python hl_lines="13" ////
{!> ../../../docs_src/dependencies/tutorial005.py!}
```
Betrachten wir die deklarierten Parameter: Betrachten wir die deklarierten Parameter:
@ -101,46 +133,65 @@ Betrachten wir die deklarierten Parameter:
Diese Abhรคngigkeit verwenden wir nun wie folgt: Diese Abhรคngigkeit verwenden wir nun wie folgt:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="23"
{!> ../../../docs_src/dependencies/tutorial005_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="23"
{!> ../../../docs_src/dependencies/tutorial005_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="24"
{!> ../../../docs_src/dependencies/tutorial005_an.py!}
```
////
```Python hl_lines="23" //// tab | Python 3.10 nicht annotiert
{!> ../../../docs_src/dependencies/tutorial005_an_py310.py!}
```
=== "Python 3.9+" /// tip | "Tipp"
```Python hl_lines="23" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/dependencies/tutorial005_an_py39.py!}
```
=== "Python 3.8+" ///
```Python hl_lines="24" ```Python hl_lines="19"
{!> ../../../docs_src/dependencies/tutorial005_an.py!} {!> ../../../docs_src/dependencies/tutorial005_py310.py!}
``` ```
////
=== "Python 3.10 nicht annotiert" //// tab | Python 3.8 nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="19" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/dependencies/tutorial005_py310.py!}
```
=== "Python 3.8 nicht annotiert" ///
```Python hl_lines="22"
{!> ../../../docs_src/dependencies/tutorial005.py!}
```
!!! tip "Tipp" ////
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="22" /// info
{!> ../../../docs_src/dependencies/tutorial005.py!}
```
!!! info Beachten Sie, dass wir in der *Pfadoperation-Funktion* nur eine einzige Abhรคngigkeit deklarieren, den `query_or_cookie_extractor`.
Beachten Sie, dass wir in der *Pfadoperation-Funktion* nur eine einzige Abhรคngigkeit deklarieren, den `query_or_cookie_extractor`.
Aber **FastAPI** wird wissen, dass es zuerst `query_extractor` auflรถsen muss, um dessen Resultat `query_or_cookie_extractor` zu รผbergeben, wenn dieses aufgerufen wird. Aber **FastAPI** wird wissen, dass es zuerst `query_extractor` auflรถsen muss, um dessen Resultat `query_or_cookie_extractor` zu รผbergeben, wenn dieses aufgerufen wird.
///
```mermaid ```mermaid
graph TB graph TB
@ -161,22 +212,29 @@ Und es speichert den zurรผckgegebenen Wert in einem <abbr title="Mechanismus, de
In einem fortgeschrittenen Szenario, bei dem Sie wissen, dass die Abhรคngigkeit bei jedem Schritt (mรถglicherweise mehrmals) in derselben Anfrage aufgerufen werden muss, anstatt den zwischengespeicherten Wert zu verwenden, kรถnnen Sie den Parameter `use_cache=False` festlegen, wenn Sie `Depends` verwenden: In einem fortgeschrittenen Szenario, bei dem Sie wissen, dass die Abhรคngigkeit bei jedem Schritt (mรถglicherweise mehrmals) in derselben Anfrage aufgerufen werden muss, anstatt den zwischengespeicherten Wert zu verwenden, kรถnnen Sie den Parameter `use_cache=False` festlegen, wenn Sie `Depends` verwenden:
=== "Python 3.8+" //// tab | Python 3.8+
```Python hl_lines="1"
async def needy_dependency(fresh_value: Annotated[str, Depends(get_value, use_cache=False)]):
return {"fresh_value": fresh_value}
```
```Python hl_lines="1" ////
async def needy_dependency(fresh_value: Annotated[str, Depends(get_value, use_cache=False)]):
return {"fresh_value": fresh_value}
```
=== "Python 3.8+ nicht annotiert" //// tab | Python 3.8+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="1" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
async def needy_dependency(fresh_value: str = Depends(get_value, use_cache=False)):
return {"fresh_value": fresh_value} ///
```
```Python hl_lines="1"
async def needy_dependency(fresh_value: str = Depends(get_value, use_cache=False)):
return {"fresh_value": fresh_value}
```
////
## Zusammenfassung ## Zusammenfassung
@ -186,9 +244,12 @@ Einfach Funktionen, die genauso aussehen wie *Pfadoperation-Funktionen*.
Dennoch ist es sehr mรคchtig und ermรถglicht Ihnen die Deklaration beliebig tief verschachtelter Abhรคngigkeits-โ€žGraphenโ€œ (Bรคume). Dennoch ist es sehr mรคchtig und ermรถglicht Ihnen die Deklaration beliebig tief verschachtelter Abhรคngigkeits-โ€žGraphenโ€œ (Bรคume).
!!! tip "Tipp" /// tip | "Tipp"
All dies scheint angesichts dieser einfachen Beispiele mรถglicherweise nicht so nรผtzlich zu sein.
All dies scheint angesichts dieser einfachen Beispiele mรถglicherweise nicht so nรผtzlich zu sein.
Aber Sie werden in den Kapiteln รผber **Sicherheit** sehen, wie nรผtzlich das ist.
Aber Sie werden in den Kapiteln รผber **Sicherheit** sehen, wie nรผtzlich das ist. Und Sie werden auch sehen, wie viel Code Sie dadurch einsparen.
Und Sie werden auch sehen, wie viel Code Sie dadurch einsparen. ///

27
docs/de/docs/tutorial/encoder.md

@ -20,17 +20,21 @@ Sie kรถnnen fรผr diese Fรคlle `jsonable_encoder` verwenden.
Es nimmt ein Objekt entgegen, wie etwa ein Pydantic-Modell, und gibt eine JSON-kompatible Version zurรผck: Es nimmt ein Objekt entgegen, wie etwa ein Pydantic-Modell, und gibt eine JSON-kompatible Version zurรผck:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="4 21" ```Python hl_lines="4 21"
{!> ../../../docs_src/encoder/tutorial001_py310.py!} {!> ../../../docs_src/encoder/tutorial001_py310.py!}
``` ```
=== "Python 3.8+" ////
```Python hl_lines="5 22" //// tab | Python 3.8+
{!> ../../../docs_src/encoder/tutorial001.py!}
``` ```Python hl_lines="5 22"
{!> ../../../docs_src/encoder/tutorial001.py!}
```
////
In diesem Beispiel wird das Pydantic-Modell in ein `dict`, und das `datetime`-Objekt in ein `str` konvertiert. In diesem Beispiel wird das Pydantic-Modell in ein `dict`, und das `datetime`-Objekt in ein `str` konvertiert.
@ -38,5 +42,8 @@ Das Resultat dieses Aufrufs ist etwas, das mit Pythons Standard-<a href="https:/
Es wird also kein groรŸer `str` zurรผckgegeben, der die Daten im JSON-Format (als String) enthรคlt. Es wird eine Python-Standarddatenstruktur (z. B. ein `dict`) zurรผckgegeben, mit Werten und Unterwerten, die alle mit JSON kompatibel sind. Es wird also kein groรŸer `str` zurรผckgegeben, der die Daten im JSON-Format (als String) enthรคlt. Es wird eine Python-Standarddatenstruktur (z. B. ein `dict`) zurรผckgegeben, mit Werten und Unterwerten, die alle mit JSON kompatibel sind.
!!! note "Hinweis" /// note | "Hinweis"
`jsonable_encoder` wird tatsรคchlich von **FastAPI** intern verwendet, um Daten zu konvertieren. Aber es ist in vielen anderen Szenarien hilfreich.
`jsonable_encoder` wird tatsรคchlich von **FastAPI** intern verwendet, um Daten zu konvertieren. Aber es ist in vielen anderen Szenarien hilfreich.
///

128
docs/de/docs/tutorial/extra-data-types.md

@ -55,76 +55,108 @@ Hier sind einige der zusรคtzlichen Datentypen, die Sie verwenden kรถnnen:
Hier ist ein Beispiel fรผr eine *Pfadoperation* mit Parametern, die einige der oben genannten Typen verwenden. Hier ist ein Beispiel fรผr eine *Pfadoperation* mit Parametern, die einige der oben genannten Typen verwenden.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="1 3 12-16" ```Python hl_lines="1 3 12-16"
{!> ../../../docs_src/extra_data_types/tutorial001_an_py310.py!} {!> ../../../docs_src/extra_data_types/tutorial001_an_py310.py!}
``` ```
=== "Python 3.9+" ////
```Python hl_lines="1 3 12-16" //// tab | Python 3.9+
{!> ../../../docs_src/extra_data_types/tutorial001_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="1 3 12-16"
{!> ../../../docs_src/extra_data_types/tutorial001_an_py39.py!}
```
```Python hl_lines="1 3 13-17" ////
{!> ../../../docs_src/extra_data_types/tutorial001_an.py!}
```
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.8+
!!! tip ```Python hl_lines="1 3 13-17"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/extra_data_types/tutorial001_an.py!}
```
```Python hl_lines="1 2 11-15" ////
{!> ../../../docs_src/extra_data_types/tutorial001_py310.py!}
```
=== "Python 3.8+ nicht annotiert" //// tab | Python 3.10+ nicht annotiert
!!! tip /// tip
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="1 2 12-16" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/extra_data_types/tutorial001.py!}
``` ///
```Python hl_lines="1 2 11-15"
{!> ../../../docs_src/extra_data_types/tutorial001_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="1 2 12-16"
{!> ../../../docs_src/extra_data_types/tutorial001.py!}
```
////
Beachten Sie, dass die Parameter innerhalb der Funktion ihren natรผrlichen Datentyp haben und Sie beispielsweise normale Datumsmanipulationen durchfรผhren kรถnnen, wie zum Beispiel: Beachten Sie, dass die Parameter innerhalb der Funktion ihren natรผrlichen Datentyp haben und Sie beispielsweise normale Datumsmanipulationen durchfรผhren kรถnnen, wie zum Beispiel:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="18-19"
{!> ../../../docs_src/extra_data_types/tutorial001_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="18-19"
{!> ../../../docs_src/extra_data_types/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="19-20"
{!> ../../../docs_src/extra_data_types/tutorial001_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
```Python hl_lines="18-19" /// tip
{!> ../../../docs_src/extra_data_types/tutorial001_an_py310.py!}
```
=== "Python 3.9+" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="18-19" ///
{!> ../../../docs_src/extra_data_types/tutorial001_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="17-18"
{!> ../../../docs_src/extra_data_types/tutorial001_py310.py!}
```
```Python hl_lines="19-20" ////
{!> ../../../docs_src/extra_data_types/tutorial001_an.py!}
```
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.8+ nicht annotiert
!!! tip /// tip
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="17-18" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/extra_data_types/tutorial001_py310.py!}
```
=== "Python 3.8+ nicht annotiert" ///
!!! tip ```Python hl_lines="18-19"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/extra_data_types/tutorial001.py!}
```
```Python hl_lines="18-19" ////
{!> ../../../docs_src/extra_data_types/tutorial001.py!}
```

132
docs/de/docs/tutorial/extra-models.md

@ -8,31 +8,41 @@ Insbesondere Benutzermodelle, denn:
* Das **herausgehende Modell** sollte kein Passwort haben. * Das **herausgehende Modell** sollte kein Passwort haben.
* Das **Datenbankmodell** sollte wahrscheinlich ein <abbr title='Ein aus scheinbar zufรคlligen Zeichen bestehender โ€žFingerabdruckโ€œ eines Textes. Der Inhalt des Textes kann nicht eingesehen werden.'>gehashtes</abbr> Passwort haben. * Das **Datenbankmodell** sollte wahrscheinlich ein <abbr title='Ein aus scheinbar zufรคlligen Zeichen bestehender โ€žFingerabdruckโ€œ eines Textes. Der Inhalt des Textes kann nicht eingesehen werden.'>gehashtes</abbr> Passwort haben.
!!! danger "Gefahr" /// danger | "Gefahr"
Speichern Sie niemals das Klartext-Passwort eines Benutzers. Speichern Sie immer den โ€žsicheren Hashโ€œ, den Sie verifizieren kรถnnen.
Falls Ihnen das nichts sagt, in den [Sicherheits-Kapiteln](security/simple-oauth2.md#passwort-hashing){.internal-link target=_blank} werden Sie lernen, was ein โ€žPasswort-Hashโ€œ ist. Speichern Sie niemals das Klartext-Passwort eines Benutzers. Speichern Sie immer den โ€žsicheren Hashโ€œ, den Sie verifizieren kรถnnen.
Falls Ihnen das nichts sagt, in den [Sicherheits-Kapiteln](security/simple-oauth2.md#passwort-hashing){.internal-link target=_blank} werden Sie lernen, was ein โ€žPasswort-Hashโ€œ ist.
///
## Mehrere Modelle ## Mehrere Modelle
Hier der generelle Weg, wie die Modelle mit ihren Passwort-Feldern aussehen kรถnnten, und an welchen Orten sie verwendet werden wรผrden. Hier der generelle Weg, wie die Modelle mit ihren Passwort-Feldern aussehen kรถnnten, und an welchen Orten sie verwendet werden wรผrden.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="7 9 14 20 22 27-28 31-33 38-39"
{!> ../../../docs_src/extra_models/tutorial001_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="9 11 16 22 24 29-30 33-35 40-41"
{!> ../../../docs_src/extra_models/tutorial001.py!}
```
```Python hl_lines="7 9 14 20 22 27-28 31-33 38-39" ////
{!> ../../../docs_src/extra_models/tutorial001_py310.py!}
```
=== "Python 3.8+" /// info
```Python hl_lines="9 11 16 22 24 29-30 33-35 40-41" In Pydantic v1 hieรŸ diese Methode `.dict()`, in Pydantic v2 wurde sie deprecated (aber immer noch unterstรผtzt) und in `.model_dump()` umbenannt.
{!> ../../../docs_src/extra_models/tutorial001.py!}
```
!!! info Die Beispiele hier verwenden `.dict()` fรผr die Kompatibilitรคt mit Pydantic v1, Sie sollten jedoch stattdessen `.model_dump()` verwenden, wenn Sie Pydantic v2 verwenden kรถnnen.
In Pydantic v1 hieรŸ diese Methode `.dict()`, in Pydantic v2 wurde sie deprecated (aber immer noch unterstรผtzt) und in `.model_dump()` umbenannt.
Die Beispiele hier verwenden `.dict()` fรผr die Kompatibilitรคt mit Pydantic v1, Sie sollten jedoch stattdessen `.model_dump()` verwenden, wenn Sie Pydantic v2 verwenden kรถnnen. ///
### รœber `**user_in.dict()` ### รœber `**user_in.dict()`
@ -144,8 +154,11 @@ UserInDB(
) )
``` ```
!!! warning "Achtung" /// warning | "Achtung"
Die Hilfsfunktionen `fake_password_hasher` und `fake_save_user` demonstrieren nur den mรถglichen Fluss der Daten und bieten natรผrlich keine echte Sicherheit.
Die Hilfsfunktionen `fake_password_hasher` und `fake_save_user` demonstrieren nur den mรถglichen Fluss der Daten und bieten natรผrlich keine echte Sicherheit.
///
## Verdopplung vermeiden ## Verdopplung vermeiden
@ -163,17 +176,21 @@ Die ganze Datenkonvertierung, -validierung, -dokumentation, usw. wird immer noch
Auf diese Weise beschreiben wir nur noch die Unterschiede zwischen den Modellen (mit Klartext-`password`, mit `hashed_password`, und ohne Passwort): Auf diese Weise beschreiben wir nur noch die Unterschiede zwischen den Modellen (mit Klartext-`password`, mit `hashed_password`, und ohne Passwort):
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="7 13-14 17-18 21-22" ```Python hl_lines="7 13-14 17-18 21-22"
{!> ../../../docs_src/extra_models/tutorial002_py310.py!} {!> ../../../docs_src/extra_models/tutorial002_py310.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="9 15-16 19-20 23-24"
{!> ../../../docs_src/extra_models/tutorial002.py!}
```
```Python hl_lines="9 15-16 19-20 23-24" ////
{!> ../../../docs_src/extra_models/tutorial002.py!}
```
## `Union`, oder `anyOf` ## `Union`, oder `anyOf`
@ -183,20 +200,27 @@ Das wird in OpenAPI mit `anyOf` angezeigt.
Um das zu tun, verwenden Sie Pythons Standard-Typhinweis <a href="https://docs.python.org/3/library/typing.html#typing.Union" class="external-link" target="_blank">`typing.Union`</a>: Um das zu tun, verwenden Sie Pythons Standard-Typhinweis <a href="https://docs.python.org/3/library/typing.html#typing.Union" class="external-link" target="_blank">`typing.Union`</a>:
!!! note "Hinweis" /// note | "Hinweis"
Listen Sie, wenn Sie eine <a href="https://pydantic-docs.helpmanual.io/usage/types/#unions" class="external-link" target="_blank">`Union`</a> definieren, denjenigen Typ zuerst, der am spezifischsten ist, gefolgt von den weniger spezifischen Typen. Im Beispiel oben, in `Union[PlaneItem, CarItem]` also den spezifischeren `PlaneItem` vor dem weniger spezifischen `CarItem`.
=== "Python 3.10+" Listen Sie, wenn Sie eine <a href="https://pydantic-docs.helpmanual.io/usage/types/#unions" class="external-link" target="_blank">`Union`</a> definieren, denjenigen Typ zuerst, der am spezifischsten ist, gefolgt von den weniger spezifischen Typen. Im Beispiel oben, in `Union[PlaneItem, CarItem]` also den spezifischeren `PlaneItem` vor dem weniger spezifischen `CarItem`.
```Python hl_lines="1 14-15 18-20 33" ///
{!> ../../../docs_src/extra_models/tutorial003_py310.py!}
```
=== "Python 3.8+" //// tab | Python 3.10+
```Python hl_lines="1 14-15 18-20 33" ```Python hl_lines="1 14-15 18-20 33"
{!> ../../../docs_src/extra_models/tutorial003.py!} {!> ../../../docs_src/extra_models/tutorial003_py310.py!}
``` ```
////
//// tab | Python 3.8+
```Python hl_lines="1 14-15 18-20 33"
{!> ../../../docs_src/extra_models/tutorial003.py!}
```
////
### `Union` in Python 3.10 ### `Union` in Python 3.10
@ -218,17 +242,21 @@ Genauso kรถnnen Sie eine Response deklarieren, die eine Liste von Objekten ist.
Verwenden Sie dafรผr Pythons Standard `typing.List` (oder nur `list` in Python 3.9 und darรผber): Verwenden Sie dafรผr Pythons Standard `typing.List` (oder nur `list` in Python 3.9 und darรผber):
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="18"
{!> ../../../docs_src/extra_models/tutorial004_py39.py!}
```
////
```Python hl_lines="18" //// tab | Python 3.8+
{!> ../../../docs_src/extra_models/tutorial004_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="1 20"
{!> ../../../docs_src/extra_models/tutorial004.py!}
```
```Python hl_lines="1 20" ////
{!> ../../../docs_src/extra_models/tutorial004.py!}
```
## Response mit beliebigem `dict` ## Response mit beliebigem `dict`
@ -238,17 +266,21 @@ Das ist nรผtzlich, wenn Sie die gรผltigen Feld-/Attribut-Namen von vorneherein n
In diesem Fall kรถnnen Sie `typing.Dict` verwenden (oder nur `dict` in Python 3.9 und darรผber): In diesem Fall kรถnnen Sie `typing.Dict` verwenden (oder nur `dict` in Python 3.9 und darรผber):
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="6" ```Python hl_lines="6"
{!> ../../../docs_src/extra_models/tutorial005_py39.py!} {!> ../../../docs_src/extra_models/tutorial005_py39.py!}
``` ```
=== "Python 3.8+" ////
//// tab | Python 3.8+
```Python hl_lines="1 8"
{!> ../../../docs_src/extra_models/tutorial005.py!}
```
```Python hl_lines="1 8" ////
{!> ../../../docs_src/extra_models/tutorial005.py!}
```
## Zusammenfassung ## Zusammenfassung

64
docs/de/docs/tutorial/first-steps.md

@ -24,12 +24,15 @@ $ uvicorn main:app --reload
</div> </div>
!!! note "Hinweis" /// note | "Hinweis"
Der Befehl `uvicorn main:app` bezieht sich auf:
* `main`: die Datei `main.py` (das sogenannte Python-โ€žModulโ€œ). Der Befehl `uvicorn main:app` bezieht sich auf:
* `app`: das Objekt, welches in der Datei `main.py` mit der Zeile `app = FastAPI()` erzeugt wurde.
* `--reload`: lรคsst den Server nach Codeรคnderungen neu starten. Verwenden Sie das nur wรคhrend der Entwicklung. * `main`: die Datei `main.py` (das sogenannte Python-โ€žModulโ€œ).
* `app`: das Objekt, welches in der Datei `main.py` mit der Zeile `app = FastAPI()` erzeugt wurde.
* `--reload`: lรคsst den Server nach Codeรคnderungen neu starten. Verwenden Sie das nur wรคhrend der Entwicklung.
///
In der Konsolenausgabe sollte es eine Zeile geben, die ungefรคhr so aussieht: In der Konsolenausgabe sollte es eine Zeile geben, die ungefรคhr so aussieht:
@ -136,10 +139,13 @@ Ebenfalls kรถnnen Sie es verwenden, um automatisch Code fรผr Clients zu generier
`FastAPI` ist eine Python-Klasse, die die gesamte Funktionalitรคt fรผr Ihre API bereitstellt. `FastAPI` ist eine Python-Klasse, die die gesamte Funktionalitรคt fรผr Ihre API bereitstellt.
!!! note "Technische Details" /// note | "Technische Details"
`FastAPI` ist eine Klasse, die direkt von `Starlette` erbt.
`FastAPI` ist eine Klasse, die direkt von `Starlette` erbt.
Sie kรถnnen alle <a href="https://www.starlette.io/" class="external-link" target="_blank">Starlette</a>-Funktionalitรคten auch mit `FastAPI` nutzen. Sie kรถnnen alle <a href="https://www.starlette.io/" class="external-link" target="_blank">Starlette</a>-Funktionalitรคten auch mit `FastAPI` nutzen.
///
### Schritt 2: Erzeugen einer `FastAPI`-โ€žInstanzโ€œ ### Schritt 2: Erzeugen einer `FastAPI`-โ€žInstanzโ€œ
@ -199,8 +205,11 @@ https://example.com/items/foo
/items/foo /items/foo
``` ```
!!! info /// info
Ein โ€žPfadโ€œ wird hรคufig auch als โ€žEndpunktโ€œ oder โ€žRouteโ€œ bezeichnet.
Ein โ€žPfadโ€œ wird hรคufig auch als โ€žEndpunktโ€œ oder โ€žRouteโ€œ bezeichnet.
///
Bei der Erstellung einer API ist der โ€žPfadโ€œ die wichtigste Mรถglichkeit zur Trennung von โ€žAnliegenโ€œ und โ€žRessourcenโ€œ. Bei der Erstellung einer API ist der โ€žPfadโ€œ die wichtigste Mรถglichkeit zur Trennung von โ€žAnliegenโ€œ und โ€žRessourcenโ€œ.
@ -250,16 +259,19 @@ Das `@app.get("/")` sagt **FastAPI**, dass die Funktion direkt darunter fรผr die
* den Pfad `/` * den Pfad `/`
* unter der Verwendung der <abbr title="eine HTTP GET Methode"><code>get</code>-Operation</abbr> gehen * unter der Verwendung der <abbr title="eine HTTP GET Methode"><code>get</code>-Operation</abbr> gehen
!!! info "`@decorator` Information" /// info | "`@decorator` Information"
Diese `@something`-Syntax wird in Python โ€žDekoratorโ€œ genannt.
Sie platzieren ihn รผber einer Funktion. Wie ein hรผbscher, dekorativer Hut (daher kommt wohl der Begriff). Diese `@something`-Syntax wird in Python โ€žDekoratorโ€œ genannt.
Ein โ€žDekoratorโ€œ nimmt die darunter stehende Funktion und macht etwas damit. Sie platzieren ihn รผber einer Funktion. Wie ein hรผbscher, dekorativer Hut (daher kommt wohl der Begriff).
In unserem Fall teilt dieser Dekorator **FastAPI** mit, dass die folgende Funktion mit dem **Pfad** `/` und der **Operation** `get` zusammenhรคngt. Ein โ€žDekoratorโ€œ nimmt die darunter stehende Funktion und macht etwas damit.
Dies ist der โ€ž**Pfadoperation-Dekorator**โ€œ. In unserem Fall teilt dieser Dekorator **FastAPI** mit, dass die folgende Funktion mit dem **Pfad** `/` und der **Operation** `get` zusammenhรคngt.
Dies ist der โ€ž**Pfadoperation-Dekorator**โ€œ.
///
Sie kรถnnen auch die anderen Operationen verwenden: Sie kรถnnen auch die anderen Operationen verwenden:
@ -274,14 +286,17 @@ Oder die exotischeren:
* `@app.patch()` * `@app.patch()`
* `@app.trace()` * `@app.trace()`
!!! tip "Tipp" /// tip | "Tipp"
Es steht Ihnen frei, jede Operation (HTTP-Methode) so zu verwenden, wie Sie es mรถchten.
Es steht Ihnen frei, jede Operation (HTTP-Methode) so zu verwenden, wie Sie es mรถchten.
**FastAPI** erzwingt keine bestimmte Bedeutung. **FastAPI** erzwingt keine bestimmte Bedeutung.
Die hier aufgefรผhrten Informationen dienen als Leitfaden und sind nicht verbindlich. Die hier aufgefรผhrten Informationen dienen als Leitfaden und sind nicht verbindlich.
Wenn Sie beispielsweise GraphQL verwenden, fรผhren Sie normalerweise alle Aktionen nur mit โ€žPOSTโ€œ-Operationen durch. Wenn Sie beispielsweise GraphQL verwenden, fรผhren Sie normalerweise alle Aktionen nur mit โ€žPOSTโ€œ-Operationen durch.
///
### Schritt 4: Definieren der **Pfadoperation-Funktion** ### Schritt 4: Definieren der **Pfadoperation-Funktion**
@ -309,8 +324,11 @@ Sie kรถnnten sie auch als normale Funktion anstelle von `async def` definieren:
{!../../../docs_src/first_steps/tutorial003.py!} {!../../../docs_src/first_steps/tutorial003.py!}
``` ```
!!! note "Hinweis" /// note | "Hinweis"
Wenn Sie den Unterschied nicht kennen, lesen Sie [Async: *โ€žIn Eile?โ€œ*](../async.md#in-eile){.internal-link target=_blank}.
Wenn Sie den Unterschied nicht kennen, lesen Sie [Async: *โ€žIn Eile?โ€œ*](../async.md#in-eile){.internal-link target=_blank}.
///
### Schritt 5: den Inhalt zurรผckgeben ### Schritt 5: den Inhalt zurรผckgeben

36
docs/de/docs/tutorial/handling-errors.md

@ -63,12 +63,15 @@ Aber wenn der Client `http://example.com/items/bar` anfragt (ein nicht-existiere
} }
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Wenn Sie eine `HTTPException` auslรถsen, kรถnnen Sie dem Parameter `detail` jeden Wert รผbergeben, der nach JSON konvertiert werden kann, nicht nur `str`.
Zum Beispiel ein `dict`, eine `list`, usw. Wenn Sie eine `HTTPException` auslรถsen, kรถnnen Sie dem Parameter `detail` jeden Wert รผbergeben, der nach JSON konvertiert werden kann, nicht nur `str`.
Das wird automatisch von **FastAPI** gehandhabt und der Wert nach JSON konvertiert. Zum Beispiel ein `dict`, eine `list`, usw.
Das wird automatisch von **FastAPI** gehandhabt und der Wert nach JSON konvertiert.
///
## Benutzerdefinierte Header hinzufรผgen ## Benutzerdefinierte Header hinzufรผgen
@ -106,10 +109,13 @@ Sie erhalten also einen sauberen Error mit einem Statuscode `418` und dem JSON-I
{"message": "Oops! yolo did something. There goes a rainbow..."} {"message": "Oops! yolo did something. There goes a rainbow..."}
``` ```
!!! note "Technische Details" /// note | "Technische Details"
Sie kรถnnen auch `from starlette.requests import Request` und `from starlette.responses import JSONResponse` verwenden.
Sie kรถnnen auch `from starlette.requests import Request` und `from starlette.responses import JSONResponse` verwenden.
**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit fรผr Sie, den Entwickler. Die meisten verfรผgbaren Responses kommen aber direkt von Starlette. Das Gleiche gilt fรผr `Request`.
**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit fรผr Sie, den Entwickler. Die meisten verfรผgbaren Responses kommen aber direkt von Starlette. Das Gleiche gilt fรผr `Request`. ///
## Die Default-Exceptionhandler รผberschreiben ## Die Default-Exceptionhandler รผberschreiben
@ -160,8 +166,11 @@ path -> item_id
#### `RequestValidationError` vs. `ValidationError` #### `RequestValidationError` vs. `ValidationError`
!!! warning "Achtung" /// warning | "Achtung"
Das folgende sind technische Details, die Sie รผberspringen kรถnnen, wenn sie fรผr Sie nicht wichtig sind.
Das folgende sind technische Details, die Sie รผberspringen kรถnnen, wenn sie fรผr Sie nicht wichtig sind.
///
`RequestValidationError` ist eine Unterklasse von Pydantics <a href="https://pydantic-docs.helpmanual.io/usage/models/#error-handling" class="external-link" target="_blank">`ValidationError`</a>. `RequestValidationError` ist eine Unterklasse von Pydantics <a href="https://pydantic-docs.helpmanual.io/usage/models/#error-handling" class="external-link" target="_blank">`ValidationError`</a>.
@ -183,10 +192,13 @@ Zum Beispiel kรถnnten Sie eine Klartext-Response statt JSON fรผr diese Fehler zu
{!../../../docs_src/handling_errors/tutorial004.py!} {!../../../docs_src/handling_errors/tutorial004.py!}
``` ```
!!! note "Technische Details" /// note | "Technische Details"
Sie kรถnnen auch `from starlette.responses import PlainTextResponse` verwenden.
Sie kรถnnen auch `from starlette.responses import PlainTextResponse` verwenden.
**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit fรผr Sie, den Entwickler. Die meisten verfรผgbaren Responses kommen aber direkt von Starlette.
**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit fรผr Sie, den Entwickler. Die meisten verfรผgbaren Responses kommen aber direkt von Starlette. ///
### Den `RequestValidationError`-Body verwenden ### Den `RequestValidationError`-Body verwenden

296
docs/de/docs/tutorial/header-params.md

@ -6,41 +6,57 @@ So wie `Query`-, `Path`-, und `Cookie`-Parameter kรถnnen Sie auch <abbr title='H
Importieren Sie zuerst `Header`: Importieren Sie zuerst `Header`:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="3" ```Python hl_lines="3"
{!> ../../../docs_src/header_params/tutorial001_an_py310.py!} {!> ../../../docs_src/header_params/tutorial001_an_py310.py!}
``` ```
////
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="3" ```Python hl_lines="3"
{!> ../../../docs_src/header_params/tutorial001_an_py39.py!} {!> ../../../docs_src/header_params/tutorial001_an_py39.py!}
``` ```
=== "Python 3.8+" ////
```Python hl_lines="3" //// tab | Python 3.8+
{!> ../../../docs_src/header_params/tutorial001_an.py!}
``` ```Python hl_lines="3"
{!> ../../../docs_src/header_params/tutorial001_an.py!}
```
=== "Python 3.10+ nicht annotiert" ////
!!! tip "Tipp" //// tab | Python 3.10+ nicht annotiert
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="1" /// tip | "Tipp"
{!> ../../../docs_src/header_params/tutorial001_py310.py!}
``` Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="1"
{!> ../../../docs_src/header_params/tutorial001_py310.py!}
```
=== "Python 3.8+ nicht annotiert" ////
!!! tip "Tipp" //// tab | Python 3.8+ nicht annotiert
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="3" /// tip | "Tipp"
{!> ../../../docs_src/header_params/tutorial001.py!}
``` Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="3"
{!> ../../../docs_src/header_params/tutorial001.py!}
```
////
## `Header`-Parameter deklarieren ## `Header`-Parameter deklarieren
@ -48,49 +64,71 @@ Dann deklarieren Sie Ihre Header-Parameter, auf die gleiche Weise, wie Sie auch
Der erste Wert ist der Typ. Sie kรถnnen `Header` die gehabten Extra Validierungs- und Beschreibungsparameter hinzufรผgen. Danach kรถnnen Sie einen Defaultwert vergeben: Der erste Wert ist der Typ. Sie kรถnnen `Header` die gehabten Extra Validierungs- und Beschreibungsparameter hinzufรผgen. Danach kรถnnen Sie einen Defaultwert vergeben:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="9" ```Python hl_lines="9"
{!> ../../../docs_src/header_params/tutorial001_an_py310.py!} {!> ../../../docs_src/header_params/tutorial001_an_py310.py!}
``` ```
=== "Python 3.9+" ////
```Python hl_lines="9" //// tab | Python 3.9+
{!> ../../../docs_src/header_params/tutorial001_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="9"
{!> ../../../docs_src/header_params/tutorial001_an_py39.py!}
```
```Python hl_lines="10" ////
{!> ../../../docs_src/header_params/tutorial001_an.py!}
```
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.8+
!!! tip "Tipp" ```Python hl_lines="10"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/header_params/tutorial001_an.py!}
```
```Python hl_lines="7" ////
{!> ../../../docs_src/header_params/tutorial001_py310.py!}
```
=== "Python 3.8+ nicht annotiert" //// tab | Python 3.10+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="9" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/header_params/tutorial001.py!}
```
!!! note "Technische Details" ///
`Header` ist eine Schwesterklasse von `Path`, `Query` und `Cookie`. Sie erbt von derselben gemeinsamen `Param`-Elternklasse.
Aber erinnern Sie sich, dass, wenn Sie `Query`, `Path`, `Header` und andere von `fastapi` importieren, diese tatsรคchlich Funktionen sind, welche spezielle Klassen zurรผckgeben. ```Python hl_lines="7"
{!> ../../../docs_src/header_params/tutorial001_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="9"
{!> ../../../docs_src/header_params/tutorial001.py!}
```
!!! info ////
Um Header zu deklarieren, mรผssen Sie `Header` verwenden, da diese Parameter sonst als Query-Parameter interpretiert werden wรผrden.
/// note | "Technische Details"
`Header` ist eine Schwesterklasse von `Path`, `Query` und `Cookie`. Sie erbt von derselben gemeinsamen `Param`-Elternklasse.
Aber erinnern Sie sich, dass, wenn Sie `Query`, `Path`, `Header` und andere von `fastapi` importieren, diese tatsรคchlich Funktionen sind, welche spezielle Klassen zurรผckgeben.
///
/// info
Um Header zu deklarieren, mรผssen Sie `Header` verwenden, da diese Parameter sonst als Query-Parameter interpretiert werden wรผrden.
///
## Automatische Konvertierung ## Automatische Konvertierung
@ -108,44 +146,63 @@ Sie kรถnnen also `user_agent` schreiben, wie Sie es normalerweise in Python-Code
Wenn Sie aus irgendeinem Grund das automatische Konvertieren von Unterstrichen zu Bindestrichen abschalten mรถchten, setzen Sie den Parameter `convert_underscores` auf `False`. Wenn Sie aus irgendeinem Grund das automatische Konvertieren von Unterstrichen zu Bindestrichen abschalten mรถchten, setzen Sie den Parameter `convert_underscores` auf `False`.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="10"
{!> ../../../docs_src/header_params/tutorial002_an_py310.py!}
```
////
```Python hl_lines="10" //// tab | Python 3.9+
{!> ../../../docs_src/header_params/tutorial002_an_py310.py!}
```
=== "Python 3.9+" ```Python hl_lines="11"
{!> ../../../docs_src/header_params/tutorial002_an_py39.py!}
```
```Python hl_lines="11" ////
{!> ../../../docs_src/header_params/tutorial002_an_py39.py!}
```
=== "Python 3.8+" //// tab | Python 3.8+
```Python hl_lines="12"
{!> ../../../docs_src/header_params/tutorial002_an.py!}
```
```Python hl_lines="12" ////
{!> ../../../docs_src/header_params/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="8"
{!> ../../../docs_src/header_params/tutorial002_py310.py!}
```
```Python hl_lines="8" ////
{!> ../../../docs_src/header_params/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.
```Python hl_lines="10" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/header_params/tutorial002.py!}
```
!!! warning "Achtung" ///
Bevor Sie `convert_underscores` auf `False` setzen, bedenken Sie, dass manche HTTP-Proxys und Server die Verwendung von Headern mit Unterstrichen nicht erlauben.
```Python hl_lines="10"
{!> ../../../docs_src/header_params/tutorial002.py!}
```
////
/// warning | "Achtung"
Bevor Sie `convert_underscores` auf `False` setzen, bedenken Sie, dass manche HTTP-Proxys und Server die Verwendung von Headern mit Unterstrichen nicht erlauben.
///
## Doppelte Header ## Doppelte Header
@ -157,50 +214,71 @@ Sie erhalten dann alle Werte von diesem doppelten Header als Python-`list`e.
Um zum Beispiel einen Header `X-Token` zu deklarieren, der mehrmals vorkommen kann, schreiben Sie: Um zum Beispiel einen Header `X-Token` zu deklarieren, der mehrmals vorkommen kann, schreiben Sie:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="9" ```Python hl_lines="9"
{!> ../../../docs_src/header_params/tutorial003_an_py310.py!} {!> ../../../docs_src/header_params/tutorial003_an_py310.py!}
``` ```
=== "Python 3.9+" ////
```Python hl_lines="9" //// tab | Python 3.9+
{!> ../../../docs_src/header_params/tutorial003_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="9"
{!> ../../../docs_src/header_params/tutorial003_an_py39.py!}
```
```Python hl_lines="10" ////
{!> ../../../docs_src/header_params/tutorial003_an.py!}
```
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.8+
!!! tip "Tipp" ```Python hl_lines="10"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/header_params/tutorial003_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="7"
{!> ../../../docs_src/header_params/tutorial003_py310.py!}
```
```Python hl_lines="7" ////
{!> ../../../docs_src/header_params/tutorial003_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.
```Python hl_lines="9" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/header_params/tutorial003_py39.py!}
```
=== "Python 3.8+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="9"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/header_params/tutorial003_py39.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="9"
{!> ../../../docs_src/header_params/tutorial003.py!}
```
```Python hl_lines="9" ////
{!> ../../../docs_src/header_params/tutorial003.py!}
```
Wenn Sie mit einer *Pfadoperation* kommunizieren, die zwei HTTP-Header sendet, wie: Wenn Sie mit einer *Pfadoperation* kommunizieren, die zwei HTTP-Header sendet, wie:

25
docs/de/docs/tutorial/index.md

@ -52,22 +52,25 @@ $ pip install "fastapi[all]"
... das beinhaltet auch `uvicorn`, welchen Sie als Server verwenden kรถnnen, der ihren Code ausfรผhrt. ... das beinhaltet auch `uvicorn`, welchen Sie als Server verwenden kรถnnen, der ihren Code ausfรผhrt.
!!! note "Hinweis" /// note | "Hinweis"
Sie kรถnnen die einzelnen Teile auch separat installieren.
Das folgende wรผrden Sie wahrscheinlich tun, wenn Sie Ihre Anwendung in der Produktion einsetzen: Sie kรถnnen die einzelnen Teile auch separat installieren.
``` Das folgende wรผrden Sie wahrscheinlich tun, wenn Sie Ihre Anwendung in der Produktion einsetzen:
pip install fastapi
```
Installieren Sie auch `uvicorn` als Server: ```
pip install fastapi
```
Installieren Sie auch `uvicorn` als Server:
```
pip install "uvicorn[standard]"
```
``` Das gleiche gilt fรผr jede der optionalen Abhรคngigkeiten, die Sie verwenden mรถchten.
pip install "uvicorn[standard]"
```
Das gleiche gilt fรผr jede der optionalen Abhรคngigkeiten, die Sie verwenden mรถchten. ///
## Handbuch fรผr fortgeschrittene Benutzer ## Handbuch fรผr fortgeschrittene Benutzer

21
docs/de/docs/tutorial/metadata.md

@ -22,8 +22,11 @@ Sie kรถnnen diese wie folgt setzen:
{!../../../docs_src/metadata/tutorial001.py!} {!../../../docs_src/metadata/tutorial001.py!}
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Sie kรถnnen Markdown in das Feld `description` schreiben und es wird in der Ausgabe gerendert.
Sie kรถnnen Markdown in das Feld `description` schreiben und es wird in der Ausgabe gerendert.
///
Mit dieser Konfiguration wรผrde die automatische API-Dokumentation wie folgt aussehen: Mit dieser Konfiguration wรผrde die automatische API-Dokumentation wie folgt aussehen:
@ -65,8 +68,11 @@ Erstellen Sie Metadaten fรผr Ihre Tags und รผbergeben Sie sie an den Parameter `
Beachten Sie, dass Sie Markdown in den Beschreibungen verwenden kรถnnen. Beispielsweise wird โ€žloginโ€œ in Fettschrift (**login**) und โ€žfancyโ€œ in Kursivschrift (_fancy_) angezeigt. Beachten Sie, dass Sie Markdown in den Beschreibungen verwenden kรถnnen. Beispielsweise wird โ€žloginโ€œ in Fettschrift (**login**) und โ€žfancyโ€œ in Kursivschrift (_fancy_) angezeigt.
!!! tip "Tipp" /// tip | "Tipp"
Sie mรผssen nicht fรผr alle von Ihnen verwendeten Tags Metadaten hinzufรผgen.
Sie mรผssen nicht fรผr alle von Ihnen verwendeten Tags Metadaten hinzufรผgen.
///
### Ihre Tags verwenden ### Ihre Tags verwenden
@ -76,8 +82,11 @@ Verwenden Sie den Parameter `tags` mit Ihren *Pfadoperationen* (und `APIRouter`n
{!../../../docs_src/metadata/tutorial004.py!} {!../../../docs_src/metadata/tutorial004.py!}
``` ```
!!! info /// info
Lesen Sie mehr zu Tags unter [Pfadoperation-Konfiguration](path-operation-configuration.md#tags){.internal-link target=_blank}.
Lesen Sie mehr zu Tags unter [Pfadoperation-Konfiguration](path-operation-configuration.md#tags){.internal-link target=_blank}.
///
### Die Dokumentation anschauen ### Die Dokumentation anschauen

27
docs/de/docs/tutorial/middleware.md

@ -11,10 +11,13 @@ Eine โ€žMiddlewareโ€œ ist eine Funktion, die mit jedem **Request** arbeitet, bev
* Sie kann etwas mit dieser **Response** tun oder beliebigen Code ausfรผhren. * Sie kann etwas mit dieser **Response** tun oder beliebigen Code ausfรผhren.
* Dann gibt sie die **Response** zurรผck. * Dann gibt sie die **Response** zurรผck.
!!! note "Technische Details" /// note | "Technische Details"
Wenn Sie Abhรคngigkeiten mit `yield` haben, wird der Exit-Code *nach* der Middleware ausgefรผhrt.
Wenn es Hintergrundaufgaben gab (spรคter dokumentiert), werden sie *nach* allen Middlewares ausgefรผhrt. Wenn Sie Abhรคngigkeiten mit `yield` haben, wird der Exit-Code *nach* der Middleware ausgefรผhrt.
Wenn es Hintergrundaufgaben gab (spรคter dokumentiert), werden sie *nach* allen Middlewares ausgefรผhrt.
///
## Erstellung einer Middleware ## Erstellung einer Middleware
@ -32,15 +35,21 @@ Die Middleware-Funktion erhรคlt:
{!../../../docs_src/middleware/tutorial001.py!} {!../../../docs_src/middleware/tutorial001.py!}
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Beachten Sie, dass benutzerdefinierte proprietรคre Header hinzugefรผgt werden kรถnnen. <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">Verwenden Sie dafรผr das Prรคfix 'X-'</a>.
Beachten Sie, dass benutzerdefinierte proprietรคre Header hinzugefรผgt werden kรถnnen. <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">Verwenden Sie dafรผr das Prรคfix 'X-'</a>.
Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen soll, mรผssen Sie sie zu Ihrer CORS-Konfigurationen ([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank}) hinzufรผgen, indem Sie den Parameter `expose_headers` verwenden, der in der <a href="https://www.starlette.io/middleware/#corsmiddleware" class="external-link" target="_blank">Starlette-CORS-Dokumentation</a> dokumentiert ist.
///
/// note | "Technische Details"
Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen soll, mรผssen Sie sie zu Ihrer CORS-Konfigurationen ([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank}) hinzufรผgen, indem Sie den Parameter `expose_headers` verwenden, der in der <a href="https://www.starlette.io/middleware/#corsmiddleware" class="external-link" target="_blank">Starlette-CORS-Dokumentation</a> dokumentiert ist. Sie kรถnnten auch `from starlette.requests import Request` verwenden.
!!! note "Technische Details" **FastAPI** bietet es als Komfort fรผr Sie, den Entwickler, an. Aber es stammt direkt von Starlette.
Sie kรถnnten auch `from starlette.requests import Request` verwenden.
**FastAPI** bietet es als Komfort fรผr Sie, den Entwickler, an. Aber es stammt direkt von Starlette. ///
### Vor und nach der `response` ### Vor und nach der `response`

182
docs/de/docs/tutorial/path-operation-configuration.md

@ -2,8 +2,11 @@
Es gibt mehrere Konfigurations-Parameter, die Sie Ihrem *Pfadoperation-Dekorator* รผbergeben kรถnnen. Es gibt mehrere Konfigurations-Parameter, die Sie Ihrem *Pfadoperation-Dekorator* รผbergeben kรถnnen.
!!! warning "Achtung" /// warning | "Achtung"
Beachten Sie, dass diese Parameter direkt dem *Pfadoperation-Dekorator* รผbergeben werden, nicht der *Pfadoperation-Funktion*.
Beachten Sie, dass diese Parameter direkt dem *Pfadoperation-Dekorator* รผbergeben werden, nicht der *Pfadoperation-Funktion*.
///
## Response-Statuscode ## Response-Statuscode
@ -13,52 +16,67 @@ Sie kรถnnen direkt den `int`-Code รผbergeben, etwa `404`.
Aber falls Sie sich nicht mehr erinnern, wofรผr jede Nummer steht, kรถnnen Sie die Abkรผrzungs-Konstanten in `status` verwenden: Aber falls Sie sich nicht mehr erinnern, wofรผr jede Nummer steht, kรถnnen Sie die Abkรผrzungs-Konstanten in `status` verwenden:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="1 15"
{!> ../../../docs_src/path_operation_configuration/tutorial001_py310.py!}
```
////
```Python hl_lines="1 15" //// tab | Python 3.9+
{!> ../../../docs_src/path_operation_configuration/tutorial001_py310.py!}
```
=== "Python 3.9+" ```Python hl_lines="3 17"
{!> ../../../docs_src/path_operation_configuration/tutorial001_py39.py!}
```
////
```Python hl_lines="3 17" //// tab | Python 3.8+
{!> ../../../docs_src/path_operation_configuration/tutorial001_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="3 17"
{!> ../../../docs_src/path_operation_configuration/tutorial001.py!}
```
```Python hl_lines="3 17" ////
{!> ../../../docs_src/path_operation_configuration/tutorial001.py!}
```
Dieser Statuscode wird in der Response verwendet und zum OpenAPI-Schema hinzugefรผgt. Dieser Statuscode wird in der Response verwendet und zum OpenAPI-Schema hinzugefรผgt.
!!! note "Technische Details" /// note | "Technische Details"
Sie kรถnnen auch `from starlette import status` verwenden.
Sie kรถnnen auch `from starlette import status` verwenden.
**FastAPI** bietet dieselben `starlette.status`-Codes auch via `fastapi.status` an, als Annehmlichkeit fรผr Sie, den Entwickler. Sie kommen aber direkt von Starlette.
**FastAPI** bietet dieselben `starlette.status`-Codes auch via `fastapi.status` an, als Annehmlichkeit fรผr Sie, den Entwickler. Sie kommen aber direkt von Starlette. ///
## Tags ## Tags
Sie kรถnnen Ihrer *Pfadoperation* Tags hinzufรผgen, mittels des Parameters `tags`, dem eine `list`e von `str`s รผbergeben wird (in der Regel nur ein `str`): Sie kรถnnen Ihrer *Pfadoperation* Tags hinzufรผgen, mittels des Parameters `tags`, dem eine `list`e von `str`s รผbergeben wird (in der Regel nur ein `str`):
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="15 20 25" ```Python hl_lines="15 20 25"
{!> ../../../docs_src/path_operation_configuration/tutorial002_py310.py!} {!> ../../../docs_src/path_operation_configuration/tutorial002_py310.py!}
``` ```
////
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="17 22 27" ```Python hl_lines="17 22 27"
{!> ../../../docs_src/path_operation_configuration/tutorial002_py39.py!} {!> ../../../docs_src/path_operation_configuration/tutorial002_py39.py!}
``` ```
=== "Python 3.8+" ////
```Python hl_lines="17 22 27" //// tab | Python 3.8+
{!> ../../../docs_src/path_operation_configuration/tutorial002.py!}
``` ```Python hl_lines="17 22 27"
{!> ../../../docs_src/path_operation_configuration/tutorial002.py!}
```
////
Diese werden zum OpenAPI-Schema hinzugefรผgt und von den automatischen Dokumentations-Benutzeroberflรคchen verwendet: Diese werden zum OpenAPI-Schema hinzugefรผgt und von den automatischen Dokumentations-Benutzeroberflรคchen verwendet:
@ -80,23 +98,29 @@ In diesem Fall macht es Sinn, die Tags in einem `Enum` zu speichern.
Sie kรถnnen eine Zusammenfassung (`summary`) und eine Beschreibung (`description`) hinzufรผgen: Sie kรถnnen eine Zusammenfassung (`summary`) und eine Beschreibung (`description`) hinzufรผgen:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="18-19"
{!> ../../../docs_src/path_operation_configuration/tutorial003_py310.py!}
```
////
```Python hl_lines="18-19" //// tab | Python 3.9+
{!> ../../../docs_src/path_operation_configuration/tutorial003_py310.py!}
```
=== "Python 3.9+" ```Python hl_lines="20-21"
{!> ../../../docs_src/path_operation_configuration/tutorial003_py39.py!}
```
////
```Python hl_lines="20-21" //// tab | Python 3.8+
{!> ../../../docs_src/path_operation_configuration/tutorial003_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="20-21"
{!> ../../../docs_src/path_operation_configuration/tutorial003.py!}
```
```Python hl_lines="20-21" ////
{!> ../../../docs_src/path_operation_configuration/tutorial003.py!}
```
## Beschreibung mittels Docstring ## Beschreibung mittels Docstring
@ -104,23 +128,29 @@ Da Beschreibungen oft mehrere Zeilen lang sind, kรถnnen Sie die Beschreibung der
Sie kรถnnen im Docstring <a href="https://en.wikipedia.org/wiki/Markdown" class="external-link" target="_blank">Markdown</a> schreiben, es wird korrekt interpretiert und angezeigt (die Einrรผckung des Docstring beachtend). Sie kรถnnen im Docstring <a href="https://en.wikipedia.org/wiki/Markdown" class="external-link" target="_blank">Markdown</a> schreiben, es wird korrekt interpretiert und angezeigt (die Einrรผckung des Docstring beachtend).
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="17-25"
{!> ../../../docs_src/path_operation_configuration/tutorial004_py310.py!}
```
////
```Python hl_lines="17-25" //// tab | Python 3.9+
{!> ../../../docs_src/path_operation_configuration/tutorial004_py310.py!}
```
=== "Python 3.9+" ```Python hl_lines="19-27"
{!> ../../../docs_src/path_operation_configuration/tutorial004_py39.py!}
```
```Python hl_lines="19-27" ////
{!> ../../../docs_src/path_operation_configuration/tutorial004_py39.py!}
```
=== "Python 3.8+" //// tab | Python 3.8+
```Python hl_lines="19-27" ```Python hl_lines="19-27"
{!> ../../../docs_src/path_operation_configuration/tutorial004.py!} {!> ../../../docs_src/path_operation_configuration/tutorial004.py!}
``` ```
////
In der interaktiven Dokumentation sieht das dann so aus: In der interaktiven Dokumentation sieht das dann so aus:
@ -130,31 +160,43 @@ In der interaktiven Dokumentation sieht das dann so aus:
Die Response kรถnnen Sie mit dem Parameter `response_description` beschreiben: Die Response kรถnnen Sie mit dem Parameter `response_description` beschreiben:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="19"
{!> ../../../docs_src/path_operation_configuration/tutorial005_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="21"
{!> ../../../docs_src/path_operation_configuration/tutorial005_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="21"
{!> ../../../docs_src/path_operation_configuration/tutorial005.py!}
```
```Python hl_lines="19" ////
{!> ../../../docs_src/path_operation_configuration/tutorial005_py310.py!}
```
=== "Python 3.9+" /// info
```Python hl_lines="21" beachten Sie, dass sich `response_description` speziell auf die Response bezieht, wรคhrend `description` sich generell auf die *Pfadoperation* bezieht.
{!> ../../../docs_src/path_operation_configuration/tutorial005_py39.py!}
```
=== "Python 3.8+" ///
```Python hl_lines="21" /// check
{!> ../../../docs_src/path_operation_configuration/tutorial005.py!}
```
!!! info OpenAPI verlangt, dass jede *Pfadoperation* รผber eine Beschreibung der Response verfรผgt.
beachten Sie, dass sich `response_description` speziell auf die Response bezieht, wรคhrend `description` sich generell auf die *Pfadoperation* bezieht.
!!! check Daher, wenn Sie keine vergeben, wird **FastAPI** automatisch eine fรผr โ€žErfolgreiche Responseโ€œ erstellen.
OpenAPI verlangt, dass jede *Pfadoperation* รผber eine Beschreibung der Response verfรผgt.
Daher, wenn Sie keine vergeben, wird **FastAPI** automatisch eine fรผr โ€žErfolgreiche Responseโ€œ erstellen. ///
<img src="/img/tutorial/path-operation-configuration/image03.png"> <img src="/img/tutorial/path-operation-configuration/image03.png">

356
docs/de/docs/tutorial/path-params-numeric-validations.md

@ -6,48 +6,67 @@ So wie Sie mit `Query` fรผr Query-Parameter zusรคtzliche Validierungen und Metad
Importieren Sie zuerst `Path` von `fastapi`, und importieren Sie `Annotated`. Importieren Sie zuerst `Path` von `fastapi`, und importieren Sie `Annotated`.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="1 3" ```Python hl_lines="1 3"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py!} {!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py!}
``` ```
////
//// tab | Python 3.9+
```Python hl_lines="1 3"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="3-4"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an.py!}
```
////
=== "Python 3.9+" //// tab | Python 3.10+ nicht annotiert
```Python hl_lines="1 3" /// tip | "Tipp"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py39.py!}
```
=== "Python 3.8+" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="3-4" ///
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an.py!}
```
=== "Python 3.10+ nicht annotiert" ```Python hl_lines="1"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
!!! tip "Tipp" ///
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="1" ```Python hl_lines="3"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_py310.py!} {!> ../../../docs_src/path_params_numeric_validations/tutorial001.py!}
``` ```
=== "Python 3.8+ nicht annotiert" ////
!!! tip "Tipp" /// info
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="3" FastAPI unterstรผtzt (und empfiehlt die Verwendung von) `Annotated` seit Version 0.95.0.
{!> ../../../docs_src/path_params_numeric_validations/tutorial001.py!}
```
!!! info Wenn Sie eine รคltere Version haben, werden Sie Fehler angezeigt bekommen, wenn Sie versuchen, `Annotated` zu verwenden.
FastAPI unterstรผtzt (und empfiehlt die Verwendung von) `Annotated` seit Version 0.95.0.
Wenn Sie eine รคltere Version haben, werden Sie Fehler angezeigt bekommen, wenn Sie versuchen, `Annotated` zu verwenden. Bitte [aktualisieren Sie FastAPI](../deployment/versions.md#upgrade-der-fastapi-versionen){.internal-link target=_blank} daher mindestens zu Version 0.95.1, bevor Sie `Annotated` verwenden.
Bitte [aktualisieren Sie FastAPI](../deployment/versions.md#upgrade-der-fastapi-versionen){.internal-link target=_blank} daher mindestens zu Version 0.95.1, bevor Sie `Annotated` verwenden. ///
## Metadaten deklarieren ## Metadaten deklarieren
@ -55,53 +74,75 @@ Sie kรถnnen die gleichen Parameter deklarieren wie fรผr `Query`.
Um zum Beispiel einen `title`-Metadaten-Wert fรผr den Pfad-Parameter `item_id` zu deklarieren, schreiben Sie: Um zum Beispiel einen `title`-Metadaten-Wert fรผr den Pfad-Parameter `item_id` zu deklarieren, schreiben Sie:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="10" ```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py!} {!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py!}
``` ```
=== "Python 3.9+" ////
```Python hl_lines="10" //// tab | Python 3.9+
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py39.py!}
```
```Python hl_lines="11" ////
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an.py!}
```
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.8+
!!! tip "Tipp" ```Python hl_lines="11"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/path_params_numeric_validations/tutorial001_an.py!}
```
```Python hl_lines="8" ////
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_py310.py!}
```
=== "Python 3.8+ nicht annotiert" //// tab | Python 3.10+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="10" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/path_params_numeric_validations/tutorial001.py!}
```
!!! note "Hinweis" ///
Ein Pfad-Parameter ist immer erforderlich, weil er Teil des Pfads sein muss.
Sie sollten ihn daher mit `...` deklarieren, um ihn als erforderlich auszuzeichnen. ```Python hl_lines="8"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_py310.py!}
```
Doch selbst wenn Sie ihn mit `None` deklarieren, oder einen Defaultwert setzen, bewirkt das nichts, er bleibt immer erforderlich. ////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001.py!}
```
////
/// note | "Hinweis"
Ein Pfad-Parameter ist immer erforderlich, weil er Teil des Pfads sein muss.
Sie sollten ihn daher mit `...` deklarieren, um ihn als erforderlich auszuzeichnen.
Doch selbst wenn Sie ihn mit `None` deklarieren, oder einen Defaultwert setzen, bewirkt das nichts, er bleibt immer erforderlich.
///
## Sortieren Sie die Parameter, wie Sie mรถchten ## Sortieren Sie die Parameter, wie Sie mรถchten
!!! tip "Tipp" /// tip | "Tipp"
Wenn Sie `Annotated` verwenden, ist das folgende nicht so wichtig / nicht notwendig.
Wenn Sie `Annotated` verwenden, ist das folgende nicht so wichtig / nicht notwendig.
///
Nehmen wir an, Sie mรถchten den Query-Parameter `q` als erforderlichen `str` deklarieren. Nehmen wir an, Sie mรถchten den Query-Parameter `q` als erforderlichen `str` deklarieren.
@ -117,33 +158,45 @@ Fรผr **FastAPI** ist es nicht wichtig. Es erkennt die Parameter anhand ihres Nam
Sie kรถnnen Ihre Funktion also so deklarieren: Sie kรถnnen Ihre Funktion also so deklarieren:
=== "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"
{!> ../../../docs_src/path_params_numeric_validations/tutorial002.py!}
```
```Python hl_lines="7" ////
{!> ../../../docs_src/path_params_numeric_validations/tutorial002.py!}
```
Aber bedenken Sie, dass Sie dieses Problem nicht haben, wenn Sie `Annotated` verwenden, da Sie nicht die Funktions-Parameter-Defaultwerte fรผr `Query()` oder `Path()` verwenden. Aber bedenken Sie, dass Sie dieses Problem nicht haben, wenn Sie `Annotated` verwenden, da Sie nicht die Funktions-Parameter-Defaultwerte fรผr `Query()` oder `Path()` verwenden.
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="10" ```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial002_an_py39.py!} {!> ../../../docs_src/path_params_numeric_validations/tutorial002_an_py39.py!}
``` ```
////
=== "Python 3.8+" //// tab | Python 3.8+
```Python hl_lines="9" ```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial002_an.py!} {!> ../../../docs_src/path_params_numeric_validations/tutorial002_an.py!}
``` ```
////
## Sortieren Sie die Parameter wie Sie mรถchten: Tricks ## Sortieren Sie die Parameter wie Sie mรถchten: Tricks
!!! tip "Tipp" /// tip | "Tipp"
Wenn Sie `Annotated` verwenden, ist das folgende nicht so wichtig / nicht notwendig.
Wenn Sie `Annotated` verwenden, ist das folgende nicht so wichtig / nicht notwendig.
///
Hier ein **kleiner Trick**, der nรผtzlich sein kann, aber Sie werden ihn nicht oft brauchen. Hier ein **kleiner Trick**, der nรผtzlich sein kann, aber Sie werden ihn nicht oft brauchen.
@ -168,43 +221,56 @@ Python macht nichts mit diesem `*`, aber es wird wissen, dass alle folgenden Par
Bedenken Sie, dass Sie, wenn Sie `Annotated` verwenden, dieses Problem nicht haben, weil Sie keine Defaultwerte fรผr Ihre Funktionsparameter haben. Sie mรผssen daher wahrscheinlich auch nicht `*` verwenden. Bedenken Sie, dass Sie, wenn Sie `Annotated` verwenden, dieses Problem nicht haben, weil Sie keine Defaultwerte fรผr Ihre Funktionsparameter haben. Sie mรผssen daher wahrscheinlich auch nicht `*` verwenden.
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial003_an_py39.py!}
```
```Python hl_lines="10" ////
{!> ../../../docs_src/path_params_numeric_validations/tutorial003_an_py39.py!}
```
=== "Python 3.8+" //// tab | Python 3.8+
```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial003_an.py!}
```
```Python hl_lines="9" ////
{!> ../../../docs_src/path_params_numeric_validations/tutorial003_an.py!}
```
## Validierung von Zahlen: GrรถรŸer oder gleich ## Validierung von Zahlen: GrรถรŸer oder gleich
Mit `Query` und `Path` (und anderen, die Sie spรคter kennenlernen), kรถnnen Sie Zahlenbeschrรคnkungen deklarieren. Mit `Query` und `Path` (und anderen, die Sie spรคter kennenlernen), kรถnnen Sie Zahlenbeschrรคnkungen deklarieren.
Hier, mit `ge=1`, wird festgelegt, dass `item_id` eine Ganzzahl benรถtigt, die grรถรŸer oder gleich `1` ist (`g`reater than or `e`qual). Hier, mit `ge=1`, wird festgelegt, dass `item_id` eine Ganzzahl benรถtigt, die grรถรŸer oder gleich `1` ist (`g`reater than or `e`qual).
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="10" ```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial004_an_py39.py!} {!> ../../../docs_src/path_params_numeric_validations/tutorial004_an_py39.py!}
``` ```
////
//// tab | Python 3.8+
```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial004_an.py!}
```
=== "Python 3.8+" ////
```Python hl_lines="9" //// tab | Python 3.8+ nicht annotiert
{!> ../../../docs_src/path_params_numeric_validations/tutorial004_an.py!}
```
=== "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" ///
{!> ../../../docs_src/path_params_numeric_validations/tutorial004.py!}
``` ```Python hl_lines="8"
{!> ../../../docs_src/path_params_numeric_validations/tutorial004.py!}
```
////
## Validierung von Zahlen: GrรถรŸer und kleiner oder gleich ## Validierung von Zahlen: GrรถรŸer und kleiner oder gleich
@ -213,26 +279,35 @@ Das Gleiche trifft zu auf:
* `gt`: `g`reater `t`han โ€“ grรถรŸer als * `gt`: `g`reater `t`han โ€“ grรถรŸer als
* `le`: `l`ess than or `e`qual โ€“ kleiner oder gleich * `le`: `l`ess than or `e`qual โ€“ kleiner oder gleich
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial005_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial005_an.py!}
```
```Python hl_lines="10" ////
{!> ../../../docs_src/path_params_numeric_validations/tutorial005_an_py39.py!}
```
=== "Python 3.8+" //// tab | Python 3.8+ nicht annotiert
```Python hl_lines="9" /// tip | "Tipp"
{!> ../../../docs_src/path_params_numeric_validations/tutorial005_an.py!}
```
=== "Python 3.8+ nicht annotiert" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
!!! tip "Tipp" ///
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="9" ```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial005.py!} {!> ../../../docs_src/path_params_numeric_validations/tutorial005.py!}
``` ```
////
## Validierung von Zahlen: Floats, grรถรŸer und kleiner ## Validierung von Zahlen: Floats, grรถรŸer und kleiner
@ -244,26 +319,35 @@ Hier wird es wichtig, in der Lage zu sein, <abbr title="greater than โ€“ grรถรŸe
Das gleiche gilt fรผr <abbr title="less than โ€“ kleiner als"><code>lt</code></abbr>. Das gleiche gilt fรผr <abbr title="less than โ€“ kleiner als"><code>lt</code></abbr>.
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="13" ```Python hl_lines="13"
{!> ../../../docs_src/path_params_numeric_validations/tutorial006_an_py39.py!} {!> ../../../docs_src/path_params_numeric_validations/tutorial006_an_py39.py!}
``` ```
=== "Python 3.8+" ////
```Python hl_lines="12" //// tab | Python 3.8+
{!> ../../../docs_src/path_params_numeric_validations/tutorial006_an.py!}
``` ```Python hl_lines="12"
{!> ../../../docs_src/path_params_numeric_validations/tutorial006_an.py!}
```
=== "Python 3.8+ nicht annotiert" ////
!!! tip "Tipp" //// tab | Python 3.8+ nicht annotiert
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="11" /// tip | "Tipp"
{!> ../../../docs_src/path_params_numeric_validations/tutorial006.py!}
``` Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="11"
{!> ../../../docs_src/path_params_numeric_validations/tutorial006.py!}
```
////
## Zusammenfassung ## Zusammenfassung
@ -276,18 +360,24 @@ Und Sie kรถnnen auch Validierungen fรผr Zahlen deklarieren:
* `lt`: `l`ess `t`han โ€“ kleiner als * `lt`: `l`ess `t`han โ€“ kleiner als
* `le`: `l`ess than or `e`qual โ€“ kleiner oder gleich * `le`: `l`ess than or `e`qual โ€“ kleiner oder gleich
!!! info /// info
`Query`, `Path`, und andere Klassen, die Sie spรคter kennenlernen, sind Unterklassen einer allgemeinen `Param`-Klasse.
`Query`, `Path`, und andere Klassen, die Sie spรคter kennenlernen, sind Unterklassen einer allgemeinen `Param`-Klasse.
Sie alle teilen die gleichen Parameter fรผr zusรคtzliche Validierung und Metadaten, die Sie gesehen haben.
///
/// note | "Technische Details"
Sie alle teilen die gleichen Parameter fรผr zusรคtzliche Validierung und Metadaten, die Sie gesehen haben. `Query`, `Path` und andere, die Sie von `fastapi` importieren, sind tatsรคchlich Funktionen.
!!! note "Technische Details" Die, wenn sie aufgerufen werden, Instanzen der Klassen mit demselben Namen zurรผckgeben.
`Query`, `Path` und andere, die Sie von `fastapi` importieren, sind tatsรคchlich Funktionen.
Die, wenn sie aufgerufen werden, Instanzen der Klassen mit demselben Namen zurรผckgeben. Sie importieren also `Query`, welches eine Funktion ist. Aber wenn Sie es aufrufen, gibt es eine Instanz der Klasse zurรผck, die auch `Query` genannt wird.
Sie importieren also `Query`, welches eine Funktion ist. Aber wenn Sie es aufrufen, gibt es eine Instanz der Klasse zurรผck, die auch `Query` genannt wird. Diese Funktionen existieren (statt die Klassen direkt zu verwenden), damit Ihr Editor keine Fehlermeldungen รผber ihre Typen ausgibt.
Diese Funktionen existieren (statt die Klassen direkt zu verwenden), damit Ihr Editor keine Fehlermeldungen รผber ihre Typen ausgibt. Auf diese Weise kรถnnen Sie Ihren Editor und Ihre Programmier-Tools verwenden, ohne besondere Einstellungen vornehmen zu mรผssen, um diese Fehlermeldungen stummzuschalten.
Auf diese Weise kรถnnen Sie Ihren Editor und Ihre Programmier-Tools verwenden, ohne besondere Einstellungen vornehmen zu mรผssen, um diese Fehlermeldungen stummzuschalten. ///

66
docs/de/docs/tutorial/path-params.md

@ -24,8 +24,11 @@ Sie kรถnnen den Typ eines Pfad-Parameters in der Argumentliste der Funktion dekl
In diesem Fall wird `item_id` als `int` deklariert, also als Ganzzahl. In diesem Fall wird `item_id` als `int` deklariert, also als Ganzzahl.
!!! check /// check
Dadurch erhalten Sie Editor-Unterstรผtzung innerhalb Ihrer Funktion, mit Fehlerprรผfungen, Codevervollstรคndigung, usw.
Dadurch erhalten Sie Editor-Unterstรผtzung innerhalb Ihrer Funktion, mit Fehlerprรผfungen, Codevervollstรคndigung, usw.
///
## Daten-<abbr title="Auch bekannt als: Serialisierung, Parsen, Marshalling">Konversion</abbr> ## Daten-<abbr title="Auch bekannt als: Serialisierung, Parsen, Marshalling">Konversion</abbr>
@ -35,10 +38,13 @@ Wenn Sie dieses Beispiel ausfรผhren und Ihren Browser unter <a href="http://127.
{"item_id":3} {"item_id":3}
``` ```
!!! check /// check
Beachten Sie, dass der Wert, den Ihre Funktion erhรคlt und zurรผckgibt, die Zahl `3` ist, also ein `int`. Nicht der String `"3"`, also ein `str`.
Beachten Sie, dass der Wert, den Ihre Funktion erhรคlt und zurรผckgibt, die Zahl `3` ist, also ein `int`. Nicht der String `"3"`, also ein `str`.
Sprich, mit dieser Typdeklaration wird **FastAPI** die Anfrage automatisch <abbr title="Den String, der von einer HTTP Anfrage kommt, in Python-Objekte konvertieren">โ€žparsenโ€œ</abbr>.
Sprich, mit dieser Typdeklaration wird **FastAPI** die Anfrage automatisch <abbr title="Den String, der von einer HTTP Anfrage kommt, in Python-Objekte konvertieren">โ€žparsenโ€œ</abbr>. ///
## Datenvalidierung ## Datenvalidierung
@ -65,12 +71,15 @@ Der Pfad-Parameter `item_id` hatte den Wert `"foo"`, was kein `int` ist.
Die gleiche Fehlermeldung wรผrde angezeigt werden, wenn Sie ein `float` (also eine Kommazahl) statt eines `int`s รผbergeben wรผrden, wie etwa in: <a href="http://127.0.0.1:8000/items/4.2" class="external-link" target="_blank">http://127.0.0.1:8000/items/4.2</a> Die gleiche Fehlermeldung wรผrde angezeigt werden, wenn Sie ein `float` (also eine Kommazahl) statt eines `int`s รผbergeben wรผrden, wie etwa in: <a href="http://127.0.0.1:8000/items/4.2" class="external-link" target="_blank">http://127.0.0.1:8000/items/4.2</a>
!!! check /// check
Sprich, mit der gleichen Python-Typdeklaration gibt Ihnen **FastAPI** Datenvalidierung.
Beachten Sie, dass die Fehlermeldung auch direkt die Stelle anzeigt, wo die Validierung nicht erfolgreich war. Sprich, mit der gleichen Python-Typdeklaration gibt Ihnen **FastAPI** Datenvalidierung.
Das ist unglaublich hilfreich, wenn Sie Code entwickeln und debuggen, welcher mit ihrer API interagiert. Beachten Sie, dass die Fehlermeldung auch direkt die Stelle anzeigt, wo die Validierung nicht erfolgreich war.
Das ist unglaublich hilfreich, wenn Sie Code entwickeln und debuggen, welcher mit ihrer API interagiert.
///
## Dokumentation ## Dokumentation
@ -78,10 +87,13 @@ Wenn Sie die Seite <a href="http://127.0.0.1:8000/docs" class="external-link" ta
<img src="/img/tutorial/path-params/image01.png"> <img src="/img/tutorial/path-params/image01.png">
!!! check /// check
Wiederum, mit dieser gleichen Python-Typdeklaration gibt Ihnen **FastAPI** eine automatische, interaktive Dokumentation (verwendet die Swagger-Benutzeroberflรคche).
Wiederum, mit dieser gleichen Python-Typdeklaration gibt Ihnen **FastAPI** eine automatische, interaktive Dokumentation (verwendet die Swagger-Benutzeroberflรคche).
Beachten Sie, dass der Pfad-Parameter dort als Ganzzahl deklariert ist.
Beachten Sie, dass der Pfad-Parameter dort als Ganzzahl deklariert ist. ///
## Nรผtzliche Standards. Alternative Dokumentation ## Nรผtzliche Standards. Alternative Dokumentation
@ -141,11 +153,17 @@ Erstellen Sie dann Klassen-Attribute mit festgelegten Werten, welches die erlaub
{!../../../docs_src/path_params/tutorial005.py!} {!../../../docs_src/path_params/tutorial005.py!}
``` ```
!!! info /// info
<a href="https://docs.python.org/3/library/enum.html" class="external-link" target="_blank">Enumerationen (oder kurz Enums)</a> gibt es in Python seit Version 3.4.
!!! tip "Tipp" <a href="https://docs.python.org/3/library/enum.html" class="external-link" target="_blank">Enumerationen (oder kurz Enums)</a> gibt es in Python seit Version 3.4.
Falls Sie sich fragen, was โ€žAlexNetโ€œ, โ€žResNetโ€œ und โ€žLeNetโ€œ ist, das sind Namen von <abbr title="Genau genommen, Deep-Learning-Modellarchitekturen">Modellen</abbr> fรผr maschinelles Lernen.
///
/// tip | "Tipp"
Falls Sie sich fragen, was โ€žAlexNetโ€œ, โ€žResNetโ€œ und โ€žLeNetโ€œ ist, das sind Namen von <abbr title="Genau genommen, Deep-Learning-Modellarchitekturen">Modellen</abbr> fรผr maschinelles Lernen.
///
### Deklarieren Sie einen *Pfad-Parameter* ### Deklarieren Sie einen *Pfad-Parameter*
@ -181,8 +199,11 @@ Den tatsรคchlichen Wert (in diesem Fall ein `str`) erhalten Sie via `model_name.
{!../../../docs_src/path_params/tutorial005.py!} {!../../../docs_src/path_params/tutorial005.py!}
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Sie kรถnnen den Wert `"lenet"` auรŸerdem mittels `ModelName.lenet.value` abrufen.
Sie kรถnnen den Wert `"lenet"` auรŸerdem mittels `ModelName.lenet.value` abrufen.
///
#### *Enum-Member* zurรผckgeben #### *Enum-Member* zurรผckgeben
@ -235,10 +256,13 @@ Sie verwenden das also wie folgt:
{!../../../docs_src/path_params/tutorial004.py!} {!../../../docs_src/path_params/tutorial004.py!}
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Der Parameter kรถnnte einen fรผhrenden Schrรคgstrich (`/`) haben, wie etwa in `/home/johndoe/myfile.txt`.
Der Parameter kรถnnte einen fรผhrenden Schrรคgstrich (`/`) haben, wie etwa in `/home/johndoe/myfile.txt`.
In dem Fall wรคre die URL: `/files//home/johndoe/myfile.txt`, mit einem doppelten Schrรคgstrich (`//`) zwischen `files` und `home`.
In dem Fall wรคre die URL: `/files//home/johndoe/myfile.txt`, mit einem doppelten Schrรคgstrich (`//`) zwischen `files` und `home`. ///
## Zusammenfassung ## Zusammenfassung

1067
docs/de/docs/tutorial/query-params-str-validations.md

File diff suppressed because it is too large

94
docs/de/docs/tutorial/query-params.md

@ -63,38 +63,49 @@ gehen, werden die Parameter-Werte Ihrer Funktion sein:
Auf die gleiche Weise kรถnnen Sie optionale Query-Parameter deklarieren, indem Sie deren Defaultwert auf `None` setzen: Auf die gleiche Weise kรถnnen Sie optionale Query-Parameter deklarieren, indem Sie deren Defaultwert auf `None` setzen:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="7" ```Python hl_lines="7"
{!> ../../../docs_src/query_params/tutorial002_py310.py!} {!> ../../../docs_src/query_params/tutorial002_py310.py!}
``` ```
////
//// tab | Python 3.8+
=== "Python 3.8+" ```Python hl_lines="9"
{!> ../../../docs_src/query_params/tutorial002.py!}
```
```Python hl_lines="9" ////
{!> ../../../docs_src/query_params/tutorial002.py!}
```
In diesem Fall wird der Funktionsparameter `q` optional, und standardmรครŸig `None` sein. In diesem Fall wird der Funktionsparameter `q` optional, und standardmรครŸig `None` sein.
!!! check /// check
Beachten Sie auch, dass **FastAPI** intelligent genug ist, um zu erkennen, dass `item_id` ein Pfad-Parameter ist und `q` keiner, daher muss letzteres ein Query-Parameter sein.
Beachten Sie auch, dass **FastAPI** intelligent genug ist, um zu erkennen, dass `item_id` ein Pfad-Parameter ist und `q` keiner, daher muss letzteres ein Query-Parameter sein.
///
## Query-Parameter Typkonvertierung ## Query-Parameter Typkonvertierung
Sie kรถnnen auch `bool`-Typen deklarieren und sie werden konvertiert: Sie kรถnnen auch `bool`-Typen deklarieren und sie werden konvertiert:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="7"
{!> ../../../docs_src/query_params/tutorial003_py310.py!}
```
```Python hl_lines="7" ////
{!> ../../../docs_src/query_params/tutorial003_py310.py!}
```
=== "Python 3.8+" //// tab | Python 3.8+
```Python hl_lines="9"
{!> ../../../docs_src/query_params/tutorial003.py!}
```
```Python hl_lines="9" ////
{!> ../../../docs_src/query_params/tutorial003.py!}
```
Wenn Sie nun zu: Wenn Sie nun zu:
@ -136,17 +147,21 @@ Und Sie mรผssen sie auch nicht in einer spezifischen Reihenfolge deklarieren.
Parameter werden anhand ihres Namens erkannt: Parameter werden anhand ihres Namens erkannt:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="6 8"
{!> ../../../docs_src/query_params/tutorial004_py310.py!}
```
////
```Python hl_lines="6 8" //// tab | Python 3.8+
{!> ../../../docs_src/query_params/tutorial004_py310.py!}
```
=== "Python 3.8+" ```Python hl_lines="8 10"
{!> ../../../docs_src/query_params/tutorial004.py!}
```
```Python hl_lines="8 10" ////
{!> ../../../docs_src/query_params/tutorial004.py!}
```
## Erforderliche Query-Parameter ## Erforderliche Query-Parameter
@ -204,17 +219,21 @@ http://127.0.0.1:8000/items/foo-item?needy=sooooneedy
Und natรผrlich kรถnnen Sie einige Parameter als erforderlich, einige mit Defaultwert, und einige als vollstรคndig optional definieren: Und natรผrlich kรถnnen Sie einige Parameter als erforderlich, einige mit Defaultwert, und einige als vollstรคndig optional definieren:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="8" ```Python hl_lines="8"
{!> ../../../docs_src/query_params/tutorial006_py310.py!} {!> ../../../docs_src/query_params/tutorial006_py310.py!}
``` ```
=== "Python 3.8+" ////
```Python hl_lines="10" //// tab | Python 3.8+
{!> ../../../docs_src/query_params/tutorial006.py!}
``` ```Python hl_lines="10"
{!> ../../../docs_src/query_params/tutorial006.py!}
```
////
In diesem Fall gibt es drei Query-Parameter: In diesem Fall gibt es drei Query-Parameter:
@ -222,5 +241,8 @@ In diesem Fall gibt es drei Query-Parameter:
* `skip`, ein `int` mit einem Defaultwert `0`. * `skip`, ein `int` mit einem Defaultwert `0`.
* `limit`, ein optionales `int`. * `limit`, ein optionales `int`.
!!! tip "Tipp" /// tip | "Tipp"
Sie kรถnnen auch `Enum`s verwenden, auf die gleiche Weise wie mit [Pfad-Parametern](path-params.md#vordefinierte-parameterwerte){.internal-link target=_blank}.
Sie kรถnnen auch `Enum`s verwenden, auf die gleiche Weise wie mit [Pfad-Parametern](path-params.md#vordefinierte-parameterwerte){.internal-link target=_blank}.
///

390
docs/de/docs/tutorial/request-files.md

@ -2,70 +2,97 @@
Mit `File` kรถnnen sie vom Client hochzuladende Dateien definieren. Mit `File` kรถnnen sie vom Client hochzuladende Dateien definieren.
!!! info /// info
Um hochgeladene Dateien zu empfangen, installieren Sie zuerst <a href="https://andrew-d.github.io/python-multipart/" class="external-link" target="_blank">`python-multipart`</a>.
Z. B. `pip install python-multipart`. Um hochgeladene Dateien zu empfangen, installieren Sie zuerst <a href="https://andrew-d.github.io/python-multipart/" class="external-link" target="_blank">`python-multipart`</a>.
Das, weil hochgeladene Dateien als โ€žFormulardatenโ€œ gesendet werden. Z. B. `pip install python-multipart`.
Das, weil hochgeladene Dateien als โ€žFormulardatenโ€œ gesendet werden.
///
## `File` importieren ## `File` importieren
Importieren Sie `File` und `UploadFile` von `fastapi`: Importieren Sie `File` und `UploadFile` von `fastapi`:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="3"
{!> ../../../docs_src/request_files/tutorial001_an_py39.py!}
```
////
```Python hl_lines="3" //// tab | Python 3.8+
{!> ../../../docs_src/request_files/tutorial001_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="1"
{!> ../../../docs_src/request_files/tutorial001_an.py!}
```
```Python hl_lines="1" ////
{!> ../../../docs_src/request_files/tutorial001_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.
```Python hl_lines="1" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/request_files/tutorial001.py!}
``` ///
```Python hl_lines="1"
{!> ../../../docs_src/request_files/tutorial001.py!}
```
////
## `File`-Parameter definieren ## `File`-Parameter definieren
Erstellen Sie Datei-Parameter, so wie Sie es auch mit `Body` und `Form` machen wรผrden: Erstellen Sie Datei-Parameter, so wie Sie es auch mit `Body` und `Form` machen wรผrden:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="9"
{!> ../../../docs_src/request_files/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="8"
{!> ../../../docs_src/request_files/tutorial001_an.py!}
```
////
```Python hl_lines="9" //// tab | Python 3.8+ nicht annotiert
{!> ../../../docs_src/request_files/tutorial001_an_py39.py!}
``` /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="7"
{!> ../../../docs_src/request_files/tutorial001.py!}
```
=== "Python 3.8+" ////
```Python hl_lines="8" /// info
{!> ../../../docs_src/request_files/tutorial001_an.py!}
```
=== "Python 3.8+ nicht annotiert" `File` ist eine Klasse, die direkt von `Form` erbt.
!!! tip "Tipp" Aber erinnern Sie sich, dass, wenn Sie `Query`, `Path`, `File` und andere von `fastapi` importieren, diese tatsรคchlich Funktionen sind, welche spezielle Klassen zurรผckgeben
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="7" ///
{!> ../../../docs_src/request_files/tutorial001.py!}
```
!!! info /// tip | "Tipp"
`File` ist eine Klasse, die direkt von `Form` erbt.
Aber erinnern Sie sich, dass, wenn Sie `Query`, `Path`, `File` und andere von `fastapi` importieren, diese tatsรคchlich Funktionen sind, welche spezielle Klassen zurรผckgeben Um Dateibodys zu deklarieren, mรผssen Sie `File` verwenden, da diese Parameter sonst als Query-Parameter oder Body(-JSON)-Parameter interpretiert werden wรผrden.
!!! tip "Tipp" ///
Um Dateibodys zu deklarieren, mรผssen Sie `File` verwenden, da diese Parameter sonst als Query-Parameter oder Body(-JSON)-Parameter interpretiert werden wรผrden.
Die Dateien werden als โ€žFormulardatenโ€œ hochgeladen. Die Dateien werden als โ€žFormulardatenโ€œ hochgeladen.
@ -79,26 +106,35 @@ Aber es gibt viele Fรคlle, in denen Sie davon profitieren, `UploadFile` zu verwe
Definieren Sie einen Datei-Parameter mit dem Typ `UploadFile`: Definieren Sie einen Datei-Parameter mit dem Typ `UploadFile`:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="14" ```Python hl_lines="14"
{!> ../../../docs_src/request_files/tutorial001_an_py39.py!} {!> ../../../docs_src/request_files/tutorial001_an_py39.py!}
``` ```
////
//// tab | Python 3.8+
=== "Python 3.8+" ```Python hl_lines="13"
{!> ../../../docs_src/request_files/tutorial001_an.py!}
```
////
```Python hl_lines="13" //// tab | Python 3.8+ nicht annotiert
{!> ../../../docs_src/request_files/tutorial001_an.py!}
```
=== "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="12" ///
{!> ../../../docs_src/request_files/tutorial001.py!}
``` ```Python hl_lines="12"
{!> ../../../docs_src/request_files/tutorial001.py!}
```
////
`UploadFile` zu verwenden, hat mehrere Vorzรผge gegenรผber `bytes`: `UploadFile` zu verwenden, hat mehrere Vorzรผge gegenรผber `bytes`:
@ -141,11 +177,17 @@ Wenn Sie sich innerhalb einer normalen `def`-*Pfadoperation-Funktion* befinden,
contents = myfile.file.read() contents = myfile.file.read()
``` ```
!!! note "Technische Details zu `async`" /// note | "Technische Details zu `async`"
Wenn Sie die `async`-Methoden verwenden, fรผhrt **FastAPI** die Datei-Methoden in einem <abbr title="Mehrere unabhรคngige Kindprozesse">Threadpool</abbr> aus und erwartet sie.
Wenn Sie die `async`-Methoden verwenden, fรผhrt **FastAPI** die Datei-Methoden in einem <abbr title="Mehrere unabhรคngige Kindprozesse">Threadpool</abbr> aus und erwartet sie.
///
/// note | "Technische Details zu Starlette"
!!! note "Technische Details zu Starlette" **FastAPI**s `UploadFile` erbt direkt von **Starlette**s `UploadFile`, fรผgt aber ein paar notwendige Teile hinzu, um es kompatibel mit **Pydantic** und anderen Teilen von FastAPI zu machen.
**FastAPI**s `UploadFile` erbt direkt von **Starlette**s `UploadFile`, fรผgt aber ein paar notwendige Teile hinzu, um es kompatibel mit **Pydantic** und anderen Teilen von FastAPI zu machen.
///
## Was sind โ€žFormulardatenโ€œ ## Was sind โ€žFormulardatenโ€œ
@ -153,82 +195,113 @@ HTML-Formulare (`<form></form>`) senden die Daten in einer โ€žspeziellenโ€œ Kodi
**FastAPI** stellt sicher, dass diese Daten korrekt ausgelesen werden, statt JSON zu erwarten. **FastAPI** stellt sicher, dass diese Daten korrekt ausgelesen werden, statt JSON zu erwarten.
!!! note "Technische Details" /// note | "Technische Details"
Daten aus Formularen werden, wenn es keine Dateien sind, normalerweise mit dem <abbr title='Media type โ€“ Medientyp, Typ des Mediums'>โ€žmedia typeโ€œ</abbr> `application/x-www-form-urlencoded` kodiert.
Daten aus Formularen werden, wenn es keine Dateien sind, normalerweise mit dem <abbr title='Media type โ€“ Medientyp, Typ des Mediums'>โ€žmedia typeโ€œ</abbr> `application/x-www-form-urlencoded` kodiert.
Sollte das Formular aber Dateien enthalten, dann werden diese mit `multipart/form-data` kodiert. Wenn Sie `File` verwenden, wird **FastAPI** wissen, dass es die Dateien vom korrekten Teil des Bodys holen muss.
Wenn Sie mehr รผber Formularfelder und ihre Kodierungen lesen mรถchten, besuchen Sie die <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" class="external-link" target="_blank"><abbr title="Mozilla Developer Network โ€“ Mozilla-Entwickler-Netzwerk">MDN</abbr>-Webdokumentation fรผr <code>POST</code></a>.
///
Sollte das Formular aber Dateien enthalten, dann werden diese mit `multipart/form-data` kodiert. Wenn Sie `File` verwenden, wird **FastAPI** wissen, dass es die Dateien vom korrekten Teil des Bodys holen muss. /// warning | "Achtung"
Wenn Sie mehr รผber Formularfelder und ihre Kodierungen lesen mรถchten, besuchen Sie die <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" class="external-link" target="_blank"><abbr title="Mozilla Developer Network โ€“ Mozilla-Entwickler-Netzwerk">MDN</abbr>-Webdokumentation fรผr <code>POST</code></a>. Sie kรถnnen mehrere `File`- und `Form`-Parameter in einer *Pfadoperation* deklarieren, aber Sie kรถnnen nicht gleichzeitig auch `Body`-Felder deklarieren, welche Sie als JSON erwarten, da der Request den Body mittels `multipart/form-data` statt `application/json` kodiert.
!!! warning "Achtung" Das ist keine Limitation von **FastAPI**, sondern Teil des HTTP-Protokolls.
Sie kรถnnen mehrere `File`- und `Form`-Parameter in einer *Pfadoperation* deklarieren, aber Sie kรถnnen nicht gleichzeitig auch `Body`-Felder deklarieren, welche Sie als JSON erwarten, da der Request den Body mittels `multipart/form-data` statt `application/json` kodiert.
Das ist keine Limitation von **FastAPI**, sondern Teil des HTTP-Protokolls. ///
## Optionaler Datei-Upload ## Optionaler Datei-Upload
Sie kรถnnen eine Datei optional machen, indem Sie Standard-Typannotationen verwenden und den Defaultwert auf `None` setzen: Sie kรถnnen eine Datei optional machen, indem Sie Standard-Typannotationen verwenden und den Defaultwert auf `None` setzen:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="9 17"
{!> ../../../docs_src/request_files/tutorial001_02_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="9 17"
{!> ../../../docs_src/request_files/tutorial001_02_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="9 17" ```Python hl_lines="10 18"
{!> ../../../docs_src/request_files/tutorial001_02_an_py310.py!} {!> ../../../docs_src/request_files/tutorial001_02_an.py!}
``` ```
////
=== "Python 3.9+" //// tab | Python 3.10+ nicht annotiert
```Python hl_lines="9 17" /// tip | "Tipp"
{!> ../../../docs_src/request_files/tutorial001_02_an_py39.py!}
```
=== "Python 3.8+" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="10 18" ///
{!> ../../../docs_src/request_files/tutorial001_02_an.py!}
```
=== "Python 3.10+ nicht annotiert" ```Python hl_lines="7 15"
{!> ../../../docs_src/request_files/tutorial001_02_py310.py!}
```
!!! tip "Tipp" ////
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="7 15" //// tab | Python 3.8+ nicht annotiert
{!> ../../../docs_src/request_files/tutorial001_02_py310.py!}
```
=== "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="9 17" ///
{!> ../../../docs_src/request_files/tutorial001_02.py!}
``` ```Python hl_lines="9 17"
{!> ../../../docs_src/request_files/tutorial001_02.py!}
```
////
## `UploadFile` mit zusรคtzlichen Metadaten ## `UploadFile` mit zusรคtzlichen Metadaten
Sie kรถnnen auch `File()` zusammen mit `UploadFile` verwenden, um zum Beispiel zusรคtzliche Metadaten zu setzen: Sie kรถnnen auch `File()` zusammen mit `UploadFile` verwenden, um zum Beispiel zusรคtzliche Metadaten zu setzen:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="9 15"
{!> ../../../docs_src/request_files/tutorial001_03_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="8 14"
{!> ../../../docs_src/request_files/tutorial001_03_an.py!}
```
////
```Python hl_lines="9 15" //// tab | Python 3.8+ nicht annotiert
{!> ../../../docs_src/request_files/tutorial001_03_an_py39.py!}
```
=== "Python 3.8+" /// tip | "Tipp"
```Python hl_lines="8 14" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/request_files/tutorial001_03_an.py!}
```
=== "Python 3.8+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="7 13"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/request_files/tutorial001_03.py!}
```
```Python hl_lines="7 13" ////
{!> ../../../docs_src/request_files/tutorial001_03.py!}
```
## Mehrere Datei-Uploads ## Mehrere Datei-Uploads
@ -238,76 +311,107 @@ Diese werden demselben Formularfeld zugeordnet, welches mit den Formulardaten ge
Um das zu machen, deklarieren Sie eine Liste von `bytes` oder `UploadFile`s: Um das zu machen, deklarieren Sie eine Liste von `bytes` oder `UploadFile`s:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="10 15" ```Python hl_lines="10 15"
{!> ../../../docs_src/request_files/tutorial002_an_py39.py!} {!> ../../../docs_src/request_files/tutorial002_an_py39.py!}
``` ```
////
=== "Python 3.8+" //// tab | Python 3.8+
```Python hl_lines="11 16" ```Python hl_lines="11 16"
{!> ../../../docs_src/request_files/tutorial002_an.py!} {!> ../../../docs_src/request_files/tutorial002_an.py!}
``` ```
=== "Python 3.9+ nicht annotiert" ////
!!! tip "Tipp" //// tab | Python 3.9+ nicht annotiert
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="8 13" /// tip | "Tipp"
{!> ../../../docs_src/request_files/tutorial002_py39.py!}
```
=== "Python 3.8+ nicht annotiert" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
!!! tip "Tipp" ///
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="8 13"
{!> ../../../docs_src/request_files/tutorial002_py39.py!}
```
```Python hl_lines="10 15" ////
{!> ../../../docs_src/request_files/tutorial002.py!}
``` //// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="10 15"
{!> ../../../docs_src/request_files/tutorial002.py!}
```
////
Sie erhalten, wie deklariert, eine `list`e von `bytes` oder `UploadFile`s. Sie erhalten, wie deklariert, eine `list`e von `bytes` oder `UploadFile`s.
!!! 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. ///
### Mehrere Datei-Uploads mit zusรคtzlichen Metadaten ### Mehrere Datei-Uploads mit zusรคtzlichen Metadaten
Und so wie zuvor kรถnnen Sie `File()` verwenden, um zusรคtzliche Parameter zu setzen, sogar fรผr `UploadFile`: Und so wie zuvor kรถnnen Sie `File()` verwenden, um zusรคtzliche Parameter zu setzen, sogar fรผr `UploadFile`:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="11 18-20" ```Python hl_lines="11 18-20"
{!> ../../../docs_src/request_files/tutorial003_an_py39.py!} {!> ../../../docs_src/request_files/tutorial003_an_py39.py!}
``` ```
=== "Python 3.8+" ////
```Python hl_lines="12 19-21" //// tab | Python 3.8+
{!> ../../../docs_src/request_files/tutorial003_an.py!}
```
=== "Python 3.9+ nicht annotiert" ```Python hl_lines="12 19-21"
{!> ../../../docs_src/request_files/tutorial003_an.py!}
```
!!! tip "Tipp" ////
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="9 16" //// tab | Python 3.9+ nicht annotiert
{!> ../../../docs_src/request_files/tutorial003_py39.py!}
```
=== "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="9 16"
{!> ../../../docs_src/request_files/tutorial003_py39.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="11 18"
{!> ../../../docs_src/request_files/tutorial003.py!}
```
```Python hl_lines="11 18" ////
{!> ../../../docs_src/request_files/tutorial003.py!}
```
## Zusammenfassung ## Zusammenfassung

92
docs/de/docs/tutorial/request-forms-and-files.md

@ -2,67 +2,91 @@
Sie kรถnnen gleichzeitig Dateien und Formulardaten mit `File` und `Form` definieren. Sie kรถnnen gleichzeitig Dateien und Formulardaten mit `File` und `Form` definieren.
!!! info /// info
Um hochgeladene Dateien und/oder Formulardaten zu empfangen, installieren Sie zuerst <a href="https://andrew-d.github.io/python-multipart/" class="external-link" target="_blank">`python-multipart`</a>.
Z. B. `pip install python-multipart`. Um hochgeladene Dateien und/oder Formulardaten zu empfangen, installieren Sie zuerst <a href="https://andrew-d.github.io/python-multipart/" class="external-link" target="_blank">`python-multipart`</a>.
Z. B. `pip install python-multipart`.
///
## `File` und `Form` importieren ## `File` und `Form` importieren
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="3"
{!> ../../../docs_src/request_forms_and_files/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="1"
{!> ../../../docs_src/request_forms_and_files/tutorial001_an.py!}
```
////
```Python hl_lines="3" //// tab | Python 3.8+ nicht annotiert
{!> ../../../docs_src/request_forms_and_files/tutorial001_an_py39.py!}
```
=== "Python 3.8+" /// tip | "Tipp"
```Python hl_lines="1" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/request_forms_and_files/tutorial001_an.py!}
```
=== "Python 3.8+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="1"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/request_forms_and_files/tutorial001.py!}
```
```Python hl_lines="1" ////
{!> ../../../docs_src/request_forms_and_files/tutorial001.py!}
```
## `File` und `Form`-Parameter definieren ## `File` und `Form`-Parameter definieren
Erstellen Sie Datei- und Formularparameter, so wie Sie es auch mit `Body` und `Query` machen wรผrden: Erstellen Sie Datei- und Formularparameter, so wie Sie es auch mit `Body` und `Query` machen wรผrden:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="10-12" ```Python hl_lines="10-12"
{!> ../../../docs_src/request_forms_and_files/tutorial001_an_py39.py!} {!> ../../../docs_src/request_forms_and_files/tutorial001_an_py39.py!}
``` ```
=== "Python 3.8+" ////
```Python hl_lines="9-11" //// tab | Python 3.8+
{!> ../../../docs_src/request_forms_and_files/tutorial001_an.py!}
```
=== "Python 3.8+ nicht annotiert" ```Python hl_lines="9-11"
{!> ../../../docs_src/request_forms_and_files/tutorial001_an.py!}
```
!!! tip "Tipp" ////
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="8" //// tab | Python 3.8+ nicht annotiert
{!> ../../../docs_src/request_forms_and_files/tutorial001.py!}
``` /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="8"
{!> ../../../docs_src/request_forms_and_files/tutorial001.py!}
```
////
Die Datei- und Formularfelder werden als Formulardaten hochgeladen, und Sie erhalten diese Dateien und Formularfelder. Die Datei- und Formularfelder werden als Formulardaten hochgeladen, und Sie erhalten diese Dateien und Formularfelder.
Und Sie kรถnnen einige der Dateien als `bytes` und einige als `UploadFile` deklarieren. Und Sie kรถnnen einige der Dateien als `bytes` und einige als `UploadFile` deklarieren.
!!! warning "Achtung" /// warning | "Achtung"
Sie kรถnnen mehrere `File`- und `Form`-Parameter in einer *Pfadoperation* deklarieren, aber Sie kรถnnen nicht gleichzeitig auch `Body`-Felder deklarieren, welche Sie als JSON erwarten, da der Request den Body mittels `multipart/form-data` statt `application/json` kodiert.
Sie kรถnnen mehrere `File`- und `Form`-Parameter in einer *Pfadoperation* deklarieren, aber Sie kรถnnen nicht gleichzeitig auch `Body`-Felder deklarieren, welche Sie als JSON erwarten, da der Request den Body mittels `multipart/form-data` statt `application/json` kodiert.
Das ist keine Limitation von **FastAPI**, sondern Teil des HTTP-Protokolls.
Das ist keine Limitation von **FastAPI**, sondern Teil des HTTP-Protokolls. ///
## Zusammenfassung ## Zusammenfassung

117
docs/de/docs/tutorial/request-forms.md

@ -2,60 +2,81 @@
Wenn Sie Felder aus Formularen statt JSON empfangen mรผssen, kรถnnen Sie `Form` verwenden. Wenn Sie Felder aus Formularen statt JSON empfangen mรผssen, kรถnnen Sie `Form` verwenden.
!!! info /// info
Um Formulare zu verwenden, installieren Sie zuerst <a href="https://andrew-d.github.io/python-multipart/" class="external-link" target="_blank">`python-multipart`</a>.
Z. B. `pip install python-multipart`. Um Formulare zu verwenden, installieren Sie zuerst <a href="https://andrew-d.github.io/python-multipart/" class="external-link" target="_blank">`python-multipart`</a>.
Z. B. `pip install python-multipart`.
///
## `Form` importieren ## `Form` importieren
Importieren Sie `Form` von `fastapi`: Importieren Sie `Form` von `fastapi`:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="3"
{!> ../../../docs_src/request_forms/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="3" ```Python hl_lines="1"
{!> ../../../docs_src/request_forms/tutorial001_an_py39.py!} {!> ../../../docs_src/request_forms/tutorial001_an.py!}
``` ```
=== "Python 3.8+" ////
```Python hl_lines="1" //// tab | Python 3.8+ nicht annotiert
{!> ../../../docs_src/request_forms/tutorial001_an.py!}
```
=== "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" ///
{!> ../../../docs_src/request_forms/tutorial001.py!}
``` ```Python hl_lines="1"
{!> ../../../docs_src/request_forms/tutorial001.py!}
```
////
## `Form`-Parameter definieren ## `Form`-Parameter definieren
Erstellen Sie Formular-Parameter, so wie Sie es auch mit `Body` und `Query` machen wรผrden: Erstellen Sie Formular-Parameter, so wie Sie es auch mit `Body` und `Query` machen wรผrden:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="9"
{!> ../../../docs_src/request_forms/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="9" ```Python hl_lines="8"
{!> ../../../docs_src/request_forms/tutorial001_an_py39.py!} {!> ../../../docs_src/request_forms/tutorial001_an.py!}
``` ```
=== "Python 3.8+" ////
```Python hl_lines="8" //// tab | Python 3.8+ nicht annotiert
{!> ../../../docs_src/request_forms/tutorial001_an.py!}
```
=== "Python 3.8+ nicht annotiert" /// tip | "Tipp"
!!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="7" ///
{!> ../../../docs_src/request_forms/tutorial001.py!}
``` ```Python hl_lines="7"
{!> ../../../docs_src/request_forms/tutorial001.py!}
```
////
Zum Beispiel stellt eine der Mรถglichkeiten, die OAuth2 Spezifikation zu verwenden (genannt <abbr title='โ€žPasswort-Flussโ€œ'>โ€žpassword flowโ€œ</abbr>), die Bedingung, einen `username` und ein `password` als Formularfelder zu senden. Zum Beispiel stellt eine der Mรถglichkeiten, die OAuth2 Spezifikation zu verwenden (genannt <abbr title='โ€žPasswort-Flussโ€œ'>โ€žpassword flowโ€œ</abbr>), die Bedingung, einen `username` und ein `password` als Formularfelder zu senden.
@ -63,11 +84,17 @@ Die <abbr title="Specification โ€“ Spezifikation">Spec</abbr> erfordert, dass di
Mit `Form` haben Sie die gleichen Konfigurationsmรถglichkeiten wie mit `Body` (und `Query`, `Path`, `Cookie`), inklusive Validierung, Beispielen, einem Alias (z. B. `user-name` statt `username`), usw. Mit `Form` haben Sie die gleichen Konfigurationsmรถglichkeiten wie mit `Body` (und `Query`, `Path`, `Cookie`), inklusive Validierung, Beispielen, einem Alias (z. B. `user-name` statt `username`), usw.
!!! info /// info
`Form` ist eine Klasse, die direkt von `Body` erbt.
`Form` ist eine Klasse, die direkt von `Body` erbt.
///
/// tip | "Tipp"
!!! tip "Tipp" Um Formularbodys zu deklarieren, verwenden Sie explizit `Form`, da diese Parameter sonst als Query-Parameter oder Body(-JSON)-Parameter interpretiert werden wรผrden.
Um Formularbodys zu deklarieren, verwenden Sie explizit `Form`, da diese Parameter sonst als Query-Parameter oder Body(-JSON)-Parameter interpretiert werden wรผrden.
///
## รœber โ€žFormularfelderโ€œ ## รœber โ€žFormularfelderโ€œ
@ -75,17 +102,23 @@ HTML-Formulare (`<form></form>`) senden die Daten in einer โ€žspeziellenโ€œ Kodi
**FastAPI** stellt sicher, dass diese Daten korrekt ausgelesen werden, statt JSON zu erwarten. **FastAPI** stellt sicher, dass diese Daten korrekt ausgelesen werden, statt JSON zu erwarten.
!!! note "Technische Details" /// note | "Technische Details"
Daten aus Formularen werden normalerweise mit dem <abbr title='Media type โ€“ Medientyp, Typ des Mediums'>โ€žmedia typeโ€œ</abbr> `application/x-www-form-urlencoded` kodiert.
Daten aus Formularen werden normalerweise mit dem <abbr title='Media type โ€“ Medientyp, Typ des Mediums'>โ€žmedia typeโ€œ</abbr> `application/x-www-form-urlencoded` kodiert.
Wenn das Formular stattdessen Dateien enthรคlt, werden diese mit `multipart/form-data` kodiert. Im nรคchsten Kapitel erfahren Sie mehr รผber die Handhabung von Dateien.
Wenn Sie mehr รผber Formularfelder und ihre Kodierungen lesen mรถchten, besuchen Sie die <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" class="external-link" target="_blank"><abbr title="Mozilla Developer Network โ€“ Mozilla-Entwickler-Netzwerk">MDN</abbr>-Webdokumentation fรผr <code>POST</code></a>.
///
Wenn das Formular stattdessen Dateien enthรคlt, werden diese mit `multipart/form-data` kodiert. Im nรคchsten Kapitel erfahren Sie mehr รผber die Handhabung von Dateien. /// warning | "Achtung"
Wenn Sie mehr รผber Formularfelder und ihre Kodierungen lesen mรถchten, besuchen Sie die <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" class="external-link" target="_blank"><abbr title="Mozilla Developer Network โ€“ Mozilla-Entwickler-Netzwerk">MDN</abbr>-Webdokumentation fรผr <code>POST</code></a>. Sie kรถnnen mehrere `Form`-Parameter in einer *Pfadoperation* deklarieren, aber Sie kรถnnen nicht gleichzeitig auch `Body`-Felder deklarieren, welche Sie als JSON erwarten, da der Request den Body mittels `application/x-www-form-urlencoded` statt `application/json` kodiert.
!!! warning "Achtung" Das ist keine Limitation von **FastAPI**, sondern Teil des HTTP-Protokolls.
Sie kรถnnen mehrere `Form`-Parameter in einer *Pfadoperation* deklarieren, aber Sie kรถnnen nicht gleichzeitig auch `Body`-Felder deklarieren, welche Sie als JSON erwarten, da der Request den Body mittels `application/x-www-form-urlencoded` statt `application/json` kodiert.
Das ist keine Limitation von **FastAPI**, sondern Teil des HTTP-Protokolls. ///
## Zusammenfassung ## Zusammenfassung

412
docs/de/docs/tutorial/response-model.md

@ -4,23 +4,29 @@ Sie kรถnnen den Typ der <abbr title="Response โ€“ Antwort: Daten, die zum anfrag
Hierbei kรถnnen Sie **Typannotationen** genauso verwenden, wie Sie es bei Werten von Funktions-**Parametern** machen; verwenden Sie Pydantic-Modelle, Listen, Dicts und skalare Werte wie Nummern, Booleans, usw. Hierbei kรถnnen Sie **Typannotationen** genauso verwenden, wie Sie es bei Werten von Funktions-**Parametern** machen; verwenden Sie Pydantic-Modelle, Listen, Dicts und skalare Werte wie Nummern, Booleans, usw.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="16 21" ```Python hl_lines="16 21"
{!> ../../../docs_src/response_model/tutorial001_01_py310.py!} {!> ../../../docs_src/response_model/tutorial001_01_py310.py!}
``` ```
////
//// tab | Python 3.9+
=== "Python 3.9+" ```Python hl_lines="18 23"
{!> ../../../docs_src/response_model/tutorial001_01_py39.py!}
```
////
```Python hl_lines="18 23" //// tab | Python 3.8+
{!> ../../../docs_src/response_model/tutorial001_01_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="18 23"
{!> ../../../docs_src/response_model/tutorial001_01.py!}
```
```Python hl_lines="18 23" ////
{!> ../../../docs_src/response_model/tutorial001_01.py!}
```
FastAPI wird diesen Rรผckgabetyp verwenden, um: FastAPI wird diesen Rรผckgabetyp verwenden, um:
@ -53,35 +59,47 @@ Sie kรถnnen `response_model` in jeder mรถglichen *Pfadoperation* verwenden:
* `@app.delete()` * `@app.delete()`
* usw. * usw.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="17 22 24-27" ```Python hl_lines="17 22 24-27"
{!> ../../../docs_src/response_model/tutorial001_py310.py!} {!> ../../../docs_src/response_model/tutorial001_py310.py!}
``` ```
////
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="17 22 24-27" ```Python hl_lines="17 22 24-27"
{!> ../../../docs_src/response_model/tutorial001_py39.py!} {!> ../../../docs_src/response_model/tutorial001_py39.py!}
``` ```
=== "Python 3.8+" ////
```Python hl_lines="17 22 24-27" //// tab | Python 3.8+
{!> ../../../docs_src/response_model/tutorial001.py!}
``` ```Python hl_lines="17 22 24-27"
{!> ../../../docs_src/response_model/tutorial001.py!}
```
!!! note "Hinweis" ////
Beachten Sie, dass `response_model` ein Parameter der โ€žDekoratorโ€œ-Methode ist (`get`, `post`, usw.). Nicht der *Pfadoperation-Funktion*, so wie die anderen Parameter.
/// note | "Hinweis"
Beachten Sie, dass `response_model` ein Parameter der โ€žDekoratorโ€œ-Methode ist (`get`, `post`, usw.). Nicht der *Pfadoperation-Funktion*, so wie die anderen Parameter.
///
`response_model` nimmt denselben Typ entgegen, den Sie auch fรผr ein Pydantic-Modellfeld deklarieren wรผrden, also etwa ein Pydantic-Modell, aber es kann auch z. B. eine `list`e von Pydantic-Modellen sein, wie etwa `List[Item]`. `response_model` nimmt denselben Typ entgegen, den Sie auch fรผr ein Pydantic-Modellfeld deklarieren wรผrden, also etwa ein Pydantic-Modell, aber es kann auch z. B. eine `list`e von Pydantic-Modellen sein, wie etwa `List[Item]`.
FastAPI wird dieses `response_model` nehmen, um die Daten zu dokumentieren, validieren, usw. und auch, um **die Ausgabedaten** entsprechend der Typdeklaration **zu konvertieren und filtern**. FastAPI wird dieses `response_model` nehmen, um die Daten zu dokumentieren, validieren, usw. und auch, um **die Ausgabedaten** entsprechend der Typdeklaration **zu konvertieren und filtern**.
!!! tip "Tipp" /// tip | "Tipp"
Wenn Sie in Ihrem Editor strikte Typchecks haben, mypy, usw., kรถnnen Sie den Funktions-Rรผckgabetyp als <abbr title='โ€žIrgend etwasโ€œ'>`Any`</abbr> deklarieren.
Wenn Sie in Ihrem Editor strikte Typchecks haben, mypy, usw., kรถnnen Sie den Funktions-Rรผckgabetyp als <abbr title='โ€žIrgend etwasโ€œ'>`Any`</abbr> deklarieren.
So sagen Sie dem Editor, dass Sie absichtlich *irgendetwas* zurรผckgeben. Aber FastAPI wird trotzdem die Dokumentation, Validierung, Filterung, usw. der Daten รผbernehmen, via `response_model`.
So sagen Sie dem Editor, dass Sie absichtlich *irgendetwas* zurรผckgeben. Aber FastAPI wird trotzdem die Dokumentation, Validierung, Filterung, usw. der Daten รผbernehmen, via `response_model`. ///
### `response_model`-Prioritรคt ### `response_model`-Prioritรคt
@ -95,37 +113,48 @@ Sie kรถnnen auch `response_model=None` verwenden, um das Erstellen eines Respons
Im Folgenden deklarieren wir ein `UserIn`-Modell; es enthรคlt ein Klartext-Passwort: Im Folgenden deklarieren wir ein `UserIn`-Modell; es enthรคlt ein Klartext-Passwort:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="7 9"
{!> ../../../docs_src/response_model/tutorial002_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="9 11"
{!> ../../../docs_src/response_model/tutorial002.py!}
```
```Python hl_lines="7 9" ////
{!> ../../../docs_src/response_model/tutorial002_py310.py!}
```
=== "Python 3.8+" /// info
```Python hl_lines="9 11" Um `EmailStr` zu verwenden, installieren Sie zuerst <a href="https://github.com/JoshData/python-email-validator" class="external-link" target="_blank">`email_validator`</a>.
{!> ../../../docs_src/response_model/tutorial002.py!}
```
!!! info Z. B. `pip install email-validator`
Um `EmailStr` zu verwenden, installieren Sie zuerst <a href="https://github.com/JoshData/python-email-validator" class="external-link" target="_blank">`email_validator`</a>. oder `pip install pydantic[email]`.
Z. B. `pip install email-validator` ///
oder `pip install pydantic[email]`.
Wir verwenden dieses Modell, um sowohl unsere Eingabe- als auch Ausgabedaten zu deklarieren: Wir verwenden dieses Modell, um sowohl unsere Eingabe- als auch Ausgabedaten zu deklarieren:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="16"
{!> ../../../docs_src/response_model/tutorial002_py310.py!}
```
////
```Python hl_lines="16" //// tab | Python 3.8+
{!> ../../../docs_src/response_model/tutorial002_py310.py!}
```
=== "Python 3.8+" ```Python hl_lines="18"
{!> ../../../docs_src/response_model/tutorial002.py!}
```
```Python hl_lines="18" ////
{!> ../../../docs_src/response_model/tutorial002.py!}
```
Immer wenn jetzt ein Browser einen Benutzer mit Passwort erzeugt, gibt die API dasselbe Passwort in der Response zurรผck. Immer wenn jetzt ein Browser einen Benutzer mit Passwort erzeugt, gibt die API dasselbe Passwort in der Response zurรผck.
@ -133,52 +162,67 @@ Hier ist das mรถglicherweise kein Problem, da es derselbe Benutzer ist, der das
Aber wenn wir dasselbe Modell fรผr eine andere *Pfadoperation* verwenden, kรถnnten wir das Passwort dieses Benutzers zu jedem Client schicken. Aber wenn wir dasselbe Modell fรผr eine andere *Pfadoperation* verwenden, kรถnnten wir das Passwort dieses Benutzers zu jedem Client schicken.
!!! danger "Gefahr" /// danger | "Gefahr"
Speichern Sie niemals das Klartext-Passwort eines Benutzers, oder versenden Sie es in einer Response wie dieser, wenn Sie sich nicht der resultierenden Gefahren bewusst sind und nicht wissen, was Sie tun.
Speichern Sie niemals das Klartext-Passwort eines Benutzers, oder versenden Sie es in einer Response wie dieser, wenn Sie sich nicht der resultierenden Gefahren bewusst sind und nicht wissen, was Sie tun.
///
## Ausgabemodell hinzufรผgen ## Ausgabemodell hinzufรผgen
Wir kรถnnen stattdessen ein Eingabemodell mit dem Klartext-Passwort, und ein Ausgabemodell ohne das Passwort erstellen: Wir kรถnnen stattdessen ein Eingabemodell mit dem Klartext-Passwort, und ein Ausgabemodell ohne das Passwort erstellen:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="9 11 16"
{!> ../../../docs_src/response_model/tutorial003_py310.py!}
```
```Python hl_lines="9 11 16" ////
{!> ../../../docs_src/response_model/tutorial003_py310.py!}
```
=== "Python 3.8+" //// tab | Python 3.8+
```Python hl_lines="9 11 16"
{!> ../../../docs_src/response_model/tutorial003.py!}
```
```Python hl_lines="9 11 16" ////
{!> ../../../docs_src/response_model/tutorial003.py!}
```
Obwohl unsere *Pfadoperation-Funktion* hier denselben `user` von der Eingabe zurรผckgibt, der das Passwort enthรคlt: Obwohl unsere *Pfadoperation-Funktion* hier denselben `user` von der Eingabe zurรผckgibt, der das Passwort enthรคlt:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="24" ```Python hl_lines="24"
{!> ../../../docs_src/response_model/tutorial003_py310.py!} {!> ../../../docs_src/response_model/tutorial003_py310.py!}
``` ```
////
=== "Python 3.8+" //// tab | Python 3.8+
```Python hl_lines="24" ```Python hl_lines="24"
{!> ../../../docs_src/response_model/tutorial003.py!} {!> ../../../docs_src/response_model/tutorial003.py!}
``` ```
////
... haben wir deklariert, dass `response_model` das Modell `UserOut` ist, welches das Passwort nicht enthรคlt: ... haben wir deklariert, dass `response_model` das Modell `UserOut` ist, welches das Passwort nicht enthรคlt:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="22"
{!> ../../../docs_src/response_model/tutorial003_py310.py!}
```
////
```Python hl_lines="22" //// tab | Python 3.8+
{!> ../../../docs_src/response_model/tutorial003_py310.py!}
```
=== "Python 3.8+" ```Python hl_lines="22"
{!> ../../../docs_src/response_model/tutorial003.py!}
```
```Python hl_lines="22" ////
{!> ../../../docs_src/response_model/tutorial003.py!}
```
Darum wird **FastAPI** sich darum kรผmmern, dass alle Daten, die nicht im Ausgabemodell deklariert sind, herausgefiltert werden (mittels Pydantic). Darum wird **FastAPI** sich darum kรผmmern, dass alle Daten, die nicht im Ausgabemodell deklariert sind, herausgefiltert werden (mittels Pydantic).
@ -202,17 +246,21 @@ Aber in den meisten Fรคllen, wenn wir so etwas machen, wollen wir nur, dass das
Und in solchen Fรคllen kรถnnen wir Klassen und Vererbung verwenden, um Vorteil aus den Typannotationen in der Funktion zu ziehen, was vom Editor und von Tools besser unterstรผtzt wird, wรคhrend wir gleichzeitig FastAPIs **Datenfilterung** behalten. Und in solchen Fรคllen kรถnnen wir Klassen und Vererbung verwenden, um Vorteil aus den Typannotationen in der Funktion zu ziehen, was vom Editor und von Tools besser unterstรผtzt wird, wรคhrend wir gleichzeitig FastAPIs **Datenfilterung** behalten.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="7-10 13-14 18"
{!> ../../../docs_src/response_model/tutorial003_01_py310.py!}
```
////
```Python hl_lines="7-10 13-14 18" //// tab | Python 3.8+
{!> ../../../docs_src/response_model/tutorial003_01_py310.py!}
```
=== "Python 3.8+" ```Python hl_lines="9-13 15-16 20"
{!> ../../../docs_src/response_model/tutorial003_01.py!}
```
```Python hl_lines="9-13 15-16 20" ////
{!> ../../../docs_src/response_model/tutorial003_01.py!}
```
Damit erhalten wir Tool-Unterstรผtzung, vom Editor und mypy, da dieser Code hinsichtlich der Typen korrekt ist, aber wir erhalten auch die Datenfilterung von FastAPI. Damit erhalten wir Tool-Unterstรผtzung, vom Editor und mypy, da dieser Code hinsichtlich der Typen korrekt ist, aber wir erhalten auch die Datenfilterung von FastAPI.
@ -278,17 +326,21 @@ Aber wenn Sie ein beliebiges anderes Objekt zurรผckgeben, das kein gรผltiger Pyd
Das gleiche wird passieren, wenn Sie eine <abbr title='Eine Union mehrerer Typen bedeutet: โ€žIrgendeiner dieser Typenโ€œ'>Union</abbr> mehrerer Typen haben, und einer oder mehrere sind nicht gรผltige Pydantic-Typen. Zum Beispiel funktioniert folgendes nicht ๐Ÿ’ฅ: Das gleiche wird passieren, wenn Sie eine <abbr title='Eine Union mehrerer Typen bedeutet: โ€žIrgendeiner dieser Typenโ€œ'>Union</abbr> mehrerer Typen haben, und einer oder mehrere sind nicht gรผltige Pydantic-Typen. Zum Beispiel funktioniert folgendes nicht ๐Ÿ’ฅ:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="8"
{!> ../../../docs_src/response_model/tutorial003_04_py310.py!}
```
////
```Python hl_lines="8" //// tab | Python 3.8+
{!> ../../../docs_src/response_model/tutorial003_04_py310.py!}
```
=== "Python 3.8+" ```Python hl_lines="10"
{!> ../../../docs_src/response_model/tutorial003_04.py!}
```
```Python hl_lines="10" ////
{!> ../../../docs_src/response_model/tutorial003_04.py!}
```
... das scheitert, da die Typannotation kein Pydantic-Typ ist, und auch keine einzelne `Response`-Klasse, oder -Unterklasse, es ist eine Union (eines von beiden) von `Response` und `dict`. ... das scheitert, da die Typannotation kein Pydantic-Typ ist, und auch keine einzelne `Response`-Klasse, oder -Unterklasse, es ist eine Union (eines von beiden) von `Response` und `dict`.
@ -300,17 +352,21 @@ Aber Sie mรถchten dennoch den Rรผckgabetyp in der Funktion annotieren, um Unters
In diesem Fall kรถnnen Sie die Generierung des Responsemodells abschalten, indem Sie `response_model=None` setzen: In diesem Fall kรถnnen Sie die Generierung des Responsemodells abschalten, indem Sie `response_model=None` setzen:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="7" ```Python hl_lines="7"
{!> ../../../docs_src/response_model/tutorial003_05_py310.py!} {!> ../../../docs_src/response_model/tutorial003_05_py310.py!}
``` ```
////
=== "Python 3.8+" //// tab | Python 3.8+
```Python hl_lines="9" ```Python hl_lines="9"
{!> ../../../docs_src/response_model/tutorial003_05.py!} {!> ../../../docs_src/response_model/tutorial003_05.py!}
``` ```
////
Das bewirkt, dass FastAPI die Generierung des Responsemodells unterlรคsst, und damit kรถnnen Sie jede gewรผnschte Rรผckgabetyp-Annotation haben, ohne dass es Ihre FastAPI-Anwendung beeinflusst. ๐Ÿค“ Das bewirkt, dass FastAPI die Generierung des Responsemodells unterlรคsst, und damit kรถnnen Sie jede gewรผnschte Rรผckgabetyp-Annotation haben, ohne dass es Ihre FastAPI-Anwendung beeinflusst. ๐Ÿค“
@ -318,23 +374,29 @@ Das bewirkt, dass FastAPI die Generierung des Responsemodells unterlรคsst, und d
Ihr Responsemodell kรถnnte Defaultwerte haben, wie: Ihr Responsemodell kรถnnte Defaultwerte haben, wie:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="9 11-12" ```Python hl_lines="9 11-12"
{!> ../../../docs_src/response_model/tutorial004_py310.py!} {!> ../../../docs_src/response_model/tutorial004_py310.py!}
``` ```
=== "Python 3.9+" ////
```Python hl_lines="11 13-14" //// tab | Python 3.9+
{!> ../../../docs_src/response_model/tutorial004_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="11 13-14"
{!> ../../../docs_src/response_model/tutorial004_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="11 13-14"
{!> ../../../docs_src/response_model/tutorial004.py!}
```
```Python hl_lines="11 13-14" ////
{!> ../../../docs_src/response_model/tutorial004.py!}
```
* `description: Union[str, None] = None` (oder `str | None = None` in Python 3.10) hat einen Defaultwert `None`. * `description: Union[str, None] = None` (oder `str | None = None` in Python 3.10) hat einen Defaultwert `None`.
* `tax: float = 10.5` hat einen Defaultwert `10.5`. * `tax: float = 10.5` hat einen Defaultwert `10.5`.
@ -348,23 +410,29 @@ Wenn Sie zum Beispiel Modelle mit vielen optionalen Attributen in einer NoSQL-Da
Sie kรถnnen den *Pfadoperation-Dekorator*-Parameter `response_model_exclude_unset=True` setzen: Sie kรถnnen den *Pfadoperation-Dekorator*-Parameter `response_model_exclude_unset=True` setzen:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="22" ```Python hl_lines="22"
{!> ../../../docs_src/response_model/tutorial004_py310.py!} {!> ../../../docs_src/response_model/tutorial004_py310.py!}
``` ```
////
//// tab | Python 3.9+
```Python hl_lines="24"
{!> ../../../docs_src/response_model/tutorial004_py39.py!}
```
=== "Python 3.9+" ////
```Python hl_lines="24" //// tab | Python 3.8+
{!> ../../../docs_src/response_model/tutorial004_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="24"
{!> ../../../docs_src/response_model/tutorial004.py!}
```
```Python hl_lines="24" ////
{!> ../../../docs_src/response_model/tutorial004.py!}
```
Die Defaultwerte werden dann nicht in der Response enthalten sein, sondern nur die tatsรคchlich gesetzten Werte. Die Defaultwerte werden dann nicht in der Response enthalten sein, sondern nur die tatsรคchlich gesetzten Werte.
@ -377,21 +445,30 @@ Wenn Sie also den Artikel mit der ID `foo` bei der *Pfadoperation* anfragen, wir
} }
``` ```
!!! info /// info
In Pydantic v1 hieรŸ diese Methode `.dict()`, in Pydantic v2 wurde sie deprecated (aber immer noch unterstรผtzt) und in `.model_dump()` umbenannt.
In Pydantic v1 hieรŸ diese Methode `.dict()`, in Pydantic v2 wurde sie deprecated (aber immer noch unterstรผtzt) und in `.model_dump()` umbenannt.
Die Beispiele hier verwenden `.dict()` fรผr die Kompatibilitรคt mit Pydantic v1, Sie sollten jedoch stattdessen `.model_dump()` verwenden, wenn Sie Pydantic v2 verwenden kรถnnen.
///
/// info
FastAPI verwendet `.dict()` von Pydantic Modellen, <a href="https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict" class="external-link" target="_blank">mit dessen `exclude_unset`-Parameter</a>, um das zu erreichen.
Die Beispiele hier verwenden `.dict()` fรผr die Kompatibilitรคt mit Pydantic v1, Sie sollten jedoch stattdessen `.model_dump()` verwenden, wenn Sie Pydantic v2 verwenden kรถnnen. ///
!!! info /// info
FastAPI verwendet `.dict()` von Pydantic Modellen, <a href="https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict" class="external-link" target="_blank">mit dessen `exclude_unset`-Parameter</a>, um das zu erreichen.
!!! info Sie kรถnnen auch:
Sie kรถnnen auch:
* `response_model_exclude_defaults=True` * `response_model_exclude_defaults=True`
* `response_model_exclude_none=True` * `response_model_exclude_none=True`
verwenden, wie in der <a href="https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict" class="external-link" target="_blank">Pydantic Dokumentation</a> fรผr `exclude_defaults` und `exclude_none` beschrieben. verwenden, wie in der <a href="https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict" class="external-link" target="_blank">Pydantic Dokumentation</a> fรผr `exclude_defaults` und `exclude_none` beschrieben.
///
#### Daten mit Werten fรผr Felder mit Defaultwerten #### Daten mit Werten fรผr Felder mit Defaultwerten
@ -426,10 +503,13 @@ dann ist FastAPI klug genug (tatsรคchlich ist Pydantic klug genug) zu erkennen,
Diese Felder werden also in der JSON-Response enthalten sein. Diese Felder werden also in der JSON-Response enthalten sein.
!!! tip "Tipp" /// tip | "Tipp"
Beachten Sie, dass Defaultwerte alles Mรถgliche sein kรถnnen, nicht nur `None`.
Beachten Sie, dass Defaultwerte alles Mรถgliche sein kรถnnen, nicht nur `None`.
Sie kรถnnen eine Liste (`[]`), ein `float` `10.5`, usw. sein.
Sie kรถnnen eine Liste (`[]`), ein `float` `10.5`, usw. sein. ///
### `response_model_include` und `response_model_exclude` ### `response_model_include` und `response_model_exclude`
@ -439,45 +519,59 @@ Diese nehmen ein `set` von `str`s entgegen, welches Namen von Attributen sind, d
Das kann als schnelle Abkรผrzung verwendet werden, wenn Sie nur ein Pydantic-Modell haben und ein paar Daten von der Ausgabe ausschlieรŸen wollen. Das kann als schnelle Abkรผrzung verwendet werden, wenn Sie nur ein Pydantic-Modell haben und ein paar Daten von der Ausgabe ausschlieรŸen wollen.
!!! tip "Tipp" /// tip | "Tipp"
Es wird dennoch empfohlen, dass Sie die Ideen von oben verwenden, also mehrere Klassen statt dieser Parameter.
Der Grund ist, dass das das generierte JSON-Schema in der OpenAPI ihrer Anwendung (und deren Dokumentation) dennoch das komplette Modell abbildet, selbst wenn Sie `response_model_include` oder `response_model_exclude` verwenden, um einige Attribute auszuschlieรŸen. Es wird dennoch empfohlen, dass Sie die Ideen von oben verwenden, also mehrere Klassen statt dieser Parameter.
Das trifft auch auf `response_model_by_alias` zu, welches รคhnlich funktioniert. Der Grund ist, dass das das generierte JSON-Schema in der OpenAPI ihrer Anwendung (und deren Dokumentation) dennoch das komplette Modell abbildet, selbst wenn Sie `response_model_include` oder `response_model_exclude` verwenden, um einige Attribute auszuschlieรŸen.
=== "Python 3.10+" Das trifft auch auf `response_model_by_alias` zu, welches รคhnlich funktioniert.
```Python hl_lines="29 35" ///
{!> ../../../docs_src/response_model/tutorial005_py310.py!}
```
=== "Python 3.8+" //// tab | Python 3.10+
```Python hl_lines="31 37" ```Python hl_lines="29 35"
{!> ../../../docs_src/response_model/tutorial005.py!} {!> ../../../docs_src/response_model/tutorial005_py310.py!}
``` ```
!!! tip "Tipp" ////
Die Syntax `{"name", "description"}` erzeugt ein `set` mit diesen zwei Werten.
ร„quivalent zu `set(["name", "description"])`. //// tab | Python 3.8+
```Python hl_lines="31 37"
{!> ../../../docs_src/response_model/tutorial005.py!}
```
////
/// tip | "Tipp"
Die Syntax `{"name", "description"}` erzeugt ein `set` mit diesen zwei Werten.
ร„quivalent zu `set(["name", "description"])`.
///
#### `list`en statt `set`s verwenden #### `list`en statt `set`s verwenden
Wenn Sie vergessen, ein `set` zu verwenden, und stattdessen eine `list`e oder ein `tuple` รผbergeben, wird FastAPI die dennoch in ein `set` konvertieren, und es wird korrekt funktionieren: Wenn Sie vergessen, ein `set` zu verwenden, und stattdessen eine `list`e oder ein `tuple` รผbergeben, wird FastAPI die dennoch in ein `set` konvertieren, und es wird korrekt funktionieren:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="29 35"
{!> ../../../docs_src/response_model/tutorial006_py310.py!}
```
```Python hl_lines="29 35" ////
{!> ../../../docs_src/response_model/tutorial006_py310.py!}
```
=== "Python 3.8+" //// tab | Python 3.8+
```Python hl_lines="31 37"
{!> ../../../docs_src/response_model/tutorial006.py!}
```
```Python hl_lines="31 37" ////
{!> ../../../docs_src/response_model/tutorial006.py!}
```
## Zusammenfassung ## Zusammenfassung

46
docs/de/docs/tutorial/response-status-code.md

@ -12,13 +12,19 @@ So wie ein Responsemodell, kรถnnen Sie auch einen HTTP-Statuscode fรผr die Respo
{!../../../docs_src/response_status_code/tutorial001.py!} {!../../../docs_src/response_status_code/tutorial001.py!}
``` ```
!!! note "Hinweis" /// note | "Hinweis"
Beachten Sie, dass `status_code` ein Parameter der โ€žDekoratorโ€œ-Methode ist (`get`, `post`, usw.). Nicht der *Pfadoperation-Funktion*, so wie die anderen Parameter und der Body.
Beachten Sie, dass `status_code` ein Parameter der โ€žDekoratorโ€œ-Methode ist (`get`, `post`, usw.). Nicht der *Pfadoperation-Funktion*, so wie die anderen Parameter und der Body.
///
Dem `status_code`-Parameter wird eine Zahl mit dem HTTP-Statuscode รผbergeben. Dem `status_code`-Parameter wird eine Zahl mit dem HTTP-Statuscode รผbergeben.
!!! info /// info
Alternativ kann `status_code` auch ein `IntEnum` erhalten, so wie Pythons <a href="https://docs.python.org/3/library/http.html#http.HTTPStatus" class="external-link" target="_blank">`http.HTTPStatus`</a>.
Alternativ kann `status_code` auch ein `IntEnum` erhalten, so wie Pythons <a href="https://docs.python.org/3/library/http.html#http.HTTPStatus" class="external-link" target="_blank">`http.HTTPStatus`</a>.
///
Das wird: Das wird:
@ -27,15 +33,21 @@ Das wird:
<img src="/img/tutorial/response-status-code/image01.png"> <img src="/img/tutorial/response-status-code/image01.png">
!!! note "Hinweis" /// note | "Hinweis"
Einige Responsecodes (siehe nรคchster Abschnitt) kennzeichnen, dass die Response keinen Body hat.
Einige Responsecodes (siehe nรคchster Abschnitt) kennzeichnen, dass die Response keinen Body hat.
FastAPI versteht das und wird in der OpenAPI-Dokumentation anzeigen, dass es keinen Responsebody gibt.
FastAPI versteht das und wird in der OpenAPI-Dokumentation anzeigen, dass es keinen Responsebody gibt. ///
## รœber HTTP-Statuscodes ## รœber HTTP-Statuscodes
!!! note "Hinweis" /// note | "Hinweis"
Wenn Sie bereits wissen, was HTTP-Statuscodes sind, รผberspringen Sie dieses Kapitel und fahren Sie mit dem nรคchsten fort.
Wenn Sie bereits wissen, was HTTP-Statuscodes sind, รผberspringen Sie dieses Kapitel und fahren Sie mit dem nรคchsten fort.
///
In HTTP senden Sie als Teil der Response einen aus drei Ziffern bestehenden numerischen Statuscode. In HTTP senden Sie als Teil der Response einen aus drei Ziffern bestehenden numerischen Statuscode.
@ -54,8 +66,11 @@ Kurz:
* Fรผr allgemeine Fehler beim Client kรถnnen Sie einfach `400` verwenden. * Fรผr allgemeine Fehler beim Client kรถnnen Sie einfach `400` verwenden.
* `500` und darรผber stehen fรผr Server-Fehler. Diese verwenden Sie fast nie direkt. Wenn etwas an irgendeiner Stelle in Ihrem Anwendungscode oder im Server schieflรคuft, wird automatisch einer dieser Fehler-Statuscodes zurรผckgegeben. * `500` und darรผber stehen fรผr Server-Fehler. Diese verwenden Sie fast nie direkt. Wenn etwas an irgendeiner Stelle in Ihrem Anwendungscode oder im Server schieflรคuft, wird automatisch einer dieser Fehler-Statuscodes zurรผckgegeben.
!!! tip "Tipp" /// tip | "Tipp"
Um mehr รผber Statuscodes zu lernen, und welcher wofรผr verwendet wird, lesen Sie die <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status" class="external-link" target="_blank"><abbr title="Mozilla Developer Network โ€“ Mozilla-Entwickler-Netzwerk">MDN</abbr> Dokumentation รผber HTTP-Statuscodes</a>.
Um mehr รผber Statuscodes zu lernen, und welcher wofรผr verwendet wird, lesen Sie die <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status" class="external-link" target="_blank"><abbr title="Mozilla Developer Network โ€“ Mozilla-Entwickler-Netzwerk">MDN</abbr> Dokumentation รผber HTTP-Statuscodes</a>.
///
## Abkรผrzung, um die Namen zu erinnern ## Abkรผrzung, um die Namen zu erinnern
@ -79,10 +94,13 @@ Diese sind nur eine Annehmlichkeit und enthalten dieselbe Nummer, aber auf diese
<img src="/img/tutorial/response-status-code/image02.png"> <img src="/img/tutorial/response-status-code/image02.png">
!!! note "Technische Details" /// note | "Technische Details"
Sie kรถnnen auch `from starlette import status` verwenden.
Sie kรถnnen auch `from starlette import status` verwenden.
**FastAPI** bietet dieselben `starlette.status`-Codes auch via `fastapi.status` an, als Annehmlichkeit fรผr Sie, den Entwickler. Sie kommen aber direkt von Starlette.
**FastAPI** bietet dieselben `starlette.status`-Codes auch via `fastapi.status` an, als Annehmlichkeit fรผr Sie, den Entwickler. Sie kommen aber direkt von Starlette. ///
## Den Defaultwert รคndern ## Den Defaultwert รคndern

324
docs/de/docs/tutorial/schema-extra-example.md

@ -8,71 +8,93 @@ Hier sind mehrere Mรถglichkeiten, das zu tun.
Sie kรถnnen `examples` (โ€žBeispieleโ€œ) fรผr ein Pydantic-Modell deklarieren, welche dem generierten JSON-Schema hinzugefรผgt werden. Sie kรถnnen `examples` (โ€žBeispieleโ€œ) fรผr ein Pydantic-Modell deklarieren, welche dem generierten JSON-Schema hinzugefรผgt werden.
=== "Python 3.10+ Pydantic v2" //// tab | Python 3.10+ Pydantic v2
```Python hl_lines="13-24" ```Python hl_lines="13-24"
{!> ../../../docs_src/schema_extra_example/tutorial001_py310.py!} {!> ../../../docs_src/schema_extra_example/tutorial001_py310.py!}
``` ```
=== "Python 3.10+ Pydantic v1" ////
```Python hl_lines="13-23" //// tab | Python 3.10+ Pydantic v1
{!> ../../../docs_src/schema_extra_example/tutorial001_py310_pv1.py!}
```
=== "Python 3.8+ Pydantic v2" ```Python hl_lines="13-23"
{!> ../../../docs_src/schema_extra_example/tutorial001_py310_pv1.py!}
```
```Python hl_lines="15-26" ////
{!> ../../../docs_src/schema_extra_example/tutorial001.py!}
```
=== "Python 3.8+ Pydantic v1" //// tab | Python 3.8+ Pydantic v2
```Python hl_lines="15-25" ```Python hl_lines="15-26"
{!> ../../../docs_src/schema_extra_example/tutorial001_pv1.py!} {!> ../../../docs_src/schema_extra_example/tutorial001.py!}
``` ```
////
//// tab | Python 3.8+ Pydantic v1
```Python hl_lines="15-25"
{!> ../../../docs_src/schema_extra_example/tutorial001_pv1.py!}
```
////
Diese zusรคtzlichen Informationen werden unverรคndert zum fรผr dieses Modell ausgegebenen **JSON-Schema** hinzugefรผgt und in der API-Dokumentation verwendet. Diese zusรคtzlichen Informationen werden unverรคndert zum fรผr dieses Modell ausgegebenen **JSON-Schema** hinzugefรผgt und in der API-Dokumentation verwendet.
=== "Pydantic v2" //// tab | Pydantic v2
In Pydantic Version 2 wรผrden Sie das Attribut `model_config` verwenden, das ein `dict` akzeptiert, wie beschrieben in <a href="https://docs.pydantic.dev/latest/api/config/" class="external-link" target="_blank">Pydantic-Dokumentation: Configuration</a>.
Sie kรถnnen `json_schema_extra` setzen, mit einem `dict`, das alle zusรคtzlichen Daten enthรคlt, die im generierten JSON-Schema angezeigt werden sollen, einschlieรŸlich `examples`.
In Pydantic Version 2 wรผrden Sie das Attribut `model_config` verwenden, das ein `dict` akzeptiert, wie beschrieben in <a href="https://docs.pydantic.dev/latest/api/config/" class="external-link" target="_blank">Pydantic-Dokumentation: Configuration</a>. ////
Sie kรถnnen `json_schema_extra` setzen, mit einem `dict`, das alle zusรคtzlichen Daten enthรคlt, die im generierten JSON-Schema angezeigt werden sollen, einschlieรŸlich `examples`. //// tab | Pydantic v1
=== "Pydantic v1" In Pydantic Version 1 wรผrden Sie eine interne Klasse `Config` und `schema_extra` verwenden, wie beschrieben in <a href="https://docs.pydantic.dev/1.10/usage/schema/#schema-customization" class="external-link" target="_blank">Pydantic-Dokumentation: Schema customization</a>.
In Pydantic Version 1 wรผrden Sie eine interne Klasse `Config` und `schema_extra` verwenden, wie beschrieben in <a href="https://docs.pydantic.dev/1.10/usage/schema/#schema-customization" class="external-link" target="_blank">Pydantic-Dokumentation: Schema customization</a>. Sie kรถnnen `schema_extra` setzen, mit einem `dict`, das alle zusรคtzlichen Daten enthรคlt, die im generierten JSON-Schema angezeigt werden sollen, einschlieรŸlich `examples`.
Sie kรถnnen `schema_extra` setzen, mit einem `dict`, das alle zusรคtzlichen Daten enthรคlt, die im generierten JSON-Schema angezeigt werden sollen, einschlieรŸlich `examples`. ////
!!! tip "Tipp" /// tip | "Tipp"
Mit derselben Technik kรถnnen Sie das JSON-Schema erweitern und Ihre eigenen benutzerdefinierten Zusatzinformationen hinzufรผgen.
Sie kรถnnten das beispielsweise verwenden, um Metadaten fรผr eine Frontend-Benutzeroberflรคche usw. hinzuzufรผgen. Mit derselben Technik kรถnnen Sie das JSON-Schema erweitern und Ihre eigenen benutzerdefinierten Zusatzinformationen hinzufรผgen.
!!! info Sie kรถnnten das beispielsweise verwenden, um Metadaten fรผr eine Frontend-Benutzeroberflรคche usw. hinzuzufรผgen.
OpenAPI 3.1.0 (verwendet seit FastAPI 0.99.0) hat Unterstรผtzung fรผr `examples` hinzugefรผgt, was Teil des **JSON Schema** Standards ist.
Zuvor unterstรผtzte es nur das Schlรผsselwort `example` mit einem einzigen Beispiel. Dieses wird weiterhin von OpenAPI 3.1.0 unterstรผtzt, ist jedoch <abbr title="deprecated โ€“ obsolet, veraltet: Es soll nicht mehr verwendet werden">deprecated</abbr> und nicht Teil des JSON Schema Standards. Wir empfehlen Ihnen daher, von `example` nach `examples` zu migrieren. ๐Ÿค“ ///
Mehr erfahren Sie am Ende dieser Seite. /// info
OpenAPI 3.1.0 (verwendet seit FastAPI 0.99.0) hat Unterstรผtzung fรผr `examples` hinzugefรผgt, was Teil des **JSON Schema** Standards ist.
Zuvor unterstรผtzte es nur das Schlรผsselwort `example` mit einem einzigen Beispiel. Dieses wird weiterhin von OpenAPI 3.1.0 unterstรผtzt, ist jedoch <abbr title="deprecated โ€“ obsolet, veraltet: Es soll nicht mehr verwendet werden">deprecated</abbr> und nicht Teil des JSON Schema Standards. Wir empfehlen Ihnen daher, von `example` nach `examples` zu migrieren. ๐Ÿค“
Mehr erfahren Sie am Ende dieser Seite.
///
## Zusรคtzliche Argumente fรผr `Field` ## Zusรคtzliche Argumente fรผr `Field`
Wenn Sie `Field()` mit Pydantic-Modellen verwenden, kรถnnen Sie ebenfalls zusรคtzliche `examples` deklarieren: Wenn Sie `Field()` mit Pydantic-Modellen verwenden, kรถnnen Sie ebenfalls zusรคtzliche `examples` deklarieren:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="2 8-11"
{!> ../../../docs_src/schema_extra_example/tutorial002_py310.py!}
```
////
```Python hl_lines="2 8-11" //// tab | Python 3.8+
{!> ../../../docs_src/schema_extra_example/tutorial002_py310.py!}
```
=== "Python 3.8+" ```Python hl_lines="4 10-13"
{!> ../../../docs_src/schema_extra_example/tutorial002.py!}
```
```Python hl_lines="4 10-13" ////
{!> ../../../docs_src/schema_extra_example/tutorial002.py!}
```
## `examples` im JSON-Schema โ€“ OpenAPI ## `examples` im JSON-Schema โ€“ OpenAPI
@ -92,41 +114,57 @@ kรถnnen Sie auch eine Gruppe von `examples` mit zusรคtzlichen Informationen dekl
Hier รผbergeben wir `examples`, welches ein einzelnes Beispiel fรผr die in `Body()` erwarteten Daten enthรคlt: Hier รผbergeben wir `examples`, welches ein einzelnes Beispiel fรผr die in `Body()` erwarteten Daten enthรคlt:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="22-29" ```Python hl_lines="22-29"
{!> ../../../docs_src/schema_extra_example/tutorial003_an_py310.py!} {!> ../../../docs_src/schema_extra_example/tutorial003_an_py310.py!}
``` ```
=== "Python 3.9+" ////
```Python hl_lines="22-29" //// tab | Python 3.9+
{!> ../../../docs_src/schema_extra_example/tutorial003_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="22-29"
{!> ../../../docs_src/schema_extra_example/tutorial003_an_py39.py!}
```
```Python hl_lines="23-30" ////
{!> ../../../docs_src/schema_extra_example/tutorial003_an.py!}
```
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.8+
!!! tip "Tipp" ```Python hl_lines="23-30"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/schema_extra_example/tutorial003_an.py!}
```
```Python hl_lines="18-25" ////
{!> ../../../docs_src/schema_extra_example/tutorial003_py310.py!}
```
=== "Python 3.8+ nicht annotiert" //// tab | Python 3.10+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="20-27" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/schema_extra_example/tutorial003.py!}
``` ///
```Python hl_lines="18-25"
{!> ../../../docs_src/schema_extra_example/tutorial003_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="20-27"
{!> ../../../docs_src/schema_extra_example/tutorial003.py!}
```
////
### Beispiel in der Dokumentations-Benutzeroberflรคche ### Beispiel in der Dokumentations-Benutzeroberflรคche
@ -138,41 +176,57 @@ Mit jeder der oben genannten Methoden wรผrde es in `/docs` so aussehen:
Sie kรถnnen natรผrlich auch mehrere `examples` รผbergeben: Sie kรถnnen natรผrlich auch mehrere `examples` รผbergeben:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="23-38"
{!> ../../../docs_src/schema_extra_example/tutorial004_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="23-38" ```Python hl_lines="23-38"
{!> ../../../docs_src/schema_extra_example/tutorial004_an_py310.py!} {!> ../../../docs_src/schema_extra_example/tutorial004_an_py39.py!}
``` ```
=== "Python 3.9+" ////
```Python hl_lines="23-38" //// tab | Python 3.8+
{!> ../../../docs_src/schema_extra_example/tutorial004_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="24-39"
{!> ../../../docs_src/schema_extra_example/tutorial004_an.py!}
```
```Python hl_lines="24-39" ////
{!> ../../../docs_src/schema_extra_example/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.
```Python hl_lines="19-34" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/schema_extra_example/tutorial004_py310.py!}
```
=== "Python 3.8+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="19-34"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/schema_extra_example/tutorial004_py310.py!}
```
```Python hl_lines="21-36" ////
{!> ../../../docs_src/schema_extra_example/tutorial004.py!}
``` //// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="21-36"
{!> ../../../docs_src/schema_extra_example/tutorial004.py!}
```
////
Wenn Sie das tun, werden die Beispiele Teil des internen **JSON-Schemas** fรผr diese Body-Daten. Wenn Sie das tun, werden die Beispiele Teil des internen **JSON-Schemas** fรผr diese Body-Daten.
@ -213,41 +267,57 @@ Jedes spezifische Beispiel-`dict` in den `examples` kann Folgendes enthalten:
Sie kรถnnen es so verwenden: Sie kรถnnen es so verwenden:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="23-49"
{!> ../../../docs_src/schema_extra_example/tutorial005_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="23-49"
{!> ../../../docs_src/schema_extra_example/tutorial005_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="23-49" ```Python hl_lines="24-50"
{!> ../../../docs_src/schema_extra_example/tutorial005_an_py310.py!} {!> ../../../docs_src/schema_extra_example/tutorial005_an.py!}
``` ```
=== "Python 3.9+" ////
```Python hl_lines="23-49" //// tab | Python 3.10+ nicht annotiert
{!> ../../../docs_src/schema_extra_example/tutorial005_an_py39.py!}
```
=== "Python 3.8+" /// tip | "Tipp"
```Python hl_lines="24-50" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/schema_extra_example/tutorial005_an.py!}
```
=== "Python 3.10+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="19-45"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/schema_extra_example/tutorial005_py310.py!}
```
```Python hl_lines="19-45" ////
{!> ../../../docs_src/schema_extra_example/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.
```Python hl_lines="21-47" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/schema_extra_example/tutorial005.py!}
``` ///
```Python hl_lines="21-47"
{!> ../../../docs_src/schema_extra_example/tutorial005.py!}
```
////
### OpenAPI-Beispiele in der Dokumentations-Benutzeroberflรคche ### OpenAPI-Beispiele in der Dokumentations-Benutzeroberflรคche
@ -257,17 +327,23 @@ Wenn `openapi_examples` zu `Body()` hinzugefรผgt wird, wรผrde `/docs` so aussehe
## Technische Details ## Technische Details
!!! tip "Tipp" /// tip | "Tipp"
Wenn Sie bereits **FastAPI** Version **0.99.0 oder hรถher** verwenden, kรถnnen Sie diese Details wahrscheinlich **รผberspringen**.
Wenn Sie bereits **FastAPI** Version **0.99.0 oder hรถher** verwenden, kรถnnen Sie diese Details wahrscheinlich **รผberspringen**.
Sie sind fรผr รคltere Versionen relevanter, bevor OpenAPI 3.1.0 verfรผgbar war.
Sie kรถnnen dies als eine kurze **Geschichtsstunde** zu OpenAPI und JSON Schema betrachten. ๐Ÿค“
Sie sind fรผr รคltere Versionen relevanter, bevor OpenAPI 3.1.0 verfรผgbar war. ///
Sie kรถnnen dies als eine kurze **Geschichtsstunde** zu OpenAPI und JSON Schema betrachten. ๐Ÿค“ /// warning | "Achtung"
!!! warning "Achtung" Dies sind sehr technische Details zu den Standards **JSON Schema** und **OpenAPI**.
Dies sind sehr technische Details zu den Standards **JSON Schema** und **OpenAPI**.
Wenn die oben genannten Ideen bereits fรผr Sie funktionieren, reicht das mรถglicherweise aus und Sie benรถtigen diese Details wahrscheinlich nicht, รผberspringen Sie sie gerne. Wenn die oben genannten Ideen bereits fรผr Sie funktionieren, reicht das mรถglicherweise aus und Sie benรถtigen diese Details wahrscheinlich nicht, รผberspringen Sie sie gerne.
///
Vor OpenAPI 3.1.0 verwendete OpenAPI eine รคltere und modifizierte Version von **JSON Schema**. Vor OpenAPI 3.1.0 verwendete OpenAPI eine รคltere und modifizierte Version von **JSON Schema**.
@ -285,8 +361,11 @@ OpenAPI fรผgte auch die Felder `example` und `examples` zu anderen Teilen der Sp
* `File()` * `File()`
* `Form()` * `Form()`
!!! info /// info
Dieser alte, OpenAPI-spezifische `examples`-Parameter heiรŸt seit FastAPI `0.103.0` jetzt `openapi_examples`.
Dieser alte, OpenAPI-spezifische `examples`-Parameter heiรŸt seit FastAPI `0.103.0` jetzt `openapi_examples`.
///
### JSON Schemas Feld `examples` ### JSON Schemas Feld `examples`
@ -298,10 +377,13 @@ Und jetzt hat dieses neue `examples`-Feld Vorrang vor dem alten (und benutzerdef
Dieses neue `examples`-Feld in JSON Schema ist **nur eine `list`e** von Beispielen, kein Dict mit zusรคtzlichen Metadaten wie an den anderen Stellen in OpenAPI (oben beschrieben). Dieses neue `examples`-Feld in JSON Schema ist **nur eine `list`e** von Beispielen, kein Dict mit zusรคtzlichen Metadaten wie an den anderen Stellen in OpenAPI (oben beschrieben).
!!! info /// info
Selbst, nachdem OpenAPI 3.1.0 verรถffentlicht wurde, mit dieser neuen, einfacheren Integration mit JSON Schema, unterstรผtzte Swagger UI, das Tool, das die automatische Dokumentation bereitstellt, eine Zeit lang OpenAPI 3.1.0 nicht (das tut es seit Version 5.0.0 ๐ŸŽ‰).
Selbst, nachdem OpenAPI 3.1.0 verรถffentlicht wurde, mit dieser neuen, einfacheren Integration mit JSON Schema, unterstรผtzte Swagger UI, das Tool, das die automatische Dokumentation bereitstellt, eine Zeit lang OpenAPI 3.1.0 nicht (das tut es seit Version 5.0.0 ๐ŸŽ‰).
Aus diesem Grund verwendeten Versionen von FastAPI vor 0.99.0 immer noch Versionen von OpenAPI vor 3.1.0.
Aus diesem Grund verwendeten Versionen von FastAPI vor 0.99.0 immer noch Versionen von OpenAPI vor 3.1.0. ///
### Pydantic- und FastAPI-`examples` ### Pydantic- und FastAPI-`examples`

180
docs/de/docs/tutorial/security/first-steps.md

@ -20,35 +20,47 @@ Lassen Sie uns zunรคchst einfach den Code verwenden und sehen, wie er funktionie
Kopieren Sie das Beispiel in eine Datei `main.py`: Kopieren Sie das Beispiel in eine Datei `main.py`:
=== "Python 3.9+" //// tab | Python 3.9+
```Python ```Python
{!> ../../../docs_src/security/tutorial001_an_py39.py!} {!> ../../../docs_src/security/tutorial001_an_py39.py!}
``` ```
////
=== "Python 3.8+" //// tab | Python 3.8+
```Python
{!> ../../../docs_src/security/tutorial001_an.py!}
```
```Python ////
{!> ../../../docs_src/security/tutorial001_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
{!> ../../../docs_src/security/tutorial001.py!}
```
```Python ////
{!> ../../../docs_src/security/tutorial001.py!}
```
## Ausfรผhren ## Ausfรผhren
!!! info /// info
Um hochgeladene Dateien zu empfangen, installieren Sie zuerst <a href="https://andrew-d.github.io/python-multipart/" class="external-link" target="_blank">`python-multipart`</a>.
Z. B. `pip install python-multipart`. Um hochgeladene Dateien zu empfangen, installieren Sie zuerst <a href="https://andrew-d.github.io/python-multipart/" class="external-link" target="_blank">`python-multipart`</a>.
Das, weil **OAuth2** โ€žFormulardatenโ€œ zum Senden von `username` und `password` verwendet. Z. B. `pip install python-multipart`.
Das, weil **OAuth2** โ€žFormulardatenโ€œ zum Senden von `username` und `password` verwendet.
///
Fรผhren Sie das Beispiel aus mit: Fรผhren Sie das Beispiel aus mit:
@ -70,17 +82,23 @@ Sie werden etwa Folgendes sehen:
<img src="/img/tutorial/security/image01.png"> <img src="/img/tutorial/security/image01.png">
!!! check "Authorize-Button!" /// check | "Authorize-Button!"
Sie haben bereits einen glรคnzenden, neuen โ€žAuthorizeโ€œ-Button.
Sie haben bereits einen glรคnzenden, neuen โ€žAuthorizeโ€œ-Button.
Und Ihre *Pfadoperation* hat in der oberen rechten Ecke ein kleines Schloss, auf das Sie klicken kรถnnen. Und Ihre *Pfadoperation* hat in der oberen rechten Ecke ein kleines Schloss, auf das Sie klicken kรถnnen.
///
Und wenn Sie darauf klicken, erhalten Sie ein kleines Anmeldeformular zur Eingabe eines `username` und `password` (und anderer optionaler Felder): Und wenn Sie darauf klicken, erhalten Sie ein kleines Anmeldeformular zur Eingabe eines `username` und `password` (und anderer optionaler Felder):
<img src="/img/tutorial/security/image02.png"> <img src="/img/tutorial/security/image02.png">
!!! note "Hinweis" /// note | "Hinweis"
Es spielt keine Rolle, was Sie in das Formular eingeben, es wird noch nicht funktionieren. Wir kommen dahin.
Es spielt keine Rolle, was Sie in das Formular eingeben, es wird noch nicht funktionieren. Wir kommen dahin.
///
Dies ist natรผrlich nicht das Frontend fรผr die Endbenutzer, aber es ist ein groรŸartiges automatisches Tool, um Ihre gesamte API interaktiv zu dokumentieren. Dies ist natรผrlich nicht das Frontend fรผr die Endbenutzer, aber es ist ein groรŸartiges automatisches Tool, um Ihre gesamte API interaktiv zu dokumentieren.
@ -122,53 +140,71 @@ Betrachten wir es also aus dieser vereinfachten Sicht:
In diesem Beispiel verwenden wir **OAuth2** mit dem **Password**-Flow und einem **Bearer**-Token. Wir machen das mit der Klasse `OAuth2PasswordBearer`. In diesem Beispiel verwenden wir **OAuth2** mit dem **Password**-Flow und einem **Bearer**-Token. Wir machen das mit der Klasse `OAuth2PasswordBearer`.
!!! info /// info
Ein โ€žBearerโ€œ-Token ist nicht die einzige Option.
Ein โ€žBearerโ€œ-Token ist nicht die einzige Option.
Aber es ist die beste fรผr unseren Anwendungsfall.
Aber es ist die beste fรผr unseren Anwendungsfall. Und es ist wahrscheinlich auch fรผr die meisten anderen Anwendungsfรคlle die beste, es sei denn, Sie sind ein OAuth2-Experte und wissen genau, warum es eine andere Option gibt, die Ihren Anforderungen besser entspricht.
Und es ist wahrscheinlich auch fรผr die meisten anderen Anwendungsfรคlle die beste, es sei denn, Sie sind ein OAuth2-Experte und wissen genau, warum es eine andere Option gibt, die Ihren Anforderungen besser entspricht. In dem Fall gibt Ihnen **FastAPI** ebenfalls die Tools, die Sie zum Erstellen brauchen.
In dem Fall gibt Ihnen **FastAPI** ebenfalls die Tools, die Sie zum Erstellen brauchen. ///
Wenn wir eine Instanz der Klasse `OAuth2PasswordBearer` erstellen, รผbergeben wir den Parameter `tokenUrl`. Dieser Parameter enthรคlt die URL, die der Client (das Frontend, das im Browser des Benutzers ausgefรผhrt wird) verwendet, wenn er den `username` und das `password` sendet, um einen Token zu erhalten. Wenn wir eine Instanz der Klasse `OAuth2PasswordBearer` erstellen, รผbergeben wir den Parameter `tokenUrl`. Dieser Parameter enthรคlt die URL, die der Client (das Frontend, das im Browser des Benutzers ausgefรผhrt wird) verwendet, wenn er den `username` und das `password` sendet, um einen Token zu erhalten.
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="8" ```Python hl_lines="8"
{!> ../../../docs_src/security/tutorial001_an_py39.py!} {!> ../../../docs_src/security/tutorial001_an_py39.py!}
``` ```
=== "Python 3.8+" ////
```Python hl_lines="7" //// tab | Python 3.8+
{!> ../../../docs_src/security/tutorial001_an.py!}
```
=== "Python 3.8+ nicht annotiert" ```Python hl_lines="7"
{!> ../../../docs_src/security/tutorial001_an.py!}
```
!!! tip "Tipp" ////
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="6" //// tab | Python 3.8+ nicht annotiert
{!> ../../../docs_src/security/tutorial001.py!}
```
!!! tip "Tipp" /// tip | "Tipp"
Hier bezieht sich `tokenUrl="token"` auf eine relative URL `token`, die wir noch nicht erstellt haben. Da es sich um eine relative URL handelt, entspricht sie `./token`.
Da wir eine relative URL verwenden, wรผrde sich das, wenn sich Ihre API unter `https://example.com/` befindet, auf `https://example.com/token` beziehen. Wenn sich Ihre API jedoch unter `https://example.com/api/v1/` befรคnde, wรผrde es sich auf `https://example.com/api/v1/token` beziehen. Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
Die Verwendung einer relativen URL ist wichtig, um sicherzustellen, dass Ihre Anwendung auch in einem fortgeschrittenen Anwendungsfall, wie [hinter einem Proxy](../../advanced/behind-a-proxy.md){.internal-link target=_blank}, weiterhin funktioniert. ///
```Python hl_lines="6"
{!> ../../../docs_src/security/tutorial001.py!}
```
////
/// tip | "Tipp"
Hier bezieht sich `tokenUrl="token"` auf eine relative URL `token`, die wir noch nicht erstellt haben. Da es sich um eine relative URL handelt, entspricht sie `./token`.
Da wir eine relative URL verwenden, wรผrde sich das, wenn sich Ihre API unter `https://example.com/` befindet, auf `https://example.com/token` beziehen. Wenn sich Ihre API jedoch unter `https://example.com/api/v1/` befรคnde, wรผrde es sich auf `https://example.com/api/v1/token` beziehen.
Die Verwendung einer relativen URL ist wichtig, um sicherzustellen, dass Ihre Anwendung auch in einem fortgeschrittenen Anwendungsfall, wie [hinter einem Proxy](../../advanced/behind-a-proxy.md){.internal-link target=_blank}, weiterhin funktioniert.
///
Dieser Parameter erstellt nicht diesen Endpunkt / diese *Pfadoperation*, sondern deklariert, dass die URL `/token` diejenige sein wird, die der Client verwenden soll, um den Token abzurufen. Diese Information wird in OpenAPI und dann in den interaktiven API-Dokumentationssystemen verwendet. Dieser Parameter erstellt nicht diesen Endpunkt / diese *Pfadoperation*, sondern deklariert, dass die URL `/token` diejenige sein wird, die der Client verwenden soll, um den Token abzurufen. Diese Information wird in OpenAPI und dann in den interaktiven API-Dokumentationssystemen verwendet.
Wir werden demnรคchst auch die eigentliche Pfadoperation erstellen. Wir werden demnรคchst auch die eigentliche Pfadoperation erstellen.
!!! info /// info
Wenn Sie ein sehr strenger โ€žPythonistaโ€œ sind, missfรคllt Ihnen mรถglicherweise die Schreibweise des Parameternamens `tokenUrl` anstelle von `token_url`.
Wenn Sie ein sehr strenger โ€žPythonistaโ€œ sind, missfรคllt Ihnen mรถglicherweise die Schreibweise des Parameternamens `tokenUrl` anstelle von `token_url`.
Das liegt daran, dass FastAPI denselben Namen wie in der OpenAPI-Spezifikation verwendet. Sodass Sie, wenn Sie mehr รผber eines dieser Sicherheitsschemas herausfinden mรถchten, den Namen einfach kopieren und einfรผgen kรถnnen, um weitere Informationen darรผber zu erhalten.
Das liegt daran, dass FastAPI denselben Namen wie in der OpenAPI-Spezifikation verwendet. Sodass Sie, wenn Sie mehr รผber eines dieser Sicherheitsschemas herausfinden mรถchten, den Namen einfach kopieren und einfรผgen kรถnnen, um weitere Informationen darรผber zu erhalten. ///
Die Variable `oauth2_scheme` ist eine Instanz von `OAuth2PasswordBearer`, aber auch ein โ€žCallableโ€œ. Die Variable `oauth2_scheme` ist eine Instanz von `OAuth2PasswordBearer`, aber auch ein โ€žCallableโ€œ.
@ -184,35 +220,47 @@ Es kann also mit `Depends` verwendet werden.
Jetzt kรถnnen Sie dieses `oauth2_scheme` als Abhรคngigkeit `Depends` รผbergeben. Jetzt kรถnnen Sie dieses `oauth2_scheme` als Abhรคngigkeit `Depends` รผbergeben.
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="12" ```Python hl_lines="12"
{!> ../../../docs_src/security/tutorial001_an_py39.py!} {!> ../../../docs_src/security/tutorial001_an_py39.py!}
``` ```
////
//// tab | Python 3.8+
```Python hl_lines="11"
{!> ../../../docs_src/security/tutorial001_an.py!}
```
=== "Python 3.8+" ////
```Python hl_lines="11" //// tab | Python 3.8+ nicht annotiert
{!> ../../../docs_src/security/tutorial001_an.py!}
```
=== "Python 3.8+ nicht annotiert" /// tip | "Tipp"
!!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="10" ///
{!> ../../../docs_src/security/tutorial001.py!}
``` ```Python hl_lines="10"
{!> ../../../docs_src/security/tutorial001.py!}
```
////
Diese Abhรคngigkeit stellt einen `str` bereit, der dem Parameter `token` der *Pfadoperation-Funktion* zugewiesen wird. Diese Abhรคngigkeit stellt einen `str` bereit, der dem Parameter `token` der *Pfadoperation-Funktion* zugewiesen wird.
**FastAPI** weiรŸ, dass es diese Abhรคngigkeit verwenden kann, um ein โ€žSicherheitsschemaโ€œ im OpenAPI-Schema (und der automatischen API-Dokumentation) zu definieren. **FastAPI** weiรŸ, dass es diese Abhรคngigkeit verwenden kann, um ein โ€žSicherheitsschemaโ€œ im OpenAPI-Schema (und der automatischen API-Dokumentation) zu definieren.
!!! info "Technische Details" /// info | "Technische Details"
**FastAPI** weiรŸ, dass es die Klasse `OAuth2PasswordBearer` (deklariert in einer Abhรคngigkeit) verwenden kann, um das Sicherheitsschema in OpenAPI zu definieren, da es von `fastapi.security.oauth2.OAuth2` erbt, das wiederum von `fastapi.security.base.SecurityBase` erbt.
**FastAPI** weiรŸ, dass es die Klasse `OAuth2PasswordBearer` (deklariert in einer Abhรคngigkeit) verwenden kann, um das Sicherheitsschema in OpenAPI zu definieren, da es von `fastapi.security.oauth2.OAuth2` erbt, das wiederum von `fastapi.security.base.SecurityBase` erbt.
Alle Sicherheits-Werkzeuge, die in OpenAPI integriert sind (und die automatische API-Dokumentation), erben von `SecurityBase`, so weiรŸ **FastAPI**, wie es sie in OpenAPI integrieren muss.
Alle Sicherheits-Werkzeuge, die in OpenAPI integriert sind (und die automatische API-Dokumentation), erben von `SecurityBase`, so weiรŸ **FastAPI**, wie es sie in OpenAPI integrieren muss. ///
## Was es macht ## Was es macht

375
docs/de/docs/tutorial/security/get-current-user.md

@ -2,26 +2,35 @@
Im vorherigen Kapitel hat das Sicherheitssystem (das auf dem Dependency Injection System basiert) der *Pfadoperation-Funktion* einen `token` vom Typ `str` รผberreicht: Im vorherigen Kapitel hat das Sicherheitssystem (das auf dem Dependency Injection System basiert) der *Pfadoperation-Funktion* einen `token` vom Typ `str` รผberreicht:
=== "Python 3.9+" //// tab | Python 3.9+
```Python hl_lines="12" ```Python hl_lines="12"
{!> ../../../docs_src/security/tutorial001_an_py39.py!} {!> ../../../docs_src/security/tutorial001_an_py39.py!}
``` ```
=== "Python 3.8+" ////
```Python hl_lines="11" //// tab | Python 3.8+
{!> ../../../docs_src/security/tutorial001_an.py!}
```
=== "Python 3.8+ nicht annotiert" ```Python hl_lines="11"
{!> ../../../docs_src/security/tutorial001_an.py!}
```
!!! tip "Tipp" ////
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="10" //// tab | Python 3.8+ nicht annotiert
{!> ../../../docs_src/security/tutorial001.py!}
``` /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="10"
{!> ../../../docs_src/security/tutorial001.py!}
```
////
Aber das ist immer noch nicht so nรผtzlich. Aber das ist immer noch nicht so nรผtzlich.
@ -33,41 +42,57 @@ Erstellen wir zunรคchst ein Pydantic-Benutzermodell.
So wie wir Pydantic zum Deklarieren von Bodys verwenden, kรถnnen wir es auch รผberall sonst verwenden: So wie wir Pydantic zum Deklarieren von Bodys verwenden, kรถnnen wir es auch รผberall sonst verwenden:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="5 12-16"
{!> ../../../docs_src/security/tutorial002_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="5 12-16"
{!> ../../../docs_src/security/tutorial002_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="5 13-17"
{!> ../../../docs_src/security/tutorial002_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
```Python hl_lines="5 12-16" /// tip | "Tipp"
{!> ../../../docs_src/security/tutorial002_an_py310.py!}
```
=== "Python 3.9+" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="5 12-16" ///
{!> ../../../docs_src/security/tutorial002_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="3 10-14"
{!> ../../../docs_src/security/tutorial002_py310.py!}
```
```Python hl_lines="5 13-17" ////
{!> ../../../docs_src/security/tutorial002_an.py!}
```
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.8+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="3 10-14" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/security/tutorial002_py310.py!}
```
=== "Python 3.8+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="5 12-16"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/security/tutorial002.py!}
```
```Python hl_lines="5 12-16" ////
{!> ../../../docs_src/security/tutorial002.py!}
```
## Eine `get_current_user`-Abhรคngigkeit erstellen ## Eine `get_current_user`-Abhรคngigkeit erstellen
@ -79,135 +104,189 @@ Erinnern Sie sich, dass Abhรคngigkeiten Unterabhรคngigkeiten haben kรถnnen?
So wie wir es zuvor in der *Pfadoperation* direkt gemacht haben, erhรคlt unsere neue Abhรคngigkeit `get_current_user` von der Unterabhรคngigkeit `oauth2_scheme` einen `token` vom Typ `str`: So wie wir es zuvor in der *Pfadoperation* direkt gemacht haben, erhรคlt unsere neue Abhรคngigkeit `get_current_user` von der Unterabhรคngigkeit `oauth2_scheme` einen `token` vom Typ `str`:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="25" ```Python hl_lines="25"
{!> ../../../docs_src/security/tutorial002_an_py310.py!} {!> ../../../docs_src/security/tutorial002_an_py310.py!}
``` ```
=== "Python 3.9+" ////
```Python hl_lines="25" //// tab | Python 3.9+
{!> ../../../docs_src/security/tutorial002_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="25"
{!> ../../../docs_src/security/tutorial002_an_py39.py!}
```
```Python hl_lines="26" ////
{!> ../../../docs_src/security/tutorial002_an.py!}
```
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.8+
!!! tip "Tipp" ```Python hl_lines="26"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/security/tutorial002_an.py!}
```
```Python hl_lines="23" ////
{!> ../../../docs_src/security/tutorial002_py310.py!}
```
=== "Python 3.8+ nicht annotiert" //// tab | Python 3.10+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="25" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/security/tutorial002.py!}
``` ///
```Python hl_lines="23"
{!> ../../../docs_src/security/tutorial002_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="25"
{!> ../../../docs_src/security/tutorial002.py!}
```
////
## Den Benutzer holen ## Den Benutzer holen
`get_current_user` wird eine von uns erstellte (gefakte) Hilfsfunktion verwenden, welche einen Token vom Typ `str` entgegennimmt und unser Pydantic-`User`-Modell zurรผckgibt: `get_current_user` wird eine von uns erstellte (gefakte) Hilfsfunktion verwenden, welche einen Token vom Typ `str` entgegennimmt und unser Pydantic-`User`-Modell zurรผckgibt:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="19-22 26-27"
{!> ../../../docs_src/security/tutorial002_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="19-22 26-27"
{!> ../../../docs_src/security/tutorial002_an_py39.py!}
```
```Python hl_lines="19-22 26-27" ////
{!> ../../../docs_src/security/tutorial002_an_py310.py!}
```
=== "Python 3.9+" //// tab | Python 3.8+
```Python hl_lines="19-22 26-27" ```Python hl_lines="20-23 27-28"
{!> ../../../docs_src/security/tutorial002_an_py39.py!} {!> ../../../docs_src/security/tutorial002_an.py!}
``` ```
=== "Python 3.8+" ////
```Python hl_lines="20-23 27-28" //// tab | Python 3.10+ nicht annotiert
{!> ../../../docs_src/security/tutorial002_an.py!}
```
=== "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-20 24-25" ///
{!> ../../../docs_src/security/tutorial002_py310.py!}
```
=== "Python 3.8+ nicht annotiert" ```Python hl_lines="17-20 24-25"
{!> ../../../docs_src/security/tutorial002_py310.py!}
```
!!! tip "Tipp" ////
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="19-22 26-27" //// tab | Python 3.8+ nicht annotiert
{!> ../../../docs_src/security/tutorial002.py!}
``` /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="19-22 26-27"
{!> ../../../docs_src/security/tutorial002.py!}
```
////
## Den aktuellen Benutzer einfรผgen ## Den aktuellen Benutzer einfรผgen
Und jetzt kรถnnen wir wiederum `Depends` mit unserem `get_current_user` in der *Pfadoperation* verwenden: Und jetzt kรถnnen wir wiederum `Depends` mit unserem `get_current_user` in der *Pfadoperation* verwenden:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="31"
{!> ../../../docs_src/security/tutorial002_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="31"
{!> ../../../docs_src/security/tutorial002_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="32"
{!> ../../../docs_src/security/tutorial002_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
```Python hl_lines="31" /// tip | "Tipp"
{!> ../../../docs_src/security/tutorial002_an_py310.py!}
```
=== "Python 3.9+" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="31" ///
{!> ../../../docs_src/security/tutorial002_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="29"
{!> ../../../docs_src/security/tutorial002_py310.py!}
```
```Python hl_lines="32" ////
{!> ../../../docs_src/security/tutorial002_an.py!}
```
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.8+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="29" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/security/tutorial002_py310.py!}
```
=== "Python 3.8+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="31"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/security/tutorial002.py!}
```
```Python hl_lines="31" ////
{!> ../../../docs_src/security/tutorial002.py!}
```
Beachten Sie, dass wir als Typ von `current_user` das Pydantic-Modell `User` deklarieren. Beachten Sie, dass wir als Typ von `current_user` das Pydantic-Modell `User` deklarieren.
Das wird uns innerhalb der Funktion bei Codevervollstรคndigung und Typprรผfungen helfen. Das wird uns innerhalb der Funktion bei Codevervollstรคndigung und Typprรผfungen helfen.
!!! tip "Tipp" /// tip | "Tipp"
Sie erinnern sich vielleicht, dass Requestbodys ebenfalls mit Pydantic-Modellen deklariert werden.
Weil Sie `Depends` verwenden, wird **FastAPI** hier aber nicht verwirrt. Sie erinnern sich vielleicht, dass Requestbodys ebenfalls mit Pydantic-Modellen deklariert werden.
!!! check Weil Sie `Depends` verwenden, wird **FastAPI** hier aber nicht verwirrt.
Die Art und Weise, wie dieses System von Abhรคngigkeiten konzipiert ist, ermรถglicht es uns, verschiedene Abhรคngigkeiten (verschiedene โ€žDependablesโ€œ) zu haben, die alle ein `User`-Modell zurรผckgeben.
Wir sind nicht darauf beschrรคnkt, nur eine Abhรคngigkeit zu haben, die diesen Typ von Daten zurรผckgeben kann. ///
/// check
Die Art und Weise, wie dieses System von Abhรคngigkeiten konzipiert ist, ermรถglicht es uns, verschiedene Abhรคngigkeiten (verschiedene โ€žDependablesโ€œ) zu haben, die alle ein `User`-Modell zurรผckgeben.
Wir sind nicht darauf beschrรคnkt, nur eine Abhรคngigkeit zu haben, die diesen Typ von Daten zurรผckgeben kann.
///
## Andere Modelle ## Andere Modelle
@ -241,41 +320,57 @@ Und alle (oder beliebige Teile davon) kรถnnen Vorteil ziehen aus der Wiederverwe
Und alle diese Tausenden von *Pfadoperationen* kรถnnen nur drei Zeilen lang sein: Und alle diese Tausenden von *Pfadoperationen* kรถnnen nur drei Zeilen lang sein:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="30-32"
{!> ../../../docs_src/security/tutorial002_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="30-32"
{!> ../../../docs_src/security/tutorial002_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="31-33"
{!> ../../../docs_src/security/tutorial002_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
```Python hl_lines="30-32" /// tip | "Tipp"
{!> ../../../docs_src/security/tutorial002_an_py310.py!}
```
=== "Python 3.9+" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="30-32" ///
{!> ../../../docs_src/security/tutorial002_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="28-30"
{!> ../../../docs_src/security/tutorial002_py310.py!}
```
```Python hl_lines="31-33" ////
{!> ../../../docs_src/security/tutorial002_an.py!}
```
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.8+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="28-30" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/security/tutorial002_py310.py!}
```
=== "Python 3.8+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="30-32"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/security/tutorial002.py!}
```
```Python hl_lines="30-32" ////
{!> ../../../docs_src/security/tutorial002.py!}
```
## Zusammenfassung ## Zusammenfassung

15
docs/de/docs/tutorial/security/index.md

@ -32,9 +32,11 @@ Heutzutage ist es nicht sehr populรคr und wird kaum verwendet.
OAuth2 spezifiziert nicht, wie die Kommunikation verschlรผsselt werden soll, sondern erwartet, dass Ihre Anwendung mit HTTPS bereitgestellt wird. OAuth2 spezifiziert nicht, wie die Kommunikation verschlรผsselt werden soll, sondern erwartet, dass Ihre Anwendung mit HTTPS bereitgestellt wird.
!!! tip "Tipp" /// tip | "Tipp"
Im Abschnitt รผber **Deployment** erfahren Sie, wie Sie HTTPS mithilfe von Traefik und Let's Encrypt kostenlos einrichten.
Im Abschnitt รผber **Deployment** erfahren Sie, wie Sie HTTPS mithilfe von Traefik und Let's Encrypt kostenlos einrichten.
///
## OpenID Connect ## OpenID Connect
@ -87,10 +89,13 @@ OpenAPI definiert die folgenden Sicherheitsschemas:
* Diese automatische Erkennung ist es, die in der OpenID Connect Spezifikation definiert ist. * Diese automatische Erkennung ist es, die in der OpenID Connect Spezifikation definiert ist.
!!! tip "Tipp" /// tip | "Tipp"
Auch die Integration anderer Authentifizierungs-/Autorisierungsanbieter wie Google, Facebook, Twitter, GitHub, usw. ist mรถglich und relativ einfach.
Auch die Integration anderer Authentifizierungs-/Autorisierungsanbieter wie Google, Facebook, Twitter, GitHub, usw. ist mรถglich und relativ einfach.
Das komplexeste Problem besteht darin, einen Authentifizierungs-/Autorisierungsanbieter wie solche aufzubauen, aber **FastAPI** reicht Ihnen die Tools, das einfach zu erledigen, wรคhrend Ihnen die schwere Arbeit abgenommen wird.
Das komplexeste Problem besteht darin, einen Authentifizierungs-/Autorisierungsanbieter wie solche aufzubauen, aber **FastAPI** reicht Ihnen die Tools, das einfach zu erledigen, wรคhrend Ihnen die schwere Arbeit abgenommen wird. ///
## **FastAPI** Tools ## **FastAPI** Tools

308
docs/de/docs/tutorial/security/oauth2-jwt.md

@ -44,10 +44,13 @@ $ pip install "python-jose[cryptography]"
Hier verwenden wir das empfohlene: <a href="https://cryptography.io/" class="external-link" target="_blank">pyca/cryptography</a>. Hier verwenden wir das empfohlene: <a href="https://cryptography.io/" class="external-link" target="_blank">pyca/cryptography</a>.
!!! tip "Tipp" /// tip | "Tipp"
Dieses Tutorial verwendete zuvor <a href="https://pyjwt.readthedocs.io/" class="external-link" target="_blank">PyJWT</a>.
Es wurde jedoch aktualisiert, stattdessen python-jose zu verwenden, da dieses alle Funktionen von PyJWT sowie einige Extras bietet, die Sie spรคter mรถglicherweise benรถtigen, wenn Sie Integrationen mit anderen Tools erstellen. Dieses Tutorial verwendete zuvor <a href="https://pyjwt.readthedocs.io/" class="external-link" target="_blank">PyJWT</a>.
Es wurde jedoch aktualisiert, stattdessen python-jose zu verwenden, da dieses alle Funktionen von PyJWT sowie einige Extras bietet, die Sie spรคter mรถglicherweise benรถtigen, wenn Sie Integrationen mit anderen Tools erstellen.
///
## Passwort-Hashing ## Passwort-Hashing
@ -83,12 +86,15 @@ $ pip install "passlib[bcrypt]"
</div> </div>
!!! tip "Tipp" /// tip | "Tipp"
Mit `passlib` kรถnnen Sie sogar konfigurieren, Passwรถrter zu lesen, die von **Django**, einem **Flask**-Sicherheit-Plugin, oder vielen anderen erstellt wurden.
Mit `passlib` kรถnnen Sie sogar konfigurieren, Passwรถrter zu lesen, die von **Django**, einem **Flask**-Sicherheit-Plugin, oder vielen anderen erstellt wurden.
So kรถnnten Sie beispielsweise die gleichen Daten aus einer Django-Anwendung in einer Datenbank mit einer FastAPI-Anwendung teilen. Oder schrittweise eine Django-Anwendung migrieren, wรคhrend Sie dieselbe Datenbank verwenden. So kรถnnten Sie beispielsweise die gleichen Daten aus einer Django-Anwendung in einer Datenbank mit einer FastAPI-Anwendung teilen. Oder schrittweise eine Django-Anwendung migrieren, wรคhrend Sie dieselbe Datenbank verwenden.
Und Ihre Benutzer kรถnnten sich gleichzeitig รผber Ihre Django-Anwendung oder Ihre **FastAPI**-Anwendung anmelden. Und Ihre Benutzer kรถnnten sich gleichzeitig รผber Ihre Django-Anwendung oder Ihre **FastAPI**-Anwendung anmelden.
///
## Die Passwรถrter hashen und รผberprรผfen ## Die Passwรถrter hashen und รผberprรผfen
@ -96,12 +102,15 @@ Importieren Sie die benรถtigten Tools aus `passlib`.
Erstellen Sie einen PassLib-โ€žKontextโ€œ. Der wird fรผr das Hashen und Verifizieren von Passwรถrtern verwendet. Erstellen Sie einen PassLib-โ€žKontextโ€œ. Der wird fรผr das Hashen und Verifizieren von Passwรถrtern verwendet.
!!! tip "Tipp" /// tip | "Tipp"
Der PassLib-Kontext kann auch andere Hashing-Algorithmen verwenden, einschlieรŸlich deprecateter Alter, um etwa nur eine Verifizierung usw. zu ermรถglichen.
Der PassLib-Kontext kann auch andere Hashing-Algorithmen verwenden, einschlieรŸlich deprecateter Alter, um etwa nur eine Verifizierung usw. zu ermรถglichen.
Sie kรถnnten ihn beispielsweise verwenden, um von einem anderen System (wie Django) generierte Passwรถrter zu lesen und zu verifizieren, aber alle neuen Passwรถrter mit einem anderen Algorithmus wie Bcrypt zu hashen. Sie kรถnnten ihn beispielsweise verwenden, um von einem anderen System (wie Django) generierte Passwรถrter zu lesen und zu verifizieren, aber alle neuen Passwรถrter mit einem anderen Algorithmus wie Bcrypt zu hashen.
Und mit allen gleichzeitig kompatibel sein. Und mit allen gleichzeitig kompatibel sein.
///
Erstellen Sie eine Hilfsfunktion, um ein vom Benutzer stammendes Passwort zu hashen. Erstellen Sie eine Hilfsfunktion, um ein vom Benutzer stammendes Passwort zu hashen.
@ -109,44 +118,63 @@ Und eine weitere, um zu รผberprรผfen, ob ein empfangenes Passwort mit dem gespei
Und noch eine, um einen Benutzer zu authentifizieren und zurรผckzugeben. Und noch eine, um einen Benutzer zu authentifizieren und zurรผckzugeben.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="7 48 55-56 59-60 69-75"
{!> ../../../docs_src/security/tutorial004_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="7 48 55-56 59-60 69-75"
{!> ../../../docs_src/security/tutorial004_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="7 49 56-57 60-61 70-76"
{!> ../../../docs_src/security/tutorial004_an.py!}
```
////
```Python hl_lines="7 48 55-56 59-60 69-75" //// tab | Python 3.10+ nicht annotiert
{!> ../../../docs_src/security/tutorial004_an_py310.py!}
```
=== "Python 3.9+" /// tip | "Tipp"
```Python hl_lines="7 48 55-56 59-60 69-75" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/security/tutorial004_an_py39.py!}
```
=== "Python 3.8+" ///
```Python hl_lines="7 49 56-57 60-61 70-76" ```Python hl_lines="6 47 54-55 58-59 68-74"
{!> ../../../docs_src/security/tutorial004_an.py!} {!> ../../../docs_src/security/tutorial004_py310.py!}
``` ```
////
//// tab | Python 3.8+ nicht annotiert
=== "Python 3.10+ nicht annotiert" /// tip | "Tipp"
!!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="6 47 54-55 58-59 68-74" ///
{!> ../../../docs_src/security/tutorial004_py310.py!}
``` ```Python hl_lines="7 48 55-56 59-60 69-75"
{!> ../../../docs_src/security/tutorial004.py!}
```
=== "Python 3.8+ nicht annotiert" ////
!!! tip "Tipp" /// note | "Hinweis"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="7 48 55-56 59-60 69-75" Wenn Sie sich die neue (gefakte) Datenbank `fake_users_db` anschauen, sehen Sie, wie das gehashte Passwort jetzt aussieht: `"$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW"`.
{!> ../../../docs_src/security/tutorial004.py!}
```
!!! note "Hinweis" ///
Wenn Sie sich die neue (gefakte) Datenbank `fake_users_db` anschauen, sehen Sie, wie das gehashte Passwort jetzt aussieht: `"$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW"`.
## JWT-Token verarbeiten ## JWT-Token verarbeiten
@ -176,41 +204,57 @@ Definieren Sie ein Pydantic-Modell, das im Token-Endpunkt fรผr die Response verw
Erstellen Sie eine Hilfsfunktion, um einen neuen Zugriffstoken zu generieren. Erstellen Sie eine Hilfsfunktion, um einen neuen Zugriffstoken zu generieren.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="6 12-14 28-30 78-86"
{!> ../../../docs_src/security/tutorial004_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="6 12-14 28-30 78-86"
{!> ../../../docs_src/security/tutorial004_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="6 13-15 29-31 79-87"
{!> ../../../docs_src/security/tutorial004_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
```Python hl_lines="6 12-14 28-30 78-86" /// tip | "Tipp"
{!> ../../../docs_src/security/tutorial004_an_py310.py!}
```
=== "Python 3.9+" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="6 12-14 28-30 78-86" ///
{!> ../../../docs_src/security/tutorial004_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="5 11-13 27-29 77-85"
{!> ../../../docs_src/security/tutorial004_py310.py!}
```
```Python hl_lines="6 13-15 29-31 79-87" ////
{!> ../../../docs_src/security/tutorial004_an.py!}
```
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.8+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="5 11-13 27-29 77-85" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/security/tutorial004_py310.py!}
```
=== "Python 3.8+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="6 12-14 28-30 78-86"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/security/tutorial004.py!}
```
```Python hl_lines="6 12-14 28-30 78-86" ////
{!> ../../../docs_src/security/tutorial004.py!}
```
## Die Abhรคngigkeiten aktualisieren ## Die Abhรคngigkeiten aktualisieren
@ -220,41 +264,57 @@ Dekodieren Sie den empfangenen Token, validieren Sie ihn und geben Sie den aktue
Wenn der Token ungรผltig ist, geben Sie sofort einen HTTP-Fehler zurรผck. Wenn der Token ungรผltig ist, geben Sie sofort einen HTTP-Fehler zurรผck.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="89-106" ```Python hl_lines="89-106"
{!> ../../../docs_src/security/tutorial004_an_py310.py!} {!> ../../../docs_src/security/tutorial004_an_py310.py!}
``` ```
=== "Python 3.9+" ////
```Python hl_lines="89-106" //// tab | Python 3.9+
{!> ../../../docs_src/security/tutorial004_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="89-106"
{!> ../../../docs_src/security/tutorial004_an_py39.py!}
```
```Python hl_lines="90-107" ////
{!> ../../../docs_src/security/tutorial004_an.py!}
```
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.8+
!!! tip "Tipp" ```Python hl_lines="90-107"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/security/tutorial004_an.py!}
```
```Python hl_lines="88-105" ////
{!> ../../../docs_src/security/tutorial004_py310.py!}
```
=== "Python 3.8+ 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="88-105"
{!> ../../../docs_src/security/tutorial004_py310.py!}
```
```Python hl_lines="89-106" ////
{!> ../../../docs_src/security/tutorial004.py!}
``` //// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="89-106"
{!> ../../../docs_src/security/tutorial004.py!}
```
////
## Die *Pfadoperation* `/token` aktualisieren ## Die *Pfadoperation* `/token` aktualisieren
@ -262,41 +322,57 @@ Erstellen Sie ein <abbr title="Zeitdifferenz">`timedelta`</abbr> mit der Ablaufz
Erstellen Sie einen echten JWT-Zugriffstoken und geben Sie ihn zurรผck. Erstellen Sie einen echten JWT-Zugriffstoken und geben Sie ihn zurรผck.
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="117-132"
{!> ../../../docs_src/security/tutorial004_an_py310.py!}
```
////
```Python hl_lines="117-132" //// tab | Python 3.9+
{!> ../../../docs_src/security/tutorial004_an_py310.py!}
```
=== "Python 3.9+" ```Python hl_lines="117-132"
{!> ../../../docs_src/security/tutorial004_an_py39.py!}
```
```Python hl_lines="117-132" ////
{!> ../../../docs_src/security/tutorial004_an_py39.py!}
```
=== "Python 3.8+" //// tab | Python 3.8+
```Python hl_lines="118-133"
{!> ../../../docs_src/security/tutorial004_an.py!}
```
```Python hl_lines="118-133" ////
{!> ../../../docs_src/security/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="114-129"
{!> ../../../docs_src/security/tutorial004_py310.py!}
```
```Python hl_lines="114-129" ////
{!> ../../../docs_src/security/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.
```Python hl_lines="115-130" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/security/tutorial004.py!}
``` ///
```Python hl_lines="115-130"
{!> ../../../docs_src/security/tutorial004.py!}
```
////
### Technische Details zum JWT-โ€žSubjektโ€œ `sub` ### Technische Details zum JWT-โ€žSubjektโ€œ `sub`
@ -335,8 +411,11 @@ Verwenden Sie die Anmeldeinformationen:
Benutzername: `johndoe` Benutzername: `johndoe`
Passwort: `secret`. Passwort: `secret`.
!!! check /// check
Beachten Sie, dass im Code nirgendwo das Klartext-Passwort "`secret`" steht, wir haben nur die gehashte Version.
Beachten Sie, dass im Code nirgendwo das Klartext-Passwort "`secret`" steht, wir haben nur die gehashte Version.
///
<img src="/img/tutorial/security/image08.png"> <img src="/img/tutorial/security/image08.png">
@ -357,8 +436,11 @@ Wenn Sie die Developer Tools รถffnen, kรถnnen Sie sehen, dass die gesendeten Dat
<img src="/img/tutorial/security/image10.png"> <img src="/img/tutorial/security/image10.png">
!!! note "Hinweis" /// note | "Hinweis"
Beachten Sie den Header `Authorization` mit einem Wert, der mit `Bearer` beginnt.
Beachten Sie den Header `Authorization` mit einem Wert, der mit `Bearer` beginnt.
///
## Fortgeschrittene Verwendung mit `scopes` ## Fortgeschrittene Verwendung mit `scopes`

412
docs/de/docs/tutorial/security/simple-oauth2.md

@ -32,14 +32,17 @@ Diese werden normalerweise verwendet, um bestimmte Sicherheitsberechtigungen zu
* `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.
Es spielt keine Rolle, ob er andere Zeichen wie `:` enthรคlt oder ob es eine URL ist. In OAuth2 ist ein โ€žScopeโ€œ nur ein String, der eine bestimmte erforderliche Berechtigung deklariert.
Diese Details sind implementierungsspezifisch. Es spielt keine Rolle, ob er andere Zeichen wie `:` enthรคlt oder ob es eine URL ist.
Fรผr OAuth2 sind es einfach nur Strings. Diese Details sind implementierungsspezifisch.
Fรผr OAuth2 sind es einfach nur Strings.
///
## Code, um `username` und `password` entgegenzunehmen. ## Code, um `username` und `password` entgegenzunehmen.
@ -49,41 +52,57 @@ Lassen Sie uns nun die von **FastAPI** bereitgestellten Werkzeuge verwenden, um
Importieren Sie zunรคchst `OAuth2PasswordRequestForm` und verwenden Sie es als Abhรคngigkeit mit `Depends` in der *Pfadoperation* fรผr `/token`: Importieren Sie zunรคchst `OAuth2PasswordRequestForm` und verwenden Sie es als Abhรคngigkeit mit `Depends` in der *Pfadoperation* fรผr `/token`:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="4 78"
{!> ../../../docs_src/security/tutorial003_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="4 78"
{!> ../../../docs_src/security/tutorial003_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="4 79"
{!> ../../../docs_src/security/tutorial003_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
```Python hl_lines="4 78" /// tip | "Tipp"
{!> ../../../docs_src/security/tutorial003_an_py310.py!}
```
=== "Python 3.9+" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="4 78" ///
{!> ../../../docs_src/security/tutorial003_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="2 74"
{!> ../../../docs_src/security/tutorial003_py310.py!}
```
```Python hl_lines="4 79" ////
{!> ../../../docs_src/security/tutorial003_an.py!}
```
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.8+ nicht annotiert
!!! tip "Tipp" /// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="2 74" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/security/tutorial003_py310.py!}
```
=== "Python 3.8+ nicht annotiert" ///
!!! tip "Tipp" ```Python hl_lines="4 76"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. {!> ../../../docs_src/security/tutorial003.py!}
```
```Python hl_lines="4 76" ////
{!> ../../../docs_src/security/tutorial003.py!}
```
`OAuth2PasswordRequestForm` ist eine Klassenabhรคngigkeit, die einen Formularbody deklariert mit: `OAuth2PasswordRequestForm` ist eine Klassenabhรคngigkeit, die einen Formularbody deklariert mit:
@ -92,29 +111,38 @@ Importieren Sie zunรคchst `OAuth2PasswordRequestForm` und verwenden Sie es als A
* Einem optionalen `scope`-Feld als langem String, bestehend aus durch Leerzeichen getrennten Strings. * Einem optionalen `scope`-Feld als langem String, bestehend aus durch Leerzeichen getrennten Strings.
* Einem optionalen `grant_type` (โ€žArt der Anmeldungโ€œ). * Einem optionalen `grant_type` (โ€žArt der Anmeldungโ€œ).
!!! tip "Tipp" /// tip | "Tipp"
Die OAuth2-Spezifikation *erfordert* tatsรคchlich ein Feld `grant_type` mit dem festen Wert `password`, aber `OAuth2PasswordRequestForm` erzwingt dies nicht.
Die OAuth2-Spezifikation *erfordert* tatsรคchlich ein Feld `grant_type` mit dem festen Wert `password`, aber `OAuth2PasswordRequestForm` erzwingt dies nicht.
Wenn Sie es erzwingen mรผssen, verwenden Sie `OAuth2PasswordRequestFormStrict` anstelle von `OAuth2PasswordRequestForm`. Wenn Sie es erzwingen mรผssen, verwenden Sie `OAuth2PasswordRequestFormStrict` anstelle von `OAuth2PasswordRequestForm`.
///
* Eine optionale `client_id` (benรถtigen wir fรผr unser Beispiel nicht). * Eine optionale `client_id` (benรถtigen wir fรผr unser Beispiel nicht).
* Ein optionales `client_secret` (benรถtigen wir fรผr unser Beispiel nicht). * Ein optionales `client_secret` (benรถtigen wir fรผr unser Beispiel nicht).
!!! info /// info
`OAuth2PasswordRequestForm` ist keine spezielle Klasse fรผr **FastAPI**, so wie `OAuth2PasswordBearer`.
`OAuth2PasswordRequestForm` ist keine spezielle Klasse fรผr **FastAPI**, so wie `OAuth2PasswordBearer`.
`OAuth2PasswordBearer` lรคsst **FastAPI** wissen, dass es sich um ein Sicherheitsschema handelt. Daher wird es auf diese Weise zu OpenAPI hinzugefรผgt.
`OAuth2PasswordBearer` lรคsst **FastAPI** wissen, dass es sich um ein Sicherheitsschema handelt. Daher wird es auf diese Weise zu OpenAPI hinzugefรผgt. Aber `OAuth2PasswordRequestForm` ist nur eine Klassenabhรคngigkeit, die Sie selbst hรคtten schreiben kรถnnen, oder Sie hรคtten `Form`ular-Parameter direkt deklarieren kรถnnen.
Aber `OAuth2PasswordRequestForm` ist nur eine Klassenabhรคngigkeit, die Sie selbst hรคtten schreiben kรถnnen, oder Sie hรคtten `Form`ular-Parameter direkt deklarieren kรถnnen. Da es sich jedoch um einen hรคufigen Anwendungsfall handelt, wird er zur Vereinfachung direkt von **FastAPI** bereitgestellt.
Da es sich jedoch um einen hรคufigen Anwendungsfall handelt, wird er zur Vereinfachung direkt von **FastAPI** bereitgestellt. ///
### Die Formulardaten verwenden ### Die Formulardaten verwenden
!!! tip "Tipp" /// tip | "Tipp"
Die Instanz der Klassenabhรคngigkeit `OAuth2PasswordRequestForm` verfรผgt, statt eines Attributs `scope` mit dem durch Leerzeichen getrennten langen String, รผber das Attribut `scopes` mit einer tatsรคchlichen Liste von Strings, einem fรผr jeden gesendeten Scope.
Die Instanz der Klassenabhรคngigkeit `OAuth2PasswordRequestForm` verfรผgt, statt eines Attributs `scope` mit dem durch Leerzeichen getrennten langen String, รผber das Attribut `scopes` mit einer tatsรคchlichen Liste von Strings, einem fรผr jeden gesendeten Scope.
In diesem Beispiel verwenden wir keine `scopes`, aber die Funktionalitรคt ist vorhanden, wenn Sie sie benรถtigen.
In diesem Beispiel verwenden wir keine `scopes`, aber die Funktionalitรคt ist vorhanden, wenn Sie sie benรถtigen. ///
Rufen Sie nun die Benutzerdaten aus der (gefakten) Datenbank ab, fรผr diesen `username` aus dem Formularfeld. Rufen Sie nun die Benutzerdaten aus der (gefakten) Datenbank ab, fรผr diesen `username` aus dem Formularfeld.
@ -122,41 +150,57 @@ Wenn es keinen solchen Benutzer gibt, geben wir die Fehlermeldung โ€žIncorrect u
Fรผr den Fehler verwenden wir die Exception `HTTPException`: Fรผr den Fehler verwenden wir die Exception `HTTPException`:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="3 79-81" ```Python hl_lines="3 79-81"
{!> ../../../docs_src/security/tutorial003_an_py310.py!} {!> ../../../docs_src/security/tutorial003_an_py310.py!}
``` ```
////
//// tab | Python 3.9+
=== "Python 3.9+" ```Python hl_lines="3 79-81"
{!> ../../../docs_src/security/tutorial003_an_py39.py!}
```
////
```Python hl_lines="3 79-81" //// tab | Python 3.8+
{!> ../../../docs_src/security/tutorial003_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="3 80-82"
{!> ../../../docs_src/security/tutorial003_an.py!}
```
```Python hl_lines="3 80-82" ////
{!> ../../../docs_src/security/tutorial003_an.py!}
```
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="1 75-77"
{!> ../../../docs_src/security/tutorial003_py310.py!}
```
!!! tip "Tipp" ////
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="1 75-77" //// tab | Python 3.8+ nicht annotiert
{!> ../../../docs_src/security/tutorial003_py310.py!}
```
=== "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="3 77-79" ///
{!> ../../../docs_src/security/tutorial003.py!}
``` ```Python hl_lines="3 77-79"
{!> ../../../docs_src/security/tutorial003.py!}
```
////
### Das Passwort รผberprรผfen ### Das Passwort รผberprรผfen
@ -182,41 +226,57 @@ Wenn Ihre Datenbank gestohlen wird, hat der Dieb nicht die Klartext-Passwรถrter
Der Dieb kann also nicht versuchen, die gleichen Passwรถrter in einem anderen System zu verwenden (da viele Benutzer รผberall das gleiche Passwort verwenden, wรคre dies gefรคhrlich). Der Dieb kann also nicht versuchen, die gleichen Passwรถrter in einem anderen System zu verwenden (da viele Benutzer รผberall das gleiche Passwort verwenden, wรคre dies gefรคhrlich).
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="82-85"
{!> ../../../docs_src/security/tutorial003_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="82-85"
{!> ../../../docs_src/security/tutorial003_an_py39.py!}
```
////
```Python hl_lines="82-85" //// tab | Python 3.8+
{!> ../../../docs_src/security/tutorial003_an_py310.py!}
```
=== "Python 3.9+" ```Python hl_lines="83-86"
{!> ../../../docs_src/security/tutorial003_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
```Python hl_lines="82-85" /// tip | "Tipp"
{!> ../../../docs_src/security/tutorial003_an_py39.py!}
```
=== "Python 3.8+" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="83-86" ///
{!> ../../../docs_src/security/tutorial003_an.py!}
```
=== "Python 3.10+ nicht annotiert" ```Python hl_lines="78-81"
{!> ../../../docs_src/security/tutorial003_py310.py!}
```
////
!!! tip "Tipp" //// tab | Python 3.8+ nicht annotiert
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="78-81" /// tip | "Tipp"
{!> ../../../docs_src/security/tutorial003_py310.py!}
```
=== "Python 3.8+ nicht annotiert" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
!!! tip "Tipp" ///
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="80-83" ```Python hl_lines="80-83"
{!> ../../../docs_src/security/tutorial003.py!} {!> ../../../docs_src/security/tutorial003.py!}
``` ```
////
#### รœber `**user_dict` #### รœber `**user_dict`
@ -234,8 +294,11 @@ UserInDB(
) )
``` ```
!!! info /// info
Eine ausfรผhrlichere Erklรคrung von `**user_dict` finden Sie in [der Dokumentation fรผr **Extra Modelle**](../extra-models.md#uber-user_indict){.internal-link target=_blank}.
Eine ausfรผhrlichere Erklรคrung von `**user_dict` finden Sie in [der Dokumentation fรผr **Extra Modelle**](../extra-models.md#uber-user_indict){.internal-link target=_blank}.
///
## Den Token zurรผckgeben ## Den Token zurรผckgeben
@ -247,55 +310,77 @@ Und es sollte einen `access_token` haben, mit einem String, der unseren Zugriffs
In diesem einfachen Beispiel gehen wir einfach vรถllig unsicher vor und geben denselben `username` wie der Token zurรผck. In diesem einfachen Beispiel gehen wir einfach vรถllig unsicher vor und geben denselben `username` wie der Token zurรผck.
!!! tip "Tipp" /// tip | "Tipp"
Im nรคchsten Kapitel sehen Sie eine wirklich sichere Implementierung mit Passwort-Hashing und <abbr title="JSON Web Tokens">JWT</abbr>-Tokens.
Im nรคchsten Kapitel sehen Sie eine wirklich sichere Implementierung mit Passwort-Hashing und <abbr title="JSON Web Tokens">JWT</abbr>-Tokens.
Aber konzentrieren wir uns zunรคchst auf die spezifischen Details, die wir benรถtigen.
Aber konzentrieren wir uns zunรคchst auf die spezifischen Details, die wir benรถtigen. ///
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="87" ```Python hl_lines="87"
{!> ../../../docs_src/security/tutorial003_an_py310.py!} {!> ../../../docs_src/security/tutorial003_an_py310.py!}
``` ```
////
//// tab | Python 3.9+
=== "Python 3.9+" ```Python hl_lines="87"
{!> ../../../docs_src/security/tutorial003_an_py39.py!}
```
```Python hl_lines="87" ////
{!> ../../../docs_src/security/tutorial003_an_py39.py!}
```
=== "Python 3.8+" //// tab | Python 3.8+
```Python hl_lines="88" ```Python hl_lines="88"
{!> ../../../docs_src/security/tutorial003_an.py!} {!> ../../../docs_src/security/tutorial003_an.py!}
``` ```
=== "Python 3.10+ nicht annotiert" ////
!!! tip "Tipp" //// tab | Python 3.10+ nicht annotiert
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="83" /// tip | "Tipp"
{!> ../../../docs_src/security/tutorial003_py310.py!}
```
=== "Python 3.8+ nicht annotiert" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
!!! tip "Tipp" ///
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="85" ```Python hl_lines="83"
{!> ../../../docs_src/security/tutorial003.py!} {!> ../../../docs_src/security/tutorial003_py310.py!}
``` ```
!!! tip "Tipp" ////
GemรครŸ der Spezifikation sollten Sie ein JSON mit einem `access_token` und einem `token_type` zurรผckgeben, genau wie in diesem Beispiel.
Das mรผssen Sie selbst in Ihrem Code tun und sicherstellen, dass Sie diese JSON-Schlรผssel verwenden. //// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="85"
{!> ../../../docs_src/security/tutorial003.py!}
```
Es ist fast das Einzige, woran Sie denken mรผssen, es selbst richtigzumachen und die Spezifikationen einzuhalten. ////
Den Rest erledigt **FastAPI** fรผr Sie. /// tip | "Tipp"
GemรครŸ der Spezifikation sollten Sie ein JSON mit einem `access_token` und einem `token_type` zurรผckgeben, genau wie in diesem Beispiel.
Das mรผssen Sie selbst in Ihrem Code tun und sicherstellen, dass Sie diese JSON-Schlรผssel verwenden.
Es ist fast das Einzige, woran Sie denken mรผssen, es selbst richtigzumachen und die Spezifikationen einzuhalten.
Den Rest erledigt **FastAPI** fรผr Sie.
///
## Die Abhรคngigkeiten aktualisieren ## Die Abhรคngigkeiten aktualisieren
@ -309,56 +394,75 @@ Beide Abhรคngigkeiten geben nur dann einen HTTP-Error zurรผck, wenn der Benutzer
In unserem Endpunkt erhalten wir also nur dann einen Benutzer, wenn der Benutzer existiert, korrekt authentifiziert wurde und aktiv ist: In unserem Endpunkt erhalten wir also nur dann einen Benutzer, wenn der Benutzer existiert, korrekt authentifiziert wurde und aktiv ist:
=== "Python 3.10+" //// tab | Python 3.10+
```Python hl_lines="58-66 69-74 94" ```Python hl_lines="58-66 69-74 94"
{!> ../../../docs_src/security/tutorial003_an_py310.py!} {!> ../../../docs_src/security/tutorial003_an_py310.py!}
``` ```
=== "Python 3.9+" ////
```Python hl_lines="58-66 69-74 94" //// tab | Python 3.9+
{!> ../../../docs_src/security/tutorial003_an_py39.py!}
```
=== "Python 3.8+" ```Python hl_lines="58-66 69-74 94"
{!> ../../../docs_src/security/tutorial003_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="59-67 70-75 95"
{!> ../../../docs_src/security/tutorial003_an.py!}
```
```Python hl_lines="59-67 70-75 95" ////
{!> ../../../docs_src/security/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.
```Python hl_lines="56-64 67-70 88" Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
{!> ../../../docs_src/security/tutorial003_py310.py!}
``` ///
```Python hl_lines="56-64 67-70 88"
{!> ../../../docs_src/security/tutorial003_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python hl_lines="58-66 69-72 90"
{!> ../../../docs_src/security/tutorial003.py!}
```
=== "Python 3.8+ nicht annotiert" ////
!!! tip "Tipp" /// info
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python hl_lines="58-66 69-72 90" Der zusรคtzliche Header `WWW-Authenticate` mit dem Wert `Bearer`, den wir hier zurรผckgeben, ist ebenfalls Teil der Spezifikation.
{!> ../../../docs_src/security/tutorial003.py!}
```
!!! info Jeder HTTP-(Fehler-)Statuscode 401 โ€žUNAUTHORIZEDโ€œ soll auch einen `WWW-Authenticate`-Header zurรผckgeben.
Der zusรคtzliche Header `WWW-Authenticate` mit dem Wert `Bearer`, den wir hier zurรผckgeben, ist ebenfalls Teil der Spezifikation.
Jeder HTTP-(Fehler-)Statuscode 401 โ€žUNAUTHORIZEDโ€œ soll auch einen `WWW-Authenticate`-Header zurรผckgeben. Im Fall von Bearer-Tokens (in unserem Fall) sollte der Wert dieses Headers `Bearer` lauten.
Im Fall von Bearer-Tokens (in unserem Fall) sollte der Wert dieses Headers `Bearer` lauten. Sie kรถnnen diesen zusรคtzlichen Header tatsรคchlich weglassen und es wรผrde trotzdem funktionieren.
Sie kรถnnen diesen zusรคtzlichen Header tatsรคchlich weglassen und es wรผrde trotzdem funktionieren. Aber er wird hier bereitgestellt, um den Spezifikationen zu entsprechen.
Aber er wird hier bereitgestellt, um den Spezifikationen zu entsprechen. AuรŸerdem gibt es mรถglicherweise Tools, die ihn erwarten und verwenden (jetzt oder in der Zukunft) und das kรถnnte fรผr Sie oder Ihre Benutzer jetzt oder in der Zukunft nรผtzlich sein.
AuรŸerdem gibt es mรถglicherweise Tools, die ihn erwarten und verwenden (jetzt oder in der Zukunft) und das kรถnnte fรผr Sie oder Ihre Benutzer jetzt oder in der Zukunft nรผtzlich sein. Das ist der Vorteil von Standards ...
Das ist der Vorteil von Standards ... ///
## Es in Aktion sehen ## Es in Aktion sehen

9
docs/de/docs/tutorial/static-files.md

@ -11,10 +11,13 @@ Mit `StaticFiles` kรถnnen Sie statische Dateien aus einem Verzeichnis automatisc
{!../../../docs_src/static_files/tutorial001.py!} {!../../../docs_src/static_files/tutorial001.py!}
``` ```
!!! note "Technische Details" /// note | "Technische Details"
Sie kรถnnten auch `from starlette.staticfiles import StaticFiles` verwenden.
**FastAPI** stellt dasselbe `starlette.staticfiles` auch via `fastapi.staticfiles` bereit, als Annehmlichkeit fรผr Sie, den Entwickler. Es kommt aber tatsรคchlich direkt von Starlette. Sie kรถnnten auch `from starlette.staticfiles import StaticFiles` verwenden.
**FastAPI** stellt dasselbe `starlette.staticfiles` auch via `fastapi.staticfiles` bereit, als Annehmlichkeit fรผr Sie, den Entwickler. Es kommt aber tatsรคchlich direkt von Starlette.
///
### Was ist โ€žMountenโ€œ? ### Was ist โ€žMountenโ€œ?

109
docs/de/docs/tutorial/testing.md

@ -8,10 +8,13 @@ Damit kรถnnen Sie <a href="https://docs.pytest.org/" class="external-link" targe
## Verwendung von `TestClient` ## Verwendung von `TestClient`
!!! info /// info
Um `TestClient` zu verwenden, installieren Sie zunรคchst <a href="https://www.python-httpx.org" class="external-link" target="_blank">`httpx`</a>.
Z. B. `pip install httpx`. Um `TestClient` zu verwenden, installieren Sie zunรคchst <a href="https://www.python-httpx.org" class="external-link" target="_blank">`httpx`</a>.
Z. B. `pip install httpx`.
///
Importieren Sie `TestClient`. Importieren Sie `TestClient`.
@ -27,20 +30,29 @@ Schreiben Sie einfache `assert`-Anweisungen mit den Standard-Python-Ausdrรผcken,
{!../../../docs_src/app_testing/tutorial001.py!} {!../../../docs_src/app_testing/tutorial001.py!}
``` ```
!!! tip "Tipp" /// tip | "Tipp"
Beachten Sie, dass die Testfunktionen normal `def` und nicht `async def` sind.
Beachten Sie, dass die Testfunktionen normal `def` und nicht `async def` sind.
Und die Anrufe an den Client sind ebenfalls normale Anrufe, die nicht `await` verwenden.
Dadurch kรถnnen Sie `pytest` ohne Komplikationen direkt nutzen.
///
/// note | "Technische Details"
Sie kรถnnten auch `from starlette.testclient import TestClient` verwenden.
Und die Anrufe an den Client sind ebenfalls normale Anrufe, die nicht `await` verwenden. **FastAPI** stellt denselben `starlette.testclient` auch via `fastapi.testclient` bereit, als Annehmlichkeit fรผr Sie, den Entwickler. Es kommt aber tatsรคchlich direkt von Starlette.
Dadurch kรถnnen Sie `pytest` ohne Komplikationen direkt nutzen. ///
!!! note "Technische Details" /// tip | "Tipp"
Sie kรถnnten auch `from starlette.testclient import TestClient` verwenden.
**FastAPI** stellt denselben `starlette.testclient` auch via `fastapi.testclient` bereit, als Annehmlichkeit fรผr Sie, den Entwickler. Es kommt aber tatsรคchlich direkt von Starlette. Wenn Sie in Ihren Tests neben dem Senden von Anfragen an Ihre FastAPI-Anwendung auch `async`-Funktionen aufrufen mรถchten (z. B. asynchrone Datenbankfunktionen), werfen Sie einen Blick auf die [Async-Tests](../advanced/async-tests.md){.internal-link target=_blank} im Handbuch fรผr fortgeschrittene Benutzer.
!!! tip "Tipp" ///
Wenn Sie in Ihren Tests neben dem Senden von Anfragen an Ihre FastAPI-Anwendung auch `async`-Funktionen aufrufen mรถchten (z. B. asynchrone Datenbankfunktionen), werfen Sie einen Blick auf die [Async-Tests](../advanced/async-tests.md){.internal-link target=_blank} im Handbuch fรผr fortgeschrittene Benutzer.
## Tests separieren ## Tests separieren
@ -110,41 +122,57 @@ Sie verfรผgt รผber eine `POST`-Operation, die mehrere Fehler zurรผckgeben kรถnnt
Beide *Pfadoperationen* erfordern einen `X-Token`-Header. Beide *Pfadoperationen* erfordern einen `X-Token`-Header.
=== "Python 3.10+" //// tab | Python 3.10+
```Python ```Python
{!> ../../../docs_src/app_testing/app_b_an_py310/main.py!} {!> ../../../docs_src/app_testing/app_b_an_py310/main.py!}
``` ```
=== "Python 3.9+" ////
```Python //// tab | Python 3.9+
{!> ../../../docs_src/app_testing/app_b_an_py39/main.py!}
```
=== "Python 3.8+" ```Python
{!> ../../../docs_src/app_testing/app_b_an_py39/main.py!}
```
```Python ////
{!> ../../../docs_src/app_testing/app_b_an/main.py!}
```
=== "Python 3.10+ nicht annotiert" //// tab | Python 3.8+
```Python
{!> ../../../docs_src/app_testing/app_b_an/main.py!}
```
!!! tip "Tipp" ////
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
```Python //// tab | Python 3.10+ nicht annotiert
{!> ../../../docs_src/app_testing/app_b_py310/main.py!}
```
=== "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 ///
{!> ../../../docs_src/app_testing/app_b/main.py!}
``` ```Python
{!> ../../../docs_src/app_testing/app_b_py310/main.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
```Python
{!> ../../../docs_src/app_testing/app_b/main.py!}
```
////
### Erweiterte Testdatei ### Erweiterte Testdatei
@ -168,10 +196,13 @@ Z. B.:
Weitere Informationen zum รœbergeben von Daten an das Backend (mithilfe von `httpx` oder dem `TestClient`) finden Sie in der <a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX-Dokumentation</a>. Weitere Informationen zum รœbergeben von Daten an das Backend (mithilfe von `httpx` oder dem `TestClient`) finden Sie in der <a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX-Dokumentation</a>.
!!! info /// info
Beachten Sie, dass der `TestClient` Daten empfรคngt, die nach JSON konvertiert werden kรถnnen, keine Pydantic-Modelle.
Beachten Sie, dass der `TestClient` Daten empfรคngt, die nach JSON konvertiert werden kรถnnen, keine Pydantic-Modelle.
Wenn Sie ein Pydantic-Modell in Ihrem Test haben und dessen Daten wรคhrend des Testens an die Anwendung senden mรถchten, kรถnnen Sie den `jsonable_encoder` verwenden, der in [JSON-kompatibler Encoder](encoder.md){.internal-link target=_blank} beschrieben wird.
Wenn Sie ein Pydantic-Modell in Ihrem Test haben und dessen Daten wรคhrend des Testens an die Anwendung senden mรถchten, kรถnnen Sie den `jsonable_encoder` verwenden, der in [JSON-kompatibler Encoder](encoder.md){.internal-link target=_blank} beschrieben wird. ///
## Tests ausfรผhren ## Tests ausfรผhren

51
docs/em/docs/advanced/additional-responses.md

@ -1,9 +1,12 @@
# ๐ŸŒ– ๐Ÿ“จ ๐Ÿ—„ # ๐ŸŒ– ๐Ÿ“จ ๐Ÿ—„
!!! warning /// warning
๐Ÿ‘‰ ๐Ÿ‘ ๐Ÿง โ”.
๐Ÿšฅ ๐Ÿ‘† โ–ถ๏ธ โฎ๏ธ **FastAPI**, ๐Ÿ‘† ๐Ÿ’ช ๐Ÿšซ ๐Ÿ’ช ๐Ÿ‘‰. ๐Ÿ‘‰ ๐Ÿ‘ ๐Ÿง โ”.
๐Ÿšฅ ๐Ÿ‘† โ–ถ๏ธ โฎ๏ธ **FastAPI**, ๐Ÿ‘† ๐Ÿ’ช ๐Ÿšซ ๐Ÿ’ช ๐Ÿ‘‰.
///
๐Ÿ‘† ๐Ÿ’ช ๐Ÿ“ฃ ๐ŸŒ– ๐Ÿ“จ, โฎ๏ธ ๐ŸŒ– ๐Ÿ‘” ๐Ÿ“Ÿ, ๐Ÿ”‰ ๐Ÿ†Ž, ๐Ÿ“›, โ™’๏ธ. ๐Ÿ‘† ๐Ÿ’ช ๐Ÿ“ฃ ๐ŸŒ– ๐Ÿ“จ, โฎ๏ธ ๐ŸŒ– ๐Ÿ‘” ๐Ÿ“Ÿ, ๐Ÿ”‰ ๐Ÿ†Ž, ๐Ÿ“›, โ™’๏ธ.
@ -27,20 +30,26 @@
{!../../../docs_src/additional_responses/tutorial001.py!} {!../../../docs_src/additional_responses/tutorial001.py!}
``` ```
!!! note /// note
โœ”๏ธ ๐Ÿคฏ ๐Ÿ‘ˆ ๐Ÿ‘† โœ”๏ธ ๐Ÿ“จ `JSONResponse` ๐Ÿ”—.
โœ”๏ธ ๐Ÿคฏ ๐Ÿ‘ˆ ๐Ÿ‘† โœ”๏ธ ๐Ÿ“จ `JSONResponse` ๐Ÿ”—.
///
/// info
!!! info `model` ๐Ÿ”‘ ๐Ÿšซ ๐Ÿ• ๐Ÿ—„.
`model` ๐Ÿ”‘ ๐Ÿšซ ๐Ÿ• ๐Ÿ—„.
**FastAPI** ๐Ÿ”œ โœŠ Pydantic ๐Ÿท โšช๏ธโžก๏ธ ๐Ÿ“ค, ๐Ÿ— `JSON Schema`, &amp; ๐Ÿšฎ โšซ๏ธ โ˜‘ ๐Ÿฅ‰. **FastAPI** ๐Ÿ”œ โœŠ Pydantic ๐Ÿท โšช๏ธโžก๏ธ ๐Ÿ“ค, ๐Ÿ— `JSON Schema`, &amp; ๐Ÿšฎ โšซ๏ธ โ˜‘ ๐Ÿฅ‰.
โ˜‘ ๐Ÿฅ‰: โ˜‘ ๐Ÿฅ‰:
* ๐Ÿ”‘ `content`, ๐Ÿ‘ˆ โœ”๏ธ ๐Ÿ’ฒ โž•1๏ธโƒฃ ๐ŸŽป ๐ŸŽš (`dict`) ๐Ÿ‘ˆ ๐Ÿ”Œ: * ๐Ÿ”‘ `content`, ๐Ÿ‘ˆ โœ”๏ธ ๐Ÿ’ฒ โž•1๏ธโƒฃ ๐ŸŽป ๐ŸŽš (`dict`) ๐Ÿ‘ˆ ๐Ÿ”Œ:
* ๐Ÿ”‘ โฎ๏ธ ๐Ÿ“ป ๐Ÿ†Ž, โœ… `application/json`, ๐Ÿ‘ˆ ๐Ÿ”Œ ๐Ÿ’ฒ โž•1๏ธโƒฃ ๐ŸŽป ๐ŸŽš, ๐Ÿ‘ˆ ๐Ÿ”Œ: * ๐Ÿ”‘ โฎ๏ธ ๐Ÿ“ป ๐Ÿ†Ž, โœ… `application/json`, ๐Ÿ‘ˆ ๐Ÿ”Œ ๐Ÿ’ฒ โž•1๏ธโƒฃ ๐ŸŽป ๐ŸŽš, ๐Ÿ‘ˆ ๐Ÿ”Œ:
* ๐Ÿ”‘ `schema`, ๐Ÿ‘ˆ โœ”๏ธ ๐Ÿ’ฒ ๐ŸŽป ๐Ÿ”— โšช๏ธโžก๏ธ ๐Ÿท, ๐Ÿ“ฅ โ˜‘ ๐Ÿฅ‰. * ๐Ÿ”‘ `schema`, ๐Ÿ‘ˆ โœ”๏ธ ๐Ÿ’ฒ ๐ŸŽป ๐Ÿ”— โšช๏ธโžก๏ธ ๐Ÿท, ๐Ÿ“ฅ โ˜‘ ๐Ÿฅ‰.
* **FastAPI** ๐Ÿšฎ ๐Ÿ”— ๐Ÿ“ฅ ๐ŸŒ ๐ŸŽป ๐Ÿ”— โž•1๏ธโƒฃ ๐Ÿฅ‰ ๐Ÿ‘† ๐Ÿ—„ โ†ฉ๏ธ โœ… โšซ๏ธ ๐Ÿ”—. ๐Ÿ‘‰ ๐ŸŒŒ, ๐ŸŽ ๐Ÿˆธ &amp; ๐Ÿ‘ฉโ€๐Ÿ’ป ๐Ÿ’ช โš™๏ธ ๐Ÿ‘ˆ ๐ŸŽป ๐Ÿ”— ๐Ÿ”—, ๐Ÿšš ๐Ÿ‘ป ๐Ÿ“Ÿ โšก ๐Ÿงฐ, โ™’๏ธ. * **FastAPI** ๐Ÿšฎ ๐Ÿ”— ๐Ÿ“ฅ ๐ŸŒ ๐ŸŽป ๐Ÿ”— โž•1๏ธโƒฃ ๐Ÿฅ‰ ๐Ÿ‘† ๐Ÿ—„ โ†ฉ๏ธ โœ… โšซ๏ธ ๐Ÿ”—. ๐Ÿ‘‰ ๐ŸŒŒ, ๐ŸŽ ๐Ÿˆธ &amp; ๐Ÿ‘ฉโ€๐Ÿ’ป ๐Ÿ’ช โš™๏ธ ๐Ÿ‘ˆ ๐ŸŽป ๐Ÿ”— ๐Ÿ”—, ๐Ÿšš ๐Ÿ‘ป ๐Ÿ“Ÿ โšก ๐Ÿงฐ, โ™’๏ธ.
///
๐Ÿ— ๐Ÿ“จ ๐Ÿ—„ ๐Ÿ‘‰ *โžก ๐Ÿ› ๏ธ* ๐Ÿ”œ: ๐Ÿ— ๐Ÿ“จ ๐Ÿ—„ ๐Ÿ‘‰ *โžก ๐Ÿ› ๏ธ* ๐Ÿ”œ:
@ -172,13 +181,19 @@
{!../../../docs_src/additional_responses/tutorial002.py!} {!../../../docs_src/additional_responses/tutorial002.py!}
``` ```
!!! note /// note
๐Ÿ‘€ ๐Ÿ‘ˆ ๐Ÿ‘† โœ”๏ธ ๐Ÿ“จ ๐Ÿ–ผ โš™๏ธ `FileResponse` ๐Ÿ”—.
๐Ÿ‘€ ๐Ÿ‘ˆ ๐Ÿ‘† โœ”๏ธ ๐Ÿ“จ ๐Ÿ–ผ โš™๏ธ `FileResponse` ๐Ÿ”—.
///
/// info
๐Ÿšฅ ๐Ÿ‘† โœ” ๐ŸŽ ๐Ÿ“ป ๐Ÿ†Ž ๐ŸŽฏ ๐Ÿ‘† `responses` ๐Ÿ”ข, FastAPI ๐Ÿ”œ ๐Ÿค” ๐Ÿ“จ โœ”๏ธ ๐ŸŽ ๐Ÿ“ป ๐Ÿ†Ž ๐Ÿ‘‘ ๐Ÿ“จ ๐ŸŽ“ (๐Ÿ”ข `application/json`).
!!! info โœ‹๏ธ ๐Ÿšฅ ๐Ÿ‘† โœ”๏ธ โœ” ๐Ÿ›ƒ ๐Ÿ“จ ๐ŸŽ“ โฎ๏ธ `None` ๐Ÿšฎ ๐Ÿ“ป ๐Ÿ†Ž, FastAPI ๐Ÿ”œ โš™๏ธ `application/json` ๐Ÿ™† ๐ŸŒ– ๐Ÿ“จ ๐Ÿ‘ˆ โœ”๏ธ ๐Ÿ‘จโ€๐Ÿ’ผ ๐Ÿท.
๐Ÿšฅ ๐Ÿ‘† โœ” ๐ŸŽ ๐Ÿ“ป ๐Ÿ†Ž ๐ŸŽฏ ๐Ÿ‘† `responses` ๐Ÿ”ข, FastAPI ๐Ÿ”œ ๐Ÿค” ๐Ÿ“จ โœ”๏ธ ๐ŸŽ ๐Ÿ“ป ๐Ÿ†Ž ๐Ÿ‘‘ ๐Ÿ“จ ๐ŸŽ“ (๐Ÿ”ข `application/json`).
โœ‹๏ธ ๐Ÿšฅ ๐Ÿ‘† โœ”๏ธ โœ” ๐Ÿ›ƒ ๐Ÿ“จ ๐ŸŽ“ โฎ๏ธ `None` ๐Ÿšฎ ๐Ÿ“ป ๐Ÿ†Ž, FastAPI ๐Ÿ”œ โš™๏ธ `application/json` ๐Ÿ™† ๐ŸŒ– ๐Ÿ“จ ๐Ÿ‘ˆ โœ”๏ธ ๐Ÿ‘จโ€๐Ÿ’ผ ๐Ÿท. ///
## ๐ŸŒ€ โ„น ## ๐ŸŒ€ โ„น

20
docs/em/docs/advanced/additional-status-codes.md

@ -18,17 +18,23 @@
{!../../../docs_src/additional_status_codes/tutorial001.py!} {!../../../docs_src/additional_status_codes/tutorial001.py!}
``` ```
!!! warning /// warning
๐Ÿ•โ” ๐Ÿ‘† ๐Ÿ“จ `Response` ๐Ÿ”—, ๐Ÿ’– ๐Ÿ–ผ ๐Ÿ”›, โšซ๏ธ ๐Ÿ”œ ๐Ÿ“จ ๐Ÿ”—.
โšซ๏ธ ๐Ÿ† ๐Ÿšซ ๐ŸŽป โฎ๏ธ ๐Ÿท, โ™’๏ธ. ๐Ÿ•โ” ๐Ÿ‘† ๐Ÿ“จ `Response` ๐Ÿ”—, ๐Ÿ’– ๐Ÿ–ผ ๐Ÿ”›, โšซ๏ธ ๐Ÿ”œ ๐Ÿ“จ ๐Ÿ”—.
โš’ ๐Ÿ’ญ โšซ๏ธ โœ”๏ธ ๐Ÿ“Š ๐Ÿ‘† ๐Ÿ’š โšซ๏ธ โœ”๏ธ, &amp; ๐Ÿ‘ˆ ๐Ÿ’ฒ โ˜‘ ๐ŸŽป (๐Ÿšฅ ๐Ÿ‘† โš™๏ธ `JSONResponse`). โšซ๏ธ ๐Ÿ† ๐Ÿšซ ๐ŸŽป โฎ๏ธ ๐Ÿท, โ™’๏ธ.
!!! note "๐Ÿ“ก โ„น" โš’ ๐Ÿ’ญ โšซ๏ธ โœ”๏ธ ๐Ÿ“Š ๐Ÿ‘† ๐Ÿ’š โšซ๏ธ โœ”๏ธ, &amp; ๐Ÿ‘ˆ ๐Ÿ’ฒ โ˜‘ ๐ŸŽป (๐Ÿšฅ ๐Ÿ‘† โš™๏ธ `JSONResponse`).
๐Ÿ‘† ๐Ÿ’ช โš™๏ธ `from starlette.responses import JSONResponse`.
**FastAPI** ๐Ÿšš ๐ŸŽ `starlette.responses` `fastapi.responses` ๐Ÿช ๐Ÿ‘†, ๐Ÿ‘ฉโ€๐Ÿ’ป. โœ‹๏ธ ๐ŸŒ… ๐Ÿ’ช ๐Ÿ“จ ๐Ÿ‘Ÿ ๐Ÿ”— โšช๏ธโžก๏ธ ๐Ÿ’ƒ. ๐ŸŽ โฎ๏ธ `status`. ///
/// note | "๐Ÿ“ก โ„น"
๐Ÿ‘† ๐Ÿ’ช โš™๏ธ `from starlette.responses import JSONResponse`.
**FastAPI** ๐Ÿšš ๐ŸŽ `starlette.responses` `fastapi.responses` ๐Ÿช ๐Ÿ‘†, ๐Ÿ‘ฉโ€๐Ÿ’ป. โœ‹๏ธ ๐ŸŒ… ๐Ÿ’ช ๐Ÿ“จ ๐Ÿ‘Ÿ ๐Ÿ”— โšช๏ธโžก๏ธ ๐Ÿ’ƒ. ๐ŸŽ โฎ๏ธ `status`.
///
## ๐Ÿ—„ &amp; ๐Ÿ› ๏ธ ๐Ÿฉบ ## ๐Ÿ—„ &amp; ๐Ÿ› ๏ธ ๐Ÿฉบ

13
docs/em/docs/advanced/advanced-dependencies.md

@ -60,11 +60,14 @@ checker(q="somequery")
{!../../../docs_src/dependencies/tutorial011.py!} {!../../../docs_src/dependencies/tutorial011.py!}
``` ```
!!! tip /// tip
๐ŸŒ ๐Ÿ‘‰ ๐Ÿ’ช ๐Ÿ˜‘ ๐ŸŽญ. &amp; โšซ๏ธ ๐Ÿ’ช ๐Ÿšซ ๐Ÿ“ถ ๐Ÿ†‘ โ” โšซ๏ธ โš .
๐Ÿ‘ซ ๐Ÿ–ผ ๐Ÿ˜ซ ๐Ÿ™…, โœ‹๏ธ ๐ŸŽฆ โ” โšซ๏ธ ๐ŸŒ ๐Ÿ‘ท. ๐ŸŒ ๐Ÿ‘‰ ๐Ÿ’ช ๐Ÿ˜‘ ๐ŸŽญ. &amp; โšซ๏ธ ๐Ÿ’ช ๐Ÿšซ ๐Ÿ“ถ ๐Ÿ†‘ โ” โšซ๏ธ โš .
๐Ÿ“ƒ ๐Ÿ”ƒ ๐Ÿ’‚โ€โ™‚, ๐Ÿ“ค ๐Ÿš™ ๐Ÿ”ข ๐Ÿ‘ˆ ๐Ÿ› ๏ธ ๐Ÿ‘‰ ๐ŸŽ ๐ŸŒŒ. ๐Ÿ‘ซ ๐Ÿ–ผ ๐Ÿ˜ซ ๐Ÿ™…, โœ‹๏ธ ๐ŸŽฆ โ” โšซ๏ธ ๐ŸŒ ๐Ÿ‘ท.
๐Ÿšฅ ๐Ÿ‘† ๐Ÿค” ๐ŸŒ ๐Ÿ‘‰, ๐Ÿ‘† โช ๐Ÿ’ญ โ” ๐Ÿ‘ˆ ๐Ÿš™ ๐Ÿงฐ ๐Ÿ’‚โ€โ™‚ ๐Ÿ‘ท ๐Ÿ”˜. ๐Ÿ“ƒ ๐Ÿ”ƒ ๐Ÿ’‚โ€โ™‚, ๐Ÿ“ค ๐Ÿš™ ๐Ÿ”ข ๐Ÿ‘ˆ ๐Ÿ› ๏ธ ๐Ÿ‘‰ ๐ŸŽ ๐ŸŒŒ.
๐Ÿšฅ ๐Ÿ‘† ๐Ÿค” ๐ŸŒ ๐Ÿ‘‰, ๐Ÿ‘† โช ๐Ÿ’ญ โ” ๐Ÿ‘ˆ ๐Ÿš™ ๐Ÿงฐ ๐Ÿ’‚โ€โ™‚ ๐Ÿ‘ท ๐Ÿ”˜.
///

21
docs/em/docs/advanced/async-tests.md

@ -64,8 +64,11 @@ $ pytest
{!../../../docs_src/async_tests/test_main.py!} {!../../../docs_src/async_tests/test_main.py!}
``` ```
!!! tip /// tip
๐Ÿ—’ ๐Ÿ‘ˆ ๐Ÿ’ฏ ๐Ÿ”ข ๐Ÿ”œ `async def` โ†ฉ๏ธ `def` โญ ๐Ÿ•โ” โš™๏ธ `TestClient`.
๐Ÿ—’ ๐Ÿ‘ˆ ๐Ÿ’ฏ ๐Ÿ”ข ๐Ÿ”œ `async def` โ†ฉ๏ธ `def` โญ ๐Ÿ•โ” โš™๏ธ `TestClient`.
///
โคด๏ธ ๐Ÿ‘ฅ ๐Ÿ’ช โœ `AsyncClient` โฎ๏ธ ๐Ÿ“ฑ, &amp; ๐Ÿ“จ ๐Ÿ” ๐Ÿ“จ โšซ๏ธ, โš™๏ธ `await`. โคด๏ธ ๐Ÿ‘ฅ ๐Ÿ’ช โœ `AsyncClient` โฎ๏ธ ๐Ÿ“ฑ, &amp; ๐Ÿ“จ ๐Ÿ” ๐Ÿ“จ โšซ๏ธ, โš™๏ธ `await`.
@ -81,12 +84,18 @@ response = client.get('/')
...๐Ÿ‘ˆ ๐Ÿ‘ฅ โš™๏ธ โš’ ๐Ÿ‘† ๐Ÿ“จ โฎ๏ธ `TestClient`. ...๐Ÿ‘ˆ ๐Ÿ‘ฅ โš™๏ธ โš’ ๐Ÿ‘† ๐Ÿ“จ โฎ๏ธ `TestClient`.
!!! tip /// tip
๐Ÿ—’ ๐Ÿ‘ˆ ๐Ÿ‘ฅ โš™๏ธ ๐Ÿ”/โŒ› โฎ๏ธ ๐Ÿ†• `AsyncClient` - ๐Ÿ“จ ๐Ÿ”.
๐Ÿ—’ ๐Ÿ‘ˆ ๐Ÿ‘ฅ โš™๏ธ ๐Ÿ”/โŒ› โฎ๏ธ ๐Ÿ†• `AsyncClient` - ๐Ÿ“จ ๐Ÿ”.
///
## ๐ŸŽ ๐Ÿ” ๐Ÿ”ข ๐Ÿค™ ## ๐ŸŽ ๐Ÿ” ๐Ÿ”ข ๐Ÿค™
๐Ÿ”ฌ ๐Ÿ”ข ๐Ÿ”œ ๐Ÿ”, ๐Ÿ‘† ๐Ÿ’ช ๐Ÿ”œ ๐Ÿค™ (&amp; `await`) ๐ŸŽ `async` ๐Ÿ”ข โ†–๏ธ โšช๏ธโžก๏ธ ๐Ÿ“จ ๐Ÿ“จ ๐Ÿ‘† FastAPI ๐Ÿˆธ ๐Ÿ‘† ๐Ÿ’ฏ, โšซ๏ธโ” ๐Ÿ‘† ๐Ÿ”œ ๐Ÿค™ ๐Ÿ‘ซ ๐Ÿ™† ๐Ÿ™† ๐Ÿ‘† ๐Ÿ“Ÿ. ๐Ÿ”ฌ ๐Ÿ”ข ๐Ÿ”œ ๐Ÿ”, ๐Ÿ‘† ๐Ÿ’ช ๐Ÿ”œ ๐Ÿค™ (&amp; `await`) ๐ŸŽ `async` ๐Ÿ”ข โ†–๏ธ โšช๏ธโžก๏ธ ๐Ÿ“จ ๐Ÿ“จ ๐Ÿ‘† FastAPI ๐Ÿˆธ ๐Ÿ‘† ๐Ÿ’ฏ, โšซ๏ธโ” ๐Ÿ‘† ๐Ÿ”œ ๐Ÿค™ ๐Ÿ‘ซ ๐Ÿ™† ๐Ÿ™† ๐Ÿ‘† ๐Ÿ“Ÿ.
!!! tip /// tip
๐Ÿšฅ ๐Ÿ‘† โš” `RuntimeError: Task attached to a different loop` ๐Ÿ•โ” ๐Ÿ› ๏ธ ๐Ÿ” ๐Ÿ”ข ๐Ÿค™ ๐Ÿ‘† ๐Ÿ’ฏ (โœ… ๐Ÿ•โ” โš™๏ธ <a href="https://stackoverflow.com/questions/41584243/runtimeerror-task-attached-to-a-different-loop" class="external-link" target="_blank">โœณ MotorClient</a>) ๐Ÿ’ญ ๐Ÿ”— ๐ŸŽš ๐Ÿ‘ˆ ๐Ÿ’ช ๐ŸŽ‰ โžฐ ๐Ÿ•ด ๐Ÿž ๐Ÿ” ๐Ÿ”ข, โœ… `'@app.on_event("startup")` โฒ.
๐Ÿšฅ ๐Ÿ‘† โš” `RuntimeError: Task attached to a different loop` ๐Ÿ•โ” ๐Ÿ› ๏ธ ๐Ÿ” ๐Ÿ”ข ๐Ÿค™ ๐Ÿ‘† ๐Ÿ’ฏ (โœ… ๐Ÿ•โ” โš™๏ธ <a href="https://stackoverflow.com/questions/41584243/runtimeerror-task-attached-to-a-different-loop" class="external-link" target="_blank">โœณ MotorClient</a>) ๐Ÿ’ญ ๐Ÿ”— ๐ŸŽš ๐Ÿ‘ˆ ๐Ÿ’ช ๐ŸŽ‰ โžฐ ๐Ÿ•ด ๐Ÿž ๐Ÿ” ๐Ÿ”ข, โœ… `'@app.on_event("startup")` โฒ.
///

51
docs/em/docs/advanced/behind-a-proxy.md

@ -39,8 +39,11 @@ browser --> proxy
proxy --> server proxy --> server
``` ```
!!! tip /// tip
๐Ÿ“ข `0.0.0.0` ๐Ÿ›Ž โš™๏ธ โ›“ ๐Ÿ‘ˆ ๐Ÿ“‹ ๐Ÿ‘‚ ๐Ÿ”› ๐ŸŒ ๐Ÿ“ข ๐Ÿ’ช ๐Ÿ‘ˆ ๐ŸŽฐ/๐Ÿ’ฝ.
๐Ÿ“ข `0.0.0.0` ๐Ÿ›Ž โš™๏ธ โ›“ ๐Ÿ‘ˆ ๐Ÿ“‹ ๐Ÿ‘‚ ๐Ÿ”› ๐ŸŒ ๐Ÿ“ข ๐Ÿ’ช ๐Ÿ‘ˆ ๐ŸŽฐ/๐Ÿ’ฝ.
///
๐Ÿฉบ ๐ŸŽš ๐Ÿ”œ ๐Ÿ’ช ๐Ÿ—„ ๐Ÿ”— ๐Ÿ“ฃ ๐Ÿ‘ˆ ๐Ÿ‘‰ ๐Ÿ› ๏ธ `server` ๐Ÿ”Ž `/api/v1` (โ›… ๐Ÿ—ณ). ๐Ÿ–ผ: ๐Ÿฉบ ๐ŸŽš ๐Ÿ”œ ๐Ÿ’ช ๐Ÿ—„ ๐Ÿ”— ๐Ÿ“ฃ ๐Ÿ‘ˆ ๐Ÿ‘‰ ๐Ÿ› ๏ธ `server` ๐Ÿ”Ž `/api/v1` (โ›… ๐Ÿ—ณ). ๐Ÿ–ผ:
@ -77,10 +80,13 @@ $ uvicorn main:app --root-path /api/v1
๐Ÿšฅ ๐Ÿ‘† โš™๏ธ Hypercorn, โšซ๏ธ โœ”๏ธ ๐ŸŽ› `--root-path`. ๐Ÿšฅ ๐Ÿ‘† โš™๏ธ Hypercorn, โšซ๏ธ โœ”๏ธ ๐ŸŽ› `--root-path`.
!!! note "๐Ÿ“ก โ„น" /// note | "๐Ÿ“ก โ„น"
๐Ÿ”ซ ๐Ÿ”ง ๐Ÿ”ฌ `root_path` ๐Ÿ‘‰ โš™๏ธ ๐Ÿ’ผ.
๐Ÿ”ซ ๐Ÿ”ง ๐Ÿ”ฌ `root_path` ๐Ÿ‘‰ โš™๏ธ ๐Ÿ’ผ.
&amp; `--root-path` ๐Ÿ“‹ โธ ๐ŸŽ› ๐Ÿšš ๐Ÿ‘ˆ `root_path`.
&amp; `--root-path` ๐Ÿ“‹ โธ ๐ŸŽ› ๐Ÿšš ๐Ÿ‘ˆ `root_path`. ///
### โœ… โฎ๏ธ `root_path` ### โœ… โฎ๏ธ `root_path`
@ -168,8 +174,11 @@ Uvicorn ๐Ÿ”œ โŒ› ๐Ÿ—ณ ๐Ÿ” Uvicorn `http://127.0.0.1:8000/app`, &amp; โคด๏ธ โšซ
๐Ÿ‘‰ ๐Ÿ’ฌ Traefik ๐Ÿ‘‚ ๐Ÿ”› โ›ด 9๏ธโƒฃ9๏ธโƒฃ9๏ธโƒฃ9๏ธโƒฃ &amp; โš™๏ธ โž•1๏ธโƒฃ ๐Ÿ“ `routes.toml`. ๐Ÿ‘‰ ๐Ÿ’ฌ Traefik ๐Ÿ‘‚ ๐Ÿ”› โ›ด 9๏ธโƒฃ9๏ธโƒฃ9๏ธโƒฃ9๏ธโƒฃ &amp; โš™๏ธ โž•1๏ธโƒฃ ๐Ÿ“ `routes.toml`.
!!! tip /// tip
๐Ÿ‘ฅ โš™๏ธ โ›ด 9๏ธโƒฃ9๏ธโƒฃ9๏ธโƒฃ9๏ธโƒฃ โ†ฉ๏ธ ๐Ÿฉ ๐Ÿ‡บ๐Ÿ‡ธ๐Ÿ” โ›ด 8๏ธโƒฃ0๏ธโƒฃ ๐Ÿ‘ˆ ๐Ÿ‘† ๐Ÿšซ โœ”๏ธ ๐Ÿƒ โšซ๏ธ โฎ๏ธ ๐Ÿ“ก (`sudo`) ๐Ÿ˜Œ.
๐Ÿ‘ฅ โš™๏ธ โ›ด 9๏ธโƒฃ9๏ธโƒฃ9๏ธโƒฃ9๏ธโƒฃ โ†ฉ๏ธ ๐Ÿฉ ๐Ÿ‡บ๐Ÿ‡ธ๐Ÿ” โ›ด 8๏ธโƒฃ0๏ธโƒฃ ๐Ÿ‘ˆ ๐Ÿ‘† ๐Ÿšซ โœ”๏ธ ๐Ÿƒ โšซ๏ธ โฎ๏ธ ๐Ÿ“ก (`sudo`) ๐Ÿ˜Œ.
///
๐Ÿ”œ โœ ๐Ÿ‘ˆ ๐ŸŽ ๐Ÿ“ `routes.toml`: ๐Ÿ”œ โœ ๐Ÿ‘ˆ ๐ŸŽ ๐Ÿ“ `routes.toml`:
@ -235,8 +244,11 @@ $ uvicorn main:app --root-path /api/v1
} }
``` ```
!!! tip /// tip
๐Ÿ‘€ ๐Ÿ‘ˆ โœ‹๏ธ ๐Ÿ‘† ๐Ÿ” โšซ๏ธ `http://127.0.0.1:8000/app` โšซ๏ธ ๐ŸŽฆ `root_path` `/api/v1`, โœŠ โšช๏ธโžก๏ธ ๐ŸŽ› `--root-path`.
๐Ÿ‘€ ๐Ÿ‘ˆ โœ‹๏ธ ๐Ÿ‘† ๐Ÿ” โšซ๏ธ `http://127.0.0.1:8000/app` โšซ๏ธ ๐ŸŽฆ `root_path` `/api/v1`, โœŠ โšช๏ธโžก๏ธ ๐ŸŽ› `--root-path`.
///
&amp; ๐Ÿ”œ ๐Ÿ“‚ ๐Ÿ“› โฎ๏ธ โ›ด Traefik, โœ… โžก ๐Ÿ”ก: <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>. &amp; ๐Ÿ”œ ๐Ÿ“‚ ๐Ÿ“› โฎ๏ธ โ›ด Traefik, โœ… โžก ๐Ÿ”ก: <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>.
@ -279,8 +291,11 @@ $ uvicorn main:app --root-path /api/v1
## ๐ŸŒ– ๐Ÿ’ฝ ## ๐ŸŒ– ๐Ÿ’ฝ
!!! warning /// warning
๐Ÿ‘‰ ๐ŸŒ… ๐Ÿง โš™๏ธ ๐Ÿ’ผ. ๐Ÿ’ญ ๐Ÿ†“ ๐Ÿšถ โšซ๏ธ.
๐Ÿ‘‰ ๐ŸŒ… ๐Ÿง โš™๏ธ ๐Ÿ’ผ. ๐Ÿ’ญ ๐Ÿ†“ ๐Ÿšถ โšซ๏ธ.
///
๐Ÿ”ข, **FastAPI** ๐Ÿ”œ โœ `server` ๐Ÿ—„ ๐Ÿ”— โฎ๏ธ ๐Ÿ“› `root_path`. ๐Ÿ”ข, **FastAPI** ๐Ÿ”œ โœ `server` ๐Ÿ—„ ๐Ÿ”— โฎ๏ธ ๐Ÿ“› `root_path`.
@ -319,15 +334,21 @@ $ uvicorn main:app --root-path /api/v1
} }
``` ```
!!! tip /// tip
๐Ÿ‘€ ๐Ÿš˜-๐Ÿ— ๐Ÿ’ฝ โฎ๏ธ `url` ๐Ÿ’ฒ `/api/v1`, โœŠ โšช๏ธโžก๏ธ `root_path`.
๐Ÿ‘€ ๐Ÿš˜-๐Ÿ— ๐Ÿ’ฝ โฎ๏ธ `url` ๐Ÿ’ฒ `/api/v1`, โœŠ โšช๏ธโžก๏ธ `root_path`.
///
๐Ÿฉบ ๐ŸŽš <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> โšซ๏ธ ๐Ÿ”œ ๐Ÿ‘€ ๐Ÿ’–: ๐Ÿฉบ ๐ŸŽš <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> โšซ๏ธ ๐Ÿ”œ ๐Ÿ‘€ ๐Ÿ’–:
<img src="/img/tutorial/behind-a-proxy/image03.png"> <img src="/img/tutorial/behind-a-proxy/image03.png">
!!! tip /// tip
๐Ÿฉบ ๐ŸŽš ๐Ÿ”œ ๐Ÿ”— โฎ๏ธ ๐Ÿ’ฝ ๐Ÿ‘ˆ ๐Ÿ‘† ๐Ÿ–Š.
๐Ÿฉบ ๐ŸŽš ๐Ÿ”œ ๐Ÿ”— โฎ๏ธ ๐Ÿ’ฝ ๐Ÿ‘ˆ ๐Ÿ‘† ๐Ÿ–Š.
///
### โŽ ๐Ÿง ๐Ÿ’ฝ โšช๏ธโžก๏ธ `root_path` ### โŽ ๐Ÿง ๐Ÿ’ฝ โšช๏ธโžก๏ธ `root_path`

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

@ -12,8 +12,11 @@
&amp; ๐Ÿšฅ ๐Ÿ‘ˆ `Response` โœ”๏ธ ๐ŸŽป ๐Ÿ“ป ๐Ÿ†Ž (`application/json`), ๐Ÿ’– ๐Ÿ’ผ โฎ๏ธ `JSONResponse` &amp; `UJSONResponse`, ๐Ÿ’ฝ ๐Ÿ‘† ๐Ÿ“จ ๐Ÿ”œ ๐Ÿ” ๐Ÿ—œ (&amp; โ›ฝ) โฎ๏ธ ๐Ÿ™† Pydantic `response_model` ๐Ÿ‘ˆ ๐Ÿ‘† ๐Ÿ“ฃ *โžก ๐Ÿ› ๏ธ ๐Ÿ‘จโ€๐ŸŽจ*. &amp; ๐Ÿšฅ ๐Ÿ‘ˆ `Response` โœ”๏ธ ๐ŸŽป ๐Ÿ“ป ๐Ÿ†Ž (`application/json`), ๐Ÿ’– ๐Ÿ’ผ โฎ๏ธ `JSONResponse` &amp; `UJSONResponse`, ๐Ÿ’ฝ ๐Ÿ‘† ๐Ÿ“จ ๐Ÿ”œ ๐Ÿ” ๐Ÿ—œ (&amp; โ›ฝ) โฎ๏ธ ๐Ÿ™† Pydantic `response_model` ๐Ÿ‘ˆ ๐Ÿ‘† ๐Ÿ“ฃ *โžก ๐Ÿ› ๏ธ ๐Ÿ‘จโ€๐ŸŽจ*.
!!! note /// note
๐Ÿšฅ ๐Ÿ‘† โš™๏ธ ๐Ÿ“จ ๐ŸŽ“ โฎ๏ธ ๐Ÿ™…โ€โ™‚ ๐Ÿ“ป ๐Ÿ†Ž, FastAPI ๐Ÿ”œ โŒ› ๐Ÿ‘† ๐Ÿ“จ โœ”๏ธ ๐Ÿ™…โ€โ™‚ ๐ŸŽš, โšซ๏ธ ๐Ÿ”œ ๐Ÿšซ ๐Ÿ“„ ๐Ÿ“จ ๐Ÿ“ ๐Ÿšฎ ๐Ÿ— ๐Ÿ—„ ๐Ÿฉบ.
๐Ÿšฅ ๐Ÿ‘† โš™๏ธ ๐Ÿ“จ ๐ŸŽ“ โฎ๏ธ ๐Ÿ™…โ€โ™‚ ๐Ÿ“ป ๐Ÿ†Ž, FastAPI ๐Ÿ”œ โŒ› ๐Ÿ‘† ๐Ÿ“จ โœ”๏ธ ๐Ÿ™…โ€โ™‚ ๐ŸŽš, โšซ๏ธ ๐Ÿ”œ ๐Ÿšซ ๐Ÿ“„ ๐Ÿ“จ ๐Ÿ“ ๐Ÿšฎ ๐Ÿ— ๐Ÿ—„ ๐Ÿฉบ.
///
## โš™๏ธ `ORJSONResponse` ## โš™๏ธ `ORJSONResponse`
@ -31,15 +34,21 @@
{!../../../docs_src/custom_response/tutorial001b.py!} {!../../../docs_src/custom_response/tutorial001b.py!}
``` ```
!!! info /// info
๐Ÿ”ข `response_class` ๐Ÿ”œ โš™๏ธ ๐Ÿ”ฌ "๐Ÿ“ป ๐Ÿ†Ž" ๐Ÿ“จ.
๐Ÿ”ข `response_class` ๐Ÿ”œ โš™๏ธ ๐Ÿ”ฌ "๐Ÿ“ป ๐Ÿ†Ž" ๐Ÿ“จ.
๐Ÿ‘‰ ๐Ÿ’ผ, ๐Ÿ‡บ๐Ÿ‡ธ๐Ÿ” ๐ŸŽš `Content-Type` ๐Ÿ”œ โš’ `application/json`.
&amp; โšซ๏ธ ๐Ÿ”œ ๐Ÿ“„ โœ… ๐Ÿ—„.
///
๐Ÿ‘‰ ๐Ÿ’ผ, ๐Ÿ‡บ๐Ÿ‡ธ๐Ÿ” ๐ŸŽš `Content-Type` ๐Ÿ”œ โš’ `application/json`. /// tip
&amp; โšซ๏ธ ๐Ÿ”œ ๐Ÿ“„ โœ… ๐Ÿ—„. `ORJSONResponse` โณ ๐Ÿ•ด ๐Ÿ’ช FastAPI, ๐Ÿšซ ๐Ÿ’ƒ.
!!! tip ///
`ORJSONResponse` โณ ๐Ÿ•ด ๐Ÿ’ช FastAPI, ๐Ÿšซ ๐Ÿ’ƒ.
## ๐Ÿ•ธ ๐Ÿ“จ ## ๐Ÿ•ธ ๐Ÿ“จ
@ -52,12 +61,15 @@
{!../../../docs_src/custom_response/tutorial002.py!} {!../../../docs_src/custom_response/tutorial002.py!}
``` ```
!!! info /// info
๐Ÿ”ข `response_class` ๐Ÿ”œ โš™๏ธ ๐Ÿ”ฌ "๐Ÿ“ป ๐Ÿ†Ž" ๐Ÿ“จ.
๐Ÿ‘‰ ๐Ÿ’ผ, ๐Ÿ‡บ๐Ÿ‡ธ๐Ÿ” ๐ŸŽš `Content-Type` ๐Ÿ”œ โš’ `text/html`. ๐Ÿ”ข `response_class` ๐Ÿ”œ โš™๏ธ ๐Ÿ”ฌ "๐Ÿ“ป ๐Ÿ†Ž" ๐Ÿ“จ.
&amp; โšซ๏ธ ๐Ÿ”œ ๐Ÿ“„ โœ… ๐Ÿ—„. ๐Ÿ‘‰ ๐Ÿ’ผ, ๐Ÿ‡บ๐Ÿ‡ธ๐Ÿ” ๐ŸŽš `Content-Type` ๐Ÿ”œ โš’ `text/html`.
&amp; โšซ๏ธ ๐Ÿ”œ ๐Ÿ“„ โœ… ๐Ÿ—„.
///
### ๐Ÿ“จ `Response` ### ๐Ÿ“จ `Response`
@ -69,11 +81,17 @@
{!../../../docs_src/custom_response/tutorial003.py!} {!../../../docs_src/custom_response/tutorial003.py!}
``` ```
!!! warning /// warning
`Response` ๐Ÿ“จ ๐Ÿ”— ๐Ÿ‘† *โžก ๐Ÿ› ๏ธ ๐Ÿ”ข* ๐Ÿ† ๐Ÿšซ ๐Ÿ“„ ๐Ÿ—„ (๐Ÿ–ผ, `Content-Type` ๐Ÿ† ๐Ÿšซ ๐Ÿ“„) &amp; ๐Ÿ† ๐Ÿšซ โญ ๐Ÿง ๐ŸŽ“ ๐Ÿฉบ.
`Response` ๐Ÿ“จ ๐Ÿ”— ๐Ÿ‘† *โžก ๐Ÿ› ๏ธ ๐Ÿ”ข* ๐Ÿ† ๐Ÿšซ ๐Ÿ“„ ๐Ÿ—„ (๐Ÿ–ผ, `Content-Type` ๐Ÿ† ๐Ÿšซ ๐Ÿ“„) &amp; ๐Ÿ† ๐Ÿšซ โญ ๐Ÿง ๐ŸŽ“ ๐Ÿฉบ.
///
/// info
!!! info โ†—๏ธ, โ˜‘ `Content-Type` ๐ŸŽš, ๐Ÿ‘” ๐Ÿ“Ÿ, โ™’๏ธ, ๐Ÿ”œ ๐Ÿ‘Ÿ โšช๏ธโžก๏ธ `Response` ๐ŸŽš ๐Ÿ‘† ๐Ÿ“จ.
โ†—๏ธ, โ˜‘ `Content-Type` ๐ŸŽš, ๐Ÿ‘” ๐Ÿ“Ÿ, โ™’๏ธ, ๐Ÿ”œ ๐Ÿ‘Ÿ โšช๏ธโžก๏ธ `Response` ๐ŸŽš ๐Ÿ‘† ๐Ÿ“จ.
///
### ๐Ÿ“„ ๐Ÿ—„ &amp; ๐Ÿ” `Response` ### ๐Ÿ“„ ๐Ÿ—„ &amp; ๐Ÿ” `Response`
@ -103,10 +121,13 @@
โœ”๏ธ ๐Ÿคฏ ๐Ÿ‘ˆ ๐Ÿ‘† ๐Ÿ’ช โš™๏ธ `Response` ๐Ÿ“จ ๐Ÿ•ณ ๐Ÿ™†, โš–๏ธ โœ ๐Ÿ›ƒ ๐ŸŽง-๐ŸŽ“. โœ”๏ธ ๐Ÿคฏ ๐Ÿ‘ˆ ๐Ÿ‘† ๐Ÿ’ช โš™๏ธ `Response` ๐Ÿ“จ ๐Ÿ•ณ ๐Ÿ™†, โš–๏ธ โœ ๐Ÿ›ƒ ๐ŸŽง-๐ŸŽ“.
!!! note "๐Ÿ“ก โ„น" /// note | "๐Ÿ“ก โ„น"
๐Ÿ‘† ๐Ÿ’ช โš™๏ธ `from starlette.responses import HTMLResponse`.
๐Ÿ‘† ๐Ÿ’ช โš™๏ธ `from starlette.responses import HTMLResponse`.
**FastAPI** ๐Ÿšš ๐ŸŽ `starlette.responses` `fastapi.responses` ๐Ÿช ๐Ÿ‘†, ๐Ÿ‘ฉโ€๐Ÿ’ป. โœ‹๏ธ ๐ŸŒ… ๐Ÿ’ช ๐Ÿ“จ ๐Ÿ‘Ÿ ๐Ÿ”— โšช๏ธโžก๏ธ ๐Ÿ’ƒ.
**FastAPI** ๐Ÿšš ๐ŸŽ `starlette.responses` `fastapi.responses` ๐Ÿช ๐Ÿ‘†, ๐Ÿ‘ฉโ€๐Ÿ’ป. โœ‹๏ธ ๐ŸŒ… ๐Ÿ’ช ๐Ÿ“จ ๐Ÿ‘Ÿ ๐Ÿ”— โšช๏ธโžก๏ธ ๐Ÿ’ƒ. ///
### `Response` ### `Response`
@ -153,15 +174,21 @@ FastAPI (๐Ÿค™ ๐Ÿ’ƒ) ๐Ÿ”œ ๐Ÿ” ๐Ÿ”Œ ๐ŸŽš-๐Ÿ“ ๐ŸŽš. โšซ๏ธ ๐Ÿ”œ ๐Ÿ”Œ ๐ŸŽš-๐Ÿ†Ž
๐ŸŽ› ๐ŸŽป ๐Ÿ“จ โš™๏ธ <a href="https://github.com/ultrajson/ultrajson" class="external-link" target="_blank">`ujson`</a>. ๐ŸŽ› ๐ŸŽป ๐Ÿ“จ โš™๏ธ <a href="https://github.com/ultrajson/ultrajson" class="external-link" target="_blank">`ujson`</a>.
!!! warning /// warning
`ujson` ๐ŸŒ˜ ๐Ÿ’› ๐ŸŒ˜ ๐Ÿ ๐Ÿ—-๐Ÿ› ๏ธ โ” โšซ๏ธ ๐Ÿต ๐Ÿ“-๐Ÿ’ผ.
`ujson` ๐ŸŒ˜ ๐Ÿ’› ๐ŸŒ˜ ๐Ÿ ๐Ÿ—-๐Ÿ› ๏ธ โ” โšซ๏ธ ๐Ÿต ๐Ÿ“-๐Ÿ’ผ.
///
```Python hl_lines="2 7" ```Python hl_lines="2 7"
{!../../../docs_src/custom_response/tutorial001.py!} {!../../../docs_src/custom_response/tutorial001.py!}
``` ```
!!! tip /// tip
โšซ๏ธ ๐Ÿ’ช ๐Ÿ‘ˆ `ORJSONResponse` ๐Ÿ’ช โฉ ๐ŸŽ›.
โšซ๏ธ ๐Ÿ’ช ๐Ÿ‘ˆ `ORJSONResponse` ๐Ÿ’ช โฉ ๐ŸŽ›.
///
### `RedirectResponse` ### `RedirectResponse`
@ -222,8 +249,11 @@ FastAPI (๐Ÿค™ ๐Ÿ’ƒ) ๐Ÿ”œ ๐Ÿ” ๐Ÿ”Œ ๐ŸŽš-๐Ÿ“ ๐ŸŽš. โšซ๏ธ ๐Ÿ”œ ๐Ÿ”Œ ๐ŸŽš-๐Ÿ†Ž
๐Ÿ”จ โšซ๏ธ ๐Ÿ‘‰ ๐ŸŒŒ, ๐Ÿ‘ฅ ๐Ÿ’ช ๐Ÿšฎ โšซ๏ธ `with` ๐Ÿซ, &amp; ๐Ÿ‘ˆ ๐ŸŒŒ, ๐Ÿšš ๐Ÿ‘ˆ โšซ๏ธ ๐Ÿ“ช โฎ๏ธ ๐Ÿ. ๐Ÿ”จ โšซ๏ธ ๐Ÿ‘‰ ๐ŸŒŒ, ๐Ÿ‘ฅ ๐Ÿ’ช ๐Ÿšฎ โšซ๏ธ `with` ๐Ÿซ, &amp; ๐Ÿ‘ˆ ๐ŸŒŒ, ๐Ÿšš ๐Ÿ‘ˆ โšซ๏ธ ๐Ÿ“ช โฎ๏ธ ๐Ÿ.
!!! tip /// tip
๐Ÿ‘€ ๐Ÿ‘ˆ ๐Ÿ“ฅ ๐Ÿ‘ฅ โš™๏ธ ๐Ÿฉ `open()` ๐Ÿ‘ˆ ๐Ÿšซ ๐Ÿ•โ€๐Ÿฆบ `async` &amp; `await`, ๐Ÿ‘ฅ ๐Ÿ“ฃ โžก ๐Ÿ› ๏ธ โฎ๏ธ ๐Ÿ˜ `def`.
๐Ÿ‘€ ๐Ÿ‘ˆ ๐Ÿ“ฅ ๐Ÿ‘ฅ โš™๏ธ ๐Ÿฉ `open()` ๐Ÿ‘ˆ ๐Ÿšซ ๐Ÿ•โ€๐Ÿฆบ `async` &amp; `await`, ๐Ÿ‘ฅ ๐Ÿ“ฃ โžก ๐Ÿ› ๏ธ โฎ๏ธ ๐Ÿ˜ `def`.
///
### `FileResponse` ### `FileResponse`
@ -292,8 +322,11 @@ FastAPI (๐Ÿค™ ๐Ÿ’ƒ) ๐Ÿ”œ ๐Ÿ” ๐Ÿ”Œ ๐ŸŽš-๐Ÿ“ ๐ŸŽš. โšซ๏ธ ๐Ÿ”œ ๐Ÿ”Œ ๐ŸŽš-๐Ÿ†Ž
{!../../../docs_src/custom_response/tutorial010.py!} {!../../../docs_src/custom_response/tutorial010.py!}
``` ```
!!! tip /// tip
๐Ÿ‘† ๐Ÿ’ช ๐Ÿ” `response_class` *โžก ๐Ÿ› ๏ธ* โญ.
๐Ÿ‘† ๐Ÿ’ช ๐Ÿ” `response_class` *โžก ๐Ÿ› ๏ธ* โญ.
///
## ๐ŸŒ– ๐Ÿงพ ## ๐ŸŒ– ๐Ÿงพ

11
docs/em/docs/advanced/dataclasses.md

@ -20,12 +20,15 @@ FastAPI ๐Ÿ— ๐Ÿ”› ๐Ÿ” **Pydantic**, &amp; ๐Ÿ‘ค โœ”๏ธ ๐ŸŒ ๐Ÿ‘† โ” โš™๏ธ Pyda
๐Ÿ‘‰ ๐Ÿ‘ท ๐ŸŽ ๐ŸŒŒ โฎ๏ธ Pydantic ๐Ÿท. &amp; โšซ๏ธ ๐Ÿค™ ๐Ÿ† ๐ŸŽ ๐ŸŒŒ ๐Ÿ”˜, โš™๏ธ Pydantic. ๐Ÿ‘‰ ๐Ÿ‘ท ๐ŸŽ ๐ŸŒŒ โฎ๏ธ Pydantic ๐Ÿท. &amp; โšซ๏ธ ๐Ÿค™ ๐Ÿ† ๐ŸŽ ๐ŸŒŒ ๐Ÿ”˜, โš™๏ธ Pydantic.
!!! info /// info
โœ”๏ธ ๐Ÿคฏ ๐Ÿ‘ˆ ๐ŸŽป ๐Ÿ’ช ๐Ÿšซ ๐ŸŒ Pydantic ๐Ÿท ๐Ÿ’ช.
, ๐Ÿ‘† 5๏ธโƒฃ๐Ÿ“† ๐Ÿ’ช โš™๏ธ Pydantic ๐Ÿท. โœ”๏ธ ๐Ÿคฏ ๐Ÿ‘ˆ ๐ŸŽป ๐Ÿ’ช ๐Ÿšซ ๐ŸŒ Pydantic ๐Ÿท ๐Ÿ’ช.
โœ‹๏ธ ๐Ÿšฅ ๐Ÿ‘† โœ”๏ธ ๐Ÿ“š ๐ŸŽป ๐Ÿคฅ ๐Ÿคญ, ๐Ÿ‘‰ ๐Ÿ‘Œ ๐ŸŽฑ โš™๏ธ ๐Ÿ‘ซ ๐Ÿ‹๏ธ ๐Ÿ•ธ ๐Ÿ› ๏ธ โš™๏ธ FastAPI. ๐Ÿ‘ถ , ๐Ÿ‘† 5๏ธโƒฃ๐Ÿ“† ๐Ÿ’ช โš™๏ธ Pydantic ๐Ÿท.
โœ‹๏ธ ๐Ÿšฅ ๐Ÿ‘† โœ”๏ธ ๐Ÿ“š ๐ŸŽป ๐Ÿคฅ ๐Ÿคญ, ๐Ÿ‘‰ ๐Ÿ‘Œ ๐ŸŽฑ โš™๏ธ ๐Ÿ‘ซ ๐Ÿ‹๏ธ ๐Ÿ•ธ ๐Ÿ› ๏ธ โš™๏ธ FastAPI. ๐Ÿ‘ถ
///
## ๐ŸŽป `response_model` ## ๐ŸŽป `response_model`

45
docs/em/docs/advanced/events.md

@ -38,10 +38,13 @@
&amp; โคด๏ธ, โ–ถ๏ธ๏ธ โฎ๏ธ `yield`, ๐Ÿ‘ฅ ๐Ÿšš ๐Ÿท. ๐Ÿ‘‰ ๐Ÿ“Ÿ ๐Ÿ”œ ๐Ÿ› ๏ธ **โฎ๏ธ** ๐Ÿˆธ **๐Ÿ ๐Ÿšš ๐Ÿ“จ**, โ–ถ๏ธ๏ธ โญ *๐Ÿคซ*. ๐Ÿ‘‰ ๐Ÿ’ช, ๐Ÿ–ผ, ๐Ÿš€ โ„น ๐Ÿ’– ๐Ÿ’พ โš–๏ธ ๐Ÿ’ป. &amp; โคด๏ธ, โ–ถ๏ธ๏ธ โฎ๏ธ `yield`, ๐Ÿ‘ฅ ๐Ÿšš ๐Ÿท. ๐Ÿ‘‰ ๐Ÿ“Ÿ ๐Ÿ”œ ๐Ÿ› ๏ธ **โฎ๏ธ** ๐Ÿˆธ **๐Ÿ ๐Ÿšš ๐Ÿ“จ**, โ–ถ๏ธ๏ธ โญ *๐Ÿคซ*. ๐Ÿ‘‰ ๐Ÿ’ช, ๐Ÿ–ผ, ๐Ÿš€ โ„น ๐Ÿ’– ๐Ÿ’พ โš–๏ธ ๐Ÿ’ป.
!!! tip /// tip
`shutdown` ๐Ÿ”œ ๐Ÿ”จ ๐Ÿ•โ” ๐Ÿ‘† **โ›”๏ธ** ๐Ÿˆธ.
๐ŸŽฒ ๐Ÿ‘† ๐Ÿ’ช โ–ถ๏ธ ๐Ÿ†• โฌ, โš–๏ธ ๐Ÿ‘† ๐Ÿคš ๐ŸŽก ๐Ÿƒ โšซ๏ธ. ๐Ÿคท `shutdown` ๐Ÿ”œ ๐Ÿ”จ ๐Ÿ•โ” ๐Ÿ‘† **โ›”๏ธ** ๐Ÿˆธ.
๐ŸŽฒ ๐Ÿ‘† ๐Ÿ’ช โ–ถ๏ธ ๐Ÿ†• โฌ, โš–๏ธ ๐Ÿ‘† ๐Ÿคš ๐ŸŽก ๐Ÿƒ โšซ๏ธ. ๐Ÿคท
///
### ๐Ÿ”† ๐Ÿ”ข ### ๐Ÿ”† ๐Ÿ”ข
@ -91,10 +94,13 @@ async with lifespan(app):
## ๐ŸŽ› ๐ŸŽ‰ (๐Ÿ˜ข) ## ๐ŸŽ› ๐ŸŽ‰ (๐Ÿ˜ข)
!!! warning /// warning
๐Ÿ‘ ๐ŸŒŒ ๐Ÿต *๐Ÿ•ด* &amp; *๐Ÿคซ* โš™๏ธ `lifespan` ๐Ÿ”ข `FastAPI` ๐Ÿ“ฑ ๐Ÿ”ฌ ๐Ÿ”›.
๐Ÿ‘ ๐ŸŒŒ ๐Ÿต *๐Ÿ•ด* &amp; *๐Ÿคซ* โš™๏ธ `lifespan` ๐Ÿ”ข `FastAPI` ๐Ÿ“ฑ ๐Ÿ”ฌ ๐Ÿ”›.
๐Ÿ‘† ๐Ÿ’ช ๐ŸŽฒ ๐Ÿšถ ๐Ÿ‘‰ ๐Ÿ•. ๐Ÿ‘† ๐Ÿ’ช ๐ŸŽฒ ๐Ÿšถ ๐Ÿ‘‰ ๐Ÿ•.
///
๐Ÿ“ค ๐ŸŽ› ๐ŸŒŒ ๐Ÿ”ฌ ๐Ÿ‘‰ โš› ๐Ÿ› ๏ธ โฎ๏ธ *๐Ÿ•ด* &amp; โฎ๏ธ *๐Ÿคซ*. ๐Ÿ“ค ๐ŸŽ› ๐ŸŒŒ ๐Ÿ”ฌ ๐Ÿ‘‰ โš› ๐Ÿ› ๏ธ โฎ๏ธ *๐Ÿ•ด* &amp; โฎ๏ธ *๐Ÿคซ*.
@ -126,20 +132,29 @@ async with lifespan(app):
๐Ÿ“ฅ, `shutdown` ๐ŸŽ‰ ๐Ÿ•โ€๐Ÿฆบ ๐Ÿ”ข ๐Ÿ”œ โœ โœ โธ `"Application shutdown"` ๐Ÿ“ `log.txt`. ๐Ÿ“ฅ, `shutdown` ๐ŸŽ‰ ๐Ÿ•โ€๐Ÿฆบ ๐Ÿ”ข ๐Ÿ”œ โœ โœ โธ `"Application shutdown"` ๐Ÿ“ `log.txt`.
!!! info /// info
`open()` ๐Ÿ”ข, `mode="a"` โ›“ "๐ŸŽป",, โธ ๐Ÿ”œ ๐Ÿšฎ โฎ๏ธ โšซ๏ธโ” ๐Ÿ”› ๐Ÿ‘ˆ ๐Ÿ“, ๐Ÿต ๐Ÿ“ โฎ๏ธ ๐ŸŽš.
`open()` ๐Ÿ”ข, `mode="a"` โ›“ "๐ŸŽป",, โธ ๐Ÿ”œ ๐Ÿšฎ โฎ๏ธ โšซ๏ธโ” ๐Ÿ”› ๐Ÿ‘ˆ ๐Ÿ“, ๐Ÿต ๐Ÿ“ โฎ๏ธ ๐ŸŽš.
///
/// tip
๐Ÿ‘€ ๐Ÿ‘ˆ ๐Ÿ‘‰ ๐Ÿ’ผ ๐Ÿ‘ฅ โš™๏ธ ๐Ÿฉ ๐Ÿ `open()` ๐Ÿ”ข ๐Ÿ‘ˆ ๐Ÿ”— โฎ๏ธ ๐Ÿ“.
, โšซ๏ธ ๐Ÿ”Œ ๐Ÿ‘ค/๐Ÿ…พ (๐Ÿ”ข/๐Ÿ”ข), ๐Ÿ‘ˆ ๐Ÿšš "โŒ›" ๐Ÿ‘œ โœ ๐Ÿ’พ.
โœ‹๏ธ `open()` ๐Ÿšซ โš™๏ธ `async` &amp; `await`.
!!! tip , ๐Ÿ‘ฅ ๐Ÿ“ฃ ๐ŸŽ‰ ๐Ÿ•โ€๐Ÿฆบ ๐Ÿ”ข โฎ๏ธ ๐Ÿฉ `def` โ†ฉ๏ธ `async def`.
๐Ÿ‘€ ๐Ÿ‘ˆ ๐Ÿ‘‰ ๐Ÿ’ผ ๐Ÿ‘ฅ โš™๏ธ ๐Ÿฉ ๐Ÿ `open()` ๐Ÿ”ข ๐Ÿ‘ˆ ๐Ÿ”— โฎ๏ธ ๐Ÿ“.
, โšซ๏ธ ๐Ÿ”Œ ๐Ÿ‘ค/๐Ÿ…พ (๐Ÿ”ข/๐Ÿ”ข), ๐Ÿ‘ˆ ๐Ÿšš "โŒ›" ๐Ÿ‘œ โœ ๐Ÿ’พ. ///
โœ‹๏ธ `open()` ๐Ÿšซ โš™๏ธ `async` &amp; `await`. /// info
, ๐Ÿ‘ฅ ๐Ÿ“ฃ ๐ŸŽ‰ ๐Ÿ•โ€๐Ÿฆบ ๐Ÿ”ข โฎ๏ธ ๐Ÿฉ `def` โ†ฉ๏ธ `async def`. ๐Ÿ‘† ๐Ÿ’ช โœ ๐ŸŒ… ๐Ÿ”ƒ ๐Ÿ‘ซ ๐ŸŽ‰ ๐Ÿ•โ€๐Ÿฆบ <a href="https://www.starlette.io/events/" class="external-link" target="_blank">๐Ÿ’ƒ ๐ŸŽ‰' ๐Ÿฉบ</a>.
!!! info ///
๐Ÿ‘† ๐Ÿ’ช โœ ๐ŸŒ… ๐Ÿ”ƒ ๐Ÿ‘ซ ๐ŸŽ‰ ๐Ÿ•โ€๐Ÿฆบ <a href="https://www.starlette.io/events/" class="external-link" target="_blank">๐Ÿ’ƒ ๐ŸŽ‰' ๐Ÿฉบ</a>.
### `startup` &amp; `shutdown` ๐Ÿ‘ฏโ€โ™‚๏ธ ### `startup` &amp; `shutdown` ๐Ÿ‘ฏโ€โ™‚๏ธ

67
docs/em/docs/advanced/generate-clients.md

@ -16,17 +16,21 @@
โžก๏ธ โ–ถ๏ธ โฎ๏ธ ๐Ÿ™… FastAPI ๐Ÿˆธ: โžก๏ธ โ–ถ๏ธ โฎ๏ธ ๐Ÿ™… FastAPI ๐Ÿˆธ:
=== "๐Ÿ 3๏ธโƒฃ.6๏ธโƒฃ &amp; ๐Ÿ”›" //// tab | ๐Ÿ 3๏ธโƒฃ.6๏ธโƒฃ &amp; ๐Ÿ”›
```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!}
``` ```
////
=== "๐Ÿ 3๏ธโƒฃ.9๏ธโƒฃ &amp; ๐Ÿ”›" //// tab | ๐Ÿ 3๏ธโƒฃ.9๏ธโƒฃ &amp; ๐Ÿ”›
```Python hl_lines="7-9 12-13 16-17 21"
{!> ../../../docs_src/generate_clients/tutorial001_py39.py!}
```
```Python hl_lines="7-9 12-13 16-17 21" ////
{!> ../../../docs_src/generate_clients/tutorial001_py39.py!}
```
๐Ÿ‘€ ๐Ÿ‘ˆ *โžก ๐Ÿ› ๏ธ* ๐Ÿ”ฌ ๐Ÿท ๐Ÿ‘ซ โš™๏ธ ๐Ÿ“จ ๐Ÿš€ &amp; ๐Ÿ“จ ๐Ÿš€, โš™๏ธ ๐Ÿท `Item` &amp; `ResponseMessage`. ๐Ÿ‘€ ๐Ÿ‘ˆ *โžก ๐Ÿ› ๏ธ* ๐Ÿ”ฌ ๐Ÿท ๐Ÿ‘ซ โš™๏ธ ๐Ÿ“จ ๐Ÿš€ &amp; ๐Ÿ“จ ๐Ÿš€, โš™๏ธ ๐Ÿท `Item` &amp; `ResponseMessage`.
@ -111,8 +115,11 @@ [email protected] generate-client /home/user/code/frontend-app
<img src="/img/tutorial/generate-clients/image03.png"> <img src="/img/tutorial/generate-clients/image03.png">
!!! tip /// tip
๐Ÿ‘€ โœ `name` &amp; `price`, ๐Ÿ‘ˆ ๐Ÿ”ฌ FastAPI ๐Ÿˆธ, `Item` ๐Ÿท.
๐Ÿ‘€ โœ `name` &amp; `price`, ๐Ÿ‘ˆ ๐Ÿ”ฌ FastAPI ๐Ÿˆธ, `Item` ๐Ÿท.
///
๐Ÿ‘† ๐Ÿ”œ โœ”๏ธ โธ โŒ ๐Ÿ“Š ๐Ÿ‘ˆ ๐Ÿ‘† ๐Ÿ“จ: ๐Ÿ‘† ๐Ÿ”œ โœ”๏ธ โธ โŒ ๐Ÿ“Š ๐Ÿ‘ˆ ๐Ÿ‘† ๐Ÿ“จ:
@ -129,17 +136,21 @@ [email protected] generate-client /home/user/code/frontend-app
๐Ÿ–ผ, ๐Ÿ‘† ๐Ÿ’ช โœ”๏ธ ๐Ÿ“„ **๐Ÿฌ** &amp; โž•1๏ธโƒฃ ๐Ÿ“„ **๐Ÿ‘ฉโ€๐Ÿ’ป**, &amp; ๐Ÿ‘ซ ๐Ÿ’ช ๐Ÿ‘ฝ ๐Ÿ”–: ๐Ÿ–ผ, ๐Ÿ‘† ๐Ÿ’ช โœ”๏ธ ๐Ÿ“„ **๐Ÿฌ** &amp; โž•1๏ธโƒฃ ๐Ÿ“„ **๐Ÿ‘ฉโ€๐Ÿ’ป**, &amp; ๐Ÿ‘ซ ๐Ÿ’ช ๐Ÿ‘ฝ ๐Ÿ”–:
=== "๐Ÿ 3๏ธโƒฃ.6๏ธโƒฃ &amp; ๐Ÿ”›" //// tab | ๐Ÿ 3๏ธโƒฃ.6๏ธโƒฃ &amp; ๐Ÿ”›
```Python hl_lines="23 28 36"
{!> ../../../docs_src/generate_clients/tutorial002.py!}
```
////
```Python hl_lines="23 28 36" //// tab | ๐Ÿ 3๏ธโƒฃ.9๏ธโƒฃ &amp; ๐Ÿ”›
{!> ../../../docs_src/generate_clients/tutorial002.py!}
```
=== "๐Ÿ 3๏ธโƒฃ.9๏ธโƒฃ &amp; ๐Ÿ”›" ```Python hl_lines="21 26 34"
{!> ../../../docs_src/generate_clients/tutorial002_py39.py!}
```
```Python hl_lines="21 26 34" ////
{!> ../../../docs_src/generate_clients/tutorial002_py39.py!}
```
### ๐Ÿ— ๐Ÿ“• ๐Ÿ‘ฉโ€๐Ÿ’ป โฎ๏ธ ๐Ÿ”– ### ๐Ÿ— ๐Ÿ“• ๐Ÿ‘ฉโ€๐Ÿ’ป โฎ๏ธ ๐Ÿ”–
@ -186,17 +197,21 @@ FastAPI โš™๏ธ **๐Ÿ˜ ๐Ÿ†”** ๐Ÿ”  *โžก ๐Ÿ› ๏ธ*, โšซ๏ธ โš™๏ธ **๐Ÿ› ๏ธ ๐Ÿ†”**
๐Ÿ‘† ๐Ÿ’ช โคด๏ธ ๐Ÿšถโ€โ™€๏ธ ๐Ÿ‘ˆ ๐Ÿ›ƒ ๐Ÿ”ข **FastAPI** `generate_unique_id_function` ๐Ÿ”ข: ๐Ÿ‘† ๐Ÿ’ช โคด๏ธ ๐Ÿšถโ€โ™€๏ธ ๐Ÿ‘ˆ ๐Ÿ›ƒ ๐Ÿ”ข **FastAPI** `generate_unique_id_function` ๐Ÿ”ข:
=== "๐Ÿ 3๏ธโƒฃ.6๏ธโƒฃ &amp; ๐Ÿ”›" //// tab | ๐Ÿ 3๏ธโƒฃ.6๏ธโƒฃ &amp; ๐Ÿ”›
```Python hl_lines="8-9 12" ```Python hl_lines="8-9 12"
{!> ../../../docs_src/generate_clients/tutorial003.py!} {!> ../../../docs_src/generate_clients/tutorial003.py!}
``` ```
=== "๐Ÿ 3๏ธโƒฃ.9๏ธโƒฃ &amp; ๐Ÿ”›" ////
//// tab | ๐Ÿ 3๏ธโƒฃ.9๏ธโƒฃ &amp; ๐Ÿ”›
```Python hl_lines="6-7 10"
{!> ../../../docs_src/generate_clients/tutorial003_py39.py!}
```
```Python hl_lines="6-7 10" ////
{!> ../../../docs_src/generate_clients/tutorial003_py39.py!}
```
### ๐Ÿ— ๐Ÿ“• ๐Ÿ‘ฉโ€๐Ÿ’ป โฎ๏ธ ๐Ÿ›ƒ ๐Ÿ› ๏ธ ๐Ÿ†” ### ๐Ÿ— ๐Ÿ“• ๐Ÿ‘ฉโ€๐Ÿ’ป โฎ๏ธ ๐Ÿ›ƒ ๐Ÿ› ๏ธ ๐Ÿ†”

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

Loadingโ€ฆ
Cancel
Save