Compare commits

...

640 Commits

Author SHA1 Message Date
Sebastián Ramírez
bb8c2a6498 🔖 Release version 0.115.6 2024-12-03 23:40:01 +01:00
github-actions
905ec1edde 📝 Update release notes
[skip ci]
2024-12-03 22:37:38 +00:00
Abdullah Hashim
4f8157588e 🐛 Preserve traceback when exception is raised in sync dependency with yield (#5823)
Co-authored-by: Marcelo Trylesinski <marcelotryle@gmail.com>
2024-12-03 23:37:12 +01:00
github-actions
8255edfecf 📝 Update release notes
[skip ci]
2024-11-27 23:10:31 +00:00
ILoveTakanashiHoshino
53c87842b0 🌐 Add Traditional Chinese translation for docs/zh-hant/docs/async.md (#12990) 2024-11-27 23:10:08 +00:00
github-actions
297135244d 📝 Update release notes
[skip ci]
2024-11-27 22:14:38 +00:00
史雲昔 (Vincy SHI)
8376228a49 🌐 Add Traditional Chinese translation for docs/zh-hant/docs/tutorial/query-param-models.md (#12932) 2024-11-27 22:14:10 +00:00
github-actions
6c7873c77e 📝 Update release notes
[skip ci]
2024-11-27 22:12:28 +00:00
Chol_rang
d75b81ce3f 🌐 Add Korean translation for docs/ko/docs/advanced/testing-dependencies.md (#12992) 2024-11-27 22:12:04 +00:00
github-actions
206037c292 📝 Update release notes
[skip ci]
2024-11-27 20:03:52 +00:00
LKY
478644086e 🌐 Add Korean translation for docs/ko/docs/advanced/websockets.md (#12991) 2024-11-27 20:03:29 +00:00
github-actions
a96dddb6fd 📝 Update release notes
[skip ci]
2024-11-26 22:51:31 +00:00
André Melo
66cadd9fdb 🌐 Add Portuguese translation for docs/pt/docs/tutorial/response-model.md (#12933) 2024-11-26 22:51:05 +00:00
github-actions
572180348d 📝 Update release notes
[skip ci]
2024-11-26 22:35:34 +00:00
nahyunkeem
4eefb2616a 🌐 Add Korean translation for docs/ko/docs/advanced/middlewares.md (#12753) 2024-11-26 22:35:09 +00:00
github-actions
b9be1dde4b 📝 Update release notes
[skip ci]
2024-11-26 22:09:23 +00:00
Saeye Lee
6d7b983cd4 🌐 Add Korean translation for docs/ko/docs/advanced/openapi-webhooks.md (#12752) 2024-11-26 22:08:57 +00:00
github-actions
e67120a116 📝 Update release notes
[skip ci]
2024-11-26 22:06:54 +00:00
史雲昔 (Vincy SHI)
b65ed450b3 🌐 Add Chinese translation for docs/zh/docs/tutorial/query-param-models.md (#12931) 2024-11-26 22:06:31 +00:00
github-actions
13383e8333 📝 Update release notes
[skip ci]
2024-11-26 21:37:16 +00:00
doas root
c32cfc5c4d 🌐 Add Russian translation for docs/ru/docs/tutorial/query-param-models.md (#12445) 2024-11-26 21:36:50 +00:00
github-actions
bffb4115a9 📝 Update release notes
[skip ci]
2024-11-22 17:10:36 +00:00
Tamir Duberstein
bf4fad1fda ♻️ Update tests and internals for compatibility with Pydantic >=2.10 (#12971)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-11-22 18:09:25 +01:00
github-actions
8c29eaec25 📝 Update release notes
[skip ci]
2024-11-20 19:24:32 +00:00
timothy
835b6465d9 🌐 Add Korean translation for docs/ko/docs/tutorial/query-param-models.md (#12940) 2024-11-20 19:24:08 +00:00
github-actions
1f7629d3e4 📝 Update release notes
[skip ci]
2024-11-18 22:21:58 +00:00
pre-commit-ci[bot]
d3a4234e82 ⬆ [pre-commit.ci] pre-commit autoupdate (#12954)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.7.3 → v0.7.4](https://github.com/astral-sh/ruff-pre-commit/compare/v0.7.3...v0.7.4)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-11-18 22:21:33 +00:00
github-actions
4a4c8c3bb2 📝 Update release notes
[skip ci]
2024-11-18 02:26:08 +00:00
Sebastián Ramírez
1c711e7147 📝 Update includes format in docs with an automated script (#12950) 2024-11-18 03:25:44 +01:00
github-actions
a0c3282af0 📝 Update release notes
[skip ci]
2024-11-17 22:32:05 +00:00
Sebastián Ramírez
602e953158 🔥 Remove obsolete tutorial translation to Chinese for docs/zh/docs/tutorial/sql-databases.md, it references files that are no longer on the repo (#12949) 2024-11-17 22:31:41 +00:00
github-actions
1cfea408c0 📝 Update release notes
[skip ci]
2024-11-12 19:58:49 +00:00
Alissa
1f27f41499 📝 Update includes for docs/de/docs/advanced/using-request-directly.md (#12685)
Co-authored-by: alissa-debruijn <alissa.debruijn@justeattakeaway.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-11-12 20:57:07 +01:00
github-actions
75aa13d007 📝 Update release notes
[skip ci]
2024-11-12 19:56:38 +00:00
Alissa
b81c635a11 📝 Update includes for docs/de/docs/how-to/conditional-openapi.md (#12689)
Co-authored-by: alissa-debruijn <alissa.debruijn@justeattakeaway.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-11-12 20:56:10 +01:00
Sebastián Ramírez
f057f4a067 🔖 Release version 0.115.5 2024-11-12 17:14:23 +01:00
github-actions
c6f021ecc2 📝 Update release notes
[skip ci]
2024-11-12 16:12:19 +00:00
Sebastián Ramírez
91a929319c ♻️ Update internal checks to support Pydantic 2.10 (#12914) 2024-11-12 17:10:42 +01:00
github-actions
f716490823 📝 Update release notes
[skip ci]
2024-11-12 16:09:58 +00:00
Gaurav Sheni
c1781066be 📝 Update includes for docs/en/docs/tutorial/body.md (#12757)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-11-12 17:09:34 +01:00
github-actions
88cc900c83 📝 Update release notes
[skip ci]
2024-11-11 18:30:19 +00:00
pre-commit-ci[bot]
20809a175a ⬆ [pre-commit.ci] pre-commit autoupdate (#12907) 2024-11-11 18:29:56 +00:00
github-actions
5a48c37056 📝 Update release notes
[skip ci]
2024-11-10 17:41:44 +00:00
AyushSinghal1794
13892a39cd 📝 Update includes in docs/en/docs/advanced/testing-dependencies.md (#12647)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-11-10 17:40:22 +00:00
github-actions
9467000ad2 📝 Update release notes
[skip ci]
2024-11-10 17:39:14 +00:00
Nimitha J
694f6ccf0d 📝 Update includes for docs/en/docs/tutorial/metadata.md (#12773)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-11-10 17:38:49 +00:00
github-actions
f93a29542c 📝 Update release notes
[skip ci]
2024-11-10 17:37:08 +00:00
xuvjso
9aaeb8b057 📝 Update docs/en/docs/tutorial/dependencies/dependencies-with-yield.md (#12045)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-11-10 17:36:46 +00:00
github-actions
b32f612162 📝 Update release notes
[skip ci]
2024-11-10 17:28:13 +00:00
VISHNU V S
3829bdc4a5 📝 Update includes for docs/en/docs/tutorial/dependencies/global-dependencies.md (#12653)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-11-10 17:27:25 +00:00
github-actions
725fd16334 📝 Update release notes
[skip ci]
2024-11-10 17:26:22 +00:00
davioc
be516b0d2c 📝 Update includes for docs/en/docs/tutorial/body-updates.md (#12712)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-11-10 17:26:01 +00:00
github-actions
bfeecfc8c1 📝 Update release notes
[skip ci]
2024-11-10 17:23:59 +00:00
David Caro
bfaf4c303f 📝 Remove mention of Celery in the project generators (#12742)
Signed-off-by: David Caro <me@dcaro.es>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-11-10 17:23:38 +00:00
github-actions
cb53c5b918 📝 Update release notes
[skip ci]
2024-11-10 17:19:41 +00:00
Zhaohan Dong
8f5ec897f7 📝 Update includes in docs/en/docs/tutorial/header-param-models.md (#12814)
Signed-off-by: Zhaohan Dong <65422392+zhaohan-dong@users.noreply.github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-11-10 17:19:19 +00:00
github-actions
6cd050ceb6 📝 Update release notes
[skip ci]
2024-11-10 17:12:44 +00:00
Sebastián Ramírez
8767a31c80 📝 Update contributing.md docs, include note to not translate this page (#12841) 2024-11-10 17:11:56 +00:00
github-actions
290e1060ca 📝 Update release notes
[skip ci]
2024-11-10 17:11:35 +00:00
VISHNU V S
9fa2474be0 📝 Update includes in docs/en/docs/tutorial/request-forms.md (#12648)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-11-10 17:10:49 +00:00
github-actions
9e441510ba 📝 Update release notes
[skip ci]
2024-11-10 17:09:31 +00:00
VISHNU V S
821b32f8b3 📝 Update includes in docs/en/docs/tutorial/request-form-models.md (#12649)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-11-10 17:09:09 +00:00
github-actions
1d9d189b85 📝 Update release notes
[skip ci]
2024-11-10 17:03:36 +00:00
Okeke Chukwuemeka Christian
1fc9a9ad3a 📝 Update includes in docs/en/docs/tutorial/security/oauth2-jwt.md (#12650)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-11-10 17:02:51 +00:00
github-actions
65f512052c 📝 Update release notes
[skip ci]
2024-11-10 16:59:09 +00:00
Max Patalas
ba734c2312 📝 Update includes in docs/vi/docs/tutorial/first-steps.md (#12754)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-11-10 16:58:43 +00:00
github-actions
37a557a0a3 📝 Update release notes
[skip ci]
2024-11-10 16:56:41 +00:00
Nimitha J
be67605728 📝 Update includes for docs/pt/docs/advanced/wsgi.md (#12769)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-11-10 16:56:13 +00:00
github-actions
2d524cca14 📝 Update release notes
[skip ci]
2024-11-10 16:45:50 +00:00
Baldeep Singh Handa
b2236d080a 📝 Update includes for docs/en/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md (#12815)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-11-10 16:45:28 +00:00
github-actions
370f4f9980 📝 Update release notes
[skip ci]
2024-11-10 01:25:37 +00:00
Baldeep Singh Handa
a01f9f298e 📝 Update includes for docs/en/docs/tutorial/dependencies/classes-as-dependencies.md (#12813) 2024-11-10 01:11:07 +00:00
github-actions
df6d1de3e6 📝 Update release notes
[skip ci]
2024-11-09 20:14:12 +00:00
Sebastián Ramírez
98182d02ce 🔨 Update docs preview script to show previous version and English version (#12856) 2024-11-09 20:13:48 +00:00
github-actions
5d03558363 📝 Update release notes
[skip ci]
2024-11-09 17:07:31 +00:00
Alejandra
40912999d1 ✏️ Fix error in docs/en/docs/tutorial/middleware.md (#12819) 2024-11-09 17:07:05 +00:00
github-actions
5df1415fee 📝 Update release notes
[skip ci]
2024-11-09 17:04:00 +00:00
Okeke Chukwuemeka Christian
f26a1b6385 📝 Update includes for docs/en/docs/tutorial/security/get-current-user.md (#12645) 2024-11-09 17:03:01 +00:00
github-actions
f5b8f39ed7 📝 Update release notes
[skip ci]
2024-11-09 17:01:51 +00:00
Okeke Chukwuemeka Christian
6e7e6f6c55 📝 Update includes for docs/en/docs/tutorial/security/first-steps.md (#12643) 2024-11-09 16:59:54 +00:00
github-actions
a81662b3c1 📝 Update release notes
[skip ci]
2024-11-09 16:56:02 +00:00
Zhaohan Dong
aaab24205f 📝 Update includes in docs/de/docs/advanced/additional-responses.md (#12821) 2024-11-09 16:53:31 +00:00
github-actions
5d1cb40c5e 📝 Update release notes
[skip ci]
2024-11-09 16:52:39 +00:00
AyushSinghal1794
ac4956d3a3 📝 Update includes in docs/en/docs/advanced/generate-clients.md (#12642) 2024-11-09 16:52:15 +00:00
github-actions
d9119528ea 📝 Update release notes
[skip ci]
2024-11-09 16:41:55 +00:00
Sebastián Ramírez
7fb9c5922d 📝 Fix admonition double quotes with new syntax (#12835)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-11-09 16:39:20 +00:00
github-actions
d08c4cffab 📝 Update release notes
[skip ci]
2024-11-09 16:34:56 +00:00
Zhaohan Dong
e812f87276 📝 Update includes in docs/zh/docs/advanced/additional-responses.md (#12828) 2024-11-09 16:29:26 +00:00
github-actions
e5d00910d6 📝 Update release notes
[skip ci]
2024-11-09 16:28:06 +00:00
Zhaohan Dong
ac9f4517f0 📝 Update includes in docs/en/docs/tutorial/path-params-numeric-validations.md (#12825) 2024-11-09 16:25:01 +00:00
github-actions
5e21dddb93 📝 Update release notes
[skip ci]
2024-11-09 16:21:37 +00:00
Hamid Rasti
52e8ea4c97 📝 Update includes for docs/en/docs/advanced/testing-websockets.md (#12761) 2024-11-09 16:19:46 +00:00
github-actions
18ca10cee4 📝 Update release notes
[skip ci]
2024-11-09 16:19:17 +00:00
Hamid Rasti
2d45b54f10 📝 Update includes for docs/en/docs/advanced/using-request-directly.md (#12760) 2024-11-09 16:18:55 +00:00
github-actions
8a560758f8 📝 Update release notes
[skip ci]
2024-11-09 16:18:19 +00:00
Hamid Rasti
a86d2bbf4f 📝 Update includes for docs/advanced/wsgi.md (#12758) 2024-11-09 16:17:10 +00:00
github-actions
5a7bd20316 📝 Update release notes
[skip ci]
2024-11-09 16:16:22 +00:00
paintdog
5eec59fa4d 📝 Update includes in docs/de/docs/tutorial/middleware.md (#12729) 2024-11-09 16:15:51 +00:00
github-actions
aac7bbb51e 📝 Update release notes
[skip ci]
2024-11-09 16:00:40 +00:00
Sebastián Ramírez
5c080d81ae 📝 Update includes for docs/en/docs/tutorial/schema-extra-example.md (#12822) 2024-11-09 16:00:17 +00:00
github-actions
636171ce31 📝 Update release notes
[skip ci]
2024-11-09 15:49:07 +00:00
Fred
9a8a1adad3 📝 Update includes in docs/fr/docs/advanced/additional-responses.md (#12634) 2024-11-09 15:48:46 +00:00
github-actions
712c57393c 📝 Update release notes
[skip ci]
2024-11-09 15:43:28 +00:00
Quentin Takeda
2cfd018446 📝 Update includes in docs/fr/docs/advanced/path-operation-advanced-configuration.md (#12633) 2024-11-09 15:43:03 +00:00
github-actions
2e35557254 📝 Update release notes
[skip ci]
2024-11-09 15:39:04 +00:00
Quentin Takeda
5cf323d93c 📝 Update includes in docs/fr/docs/advanced/response-directly.md (#12632) 2024-11-09 15:38:03 +00:00
github-actions
911d24bede 📝 Update release notes
[skip ci]
2024-11-09 15:33:00 +00:00
VISHNU V S
438343c376 📝 Update includes for docs/en/docs/tutorial/header-params.md (#12640) 2024-11-09 15:32:39 +00:00
github-actions
182cc4439e 📝 Update release notes
[skip ci]
2024-11-09 15:30:31 +00:00
VISHNU V S
35506c1f59 📝 Update includes in docs/en/docs/tutorial/cookie-param-models.md (#12639) 2024-11-09 15:29:53 +00:00
github-actions
0c449748ff 📝 Update release notes
[skip ci]
2024-11-09 15:29:42 +00:00
VISHNU V S
480ba19e9f 📝 Update includes for docs/en/docs/tutorial/extra-models.md (#12638) 2024-11-09 15:28:48 +00:00
github-actions
825419ecc4 📝 Update release notes
[skip ci]
2024-11-09 15:27:18 +00:00
VISHNU V S
85e0a95bde 📝 Update includes for docs/en/docs/tutorial/cors.md (#12637) 2024-11-09 15:26:44 +00:00
github-actions
48c66e30db 📝 Update release notes
[skip ci]
2024-11-09 15:21:54 +00:00
Baldeep Singh Handa
747534334a 📝 Update includes for docs/en/docs/tutorial/dependencies/sub-dependencies.md (#12810) 2024-11-09 15:21:30 +00:00
github-actions
76b13045fe 📝 Update release notes
[skip ci]
2024-11-09 15:10:34 +00:00
Zhaohan Dong
069e9bdea8 📝 Update includes in docs/en/docs/tutorial/body-nested-models.md (#12812) 2024-11-09 15:10:11 +00:00
github-actions
4dcdb20151 📝 Update release notes
[skip ci]
2024-11-09 14:54:50 +00:00
Alex Wendland
f6819ba5d2 📝 Update includes in docs/en/docs/tutorial/path-operation-configuration.md (#12809) 2024-11-09 14:54:23 +00:00
github-actions
e474d042d3 📝 Update release notes
[skip ci]
2024-11-09 14:50:19 +00:00
Zhaohan Dong
170826c911 📝 Update includes in docs/en/docs/tutorial/request-files.md (#12818) 2024-11-09 14:49:21 +00:00
github-actions
9628d38d24 📝 Update release notes
[skip ci]
2024-11-09 14:47:48 +00:00
Baldeep Singh Handa
f6ba3a3c46 📝 Update includes for docs/en/docs/tutorial/query-param-models.md (#12817) 2024-11-09 14:47:24 +00:00
github-actions
e6b48c6451 📝 Update release notes
[skip ci]
2024-11-09 14:19:51 +00:00
Alex Wendland
6f671b8b5a 📝 Update includes in docs/en/docs/tutorial/path-params.md (#12811) 2024-11-09 14:19:27 +00:00
github-actions
23cb1f8334 📝 Update release notes
[skip ci]
2024-11-09 14:14:59 +00:00
Quentin Takeda
abd6ad2187 📝 Update includes in docs/en/docs/tutorial/response-model.md (#12621) 2024-11-09 14:13:47 +00:00
github-actions
f2b100900a 📝 Update release notes
[skip ci]
2024-11-09 13:25:30 +00:00
VISHNU V S
ffcb635c2a 📝 Update includes in docs/en/docs/advanced/websockets.md (#12606) 2024-11-09 13:25:07 +00:00
github-actions
64204dc2b1 📝 Update release notes
[skip ci]
2024-11-09 12:35:47 +00:00
Baldeep Singh Handa
5d62d85095 📝 Updates include for docs/en/docs/tutorial/cookie-params.md (#12808) 2024-11-09 12:32:45 +00:00
github-actions
3f2b4339aa 📝 Update release notes
[skip ci]
2024-11-09 12:27:28 +00:00
github-actions
3c914aa610 📝 Update release notes
[skip ci]
2024-11-09 12:25:28 +00:00
Alex Wendland
f0a8f00b41 📝 Update includes in docs/en/docs/tutorial/middleware.md (#12807) 2024-11-09 12:24:09 +00:00
github-actions
e364f941be 📝 Update release notes
[skip ci]
2024-11-09 12:23:03 +00:00
Zhaohan Dong
334d8326d0 📝 Update includes in docs/en/docs/advanced/sub-applications.md (#12806) 2024-11-09 12:21:25 +00:00
github-actions
589f3c0e59 📝 Update release notes
[skip ci]
2024-11-09 12:21:07 +00:00
Chol_rang
2abde61372 🌐 Add Korean translation for docs/ko/docs/advanced/testing-websockets.md (#12739) 2024-11-09 12:18:47 +00:00
史云昔 (Vincy SHI)
8b183f18f7 🌐 Add Traditional Chinese translation for docs/zh-hant/docs/environment-variables.md (#12785) 2024-11-09 12:17:55 +00:00
github-actions
b458d0acb5 📝 Update release notes
[skip ci]
2024-11-09 12:17:39 +00:00
史云昔 (Vincy SHI)
58eb4e4fc5 🌐 Add Chinese translation for docs/zh/docs/environment-variables.md (#12784) 2024-11-09 12:17:15 +00:00
github-actions
35c37be540 📝 Update release notes
[skip ci]
2024-11-09 12:15:34 +00:00
Zhaohan Dong
58975aa3ed 📝 Update includes in docs/en/docs/advanced/response-headers.md (#12805) 2024-11-09 12:14:09 +00:00
github-actions
62b318e585 📝 Update release notes
[skip ci]
2024-11-09 12:12:02 +00:00
Quentin Takeda
f55f93c181 📝 Update includes in docs/fr/docs/tutorial/first-steps.md (#12594)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-11-09 12:10:11 +00:00
github-actions
75cde1fb5c 📝 Update release notes
[skip ci]
2024-11-09 12:06:57 +00:00
Zhaohan Dong
854cddf1a8 📝 Update includes in docs/en/docs/advanced/response-cookies.md (#12804) 2024-11-09 12:06:35 +00:00
github-actions
f91d193d63 📝 Update release notes
[skip ci]
2024-11-09 11:58:33 +00:00
Zhaohan Dong
b5036db18c 📝 Update includes in docs/en/docs/advanced/path-operation-advanced-configuration.md (#12802) 2024-11-09 11:58:07 +00:00
github-actions
8fb3348889 📝 Update release notes
[skip ci]
2024-11-09 11:54:43 +00:00
Baldeep Singh Handa
22eafff2d8 📝 Update includes for docs/en/docs/advanced/response-directly.md (#12803) 2024-11-09 11:54:19 +00:00
github-actions
835123ee28 📝 Update release notes
[skip ci]
2024-11-09 11:50:20 +00:00
Zhaohan Dong
5e0722276a 📝 Update includes in docs/zh/docs/tutorial/background-tasks.md (#12798) 2024-11-09 11:49:55 +00:00
github-actions
a36454a7e6 📝 Update release notes
[skip ci]
2024-11-09 11:34:42 +00:00
Alissa
c88e82d6ec 📝 Update includes for docs/de/docs/tutorial/body-multiple-params.md (#12699) 2024-11-09 11:32:51 +00:00
github-actions
6b965b576e 📝 Update release notes
[skip ci]
2024-11-09 11:31:19 +00:00
Alex Wendland
34ed88394c 📝 Update includes in docs/em/docs/tutorial/body-updates.md (#12799) 2024-11-09 11:27:35 +00:00
github-actions
b2ec345e67 📝 Update release notes
[skip ci]
2024-11-09 11:25:26 +00:00
Baldeep Singh Handa
7517aa9f8f 📝 Update includes docs/en/docs/advanced/response-change-status-code.md (#12801) 2024-11-09 11:23:58 +00:00
github-actions
c0f56ce0b2 📝 Update release notes
[skip ci]
2024-11-09 11:23:32 +00:00
Baldeep Singh Handa
2d4e9d46c0 📝 Update includes docs/en/docs/advanced/openapi-callbacks.md (#12800) 2024-11-09 11:23:09 +00:00
github-actions
38141dbc9f 📝 Update release notes
[skip ci]
2024-11-09 11:12:50 +00:00
Quentin Takeda
150f8225b2 📝 Update includes in docs/fr/docs/tutorial/body-multiple-params.md (#12598) 2024-11-09 11:10:17 +00:00
github-actions
c1110d529e 📝 Update release notes
[skip ci]
2024-11-09 11:08:32 +00:00
Tashanam Shahbaz
83d7f11405 📝 Update includes in docs/en/docs/tutorial/body-multiple-params.md (#12593) 2024-11-09 11:08:12 +00:00
github-actions
6d066c0d62 📝 Update release notes
[skip ci]
2024-11-09 10:56:01 +00:00
Félix
5b2bd906d7 📝 Update includes in docs/pt/docs/tutorial/background-tasks.md (#12736) 2024-11-09 10:55:35 +00:00
github-actions
4733cc7486 📝 Update release notes
[skip ci]
2024-11-09 10:44:54 +00:00
Baldeep Singh Handa
1cfd9a70ac 📝 Update includes for docs/en/docs/advanced/custom-response.md (#12797) 2024-11-09 10:44:28 +00:00
github-actions
92a5f68e4d 📝 Update release notes
[skip ci]
2024-11-09 10:33:21 +00:00
Rafael de Oliveira Marques
51fe0e437b 📝 Update includes for docs/pt/docs/python-types.md (#12671) 2024-11-09 10:32:53 +00:00
github-actions
ce97de97d9 📝 Update release notes
[skip ci]
2024-11-09 10:16:07 +00:00
Alissa
890a61fb67 📝 Update includes for docs/de/docs/python-types.md (#12660) 2024-11-09 10:15:47 +00:00
github-actions
546bb50e09 📝 Update release notes
[skip ci]
2024-11-09 10:12:55 +00:00
Alissa
af280dbde9 📝 Update includes for docs/de/docs/advanced/dataclasses.md (#12658) 2024-11-09 10:12:35 +00:00
github-actions
ee260368d0 📝 Update release notes
[skip ci]
2024-11-09 10:08:49 +00:00
Quentin Takeda
1e9ea61cbd 📝 Update includes in docs/fr/docs/tutorial/path-params.md (#12592) 2024-11-09 10:08:25 +00:00
github-actions
5618035203 📝 Update release notes
[skip ci]
2024-11-09 10:02:55 +00:00
Alissa
855b4f66f5 📝 Update includes for docs/de/docs/how-to/configure-swagger-ui.md (#12690) 2024-11-09 10:02:30 +00:00
github-actions
858912e6e4 📝 Update release notes
[skip ci]
2024-11-08 22:06:00 +00:00
dependabot[bot]
8cd47a3551 ⬆ Bump tiangolo/latest-changes from 0.3.1 to 0.3.2 (#12794)
Bumps [tiangolo/latest-changes](https://github.com/tiangolo/latest-changes) from 0.3.1 to 0.3.2.
- [Release notes](https://github.com/tiangolo/latest-changes/releases)
- [Commits](https://github.com/tiangolo/latest-changes/compare/0.3.1...0.3.2)

---
updated-dependencies:
- dependency-name: tiangolo/latest-changes
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-08 22:05:33 +00:00
github-actions
b0fe5ebbf0 📝 Update release notes 2024-11-08 19:42:52 +00:00
LKY
075f41bad9 🌐 Add Korean translation for ko/docs/advanced/response-headers.md (#12740) 2024-11-08 19:42:29 +00:00
github-actions
4f430f49ac 📝 Update release notes 2024-11-08 19:23:51 +00:00
史云昔 (Vincy SHI)
45d9fabbdd 🌐 Add Chinese translation for docs/zh/docs/virtual-environments.md (#12790) 2024-11-08 19:23:26 +00:00
github-actions
2809c08a70 📝 Update release notes 2024-11-07 21:05:45 +00:00
Hyunjun KIM
d28bae06e4 🌐 Add Korean translation for /docs/ko/docs/environment-variables.md (#12526) 2024-11-07 20:57:27 +00:00
github-actions
647a0dcad3 📝 Update release notes 2024-11-07 20:52:31 +00:00
github-actions
3ff6cfd544 📝 Update release notes 2024-11-07 20:48:35 +00:00
Saeye Lee
745c073a6b 🌐 Add Korean translation for docs/ko/docs/history-design-future.md (#12646) 2024-11-07 20:46:14 +00:00
github-actions
1b8030945f 📝 Update release notes 2024-11-07 20:45:49 +00:00
kim-sangah
321053bdef 🌐 Add Korean translation for docs/ko/docs/advanced/advanced-dependencies.md (#12675) 2024-11-07 20:43:46 +00:00
github-actions
4565466f34 📝 Update release notes 2024-11-07 20:43:27 +00:00
sptcnl
2fcae5f108 🌐 Add Korean translation for docs/ko/docs/how-to/conditional-openapi.md (#12731) 2024-11-07 20:41:38 +00:00
LKY
c5ff950dfc 🌐 Add Korean translation for docs/ko/docs/advanced/using_request_directly.md (#12738) 2024-11-07 20:40:19 +00:00
github-actions
b3d3f0e723 📝 Update release notes 2024-11-07 20:39:11 +00:00
github-actions
3a2ec11e80 📝 Update release notes 2024-11-07 20:38:47 +00:00
namjimin_43
569c54cb9a 🌐 Add Korean translation for docs/ko/docs/advanced/testing-events.md (#12741) 2024-11-07 20:38:31 +00:00
kim-sangah
23c3522467 🌐 Add Korean translation for docs/ko/docs/security/index.md (#12743) 2024-11-07 20:38:25 +00:00
github-actions
f2c7b87721 📝 Update release notes 2024-11-07 20:32:59 +00:00
dependabot[bot]
731c85a876 ⬆ Bump pypa/gh-action-pypi-publish from 1.12.0 to 1.12.2 (#12788)
Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.12.0 to 1.12.2.
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.12.0...v1.12.2)

---
updated-dependencies:
- dependency-name: pypa/gh-action-pypi-publish
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-07 20:32:35 +00:00
github-actions
0c7296b19e 📝 Update release notes 2024-11-06 18:24:11 +00:00
João Pedro Pereira Holanda
d0e0b27f73 🌐 Add Portuguese translation for docs/pt/docs/advanced/path-operation-advanced-configuration.md (#12762) 2024-11-06 18:21:50 +00:00
github-actions
845a2ecd39 📝 Update release notes 2024-11-06 18:17:40 +00:00
github-actions
45579ad78c 📝 Update release notes 2024-11-06 18:15:59 +00:00
dependabot[bot]
c8bcb633cc ⬆ Bump pypa/gh-action-pypi-publish from 1.11.0 to 1.12.0 (#12781)
Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.11.0 to 1.12.0.
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.11.0...v1.12.0)

---
updated-dependencies:
- dependency-name: pypa/gh-action-pypi-publish
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-06 18:15:30 +00:00
github-actions
4d3e1cd22a 📝 Update release notes 2024-11-06 18:15:17 +00:00
dependabot[bot]
7eda7e28a6 ⬆ Bump cloudflare/wrangler-action from 3.11 to 3.12 (#12777)
Bumps [cloudflare/wrangler-action](https://github.com/cloudflare/wrangler-action) from 3.11 to 3.12.
- [Release notes](https://github.com/cloudflare/wrangler-action/releases)
- [Changelog](https://github.com/cloudflare/wrangler-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/cloudflare/wrangler-action/compare/v3.11...v3.12)

---
updated-dependencies:
- dependency-name: cloudflare/wrangler-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-06 18:15:12 +00:00
pre-commit-ci[bot]
3ff4da5387 ⬆ [pre-commit.ci] pre-commit autoupdate (#12766)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.7.1 → v0.7.2](https://github.com/astral-sh/ruff-pre-commit/compare/v0.7.1...v0.7.2)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-11-06 18:14:55 +00:00
github-actions
d4ab06a2b6 📝 Update release notes 2024-11-01 11:25:57 +00:00
github-actions
3739999b76 📝 Update release notes 2024-11-01 11:21:54 +00:00
github-actions
eba967c65a 📝 Update release notes 2024-11-01 11:20:24 +00:00
dependabot[bot]
1f15034638 ⬆ Bump pypa/gh-action-pypi-publish from 1.10.3 to 1.11.0 (#12721)
Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.10.3 to 1.11.0.
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.10.3...v1.11.0)

---
updated-dependencies:
- dependency-name: pypa/gh-action-pypi-publish
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-01 11:19:50 +00:00
github-actions
6670e8af68 📝 Update release notes 2024-11-01 11:18:59 +00:00
dependabot[bot]
fd40d00748 ⬆ Update pre-commit requirement from <4.0.0,>=2.17.0 to >=2.17.0,<5.0.0 (#12749)
Updates the requirements on [pre-commit](https://github.com/pre-commit/pre-commit) to permit the latest version.
- [Release notes](https://github.com/pre-commit/pre-commit/releases)
- [Changelog](https://github.com/pre-commit/pre-commit/blob/main/CHANGELOG.md)
- [Commits](https://github.com/pre-commit/pre-commit/compare/v2.17.0...v4.0.1)

---
updated-dependencies:
- dependency-name: pre-commit
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-01 11:17:36 +00:00
github-actions
70f50442d9 📝 Update release notes 2024-11-01 11:17:26 +00:00
dependabot[bot]
54fa592dac ⬆ Bump typer from 0.12.3 to 0.12.5 (#12748)
Bumps [typer](https://github.com/fastapi/typer) from 0.12.3 to 0.12.5.
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.12.3...0.12.5)

---
updated-dependencies:
- dependency-name: typer
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-01 11:17:22 +00:00
dependabot[bot]
fd98edcdd5 ⬆ Update flask requirement from <3.0.0,>=1.1.2 to >=1.1.2,<4.0.0 (#12747)
Updates the requirements on [flask](https://github.com/pallets/flask) to permit the latest version.
- [Release notes](https://github.com/pallets/flask/releases)
- [Changelog](https://github.com/pallets/flask/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/flask/compare/1.1.2...3.0.3)

---
updated-dependencies:
- dependency-name: flask
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-01 11:17:12 +00:00
github-actions
c4a2201a6b 📝 Update release notes 2024-11-01 11:16:58 +00:00
dependabot[bot]
4695b8d07f ⬆ Bump pillow from 10.4.0 to 11.0.0 (#12746)
Bumps [pillow](https://github.com/python-pillow/Pillow) from 10.4.0 to 11.0.0.
- [Release notes](https://github.com/python-pillow/Pillow/releases)
- [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst)
- [Commits](https://github.com/python-pillow/Pillow/compare/10.4.0...11.0.0)

---
updated-dependencies:
- dependency-name: pillow
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-01 11:16:55 +00:00
dependabot[bot]
808196f2a3 ⬆ Update pytest requirement from <8.0.0,>=7.1.3 to >=7.1.3,<9.0.0 (#12745)
Updates the requirements on [pytest](https://github.com/pytest-dev/pytest) to permit the latest version.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.1.3...8.3.3)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-01 11:16:34 +00:00
github-actions
a18ab76322 📝 Update release notes 2024-10-31 18:56:59 +00:00
Chol_rang
14b087cd36 🌐 Add Korean translation for docs/ko/docs/advanced/wsgi.md (#12659) 2024-10-31 18:56:37 +00:00
github-actions
42c002e4ec 📝 Update release notes 2024-10-31 12:21:22 +00:00
Fernando Alzueta
b7102a2675 🌐 Add Portuguese translation for docs/pt/docs/advanced/websockets.md (#12703) 2024-10-31 12:20:59 +00:00
github-actions
868720a798 📝 Update release notes 2024-10-31 12:18:10 +00:00
Lídia
bb7921be25 🌐 Add Portuguese translation for docs/pt/docs/tutorial/security/simple-oauth2.md (#12520) 2024-10-31 12:17:45 +00:00
github-actions
086e3ca54b 📝 Update release notes 2024-10-31 09:13:53 +00:00
Sebastián Ramírez
05c8ed3312 🔧 Update sponsors: add Render (#12733) 2024-10-31 09:13:26 +00:00
github-actions
bf83889844 📝 Update release notes 2024-10-30 20:02:57 +00:00
github-actions
2f7a860ee0 📝 Update release notes 2024-10-30 20:02:34 +00:00
namjimin_43
e93b27452b 🌐 Add Korean translation for docs/ko/docs/advanced/response-directly.md (#12674) 2024-10-30 20:00:57 +00:00
Luis Rodrigues
3184b5c701 🌐 Add Portuguese translation for docs/pt/docs/advanced/middleware.md (#12704) 2024-10-30 20:00:22 +00:00
github-actions
067ec21580 📝 Update release notes 2024-10-30 19:54:20 +00:00
Fernando Alzueta
5be5ea92c0 🌐 Add Portuguese translation for docs/pt/docs/advanced/openapi-callbacks.md (#12705) 2024-10-30 19:53:03 +00:00
github-actions
872feaccbe 📝 Update release notes 2024-10-30 19:52:53 +00:00
Luis Rodrigues
ece28bc8db 🌐 Add Portuguese translation for docs/pt/docs/tutorial/request-files.md (#12706) 2024-10-30 19:52:32 +00:00
github-actions
8dc523b1ef 📝 Update release notes 2024-10-29 11:47:36 +00:00
João Pedro Pereira Holanda
c5a9d3ac28 🌐 Add Portuguese Translation for docs/pt/docs/advanced/custom-response.md (#12631) 2024-10-29 11:47:10 +00:00
github-actions
25c63800f6 📝 Update release notes 2024-10-29 11:02:39 +00:00
Krishna Madhavan
268eac9e16 📝 Update includes in docs/en/docs/advanced/security/oauth2-scopes.md (#12572) 2024-10-29 11:02:16 +00:00
github-actions
c8f5755d0a 📝 Update release notes 2024-10-29 10:39:18 +00:00
github-actions
8cae611101 📝 Update release notes 2024-10-29 10:36:58 +00:00
Lincoln Melo
6e07910cc4 🌐 Add Portuguese translation for docs/pt/docs/tutorial/metadata.md (#12538) 2024-10-29 10:36:14 +00:00
LKY
46a085ebe7 🌐 Add Korean translation for docs/ko/docs/tutorial/metadata.md (#12541) 2024-10-29 10:36:06 +00:00
github-actions
3f3637ba73 📝 Update release notes 2024-10-29 10:33:16 +00:00
kim-sangah
3f822818b2 🌐 Add Korean Translation for docs/ko/docs/advanced/response-cookies.md (#12546) 2024-10-29 10:32:45 +00:00
github-actions
e1d724ab92 📝 Update release notes 2024-10-28 20:32:12 +00:00
pre-commit-ci[bot]
93bf4c9c2d ⬆ [pre-commit.ci] pre-commit autoupdate (#12707)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.7.0 → v0.7.1](https://github.com/astral-sh/ruff-pre-commit/compare/v0.7.0...v0.7.1)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-10-28 20:31:44 +00:00
github-actions
8669a92dac 📝 Update release notes 2024-10-28 11:31:18 +00:00
김소연
5c33269419 🌐 Add Korean translation for docs/ko/docs/fastapi-cli.md (#12515) 2024-10-28 11:29:32 +00:00
github-actions
f2b633ebee 📝 Update release notes 2024-10-28 11:24:36 +00:00
Rabin Lama Dong
ec9976f7a6 📝 Update includes for docs/en/docs/how-to/conditional-openapi.md (#12624) 2024-10-28 11:21:54 +00:00
github-actions
38bb9f934b 📝 Update release notes 2024-10-28 11:19:26 +00:00
Abdul Hadi Bharara
cb2c56008d 📝 Update includes in docs/en/docs/tutorial/dependencies/index.md (#12615) 2024-10-28 11:18:17 +00:00
github-actions
efb99a2bb4 📝 Update release notes 2024-10-28 11:13:38 +00:00
Quentin Takeda
26702a6525 📝 Update includes in docs/en/docs/tutorial/response-status-code.md (#12620) 2024-10-28 11:13:18 +00:00
github-actions
f6a6366e42 📝 Update release notes 2024-10-28 10:50:28 +00:00
github-actions
70869200bd 📝 Update release notes 2024-10-28 10:42:48 +00:00
Rabin Lama Dong
86d8e729c8 📝 Update includes for docs/en/docs/how-to/custom-docs-ui-assets.md (#12623) 2024-10-28 10:42:34 +00:00
github-actions
794d4b3a9b 📝 Update release notes 2024-10-28 10:39:28 +00:00
Mohamed Salman
8a4652d8b4 📝 Update includes in docs/en/docs/advanced/openapi-webhooks.md (#12605) 2024-10-28 10:38:23 +00:00
github-actions
3ea198f23c 📝 Update release notes 2024-10-28 10:37:16 +00:00
Mohamed Salman
2bd2ccbd19 📝 Update includes in docs/en/docs/advanced/events.md (#12604) 2024-10-28 10:36:22 +00:00
github-actions
bcd55f8c09 📝 Update release notes 2024-10-28 10:35:33 +00:00
Mohamed Salman
76126c45e7 📝 Update includes in docs/en/docs/advanced/dataclasses.md (#12603) 2024-10-28 10:35:06 +00:00
github-actions
fe3922311f 📝 Update release notes 2024-10-28 10:34:51 +00:00
Antony Arévalo
96c5566a5b 📝 Update includes in docs/es/docs/tutorial/cookie-params.md (#12602) 2024-10-28 10:33:43 +00:00
Quentin Takeda
218d3c3524 📝 Update includes in docs/fr/docs/tutorial/path-params-numeric-validations.md (#12601) 2024-10-28 10:32:37 +00:00
github-actions
0279f6dd5f 📝 Update release notes 2024-10-28 10:30:19 +00:00
Quentin Takeda
269a224544 📝 Update includes in docs/fr/docs/tutorial/background-tasks.md (#12600) 2024-10-28 10:29:51 +00:00
github-actions
adf89d1d9f 📝 Update release notes 2024-10-27 23:31:38 +00:00
Tony Ly
96a6d469e9 📝 Update includes in docs/en/docs/tutorial/encoder.md (#12597) 2024-10-27 23:31:16 +00:00
github-actions
dbc3008f5a 📝 Update release notes 2024-10-27 22:54:10 +00:00
Philip Okiokio
95ebac1a89 📝 Update includes in docs/en/docs/how-to/custom-docs-ui-assets.md (#12557) 2024-10-27 22:53:46 +00:00
github-actions
04194dc191 📝 Update release notes 2024-10-27 22:39:58 +00:00
Alejandra
eea2d8e67c 🎨 Adjust spacing (#12635) 2024-10-27 22:39:38 +00:00
github-actions
5db8b491db 📝 Update release notes 2024-10-27 22:12:53 +00:00
Philip Okiokio
78f295609f 📝 Update includes in docs/en/docs/how-to/custom-request-and-route.md (#12560) 2024-10-27 22:12:32 +00:00
github-actions
d92fc89eb8 📝 Update release notes 2024-10-27 22:02:27 +00:00
namjimin_43
2c27cae742 🌐 Add Korean Translation for docs/ko/docs/advanced/response-change-status-code.md (#12547) 2024-10-27 22:01:39 +00:00
Sebastián Ramírez
31887b1cc6 🔖 Release version 0.115.4 2024-10-27 21:51:55 +00:00
github-actions
b270ff1e5e 📝 Update release notes 2024-10-27 21:46:51 +00:00
Sebastián Ramírez
b31cbbf5f5 ♻️ Update logic to import and check python-multipart for compatibility with newer version (#12627) 2024-10-27 21:46:26 +00:00
github-actions
aee7674ed2 📝 Update release notes 2024-10-27 17:35:05 +00:00
Quentin Takeda
4e6b1acccd 📝 Update includes in docs/fr/docs/tutorial/body.md (#12596) 2024-10-27 17:34:41 +00:00
github-actions
9b1e5f29e6 📝 Update release notes 2024-10-27 17:31:38 +00:00
Quentin Takeda
60aba0261c 📝 Update includes in docs/fr/docs/tutorial/debugging.md (#12595) 2024-10-27 17:31:14 +00:00
github-actions
2a4cf1736d 📝 Update release notes 2024-10-27 17:16:01 +00:00
Quentin Takeda
453f559934 📝 Update includes in docs/fr/docs/tutorial/query-params-str-validations.md (#12591) 2024-10-27 17:14:38 +00:00
github-actions
af269cd131 📝 Update release notes 2024-10-27 17:09:22 +00:00
Quentin Takeda
5e8f1f96eb 📝 Update includes in docs/fr/docs/tutorial/query-params.md (#12589) 2024-10-27 17:06:01 +00:00
github-actions
9f44a5dd36 📝 Update release notes 2024-10-27 17:02:42 +00:00
github-actions
ba77d114f6 📝 Update release notes 2024-10-27 17:02:19 +00:00
github-actions
cd37dfe533 📝 Update release notes 2024-10-27 17:01:22 +00:00
Nomad Monad
47b4e1a517 📝 Update includes in docs/en/tutorial/body-fields.md (#12588) 2024-10-27 17:01:18 +00:00
Alexander Bejarano
503ece76d6 📝 Update includes in docs/de/docs/tutorial/response-status-code.md (#12585) 2024-10-27 16:59:43 +00:00
Nomad Monad
5a0e13794b 📝 Update includes in docs/en/docs/tutorial/body.md (#12586) 2024-10-27 16:58:19 +00:00
github-actions
75af54babd 📝 Update release notes 2024-10-27 16:52:29 +00:00
github-actions
083fbc8a73 📝 Update release notes 2024-10-27 16:52:28 +00:00
Sebastian Kozłowski
3783341eb8 📝 Update includes syntax for docs/pl/docs/tutorial/first-steps.md (#12584) 2024-10-27 16:51:30 +00:00
Julio Anthony Leonard
f0ad433e01 📝 Update includes in docs/en/docs/advanced/behind-a-proxy.md (#12583) 2024-10-27 16:49:49 +00:00
github-actions
5b1963db49 📝 Update release notes 2024-10-27 16:46:14 +00:00
Graziano Montanaro
5d99a42688 📝 Update includes in docs/en/docs/advanced/middleware.md (#12582) 2024-10-27 16:45:50 +00:00
github-actions
f5a10c1c7d 📝 Update release notes 2024-10-27 16:17:51 +00:00
github-actions
fe60afff0e 📝 Update release notes 2024-10-27 16:13:50 +00:00
Krishna Madhavan
dc7cf0f14f 📝 Update includes in docs/en/docs/advanced/additional-status-codes.md (#12577) 2024-10-27 16:12:23 +00:00
Krishna Madhavan
9106cae8a8 📝 Update includes in docs/en/docs/advanced/advanced-dependencies.md (#12578) 2024-10-27 16:10:15 +00:00
github-actions
dc22bdf5a4 📝 Update release notes 2024-10-27 16:08:49 +00:00
Krishna Madhavan
0f8d03ef85 📝 Update includes in docs/en/docs/advanced/additional-responses.md (#12576) 2024-10-27 16:07:07 +00:00
github-actions
55aa76faad 📝 Update release notes 2024-10-27 15:51:51 +00:00
github-actions
ed45eca1a8 📝 Update release notes 2024-10-27 15:50:02 +00:00
Nomad Monad
b24b4fd6a8 📝 Update includes in docs/en/docs/tutorial/static-files.md (#12575) 2024-10-27 15:45:40 +00:00
Krishna Madhavan
dfdecfd9c9 📝 Update includes in docs/en/docs/advanced/async-tests.md (#12568) 2024-10-27 15:43:29 +00:00
github-actions
4b9e76bde2 📝 Update release notes 2024-10-27 15:39:25 +00:00
Julio Anthony Leonard
27e7fcefe8 📝 Update includes in docs/de/docs/advanced/async-tests.md (#12567) 2024-10-27 15:34:47 +00:00
github-actions
48f88edf0d 📝 Update release notes 2024-10-27 15:33:12 +00:00
github-actions
91eb00854b 📝 Update release notes 2024-10-27 15:30:02 +00:00
github-actions
e00efb5569 📝 Update release notes 2024-10-27 15:29:12 +00:00
Alexandros Mioglou
909204ec54 📝 Update includes in docs/pt/docs/advanced/behind-a-proxy.md (#12563) 2024-10-27 15:28:18 +00:00
Nimitha J
b87eb8a0e1 📝 Update includes in docs/de/docs/advanced/security/http-basic-auth.md (#12561) 2024-10-27 15:25:54 +00:00
ilacftemp
92bc3d7e0c 🌐 Add Portuguese translation for docs/pt/docs/tutorial/sql-databases.md (#12530) 2024-10-27 15:25:29 +00:00
github-actions
13f3dd2111 📝 Update release notes 2024-10-27 15:24:07 +00:00
github-actions
4f5349445d 📝 Update release notes 2024-10-27 15:24:00 +00:00
Farhan Ali Raza
4ae5fab050 📝 Update includes in docs/en/docs/tutorial/background-tasks.md (#12559) 2024-10-27 15:22:48 +00:00
Ismail Tlemcani
1fbbf9ca6c 📝 Update includes in docs/fr/docs/python-types.md (#12558) 2024-10-27 15:21:34 +00:00
github-actions
a1572b52de 📝 Update release notes 2024-10-27 15:19:49 +00:00
Philip Okiokio
50c6f80117 📝 Update includes in docs/en/docs/how-to/graphql.md (#12564) 2024-10-27 15:18:53 +00:00
github-actions
aec5219fe0 📝 Update release notes 2024-10-27 15:15:30 +00:00
Philip Okiokio
092da9a8a3 📝 Update includes in docs/en/docs/how-to/extending-openapi.md (#12562) 2024-10-27 15:15:05 +00:00
github-actions
128c96dc9a 📝 Update release notes 2024-10-27 15:02:00 +00:00
임선오
8d928def2e 🌐 Add Korean translation for docs/ko/docs/benchmarks.md (#12540) 2024-10-27 15:01:38 +00:00
github-actions
44cfb2f4f5 📝 Update release notes 2024-10-26 16:51:17 +00:00
Sebastián Ramírez
162a32cc2f 📝 Update includes for docs/en/docs/how-to/configure-swagger-ui.md (#12556) 2024-10-26 16:50:52 +00:00
github-actions
d93e431505 📝 Update release notes 2024-10-26 16:44:15 +00:00
Sebastián Ramírez
28e97b2651 📝 Update includes for docs/en/docs/how-to/separate-openapi-schemas.md (#12555) 2024-10-26 17:43:54 +01:00
github-actions
6e85909311 📝 Update release notes 2024-10-26 16:01:48 +00:00
Sebastián Ramírez
68d0a0412e 📝 Update includes for docs/en/docs/advanced/security/http-basic-auth.md (#12553) 2024-10-26 17:01:27 +01:00
github-actions
63c3eacf43 📝 Update release notes 2024-10-26 11:51:54 +00:00
github-actions
442692fef4 📝 Update release notes 2024-10-26 11:49:36 +00:00
Sebastián Ramírez
56bc9a5eb4 📝 Update includes in docs/en/docs/tutorial/first-steps.md (#12552) 2024-10-26 11:48:16 +00:00
Sebastián Ramírez
71fcafd13c 📝 Update includes in docs/en/docs/python-types.md (#12551) 2024-10-26 11:47:53 +00:00
github-actions
ea88ab6cf1 📝 Update release notes 2024-10-26 11:46:28 +00:00
Sebastián Ramírez
89f06da526 📝 Fix link in OAuth2 docs (#12550) 2024-10-26 11:45:10 +00:00
github-actions
d60c52bc32 📝 Update release notes 2024-10-26 09:38:20 +00:00
dependabot[bot]
fd95b4ae65 ⬆ Bump cloudflare/wrangler-action from 3.9 to 3.11 (#12544)
Bumps [cloudflare/wrangler-action](https://github.com/cloudflare/wrangler-action) from 3.9 to 3.11.
- [Release notes](https://github.com/cloudflare/wrangler-action/releases)
- [Changelog](https://github.com/cloudflare/wrangler-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/cloudflare/wrangler-action/compare/v3.9...v3.11)

---
updated-dependencies:
- dependency-name: cloudflare/wrangler-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-26 10:37:59 +01:00
github-actions
a498582bb4 📝 Update release notes 2024-10-24 18:54:28 +00:00
ilacftemp
55bcab6d75 🌐 Add Portuguese translation for docs/pt/docs/how-to/separate-openapi-schemas.md (#12518) 2024-10-24 18:52:36 +00:00
github-actions
548f938280 📝 Update release notes 2024-10-24 18:43:50 +00:00
Renne Rocha
ec9b066e0b 📝 Add External Link: FastAPI do Zero (#12533) 2024-10-24 18:39:34 +00:00
github-actions
cf65c423d1 📝 Update release notes 2024-10-24 18:35:26 +00:00
github-actions
e2d77a9e42 📝 Update release notes 2024-10-24 18:32:39 +00:00
YungYueh ChanLee
86fe251507 🌐 Update Traditional Chinese translation for docs/zh-hant/docs/deployment/index.md (#12521) 2024-10-24 19:30:54 +01:00
github-actions
b5021a4c84 📝 Update release notes 2024-10-24 18:29:27 +00:00
YungYueh ChanLee
ff5f076011 🌐 Update Traditional Chinese translation for docs/zh-hant/docs/deployment/cloud.md (#12522) 2024-10-24 19:28:55 +01:00
github-actions
b144221ad5 📝 Update release notes 2024-10-24 18:28:22 +00:00
YungYueh ChanLee
7b03fa7e0c 🌐 Update Traditional Chinese translation for docs/zh-hant/docs/how-to/index.md (#12523) 2024-10-24 19:28:16 +01:00
YungYueh ChanLee
2f2c877d51 🌐 Update Traditional Chinese translation for docs/zh-hant/docs/tutorial/index.md (#12524) 2024-10-24 19:28:00 +01:00
github-actions
6ede04f876 📝 Update release notes 2024-10-24 12:39:00 +00:00
Sebastián Ramírez
e7533b92b3 👷 Update GitHub Action to deploy docs previews to handle missing deploy comments (#12527) 2024-10-24 12:38:34 +00:00
github-actions
593385d1c3 📝 Update release notes 2024-10-23 18:30:47 +00:00
Kevin Kirsche
8081d2302e 📝 Fix minor typos (#12516) 2024-10-23 19:30:18 +01:00
github-actions
2d43a8a2a3 📝 Update release notes 2024-10-22 20:48:21 +00:00
github-actions
21fc89976d 📝 Update release notes 2024-10-22 20:47:24 +00:00
YungYueh ChanLee
59efc69bec 🌐 Add Traditional Chinese translation for docs/zh-hant/docs/how-to/index.md (#12468) 2024-10-22 21:45:13 +01:00
YungYueh ChanLee
136c48bda6 🌐 Add Traditional Chinese translation for docs/zh-hant/docs/tutorial/index.md (#12466) 2024-10-22 21:44:51 +01:00
github-actions
fb4b6b7cbe 📝 Update release notes 2024-10-22 20:42:37 +00:00
João Pedro Pereira Holanda
c9337b54f0 🌐 Add Portuguese translation for docs/pt/docs/tutorial/header-param-models.md (#12437) 2024-10-22 21:41:28 +01:00
github-actions
69cc3161fc 📝 Update release notes 2024-10-22 20:41:15 +00:00
pre-commit-ci[bot]
13c57834a5 ⬆ [pre-commit.ci] pre-commit autoupdate (#12505)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.6.9 → v0.7.0](https://github.com/astral-sh/ruff-pre-commit/compare/v0.6.9...v0.7.0)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-10-22 21:40:52 +01:00
github-actions
92df4e7903 📝 Update release notes 2024-10-22 20:28:24 +00:00
Alejandra
c1f91a0403 🌐 Fix rendering issue in translations (#12509) 2024-10-22 21:28:02 +01:00
github-actions
180e72b193 📝 Update release notes 2024-10-22 17:41:57 +00:00
ilacftemp
d5a0456084 🌐 Add Portuguese translation for docs/pt/docs/how-to/extending-openapi.md (#12470) 2024-10-22 17:40:08 +00:00
github-actions
396c0f6aab 📝 Update release notes 2024-10-22 17:36:16 +00:00
Leonardo Scarlato
bbcee4db19 🌐 Add Portuguese translation for docs/pt/docs/advanced/dataclasses.md (#12475) 2024-10-22 18:33:53 +01:00
github-actions
cb74448bd9 📝 Update release notes 2024-10-22 17:33:23 +00:00
Fernando Alzueta
94fafa5030 🌐 Add Portuguese translation for docs/pt/docs/how-to/custom-request-and-route.md (#12483) 2024-10-22 18:33:00 +01:00
Sebastián Ramírez
c519614b45 🔖 Release version 0.115.3 2024-10-22 15:26:52 +01:00
github-actions
9c794c9c0d 📝 Update release notes 2024-10-22 14:20:24 +00:00
Marcel Hellkamp
c4f8143dea ⬆️ Upgrade Starlette to >=0.40.0,<0.42.0 (#12469)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-10-22 15:19:56 +01:00
github-actions
45822d31f2 📝 Update release notes 2024-10-20 19:20:44 +00:00
Elton Jefferson
4c1a1938bc 📝 Fix broken link in docs (#12495) 2024-10-20 20:20:23 +01:00
github-actions
5afa6d7066 📝 Update release notes 2024-10-18 12:13:10 +00:00
github-actions
f0b5f8adf7 📝 Update release notes 2024-10-18 12:12:24 +00:00
YungYueh ChanLee
b0761c2552 🌐 Add Traditional Chinese translation for docs/zh-hant/docs/fastapi-cli.md (#12444) 2024-10-18 14:12:01 +02:00
YungYueh ChanLee
53d90074e5 🌐 Add Traditional Chinese translation for docs/zh-hant/docs/deployment/index.md (#12439) 2024-10-18 14:10:00 +02:00
github-actions
7038bedc5d 📝 Update release notes 2024-10-18 12:05:45 +00:00
Guilherme Rameh
48849f8a11 🌐 Add Portuguese translation for docs/pt/docs/how-to/testing-database.md (#12472) 2024-10-18 14:04:04 +02:00
github-actions
b7fb8eb656 📝 Update release notes 2024-10-18 12:03:01 +00:00
Luis Rodrigues
ac3c2dd965 🌐 Add Portuguese translation for docs/pt/docs/how-to/custom-docs-ui-assets.md (#12473) 2024-10-18 14:02:35 +02:00
github-actions
febf6b6a52 📝 Update release notes 2024-10-16 07:45:07 +00:00
leonardopaloschi
71f2be2387 🌐 Add Portuguese translation for docs/pt/docs/advanced/response-headers.md (#12458) 2024-10-16 09:44:45 +02:00
github-actions
50639525bf 📝 Update release notes 2024-10-15 12:34:11 +00:00
YungYueh ChanLee
80ba3fc5db 🌐 Add Traditional Chinese translation for docs/zh-hant/docs/deployment/cloud.md (#12440) 2024-10-15 14:33:07 +02:00
github-actions
d7942aea2d 📝 Update release notes 2024-10-15 12:32:58 +00:00
Rafael de Oliveira Marques
12c188b311 🌐 Update Portuguese translation for docs/pt/docs/python-types.md (#12428) 2024-10-15 14:32:27 +02:00
github-actions
9b09974cfc 📝 Update release notes 2024-10-15 11:39:19 +00:00
WISDERFIN
0507458504 🌐 Add Russian translation for docs/ru/docs/environment-variables.md (#12436) 2024-10-15 13:38:57 +02:00
github-actions
be03a7313e 📝 Update release notes 2024-10-15 10:39:19 +00:00
Alejandra
111ced53af 👷 Update issue manager workflow (#12457)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-10-15 12:38:53 +02:00
github-actions
d63f0d60ba 📝 Update release notes 2024-10-15 10:03:32 +00:00
YungYueh ChanLee
4d8d092925 🌐 Add Traditional Chinese translation for docs/zh-hant/docs/resources/index.md (#12443) 2024-10-15 12:00:33 +02:00
github-actions
33cd8bbcc5 📝 Update release notes 2024-10-15 09:58:11 +00:00
YungYueh ChanLee
73546a68e6 🌐 Add Traditional Chinese translation for docs/zh-hant/docs/about/index.md (#12438) 2024-10-15 11:57:21 +02:00
github-actions
c9f11c2b73 📝 Update release notes 2024-10-15 09:53:37 +00:00
Rafael de Oliveira Marques
e58c185526 🌐 Add Portuguese translation for docs/pt/docs/tutorial/query-param-models.md (#12414) 2024-10-15 11:53:14 +02:00
github-actions
923d44de35 📝 Update release notes 2024-10-14 14:57:54 +00:00
Rafael de Oliveira Marques
7148584ac4 🌐 Remove Portuguese translation for docs/pt/docs/deployment.md (#12427) 2024-10-14 16:57:32 +02:00
github-actions
38f65c033f 📝 Update release notes 2024-10-14 10:52:26 +00:00
Sebastián Ramírez
5f998ee55a 🔧 Update team, include YuriiMotov 🚀 (#12453) 2024-10-14 12:51:58 +02:00
github-actions
7358ed246e 📝 Update release notes 2024-10-14 09:17:01 +00:00
Anderson Rocha
d4e183da3f 🌐 Add Portuguese translation for docs/pt/docs/tutorial/body-updates.md (#12381) 2024-10-14 11:16:06 +02:00
github-actions
0e4dc88bd7 📝 Update release notes 2024-10-14 09:15:46 +00:00
Paulo Falcão
b887d434db 🌐 Add Portuguese translation for docs/pt/docs/advanced/response-cookies.md (#12417) 2024-10-14 11:15:24 +02:00
github-actions
766a14ddff 📝 Update release notes 2024-10-12 13:59:03 +00:00
Sebastián Ramírez
6384f730f7 👷 Refactor label-approved, make it an internal script instead of an external GitHub Action (#12280) 2024-10-12 13:58:30 +00:00
github-actions
84ef149f83 📝 Update release notes 2024-10-12 13:49:27 +00:00
Sebastián Ramírez
495d90161b 👷 Fix smokeshow, checkout files on CI (#12434) 2024-10-12 15:47:46 +02:00
github-actions
ac6c08c71f 📝 Update release notes 2024-10-12 12:28:10 +00:00
Sebastián Ramírez
a30eb6f517 👷 Use uv in CI (#12281) 2024-10-12 14:27:19 +02:00
github-actions
3347f0dde5 📝 Update release notes 2024-10-12 10:29:52 +00:00
dependabot[bot]
91672fb9ed ⬆ Update httpx requirement from <0.25.0,>=0.23.0 to >=0.23.0,<0.28.0 (#11509)
Updates the requirements on [httpx](https://github.com/encode/httpx) to permit the latest version.
- [Release notes](https://github.com/encode/httpx/releases)
- [Changelog](https://github.com/encode/httpx/blob/master/CHANGELOG.md)
- [Commits](https://github.com/encode/httpx/compare/0.23.0...0.27.0)

---
updated-dependencies:
- dependency-name: httpx
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-12 12:29:31 +02:00
Sebastián Ramírez
07684aea79 🔖 Release version 0.115.2 2024-10-12 12:00:47 +02:00
github-actions
63c428fbf9 📝 Update release notes 2024-10-12 09:59:23 +00:00
Sebastián Ramírez
b77f2351d1 ⬆️ Upgrade Starlette to >=0.37.2,<0.41.0 (#12431) 2024-10-12 11:59:01 +02:00
Sebastián Ramírez
113da5b0a7 🔖 Release version 0.115.1 2024-10-12 11:51:09 +02:00
github-actions
f0be768646 📝 Update release notes 2024-10-12 09:45:17 +00:00
Felix Fanghaenel
e049fc4ea1 🐛 Fix openapi generation with responses kwarg (#10895)
Co-authored-by: flxdot <felix.fanghaenel@nitrex.com>
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
Co-authored-by: Sławek Ehlert <slawomir.ehlert@gmail.com>
2024-10-12 11:44:57 +02:00
github-actions
b29cf1621a 📝 Update release notes 2024-10-12 09:36:55 +00:00
José Pacheco
8ae4603d68 🐛 Remove Required shadowing from fastapi using Pydantic v2 (#12197)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
2024-10-12 11:36:32 +02:00
github-actions
529155e72e 📝 Update release notes 2024-10-09 20:12:15 +00:00
pre-commit-ci[bot]
104dc0b8d8 ⬆ [pre-commit.ci] pre-commit autoupdate (#12396)
updates:
- [github.com/pre-commit/pre-commit-hooks: v4.6.0 → v5.0.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.6.0...v5.0.0)
- [github.com/astral-sh/ruff-pre-commit: v0.6.8 → v0.6.9](https://github.com/astral-sh/ruff-pre-commit/compare/v0.6.8...v0.6.9)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-10-09 22:11:46 +02:00
github-actions
dbb4a91e12 📝 Update release notes 2024-10-09 19:45:08 +00:00
Sebastián Ramírez
7daaac2bc3 Add new tutorial for SQL databases with SQLModel (#12285) 2024-10-09 21:44:42 +02:00
github-actions
13a18f80b3 📝 Update release notes 2024-10-08 11:01:43 +00:00
Sebastián Ramírez
c6dfdb8523 🔨 Add script to generate variants of files (#12405) 2024-10-08 11:01:17 +00:00
github-actions
a94d61b2c0 📝 Update release notes 2024-10-08 10:55:50 +00:00
Sebastián Ramírez
40490abaa3 ♻️ Update type annotations for improved python-multipart (#12407) 2024-10-08 12:55:26 +02:00
github-actions
fcb15b4db1 📝 Update release notes 2024-10-08 08:38:00 +00:00
Sebastián Ramírez
018e303fd9 🔧 Add speakeasy-api to sponsors_badge.yml (#12404) 2024-10-08 08:37:32 +00:00
github-actions
6345147c24 📝 Update release notes 2024-10-07 20:25:03 +00:00
Sebastián Ramírez
95f167f048 Add docs dependency: markdown-include-variants (#12399) 2024-10-07 20:24:40 +00:00
github-actions
ecc4133907 📝 Update release notes 2024-10-07 20:18:29 +00:00
Sebastián Ramírez
797cad7162 📝 Fix extra mdx-base-path paths (#12397) 2024-10-07 20:18:07 +00:00
github-actions
e45b5d3589 📝 Update release notes 2024-10-07 20:11:42 +00:00
Sebastián Ramírez
b45192c68a 👷 Tweak labeler to not override custom labels (#12398) 2024-10-07 20:11:20 +00:00
github-actions
31aec0967a 📝 Update release notes 2024-10-07 11:32:19 +00:00
Balthazar Rouberol
e9c6408af7 📝 Add External Link: How to profile a FastAPI asynchronous request (#12389) 2024-10-07 11:31:55 +00:00
github-actions
3f8a527b50 📝 Update release notes 2024-10-07 11:23:42 +00:00
Rafael de Oliveira Marques
e62960e323 🌐 Add Portuguese translation for docs/pt/docs/tutorial/cookie-param-models.md (#12298) 2024-10-07 13:23:18 +02:00
github-actions
b36b7dfed0 📝 Update release notes 2024-10-06 20:37:15 +00:00
Sebastián Ramírez
0f7d67e85c 🔧 Remove base_path for mdx_include Markdown extension in MkDocs (#12391) 2024-10-06 22:36:54 +02:00
github-actions
c67b41546c 📝 Update release notes 2024-10-06 20:14:33 +00:00
Sebastián Ramírez
1705a8c37f 👷 Update deploy-docs-notify URL (#12392) 2024-10-06 20:14:05 +00:00
github-actions
ad8b3ba3ec 📝 Update release notes 2024-10-05 12:49:28 +00:00
Sebastián Ramírez
9d6ec4aa77 👷 Update Cloudflare GitHub Action (#12387) 2024-10-05 14:49:04 +02:00
github-actions
ea1265b78b 📝 Update release notes 2024-10-04 11:58:03 +00:00
dependabot[bot]
caa298aefe ⬆ Bump pypa/gh-action-pypi-publish from 1.10.1 to 1.10.3 (#12386)
Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.10.1 to 1.10.3.
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.10.1...v1.10.3)

---
updated-dependencies:
- dependency-name: pypa/gh-action-pypi-publish
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-04 13:57:23 +02:00
github-actions
82b95dcef8 📝 Update release notes 2024-10-04 11:56:57 +00:00
dependabot[bot]
757eaacd59 ⬆ Bump mkdocstrings[python] from 0.25.1 to 0.26.1 (#12371)
Bumps [mkdocstrings[python]](https://github.com/mkdocstrings/mkdocstrings) from 0.25.1 to 0.26.1.
- [Release notes](https://github.com/mkdocstrings/mkdocstrings/releases)
- [Changelog](https://github.com/mkdocstrings/mkdocstrings/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mkdocstrings/mkdocstrings/compare/0.25.1...0.26.1)

---
updated-dependencies:
- dependency-name: mkdocstrings[python]
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Alejandra <90076947+alejsdev@users.noreply.github.com>
2024-10-04 13:56:35 +02:00
github-actions
deec2e591e 📝 Update release notes 2024-10-04 11:39:01 +00:00
dependabot[bot]
8953d9a323 ⬆ Bump griffe-typingdoc from 0.2.6 to 0.2.7 (#12370)
Bumps [griffe-typingdoc](https://github.com/mkdocstrings/griffe-typingdoc) from 0.2.6 to 0.2.7.
- [Release notes](https://github.com/mkdocstrings/griffe-typingdoc/releases)
- [Changelog](https://github.com/mkdocstrings/griffe-typingdoc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mkdocstrings/griffe-typingdoc/compare/0.2.6...0.2.7)

---
updated-dependencies:
- dependency-name: griffe-typingdoc
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-04 13:37:26 +02:00
github-actions
d12db0b26c 📝 Update release notes 2024-10-04 11:36:26 +00:00
Pavlo Pohorieltsev
3f3a3dd664 📝 Update link to Swagger UI configuration docs (#12264) 2024-10-04 13:34:57 +02:00
github-actions
f2fb0251cc 📝 Update release notes 2024-10-04 11:26:21 +00:00
pre-commit-ci[bot]
a096615f79 ⬆ [pre-commit.ci] pre-commit autoupdate (#12331)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.6.7 → v0.6.8](https://github.com/astral-sh/ruff-pre-commit/compare/v0.6.7...v0.6.8)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-10-04 13:21:41 +02:00
github-actions
3d24833272 📝 Update release notes 2024-10-04 11:20:57 +00:00
github-actions
c08b80d09f 📝 Update release notes 2024-10-04 11:20:35 +00:00
Kayque Govetri
c93810e097 📝 Adding links for Playwright and Vite in docs/project-generation.md (#12274) 2024-10-04 13:16:34 +02:00
AnandaCampelo
a681aeba6d 🌐 Add Portuguese translation for docs/pt/docs/how-to/graphql.md (#12215) 2024-10-04 13:15:21 +02:00
github-actions
e2217e24b9 📝 Update release notes 2024-10-04 11:14:33 +00:00
Rafael de Oliveira Marques
0e7806e3f9 🌐 Add Portuguese translation for docs/pt/docs/advanced/security/oauth2-scopes.md (#12263) 2024-10-04 13:11:41 +02:00
github-actions
5820d4261e 📝 Update release notes 2024-10-04 11:10:09 +00:00
github-actions
304f514ed9 📝 Update release notes 2024-10-04 11:08:00 +00:00
marcelomarkus
17e234452a 🌐 Add Portuguese translation for docs/pt/docs/deployment/concepts.md (#12219) 2024-10-04 13:04:50 +02:00
marcelomarkus
fa50b0c73c 🌐 Add Portuguese translation for docs/pt/docs/how-to/conditional-openapi.md (#12221) 2024-10-04 13:03:46 +02:00
github-actions
b1c03ba57e 📝 Update release notes 2024-10-04 11:03:27 +00:00
github-actions
98d190f780 📝 Update release notes 2024-10-04 11:01:25 +00:00
João Pedro Pereira Holanda
69921b463e 🌐 Add Portuguese translation for docs/pt/docs/advanced/response-directly.md (#12266) 2024-10-04 13:00:29 +02:00
github-actions
ed477ee887 📝 Update release notes 2024-10-04 10:58:40 +00:00
Rafael de Oliveira Marques
ca68c99a6e 🌐 Update Portuguese translation for docs/pt/docs/tutorial/cookie-params.md (#12297) 2024-10-04 12:58:03 +02:00
kkotipy
0030f1749e 🌐 Fix Korean translation for docs/ko/docs/tutorial/index.md (#12278) 2024-10-04 10:57:17 +00:00
github-actions
919721ce8d 📝 Update release notes 2024-10-04 10:56:12 +00:00
Anderson Rocha
f0ebae6e9e 🌐 Update Portuguese translation for docs/pt/docs/advanced/security/http-basic-auth.md (#12275) 2024-10-04 12:55:49 +02:00
github-actions
847296e885 📝 Update release notes 2024-09-26 17:17:48 +00:00
Sebastián Ramírez
bb018fc46c 🔧 Update sponsors, remove Fine.dev (#12271) 2024-09-26 17:17:21 +00:00
github-actions
10f3cb5ab1 📝 Update release notes 2024-09-24 10:14:28 +00:00
pre-commit-ci[bot]
d9e989e274 ⬆ [pre-commit.ci] pre-commit autoupdate (#12253)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.6.5 → v0.6.7](https://github.com/astral-sh/ruff-pre-commit/compare/v0.6.5...v0.6.7)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-09-24 12:14:00 +02:00
github-actions
9606b916ef 📝 Update release notes 2024-09-21 21:38:11 +00:00
marcelomarkus
6a2ad7031c 🌐 Add Portuguese translation for docs/pt/docs/deployment/cloud.md (#12217) 2024-09-21 23:37:48 +02:00
github-actions
f6dfb832c5 📝 Update release notes 2024-09-20 11:34:29 +00:00
Javier Sánchez Castro
2cdf111e61 ✏️ Fix typo in docs/es/docs/python-types.md (#12235) 2024-09-20 11:34:07 +00:00
github-actions
13e20228a9 📝 Update release notes 2024-09-20 11:15:35 +00:00
Max Scheijen
6aefc31600 🌐 Add Dutch translation for docs/nl/docs/environment-variables.md (#12200) 2024-09-20 13:13:32 +02:00
github-actions
2459a009f4 📝 Update release notes 2024-09-20 11:11:21 +00:00
João Gustavo Rogel de Oliveira
b1024e73be 🌐 Add Portuguese translation for docs/pt/docs/deployment/manually.md (#12210) 2024-09-20 13:10:02 +02:00
github-actions
4e3db0b689 📝 Update release notes 2024-09-20 11:03:12 +00:00
marcelomarkus
0b1da2d910 🌐 Add Portuguese translation for docs/pt/docs/deployment/server-workers.md (#12220) 2024-09-20 13:01:03 +02:00
github-actions
cf93157be7 📝 Update release notes 2024-09-20 11:00:31 +00:00
marcelomarkus
97ac2286aa 🌐 Add Portuguese translation for docs/pt/docs/how-to/configure-swagger-ui.md (#12222) 2024-09-20 13:00:08 +02:00
github-actions
7c6f2f8fde 📝 Update release notes 2024-09-19 09:47:54 +00:00
Albert Villanova del Moral
6cc24416e2 ✏️ Fix docstring typos in http security (#12223)
Fix docstring typos in http security
2024-09-19 11:47:28 +02:00
github-actions
4d6cab3ec6 📝 Update release notes 2024-09-18 16:10:21 +00:00
Sofie Van Landeghem
42e0e368bc 📝 Fix small typos in the documentation (#12213) 2024-09-18 18:09:57 +02:00
Sebastián Ramírez
40e33e492d 🔖 Release version 0.115.0 2024-09-17 21:07:35 +02:00
Sebastián Ramírez
b36047b54a 📝 Update release notes 2024-09-17 21:06:26 +02:00
github-actions
7eadeb69bd 📝 Update release notes 2024-09-17 18:54:35 +00:00
Sebastián Ramírez
55035f440b Add support for Pydantic models for parameters using Query, Cookie, Header (#12199) 2024-09-17 20:54:10 +02:00
github-actions
0903da78c9 📝 Update release notes 2024-09-16 22:00:35 +00:00
pre-commit-ci[bot]
4b2b14a8e8 ⬆ [pre-commit.ci] pre-commit autoupdate (#12204)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.6.4 → v0.6.5](https://github.com/astral-sh/ruff-pre-commit/compare/v0.6.4...v0.6.5)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-09-17 00:00:09 +02:00
github-actions
35df20c79c 📝 Update release notes 2024-09-15 19:04:38 +00:00
Rafael de Oliveira Marques
8eb3c5621f 🌐 Add Portuguese translation for docs/pt/docs/advanced/security/http-basic-auth.md (#12195) 2024-09-15 21:04:17 +02:00
Sebastián Ramírez
2ada1615a3 🔖 Release version 0.114.2 2024-09-13 22:46:33 +02:00
github-actions
3a5fd71f55 📝 Update release notes 2024-09-13 09:51:26 +00:00
Nico Tonnhofer
88d4f2cb18 🐛 Fix form field regression (#12194) 2024-09-13 11:51:00 +02:00
github-actions
0fc6e34135 📝 Update release notes 2024-09-13 09:15:10 +00:00
Sebastián Ramírez
2a4351105e 💡 Add comments with instructions for Playwright screenshot scripts (#12193) 2024-09-13 11:14:46 +02:00
github-actions
ed66d70513 📝 Update release notes 2024-09-12 17:06:34 +00:00
Rafael de Oliveira Marques
e50facaf22 🌐 Add Portuguese translation for docs/pt/docs/tutorial/request-form-models.md (#12175) 2024-09-12 19:03:48 +02:00
github-actions
93e50e373b 📝 Update release notes 2024-09-12 17:03:26 +00:00
Waket Zheng
4a94fe3c82 🌐 Add Chinese translation for docs/zh/docs/project-generation.md (#12170) 2024-09-12 19:01:54 +02:00
github-actions
492943fdb1 📝 Update release notes 2024-09-12 17:01:01 +00:00
Max Scheijen
c8e644d19e 🌐 Add Dutch translation for docs/nl/docs/python-types.md (#12158) 2024-09-12 19:00:36 +02:00
github-actions
ba0bb6212e 📝 Update release notes 2024-09-11 22:50:18 +00:00
Sebastián Ramírez
24b8f2668b Add inline-snapshot for tests (#12189) 2024-09-11 22:49:55 +00:00
Sebastián Ramírez
212fd5e247 🔖 Release version 0.114.1 2024-09-11 09:46:34 +02:00
github-actions
8dc882f751 📝 Update release notes 2024-09-11 07:45:49 +00:00
Sebastián Ramírez
b0eedbb580 ️ Improve performance in request body parsing with a cache for internal model fields (#12184) 2024-09-11 09:45:30 +02:00
github-actions
74451189f6 📝 Update release notes 2024-09-10 10:40:52 +00:00
github-actions
a4c5f7f62f 📝 Update release notes 2024-09-10 10:38:58 +00:00
github-actions
eb45bade63 📝 Update release notes 2024-09-10 10:37:36 +00:00
marcelomarkus
944b6e507e 🌐 Add Portuguese translation for docs/pt/docs/virtual-environments.md (#12163) 2024-09-10 12:37:13 +02:00
marcelomarkus
e69ba26386 🌐 Add Portuguese translation for docs/pt/docs/environment-variables.md (#12162) 2024-09-10 12:36:42 +02:00
marcelomarkus
a4a7925045 🌐 Add Portuguese translation for docs/pt/docs/tutorial/testing.md (#12164) 2024-09-10 12:35:14 +02:00
github-actions
73d4f347df 📝 Update release notes 2024-09-10 10:34:46 +00:00
marcelomarkus
80e2cd1274 🌐 Add Portuguese translation for docs/pt/docs/tutorial/debugging.md (#12165) 2024-09-10 12:34:25 +02:00
github-actions
bc715d55bc 📝 Update release notes 2024-09-10 09:08:09 +00:00
dependabot[bot]
fc601bcb4b ⬆ Bump tiangolo/issue-manager from 0.5.0 to 0.5.1 (#12173)
Bumps [tiangolo/issue-manager](https://github.com/tiangolo/issue-manager) from 0.5.0 to 0.5.1.
- [Release notes](https://github.com/tiangolo/issue-manager/releases)
- [Commits](https://github.com/tiangolo/issue-manager/compare/0.5.0...0.5.1)

---
updated-dependencies:
- dependency-name: tiangolo/issue-manager
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-10 11:07:46 +02:00
github-actions
da4670cf77 📝 Update release notes 2024-09-09 18:36:15 +00:00
pre-commit-ci[bot]
a67167dce3 ⬆ [pre-commit.ci] pre-commit autoupdate (#12176)
* ⬆ [pre-commit.ci] pre-commit autoupdate

updates:
- [github.com/astral-sh/ruff-pre-commit: v0.6.3 → v0.6.4](https://github.com/astral-sh/ruff-pre-commit/compare/v0.6.3...v0.6.4)

* bump ruff in tests requirements as well

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: svlandeg <svlandeg@github.com>
2024-09-09 20:35:50 +02:00
github-actions
c49c4e7df8 📝 Update release notes 2024-09-08 20:37:14 +00:00
Guillaume Fassot
270aef71c4 📝 Remove duplicate line in docs for docs/en/docs/environment-variables.md (#12169) 2024-09-08 22:36:53 +02:00
github-actions
3a4431b6fe 📝 Update release notes 2024-09-07 23:36:05 +00:00
BORA
ec2a508292 🌐 Add Korean translation for docs/ko/docs/project-generation.md (#12157) 2024-09-08 01:35:43 +02:00
github-actions
b501fc6daf 📝 Update release notes 2024-09-07 15:24:06 +00:00
Sebastián Ramírez
edb584199f 👷 Update issue-manager.yml (#12159) 2024-09-07 17:21:14 +02:00
github-actions
4b9e5b3a74 📝 Update release notes 2024-09-06 18:06:45 +00:00
Vaibhav
b60d36e753 ✏️ Fix typo in fastapi/params.py (#12143) 2024-09-06 20:06:20 +02:00
Sebastián Ramírez
bde12faea2 🔖 Release version 0.114.0 2024-09-06 19:41:13 +02:00
Sebastián Ramírez
74842f0a60 📝 Update release notes 2024-09-06 19:40:27 +02:00
github-actions
e68d8c60fb 📝 Update release notes 2024-09-06 17:38:50 +00:00
Sebastián Ramírez
4ff22a0c41 📝 Update docs, Form Models section title, to match config name (#12152) 2024-09-06 17:38:23 +00:00
github-actions
a11e392f5f 📝 Update release notes 2024-09-06 17:31:44 +00:00
Sebastián Ramírez
4633b1bca9 Add support for forbidding extra form fields with Pydantic models (#12134)
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
2024-09-06 19:31:18 +02:00
github-actions
1b06b53267 📝 Update release notes 2024-09-06 15:58:05 +00:00
Sebastián Ramírez
c411b81c29 Update internal tests for latest Pydantic, including CI tweaks to install the latest Pydantic (#12147) 2024-09-06 15:57:43 +00:00
Sebastián Ramírez
d86f660302 🔖 Release version 0.113.0 2024-09-05 17:25:29 +02:00
github-actions
179f838c36 📝 Update release notes 2024-09-05 15:23:05 +00:00
Sebastián Ramírez
afdda4e50b 🔧 Update sponsors: Coherence link (#12130) 2024-09-05 15:21:35 +00:00
github-actions
e787f854dd 📝 Update release notes 2024-09-05 15:17:13 +00:00
Sebastián Ramírez
7bad7c0975 Add support for Pydantic models in Form parameters (#12129)
Revert "️ Temporarily revert " Add support for Pydantic models in `Form` pa…"

This reverts commit 8e6cf9ee9c.
2024-09-05 17:16:50 +02:00
Sebastián Ramírez
965fc8301e 📝 Update release notes 2024-09-05 17:09:31 +02:00
Sebastián Ramírez
999eeb6c76 🔖 Release version 0.112.4 2024-09-05 17:00:33 +02:00
Sebastián Ramírez
96c7e7e0f3 📝 Update release notes 2024-09-05 17:00:13 +02:00
Sebastián Ramírez
8224addd8f 📝 Update release notes 2024-09-05 16:57:57 +02:00
github-actions
b69e8b24af 📝 Update release notes 2024-09-05 14:56:10 +00:00
Sebastián Ramírez
8e6cf9ee9c ️ Temporarily revert " Add support for Pydantic models in Form parameters" to make a checkpoint release (#12128)
Revert " Add support for Pydantic models in `Form` parameters (#12127)"

This reverts commit 0f3e65b007.
2024-09-05 16:55:44 +02:00
github-actions
ccb19c4c35 📝 Update release notes 2024-09-05 14:41:11 +00:00
Sebastián Ramírez
0f3e65b007 Add support for Pydantic models in Form parameters (#12127) 2024-09-05 16:40:48 +02:00
github-actions
832e634fd4 📝 Update release notes 2024-09-05 11:25:02 +00:00
Sebastián Ramírez
aa21814a89 ♻️ Refactor deciding if embed body fields, do not overwrite fields, compute once per router, refactor internals in preparation for Pydantic models in Form, Query and others (#12117) 2024-09-05 13:24:36 +02:00
Sebastián Ramírez
7213d421f5 🔖 Release version 0.112.3 2024-09-05 11:13:32 +02:00
github-actions
68e5ef6968 📝 Update release notes 2024-09-05 09:07:55 +00:00
pre-commit-ci[bot]
1f64a1bb55 ⬆ [pre-commit.ci] pre-commit autoupdate (#12115)
* ⬆ [pre-commit.ci] pre-commit autoupdate

updates:
- [github.com/astral-sh/ruff-pre-commit: v0.6.2 → v0.6.3](https://github.com/astral-sh/ruff-pre-commit/compare/v0.6.2...v0.6.3)

* bump ruff as well

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
Co-authored-by: svlandeg <svlandeg@github.com>
2024-09-05 11:07:32 +02:00
github-actions
9b2a9333b3 📝 Update release notes 2024-09-03 16:05:42 +00:00
Shubhendra Kushwaha
f42fd9aac2 📝 Add External Link: Techniques and applications of SQLAlchemy global filters in FastAPI (#12109) 2024-09-03 18:05:19 +02:00
github-actions
cbdc58b1b7 📝 Update release notes 2024-09-03 13:54:00 +00:00
Max Scheijen
3feed9dd8c 🌐 Add Dutch translation for docs/nl/docs/features.md (#12101) 2024-09-03 15:50:38 +02:00
github-actions
560c43269d 📝 Update release notes 2024-09-03 13:49:34 +00:00
dependabot[bot]
7eae925443 ⬆ Bump pypa/gh-action-pypi-publish from 1.10.0 to 1.10.1 (#12120)
Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.10.0 to 1.10.1.
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.10.0...v1.10.1)

---
updated-dependencies:
- dependency-name: pypa/gh-action-pypi-publish
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-03 15:47:08 +02:00
github-actions
7d69943a22 📝 Update release notes 2024-09-03 13:45:21 +00:00
github-actions
56cfecc1bf 📝 Update release notes 2024-09-03 13:44:55 +00:00
Rafael de Oliveira Marques
e26229ed98 🌐 Add Portuguese translation for docs/pt/docs/advanced/testing-events.md (#12108) 2024-09-03 15:44:35 +02:00
Rafael de Oliveira Marques
c1c57336b0 🌐 Add Portuguese translation for docs/pt/docs/advanced/security/index.md (#12114) 2024-09-03 15:43:56 +02:00
github-actions
7537bac43f 📝 Update release notes 2024-09-03 13:15:41 +00:00
dependabot[bot]
6b3d1c6d4e ⬆ Bump pillow from 10.3.0 to 10.4.0 (#12105)
Bumps [pillow](https://github.com/python-pillow/Pillow) from 10.3.0 to 10.4.0.
- [Release notes](https://github.com/python-pillow/Pillow/releases)
- [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst)
- [Commits](https://github.com/python-pillow/Pillow/compare/10.3.0...10.4.0)

---
updated-dependencies:
- dependency-name: pillow
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-03 15:15:17 +02:00
github-actions
a6ad088183 📝 Update release notes 2024-09-02 19:54:19 +00:00
Sofie Van Landeghem
b63b4189ee 💚 Set include-hidden-files to True when using the upload-artifact GH action (#12118)
* include-hidden-files when uploading coverage files

* include-hidden-files when building docs
2024-09-02 21:53:53 +02:00
github-actions
17f1f7b5bd 📝 Update release notes 2024-09-02 19:37:19 +00:00
dependabot[bot]
92bdfbc7ba ⬆ Bump pypa/gh-action-pypi-publish from 1.9.0 to 1.10.0 (#12112)
Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.9.0 to 1.10.0.
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.9.0...v1.10.0)

---
updated-dependencies:
- dependency-name: pypa/gh-action-pypi-publish
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-02 21:36:52 +02:00
github-actions
b203d7a15f 📝 Update release notes 2024-09-01 19:39:46 +00:00
Sebastián Ramírez
23bda0ffeb ♻️ Refactor internal check_file_field(), rename to ensure_multipart_is_installed() to clarify its purpose (#12106) 2024-09-01 21:39:25 +02:00
github-actions
d5c6cf8122 📝 Update release notes 2024-08-31 23:46:26 +00:00
Sebastián Ramírez
d08b95ea57 ♻️ Rename internal create_response_field() to create_model_field() as it's used for more than response models (#12103) 2024-09-01 01:46:03 +02:00
github-actions
3660c7a063 📝 Update release notes 2024-08-31 20:52:29 +00:00
Sebastián Ramírez
5b7fa3900e ♻️ Refactor and simplify internal data from solve_dependencies() using dataclasses (#12100) 2024-08-31 22:52:06 +02:00
github-actions
8d7d89e8c6 📝 Update release notes 2024-08-31 20:28:07 +00:00
Sebastián Ramírez
08547e1d57 ♻️ Refactor and simplify internal analyze_param() to structure data with dataclasses instead of tuple (#12099) 2024-08-31 22:27:44 +02:00
github-actions
75c4e7fc44 📝 Update release notes 2024-08-31 20:19:51 +00:00
Sebastián Ramírez
581aacc4a9 ♻️ Refactor and simplify dependencies data structures with dataclasses (#12098) 2024-08-31 22:19:30 +02:00
github-actions
47b3351be9 📝 Update release notes 2024-08-31 15:36:24 +00:00
Sebastián Ramírez
eebc6c3d54 🔧 Update sponsors link: Coherence (#12097) 2024-08-31 17:35:58 +02:00
github-actions
83422b1923 📝 Update release notes 2024-08-31 10:20:40 +00:00
Sebastián Ramírez
0077af9719 🔧 Update labeler config to handle sponsorships data (#12096) 2024-08-31 12:18:37 +02:00
github-actions
6c8a205db1 📝 Update release notes 2024-08-31 10:16:12 +00:00
Sebastián Ramírez
c37f2c976d 📝 Add note about time.perf_counter() in middlewares (#12095) 2024-08-31 10:15:50 +00:00
github-actions
5827b922c3 📝 Update release notes 2024-08-31 03:23:14 +00:00
Esteban Maya
1b5984b23b Merge pull request #11957 from domdent/docs/edit-timer-in-middleware
📝 Tweak middleware code sample `time.time()` to `time.perf_counter()`
2024-08-30 22:22:52 -05:00
Esteban Maya
6ca7b8c608 Merge branch 'master' into docs/edit-timer-in-middleware 2024-08-30 22:11:25 -05:00
github-actions
a2458d594f 📝 Update release notes 2024-08-30 16:20:42 +00:00
Sebastián Ramírez
9519380764 🔧 Update sponsors: Coherence (#12093) 2024-08-30 18:20:21 +02:00
github-actions
4eec14fa8c 📝 Update release notes 2024-08-30 16:01:05 +00:00
Marcin Sulikowski
6e98249c21 📝 Fix async test example not to trigger DeprecationWarning (#12084) 2024-08-30 18:00:41 +02:00
github-actions
17a29149e4 📝 Update release notes 2024-08-29 00:02:01 +00:00
Sebastián Ramírez
4cf3421178 🔧 Update sponsors, remove Kong (#12085) 2024-08-29 02:01:29 +02:00
github-actions
ffa6d2eafd 📝 Update release notes 2024-08-28 23:44:01 +00:00
Sofie Van Landeghem
ae27540348 🌐 Add Dutch translation for docs/nl/docs/index.md (#12042)
Co-authored-by: Max Scheijen <maxscheijen@gmail.com>
2024-08-29 01:41:46 +02:00
github-actions
3332895251 📝 Update release notes 2024-08-28 23:40:13 +00:00
Muhammad Ashiq Ameer
9b35d355bf 📝 Update docs_src/path_params_numeric_validations/tutorial006.py (#11478)
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
2024-08-28 18:39:15 -05:00
github-actions
a930128910 📝 Update release notes 2024-08-28 23:35:03 +00:00
Alec Gillis
cabed9efb6 📝 Update comma in docs/en/docs/async.md (#12062)
Co-authored-by: Alec Gillis <alecgillis@quorum.us>
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
2024-08-28 18:33:37 -05:00
github-actions
48bf0db58f 📝 Update release notes 2024-08-28 14:07:23 +00:00
pre-commit-ci[bot]
4909e44a7f ⬆ [pre-commit.ci] pre-commit autoupdate (#12076)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.6.1 → v0.6.2](https://github.com/astral-sh/ruff-pre-commit/compare/v0.6.1...v0.6.2)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-08-28 09:07:00 -05:00
github-actions
be9abcf353 📝 Update release notes 2024-08-28 13:48:40 +00:00
lkw123
f41f6234af 🌐 Update Chinese translation for docs/zh/docs/how-to/index.md (#12070) 2024-08-28 08:48:13 -05:00
github-actions
9416e89bd7 📝 Update release notes 2024-08-26 02:15:38 +00:00
Sebastián Ramírez
5fdbeed792 👷 Update latest-changes GitHub Action (#12073) 2024-08-26 02:14:56 +00:00
github-actions
3a96938771 📝 Update release notes 2024-08-25 02:44:27 +00:00
Sebastián Ramírez
bd1b77548f 📝 Update docs about serving FastAPI: ASGI servers, Docker containers, etc. (#12069) 2024-08-25 02:44:06 +00:00
github-actions
b5cbff9521 📝 Update release notes 2024-08-25 00:01:26 +00:00
Sebastián Ramírez
c692176d42 📝 Clarify response_class parameter, validations, and returning a response directly (#12067) 2024-08-24 19:01:04 -05:00
github-actions
d8e526c1db 📝 Update release notes 2024-08-24 21:52:29 +00:00
Sofie Van Landeghem
6aa44a85a2 📝 Fix minor typos and issues in the documentation (#12063) 2024-08-24 16:52:09 -05:00
github-actions
e4727ed20a 📝 Update release notes 2024-08-24 20:04:51 +00:00
GPla
9656895b60 📝 Add note in Docker docs about ensuring graceful shutdowns and lifespan events with CMD exec form (#11960)
Co-authored-by: svlandeg <svlandeg@github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-08-24 20:04:30 +00:00
Esteban Maya
866c6987fc Merge branch 'master' into docs/edit-timer-in-middleware 2024-08-22 12:55:06 -05:00
Sebastián Ramírez
ead4f8c6a4 Merge branch 'master' into docs/edit-timer-in-middleware 2024-08-07 16:08:05 -05:00
Dom
7ff5da8bf2 edit middleware docs code sample to use perf_counter as a timer 2024-08-06 14:46:39 +01:00
921 changed files with 25991 additions and 43909 deletions

4
.github/labeler.yml vendored
View File

@@ -7,6 +7,8 @@ docs:
- all-globs-to-all-files:
- '!fastapi/**'
- '!pyproject.toml'
- '!docs/en/data/sponsors.yml'
- '!docs/en/overrides/main.html'
lang-all:
- all:
@@ -28,6 +30,8 @@ internal:
- .pre-commit-config.yaml
- pdm_build.py
- requirements*.txt
- docs/en/data/sponsors.yml
- docs/en/overrides/main.html
- all-globs-to-all-files:
- '!docs/*/docs/**'
- '!fastapi/**'

View File

@@ -7,6 +7,10 @@ on:
types:
- opened
- synchronize
env:
UV_SYSTEM_PYTHON: 1
jobs:
changes:
runs-on: ubuntu-latest
@@ -48,18 +52,20 @@ jobs:
uses: actions/setup-python@v5
with:
python-version: "3.11"
- uses: actions/cache@v4
id: cache
- name: Setup uv
uses: astral-sh/setup-uv@v3
with:
path: ${{ env.pythonLocation }}
key: ${{ runner.os }}-python-docs-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml', 'requirements-docs.txt', 'requirements-docs-insiders.txt', 'requirements-docs-tests.txt') }}-v08
version: "0.4.15"
enable-cache: true
cache-dependency-glob: |
requirements**.txt
pyproject.toml
- name: Install docs extras
if: steps.cache.outputs.cache-hit != 'true'
run: pip install -r requirements-docs.txt
run: uv pip install -r requirements-docs.txt
# Install MkDocs Material Insiders here just to put it in the cache for the rest of the steps
- name: Install Material for MkDocs Insiders
if: ( github.event_name != 'pull_request' || github.secret_source == 'Actions' ) && steps.cache.outputs.cache-hit != 'true'
run: pip install -r requirements-docs-insiders.txt
if: ( github.event_name != 'pull_request' || github.secret_source == 'Actions' )
run: uv pip install -r requirements-docs-insiders.txt
env:
TOKEN: ${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}
- name: Verify Docs
@@ -88,17 +94,19 @@ jobs:
uses: actions/setup-python@v5
with:
python-version: "3.11"
- uses: actions/cache@v4
id: cache
- name: Setup uv
uses: astral-sh/setup-uv@v3
with:
path: ${{ env.pythonLocation }}
key: ${{ runner.os }}-python-docs-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml', 'requirements-docs.txt', 'requirements-docs-insiders.txt', 'requirements-docs-tests.txt') }}-v08
version: "0.4.15"
enable-cache: true
cache-dependency-glob: |
requirements**.txt
pyproject.toml
- name: Install docs extras
if: steps.cache.outputs.cache-hit != 'true'
run: pip install -r requirements-docs.txt
run: uv pip install -r requirements-docs.txt
- name: Install Material for MkDocs Insiders
if: ( github.event_name != 'pull_request' || github.secret_source == 'Actions' ) && steps.cache.outputs.cache-hit != 'true'
run: pip install -r requirements-docs-insiders.txt
if: ( github.event_name != 'pull_request' || github.secret_source == 'Actions' )
run: uv pip install -r requirements-docs-insiders.txt
env:
TOKEN: ${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}
- name: Update Languages
@@ -113,6 +121,7 @@ jobs:
with:
name: docs-site-${{ matrix.lang }}
path: ./site/**
include-hidden-files: true
# https://github.com/marketplace/actions/alls-green#why
docs-all-green: # This job does nothing and is only used for the branch protection

View File

@@ -12,6 +12,9 @@ permissions:
pull-requests: write
statuses: write
env:
UV_SYSTEM_PYTHON: 1
jobs:
deploy-docs:
runs-on: ubuntu-latest
@@ -25,21 +28,22 @@ jobs:
uses: actions/setup-python@v5
with:
python-version: "3.11"
- uses: actions/cache@v4
id: cache
- name: Setup uv
uses: astral-sh/setup-uv@v3
with:
path: ${{ env.pythonLocation }}
key: ${{ runner.os }}-python-github-actions-${{ env.pythonLocation }}-${{ hashFiles('requirements-github-actions.txt') }}-v01
version: "0.4.15"
enable-cache: true
cache-dependency-glob: |
requirements**.txt
pyproject.toml
- name: Install GitHub Actions dependencies
if: steps.cache.outputs.cache-hit != 'true'
run: pip install -r requirements-github-actions.txt
run: uv pip install -r requirements-github-actions.txt
- name: Deploy Docs Status Pending
run: python ./scripts/deploy_docs_status.py
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
COMMIT_SHA: ${{ github.event.workflow_run.head_sha }}
RUN_ID: ${{ github.run_id }}
- name: Clean site
run: |
rm -rf ./site
@@ -55,19 +59,22 @@ jobs:
# hashFiles returns an empty string if there are no files
if: hashFiles('./site/*')
id: deploy
uses: cloudflare/pages-action@v1
env:
PROJECT_NAME: fastapitiangolo
BRANCH: ${{ ( github.event.workflow_run.head_repository.full_name == github.repository && github.event.workflow_run.head_branch == 'master' && 'main' ) || ( github.event.workflow_run.head_sha ) }}
# TODO: Use v3 when it's fixed, probably in v3.11
# https://github.com/cloudflare/wrangler-action/issues/307
uses: cloudflare/wrangler-action@v3.12
# uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
projectName: fastapitiangolo
directory: './site'
gitHubToken: ${{ secrets.GITHUB_TOKEN }}
branch: ${{ ( github.event.workflow_run.head_repository.full_name == github.repository && github.event.workflow_run.head_branch == 'master' && 'main' ) || ( github.event.workflow_run.head_sha ) }}
command: pages deploy ./site --project-name=${{ env.PROJECT_NAME }} --branch=${{ env.BRANCH }}
- name: Comment Deploy
run: python ./scripts/deploy_docs_status.py
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DEPLOY_URL: ${{ steps.deploy.outputs.url }}
DEPLOY_URL: ${{ steps.deploy.outputs.deployment-url }}
COMMIT_SHA: ${{ github.event.workflow_run.head_sha }}
RUN_ID: ${{ github.run_id }}
IS_DONE: "true"

View File

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

View File

@@ -8,6 +8,9 @@ on:
permissions:
pull-requests: write
env:
UV_SYSTEM_PYTHON: 1
jobs:
label-approved:
if: github.repository_owner == 'fastapi'
@@ -17,10 +20,26 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- uses: docker://tiangolo/label-approved:0.0.4
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
token: ${{ secrets.GITHUB_TOKEN }}
config: >
python-version: "3.11"
- name: Setup uv
uses: astral-sh/setup-uv@v3
with:
version: "0.4.15"
enable-cache: true
cache-dependency-glob: |
requirements**.txt
pyproject.toml
- name: Install GitHub Actions dependencies
run: uv pip install -r requirements-github-actions.txt
- name: Label Approved
run: python ./scripts/label_approved.py
env:
TOKEN: ${{ secrets.GITHUB_TOKEN }}
CONFIG: >
{
"approved-1":
{

View File

@@ -17,6 +17,8 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/labeler@v5
if: ${{ github.event.action != 'labeled' && github.event.action != 'unlabeled' }}
- run: echo "Done adding labels"
# Run this after labeler applied labels
check-labels:
needs:

View File

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

View File

@@ -18,6 +18,9 @@ on:
permissions:
discussions: write
env:
UV_SYSTEM_PYTHON: 1
jobs:
notify-translations:
runs-on: ubuntu-latest
@@ -27,6 +30,19 @@ jobs:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- uses: actions/checkout@v4
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Setup uv
uses: astral-sh/setup-uv@v3
with:
version: "0.4.15"
enable-cache: true
cache-dependency-glob: |
requirements**.txt
pyproject.toml
# Allow debugging with tmate
- name: Setup tmate session
uses: mxschmitt/action-tmate@v3

View File

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

View File

@@ -8,6 +8,9 @@ on:
permissions:
statuses: write
env:
UV_SYSTEM_PYTHON: 1
jobs:
smokeshow:
if: ${{ github.event.workflow_run.conclusion == 'success' }}
@@ -18,19 +21,25 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.9'
- run: pip install smokeshow
- name: Setup uv
uses: astral-sh/setup-uv@v3
with:
version: "0.4.15"
enable-cache: true
cache-dependency-glob: |
requirements**.txt
pyproject.toml
- run: uv pip install -r requirements-github-actions.txt
- uses: actions/download-artifact@v4
with:
name: coverage-html
path: htmlcov
github-token: ${{ secrets.GITHUB_TOKEN }}
run-id: ${{ github.event.workflow_run.id }}
- run: smokeshow upload htmlcov
env:
SMOKESHOW_GITHUB_STATUS_DESCRIPTION: Coverage {coverage-percentage}

View File

@@ -12,6 +12,9 @@ on:
# cron every week on monday
- cron: "0 0 * * 1"
env:
UV_SYSTEM_PYTHON: 1
jobs:
lint:
runs-on: ubuntu-latest
@@ -25,19 +28,18 @@ jobs:
uses: actions/setup-python@v5
with:
python-version: "3.11"
# Issue ref: https://github.com/actions/setup-python/issues/436
# cache: "pip"
# cache-dependency-path: pyproject.toml
- uses: actions/cache@v4
id: cache
- name: Setup uv
uses: astral-sh/setup-uv@v3
with:
path: ${{ env.pythonLocation }}
key: ${{ runner.os }}-python-${{ env.pythonLocation }}-pydantic-v2-${{ hashFiles('pyproject.toml', 'requirements-tests.txt', 'requirements-docs-tests.txt') }}-test-v08
version: "0.4.15"
enable-cache: true
cache-dependency-glob: |
requirements**.txt
pyproject.toml
- name: Install Dependencies
if: steps.cache.outputs.cache-hit != 'true'
run: pip install -r requirements-tests.txt
run: uv pip install -r requirements-tests.txt
- name: Install Pydantic v2
run: pip install "pydantic>=2.0.2,<3.0.0"
run: uv pip install --upgrade "pydantic>=2.0.2,<3.0.0"
- name: Lint
run: bash scripts/lint.sh
@@ -63,23 +65,22 @@ jobs:
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
# Issue ref: https://github.com/actions/setup-python/issues/436
# cache: "pip"
# cache-dependency-path: pyproject.toml
- uses: actions/cache@v4
id: cache
- name: Setup uv
uses: astral-sh/setup-uv@v3
with:
path: ${{ env.pythonLocation }}
key: ${{ runner.os }}-python-${{ env.pythonLocation }}-${{ matrix.pydantic-version }}-${{ hashFiles('pyproject.toml', 'requirements-tests.txt', 'requirements-docs-tests.txt') }}-test-v08
version: "0.4.15"
enable-cache: true
cache-dependency-glob: |
requirements**.txt
pyproject.toml
- name: Install Dependencies
if: steps.cache.outputs.cache-hit != 'true'
run: pip install -r requirements-tests.txt
run: uv pip install -r requirements-tests.txt
- name: Install Pydantic v1
if: matrix.pydantic-version == 'pydantic-v1'
run: pip install "pydantic>=1.10.0,<2.0.0"
run: uv pip install "pydantic>=1.10.0,<2.0.0"
- name: Install Pydantic v2
if: matrix.pydantic-version == 'pydantic-v2'
run: pip install "pydantic>=2.0.2,<3.0.0"
run: uv pip install --upgrade "pydantic>=2.0.2,<3.0.0"
- run: mkdir coverage
- name: Test
run: bash scripts/test.sh
@@ -91,6 +92,7 @@ jobs:
with:
name: coverage-${{ matrix.python-version }}-${{ matrix.pydantic-version }}
path: coverage
include-hidden-files: true
coverage-combine:
needs: [test]
@@ -104,16 +106,22 @@ jobs:
- uses: actions/setup-python@v5
with:
python-version: '3.8'
# Issue ref: https://github.com/actions/setup-python/issues/436
# cache: "pip"
# cache-dependency-path: pyproject.toml
- name: Setup uv
uses: astral-sh/setup-uv@v3
with:
version: "0.4.15"
enable-cache: true
cache-dependency-glob: |
requirements**.txt
pyproject.toml
- name: Install Dependencies
run: uv pip install -r requirements-tests.txt
- name: Get coverage files
uses: actions/download-artifact@v4
with:
pattern: coverage-*
path: coverage
merge-multiple: true
- run: pip install coverage[toml]
- run: ls -la coverage
- run: coverage combine coverage
- run: coverage report
@@ -123,6 +131,7 @@ jobs:
with:
name: coverage-html
path: htmlcov
include-hidden-files: true
# https://github.com/marketplace/actions/alls-green#why
check: # This job does nothing and is only used for the branch protection

View File

@@ -4,7 +4,7 @@ default_language_version:
python: python3.10
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.6.0
rev: v5.0.0
hooks:
- id: check-added-large-files
- id: check-toml
@@ -14,7 +14,7 @@ repos:
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.6.1
rev: v0.7.4
hooks:
- id: ruff
args:

View File

@@ -52,12 +52,11 @@ The key features are:
<a href="https://bump.sh/fastapi?utm_source=fastapi&utm_medium=referral&utm_campaign=sponsor" target="_blank" title="Automate FastAPI documentation generation with Bump.sh"><img src="https://fastapi.tiangolo.com/img/sponsors/bump-sh.svg"></a>
<a href="https://github.com/scalar/scalar/?utm_source=fastapi&utm_medium=website&utm_campaign=main-badge" target="_blank" title="Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files"><img src="https://fastapi.tiangolo.com/img/sponsors/scalar.svg"></a>
<a href="https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=mainbadge" target="_blank" title="Auth, user management and more for your B2B product"><img src="https://fastapi.tiangolo.com/img/sponsors/propelauth.png"></a>
<a href="https://docs.withcoherence.com/configuration/frameworks/?utm_medium=advertising&utm_source=fastapi&utm_campaign=docs#fastapi-example" target="_blank" title="Coherence"><img src="https://fastapi.tiangolo.com/img/sponsors/coherence.png"></a>
<a href="https://www.withcoherence.com/?utm_medium=advertising&utm_source=fastapi&utm_campaign=website" target="_blank" title="Coherence"><img src="https://fastapi.tiangolo.com/img/sponsors/coherence.png"></a>
<a href="https://www.mongodb.com/developer/languages/python/python-quickstart-fastapi/?utm_campaign=fastapi_framework&utm_source=fastapi_sponsorship&utm_medium=web_referral" target="_blank" title="Simplify Full Stack Development with FastAPI & MongoDB"><img src="https://fastapi.tiangolo.com/img/sponsors/mongodb.png"></a>
<a href="https://konghq.com/products/kong-konnect?utm_medium=referral&utm_source=github&utm_campaign=platform&utm_content=fast-api" target="_blank" title="Kong Konnect - API management platform"><img src="https://fastapi.tiangolo.com/img/sponsors/kong.png"></a>
<a href="https://zuplo.link/fastapi-gh" target="_blank" title="Zuplo: Scale, Protect, Document, and Monetize your FastAPI"><img src="https://fastapi.tiangolo.com/img/sponsors/zuplo.png"></a>
<a href="https://fine.dev?ref=fastapibadge" target="_blank" title="Fine's AI FastAPI Workflow: Effortlessly Deploy and Integrate FastAPI into Your Project"><img src="https://fastapi.tiangolo.com/img/sponsors/fine.png"></a>
<a href="https://liblab.com?utm_source=fastapi" target="_blank" title="liblab - Generate SDKs from FastAPI"><img src="https://fastapi.tiangolo.com/img/sponsors/liblab.png"></a>
<a href="https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi" target="_blank" title="Deploy & scale any full-stack web app on Render. Focus on building apps, not infra."><img src="https://fastapi.tiangolo.com/img/sponsors/render.svg"></a>
<a href="https://github.com/deepset-ai/haystack/" target="_blank" title="Build powerful search from composable, open source building blocks"><img src="https://fastapi.tiangolo.com/img/sponsors/haystack-fastapi.svg"></a>
<a href="https://databento.com/" target="_blank" title="Pay as you go for market data"><img src="https://fastapi.tiangolo.com/img/sponsors/databento.svg"></a>
<a href="https://speakeasy.com?utm_source=fastapi+repo&utm_medium=github+sponsorship" target="_blank" title="SDKs for your API | Speakeasy"><img src="https://fastapi.tiangolo.com/img/sponsors/speakeasy.png"></a>
@@ -97,7 +96,7 @@ The key features are:
"_Honestly, what you've built looks super solid and polished. In many ways, it's what I wanted **Hug** to be - it's really inspiring to see someone build that._"
<div style="text-align: right; margin-right: 10%;">Timothy Crosley - <strong><a href="https://www.hug.rest/" target="_blank">Hug</a> creator</strong> <a href="https://news.ycombinator.com/item?id=19455465" target="_blank"><small>(ref)</small></a></div>
<div style="text-align: right; margin-right: 10%;">Timothy Crosley - <strong><a href="https://github.com/hugapi/hug" target="_blank">Hug</a> creator</strong> <a href="https://news.ycombinator.com/item?id=19455465" target="_blank"><small>(ref)</small></a></div>
---
@@ -394,7 +393,7 @@ Coming back to the previous code example, **FastAPI** will:
* Check if there is an optional query parameter named `q` (as in `http://127.0.0.1:8000/items/foo?q=somequery`) for `GET` requests.
* As the `q` parameter is declared with `= None`, it is optional.
* Without the `None` it would be required (as is the body in the case with `PUT`).
* For `PUT` requests to `/items/{item_id}`, Read the body as JSON:
* For `PUT` requests to `/items/{item_id}`, read the body as JSON:
* Check that it has a required attribute `name` that should be a `str`.
* Check that it has a required attribute `price` that has to be a `float`.
* Check that it has an optional attribute `is_offer`, that should be a `bool`, if present.

View File

@@ -87,7 +87,7 @@ FastAPI Python ilə API yaratmaq üçün standart Python <abbr title="Tip Məsl
"_Düzünü desəm, sizin qurduğunuz şey həqiqətən möhkəm və peşəkar görünür. Bir çox cəhətdən **Hug**-un olmasını istədiyim kimdir - kiminsə belə bir şey qurduğunu görmək həqiqətən ruhlandırıcıdır._"
<div style="text-align: right; margin-right: 10%;">Timothy Crosley - <strong><a href="https://www.hug.rest/" target="_blank">Hug</a> creator</strong> <a href="https://news.ycombinator.com/item?id=19455465" target="_blank"><small>(ref)</small></a></div>
<div style="text-align: right; margin-right: 10%;">Timothy Crosley - <strong><a href="https://github.com/hugapi/hug" target="_blank">Hug</a> creator</strong> <a href="https://news.ycombinator.com/item?id=19455465" target="_blank"><small>(ref)</small></a></div>
---

View File

@@ -85,7 +85,7 @@ FastAPI একটি আধুনিক, দ্রুত ( বেশি ক্
"\_সত্যিই, আপনি যা তৈরি করেছেন তা খুব মজবুত এবং পরিপূর্ন৷ অনেক উপায়ে, আমি যা **Hug** এ করতে চেয়েছিলাম - তা কাউকে তৈরি করতে দেখে আমি সত্যিই অনুপ্রানিত৷\_"
<div style="text-align: right; margin-right: 10%;">টিমোথি ক্রসলে - <strong><a href="https://www.hug.rest/" target="_blank">Hug</a> স্রষ্টা</strong> <a href="https://news.ycombinator.com/item?id=19455465" target="_blank"><small>(ref)</small></a></div>
<div style="text-align: right; margin-right: 10%;">টিমোথি ক্রসলে - <strong><a href="https://github.com/hugapi/hug" target="_blank">Hug</a> স্রষ্টা</strong> <a href="https://news.ycombinator.com/item?id=19455465" target="_blank"><small>(ref)</small></a></div>
---

View File

@@ -22,9 +22,8 @@ Python-এ ঐচ্ছিক "টাইপ হিন্ট" (যা "টাই
চলুন একটি সাধারণ উদাহরণ দিয়ে শুরু করি:
```Python
{!../../../docs_src/python_types/tutorial001.py!}
```
{* ../../docs_src/python_types/tutorial001.py *}
এই প্রোগ্রামটি কল করলে আউটপুট হয়:
@@ -38,9 +37,8 @@ John Doe
* প্রতিটির প্রথম অক্ষরকে `title()` ব্যবহার করে বড় হাতের অক্ষরে রূপান্তর করে।
* তাদেরকে মাঝখানে একটি স্পেস দিয়ে <abbr title="একটার পরে একটা একত্রিত করা">concatenate</abbr> করে।
```Python hl_lines="2"
{!../../../docs_src/python_types/tutorial001.py!}
```
{* ../../docs_src/python_types/tutorial001.py hl[2] *}
### এটি সম্পাদনা করুন
@@ -82,9 +80,8 @@ John Doe
এগুলিই "টাইপ হিন্ট":
```Python hl_lines="1"
{!../../../docs_src/python_types/tutorial002.py!}
```
{* ../../docs_src/python_types/tutorial002.py hl[1] *}
এটি ডিফল্ট ভ্যালু ঘোষণা করার মত নয় যেমন:
@@ -112,9 +109,8 @@ John Doe
এই ফাংশনটি দেখুন, এটিতে ইতিমধ্যে টাইপ হিন্ট রয়েছে:
```Python hl_lines="1"
{!../../../docs_src/python_types/tutorial003.py!}
```
{* ../../docs_src/python_types/tutorial003.py hl[1] *}
এডিটর ভেরিয়েবলগুলির টাইপ জানার কারণে, আপনি শুধুমাত্র অটোকমপ্লিশনই পান না, আপনি এরর চেকও পান:
@@ -122,9 +118,8 @@ John Doe
এখন আপনি জানেন যে আপনাকে এটি ঠিক করতে হবে, `age`-কে একটি স্ট্রিং হিসেবে রূপান্তর করতে `str(age)` ব্যবহার করতে হবে:
```Python hl_lines="2"
{!../../../docs_src/python_types/tutorial004.py!}
```
{* ../../docs_src/python_types/tutorial004.py hl[2] *}
## টাইপ ঘোষণা
@@ -143,9 +138,8 @@ John Doe
* `bool`
* `bytes`
```Python hl_lines="1"
{!../../../docs_src/python_types/tutorial005.py!}
```
{* ../../docs_src/python_types/tutorial005.py hl[1] *}
### টাইপ প্যারামিটার সহ জেনেরিক টাইপ
@@ -182,7 +176,7 @@ Python যত এগিয়ে যাচ্ছে, **নতুন সংস্
যেহেতু লিস্ট এমন একটি টাইপ যা অভ্যন্তরীণ টাইপগুলি ধারণ করে, আপনি তাদের স্কোয়ার ব্রাকেটের ভিতরে ব্যবহার করুন:
```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial006_py39.py!}
{!> ../../docs_src/python_types/tutorial006_py39.py!}
```
////
@@ -192,7 +186,7 @@ Python যত এগিয়ে যাচ্ছে, **নতুন সংস্
`typing` থেকে `List` (বড় হাতের `L` দিয়ে) ইমপোর্ট করুন:
``` Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial006.py!}
{!> ../../docs_src/python_types/tutorial006.py!}
```
ভেরিয়েবলটি ঘোষণা করুন, একই কোলন (`:`) সিনট্যাক্স ব্যবহার করে।
@@ -202,7 +196,7 @@ Python যত এগিয়ে যাচ্ছে, **নতুন সংস্
যেহেতু লিস্ট এমন একটি টাইপ যা অভ্যন্তরীণ টাইপগুলি ধারণ করে, আপনি তাদের স্কোয়ার ব্রাকেটের ভিতরে করুন:
```Python hl_lines="4"
{!> ../../../docs_src/python_types/tutorial006.py!}
{!> ../../docs_src/python_types/tutorial006.py!}
```
////
@@ -240,7 +234,7 @@ Python যত এগিয়ে যাচ্ছে, **নতুন সংস্
//// tab | Python 3.9+
```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial007_py39.py!}
{!> ../../docs_src/python_types/tutorial007_py39.py!}
```
////
@@ -248,7 +242,7 @@ Python যত এগিয়ে যাচ্ছে, **নতুন সংস্
//// tab | Python 3.8+
```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial007.py!}
{!> ../../docs_src/python_types/tutorial007.py!}
```
////
@@ -269,7 +263,7 @@ Python যত এগিয়ে যাচ্ছে, **নতুন সংস্
//// tab | Python 3.9+
```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial008_py39.py!}
{!> ../../docs_src/python_types/tutorial008_py39.py!}
```
////
@@ -277,7 +271,7 @@ Python যত এগিয়ে যাচ্ছে, **নতুন সংস্
//// tab | Python 3.8+
```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial008.py!}
{!> ../../docs_src/python_types/tutorial008.py!}
```
////
@@ -299,7 +293,7 @@ Python 3.10-এ একটি **নতুন সিনট্যাক্স** আ
//// tab | Python 3.10+
```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial008b_py310.py!}
{!> ../../docs_src/python_types/tutorial008b_py310.py!}
```
////
@@ -307,7 +301,7 @@ Python 3.10-এ একটি **নতুন সিনট্যাক্স** আ
//// tab | Python 3.8+
```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial008b.py!}
{!> ../../docs_src/python_types/tutorial008b.py!}
```
////
@@ -321,7 +315,7 @@ Python 3.10-এ একটি **নতুন সিনট্যাক্স** আ
Python 3.6 এবং তার উপরের সংস্করণগুলিতে (Python 3.10 অনতর্ভুক্ত) আপনি `typing` মডিউল থেকে `Optional` ইমপোর্ট করে এটি ঘোষণা এবং ব্যবহার করতে পারেন।
```Python hl_lines="1 4"
{!../../../docs_src/python_types/tutorial009.py!}
{!../../docs_src/python_types/tutorial009.py!}
```
`Optional[str]` ব্যবহার করা মানে হল শুধু `str` নয়, এটি হতে পারে `None`-ও, যা আপনার এডিটরকে সেই ত্রুটিগুলি শনাক্ত করতে সাহায্য করবে যেখানে আপনি ধরে নিচ্ছেন যে একটি মান সবসময় `str` হবে, অথচ এটি `None`-ও হতে পারেও।
@@ -333,7 +327,7 @@ Python 3.6 এবং তার উপরের সংস্করণগুলি
//// tab | Python 3.10+
```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial009_py310.py!}
{!> ../../docs_src/python_types/tutorial009_py310.py!}
```
////
@@ -341,7 +335,7 @@ Python 3.6 এবং তার উপরের সংস্করণগুলি
//// tab | Python 3.8+
```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial009.py!}
{!> ../../docs_src/python_types/tutorial009.py!}
```
////
@@ -349,7 +343,7 @@ Python 3.6 এবং তার উপরের সংস্করণগুলি
//// tab | Python 3.8+ বিকল্প
```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial009b.py!}
{!> ../../docs_src/python_types/tutorial009b.py!}
```
////
@@ -369,9 +363,8 @@ Python 3.6 এবং তার উপরের সংস্করণগুলি
একটি উদাহরণ হিসেবে, এই ফাংশনটি নিন:
```Python hl_lines="1 4"
{!../../../docs_src/python_types/tutorial009c.py!}
```
{* ../../docs_src/python_types/tutorial009c.py hl[1,4] *}
`name` প্যারামিটারটি `Optional[str]` হিসেবে সংজ্ঞায়িত হয়েছে, কিন্তু এটি **অপশনাল নয়**, আপনি প্যারামিটার ছাড়া ফাংশনটি কল করতে পারবেন না:
@@ -387,9 +380,8 @@ say_hi(name=None) # এটি কাজ করে, None বৈধ 🎉
সুখবর হল, একবার আপনি Python 3.10 ব্যবহার করা শুরু করলে, আপনাকে এগুলোর ব্যাপারে আর চিন্তা করতে হবে না, যেহুতু আপনি | ব্যবহার করেই ইউনিয়ন ঘোষণা করতে পারবেন:
```Python hl_lines="1 4"
{!../../../docs_src/python_types/tutorial009c_py310.py!}
```
{* ../../docs_src/python_types/tutorial009c_py310.py hl[1,4] *}
এবং তারপর আপনাকে নামগুলি যেমন `Optional` এবং `Union` নিয়ে আর চিন্তা করতে হবে না। 😎
@@ -451,15 +443,13 @@ Python 3.10-এ, `Union` এবং `Optional` জেনেরিকস ব্য
ধরুন আপনার কাছে `Person` নামে একটি ক্লাস আছে, যার একটি নাম আছে:
```Python hl_lines="1-3"
{!../../../docs_src/python_types/tutorial010.py!}
```
{* ../../docs_src/python_types/tutorial010.py hl[1:3] *}
তারপর আপনি একটি ভেরিয়েবলকে `Person` টাইপের হিসেবে ঘোষণা করতে পারেন:
```Python hl_lines="6"
{!../../../docs_src/python_types/tutorial010.py!}
```
{* ../../docs_src/python_types/tutorial010.py hl[6] *}
এবং তারপর, আবার, আপনি এডিটর সাপোর্ট পেয়ে যাবেন:
@@ -486,7 +476,7 @@ Python 3.10-এ, `Union` এবং `Optional` জেনেরিকস ব্য
//// tab | Python 3.10+
```Python
{!> ../../../docs_src/python_types/tutorial011_py310.py!}
{!> ../../docs_src/python_types/tutorial011_py310.py!}
```
////
@@ -494,7 +484,7 @@ Python 3.10-এ, `Union` এবং `Optional` জেনেরিকস ব্য
//// tab | Python 3.9+
```Python
{!> ../../../docs_src/python_types/tutorial011_py39.py!}
{!> ../../docs_src/python_types/tutorial011_py39.py!}
```
////
@@ -502,7 +492,7 @@ Python 3.10-এ, `Union` এবং `Optional` জেনেরিকস ব্য
//// tab | Python 3.8+
```Python
{!> ../../../docs_src/python_types/tutorial011.py!}
{!> ../../docs_src/python_types/tutorial011.py!}
```
////
@@ -532,7 +522,7 @@ Python-এ এমন একটি ফিচার আছে যা `Annotated`
Python 3.9-এ, `Annotated` স্ট্যান্ডার্ড লাইব্রেরিতে অন্তর্ভুক্ত, তাই আপনি এটি `typing` থেকে ইমপোর্ট করতে পারেন।
```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial013_py39.py!}
{!> ../../docs_src/python_types/tutorial013_py39.py!}
```
////
@@ -544,7 +534,7 @@ Python 3.9-এর নীচের সংস্করণগুলিতে, আ
এটি **FastAPI** এর সাথে ইতিমদ্ধে ইনস্টল হয়ে থাকবে।
```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial013.py!}
{!> ../../docs_src/python_types/tutorial013.py!}
```
////

View File

@@ -1,6 +1,6 @@
# Zusätzliche Responses in OpenAPI
/// warning | "Achtung"
/// warning | Achtung
Dies ist ein eher fortgeschrittenes Thema.
@@ -26,11 +26,9 @@ Jedes dieser Response-`dict`s kann einen Schlüssel `model` haben, welcher ein P
Um beispielsweise eine weitere Response mit dem Statuscode `404` und einem Pydantic-Modell `Message` zu deklarieren, können Sie schreiben:
```Python hl_lines="18 22"
{!../../../docs_src/additional_responses/tutorial001.py!}
```
{* ../../docs_src/additional_responses/tutorial001.py hl[18,22] *}
/// note | "Hinweis"
/// note | Hinweis
Beachten Sie, dass Sie die `JSONResponse` direkt zurückgeben müssen.
@@ -177,11 +175,9 @@ Sie können denselben `responses`-Parameter verwenden, um verschiedene Medientyp
Sie können beispielsweise einen zusätzlichen Medientyp `image/png` hinzufügen und damit deklarieren, dass Ihre *Pfadoperation* ein JSON-Objekt (mit dem Medientyp `application/json`) oder ein PNG-Bild zurückgeben kann:
```Python hl_lines="19-24 28"
{!../../../docs_src/additional_responses/tutorial002.py!}
```
{* ../../docs_src/additional_responses/tutorial002.py hl[19:24,28] *}
/// note | "Hinweis"
/// note | Hinweis
Beachten Sie, dass Sie das Bild direkt mit einer `FileResponse` zurückgeben müssen.
@@ -207,9 +203,7 @@ Sie können beispielsweise eine Response mit dem Statuscode `404` deklarieren, d
Und eine Response mit dem Statuscode `200`, die Ihr `response_model` verwendet, aber ein benutzerdefiniertes Beispiel (`example`) enthält:
```Python hl_lines="20-31"
{!../../../docs_src/additional_responses/tutorial003.py!}
```
{* ../../docs_src/additional_responses/tutorial003.py hl[20:31] *}
Es wird alles kombiniert und in Ihre OpenAPI eingebunden und in der API-Dokumentation angezeigt:
@@ -243,9 +237,7 @@ Mit dieser Technik können Sie einige vordefinierte Responses in Ihren *Pfadoper
Zum Beispiel:
```Python hl_lines="13-17 26"
{!../../../docs_src/additional_responses/tutorial004.py!}
```
{* ../../docs_src/additional_responses/tutorial004.py hl[13:17,26] *}
## Weitere Informationen zu OpenAPI-Responses

View File

@@ -14,59 +14,9 @@ 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:
//// tab | Python 3.10+
{* ../../docs_src/additional_status_codes/tutorial001_an_py310.py hl[4,25] *}
```Python hl_lines="4 25"
{!> ../../../docs_src/additional_status_codes/tutorial001_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="4 25"
{!> ../../../docs_src/additional_status_codes/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="4 26"
{!> ../../../docs_src/additional_status_codes/tutorial001_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="2 23"
{!> ../../../docs_src/additional_status_codes/tutorial001_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="4 25"
{!> ../../../docs_src/additional_status_codes/tutorial001.py!}
```
////
/// warning | "Achtung"
/// warning | Achtung
Wenn Sie eine `Response` direkt zurückgeben, wie im obigen Beispiel, wird sie direkt zurückgegeben.
@@ -76,7 +26,7 @@ Stellen Sie sicher, dass sie die gewünschten Daten enthält und dass die Werte
///
/// note | "Technische Details"
/// note | Technische Details
Sie können auch `from starlette.responses import JSONResponse` verwenden.

View File

@@ -18,35 +18,7 @@ Nicht die Klasse selbst (die bereits aufrufbar ist), sondern eine Instanz dieser
Dazu deklarieren wir eine Methode `__call__`:
//// tab | Python 3.9+
```Python hl_lines="12"
{!> ../../../docs_src/dependencies/tutorial011_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="11"
{!> ../../../docs_src/dependencies/tutorial011_an.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="10"
{!> ../../../docs_src/dependencies/tutorial011.py!}
```
////
{* ../../docs_src/dependencies/tutorial011_an_py39.py hl[12] *}
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.
@@ -54,35 +26,7 @@ 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:
//// tab | Python 3.9+
```Python hl_lines="9"
{!> ../../../docs_src/dependencies/tutorial011_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="8"
{!> ../../../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="7"
{!> ../../../docs_src/dependencies/tutorial011.py!}
```
////
{* ../../docs_src/dependencies/tutorial011_an_py39.py hl[9] *}
In diesem Fall wird **FastAPI** `__init__` nie berühren oder sich darum kümmern, wir werden es direkt in unserem Code verwenden.
@@ -90,35 +34,7 @@ In diesem Fall wird **FastAPI** `__init__` nie berühren oder sich darum kümmer
Wir könnten eine Instanz dieser Klasse erstellen mit:
//// tab | Python 3.9+
```Python hl_lines="18"
{!> ../../../docs_src/dependencies/tutorial011_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="17"
{!> ../../../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="16"
{!> ../../../docs_src/dependencies/tutorial011.py!}
```
////
{* ../../docs_src/dependencies/tutorial011_an_py39.py hl[18] *}
Und auf diese Weise können wir unsere Abhängigkeit „parametrisieren“, die jetzt `"bar"` enthält, als das Attribut `checker.fixed_content`.
@@ -134,37 +50,9 @@ 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`:
//// tab | Python 3.9+
{* ../../docs_src/dependencies/tutorial011_an_py39.py hl[22] *}
```Python hl_lines="22"
{!> ../../../docs_src/dependencies/tutorial011_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="21"
{!> ../../../docs_src/dependencies/tutorial011_an.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="20"
{!> ../../../docs_src/dependencies/tutorial011.py!}
```
////
/// tip | "Tipp"
/// tip | Tipp
Das alles mag gekünstelt wirken. Und es ist möglicherweise noch nicht ganz klar, welchen Nutzen das hat.

View File

@@ -32,15 +32,11 @@ Betrachten wir als einfaches Beispiel eine Dateistruktur ähnlich der in [Größ
Die Datei `main.py` hätte als Inhalt:
```Python
{!../../../docs_src/async_tests/main.py!}
```
{* ../../docs_src/async_tests/main.py *}
Die Datei `test_main.py` hätte die Tests für `main.py`, das könnte jetzt so aussehen:
```Python
{!../../../docs_src/async_tests/test_main.py!}
```
{* ../../docs_src/async_tests/test_main.py *}
## Es ausführen
@@ -60,11 +56,9 @@ $ pytest
Der Marker `@pytest.mark.anyio` teilt pytest mit, dass diese Testfunktion asynchron aufgerufen werden soll:
```Python hl_lines="7"
{!../../../docs_src/async_tests/test_main.py!}
```
{* ../../docs_src/async_tests/test_main.py hl[7] *}
/// tip | "Tipp"
/// tip | Tipp
Beachten Sie, dass die Testfunktion jetzt `async def` ist und nicht nur `def` wie zuvor, wenn Sie den `TestClient` verwenden.
@@ -72,9 +66,7 @@ Beachten Sie, dass die Testfunktion jetzt `async def` ist und nicht nur `def` wi
Dann können wir einen `AsyncClient` mit der App erstellen und mit `await` asynchrone Requests an ihn senden.
```Python hl_lines="9-10"
{!../../../docs_src/async_tests/test_main.py!}
```
{* ../../docs_src/async_tests/test_main.py hl[9:12] *}
Das ist das Äquivalent zu:
@@ -84,13 +76,13 @@ response = client.get('/')
... 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.
///
/// 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>.
@@ -100,7 +92,7 @@ Falls Ihre Anwendung auf Lifespan-Events angewiesen ist, der `AsyncClient` löst
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.

View File

@@ -18,9 +18,7 @@ In diesem Fall würde der ursprüngliche Pfad `/app` tatsächlich unter `/api/v1
Auch wenn Ihr gesamter Code unter der Annahme geschrieben ist, dass es nur `/app` gibt.
```Python hl_lines="6"
{!../../../docs_src/behind_a_proxy/tutorial001.py!}
```
{* ../../docs_src/behind_a_proxy/tutorial001.py hl[6] *}
Und der Proxy würde das **Pfadpräfix** on-the-fly **"entfernen**", bevor er die Anfrage an Uvicorn übermittelt, dafür sorgend, dass Ihre Anwendung davon überzeugt ist, dass sie unter `/app` bereitgestellt wird, sodass Sie nicht Ihren gesamten Code dahingehend aktualisieren müssen, das Präfix `/api/v1` zu verwenden.
@@ -43,7 +41,7 @@ browser --> proxy
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.
@@ -84,7 +82,7 @@ $ uvicorn main:app --root-path /api/v1
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.
@@ -98,9 +96,7 @@ Sie können den aktuellen `root_path` abrufen, der von Ihrer Anwendung für jede
Hier fügen wir ihn, nur zu Demonstrationszwecken, in die Nachricht ein.
```Python hl_lines="8"
{!../../../docs_src/behind_a_proxy/tutorial001.py!}
```
{* ../../docs_src/behind_a_proxy/tutorial001.py hl[8] *}
Wenn Sie Uvicorn dann starten mit:
@@ -127,9 +123,7 @@ wäre die Response etwa:
Falls Sie keine Möglichkeit haben, eine Kommandozeilenoption wie `--root-path` oder ähnlich zu übergeben, können Sie als Alternative beim Erstellen Ihrer FastAPI-Anwendung den Parameter `root_path` setzen:
```Python hl_lines="3"
{!../../../docs_src/behind_a_proxy/tutorial002.py!}
```
{* ../../docs_src/behind_a_proxy/tutorial002.py hl[3] *}
Die Übergabe des `root_path` an `FastAPI` wäre das Äquivalent zur Übergabe der `--root-path`-Kommandozeilenoption an Uvicorn oder Hypercorn.
@@ -178,7 +172,7 @@ Dann erstellen Sie eine Datei `traefik.toml` mit:
Dadurch wird Traefik angewiesen, Port 9999 abzuhören und eine andere Datei `routes.toml` zu verwenden.
/// tip | "Tipp"
/// tip | Tipp
Wir verwenden Port 9999 anstelle des Standard-HTTP-Ports 80, damit Sie ihn nicht mit Administratorrechten (`sudo`) ausführen müssen.
@@ -248,7 +242,7 @@ 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.
@@ -295,7 +289,7 @@ Dies liegt daran, dass FastAPI diesen `root_path` verwendet, um den Default-`ser
## Zusätzliche Server
/// warning | "Achtung"
/// warning | Achtung
Dies ist ein fortgeschrittener Anwendungsfall. Überspringen Sie das gerne.
@@ -309,9 +303,7 @@ Wenn Sie eine benutzerdefinierte Liste von Servern (`servers`) übergeben und es
Zum Beispiel:
```Python hl_lines="4-7"
{!../../../docs_src/behind_a_proxy/tutorial003.py!}
```
{* ../../docs_src/behind_a_proxy/tutorial003.py hl[4:7] *}
Erzeugt ein OpenAPI-Schema, wie:
@@ -338,7 +330,7 @@ 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.
@@ -348,7 +340,7 @@ In der Dokumentationsoberfläche unter <a href="http://127.0.0.1:9999/api/v1/doc
<img src="/img/tutorial/behind-a-proxy/image03.png">
/// tip | "Tipp"
/// tip | Tipp
Die Dokumentationsoberfläche interagiert mit dem von Ihnen ausgewählten Server.
@@ -358,9 +350,7 @@ Die Dokumentationsoberfläche interagiert mit dem von Ihnen ausgewählten Server
Wenn Sie nicht möchten, dass **FastAPI** einen automatischen Server inkludiert, welcher `root_path` verwendet, können Sie den Parameter `root_path_in_servers=False` verwenden:
```Python hl_lines="9"
{!../../../docs_src/behind_a_proxy/tutorial004.py!}
```
{* ../../docs_src/behind_a_proxy/tutorial004.py hl[9] *}
Dann wird er nicht in das OpenAPI-Schema aufgenommen.

View File

@@ -12,7 +12,7 @@ Der Inhalt, den Sie von Ihrer *Pfadoperation-Funktion* zurückgeben, wird in die
Und wenn diese `Response` einen JSON-Medientyp (`application/json`) hat, wie es bei `JSONResponse` und `UJSONResponse` der Fall ist, werden die von Ihnen zurückgegebenen Daten automatisch mit jedem Pydantic `response_model` konvertiert (und gefiltert), das Sie im *Pfadoperation-Dekorator* deklariert haben.
/// note | "Hinweis"
/// 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.
@@ -30,9 +30,7 @@ Das liegt daran, dass FastAPI standardmäßig jedes enthaltene Element überprü
Wenn Sie jedoch sicher sind, dass der von Ihnen zurückgegebene Inhalt **mit JSON serialisierbar** ist, können Sie ihn direkt an die Response-Klasse übergeben und die zusätzliche Arbeit vermeiden, die FastAPI hätte, indem es Ihren zurückgegebenen Inhalt durch den `jsonable_encoder` leitet, bevor es ihn an die Response-Klasse übergibt.
```Python hl_lines="2 7"
{!../../../docs_src/custom_response/tutorial001b.py!}
```
{* ../../docs_src/custom_response/tutorial001b.py hl[2,7] *}
/// info
@@ -44,7 +42,7 @@ Und er wird als solcher in OpenAPI dokumentiert.
///
/// tip | "Tipp"
/// tip | Tipp
Die `ORJSONResponse` ist derzeit nur in FastAPI verfügbar, nicht in Starlette.
@@ -57,9 +55,7 @@ Um eine Response mit HTML direkt von **FastAPI** zurückzugeben, verwenden Sie `
* Importieren Sie `HTMLResponse`.
* Übergeben Sie `HTMLResponse` als den Parameter `response_class` Ihres *Pfadoperation-Dekorators*.
```Python hl_lines="2 7"
{!../../../docs_src/custom_response/tutorial002.py!}
```
{* ../../docs_src/custom_response/tutorial002.py hl[2,7] *}
/// info
@@ -77,11 +73,9 @@ Wie in [Eine Response direkt zurückgeben](response-directly.md){.internal-link
Das gleiche Beispiel von oben, das eine `HTMLResponse` zurückgibt, könnte so aussehen:
```Python hl_lines="2 7 19"
{!../../../docs_src/custom_response/tutorial003.py!}
```
{* ../../docs_src/custom_response/tutorial003.py hl[2,7,19] *}
/// 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.
@@ -103,9 +97,7 @@ Die `response_class` wird dann nur zur Dokumentation der OpenAPI-Pfadoperation*
Es könnte zum Beispiel so etwas sein:
```Python hl_lines="7 21 23"
{!../../../docs_src/custom_response/tutorial004.py!}
```
{* ../../docs_src/custom_response/tutorial004.py hl[7,21,23] *}
In diesem Beispiel generiert die Funktion `generate_html_response()` bereits eine `Response` und gibt sie zurück, anstatt das HTML in einem `str` zurückzugeben.
@@ -121,7 +113,7 @@ Hier sind einige der verfügbaren Responses.
Bedenken Sie, dass Sie `Response` verwenden können, um alles andere zurückzugeben, oder sogar eine benutzerdefinierte Unterklasse zu erstellen.
/// note | "Technische Details"
/// note | Technische Details
Sie können auch `from starlette.responses import HTMLResponse` verwenden.
@@ -144,9 +136,7 @@ Sie akzeptiert die folgenden Parameter:
FastAPI (eigentlich Starlette) fügt automatisch einen Content-Length-Header ein. Außerdem wird es einen Content-Type-Header einfügen, der auf dem media_type basiert, und für Texttypen einen Zeichensatz (charset) anfügen.
```Python hl_lines="1 18"
{!../../../docs_src/response_directly/tutorial002.py!}
```
{* ../../docs_src/response_directly/tutorial002.py hl[1,18] *}
### `HTMLResponse`
@@ -156,9 +146,7 @@ Nimmt Text oder Bytes entgegen und gibt eine HTML-Response zurück, wie Sie oben
Nimmt Text oder Bytes entgegen und gibt eine Plain-Text-Response zurück.
```Python hl_lines="2 7 9"
{!../../../docs_src/custom_response/tutorial005.py!}
```
{* ../../docs_src/custom_response/tutorial005.py hl[2,7,9] *}
### `JSONResponse`
@@ -174,17 +162,15 @@ 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>.
/// warning | "Achtung"
/// warning | Achtung
`ujson` ist bei der Behandlung einiger Sonderfälle weniger sorgfältig als Pythons eingebaute Implementierung.
///
```Python hl_lines="2 7"
{!../../../docs_src/custom_response/tutorial001.py!}
```
{* ../../docs_src/custom_response/tutorial001.py hl[2,7] *}
/// tip | "Tipp"
/// tip | Tipp
Möglicherweise ist `ORJSONResponse` eine schnellere Alternative.
@@ -196,18 +182,14 @@ Gibt eine HTTP-Weiterleitung (HTTP-Redirect) zurück. Verwendet standardmäßig
Sie können eine `RedirectResponse` direkt zurückgeben:
```Python hl_lines="2 9"
{!../../../docs_src/custom_response/tutorial006.py!}
```
{* ../../docs_src/custom_response/tutorial006.py hl[2,9] *}
---
Oder Sie können sie im Parameter `response_class` verwenden:
```Python hl_lines="2 7 9"
{!../../../docs_src/custom_response/tutorial006b.py!}
```
{* ../../docs_src/custom_response/tutorial006b.py hl[2,7,9] *}
Wenn Sie das tun, können Sie die URL direkt von Ihrer *Pfadoperation*-Funktion zurückgeben.
@@ -217,17 +199,13 @@ In diesem Fall ist der verwendete `status_code` der Standardcode für die `Redir
Sie können den Parameter `status_code` auch in Kombination mit dem Parameter `response_class` verwenden:
```Python hl_lines="2 7 9"
{!../../../docs_src/custom_response/tutorial006c.py!}
```
{* ../../docs_src/custom_response/tutorial006c.py hl[2,7,9] *}
### `StreamingResponse`
Nimmt einen asynchronen Generator oder einen normalen Generator/Iterator und streamt den Responsebody.
```Python hl_lines="2 14"
{!../../../docs_src/custom_response/tutorial007.py!}
```
{* ../../docs_src/custom_response/tutorial007.py hl[2,14] *}
#### Verwendung von `StreamingResponse` mit dateiähnlichen Objekten
@@ -238,7 +216,7 @@ Auf diese Weise müssen Sie nicht alles zuerst in den Arbeitsspeicher lesen und
Das umfasst viele Bibliotheken zur Interaktion mit Cloud-Speicher, Videoverarbeitung und anderen.
```{ .python .annotate hl_lines="2 10-12 14" }
{!../../../docs_src/custom_response/tutorial008.py!}
{!../../docs_src/custom_response/tutorial008.py!}
```
1. Das ist die Generatorfunktion. Es handelt sich um eine „Generatorfunktion“, da sie `yield`-Anweisungen enthält.
@@ -249,7 +227,7 @@ Das umfasst viele Bibliotheken zur Interaktion mit Cloud-Speicher, Videoverarbei
Auf diese Weise können wir das Ganze in einen `with`-Block einfügen und so sicherstellen, dass das dateiartige Objekt nach Abschluss geschlossen wird.
/// tip | "Tipp"
/// 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.
@@ -268,15 +246,11 @@ Nimmt zur Instanziierung einen anderen Satz von Argumenten entgegen als die ande
Datei-Responses enthalten die entsprechenden `Content-Length`-, `Last-Modified`- und `ETag`-Header.
```Python hl_lines="2 10"
{!../../../docs_src/custom_response/tutorial009.py!}
```
{* ../../docs_src/custom_response/tutorial009.py hl[2,10] *}
Sie können auch den Parameter `response_class` verwenden:
```Python hl_lines="2 8 10"
{!../../../docs_src/custom_response/tutorial009b.py!}
```
{* ../../docs_src/custom_response/tutorial009b.py hl[2,8,10] *}
In diesem Fall können Sie den Dateipfad direkt von Ihrer *Pfadoperation*-Funktion zurückgeben.
@@ -290,9 +264,7 @@ Sie möchten etwa, dass Ihre Response eingerücktes und formatiertes JSON zurüc
Sie könnten eine `CustomORJSONResponse` erstellen. Das Wichtigste, was Sie tun müssen, ist, eine `Response.render(content)`-Methode zu erstellen, die den Inhalt als `bytes` zurückgibt:
```Python hl_lines="9-14 17"
{!../../../docs_src/custom_response/tutorial009c.py!}
```
{* ../../docs_src/custom_response/tutorial009c.py hl[9:14,17] *}
Statt:
@@ -318,11 +290,9 @@ Der Parameter, der das definiert, ist `default_response_class`.
Im folgenden Beispiel verwendet **FastAPI** standardmäßig `ORJSONResponse` in allen *Pfadoperationen*, anstelle von `JSONResponse`.
```Python hl_lines="2 4"
{!../../../docs_src/custom_response/tutorial010.py!}
```
{* ../../docs_src/custom_response/tutorial010.py hl[2,4] *}
/// tip | "Tipp"
/// tip | Tipp
Sie können dennoch weiterhin `response_class` in *Pfadoperationen* überschreiben, wie bisher.

View File

@@ -4,9 +4,7 @@ FastAPI basiert auf **Pydantic** und ich habe Ihnen gezeigt, wie Sie Pydantic-Mo
Aber FastAPI unterstützt auf die gleiche Weise auch die Verwendung von <a href="https://docs.python.org/3/library/dataclasses.html" class="external-link" target="_blank">`dataclasses`</a>:
```Python hl_lines="1 7-12 19-20"
{!../../../docs_src/dataclasses/tutorial001.py!}
```
{* ../../docs_src/dataclasses/tutorial001.py hl[1,7:12,19:20] *}
Das ist dank **Pydantic** ebenfalls möglich, da es <a href="https://pydantic-docs.helpmanual.io/usage/dataclasses/#use-of-stdlib-dataclasses-with-basemodel" class="external-link" target="_blank">`dataclasses` intern unterstützt</a>.
@@ -34,9 +32,7 @@ Wenn Sie jedoch eine Menge Datenklassen herumliegen haben, ist dies ein guter Tr
Sie können `dataclasses` auch im Parameter `response_model` verwenden:
```Python hl_lines="1 7-13 19"
{!../../../docs_src/dataclasses/tutorial002.py!}
```
{* ../../docs_src/dataclasses/tutorial002.py hl[1,7:13,19] *}
Die Datenklasse wird automatisch in eine Pydantic-Datenklasse konvertiert.
@@ -52,9 +48,7 @@ In einigen Fällen müssen Sie möglicherweise immer noch Pydantics Version von
In diesem Fall können Sie einfach die Standard-`dataclasses` durch `pydantic.dataclasses` ersetzen, was einen direkten Ersatz darstellt:
```{ .python .annotate hl_lines="1 5 8-11 14-17 23-25 28" }
{!../../../docs_src/dataclasses/tutorial003.py!}
```
{* ../../docs_src/dataclasses/tutorial003.py hl[1,5,8:11,14:17,23:25,28] *}
1. Wir importieren `field` weiterhin von Standard-`dataclasses`.

View File

@@ -30,15 +30,13 @@ Beginnen wir mit einem Beispiel und sehen es uns dann im Detail an.
Wir erstellen eine asynchrone Funktion `lifespan()` mit `yield` wie folgt:
```Python hl_lines="16 19"
{!../../../docs_src/events/tutorial003.py!}
```
{* ../../docs_src/events/tutorial003.py hl[16,19] *}
Hier simulieren wir das langsame *Hochfahren*, das Laden des Modells, indem wir die (Fake-)Modellfunktion vor dem `yield` in das Dictionary mit Modellen für maschinelles Lernen einfügen. Dieser Code wird ausgeführt, **bevor** die Anwendung **beginnt, Requests entgegenzunehmen**, während des *Hochfahrens*.
Und dann, direkt nach dem `yield`, entladen wir das Modell. Dieser Code wird unmittelbar vor dem *Herunterfahren* ausgeführt, **nachdem** die Anwendung **die Bearbeitung von Requests abgeschlossen hat**. Dadurch könnten beispielsweise Ressourcen wie Arbeitsspeicher oder eine GPU freigegeben werden.
/// tip | "Tipp"
/// tip | Tipp
Das *Herunterfahren* würde erfolgen, wenn Sie die Anwendung **stoppen**.
@@ -50,9 +48,7 @@ Möglicherweise müssen Sie eine neue Version starten, oder Sie haben es einfach
Das Erste, was auffällt, ist, dass wir eine asynchrone Funktion mit `yield` definieren. Das ist sehr ähnlich zu Abhängigkeiten mit `yield`.
```Python hl_lines="14-19"
{!../../../docs_src/events/tutorial003.py!}
```
{* ../../docs_src/events/tutorial003.py hl[14:19] *}
Der erste Teil der Funktion, vor dem `yield`, wird ausgeführt **bevor** die Anwendung startet.
@@ -64,9 +60,7 @@ Wie Sie sehen, ist die Funktion mit einem `@asynccontextmanager` versehen.
Dadurch wird die Funktion in einen sogenannten „**asynchronen Kontextmanager**“ umgewandelt.
```Python hl_lines="1 13"
{!../../../docs_src/events/tutorial003.py!}
```
{* ../../docs_src/events/tutorial003.py hl[1,13] *}
Ein **Kontextmanager** in Python ist etwas, das Sie in einer `with`-Anweisung verwenden können, zum Beispiel kann `open()` als Kontextmanager verwendet werden:
@@ -88,13 +82,11 @@ In unserem obigen Codebeispiel verwenden wir ihn nicht direkt, sondern übergebe
Der Parameter `lifespan` der `FastAPI`-App benötigt einen **asynchronen Kontextmanager**, wir können ihm also unseren neuen asynchronen Kontextmanager `lifespan` übergeben.
```Python hl_lines="22"
{!../../../docs_src/events/tutorial003.py!}
```
{* ../../docs_src/events/tutorial003.py hl[22] *}
## 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.
@@ -112,9 +104,7 @@ Diese Funktionen können mit `async def` oder normalem `def` deklariert werden.
Um eine Funktion hinzuzufügen, die vor dem Start der Anwendung ausgeführt werden soll, deklarieren Sie diese mit dem Event `startup`:
```Python hl_lines="8"
{!../../../docs_src/events/tutorial001.py!}
```
{* ../../docs_src/events/tutorial001.py hl[8] *}
In diesem Fall initialisiert die Eventhandler-Funktion `startup` die „Datenbank“ der Items (nur ein `dict`) mit einigen Werten.
@@ -126,9 +116,7 @@ Und Ihre Anwendung empfängt erst dann Anfragen, wenn alle `startup`-Eventhandle
Um eine Funktion hinzuzufügen, die beim Herunterfahren der Anwendung ausgeführt werden soll, deklarieren Sie sie mit dem Event `shutdown`:
```Python hl_lines="6"
{!../../../docs_src/events/tutorial002.py!}
```
{* ../../docs_src/events/tutorial002.py hl[6] *}
Hier schreibt die `shutdown`-Eventhandler-Funktion eine Textzeile `"Application shutdown"` in eine Datei `log.txt`.
@@ -138,7 +126,7 @@ In der Funktion `open()` bedeutet `mode="a"` „append“ („anhängen“), sod
///
/// tip | "Tipp"
/// tip | Tipp
Beachten Sie, dass wir in diesem Fall eine Standard-Python-Funktion `open()` verwenden, die mit einer Datei interagiert.

View File

@@ -28,21 +28,7 @@ Es gibt auch mehrere andere Unternehmen, welche ähnliche Dienste anbieten und d
Beginnen wir mit einer einfachen FastAPI-Anwendung:
//// tab | Python 3.9+
```Python hl_lines="7-9 12-13 16-17 21"
{!> ../../../docs_src/generate_clients/tutorial001_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="9-11 14-15 18 19 23"
{!> ../../../docs_src/generate_clients/tutorial001.py!}
```
////
{* ../../docs_src/generate_clients/tutorial001_py39.py hl[7:9,12:13,16:17,21] *}
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.
@@ -127,7 +113,7 @@ Sie erhalten außerdem automatische Vervollständigung für die zu sendende Payl
<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.
@@ -147,21 +133,7 @@ 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:
//// tab | Python 3.9+
```Python hl_lines="21 26 34"
{!> ../../../docs_src/generate_clients/tutorial002_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="23 28 36"
{!> ../../../docs_src/generate_clients/tutorial002.py!}
```
////
{* ../../docs_src/generate_clients/tutorial002_py39.py hl[21,26,34] *}
### Einen TypeScript-Client mit Tags generieren
@@ -208,21 +180,7 @@ 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:
//// tab | Python 3.9+
```Python hl_lines="6-7 10"
{!> ../../../docs_src/generate_clients/tutorial003_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="8-9 12"
{!> ../../../docs_src/generate_clients/tutorial003.py!}
```
////
{* ../../docs_src/generate_clients/tutorial003_py39.py hl[6:7,10] *}
### Einen TypeScript-Client mit benutzerdefinierten Operation-IDs generieren
@@ -244,18 +202,12 @@ 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**:
//// tab | Python
```Python
{!> ../../../docs_src/generate_clients/tutorial004.py!}
```
////
{* ../../docs_src/generate_clients/tutorial004.py *}
//// tab | Node.js
```Javascript
{!> ../../../docs_src/generate_clients/tutorial004.js!}
{!> ../../docs_src/generate_clients/tutorial004.js!}
```
////

View File

@@ -6,7 +6,7 @@ Das Haupt-[Tutorial Benutzerhandbuch](../tutorial/index.md){.internal-link t
In den nächsten Abschnitten sehen Sie weitere Optionen, Konfigurationen und zusätzliche Funktionen.
/// tip | "Tipp"
/// tip | Tipp
Die nächsten Abschnitte sind **nicht unbedingt „fortgeschritten“**.

View File

@@ -43,7 +43,7 @@ app.add_middleware(UnicornMiddleware, some_config="rainbow")
**FastAPI** enthält mehrere Middlewares für gängige Anwendungsfälle. Wir werden als Nächstes sehen, wie man sie verwendet.
/// note | "Technische Details"
/// note | Technische Details
Für die nächsten Beispiele könnten Sie auch `from starlette.middleware.something import SomethingMiddleware` verwenden.
@@ -57,17 +57,13 @@ Erzwingt, dass alle eingehenden Requests entweder `https` oder `wss` sein müsse
Alle eingehenden Requests an `http` oder `ws` werden stattdessen an das sichere Schema umgeleitet.
```Python hl_lines="2 6"
{!../../../docs_src/advanced_middleware/tutorial001.py!}
```
{* ../../docs_src/advanced_middleware/tutorial001.py hl[2,6] *}
## `TrustedHostMiddleware`
Erzwingt, dass alle eingehenden Requests einen korrekt gesetzten `Host`-Header haben, um sich vor HTTP-Host-Header-Angriffen zu schützen.
```Python hl_lines="2 6-8"
{!../../../docs_src/advanced_middleware/tutorial002.py!}
```
{* ../../docs_src/advanced_middleware/tutorial002.py hl[2,6:8] *}
Die folgenden Argumente werden unterstützt:
@@ -81,9 +77,7 @@ Verarbeitet GZip-Responses für alle Requests, die `"gzip"` im `Accept-Encoding`
Diese Middleware verarbeitet sowohl Standard- als auch Streaming-Responses.
```Python hl_lines="2 6"
{!../../../docs_src/advanced_middleware/tutorial003.py!}
```
{* ../../docs_src/advanced_middleware/tutorial003.py hl[2,6] *}
Die folgenden Argumente werden unterstützt:

View File

@@ -31,11 +31,9 @@ Sie verfügt über eine *Pfadoperation*, die einen `Invoice`-Body empfängt, und
Dieser Teil ist ziemlich normal, der größte Teil des Codes ist Ihnen wahrscheinlich bereits bekannt:
```Python hl_lines="9-13 36-53"
{!../../../docs_src/openapi_callbacks/tutorial001.py!}
```
{* ../../docs_src/openapi_callbacks/tutorial001.py hl[9:13,36:53] *}
/// 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.
@@ -64,7 +62,7 @@ Diese Dokumentation wird in der Swagger-Oberfläche unter `/docs` in Ihrer API a
In diesem Beispiel wird nicht der Callback selbst implementiert (das könnte nur eine Codezeile sein), sondern nur der Dokumentationsteil.
/// tip | "Tipp"
/// tip | Tipp
Der eigentliche Callback ist nur ein HTTP-Request.
@@ -80,7 +78,7 @@ Sie wissen jedoch bereits, wie Sie mit **FastAPI** ganz einfach eine automatisch
Daher werden wir dasselbe Wissen nutzen, um zu dokumentieren, wie die *externe API* aussehen sollte ... indem wir die *Pfadoperation(en)* erstellen, welche die externe API implementieren soll (die, welche Ihre API aufruft).
/// tip | "Tipp"
/// 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*.
@@ -92,9 +90,7 @@ Wenn Sie diese Sichtweise (des *externen Entwicklers*) vorübergehend übernehme
Erstellen Sie zunächst einen neuen `APIRouter`, der einen oder mehrere Callbacks enthält.
```Python hl_lines="3 25"
{!../../../docs_src/openapi_callbacks/tutorial001.py!}
```
{* ../../docs_src/openapi_callbacks/tutorial001.py hl[3,25] *}
### Die Callback-*Pfadoperation* erstellen
@@ -105,9 +101,7 @@ Sie sollte wie eine normale FastAPI-*Pfadoperation* aussehen:
* Sie sollte wahrscheinlich eine Deklaration des Bodys enthalten, die sie erhalten soll, z. B. `body: InvoiceEvent`.
* Und sie könnte auch eine Deklaration der Response enthalten, die zurückgegeben werden soll, z. B. `response_model=InvoiceEventReceived`.
```Python hl_lines="16-18 21-22 28-32"
{!../../../docs_src/openapi_callbacks/tutorial001.py!}
```
{* ../../docs_src/openapi_callbacks/tutorial001.py hl[16:18,21:22,28:32] *}
Es gibt zwei Hauptunterschiede zu einer normalen *Pfadoperation*:
@@ -163,7 +157,7 @@ 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`).
@@ -175,11 +169,9 @@ An diesem Punkt haben Sie die benötigte(n) *Callback-Pfadoperation(en)* (diejen
Verwenden Sie nun den Parameter `callbacks` im *Pfadoperation-Dekorator Ihrer API*, um das Attribut `.routes` (das ist eigentlich nur eine `list`e von Routen/*Pfadoperationen*) dieses Callback-Routers zu übergeben:
```Python hl_lines="35"
{!../../../docs_src/openapi_callbacks/tutorial001.py!}
```
{* ../../docs_src/openapi_callbacks/tutorial001.py hl[35] *}
/// 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`.

View File

@@ -32,9 +32,7 @@ Webhooks sind in OpenAPI 3.1.0 und höher verfügbar und werden von FastAPI `0.9
Wenn Sie eine **FastAPI**-Anwendung erstellen, gibt es ein `webhooks`-Attribut, mit dem Sie *Webhooks* definieren können, genauso wie Sie *Pfadoperationen* definieren würden, zum Beispiel mit `@app.webhooks.post()`.
```Python hl_lines="9-13 36-53"
{!../../../docs_src/openapi_webhooks/tutorial001.py!}
```
{* ../../docs_src/openapi_webhooks/tutorial001.py hl[9:13,36:53] *}
Die von Ihnen definierten Webhooks landen im **OpenAPI**-Schema und der automatischen **Dokumentations-Oberfläche**.

View File

@@ -2,7 +2,7 @@
## OpenAPI operationId
/// warning | "Achtung"
/// warning | Achtung
Wenn Sie kein „Experte“ für OpenAPI sind, brauchen Sie dies wahrscheinlich nicht.
@@ -12,9 +12,7 @@ Mit dem Parameter `operation_id` können Sie die OpenAPI `operationId` festlegen
Sie müssten sicherstellen, dass sie für jede Operation eindeutig ist.
```Python hl_lines="6"
{!../../../docs_src/path_operation_advanced_configuration/tutorial001.py!}
```
{* ../../docs_src/path_operation_advanced_configuration/tutorial001.py hl[6] *}
### Verwendung des Namens der *Pfadoperation-Funktion* als operationId
@@ -22,17 +20,15 @@ Wenn Sie die Funktionsnamen Ihrer API als `operationId`s verwenden möchten, kö
Sie sollten dies tun, nachdem Sie alle Ihre *Pfadoperationen* hinzugefügt haben.
```Python hl_lines="2 12-21 24"
{!../../../docs_src/path_operation_advanced_configuration/tutorial002.py!}
```
{* ../../docs_src/path_operation_advanced_configuration/tutorial002.py hl[2,12:21,24] *}
/// tip | "Tipp"
/// tip | Tipp
Wenn Sie `app.openapi()` manuell aufrufen, sollten Sie vorher die `operationId`s aktualisiert haben.
///
/// warning | "Achtung"
/// warning | Achtung
Wenn Sie dies tun, müssen Sie sicherstellen, dass jede Ihrer *Pfadoperation-Funktionen* einen eindeutigen Namen hat.
@@ -44,9 +40,7 @@ Auch wenn diese sich in unterschiedlichen Modulen (Python-Dateien) befinden.
Um eine *Pfadoperation* aus dem generierten OpenAPI-Schema (und damit aus den automatischen Dokumentationssystemen) auszuschließen, verwenden Sie den Parameter `include_in_schema` und setzen Sie ihn auf `False`:
```Python hl_lines="6"
{!../../../docs_src/path_operation_advanced_configuration/tutorial003.py!}
```
{* ../../docs_src/path_operation_advanced_configuration/tutorial003.py hl[6] *}
## Fortgeschrittene Beschreibung mittels Docstring
@@ -56,9 +50,7 @@ Das Hinzufügen eines `\f` (ein maskiertes „Form Feed“-Zeichen) führt dazu,
Sie wird nicht in der Dokumentation angezeigt, aber andere Tools (z. B. Sphinx) können den Rest verwenden.
```Python hl_lines="19-29"
{!../../../docs_src/path_operation_advanced_configuration/tutorial004.py!}
```
{* ../../docs_src/path_operation_advanced_configuration/tutorial004.py hl[19:29] *}
## Zusätzliche Responses
@@ -74,7 +66,7 @@ Es gibt hier in der Dokumentation ein ganzes Kapitel darüber, Sie können es un
Wenn Sie in Ihrer Anwendung eine *Pfadoperation* deklarieren, generiert **FastAPI** automatisch die relevanten Metadaten dieser *Pfadoperation*, die in das OpenAPI-Schema aufgenommen werden sollen.
/// note | "Technische Details"
/// 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.
@@ -86,7 +78,7 @@ Es enthält `tags`, `parameters`, `requestBody`, `responses`, usw.
Dieses *Pfadoperation*-spezifische OpenAPI-Schema wird normalerweise automatisch von **FastAPI** generiert, Sie können es aber auch erweitern.
/// tip | "Tipp"
/// tip | Tipp
Dies ist ein Low-Level Erweiterungspunkt.
@@ -100,9 +92,7 @@ Sie können das OpenAPI-Schema für eine *Pfadoperation* erweitern, indem Sie de
Dieses `openapi_extra` kann beispielsweise hilfreich sein, um <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#specificationExtensions" class="external-link" target="_blank">OpenAPI-Erweiterungen</a> zu deklarieren:
```Python hl_lines="6"
{!../../../docs_src/path_operation_advanced_configuration/tutorial005.py!}
```
{* ../../docs_src/path_operation_advanced_configuration/tutorial005.py hl[6] *}
Wenn Sie die automatische API-Dokumentation öffnen, wird Ihre Erweiterung am Ende der spezifischen *Pfadoperation* angezeigt.
@@ -149,9 +139,7 @@ Sie könnten sich beispielsweise dafür entscheiden, den Request mit Ihrem eigen
Das könnte man mit `openapi_extra` machen:
```Python hl_lines="20-37 39-40"
{!../../../docs_src/path_operation_advanced_configuration/tutorial006.py!}
```
{* ../../docs_src/path_operation_advanced_configuration/tutorial006.py hl[20:37,39:40] *}
In diesem Beispiel haben wir kein Pydantic-Modell deklariert. Tatsächlich wird der Requestbody nicht einmal als JSON <abbr title="von einem einfachen Format, wie Bytes, in Python-Objekte konvertieren">geparst</abbr>, sondern direkt als `bytes` gelesen und die Funktion `magic_data_reader ()` wäre dafür verantwortlich, ihn in irgendeiner Weise zu parsen.
@@ -167,17 +155,13 @@ In der folgenden Anwendung verwenden wir beispielsweise weder die integrierte Fu
//// tab | Pydantic v2
```Python hl_lines="17-22 24"
{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007.py!}
```
{* ../../docs_src/path_operation_advanced_configuration/tutorial007.py hl[17:22,24] *}
////
//// tab | Pydantic v1
```Python hl_lines="17-22 24"
{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py!}
```
{* ../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py hl[17:22,24] *}
////
@@ -195,17 +179,13 @@ Und dann parsen wir in unserem Code diesen YAML-Inhalt direkt und verwenden dann
//// tab | Pydantic v2
```Python hl_lines="26-33"
{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007.py!}
```
{* ../../docs_src/path_operation_advanced_configuration/tutorial007.py hl[26:33] *}
////
//// tab | Pydantic v1
```Python hl_lines="26-33"
{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py!}
```
{* ../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py hl[26:33] *}
////
@@ -215,7 +195,7 @@ In Pydantic Version 1 war die Methode zum Parsen und Validieren eines Objekts `I
///
/// tip | "Tipp"
/// tip | Tipp
Hier verwenden wir dasselbe Pydantic-Modell wieder.

View File

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

View File

@@ -6,9 +6,7 @@ Sie können einen Parameter vom Typ `Response` in Ihrer *Pfadoperation-Funktion*
Und dann können Sie Cookies in diesem *vorübergehenden* Response-Objekt setzen.
```Python hl_lines="1 8-9"
{!../../../docs_src/response_cookies/tutorial002.py!}
```
{* ../../docs_src/response_cookies/tutorial002.py hl[1,8:9] *}
Anschließend können Sie wie gewohnt jedes gewünschte Objekt zurückgeben (ein `dict`, ein Datenbankmodell, usw.).
@@ -26,11 +24,9 @@ Dazu können Sie eine Response erstellen, wie unter [Eine Response direkt zurüc
Setzen Sie dann Cookies darin und geben Sie sie dann zurück:
```Python hl_lines="10-12"
{!../../../docs_src/response_cookies/tutorial001.py!}
```
{* ../../docs_src/response_cookies/tutorial001.py hl[10:12] *}
/// 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.
@@ -42,7 +38,7 @@ Und auch, dass Sie keine Daten senden, die durch ein `response_model` hätten ge
### Mehr Informationen
/// note | "Technische Details"
/// note | Technische Details
Sie können auch `from starlette.responses import Response` oder `from starlette.responses import JSONResponse` verwenden.

View File

@@ -14,7 +14,7 @@ Das kann beispielsweise nützlich sein, um benutzerdefinierte Header oder Cookie
Tatsächlich können Sie jede `Response` oder jede Unterklasse davon zurückgeben.
/// tip | "Tipp"
/// tip | Tipp
`JSONResponse` selbst ist eine Unterklasse von `Response`.
@@ -34,11 +34,9 @@ Sie können beispielsweise kein Pydantic-Modell in eine `JSONResponse` einfügen
In diesen Fällen können Sie den `jsonable_encoder` verwenden, um Ihre Daten zu konvertieren, bevor Sie sie an eine Response übergeben:
```Python hl_lines="6-7 21-22"
{!../../../docs_src/response_directly/tutorial001.py!}
```
{* ../../docs_src/response_directly/tutorial001.py hl[6:7,21:22] *}
/// note | "Technische Details"
/// note | Technische Details
Sie können auch `from starlette.responses import JSONResponse` verwenden.
@@ -56,9 +54,7 @@ Nehmen wir an, Sie möchten eine <a href="https://en.wikipedia.org/wiki/XML" cla
Sie könnten Ihren XML-Inhalt als String in eine `Response` einfügen und sie zurückgeben:
```Python hl_lines="1 18"
{!../../../docs_src/response_directly/tutorial002.py!}
```
{* ../../docs_src/response_directly/tutorial002.py hl[1,18] *}
## Anmerkungen

View File

@@ -6,9 +6,7 @@ Sie können einen Parameter vom Typ `Response` in Ihrer *Pfadoperation-Funktion*
Und dann können Sie Header in diesem *vorübergehenden* Response-Objekt festlegen.
```Python hl_lines="1 7-8"
{!../../../docs_src/response_headers/tutorial002.py!}
```
{* ../../docs_src/response_headers/tutorial002.py hl[1,7:8] *}
Anschließend können Sie wie gewohnt jedes gewünschte Objekt zurückgeben (ein `dict`, ein Datenbankmodell, usw.).
@@ -24,11 +22,9 @@ Sie können auch Header hinzufügen, wenn Sie eine `Response` direkt zurückgebe
Erstellen Sie eine Response wie in [Eine Response direkt zurückgeben](response-directly.md){.internal-link target=_blank} beschrieben und übergeben Sie die Header als zusätzlichen Parameter:
```Python hl_lines="10-12"
{!../../../docs_src/response_headers/tutorial001.py!}
```
{* ../../docs_src/response_headers/tutorial001.py hl[10:12] *}
/// note | "Technische Details"
/// note | Technische Details
Sie können auch `from starlette.responses import Response` oder `from starlette.responses import JSONResponse` verwenden.

View File

@@ -20,36 +20,7 @@ Wenn Sie dann den Benutzernamen und das Passwort eingeben, sendet der Browser di
* Diese gibt ein Objekt vom Typ `HTTPBasicCredentials` zurück:
* Es enthält den gesendeten `username` und das gesendete `password`.
//// tab | Python 3.9+
```Python hl_lines="4 8 12"
{!> ../../../docs_src/security/tutorial006_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="2 7 11"
{!> ../../../docs_src/security/tutorial006_an.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="2 6 10"
{!> ../../../docs_src/security/tutorial006.py!}
```
////
{* ../../docs_src/security/tutorial006_an_py39.py hl[4,8,12] *}
Wenn Sie versuchen, die URL zum ersten Mal zu öffnen (oder in der Dokumentation auf den Button „Execute“ zu klicken), wird der Browser Sie nach Ihrem Benutzernamen und Passwort fragen:
<img src="/img/tutorial/security/image12.png">
@@ -68,35 +39,7 @@ 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.
//// tab | Python 3.9+
```Python hl_lines="1 12-24"
{!> ../../../docs_src/security/tutorial007_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="1 12-24"
{!> ../../../docs_src/security/tutorial007_an.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="1 11-21"
{!> ../../../docs_src/security/tutorial007.py!}
```
////
{* ../../docs_src/security/tutorial007_an_py39.py hl[1,12:24] *}
Dies wäre das gleiche wie:
@@ -160,32 +103,4 @@ 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:
//// 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!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="23-27"
{!> ../../../docs_src/security/tutorial007.py!}
```
////
{* ../../docs_src/security/tutorial007_an_py39.py hl[26:30] *}

View File

@@ -4,7 +4,7 @@
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“**.

View File

@@ -10,7 +10,7 @@ Jedes Mal, wenn Sie sich mit Facebook, Google, GitHub, Microsoft oder Twitter an
In diesem Abschnitt erfahren Sie, wie Sie Authentifizierung und Autorisierung mit demselben OAuth2, mit Scopes in Ihrer **FastAPI**-Anwendung verwalten.
/// warning | "Achtung"
/// warning | Achtung
Dies ist ein mehr oder weniger fortgeschrittener Abschnitt. Wenn Sie gerade erst anfangen, können Sie ihn überspringen.
@@ -62,71 +62,7 @@ Für OAuth2 sind es einfach nur Strings.
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:
//// 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"
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!}
```
////
//// tab | Python 3.9+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155"
{!> ../../../docs_src/security/tutorial005_py39.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155"
{!> ../../../docs_src/security/tutorial005.py!}
```
////
{* ../../docs_src/security/tutorial005_an_py310.py hl[4,8,12,46,64,105,107:115,121:124,128:134,139,155] *}
Sehen wir uns diese Änderungen nun Schritt für Schritt an.
@@ -136,71 +72,7 @@ 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:
//// 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!}
```
////
//// tab | Python 3.8+
```Python hl_lines="63-66"
{!> ../../../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="61-64"
{!> ../../../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="62-65"
{!> ../../../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="62-65"
{!> ../../../docs_src/security/tutorial005.py!}
```
////
{* ../../docs_src/security/tutorial005_an_py310.py hl[62:65] *}
Da wir diese Scopes jetzt deklarieren, werden sie in der API-Dokumentation angezeigt, wenn Sie sich einloggen/autorisieren.
@@ -218,7 +90,7 @@ Wir verwenden immer noch dasselbe `OAuth2PasswordRequestForm`. Es enthält eine
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.
@@ -226,71 +98,7 @@ Aus Sicherheitsgründen sollten Sie jedoch sicherstellen, dass Sie in Ihrer Anwe
///
//// tab | Python 3.10+
```Python hl_lines="155"
{!> ../../../docs_src/security/tutorial005_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="155"
{!> ../../../docs_src/security/tutorial005_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="156"
{!> ../../../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="154"
{!> ../../../docs_src/security/tutorial005_py310.py!}
```
////
//// tab | Python 3.9+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="155"
{!> ../../../docs_src/security/tutorial005_py39.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="155"
{!> ../../../docs_src/security/tutorial005.py!}
```
////
{* ../../docs_src/security/tutorial005_an_py310.py hl[155] *}
## Scopes in *Pfadoperationen* und Abhängigkeiten deklarieren
@@ -308,7 +116,7 @@ Und die Abhängigkeitsfunktion `get_current_active_user` kann auch Unterabhängi
In diesem Fall erfordert sie den Scope `me` (sie könnte mehr als einen Scope erfordern).
/// note | "Hinweis"
/// note | Hinweis
Sie müssen nicht unbedingt an verschiedenen Stellen verschiedene Scopes hinzufügen.
@@ -316,73 +124,9 @@ Wir tun dies hier, um zu demonstrieren, wie **FastAPI** auf verschiedenen Ebenen
///
//// tab | Python 3.10+
{* ../../docs_src/security/tutorial005_an_py310.py hl[4,139,170] *}
```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"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="3 138 167"
{!> ../../../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="4 139 168"
{!> ../../../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="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.
@@ -406,71 +150,7 @@ 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).
//// 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="7 104"
{!> ../../../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="8 105"
{!> ../../../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="8 105"
{!> ../../../docs_src/security/tutorial005.py!}
```
////
{* ../../docs_src/security/tutorial005_an_py310.py hl[8,105] *}
## Die `scopes` verwenden
@@ -484,71 +164,7 @@ 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).
//// tab | Python 3.10+
```Python hl_lines="105 107-115"
{!> ../../../docs_src/security/tutorial005_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="105 107-115"
{!> ../../../docs_src/security/tutorial005_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="106 108-116"
{!> ../../../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="104 106-114"
{!> ../../../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="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!}
```
////
{* ../../docs_src/security/tutorial005_an_py310.py hl[105,107:115] *}
## Den `username` und das Format der Daten überprüfen
@@ -564,71 +180,7 @@ 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.
//// tab | Python 3.10+
```Python hl_lines="46 116-127"
{!> ../../../docs_src/security/tutorial005_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="46 116-127"
{!> ../../../docs_src/security/tutorial005_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="47 117-128"
{!> ../../../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="45 115-126"
{!> ../../../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="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!}
```
////
{* ../../docs_src/security/tutorial005_an_py310.py hl[46,116:127] *}
## Die `scopes` verifizieren
@@ -636,71 +188,7 @@ 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.
//// tab | Python 3.10+
```Python hl_lines="128-134"
{!> ../../../docs_src/security/tutorial005_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="128-134"
{!> ../../../docs_src/security/tutorial005_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="129-135"
{!> ../../../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="127-133"
{!> ../../../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="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!}
```
////
{* ../../docs_src/security/tutorial005_an_py310.py hl[128:134] *}
## Abhängigkeitsbaum und Scopes
@@ -727,7 +215,7 @@ So sieht die Hierarchie der Abhängigkeiten und Scopes aus:
* `security_scopes.scopes` enthält `["me"]` für die *Pfadoperation* `read_users_me`, da das in der Abhängigkeit `get_current_active_user` deklariert ist.
* `security_scopes.scopes` wird `[]` (nichts) für die *Pfadoperation* `read_system_status` enthalten, da diese keine `Security` mit `scopes` deklariert hat, und deren Abhängigkeit `get_current_user` ebenfalls keinerlei `scopes` deklariert.
/// tip | "Tipp"
/// 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.
@@ -771,7 +259,7 @@ Am häufigsten ist der „Implicit“-Flow.
Am sichersten ist der „Code“-Flow, die Implementierung ist jedoch komplexer, da mehr Schritte erforderlich sind. Da er komplexer ist, schlagen viele Anbieter letztendlich den „Implicit“-Flow vor.
/// note | "Hinweis"
/// note | Hinweis
Es ist üblich, dass jeder Authentifizierungsanbieter seine Flows anders benennt, um sie zu einem Teil seiner Marke zu machen.

View File

@@ -8,7 +8,7 @@ Aus diesem Grund werden diese üblicherweise in Umgebungsvariablen bereitgestell
## 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.
@@ -67,7 +67,7 @@ name = os.getenv("MY_NAME", "World")
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.
@@ -124,7 +124,7 @@ Hello World from Python
</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>.
@@ -180,9 +180,7 @@ Sie können dieselben Validierungs-Funktionen und -Tools verwenden, die Sie für
//// tab | Pydantic v2
```Python hl_lines="2 5-8 11"
{!> ../../../docs_src/settings/tutorial001.py!}
```
{* ../../docs_src/settings/tutorial001.py hl[2,5:8,11] *}
////
@@ -194,13 +192,11 @@ In Pydantic v1 würden Sie `BaseSettings` direkt von `pydantic` statt von `pydan
///
```Python hl_lines="2 5-8 11"
{!> ../../../docs_src/settings/tutorial001_pv1.py!}
```
{* ../../docs_src/settings/tutorial001_pv1.py hl[2,5:8,11] *}
////
/// tip | "Tipp"
/// tip | Tipp
Für ein schnelles Copy-and-paste verwenden Sie nicht dieses Beispiel, sondern das letzte unten.
@@ -214,9 +210,7 @@ Als Nächstes werden die Daten konvertiert und validiert. Wenn Sie also dieses `
Dann können Sie das neue `settings`-Objekt in Ihrer Anwendung verwenden:
```Python hl_lines="18-20"
{!../../../docs_src/settings/tutorial001.py!}
```
{* ../../docs_src/settings/tutorial001.py hl[18:20] *}
### Den Server ausführen
@@ -232,7 +226,7 @@ $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" uvicorn main:app
</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.
@@ -250,17 +244,13 @@ Sie könnten diese Einstellungen in eine andere Moduldatei einfügen, wie Sie in
Sie könnten beispielsweise eine Datei `config.py` haben mit:
```Python
{!../../../docs_src/settings/app01/config.py!}
```
{* ../../docs_src/settings/app01/config.py *}
Und dann verwenden Sie diese in einer Datei `main.py`:
```Python hl_lines="3 11-13"
{!../../../docs_src/settings/app01/main.py!}
```
{* ../../docs_src/settings/app01/main.py hl[3,11:13] *}
/// 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.
@@ -276,9 +266,7 @@ Dies könnte besonders beim Testen nützlich sein, da es sehr einfach ist, eine
Ausgehend vom vorherigen Beispiel könnte Ihre Datei `config.py` so aussehen:
```Python hl_lines="10"
{!../../../docs_src/settings/app02/config.py!}
```
{* ../../docs_src/settings/app02/config.py hl[10] *}
Beachten Sie, dass wir jetzt keine Standardinstanz `settings = Settings()` erstellen.
@@ -286,37 +274,9 @@ Beachten Sie, dass wir jetzt keine Standardinstanz `settings = Settings()` erste
Jetzt erstellen wir eine Abhängigkeit, die ein neues `config.Settings()` zurückgibt.
//// tab | Python 3.9+
{* ../../docs_src/settings/app02_an_py39/main.py hl[6,12:13] *}
```Python hl_lines="6 12-13"
{!> ../../../docs_src/settings/app02_an_py39/main.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="6 12-13"
{!> ../../../docs_src/settings/app02_an/main.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="5 11-12"
{!> ../../../docs_src/settings/app02/main.py!}
```
////
/// tip | "Tipp"
/// tip | Tipp
Wir werden das `@lru_cache` in Kürze besprechen.
@@ -326,43 +286,13 @@ 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.
//// 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"
{!> ../../../docs_src/settings/app02_an/main.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="16 18-20"
{!> ../../../docs_src/settings/app02/main.py!}
```
////
{* ../../docs_src/settings/app02_an_py39/main.py hl[17,19:21] *}
### Einstellungen und Tests
Dann wäre es sehr einfach, beim Testen ein anderes Einstellungsobjekt bereitzustellen, indem man eine Abhängigkeitsüberschreibung für `get_settings` erstellt:
```Python hl_lines="9-10 13 21"
{!../../../docs_src/settings/app02/test_main.py!}
```
{* ../../docs_src/settings/app02/test_main.py hl[9:10,13,21] *}
Bei der Abhängigkeitsüberschreibung legen wir einen neuen Wert für `admin_email` fest, wenn wir das neue `Settings`-Objekt erstellen, und geben dann dieses neue Objekt zurück.
@@ -374,7 +304,7 @@ 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.
/// tip | "Tipp"
/// tip | Tipp
Eine Datei, die mit einem Punkt (`.`) beginnt, ist eine versteckte Datei in Unix-ähnlichen Systemen wie Linux und macOS.
@@ -384,7 +314,7 @@ 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>.
/// tip | "Tipp"
/// tip | Tipp
Damit das funktioniert, müssen Sie `pip install python-dotenv` ausführen.
@@ -405,11 +335,9 @@ Und dann aktualisieren Sie Ihre `config.py` mit:
//// tab | Pydantic v2
```Python hl_lines="9"
{!> ../../../docs_src/settings/app03_an/config.py!}
```
{* ../../docs_src/settings/app03_an/config.py hl[9] *}
/// 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>.
@@ -419,11 +347,9 @@ Das Attribut `model_config` wird nur für die Pydantic-Konfiguration verwendet.
//// tab | Pydantic v1
```Python hl_lines="9-10"
{!> ../../../docs_src/settings/app03_an/config_pv1.py!}
```
{* ../../docs_src/settings/app03_an/config_pv1.py hl[9:10] *}
/// tip | "Tipp"
/// tip | Tipp
Die Klasse `Config` wird nur für die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter <a href="https://docs.pydantic.dev/1.10/usage/model_config/" class="external-link" target="_blank">Pydantic Model Config</a>.
@@ -462,35 +388,7 @@ 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. ✔️
//// tab | Python 3.9+
```Python hl_lines="1 11"
{!> ../../../docs_src/settings/app03_an_py39/main.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="1 11"
{!> ../../../docs_src/settings/app03_an/main.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="1 10"
{!> ../../../docs_src/settings/app03/main.py!}
```
////
{* ../../docs_src/settings/app03_an_py39/main.py hl[1,11] *}
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.

View File

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

View File

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

View File

@@ -28,59 +28,9 @@ 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.
//// tab | Python 3.10+
{* ../../docs_src/dependency_testing/tutorial001_an_py310.py hl[26:27,30] *}
```Python hl_lines="26-27 30"
{!> ../../../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!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="24-25 28"
{!> ../../../docs_src/dependency_testing/tutorial001_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```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.
@@ -96,7 +46,7 @@ Anschließend können Sie Ihre Überschreibungen zurücksetzen (entfernen), inde
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.

View File

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

View File

@@ -4,11 +4,9 @@ Sie können den schon bekannten `TestClient` zum Testen von WebSockets verwenden
Dazu verwenden Sie den `TestClient` in einer `with`-Anweisung, eine Verbindung zum WebSocket herstellend:
```Python hl_lines="27-31"
{!../../../docs_src/app_testing/tutorial002.py!}
```
{* ../../docs_src/app_testing/tutorial002.py hl[27:31] *}
/// 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>.

View File

@@ -29,13 +29,11 @@ Angenommen, Sie möchten auf die IP-Adresse/den Host des Clients in Ihrer *Pfado
Dazu müssen Sie direkt auf den Request zugreifen.
```Python hl_lines="1 7-8"
{!../../../docs_src/using_request_directly/tutorial001.py!}
```
{* ../../docs_src/using_request_directly/tutorial001.py hl[1,7:8] *}
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.
@@ -49,7 +47,7 @@ Auf die gleiche Weise können Sie wie gewohnt jeden anderen Parameter deklariere
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.

View File

@@ -38,19 +38,15 @@ In der Produktion hätten Sie eine der oben genannten Optionen.
Aber es ist die einfachste Möglichkeit, sich auf die Serverseite von WebSockets zu konzentrieren und ein funktionierendes Beispiel zu haben:
```Python hl_lines="2 6-38 41-43"
{!../../../docs_src/websockets/tutorial001.py!}
```
{* ../../docs_src/websockets/tutorial001.py hl[2,6:38,41:43] *}
## Einen `websocket` erstellen
Erstellen Sie in Ihrer **FastAPI**-Anwendung einen `websocket`:
```Python hl_lines="1 46-47"
{!../../../docs_src/websockets/tutorial001.py!}
```
{* ../../docs_src/websockets/tutorial001.py hl[1,46:47] *}
/// note | "Technische Details"
/// note | Technische Details
Sie können auch `from starlette.websockets import WebSocket` verwenden.
@@ -62,9 +58,7 @@ Sie können auch `from starlette.websockets import WebSocket` verwenden.
In Ihrer WebSocket-Route können Sie Nachrichten `await`en und Nachrichten senden.
```Python hl_lines="48-52"
{!../../../docs_src/websockets/tutorial001.py!}
```
{* ../../docs_src/websockets/tutorial001.py hl[48:52] *}
Sie können Binär-, Text- und JSON-Daten empfangen und senden.
@@ -115,57 +109,7 @@ 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*:
//// 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!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="66-67 79"
{!> ../../../docs_src/websockets/tutorial002_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="68-69 81"
{!> ../../../docs_src/websockets/tutorial002.py!}
```
////
{* ../../docs_src/websockets/tutorial002_an_py310.py hl[68:69,82] *}
/// info
@@ -196,7 +140,7 @@ Dort können Sie einstellen:
* Die „Item ID“, die im Pfad 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.
@@ -210,21 +154,7 @@ 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.
//// tab | Python 3.9+
```Python hl_lines="79-81"
{!> ../../../docs_src/websockets/tutorial003_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="81-83"
{!> ../../../docs_src/websockets/tutorial003.py!}
```
////
{* ../../docs_src/websockets/tutorial003_py39.py hl[79:81] *}
Zum Ausprobieren:
@@ -238,7 +168,7 @@ Das wird die Ausnahme `WebSocketDisconnect` auslösen und alle anderen Clients e
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.

View File

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

View File

@@ -30,13 +30,13 @@ 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.
/// note | "Hinweis"
/// note | Hinweis
Das Django REST Framework wurde von Tom Christie erstellt. Derselbe Schöpfer von Starlette und Uvicorn, auf denen **FastAPI** basiert.
///
/// check | "Inspirierte **FastAPI**"
/// check | Inspirierte **FastAPI**
Eine automatische API-Dokumentationsoberfläche zu haben.
@@ -56,7 +56,7 @@ 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.
/// check | "Inspirierte **FastAPI**"
/// check | Inspirierte **FastAPI**
Ein Mikroframework zu sein. Es einfach zu machen, die benötigten Tools und Teile zu kombinieren.
@@ -98,7 +98,7 @@ def read_url():
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.
@@ -118,7 +118,7 @@ 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“.
/// check | "Inspirierte **FastAPI**"
/// check | Inspirierte **FastAPI**
Einen offenen Standard für API-Spezifikationen zu übernehmen und zu verwenden, anstelle eines benutzerdefinierten Schemas.
@@ -147,7 +147,7 @@ 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.
/// check | "Inspirierte **FastAPI**"
/// check | Inspirierte **FastAPI**
Code zu verwenden, um „Schemas“ zu definieren, welche Datentypen und Validierung automatisch bereitstellen.
@@ -169,7 +169,7 @@ Webargs wurde von denselben Marshmallow-Entwicklern erstellt.
///
/// check | "Inspirierte **FastAPI**"
/// check | Inspirierte **FastAPI**
Eingehende Requestdaten automatisch zu validieren.
@@ -199,7 +199,7 @@ APISpec wurde von denselben Marshmallow-Entwicklern erstellt.
///
/// check | "Inspirierte **FastAPI**"
/// check | Inspirierte **FastAPI**
Den offenen Standard für APIs, OpenAPI, zu unterstützen.
@@ -231,7 +231,7 @@ 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.
@@ -251,7 +251,7 @@ 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.
/// check | "Inspirierte **FastAPI**"
/// check | Inspirierte **FastAPI**
Python-Typen zu verwenden, um eine hervorragende Editorunterstützung zu erhalten.
@@ -263,7 +263,7 @@ Python-Typen zu verwenden, um eine hervorragende Editorunterstützung zu erhalte
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.
@@ -271,7 +271,7 @@ Hat eindeutig Uvicorn und Starlette inspiriert, welche derzeit in offenen Benchm
///
/// check | "Inspirierte **FastAPI**"
/// check | Inspirierte **FastAPI**
Einen Weg zu finden, eine hervorragende Performanz zu haben.
@@ -287,7 +287,7 @@ 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.
/// check | "Inspirierte **FastAPI**"
/// check | Inspirierte **FastAPI**
Wege zu finden, eine großartige Performanz zu erzielen.
@@ -313,7 +313,7 @@ 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.
/// 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.
@@ -321,7 +321,7 @@ Das hat tatsächlich dazu geführt, dass Teile von Pydantic aktualisiert wurden,
///
### <a href="https://www.hug.rest/" class="external-link" target="_blank">Hug</a>
### <a href="https://github.com/hugapi/hug" class="external-link" target="_blank">Hug</a>
Hug war eines der ersten Frameworks, welches die Deklaration von API-Parametertypen mithilfe von Python-Typhinweisen implementierte. Das war eine großartige Idee, die andere Tools dazu inspirierte, dasselbe zu tun.
@@ -341,7 +341,7 @@ Hug wurde von Timothy Crosley erstellt, dem gleichen Schöpfer von <a href="http
///
/// 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.
@@ -385,7 +385,7 @@ APIStar wurde von Tom Christie erstellt. Derselbe, welcher Folgendes erstellt ha
///
/// check | "Inspirierte **FastAPI**"
/// check | Inspirierte **FastAPI**
Zu existieren.
@@ -409,7 +409,7 @@ 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.
/// check | "**FastAPI** verwendet es, um"
/// check | **FastAPI** verwendet es, um
Die gesamte Datenvalidierung, Datenserialisierung und automatische Modelldokumentation (basierend auf JSON Schema) zu erledigen.
@@ -444,7 +444,7 @@ 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.
/// 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.
@@ -452,7 +452,7 @@ Dennoch wird es bereits von mehreren Tools als „Standard“ verwendet. Das ver
///
/// check | "**FastAPI** verwendet es, um"
/// check | **FastAPI** verwendet es, um
Alle Kern-Webaspekte zu handhaben. Und fügt Funktionen obenauf.
@@ -470,7 +470,7 @@ Es handelt sich nicht um ein Webframework, sondern um einen Server. Beispielswei
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.

View File

@@ -401,7 +401,7 @@ All das ist es, was FastAPI (via Starlette) befeuert und es eine so beeindrucken
## Sehr technische Details
/// warning | "Achtung"
/// warning | Achtung
Das folgende können Sie wahrscheinlich überspringen.

View File

@@ -1,484 +0,0 @@
# Entwicklung Mitwirken
Vielleicht möchten Sie sich zuerst die grundlegenden Möglichkeiten anschauen, [FastAPI zu helfen und Hilfe zu erhalten](help-fastapi.md){.internal-link target=_blank}.
## Entwicklung
Wenn Sie das <a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">fastapi Repository</a> bereits geklont haben und tief in den Code eintauchen möchten, hier einen Leitfaden zum Einrichten Ihrer Umgebung.
### Virtuelle Umgebung mit `venv`
Sie können mit dem Python-Modul `venv` in einem Verzeichnis eine isolierte virtuelle lokale Umgebung erstellen. Machen wir das im geklonten Repository (da wo sich die `requirements.txt` befindet):
<div class="termy">
```console
$ python -m venv env
```
</div>
Das erstellt ein Verzeichnis `./env/` mit den Python-Binärdateien und Sie können dann Packages in dieser lokalen Umgebung installieren.
### Umgebung aktivieren
Aktivieren Sie die neue Umgebung mit:
//// tab | Linux, macOS
<div class="termy">
```console
$ source ./env/bin/activate
```
</div>
////
//// tab | Windows PowerShell
<div class="termy">
```console
$ .\env\Scripts\Activate.ps1
```
</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>):
<div class="termy">
```console
$ source ./env/Scripts/activate
```
</div>
////
Um zu überprüfen, ob es funktioniert hat, geben Sie ein:
//// tab | Linux, macOS, Windows Bash
<div class="termy">
```console
$ which pip
some/directory/fastapi/env/bin/pip
```
</div>
////
//// tab | Windows PowerShell
<div class="termy">
```console
$ Get-Command pip
some/directory/fastapi/env/bin/pip
```
</div>
////
Wenn die `pip` Binärdatei unter `env/bin/pip` angezeigt wird, hat es funktioniert. 🎉
Stellen Sie sicher, dass Sie über die neueste Version von pip in Ihrer lokalen Umgebung verfügen, um Fehler bei den nächsten Schritten zu vermeiden:
<div class="termy">
```console
$ python -m pip install --upgrade pip
---> 100%
```
</div>
/// tip | "Tipp"
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.
///
### Benötigtes mit pip installieren
Nachdem Sie die Umgebung wie oben beschrieben aktiviert haben:
<div class="termy">
```console
$ pip install -r requirements.txt
---> 100%
```
</div>
Das installiert alle Abhängigkeiten und Ihr lokales FastAPI in Ihrer lokalen Umgebung.
#### Das lokale FastAPI verwenden
Wenn Sie eine Python-Datei erstellen, die FastAPI importiert und verwendet, und diese mit dem Python aus Ihrer lokalen Umgebung ausführen, wird Ihr geklonter lokaler FastAPI-Quellcode verwendet.
Und wenn Sie diesen lokalen FastAPI-Quellcode aktualisieren und dann die Python-Datei erneut ausführen, wird die neue Version von FastAPI verwendet, die Sie gerade bearbeitet haben.
Auf diese Weise müssen Sie Ihre lokale Version nicht „installieren“, um jede Änderung testen zu können.
/// 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 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
Es gibt ein Skript, das, wenn Sie es ausführen, Ihren gesamten Code formatiert und bereinigt:
<div class="termy">
```console
$ bash scripts/format.sh
```
</div>
Es sortiert auch alle Ihre Importe automatisch.
Damit es sie richtig sortiert, muss FastAPI lokal in Ihrer Umgebung installiert sein, mit dem Befehl vom obigen Abschnitt, welcher `-e` verwendet.
## Dokumentation
Stellen Sie zunächst sicher, dass Sie Ihre Umgebung wie oben beschrieben einrichten, was alles Benötigte installiert.
### Dokumentation live
Während der lokalen Entwicklung gibt es ein Skript, das die Site erstellt, auf Änderungen prüft und direkt neu lädt (Live Reload):
<div class="termy">
```console
$ python ./scripts/docs.py live
<span style="color: green;">[INFO]</span> Serving on http://127.0.0.1:8008
<span style="color: green;">[INFO]</span> Start watching changes
<span style="color: green;">[INFO]</span> Start detecting changes
```
</div>
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.
/// 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/`:
```console
$ cd docs/en/
```
Führen Sie dann `mkdocs` in diesem Verzeichnis aus:
```console
$ mkdocs serve --dev-addr 8008
```
///
#### Typer-CLI (optional)
Die Anleitung hier zeigt Ihnen, wie Sie das Skript unter `./scripts/docs.py` direkt mit dem `python` Programm verwenden.
Sie können aber auch <a href="https://typer.tiangolo.com/typer-cli/" class="external-link" target="_blank">Typer CLI</a> verwenden und erhalten dann Autovervollständigung für Kommandos in Ihrem Terminal, nach dem Sie dessen Vervollständigung installiert haben.
Wenn Sie Typer CLI installieren, können Sie die Vervollständigung installieren mit:
<div class="termy">
```console
$ typer --install-completion
zsh completion installed in /home/user/.bashrc.
Completion will take effect once you restart the terminal.
```
</div>
### Dokumentationsstruktur
Die Dokumentation verwendet <a href="https://www.mkdocs.org/" class="external-link" target="_blank">MkDocs</a>.
Und es gibt zusätzliche Tools/Skripte für Übersetzungen, in `./scripts/docs.py`.
/// tip | "Tipp"
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/`.
Viele der Tutorials enthalten Codeblöcke.
In den meisten Fällen handelt es sich bei diesen Codeblöcken um vollständige Anwendungen, die unverändert ausgeführt werden können.
Tatsächlich sind diese Codeblöcke nicht Teil des Markdowns, sondern Python-Dateien im Verzeichnis `./docs_src/`.
Und diese Python-Dateien werden beim Generieren der Site in die Dokumentation eingefügt.
### Dokumentation für Tests
Tatsächlich arbeiten die meisten Tests mit den Beispielquelldateien in der Dokumentation.
Dadurch wird sichergestellt, dass:
* Die Dokumentation aktuell ist.
* Die Dokumentationsbeispiele ohne Änderung ausgeführt werden können.
* Die meisten Funktionalitäten durch die Dokumentation abgedeckt werden, sichergestellt durch die Testabdeckung.
#### Gleichzeitig Apps und Dokumentation
Wenn Sie die Beispiele ausführen, mit z. B.:
<div class="termy">
```console
$ uvicorn tutorial001:app --reload
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
</div>
wird das, da Uvicorn standardmäßig den Port `8000` verwendet, mit der Dokumentation auf dem Port `8008` nicht in Konflikt geraten.
### Übersetzungen
Hilfe bei Übersetzungen wird SEHR geschätzt! Und es kann nicht getan werden, ohne die Hilfe der Gemeinschaft. 🌎 🚀
Hier sind die Schritte, die Ihnen bei Übersetzungen helfen.
#### Tipps und Richtlinien
* Schauen Sie nach <a href="https://github.com/fastapi/fastapi/pulls" class="external-link" target="_blank">aktuellen Pull Requests</a> für Ihre Sprache. Sie können die Pull Requests nach dem Label für Ihre Sprache filtern. Für Spanisch lautet das Label beispielsweise <a href="https://github.com/fastapi/fastapi/pulls?q=is%3Aopen+sort%3Aupdated-desc+label%3Alang-es+label%3Aawaiting-review" class="external-link" target="_blank">`lang-es`</a>.
* 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"
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.
///
* Überprüfen Sie, ob es eine <a href="https://github.com/fastapi/fastapi/discussions/categories/translations" class="external-link" target="_blank">GitHub-Diskussion</a> gibt, die Übersetzungen für Ihre Sprache koordiniert. Sie können sie abonnieren, und wenn ein neuer Pull Request zum Review vorliegt, wird der Diskussion automatisch ein Kommentar hinzugefügt.
* Wenn Sie Seiten übersetzen, fügen Sie einen einzelnen Pull Request pro übersetzter Seite hinzu. Dadurch wird es für andere viel einfacher, ihn zu durchzusehen.
* Um den Zwei-Buchstaben-Code für die Sprache zu finden, die Sie übersetzen möchten, schauen Sie sich die Tabelle <a href="https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes" class="external-link" target= verwenden "_blank">List of ISO 639-1 codes</a> an.
#### Vorhandene Sprache
Angenommen, Sie möchten eine Seite für eine Sprache übersetzen, die bereits Übersetzungen für einige Seiten hat, beispielsweise für Spanisch.
Im Spanischen lautet der Zwei-Buchstaben-Code `es`. Das Verzeichnis für spanische Übersetzungen befindet sich also unter `docs/es/`.
/// tip | "Tipp"
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:
<div class="termy">
```console
// Verwenden Sie das Kommando „live“ und fügen Sie den Sprach-Code als Argument hinten an
$ python ./scripts/docs.py live es
<span style="color: green;">[INFO]</span> Serving on http://127.0.0.1:8008
<span style="color: green;">[INFO]</span> Start watching changes
<span style="color: green;">[INFO]</span> Start detecting changes
```
</div>
/// tip | "Tipp"
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/`:
```console
$ cd docs/es/
```
Dann führen Sie in dem Verzeichnis `mkdocs` aus:
```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.
Sie werden sehen, dass jede Sprache alle Seiten hat. Einige Seiten sind jedoch nicht übersetzt und haben oben eine Info-Box, dass die Übersetzung noch fehlt.
Nehmen wir nun an, Sie möchten eine Übersetzung für den Abschnitt [Features](features.md){.internal-link target=_blank} hinzufügen.
* Kopieren Sie die Datei:
```
docs/en/docs/features.md
```
* Fügen Sie sie an genau derselben Stelle ein, jedoch für die Sprache, die Sie übersetzen möchten, z. B.:
```
docs/es/docs/features.md
```
/// tip | "Tipp"
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). 🎉
Jetzt können Sie alles übersetzen und beim Speichern sehen, wie es aussieht.
#### Neue Sprache
Nehmen wir an, Sie möchten Übersetzungen für eine Sprache hinzufügen, die noch nicht übersetzt ist, nicht einmal einige Seiten.
Angenommen, Sie möchten Übersetzungen für Kreolisch hinzufügen, diese sind jedoch noch nicht in den Dokumenten enthalten.
Wenn Sie den Link von oben überprüfen, lautet der Sprachcode für Kreolisch `ht`.
Der nächste Schritt besteht darin, das Skript auszuführen, um ein neues Übersetzungsverzeichnis zu erstellen:
<div class="termy">
```console
// Verwenden Sie das Kommando new-lang und fügen Sie den Sprach-Code als Argument hinten an
$ python ./scripts/docs.py new-lang ht
Successfully initialized: docs/ht
```
</div>
Jetzt können Sie in Ihrem Code-Editor das neu erstellte Verzeichnis `docs/ht/` sehen.
Obiges Kommando hat eine Datei `docs/ht/mkdocs.yml` mit einer Minimal-Konfiguration erstellt, die alles von der `en`-Version erbt:
```yaml
INHERIT: ../en/mkdocs.yml
```
/// tip | "Tipp"
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.
Sie können nun mit den obigen Instruktionen für eine „vorhandene Sprache“ fortfahren.
Fügen Sie dem ersten Pull Request beide Dateien `docs/ht/mkdocs.yml` und `docs/ht/index.md` bei. 🎉
#### Vorschau des Ergebnisses
Wie bereits oben erwähnt, können Sie `./scripts/docs.py` mit dem Befehl `live` verwenden, um eine Vorschau der Ergebnisse anzuzeigen (oder `mkdocs serve`).
Sobald Sie fertig sind, können Sie auch alles so testen, wie es online aussehen würde, einschließlich aller anderen Sprachen.
Bauen Sie dazu zunächst die gesamte Dokumentation:
<div class="termy">
```console
// Verwenden Sie das Kommando „build-all“, das wird ein wenig dauern
$ python ./scripts/docs.py build-all
Building docs for: en
Building docs for: es
Successfully built docs for: es
```
</div>
Dadurch werden alle diese unabhängigen MkDocs-Sites für jede Sprache erstellt, kombiniert und das endgültige Resultat unter `./site/` gespeichert.
Dieses können Sie dann mit dem Befehl `serve` bereitstellen:
<div class="termy">
```console
// Verwenden Sie das Kommando „serve“ nachdem Sie „build-all“ ausgeführt haben.
$ python ./scripts/docs.py serve
Warning: this is a very simple server. For development, use mkdocs serve instead.
This is here only to preview a site with translations already built.
Make sure you run the build-all command first.
Serving at: http://127.0.0.1:8008
```
</div>
#### Übersetzungsspezifische Tipps und Richtlinien
* Übersetzen Sie nur die Markdown-Dokumente (`.md`). Übersetzen Sie nicht die Codebeispiele unter `./docs_src`.
* In Codeblöcken innerhalb des Markdown-Dokuments, übersetzen Sie Kommentare (`# ein Kommentar`), aber lassen Sie den Rest unverändert.
* Ändern Sie nichts, was in "``" (Inline-Code) eingeschlossen ist.
* In Zeilen, die mit `===` oder `!!!` beginnen, übersetzen Sie nur den ` "... Text ..."`-Teil. Lassen Sie den Rest unverändert.
* Sie können Info-Boxen wie `!!! warning` mit beispielsweise `!!! warning "Achtung"` übersetzen. Aber ändern Sie nicht das Wort direkt nach dem `!!!`, es bestimmt die Farbe der Info-Box.
* Ändern Sie nicht die Pfade in Links zu Bildern, Codedateien, Markdown Dokumenten.
* Wenn ein Markdown-Dokument übersetzt ist, ändern sich allerdings unter Umständen die `#hash-teile` in Links zu dessen Überschriften. Aktualisieren Sie diese Links, wenn möglich.
* Suchen Sie im übersetzten Dokument nach solchen Links mit dem Regex `#[^# ]`.
* Suchen Sie in allen bereits in ihre Sprache übersetzen Dokumenten nach `ihr-ubersetztes-dokument.md`. VS Code hat beispielsweise eine Option „Bearbeiten“ -> „In Dateien suchen“.
* Übersetzen Sie bei der Übersetzung eines Dokuments nicht „im Voraus“ `#hash-teile`, die zu Überschriften in noch nicht übersetzten Dokumenten verlinken.
## Tests
Es gibt ein Skript, das Sie lokal ausführen können, um den gesamten Code zu testen und Code Coverage Reporte in HTML zu generieren:
<div class="termy">
```console
$ bash scripts/test-cov-html.sh
```
</div>
Dieses Kommando generiert ein Verzeichnis `./htmlcov/`. Wenn Sie die Datei `./htmlcov/index.html` in Ihrem Browser öffnen, können Sie interaktiv die Codebereiche erkunden, die von den Tests abgedeckt werden, und feststellen, ob Bereiche fehlen.

View File

@@ -151,7 +151,7 @@ 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 ...
/// 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.
@@ -241,7 +241,7 @@ Hier sind einige mögliche Kombinationen und Strategien:
* **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.
/// tip | "Tipp"
/// tip | Tipp
Machen Sie sich keine Sorgen, wenn einige dieser Punkte zu **Containern**, Docker oder Kubernetes noch nicht viel Sinn ergeben.
@@ -263,7 +263,7 @@ 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.
/// 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.
@@ -281,7 +281,7 @@ Hier sind einige mögliche Ideen:
* 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.
/// 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}.

View File

@@ -4,7 +4,7 @@ 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.
/// tip | "Tipp"
/// tip | Tipp
Sie haben es eilig und kennen sich bereits aus? Springen Sie zum [`Dockerfile` unten 👇](#ein-docker-image-fur-fastapi-erstellen).
@@ -231,7 +231,7 @@ 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**.
/// tip | "Tipp"
/// tip | Tipp
Lernen Sie, was jede Zeile bewirkt, indem Sie auf die Zahlenblasen im Code klicken. 👆
@@ -305,7 +305,7 @@ $ docker build -t myimage .
</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.
@@ -409,7 +409,7 @@ 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.
/// 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.
@@ -441,7 +441,7 @@ 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.
/// tip | "Tipp"
/// tip | Tipp
Die gleiche **TLS-Terminierungsproxy**-Komponente, die für HTTPS verwendet wird, wäre wahrscheinlich auch ein **Load Balancer**.
@@ -544,7 +544,7 @@ 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>.
/// 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).
@@ -556,7 +556,7 @@ 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.
/// 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>.
@@ -687,7 +687,7 @@ 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.
/// tip | "Tipp"
/// tip | Tipp
Klicken Sie auf die Zahlenblasen, um zu sehen, was jede Zeile bewirkt.

View File

@@ -4,7 +4,7 @@ Es ist leicht anzunehmen, dass HTTPS etwas ist, was einfach nur „aktiviert“
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.
@@ -71,7 +71,7 @@ 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.
/// 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.
@@ -121,7 +121,7 @@ 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.
/// tip | "Tipp"
/// tip | Tipp
Beachten Sie, dass die Verschlüsselung der Kommunikation auf der **TCP-Ebene** und nicht auf der HTTP-Ebene erfolgt.

View File

@@ -36,7 +36,7 @@ $ pip install "uvicorn[standard]"
</div>
/// tip | "Tipp"
/// tip | Tipp
Durch das Hinzufügen von `standard` installiert und verwendet Uvicorn einige empfohlene zusätzliche Abhängigkeiten.
@@ -96,7 +96,7 @@ Running on 0.0.0.0:8080 over http (CTRL + C to quit)
////
/// warning | "Achtung"
/// warning | Achtung
Denken Sie daran, die Option `--reload` zu entfernen, wenn Sie diese verwendet haben.

View File

@@ -42,7 +42,7 @@ 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.
/// tip | "Tipp"
/// tip | Tipp
Der „PATCH“ ist die letzte Zahl, zum Beispiel ist in `0.2.3` die PATCH-Version `3`.
@@ -56,7 +56,7 @@ fastapi>=0.45.0,<0.46.0
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`.

View File

@@ -228,7 +228,7 @@ 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.
/// 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.

View File

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

View File

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

View File

@@ -18,9 +18,7 @@ Der erste Schritt besteht darin, die automatischen Dokumentationen zu deaktivier
Um diese zu deaktivieren, setzen Sie deren URLs beim Erstellen Ihrer `FastAPI`-App auf `None`:
```Python hl_lines="8"
{!../../../docs_src/custom_docs_ui/tutorial001.py!}
```
{* ../../docs_src/custom_docs_ui/tutorial001.py hl[8] *}
### Die benutzerdefinierten Dokumentationen hinzufügen
@@ -36,11 +34,9 @@ Sie können die internen Funktionen von FastAPI wiederverwenden, um die HTML-Sei
Und genau so für ReDoc ...
```Python hl_lines="2-6 11-19 22-24 27-33"
{!../../../docs_src/custom_docs_ui/tutorial001.py!}
```
{* ../../docs_src/custom_docs_ui/tutorial001.py hl[2:6,11:19,22:24,27:33] *}
/// tip | "Tipp"
/// tip | Tipp
Die *Pfadoperation* für `swagger_ui_redirect` ist ein Hilfsmittel bei der Verwendung von OAuth2.
@@ -54,9 +50,7 @@ Swagger UI erledigt das hinter den Kulissen für Sie, benötigt aber diesen „U
Um nun testen zu können, ob alles funktioniert, erstellen Sie eine *Pfadoperation*:
```Python hl_lines="36-38"
{!../../../docs_src/custom_docs_ui/tutorial001.py!}
```
{* ../../docs_src/custom_docs_ui/tutorial001.py hl[36:38] *}
### Es ausprobieren
@@ -124,9 +118,7 @@ Danach könnte Ihre Dateistruktur wie folgt aussehen:
* Importieren Sie `StaticFiles`.
* „Mounten“ Sie eine `StaticFiles()`-Instanz in einem bestimmten Pfad.
```Python hl_lines="7 11"
{!../../../docs_src/custom_docs_ui/tutorial002.py!}
```
{* ../../docs_src/custom_docs_ui/tutorial002.py hl[7,11] *}
### Die statischen Dateien testen
@@ -158,9 +150,7 @@ Wie bei der Verwendung eines benutzerdefinierten CDN besteht der erste Schritt d
Um diese zu deaktivieren, setzen Sie deren URLs beim Erstellen Ihrer `FastAPI`-App auf `None`:
```Python hl_lines="9"
{!../../../docs_src/custom_docs_ui/tutorial002.py!}
```
{* ../../docs_src/custom_docs_ui/tutorial002.py hl[9] *}
### Die benutzerdefinierten Dokumentationen, mit statischen Dateien, hinzufügen
@@ -176,11 +166,9 @@ Auch hier können Sie die internen Funktionen von FastAPI wiederverwenden, um di
Und genau so für ReDoc ...
```Python hl_lines="2-6 14-22 25-27 30-36"
{!../../../docs_src/custom_docs_ui/tutorial002.py!}
```
{* ../../docs_src/custom_docs_ui/tutorial002.py hl[2:6,14:22,25:27,30:36] *}
/// tip | "Tipp"
/// tip | Tipp
Die *Pfadoperation* für `swagger_ui_redirect` ist ein Hilfsmittel bei der Verwendung von OAuth2.
@@ -194,9 +182,7 @@ Swagger UI erledigt das hinter den Kulissen für Sie, benötigt aber diesen „U
Um nun testen zu können, ob alles funktioniert, erstellen Sie eine *Pfadoperation*:
```Python hl_lines="39-41"
{!../../../docs_src/custom_docs_ui/tutorial002.py!}
```
{* ../../docs_src/custom_docs_ui/tutorial002.py hl[39:41] *}
### Benutzeroberfläche, mit statischen Dateien, testen

View File

@@ -6,7 +6,7 @@ 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.
/// danger | "Gefahr"
/// danger | Gefahr
Dies ist eine „fortgeschrittene“ Funktion.
@@ -30,7 +30,7 @@ Und eine `APIRoute`-Unterklasse zur Verwendung dieser benutzerdefinierten Reques
### 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.
@@ -42,9 +42,7 @@ Wenn der Header kein `gzip` enthält, wird nicht versucht, den Body zu dekomprim
Auf diese Weise kann dieselbe Routenklasse gzip-komprimierte oder unkomprimierte Requests verarbeiten.
```Python hl_lines="8-15"
{!../../../docs_src/custom_request_and_route/tutorial001.py!}
```
{* ../../docs_src/custom_request_and_route/tutorial001.py hl[8:15] *}
### Eine benutzerdefinierte `GzipRoute`-Klasse erstellen
@@ -56,11 +54,9 @@ Diese Methode gibt eine Funktion zurück. Und diese Funktion empfängt einen Req
Hier verwenden wir sie, um aus dem ursprünglichen Request einen `GzipRequest` zu erstellen.
```Python hl_lines="18-26"
{!../../../docs_src/custom_request_and_route/tutorial001.py!}
```
{* ../../docs_src/custom_request_and_route/tutorial001.py hl[18:26] *}
/// 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.
@@ -84,7 +80,7 @@ Aufgrund unserer Änderungen in `GzipRequest.body` wird der Requestbody jedoch b
## 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}).
@@ -96,26 +92,18 @@ Wir können denselben Ansatz auch verwenden, um in einem Exceptionhandler auf de
Alles, was wir tun müssen, ist, den Request innerhalb eines `try`/`except`-Blocks zu handhaben:
```Python hl_lines="13 15"
{!../../../docs_src/custom_request_and_route/tutorial002.py!}
```
{* ../../docs_src/custom_request_and_route/tutorial002.py hl[13,15] *}
Wenn eine Exception auftritt, befindet sich die `Request`-Instanz weiterhin im Gültigkeitsbereich, sodass wir den Requestbody lesen und bei der Fehlerbehandlung verwenden können:
```Python hl_lines="16-18"
{!../../../docs_src/custom_request_and_route/tutorial002.py!}
```
{* ../../docs_src/custom_request_and_route/tutorial002.py hl[16:18] *}
## Benutzerdefinierte `APIRoute`-Klasse in einem Router
Sie können auch den Parameter `route_class` eines `APIRouter` festlegen:
```Python hl_lines="26"
{!../../../docs_src/custom_request_and_route/tutorial003.py!}
```
{* ../../docs_src/custom_request_and_route/tutorial003.py hl[26] *}
In diesem Beispiel verwenden die *Pfadoperationen* unter dem `router` die benutzerdefinierte `TimedRoute`-Klasse und haben in der Response einen zusätzlichen `X-Response-Time`-Header mit der Zeit, die zum Generieren der Response benötigt wurde:
```Python hl_lines="13-20"
{!../../../docs_src/custom_request_and_route/tutorial003.py!}
```
{* ../../docs_src/custom_request_and_route/tutorial003.py hl[13:20] *}

View File

@@ -43,25 +43,19 @@ Fügen wir beispielsweise <a href="https://github.com/Rebilly/ReDoc/blob/master/
Schreiben Sie zunächst wie gewohnt Ihre ganze **FastAPI**-Anwendung:
```Python hl_lines="1 4 7-9"
{!../../../docs_src/extending_openapi/tutorial001.py!}
```
{* ../../docs_src/extending_openapi/tutorial001.py hl[1,4,7:9] *}
### Das OpenAPI-Schema generieren
Verwenden Sie dann dieselbe Hilfsfunktion, um das OpenAPI-Schema innerhalb einer `custom_openapi()`-Funktion zu generieren:
```Python hl_lines="2 15-21"
{!../../../docs_src/extending_openapi/tutorial001.py!}
```
{* ../../docs_src/extending_openapi/tutorial001.py hl[2,15:21] *}
### Das OpenAPI-Schema ändern
Jetzt können Sie die ReDoc-Erweiterung hinzufügen und dem `info`-„Objekt“ im OpenAPI-Schema ein benutzerdefiniertes `x-logo` hinzufügen:
```Python hl_lines="22-24"
{!../../../docs_src/extending_openapi/tutorial001.py!}
```
{* ../../docs_src/extending_openapi/tutorial001.py hl[22:24] *}
### Zwischenspeichern des OpenAPI-Schemas
@@ -71,17 +65,13 @@ Auf diese Weise muss Ihre Anwendung das Schema nicht jedes Mal generieren, wenn
Es wird nur einmal generiert und dann wird dasselbe zwischengespeicherte Schema für die nächsten Requests verwendet.
```Python hl_lines="13-14 25-26"
{!../../../docs_src/extending_openapi/tutorial001.py!}
```
{* ../../docs_src/extending_openapi/tutorial001.py hl[13:14,25:26] *}
### Die Methode überschreiben
Jetzt können Sie die Methode `.openapi()` durch Ihre neue Funktion ersetzen.
```Python hl_lines="29"
{!../../../docs_src/extending_openapi/tutorial001.py!}
```
{* ../../docs_src/extending_openapi/tutorial001.py hl[29] *}
### Testen

View File

@@ -4,7 +4,7 @@ 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.
/// tip | "Tipp"
/// tip | Tipp
**GraphQL** löst einige sehr spezifische Anwendungsfälle.
@@ -35,9 +35,7 @@ Abhängig von Ihrem Anwendungsfall bevorzugen Sie vielleicht eine andere Bibliot
Hier ist eine kleine Vorschau, wie Sie Strawberry mit FastAPI integrieren können:
```Python hl_lines="3 22 25-26"
{!../../../docs_src/graphql/tutorial001.py!}
```
{* ../../docs_src/graphql/tutorial001.py hl[3,22,25:26] *}
Weitere Informationen zu Strawberry finden Sie in der <a href="https://strawberry.rocks/" class="external-link" target="_blank">Strawberry-Dokumentation</a>.
@@ -49,7 +47,7 @@ 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.
/// 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.

View File

@@ -6,7 +6,7 @@ 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.
/// 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}.

View File

@@ -10,123 +10,13 @@ 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:
//// tab | Python 3.10+
```Python hl_lines="7"
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py[ln:1-7]!}
# Code unterhalb weggelassen 👇
```
<details>
<summary>👀 Vollständige Dateivorschau</summary>
```Python
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py!}
```
</details>
////
//// tab | Python 3.9+
```Python hl_lines="9"
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py[ln:1-9]!}
# Code unterhalb weggelassen 👇
```
<details>
<summary>👀 Vollständige Dateivorschau</summary>
```Python
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py!}
```
</details>
////
//// tab | Python 3.8+
```Python hl_lines="9"
{!> ../../../docs_src/separate_openapi_schemas/tutorial001.py[ln:1-9]!}
# Code unterhalb weggelassen 👇
```
<details>
<summary>👀 Vollständige Dateivorschau</summary>
```Python
{!> ../../../docs_src/separate_openapi_schemas/tutorial001.py!}
```
</details>
////
{* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py ln[1:7] hl[7] *}
### Modell für Eingabe
Wenn Sie dieses Modell wie hier als Eingabe verwenden:
//// tab | Python 3.10+
```Python hl_lines="14"
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py[ln:1-15]!}
# Code unterhalb weggelassen 👇
```
<details>
<summary>👀 Vollständige Dateivorschau</summary>
```Python
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py!}
```
</details>
////
//// tab | Python 3.9+
```Python hl_lines="16"
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py[ln:1-17]!}
# Code unterhalb weggelassen 👇
```
<details>
<summary>👀 Vollständige Dateivorschau</summary>
```Python
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py!}
```
</details>
////
//// tab | Python 3.8+
```Python hl_lines="16"
{!> ../../../docs_src/separate_openapi_schemas/tutorial001.py[ln:1-17]!}
# Code unterhalb weggelassen 👇
```
<details>
<summary>👀 Vollständige Dateivorschau</summary>
```Python
{!> ../../../docs_src/separate_openapi_schemas/tutorial001.py!}
```
</details>
////
{* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py ln[1:15] hl[14] *}
... dann ist das Feld `description` **nicht erforderlich**. Weil es den Defaultwert `None` hat.
@@ -142,29 +32,7 @@ Sie können überprüfen, dass das Feld `description` in der Dokumentation kein
Wenn Sie jedoch dasselbe Modell als Ausgabe verwenden, wie hier:
//// tab | Python 3.10+
```Python hl_lines="19"
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="21"
{!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="21"
{!> ../../../docs_src/separate_openapi_schemas/tutorial001.py!}
```
////
{* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py hl[19] *}
... dann, weil `description` einen Defaultwert hat, wird es, wenn Sie für dieses Feld **nichts zurückgeben**, immer noch diesen **Defaultwert** haben.
@@ -223,29 +91,7 @@ Unterstützung für `separate_input_output_schemas` wurde in FastAPI `0.102.0` h
///
//// tab | Python 3.10+
```Python hl_lines="10"
{!> ../../../docs_src/separate_openapi_schemas/tutorial002_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="12"
{!> ../../../docs_src/separate_openapi_schemas/tutorial002_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="12"
{!> ../../../docs_src/separate_openapi_schemas/tutorial002.py!}
```
////
{* ../../docs_src/separate_openapi_schemas/tutorial002_py310.py hl[10] *}
### Gleiches Schema für Eingabe- und Ausgabemodelle in der Dokumentation

View File

@@ -94,7 +94,7 @@ Seine Schlüssel-Merkmale sind:
„_Ehrlich, was Du gebaut hast, sieht super solide und poliert aus. In vielerlei Hinsicht ist es so, wie ich **Hug** haben wollte es ist wirklich inspirierend, jemanden so etwas bauen zu sehen._“
<div style="text-align: right; margin-right: 10%;">Timothy Crosley - <strong>Autor von <a href="https://www.hug.rest/" target="_blank">Hug</a></strong> <a href="https://news.ycombinator.com/item?id=19455465" target="_blank"><small>(Ref)</small></a></div>
<div style="text-align: right; margin-right: 10%;">Timothy Crosley - <strong>Autor von <a href="https://github.com/hugapi/hug" target="_blank">Hug</a></strong> <a href="https://news.ycombinator.com/item?id=19455465" target="_blank"><small>(Ref)</small></a></div>
---

View File

@@ -12,7 +12,7 @@ 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.
/// 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.
@@ -22,9 +22,7 @@ Wenn Sie ein Python-Experte sind und bereits alles über Typhinweise wissen, üb
Fangen wir mit einem einfachen Beispiel an:
```Python
{!../../../docs_src/python_types/tutorial001.py!}
```
{* ../../docs_src/python_types/tutorial001.py *}
Dieses Programm gibt aus:
@@ -38,9 +36,7 @@ Die Funktion macht Folgendes:
* Schreibt den ersten Buchstaben eines jeden Wortes groß, mithilfe von `title()`.
* <abbr title="Füge zu einer Einheit zusammen, eins nach dem anderen.">Verkettet</abbr> sie mit einem Leerzeichen in der Mitte.
```Python hl_lines="2"
{!../../../docs_src/python_types/tutorial001.py!}
```
{* ../../docs_src/python_types/tutorial001.py hl[2] *}
### Bearbeiten Sie es
@@ -82,9 +78,7 @@ Das war's.
Das sind die „Typhinweise“:
```Python hl_lines="1"
{!../../../docs_src/python_types/tutorial002.py!}
```
{* ../../docs_src/python_types/tutorial002.py hl[1] *}
Das ist nicht das gleiche wie das Deklarieren von Defaultwerten, wie es hier der Fall ist:
@@ -112,9 +106,7 @@ Hier können Sie durch die Optionen blättern, bis Sie diejenige finden, bei der
Sehen Sie sich diese Funktion an, sie hat bereits Typhinweise:
```Python hl_lines="1"
{!../../../docs_src/python_types/tutorial003.py!}
```
{* ../../docs_src/python_types/tutorial003.py hl[1] *}
Da der Editor die Typen der Variablen kennt, erhalten Sie nicht nur Code-Vervollständigung, sondern auch eine Fehlerprüfung:
@@ -122,9 +114,7 @@ Da der Editor die Typen der Variablen kennt, erhalten Sie nicht nur Code-Vervoll
Jetzt, da Sie wissen, dass Sie das reparieren müssen, konvertieren Sie `age` mittels `str(age)` in einen String:
```Python hl_lines="2"
{!../../../docs_src/python_types/tutorial004.py!}
```
{* ../../docs_src/python_types/tutorial004.py hl[2] *}
## Deklarieren von Typen
@@ -143,9 +133,7 @@ Zum Beispiel diese:
* `bool`
* `bytes`
```Python hl_lines="1"
{!../../../docs_src/python_types/tutorial005.py!}
```
{* ../../docs_src/python_types/tutorial005.py hl[1] *}
### Generische Typen mit Typ-Parametern
@@ -182,7 +170,7 @@ Als Typ nehmen Sie `list`.
Da die Liste ein Typ ist, welcher innere Typen enthält, werden diese von eckigen Klammern umfasst:
```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial006_py39.py!}
{!> ../../docs_src/python_types/tutorial006_py39.py!}
```
////
@@ -192,7 +180,7 @@ Da die Liste ein Typ ist, welcher innere Typen enthält, werden diese von eckige
Von `typing` importieren Sie `List` (mit Großbuchstaben `L`):
```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial006.py!}
{!> ../../docs_src/python_types/tutorial006.py!}
```
Deklarieren Sie die Variable mit der gleichen Doppelpunkt-Syntax (`:`).
@@ -202,12 +190,12 @@ 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:
```Python hl_lines="4"
{!> ../../../docs_src/python_types/tutorial006.py!}
{!> ../../docs_src/python_types/tutorial006.py!}
```
////
/// tip | "Tipp"
/// tip | Tipp
Die inneren Typen in den eckigen Klammern werden als „Typ-Parameter“ bezeichnet.
@@ -217,7 +205,7 @@ In diesem Fall ist `str` der Typ-Parameter, der an `List` übergeben wird (oder
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.
@@ -240,7 +228,7 @@ Das Gleiche gilt für die Deklaration eines Tupels `tuple` und einer Men
//// tab | Python 3.9+
```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial007_py39.py!}
{!> ../../docs_src/python_types/tutorial007_py39.py!}
```
////
@@ -248,7 +236,7 @@ Das Gleiche gilt für die Deklaration eines Tupels `tuple` und einer Men
//// tab | Python 3.8+
```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial007.py!}
{!> ../../docs_src/python_types/tutorial007.py!}
```
////
@@ -269,7 +257,7 @@ Der zweite Typ-Parameter ist für die Werte des `dict`:
//// tab | Python 3.9+
```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial008_py39.py!}
{!> ../../docs_src/python_types/tutorial008_py39.py!}
```
////
@@ -277,7 +265,7 @@ Der zweite Typ-Parameter ist für die Werte des `dict`:
//// tab | Python 3.8+
```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial008.py!}
{!> ../../docs_src/python_types/tutorial008.py!}
```
////
@@ -299,7 +287,7 @@ In Python 3.10 gibt es zusätzlich eine **neue Syntax**, die es erlaubt, die mö
//// tab | Python 3.10+
```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial008b_py310.py!}
{!> ../../docs_src/python_types/tutorial008b_py310.py!}
```
////
@@ -307,7 +295,7 @@ In Python 3.10 gibt es zusätzlich eine **neue Syntax**, die es erlaubt, die mö
//// tab | Python 3.8+
```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial008b.py!}
{!> ../../docs_src/python_types/tutorial008b.py!}
```
////
@@ -320,9 +308,7 @@ Sie können deklarieren, dass ein Wert ein `str`, aber vielleicht auch `None` se
In Python 3.6 und darüber (inklusive Python 3.10) können Sie das deklarieren, indem Sie `Optional` vom `typing` Modul importieren und verwenden.
```Python hl_lines="1 4"
{!../../../docs_src/python_types/tutorial009.py!}
```
{* ../../docs_src/python_types/tutorial009.py hl[1,4] *}
Wenn Sie `Optional[str]` anstelle von nur `str` verwenden, wird Ihr Editor Ihnen dabei helfen, Fehler zu erkennen, bei denen Sie annehmen könnten, dass ein Wert immer eine String (`str`) ist, obwohl er auch `None` sein könnte.
@@ -333,7 +319,7 @@ Das bedeutet auch, dass Sie in Python 3.10 `Something | None` verwenden können:
//// tab | Python 3.10+
```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial009_py310.py!}
{!> ../../docs_src/python_types/tutorial009_py310.py!}
```
////
@@ -341,7 +327,7 @@ Das bedeutet auch, dass Sie in Python 3.10 `Something | None` verwenden können:
//// tab | Python 3.8+
```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial009.py!}
{!> ../../docs_src/python_types/tutorial009.py!}
```
////
@@ -349,7 +335,7 @@ Das bedeutet auch, dass Sie in Python 3.10 `Something | None` verwenden können:
//// tab | Python 3.8+ Alternative
```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial009b.py!}
{!> ../../docs_src/python_types/tutorial009b.py!}
```
////
@@ -369,9 +355,7 @@ Es geht nur um Wörter und Namen. Aber diese Worte können beeinflussen, wie Sie
Nehmen wir zum Beispiel diese Funktion:
```Python hl_lines="1 4"
{!../../../docs_src/python_types/tutorial009c.py!}
```
{* ../../docs_src/python_types/tutorial009c.py hl[1,4] *}
Der Parameter `name` ist definiert als `Optional[str]`, aber er ist **nicht optional**, Sie können die Funktion nicht ohne diesen Parameter aufrufen:
@@ -387,9 +371,7 @@ say_hi(name=None) # Das funktioniert, None is gültig 🎉
Die gute Nachricht ist, dass Sie sich darüber keine Sorgen mehr machen müssen, wenn Sie Python 3.10 verwenden, da Sie einfach `|` verwenden können, um Vereinigungen von Typen zu definieren:
```Python hl_lines="1 4"
{!../../../docs_src/python_types/tutorial009c_py310.py!}
```
{* ../../docs_src/python_types/tutorial009c_py310.py hl[1,4] *}
Und dann müssen Sie sich nicht mehr um Namen wie `Optional` und `Union` kümmern. 😎
@@ -451,15 +433,11 @@ Sie können auch eine Klasse als Typ einer Variablen deklarieren.
Nehmen wir an, Sie haben eine Klasse `Person`, mit einem Namen:
```Python hl_lines="1-3"
{!../../../docs_src/python_types/tutorial010.py!}
```
{* ../../docs_src/python_types/tutorial010.py hl[1:3] *}
Dann können Sie eine Variable vom Typ `Person` deklarieren:
```Python hl_lines="6"
{!../../../docs_src/python_types/tutorial010.py!}
```
{* ../../docs_src/python_types/tutorial010.py hl[6] *}
Und wiederum bekommen Sie die volle Editor-Unterstützung:
@@ -486,7 +464,7 @@ Ein Beispiel aus der offiziellen Pydantic Dokumentation:
//// tab | Python 3.10+
```Python
{!> ../../../docs_src/python_types/tutorial011_py310.py!}
{!> ../../docs_src/python_types/tutorial011_py310.py!}
```
////
@@ -494,7 +472,7 @@ Ein Beispiel aus der offiziellen Pydantic Dokumentation:
//// tab | Python 3.9+
```Python
{!> ../../../docs_src/python_types/tutorial011_py39.py!}
{!> ../../docs_src/python_types/tutorial011_py39.py!}
```
////
@@ -502,7 +480,7 @@ Ein Beispiel aus der offiziellen Pydantic Dokumentation:
//// tab | Python 3.8+
```Python
{!> ../../../docs_src/python_types/tutorial011.py!}
{!> ../../docs_src/python_types/tutorial011.py!}
```
////
@@ -517,7 +495,7 @@ Um mehr über <a href="https://pydantic-docs.helpmanual.io/" class="external-lin
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.
@@ -532,7 +510,7 @@ Python bietet auch die Möglichkeit, **zusätzliche Metadaten** in Typhinweisen
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!}
{!> ../../docs_src/python_types/tutorial013_py39.py!}
```
////
@@ -544,7 +522,7 @@ In Versionen niedriger als Python 3.9 importieren Sie `Annotated` von `typing_ex
Es wird bereits mit **FastAPI** installiert sein.
```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial013.py!}
{!> ../../docs_src/python_types/tutorial013.py!}
```
////
@@ -559,7 +537,7 @@ 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.
/// 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. ✨

View File

@@ -15,9 +15,7 @@ Hierzu zählen beispielsweise:
Importieren Sie zunächst `BackgroundTasks` und definieren Sie einen Parameter in Ihrer *Pfadoperation-Funktion* mit der Typdeklaration `BackgroundTasks`:
```Python hl_lines="1 13"
{!../../../docs_src/background_tasks/tutorial001.py!}
```
{* ../../docs_src/background_tasks/tutorial001.py hl[1,13] *}
**FastAPI** erstellt für Sie das Objekt vom Typ `BackgroundTasks` und übergibt es als diesen Parameter.
@@ -33,17 +31,13 @@ In diesem Fall schreibt die Taskfunktion in eine Datei (den Versand einer E-Mail
Und da der Schreibvorgang nicht `async` und `await` verwendet, definieren wir die Funktion mit normalem `def`:
```Python hl_lines="6-9"
{!../../../docs_src/background_tasks/tutorial001.py!}
```
{* ../../docs_src/background_tasks/tutorial001.py hl[6:9] *}
## Den Hintergrundtask hinzufügen
Übergeben Sie innerhalb Ihrer *Pfadoperation-Funktion* Ihre Taskfunktion mit der Methode `.add_task()` an das *Hintergrundtasks*-Objekt:
```Python hl_lines="14"
{!../../../docs_src/background_tasks/tutorial001.py!}
```
{* ../../docs_src/background_tasks/tutorial001.py hl[14] *}
`.add_task()` erhält als Argumente:
@@ -57,57 +51,7 @@ 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:
//// tab | Python 3.10+
```Python hl_lines="13 15 22 25"
{!> ../../../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 hl_lines="14 16 23 26"
{!> ../../../docs_src/background_tasks/tutorial002_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="11 13 20 23"
{!> ../../../docs_src/background_tasks/tutorial002_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="13 15 22 25"
{!> ../../../docs_src/background_tasks/tutorial002.py!}
```
////
{* ../../docs_src/background_tasks/tutorial002_an_py310.py hl[13,15,22,25] *}
In obigem Beispiel werden die Nachrichten, *nachdem* die Response gesendet wurde, in die Datei `log.txt` geschrieben.
@@ -133,8 +77,6 @@ Wenn Sie umfangreiche Hintergrundberechnungen durchführen müssen und diese nic
Sie erfordern in der Regel komplexere Konfigurationen und einen Nachrichten-/Job-Queue-Manager wie RabbitMQ oder Redis, ermöglichen Ihnen jedoch die Ausführung von Hintergrundtasks in mehreren Prozessen und insbesondere auf mehreren Servern.
Um ein Beispiel zu sehen, sehen Sie sich die [Projektgeneratoren](../project-generation.md){.internal-link target=_blank} an. Sie alle enthalten Celery, bereits konfiguriert.
Wenn Sie jedoch über dieselbe **FastAPI**-Anwendung auf Variablen und Objekte zugreifen oder kleine Hintergrundtasks ausführen müssen (z. B. das Senden einer E-Mail-Benachrichtigung), können Sie einfach `BackgroundTasks` verwenden.
## Zusammenfassung

View File

@@ -29,7 +29,7 @@ Nehmen wir an, Sie haben eine Dateistruktur wie diese:
│   └── admin.py
```
/// tip | "Tipp"
/// tip | Tipp
Es gibt mehrere `__init__.py`-Dateien: eine in jedem Verzeichnis oder Unterverzeichnis.
@@ -86,7 +86,7 @@ Sie können die *Pfadoperationen* für dieses Modul mit `APIRouter` erstellen.
Sie importieren ihn und erstellen eine „Instanz“ auf die gleiche Weise wie mit der Klasse `FastAPI`:
```Python hl_lines="1 3" title="app/routers/users.py"
{!../../../docs_src/bigger_applications/app/routers/users.py!}
{!../../docs_src/bigger_applications/app/routers/users.py!}
```
### *Pfadoperationen* mit `APIRouter`
@@ -96,7 +96,7 @@ Und dann verwenden Sie ihn, um Ihre *Pfadoperationen* zu deklarieren.
Verwenden Sie ihn auf die gleiche Weise wie die Klasse `FastAPI`:
```Python hl_lines="6 11 16" title="app/routers/users.py"
{!../../../docs_src/bigger_applications/app/routers/users.py!}
{!../../docs_src/bigger_applications/app/routers/users.py!}
```
Sie können sich `APIRouter` als eine „Mini-`FastAPI`“-Klasse vorstellen.
@@ -105,7 +105,7 @@ Alle die gleichen Optionen werden unterstützt.
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.
@@ -124,7 +124,7 @@ Wir werden nun eine einfache Abhängigkeit verwenden, um einen benutzerdefiniert
//// tab | Python 3.9+
```Python hl_lines="3 6-8" title="app/dependencies.py"
{!> ../../../docs_src/bigger_applications/app_an_py39/dependencies.py!}
{!> ../../docs_src/bigger_applications/app_an_py39/dependencies.py!}
```
////
@@ -132,26 +132,26 @@ Wir werden nun eine einfache Abhängigkeit verwenden, um einen benutzerdefiniert
//// tab | Python 3.8+
```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!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
/// tip | Tipp
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="1 4-6" title="app/dependencies.py"
{!> ../../../docs_src/bigger_applications/app/dependencies.py!}
{!> ../../docs_src/bigger_applications/app/dependencies.py!}
```
////
/// tip | "Tipp"
/// tip | Tipp
Um dieses Beispiel zu vereinfachen, verwenden wir einen erfundenen Header.
@@ -182,7 +182,7 @@ Wir wissen, dass alle *Pfadoperationen* in diesem Modul folgendes haben:
Anstatt also alles zu jeder *Pfadoperation* hinzuzufügen, können wir es dem `APIRouter` hinzufügen.
```Python hl_lines="5-10 16 21" title="app/routers/items.py"
{!../../../docs_src/bigger_applications/app/routers/items.py!}
{!../../docs_src/bigger_applications/app/routers/items.py!}
```
Da der Pfad jeder *Pfadoperation* mit `/` beginnen muss, wie in:
@@ -201,7 +201,7 @@ 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.
/// 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.
@@ -222,7 +222,7 @@ 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.
* 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.
@@ -243,12 +243,12 @@ Und wir müssen die Abhängigkeitsfunktion aus dem Modul `app.dependencies` impo
Daher verwenden wir einen relativen Import mit `..` für die Abhängigkeiten:
```Python hl_lines="3" title="app/routers/items.py"
{!../../../docs_src/bigger_applications/app/routers/items.py!}
{!../../docs_src/bigger_applications/app/routers/items.py!}
```
#### Wie relative Importe funktionieren
/// tip | "Tipp"
/// tip | Tipp
Wenn Sie genau wissen, wie Importe funktionieren, fahren Sie mit dem nächsten Abschnitt unten fort.
@@ -316,10 +316,10 @@ Wir fügen weder das Präfix `/items` noch `tags=["items"]` zu jeder *Pfadoperat
Aber wir können immer noch _mehr_ `tags` hinzufügen, die auf eine bestimmte *Pfadoperation* angewendet werden, sowie einige zusätzliche `responses`, die speziell für diese *Pfadoperation* gelten:
```Python hl_lines="30-31" title="app/routers/items.py"
{!../../../docs_src/bigger_applications/app/routers/items.py!}
{!../../docs_src/bigger_applications/app/routers/items.py!}
```
/// tip | "Tipp"
/// tip | Tipp
Diese letzte Pfadoperation wird eine Kombination von Tags haben: `["items", "custom"]`.
@@ -344,7 +344,7 @@ Sie importieren und erstellen wie gewohnt eine `FastAPI`-Klasse.
Und wir können sogar [globale Abhängigkeiten](dependencies/global-dependencies.md){.internal-link target=_blank} deklarieren, die mit den Abhängigkeiten für jeden `APIRouter` kombiniert werden:
```Python hl_lines="1 3 7" title="app/main.py"
{!../../../docs_src/bigger_applications/app/main.py!}
{!../../docs_src/bigger_applications/app/main.py!}
```
### Den `APIRouter` importieren
@@ -352,7 +352,7 @@ Und wir können sogar [globale Abhängigkeiten](dependencies/global-dependencies
Jetzt importieren wir die anderen Submodule, die `APIRouter` haben:
```Python hl_lines="4-5" title="app/main.py"
{!../../../docs_src/bigger_applications/app/main.py!}
{!../../docs_src/bigger_applications/app/main.py!}
```
Da es sich bei den Dateien `app/routers/users.py` und `app/routers/items.py` um Submodule handelt, die Teil desselben Python-Packages `app` sind, können wir einen einzelnen Punkt `.` verwenden, um sie mit „relativen Imports“ zu importieren.
@@ -417,7 +417,7 @@ würde der `router` von `users` den von `items` überschreiben und wir könnten
Um also beide in derselben Datei verwenden zu können, importieren wir die Submodule direkt:
```Python hl_lines="5" title="app/main.py"
{!../../../docs_src/bigger_applications/app/main.py!}
{!../../docs_src/bigger_applications/app/main.py!}
```
@@ -426,7 +426,7 @@ Um also beide in derselben Datei verwenden zu können, importieren wir die Submo
Inkludieren wir nun die `router` aus diesen Submodulen `users` und `items`:
```Python hl_lines="10-11" title="app/main.py"
{!../../../docs_src/bigger_applications/app/main.py!}
{!../../docs_src/bigger_applications/app/main.py!}
```
/// info
@@ -441,7 +441,7 @@ Mit `app.include_router()` können wir jeden `APIRouter` zur Hauptanwendung `Fas
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.
@@ -468,7 +468,7 @@ Sie enthält einen `APIRouter` mit einigen administrativen *Pfadoperationen*, di
In diesem Beispiel wird es ganz einfach sein. Nehmen wir jedoch an, dass wir, da sie mit anderen Projekten in der Organisation geteilt wird, sie nicht ändern und kein `prefix`, `dependencies`, `tags`, usw. direkt zum `APIRouter` hinzufügen können:
```Python hl_lines="3" title="app/internal/admin.py"
{!../../../docs_src/bigger_applications/app/internal/admin.py!}
{!../../docs_src/bigger_applications/app/internal/admin.py!}
```
Aber wir möchten immer noch ein benutzerdefiniertes `prefix` festlegen, wenn wir den `APIRouter` einbinden, sodass alle seine *Pfadoperationen* mit `/admin` beginnen, wir möchten es mit den `dependencies` sichern, die wir bereits für dieses Projekt haben, und wir möchten `tags` und `responses` hinzufügen.
@@ -476,7 +476,7 @@ Aber wir möchten immer noch ein benutzerdefiniertes `prefix` festlegen, wenn wi
Wir können das alles deklarieren, ohne den ursprünglichen `APIRouter` ändern zu müssen, indem wir diese Parameter an `app.include_router()` übergeben:
```Python hl_lines="14-17" title="app/main.py"
{!../../../docs_src/bigger_applications/app/main.py!}
{!../../docs_src/bigger_applications/app/main.py!}
```
Auf diese Weise bleibt der ursprüngliche `APIRouter` unverändert, sodass wir dieselbe `app/internal/admin.py`-Datei weiterhin mit anderen Projekten in der Organisation teilen können.
@@ -499,12 +499,12 @@ Wir können *Pfadoperationen* auch direkt zur `FastAPI`-App hinzufügen.
Hier machen wir es ... nur um zu zeigen, dass wir es können 🤷:
```Python hl_lines="21-23" title="app/main.py"
{!../../../docs_src/bigger_applications/app/main.py!}
{!../../docs_src/bigger_applications/app/main.py!}
```
und es wird korrekt funktionieren, zusammen mit allen anderen *Pfadoperationen*, die mit `app.include_router()` hinzugefügt wurden.
/// info | "Sehr technische Details"
/// info | Sehr technische Details
**Hinweis**: Dies ist ein sehr technisches Detail, das Sie wahrscheinlich **einfach überspringen** können.

View File

@@ -6,59 +6,9 @@ So wie Sie zusätzliche Validation und Metadaten in Parametern der **Pfadoperati
Importieren Sie es zuerst:
//// tab | Python 3.10+
{* ../../docs_src/body_fields/tutorial001_an_py310.py hl[4] *}
```Python hl_lines="4"
{!> ../../../docs_src/body_fields/tutorial001_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="4"
{!> ../../../docs_src/body_fields/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="4"
{!> ../../../docs_src/body_fields/tutorial001_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```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"
/// warning | Achtung
Beachten Sie, dass `Field` direkt von `pydantic` importiert wird, nicht von `fastapi`, wie die anderen (`Query`, `Path`, `Body`, usw.)
@@ -68,61 +18,11 @@ Beachten Sie, dass `Field` direkt von `pydantic` importiert wird, nicht von `fas
Dann können Sie `Field` mit Modellattributen deklarieren:
//// tab | Python 3.10+
```Python hl_lines="11-14"
{!> ../../../docs_src/body_fields/tutorial001_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="11-14"
{!> ../../../docs_src/body_fields/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="12-15"
{!> ../../../docs_src/body_fields/tutorial001_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="9-12"
{!> ../../../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!}
```
////
{* ../../docs_src/body_fields/tutorial001_an_py310.py hl[11:14] *}
`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.
@@ -134,7 +34,7 @@ Denken Sie daran, dass `Query`, `Path` und andere von `fastapi` tatsächlich Fun
///
/// tip | "Tipp"
/// tip | Tipp
Beachten Sie, dass jedes Modellattribut mit einem Typ, Defaultwert und `Field` die gleiche Struktur hat wie ein Parameter einer Pfadoperation-Funktion, nur mit `Field` statt `Path`, `Query`, `Body`.
@@ -146,7 +46,7 @@ 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.
/// 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.

View File

@@ -8,59 +8,9 @@ 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:
//// tab | Python 3.10+
{* ../../docs_src/body_multiple_params/tutorial001_an_py310.py hl[18:20] *}
```Python hl_lines="18-20"
{!> ../../../docs_src/body_multiple_params/tutorial001_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="18-20"
{!> ../../../docs_src/body_multiple_params/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="19-21"
{!> ../../../docs_src/body_multiple_params/tutorial001_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="17-19"
{!> ../../../docs_src/body_multiple_params/tutorial001_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="19-21"
{!> ../../../docs_src/body_multiple_params/tutorial001.py!}
```
////
/// note | "Hinweis"
/// note | Hinweis
Beachten Sie, dass in diesem Fall das `item`, welches vom Body genommen wird, optional ist. Da es `None` als Defaultwert hat.
@@ -81,21 +31,7 @@ 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`:
//// tab | Python 3.10+
```Python hl_lines="20"
{!> ../../../docs_src/body_multiple_params/tutorial002_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="22"
{!> ../../../docs_src/body_multiple_params/tutorial002.py!}
```
////
{* ../../docs_src/body_multiple_params/tutorial002_py310.py hl[20] *}
In diesem Fall wird **FastAPI** bemerken, dass es mehr als einen Body-Parameter in der Funktion gibt (zwei Parameter, die Pydantic-Modelle sind).
@@ -116,7 +52,7 @@ 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.
@@ -136,57 +72,7 @@ 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:
//// 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!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="20"
{!> ../../../docs_src/body_multiple_params/tutorial003_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="22"
{!> ../../../docs_src/body_multiple_params/tutorial003.py!}
```
////
{* ../../docs_src/body_multiple_params/tutorial003_an_py310.py hl[23] *}
In diesem Fall erwartet **FastAPI** einen Body wie:
@@ -226,57 +112,7 @@ q: str | None = None
Zum Beispiel:
//// tab | Python 3.10+
```Python hl_lines="27"
{!> ../../../docs_src/body_multiple_params/tutorial004_an_py310.py!}
```
////
//// tab | Python 3.9+
```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!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="25"
{!> ../../../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!}
```
////
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[27] *}
/// info
@@ -298,57 +134,7 @@ item: Item = Body(embed=True)
so wie in:
//// 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
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="15"
{!> ../../../docs_src/body_multiple_params/tutorial005_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="17"
{!> ../../../docs_src/body_multiple_params/tutorial005.py!}
```
////
{* ../../docs_src/body_multiple_params/tutorial005_an_py310.py hl[17] *}
In diesem Fall erwartet **FastAPI** einen Body wie:

View File

@@ -6,21 +6,7 @@ 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.
//// tab | Python 3.10+
```Python hl_lines="12"
{!> ../../../docs_src/body_nested_models/tutorial001_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="14"
{!> ../../../docs_src/body_nested_models/tutorial001.py!}
```
////
{* ../../docs_src/body_nested_models/tutorial001_py310.py hl[12] *}
Das bewirkt, dass `tags` eine Liste ist, wenngleich es nichts über den Typ der Elemente der Liste aussagt.
@@ -34,9 +20,7 @@ In Python 3.9 oder darüber können Sie einfach `list` verwenden, um diese Typan
In Python-Versionen vor 3.9 (3.6 und darüber), müssen Sie zuerst `List` von Pythons Standardmodul `typing` importieren.
```Python hl_lines="1"
{!> ../../../docs_src/body_nested_models/tutorial002.py!}
```
{* ../../docs_src/body_nested_models/tutorial002.py hl[1] *}
### Eine `list`e mit einem Typ-Parameter deklarieren
@@ -65,29 +49,7 @@ 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:
//// tab | Python 3.10+
```Python hl_lines="12"
{!> ../../../docs_src/body_nested_models/tutorial002_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="14"
{!> ../../../docs_src/body_nested_models/tutorial002_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="14"
{!> ../../../docs_src/body_nested_models/tutorial002.py!}
```
////
{* ../../docs_src/body_nested_models/tutorial002_py310.py hl[12] *}
## Set-Typen
@@ -97,29 +59,7 @@ Python hat einen Datentyp speziell für Mengen eindeutiger Dinge: das <abbr titl
Deklarieren wir also `tags` als Set von Strings.
//// tab | Python 3.10+
```Python hl_lines="12"
{!> ../../../docs_src/body_nested_models/tutorial003_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="14"
{!> ../../../docs_src/body_nested_models/tutorial003_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="1 14"
{!> ../../../docs_src/body_nested_models/tutorial003.py!}
```
////
{* ../../docs_src/body_nested_models/tutorial003_py310.py hl[12] *}
Jetzt, selbst wenn Sie einen Request mit duplizierten Daten erhalten, werden diese zu einem Set eindeutiger Dinge konvertiert.
@@ -141,57 +81,13 @@ Alles das beliebig tief verschachtelt.
Wir können zum Beispiel ein `Image`-Modell definieren.
//// tab | Python 3.10+
```Python hl_lines="7-9"
{!> ../../../docs_src/body_nested_models/tutorial004_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="9-11"
{!> ../../../docs_src/body_nested_models/tutorial004_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="9-11"
{!> ../../../docs_src/body_nested_models/tutorial004.py!}
```
////
{* ../../docs_src/body_nested_models/tutorial004_py310.py hl[7:9] *}
### Das Kindmodell als Typ verwenden
Und dann können wir es als Typ eines Attributes verwenden.
//// tab | Python 3.10+
```Python hl_lines="18"
{!> ../../../docs_src/body_nested_models/tutorial004_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="20"
{!> ../../../docs_src/body_nested_models/tutorial004_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="20"
{!> ../../../docs_src/body_nested_models/tutorial004.py!}
```
////
{* ../../docs_src/body_nested_models/tutorial004_py310.py hl[18] *}
Das würde bedeuten, dass **FastAPI** einen Body erwartet wie:
@@ -224,29 +120,7 @@ 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`:
//// tab | Python 3.10+
```Python hl_lines="2 8"
{!> ../../../docs_src/body_nested_models/tutorial005_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="4 10"
{!> ../../../docs_src/body_nested_models/tutorial005_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="4 10"
{!> ../../../docs_src/body_nested_models/tutorial005.py!}
```
////
{* ../../docs_src/body_nested_models/tutorial005_py310.py hl[2,8] *}
Es wird getestet, ob der String eine gültige URL ist, und als solche wird er in JSON Schema / OpenAPI dokumentiert.
@@ -254,29 +128,7 @@ 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:
//// tab | Python 3.10+
```Python hl_lines="18"
{!> ../../../docs_src/body_nested_models/tutorial006_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="20"
{!> ../../../docs_src/body_nested_models/tutorial006_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="20"
{!> ../../../docs_src/body_nested_models/tutorial006.py!}
```
////
{* ../../docs_src/body_nested_models/tutorial006_py310.py hl[18] *}
Das wird einen JSON-Body erwarten (konvertieren, validieren, dokumentieren), wie:
@@ -314,29 +166,7 @@ Beachten Sie, dass der `images`-Schlüssel jetzt eine Liste von Bild-Objekten ha
Sie können beliebig tief verschachtelte Modelle definieren:
//// tab | Python 3.10+
```Python hl_lines="7 12 18 21 25"
{!> ../../../docs_src/body_nested_models/tutorial007_py310.py!}
```
////
//// tab | 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!}
```
////
{* ../../docs_src/body_nested_models/tutorial007_py310.py hl[7,12,18,21,25] *}
/// info
@@ -360,21 +190,7 @@ images: list[Image]
so wie in:
//// tab | Python 3.9+
```Python hl_lines="13"
{!> ../../../docs_src/body_nested_models/tutorial008_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="15"
{!> ../../../docs_src/body_nested_models/tutorial008.py!}
```
////
{* ../../docs_src/body_nested_models/tutorial008_py39.py hl[13] *}
## Editor-Unterstützung überall
@@ -404,23 +220,9 @@ Das schauen wir uns mal an.
Im folgenden Beispiel akzeptieren Sie irgendein `dict`, solange es `int`-Schlüssel und `float`-Werte hat.
//// tab | Python 3.9+
{* ../../docs_src/body_nested_models/tutorial009_py39.py hl[7] *}
```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!}
```
////
/// tip | "Tipp"
/// tip | Tipp
Bedenken Sie, dass JSON nur `str` als Schlüssel unterstützt.

View File

@@ -6,29 +6,7 @@ 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.
//// tab | Python 3.10+
```Python hl_lines="28-33"
{!> ../../../docs_src/body_updates/tutorial001_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="30-35"
{!> ../../../docs_src/body_updates/tutorial001_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="30-35"
{!> ../../../docs_src/body_updates/tutorial001.py!}
```
////
{* ../../docs_src/body_updates/tutorial001_py310.py hl[28:33] *}
`PUT` wird verwendet, um Daten zu empfangen, die die existierenden Daten ersetzen sollen.
@@ -54,7 +32,7 @@ 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.
/// note | "Hinweis"
/// note | Hinweis
`PATCH` wird seltener verwendet und ist weniger bekannt als `PUT`.
@@ -84,29 +62,7 @@ Das wird ein `dict` erstellen, mit nur den Daten, die gesetzt wurden als das `it
Sie können das verwenden, um ein `dict` zu erstellen, das nur die (im Request) gesendeten Daten enthält, ohne Defaultwerte:
//// tab | Python 3.10+
```Python hl_lines="32"
{!> ../../../docs_src/body_updates/tutorial002_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="34"
{!> ../../../docs_src/body_updates/tutorial002_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="34"
{!> ../../../docs_src/body_updates/tutorial002.py!}
```
////
{* ../../docs_src/body_updates/tutorial002_py310.py hl[32] *}
### Pydantics `update`-Parameter verwenden
@@ -122,29 +78,7 @@ Die Beispiele hier verwenden `.copy()` für die Kompatibilität mit Pydantic v1,
Wie in `stored_item_model.model_copy(update=update_data)`:
//// tab | Python 3.10+
```Python hl_lines="33"
{!> ../../../docs_src/body_updates/tutorial002_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="35"
{!> ../../../docs_src/body_updates/tutorial002_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="35"
{!> ../../../docs_src/body_updates/tutorial002.py!}
```
////
{* ../../docs_src/body_updates/tutorial002_py310.py hl[33] *}
### Rekapitulation zum teilweisen Ersetzen
@@ -161,31 +95,9 @@ Zusammengefasst, um Teil-Ersetzungen vorzunehmen:
* Speichern Sie die Daten in Ihrer Datenbank.
* Geben Sie das aktualisierte Modell zurück.
//// tab | Python 3.10+
{* ../../docs_src/body_updates/tutorial002_py310.py hl[28:35] *}
```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!}
```
////
/// tip | "Tipp"
/// tip | Tipp
Sie können tatsächlich die gleiche Technik mit einer HTTP `PUT` Operation verwenden.
@@ -193,7 +105,7 @@ Aber dieses Beispiel verwendet `PATCH`, da dieses für solche Anwendungsfälle g
///
/// note | "Hinweis"
/// note | Hinweis
Beachten Sie, dass das hereinkommende Modell immer noch validiert wird.

View File

@@ -22,21 +22,7 @@ Da aber davon abgeraten wird, zeigt die interaktive Dokumentation mit Swagger-Be
Zuerst müssen Sie `BaseModel` von `pydantic` importieren:
//// tab | Python 3.10+
```Python hl_lines="2"
{!> ../../../docs_src/body/tutorial001_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="4"
{!> ../../../docs_src/body/tutorial001.py!}
```
////
{* ../../docs_src/body/tutorial001_py310.py hl[2] *}
## Erstellen Sie Ihr Datenmodell
@@ -44,21 +30,7 @@ Dann deklarieren Sie Ihr Datenmodell als eine Klasse, die von `BaseModel` erbt.
Verwenden Sie Standard-Python-Typen für die Klassenattribute:
//// tab | Python 3.10+
```Python hl_lines="5-9"
{!> ../../../docs_src/body/tutorial001_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="7-11"
{!> ../../../docs_src/body/tutorial001.py!}
```
////
{* ../../docs_src/body/tutorial001_py310.py hl[5:9] *}
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.
@@ -86,21 +58,7 @@ 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:
//// tab | Python 3.10+
```Python hl_lines="16"
{!> ../../../docs_src/body/tutorial001_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="18"
{!> ../../../docs_src/body/tutorial001.py!}
```
////
{* ../../docs_src/body/tutorial001_py310.py hl[16] *}
... und deklarieren Sie seinen Typ als das Modell, welches Sie erstellt haben, `Item`.
@@ -149,7 +107,7 @@ Aber Sie bekommen die gleiche Editor-Unterstützung in <a href="https://www.jetb
<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.
@@ -167,21 +125,7 @@ Es verbessert die Editor-Unterstützung für Pydantic-Modelle, mit:
Innerhalb der Funktion können Sie alle Attribute des Modells direkt verwenden:
//// tab | Python 3.10+
```Python hl_lines="19"
{!> ../../../docs_src/body/tutorial002_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="21"
{!> ../../../docs_src/body/tutorial002.py!}
```
////
{* ../../docs_src/body/tutorial002_py310.py hl[19] *}
## Requestbody- + Pfad-Parameter
@@ -189,21 +133,7 @@ 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.
//// tab | Python 3.10+
```Python hl_lines="15-16"
{!> ../../../docs_src/body/tutorial003_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="17-18"
{!> ../../../docs_src/body/tutorial003.py!}
```
////
{* ../../docs_src/body/tutorial003_py310.py hl[15:16] *}
## Requestbody- + Pfad- + Query-Parameter
@@ -211,21 +141,7 @@ 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.
//// tab | Python 3.10+
```Python hl_lines="16"
{!> ../../../docs_src/body/tutorial004_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="18"
{!> ../../../docs_src/body/tutorial004.py!}
```
////
{* ../../docs_src/body/tutorial004_py310.py hl[16] *}
Die Funktionsparameter werden wie folgt erkannt:
@@ -233,7 +149,7 @@ 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 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`

View File

@@ -6,57 +6,7 @@ So wie `Query`- und `Path`-Parameter können Sie auch <abbr title='Cookie
Importieren Sie zuerst `Cookie`:
//// tab | Python 3.10+
```Python hl_lines="3"
{!> ../../../docs_src/cookie_params/tutorial001_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="3"
{!> ../../../docs_src/cookie_params/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="3"
{!> ../../../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="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!}
```
////
{* ../../docs_src/cookie_params/tutorial001_an_py310.py hl[3] *}
## `Cookie`-Parameter deklarieren
@@ -64,59 +14,9 @@ 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:
//// tab | Python 3.10+
{* ../../docs_src/cookie_params/tutorial001_an_py310.py hl[9] *}
```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!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="9"
{!> ../../../docs_src/cookie_params/tutorial001.py!}
```
////
/// note | "Technische Details"
/// note | Technische Details
`Cookie` ist eine Schwesterklasse von `Path` und `Query`. Sie erbt von derselben gemeinsamen `Param`-Elternklasse.

View File

@@ -6,57 +6,7 @@ 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:
//// tab | Python 3.10+
```Python hl_lines="9"
{!> ../../../docs_src/dependencies/tutorial001_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="11"
{!> ../../../docs_src/dependencies/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="12"
{!> ../../../docs_src/dependencies/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/dependencies/tutorial001_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="11"
{!> ../../../docs_src/dependencies/tutorial001.py!}
```
////
{* ../../docs_src/dependencies/tutorial001_an_py310.py hl[9] *}
Aber dann haben wir ein `dict` im Parameter `commons` der *Pfadoperation-Funktion*.
@@ -119,165 +69,15 @@ 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:
//// tab | Python 3.10+
```Python hl_lines="11-15"
{!> ../../../docs_src/dependencies/tutorial002_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="11-15"
{!> ../../../docs_src/dependencies/tutorial002_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="12-16"
{!> ../../../docs_src/dependencies/tutorial002_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```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!}
```
////
{* ../../docs_src/dependencies/tutorial002_an_py310.py hl[11:15] *}
Achten Sie auf die Methode `__init__`, die zum Erstellen der Instanz der Klasse verwendet wird:
//// 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!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="10"
{!> ../../../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="12"
{!> ../../../docs_src/dependencies/tutorial002.py!}
```
////
{* ../../docs_src/dependencies/tutorial002_an_py310.py hl[12] *}
... sie hat die gleichen Parameter wie unsere vorherige `common_parameters`:
//// tab | Python 3.10+
```Python hl_lines="8"
{!> ../../../docs_src/dependencies/tutorial001_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="9"
{!> ../../../docs_src/dependencies/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="10"
{!> ../../../docs_src/dependencies/tutorial001_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// 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!}
```
////
{* ../../docs_src/dependencies/tutorial001_an_py310.py hl[8] *}
Diese Parameter werden von **FastAPI** verwendet, um die Abhängigkeit „aufzulösen“.
@@ -293,57 +93,7 @@ In beiden Fällen werden die Daten konvertiert, validiert, im OpenAPI-Schema dok
Jetzt können Sie Ihre Abhängigkeit mithilfe dieser Klasse deklarieren.
//// tab | Python 3.10+
```Python hl_lines="19"
{!> ../../../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!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="17"
{!> ../../../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="19"
{!> ../../../docs_src/dependencies/tutorial002.py!}
```
////
{* ../../docs_src/dependencies/tutorial002_an_py310.py hl[19] *}
**FastAPI** ruft die Klasse `CommonQueryParams` auf. Dadurch wird eine „Instanz“ dieser Klasse erstellt und die Instanz wird als Parameter `commons` an Ihre Funktion überreicht.
@@ -361,7 +111,7 @@ commons: Annotated[CommonQueryParams, Depends(CommonQueryParams)]
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
/// tip | Tipp
Bevorzugen Sie die `Annotated`-Version, falls möglich.
@@ -397,7 +147,7 @@ commons: Annotated[CommonQueryParams, ...
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
/// tip | Tipp
Bevorzugen Sie die `Annotated`-Version, falls möglich.
@@ -423,7 +173,7 @@ commons: Annotated[Any, Depends(CommonQueryParams)]
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
/// tip | Tipp
Bevorzugen Sie die `Annotated`-Version, falls möglich.
@@ -437,57 +187,7 @@ commons = Depends(CommonQueryParams)
... wie in:
//// 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="20"
{!> ../../../docs_src/dependencies/tutorial003_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="17"
{!> ../../../docs_src/dependencies/tutorial003_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="19"
{!> ../../../docs_src/dependencies/tutorial003.py!}
```
////
{* ../../docs_src/dependencies/tutorial003_an_py310.py hl[19] *}
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:
@@ -507,7 +207,7 @@ commons: Annotated[CommonQueryParams, Depends(CommonQueryParams)]
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
/// tip | Tipp
Bevorzugen Sie die `Annotated`-Version, falls möglich.
@@ -535,7 +235,7 @@ commons: Annotated[CommonQueryParams, Depends(CommonQueryParams)]
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
/// tip | Tipp
Bevorzugen Sie die `Annotated`-Version, falls möglich.
@@ -559,7 +259,7 @@ commons: Annotated[CommonQueryParams, Depends()]
//// tab | Python 3.8 nicht annotiert
/// tip | "Tipp"
/// tip | Tipp
Bevorzugen Sie die `Annotated`-Version, falls möglich.
@@ -575,61 +275,11 @@ Sie deklarieren die Abhängigkeit als Typ des Parameters und verwenden `Depends(
Dasselbe Beispiel würde dann so aussehen:
//// 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!}
```
////
//// tab | Python 3.8+
```Python hl_lines="20"
{!> ../../../docs_src/dependencies/tutorial004_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="17"
{!> ../../../docs_src/dependencies/tutorial004_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="19"
{!> ../../../docs_src/dependencies/tutorial004.py!}
```
////
{* ../../docs_src/dependencies/tutorial004_an_py310.py hl[19] *}
... 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.

View File

@@ -14,39 +14,11 @@ Der *Pfadoperation-Dekorator* erhält ein optionales Argument `dependencies`.
Es sollte eine `list`e von `Depends()` sein:
//// tab | Python 3.9+
```Python hl_lines="19"
{!> ../../../docs_src/dependencies/tutorial006_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="18"
{!> ../../../docs_src/dependencies/tutorial006_an.py!}
```
////
//// tab | Python 3.8 nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="17"
{!> ../../../docs_src/dependencies/tutorial006.py!}
```
////
{* ../../docs_src/dependencies/tutorial006_an_py39.py hl[19] *}
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.
@@ -72,69 +44,13 @@ 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:
//// tab | Python 3.9+
```Python hl_lines="8 13"
{!> ../../../docs_src/dependencies/tutorial006_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="7 12"
{!> ../../../docs_src/dependencies/tutorial006_an.py!}
```
////
//// tab | Python 3.8 nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="6 11"
{!> ../../../docs_src/dependencies/tutorial006.py!}
```
////
{* ../../docs_src/dependencies/tutorial006_an_py39.py hl[8,13] *}
### Exceptions auslösen
Die Abhängigkeiten können Exceptions `raise`n, genau wie normale Abhängigkeiten:
//// 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!}
```
////
//// tab | Python 3.8 nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="8 13"
{!> ../../../docs_src/dependencies/tutorial006.py!}
```
////
{* ../../docs_src/dependencies/tutorial006_an_py39.py hl[10,15] *}
### Rückgabewerte
@@ -142,35 +58,7 @@ 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:
//// 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!}
```
////
//// tab | Python 3.8 nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="9 14"
{!> ../../../docs_src/dependencies/tutorial006.py!}
```
////
{* ../../docs_src/dependencies/tutorial006_an_py39.py hl[11,16] *}
## Abhängigkeiten für eine Gruppe von *Pfadoperationen*

View File

@@ -4,13 +4,13 @@ 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.
/// tip | "Tipp"
/// tip | Tipp
Stellen Sie sicher, dass Sie `yield` nur einmal pro Abhängigkeit verwenden.
///
/// note | "Technische Details"
/// note | Technische Details
Jede Funktion, die dekoriert werden kann mit:
@@ -29,23 +29,17 @@ Sie könnten damit beispielsweise eine Datenbanksession erstellen und diese nach
Nur der Code vor und einschließlich der `yield`-Anweisung wird ausgeführt, bevor eine Response erzeugt wird:
```Python hl_lines="2-4"
{!../../../docs_src/dependencies/tutorial007.py!}
```
{* ../../docs_src/dependencies/tutorial007.py hl[2:4] *}
Der ge`yield`ete Wert ist das, was in *Pfadoperationen* und andere Abhängigkeiten eingefügt wird:
```Python hl_lines="4"
{!../../../docs_src/dependencies/tutorial007.py!}
```
{* ../../docs_src/dependencies/tutorial007.py hl[4] *}
Der auf die `yield`-Anweisung folgende Code wird ausgeführt, nachdem die Response gesendet wurde:
```Python hl_lines="5-6"
{!../../../docs_src/dependencies/tutorial007.py!}
```
{* ../../docs_src/dependencies/tutorial007.py hl[5:6] *}
/// tip | "Tipp"
/// tip | Tipp
Sie können `async`hrone oder reguläre Funktionen verwenden.
@@ -63,9 +57,7 @@ Sie können also mit `except SomeException` diese bestimmte Exception innerhalb
Auf die gleiche Weise können Sie `finally` verwenden, um sicherzustellen, dass die Exit-Schritte ausgeführt werden, unabhängig davon, ob eine Exception geworfen wurde oder nicht.
```Python hl_lines="3 5"
{!../../../docs_src/dependencies/tutorial007.py!}
```
{* ../../docs_src/dependencies/tutorial007.py hl[3,5] *}
## Unterabhängigkeiten mit `yield`.
@@ -75,35 +67,7 @@ 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:
//// 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!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="4 12 20"
{!> ../../../docs_src/dependencies/tutorial008.py!}
```
////
{* ../../docs_src/dependencies/tutorial008_an_py39.py hl[6,14,22] *}
Und alle können `yield` verwenden.
@@ -111,35 +75,7 @@ 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.
//// tab | Python 3.9+
```Python hl_lines="18-19 26-27"
{!> ../../../docs_src/dependencies/tutorial008_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="17-18 25-26"
{!> ../../../docs_src/dependencies/tutorial008_an.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="16-17 24-25"
{!> ../../../docs_src/dependencies/tutorial008.py!}
```
////
{* ../../docs_src/dependencies/tutorial008_an_py39.py hl[18:19,26:27] *}
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.
@@ -149,7 +85,7 @@ Sie können beliebige Kombinationen von Abhängigkeiten haben.
**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>.
@@ -163,7 +99,7 @@ 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.
/// 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*.
@@ -171,35 +107,7 @@ Aber es ist für Sie da, wenn Sie es brauchen. 🤓
///
//// tab | Python 3.9+
```Python hl_lines="18-22 31"
{!> ../../../docs_src/dependencies/tutorial008b_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="17-21 30"
{!> ../../../docs_src/dependencies/tutorial008b_an.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="16-20 29"
{!> ../../../docs_src/dependencies/tutorial008b.py!}
```
////
{* ../../docs_src/dependencies/tutorial008b_an_py39.py hl[18:22,31] *}
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.
@@ -250,7 +158,7 @@ Nachdem eine dieser Responses gesendet wurde, kann keine weitere Response gesend
///
/// tip | "Tipp"
/// 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.
@@ -260,7 +168,7 @@ Wenn Sie eine Exception auslösen, wird diese mit yield an die Abhängigkeiten
## 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.
@@ -274,7 +182,7 @@ 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.
/// 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).
@@ -308,7 +216,7 @@ Wenn Sie eine Abhängigkeit mit `yield` erstellen, erstellt **FastAPI** dafür i
### Kontextmanager in Abhängigkeiten mit `yield` verwenden
/// warning | "Achtung"
/// warning | Achtung
Dies ist mehr oder weniger eine „fortgeschrittene“ Idee.
@@ -320,11 +228,9 @@ In Python können Sie Kontextmanager erstellen, indem Sie <a href="https://docs.
Sie können solche auch innerhalb von **FastAPI**-Abhängigkeiten mit `yield` verwenden, indem Sie `with`- oder `async with`-Anweisungen innerhalb der Abhängigkeits-Funktion verwenden:
```Python hl_lines="1-9 13"
{!../../../docs_src/dependencies/tutorial010.py!}
```
{* ../../docs_src/dependencies/tutorial010.py hl[1:9,13] *}
/// tip | "Tipp"
/// tip | Tipp
Andere Möglichkeiten, einen Kontextmanager zu erstellen, sind:

View File

@@ -6,35 +6,7 @@ Bei einigen Anwendungstypen möchten Sie möglicherweise Abhängigkeiten zur ges
In diesem Fall werden sie auf alle *Pfadoperationen* in der Anwendung angewendet:
//// tab | Python 3.9+
```Python hl_lines="16"
{!> ../../../docs_src/dependencies/tutorial012_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="16"
{!> ../../../docs_src/dependencies/tutorial012_an.py!}
```
////
//// tab | Python 3.8 nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="15"
{!> ../../../docs_src/dependencies/tutorial012.py!}
```
////
{* ../../docs_src/dependencies/tutorial012_an_py39.py hl[16] *}
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.

View File

@@ -30,57 +30,7 @@ Aber so können wir uns besser auf die Funktionsweise des **Dependency Injection
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*:
//// tab | Python 3.10+
```Python hl_lines="8-9"
{!> ../../../docs_src/dependencies/tutorial001_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="8-11"
{!> ../../../docs_src/dependencies/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="9-12"
{!> ../../../docs_src/dependencies/tutorial001_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="6-7"
{!> ../../../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="8-11"
{!> ../../../docs_src/dependencies/tutorial001.py!}
```
////
{* ../../docs_src/dependencies/tutorial001_an_py310.py hl[8:9] *}
Das war's schon.
@@ -112,113 +62,13 @@ Bitte [aktualisieren Sie FastAPI](../../deployment/versions.md#upgrade-der-fasta
### `Depends` importieren
//// 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!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="1"
{!> ../../../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="3"
{!> ../../../docs_src/dependencies/tutorial001.py!}
```
////
{* ../../docs_src/dependencies/tutorial001_an_py310.py hl[3] *}
### 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*:
//// tab | Python 3.10+
```Python hl_lines="13 18"
{!> ../../../docs_src/dependencies/tutorial001_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="15 20"
{!> ../../../docs_src/dependencies/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="16 21"
{!> ../../../docs_src/dependencies/tutorial001_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="11 16"
{!> ../../../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!}
```
////
{* ../../docs_src/dependencies/tutorial001_an_py310.py hl[13,18] *}
Obwohl Sie `Depends` in den Parametern Ihrer Funktion genauso verwenden wie `Body`, `Query`, usw., funktioniert `Depends` etwas anders.
@@ -230,7 +80,7 @@ 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*.
/// tip | "Tipp"
/// tip | Tipp
Im nächsten Kapitel erfahren Sie, welche anderen „Dinge“, außer Funktionen, Sie als Abhängigkeiten verwenden können.
@@ -275,31 +125,9 @@ 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:
//// tab | Python 3.10+
{* ../../docs_src/dependencies/tutorial001_02_an_py310.py hl[12,16,21] *}
```Python hl_lines="12 16 21"
{!> ../../../docs_src/dependencies/tutorial001_02_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="14 18 23"
{!> ../../../docs_src/dependencies/tutorial001_02_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="15 19 24"
{!> ../../../docs_src/dependencies/tutorial001_02_an.py!}
```
////
/// tip | "Tipp"
/// tip | Tipp
Das ist schlicht Standard-Python, es wird als „Typalias“ bezeichnet und ist eigentlich nicht **FastAPI**-spezifisch.
@@ -321,7 +149,7 @@ Und Sie können Abhängigkeiten mit `async def` innerhalb normaler `def`-*Pfadop
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.

View File

@@ -10,57 +10,7 @@ Diese können so **tief** verschachtelt sein, wie nötig.
Sie könnten eine erste Abhängigkeit („Dependable“) wie folgt erstellen:
//// tab | Python 3.10+
```Python hl_lines="8-9"
{!> ../../../docs_src/dependencies/tutorial005_an_py310.py!}
```
////
//// tab | Python 3.9+
```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!}
```
////
//// 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!}
```
////
//// tab | Python 3.8 nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="8-9"
{!> ../../../docs_src/dependencies/tutorial005.py!}
```
////
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[8:9] *}
Diese deklariert einen optionalen Abfrageparameter `q` vom Typ `str` und gibt ihn dann einfach zurück.
@@ -70,57 +20,7 @@ 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):
//// 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
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="11"
{!> ../../../docs_src/dependencies/tutorial005_py310.py!}
```
////
//// tab | Python 3.8 nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="13"
{!> ../../../docs_src/dependencies/tutorial005.py!}
```
////
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[13] *}
Betrachten wir die deklarierten Parameter:
@@ -133,57 +33,7 @@ Betrachten wir die deklarierten Parameter:
Diese Abhängigkeit verwenden wir nun wie folgt:
//// 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!}
```
////
//// tab | Python 3.10 nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="19"
{!> ../../../docs_src/dependencies/tutorial005_py310.py!}
```
////
//// tab | Python 3.8 nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="22"
{!> ../../../docs_src/dependencies/tutorial005.py!}
```
////
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[23] *}
/// info
@@ -223,7 +73,7 @@ async def needy_dependency(fresh_value: Annotated[str, Depends(get_value, use_ca
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
/// tip | Tipp
Bevorzugen Sie die `Annotated`-Version, falls möglich.
@@ -244,7 +94,7 @@ 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).
/// tip | "Tipp"
/// tip | Tipp
All dies scheint angesichts dieser einfachen Beispiele möglicherweise nicht so nützlich zu sein.

View File

@@ -20,21 +20,7 @@ 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:
//// tab | Python 3.10+
```Python hl_lines="4 21"
{!> ../../../docs_src/encoder/tutorial001_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="5 22"
{!> ../../../docs_src/encoder/tutorial001.py!}
```
////
{* ../../docs_src/encoder/tutorial001_py310.py hl[4,21] *}
In diesem Beispiel wird das Pydantic-Modell in ein `dict`, und das `datetime`-Objekt in ein `str` konvertiert.
@@ -42,7 +28,7 @@ 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.
/// 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.

View File

@@ -55,108 +55,8 @@ 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.
//// tab | Python 3.10+
```Python hl_lines="1 3 12-16"
{!> ../../../docs_src/extra_data_types/tutorial001_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="1 3 12-16"
{!> ../../../docs_src/extra_data_types/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="1 3 13-17"
{!> ../../../docs_src/extra_data_types/tutorial001_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```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!}
```
////
{* ../../docs_src/extra_data_types/tutorial001_an_py310.py hl[1,3,12:16] *}
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:
//// 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
/// tip
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="17-18"
{!> ../../../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="18-19"
{!> ../../../docs_src/extra_data_types/tutorial001.py!}
```
////
{* ../../docs_src/extra_data_types/tutorial001_an_py310.py hl[18:19] *}

View File

@@ -8,7 +8,7 @@ Insbesondere Benutzermodelle, denn:
* 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.
/// danger | "Gefahr"
/// danger | Gefahr
Speichern Sie niemals das Klartext-Passwort eines Benutzers. Speichern Sie immer den „sicheren Hash“, den Sie verifizieren können.
@@ -20,21 +20,7 @@ Falls Ihnen das nichts sagt, in den [Sicherheits-Kapiteln](security/simple-oauth
Hier der generelle Weg, wie die Modelle mit ihren Passwort-Feldern aussehen könnten, und an welchen Orten sie verwendet werden würden.
//// 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!}
```
////
{* ../../docs_src/extra_models/tutorial001_py310.py hl[7,9,14,20,22,27:28,31:33,38:39] *}
/// info
@@ -154,7 +140,7 @@ 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.
@@ -176,21 +162,7 @@ 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):
//// tab | Python 3.10+
```Python hl_lines="7 13-14 17-18 21-22"
{!> ../../../docs_src/extra_models/tutorial002_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="9 15-16 19-20 23-24"
{!> ../../../docs_src/extra_models/tutorial002.py!}
```
////
{* ../../docs_src/extra_models/tutorial002_py310.py hl[7,13:14,17:18,21:22] *}
## `Union`, oder `anyOf`
@@ -200,27 +172,13 @@ 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>:
/// 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`.
///
//// tab | Python 3.10+
```Python hl_lines="1 14-15 18-20 33"
{!> ../../../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!}
```
////
{* ../../docs_src/extra_models/tutorial003_py310.py hl[1,14:15,18:20,33] *}
### `Union` in Python 3.10
@@ -242,21 +200,7 @@ 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):
//// tab | Python 3.9+
```Python hl_lines="18"
{!> ../../../docs_src/extra_models/tutorial004_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="1 20"
{!> ../../../docs_src/extra_models/tutorial004.py!}
```
////
{* ../../docs_src/extra_models/tutorial004_py39.py hl[18] *}
## Response mit beliebigem `dict`
@@ -266,21 +210,7 @@ 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):
//// tab | Python 3.9+
```Python hl_lines="6"
{!> ../../../docs_src/extra_models/tutorial005_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="1 8"
{!> ../../../docs_src/extra_models/tutorial005.py!}
```
////
{* ../../docs_src/extra_models/tutorial005_py39.py hl[6] *}
## Zusammenfassung

View File

@@ -2,9 +2,7 @@
Die einfachste FastAPI-Datei könnte wie folgt aussehen:
```Python
{!../../../docs_src/first_steps/tutorial001.py!}
```
{* ../../docs_src/first_steps/tutorial001.py *}
Kopieren Sie dies in eine Datei `main.py`.
@@ -24,7 +22,7 @@ $ uvicorn main:app --reload
</div>
/// note | "Hinweis"
/// note | Hinweis
Der Befehl `uvicorn main:app` bezieht sich auf:
@@ -133,13 +131,11 @@ Ebenfalls können Sie es verwenden, um automatisch Code für Clients zu generier
### Schritt 1: Importieren von `FastAPI`
```Python hl_lines="1"
{!../../../docs_src/first_steps/tutorial001.py!}
```
{* ../../docs_src/first_steps/tutorial001.py hl[1] *}
`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.
@@ -149,9 +145,7 @@ Sie können alle <a href="https://www.starlette.io/" class="external-link" targe
### Schritt 2: Erzeugen einer `FastAPI`-„Instanz“
```Python hl_lines="3"
{!../../../docs_src/first_steps/tutorial001.py!}
```
{* ../../docs_src/first_steps/tutorial001.py hl[3] *}
In diesem Beispiel ist die Variable `app` eine „Instanz“ der Klasse `FastAPI`.
@@ -171,9 +165,7 @@ $ uvicorn main:app --reload
Wenn Sie Ihre Anwendung wie folgt erstellen:
```Python hl_lines="3"
{!../../../docs_src/first_steps/tutorial002.py!}
```
{* ../../docs_src/first_steps/tutorial002.py hl[3] *}
Und in eine Datei `main.py` einfügen, dann würden Sie `uvicorn` wie folgt aufrufen:
@@ -250,16 +242,14 @@ Wir werden sie auch „**Operationen**“ nennen.
#### Definieren eines *Pfadoperation-Dekorators*
```Python hl_lines="6"
{!../../../docs_src/first_steps/tutorial001.py!}
```
{* ../../docs_src/first_steps/tutorial001.py hl[6] *}
Das `@app.get("/")` sagt **FastAPI**, dass die Funktion direkt darunter für die Bearbeitung von Anfragen zuständig ist, die an:
* den Pfad `/`
* 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.
@@ -286,7 +276,7 @@ Oder die exotischeren:
* `@app.patch()`
* `@app.trace()`
/// tip | "Tipp"
/// tip | Tipp
Es steht Ihnen frei, jede Operation (HTTP-Methode) so zu verwenden, wie Sie es möchten.
@@ -306,9 +296,7 @@ Das ist unsere „**Pfadoperation-Funktion**“:
* **Operation**: ist `get`.
* **Funktion**: ist die Funktion direkt unter dem „Dekorator“ (unter `@app.get("/")`).
```Python hl_lines="7"
{!../../../docs_src/first_steps/tutorial001.py!}
```
{* ../../docs_src/first_steps/tutorial001.py hl[7] *}
Dies ist eine Python-Funktion.
@@ -320,11 +308,9 @@ In diesem Fall handelt es sich um eine `async`-Funktion.
Sie könnten sie auch als normale Funktion anstelle von `async def` definieren:
```Python hl_lines="7"
{!../../../docs_src/first_steps/tutorial003.py!}
```
{* ../../docs_src/first_steps/tutorial003.py hl[7] *}
/// note | "Hinweis"
/// note | Hinweis
Wenn Sie den Unterschied nicht kennen, lesen Sie [Async: *„In Eile?“*](../async.md#in-eile){.internal-link target=_blank}.
@@ -332,9 +318,7 @@ Wenn Sie den Unterschied nicht kennen, lesen Sie [Async: *„In Eile?“*](../as
### Schritt 5: den Inhalt zurückgeben
```Python hl_lines="8"
{!../../../docs_src/first_steps/tutorial001.py!}
```
{* ../../docs_src/first_steps/tutorial001.py hl[8] *}
Sie können ein `dict`, eine `list`, einzelne Werte wie `str`, `int`, usw. zurückgeben.

View File

@@ -25,9 +25,7 @@ Um HTTP-Responses mit Fehlern zum Client zurückzugeben, verwenden Sie `HTTPExce
### `HTTPException` importieren
```Python hl_lines="1"
{!../../../docs_src/handling_errors/tutorial001.py!}
```
{* ../../docs_src/handling_errors/tutorial001.py hl[1] *}
### Eine `HTTPException` in Ihrem Code auslösen
@@ -41,9 +39,7 @@ Der Vorteil, eine Exception auszulösen (`raise`), statt sie zurückzugeben (`re
Im folgenden Beispiel lösen wir, wenn der Client eine ID anfragt, die nicht existiert, eine Exception mit dem Statuscode `404` aus.
```Python hl_lines="11"
{!../../../docs_src/handling_errors/tutorial001.py!}
```
{* ../../docs_src/handling_errors/tutorial001.py hl[11] *}
### Die resultierende Response
@@ -63,7 +59,7 @@ 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`.
@@ -81,9 +77,7 @@ Sie müssen das wahrscheinlich nicht direkt in ihrem Code verwenden.
Aber falls es in einem fortgeschrittenen Szenario notwendig ist, können Sie benutzerdefinierte Header wie folgt hinzufügen:
```Python hl_lines="14"
{!../../../docs_src/handling_errors/tutorial002.py!}
```
{* ../../docs_src/handling_errors/tutorial002.py hl[14] *}
## Benutzerdefinierte Exceptionhandler definieren
@@ -95,9 +89,7 @@ Und Sie möchten diese Exception global mit FastAPI handhaben.
Sie könnten einen benutzerdefinierten Exceptionhandler mittels `@app.exception_handler()` hinzufügen:
```Python hl_lines="5-7 13-18 24"
{!../../../docs_src/handling_errors/tutorial003.py!}
```
{* ../../docs_src/handling_errors/tutorial003.py hl[5:7,13:18,24] *}
Wenn Sie nun `/unicorns/yolo` anfragen, `raise`d die *Pfadoperation* eine `UnicornException`.
@@ -109,7 +101,7 @@ Sie erhalten also einen sauberen Error mit einem Statuscode `418` und dem JSON-I
{"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.
@@ -135,9 +127,7 @@ Um diesen zu überschreiben, importieren Sie den `RequestValidationError` und ve
Der Exceptionhandler wird einen `Request` und die Exception entgegennehmen.
```Python hl_lines="2 14-16"
{!../../../docs_src/handling_errors/tutorial004.py!}
```
{* ../../docs_src/handling_errors/tutorial004.py hl[2,14:16] *}
Wenn Sie nun `/items/foo` besuchen, erhalten Sie statt des Default-JSON-Errors:
@@ -166,7 +156,7 @@ path -> item_id
#### `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.
@@ -188,11 +178,9 @@ Genauso können Sie den `HTTPException`-Handler überschreiben.
Zum Beispiel könnten Sie eine Klartext-Response statt JSON für diese Fehler zurückgeben wollen:
```Python hl_lines="3-4 9-11 22"
{!../../../docs_src/handling_errors/tutorial004.py!}
```
{* ../../docs_src/handling_errors/tutorial004.py hl[3:4,9:11,22] *}
/// note | "Technische Details"
/// note | Technische Details
Sie können auch `from starlette.responses import PlainTextResponse` verwenden.
@@ -206,9 +194,7 @@ Der `RequestValidationError` enthält den empfangenen `body` mit den ungültigen
Sie könnten diesen verwenden, während Sie Ihre Anwendung entwickeln, um den Body zu loggen und zu debuggen, ihn zum Benutzer zurückzugeben, usw.
```Python hl_lines="14"
{!../../../docs_src/handling_errors/tutorial005.py!}
```
{* ../../docs_src/handling_errors/tutorial005.py hl[14] *}
Jetzt versuchen Sie, einen ungültigen Artikel zu senden:
@@ -264,8 +250,6 @@ from starlette.exceptions import HTTPException as StarletteHTTPException
Wenn Sie die Exception zusammen mit denselben Default-Exceptionhandlern von **FastAPI** verwenden möchten, können Sie die Default-Exceptionhandler von `fastapi.Exception_handlers` importieren und wiederverwenden:
```Python hl_lines="2-5 15 21"
{!../../../docs_src/handling_errors/tutorial006.py!}
```
{* ../../docs_src/handling_errors/tutorial006.py hl[2:5,15,21] *}
In diesem Beispiel `print`en Sie nur den Fehler mit einer sehr ausdrucksstarken Nachricht, aber Sie sehen, worauf wir hinauswollen. Sie können mit der Exception etwas machen und dann einfach die Default-Exceptionhandler wiederverwenden.

View File

@@ -6,57 +6,7 @@ So wie `Query`-, `Path`-, und `Cookie`-Parameter können Sie auch <abbr title='H
Importieren Sie zuerst `Header`:
//// tab | Python 3.10+
```Python hl_lines="3"
{!> ../../../docs_src/header_params/tutorial001_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="3"
{!> ../../../docs_src/header_params/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="3"
{!> ../../../docs_src/header_params/tutorial001_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="1"
{!> ../../../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="3"
{!> ../../../docs_src/header_params/tutorial001.py!}
```
////
{* ../../docs_src/header_params/tutorial001_an_py310.py hl[3] *}
## `Header`-Parameter deklarieren
@@ -64,59 +14,9 @@ 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:
//// tab | Python 3.10+
{* ../../docs_src/header_params/tutorial001_an_py310.py hl[9] *}
```Python hl_lines="9"
{!> ../../../docs_src/header_params/tutorial001_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="9"
{!> ../../../docs_src/header_params/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="10"
{!> ../../../docs_src/header_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/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!}
```
////
/// note | "Technische Details"
/// note | Technische Details
`Header` ist eine Schwesterklasse von `Path`, `Query` und `Cookie`. Sie erbt von derselben gemeinsamen `Param`-Elternklasse.
@@ -146,59 +46,9 @@ 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`.
//// tab | Python 3.10+
{* ../../docs_src/header_params/tutorial002_an_py310.py hl[10] *}
```Python hl_lines="10"
{!> ../../../docs_src/header_params/tutorial002_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="11"
{!> ../../../docs_src/header_params/tutorial002_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="12"
{!> ../../../docs_src/header_params/tutorial002_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="8"
{!> ../../../docs_src/header_params/tutorial002_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="10"
{!> ../../../docs_src/header_params/tutorial002.py!}
```
////
/// warning | "Achtung"
/// 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.
@@ -214,71 +64,7 @@ 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:
//// tab | Python 3.10+
```Python hl_lines="9"
{!> ../../../docs_src/header_params/tutorial003_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="9"
{!> ../../../docs_src/header_params/tutorial003_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="10"
{!> ../../../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!}
```
////
//// tab | Python 3.9+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="9"
{!> ../../../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!}
```
////
{* ../../docs_src/header_params/tutorial003_an_py310.py hl[9] *}
Wenn Sie mit einer *Pfadoperation* kommunizieren, die zwei HTTP-Header sendet, wie:

View File

@@ -52,7 +52,7 @@ $ pip install "fastapi[all]"
... 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.

View File

@@ -18,11 +18,9 @@ Sie können die folgenden Felder festlegen, welche in der OpenAPI-Spezifikation
Sie können diese wie folgt setzen:
```Python hl_lines="3-16 19-32"
{!../../../docs_src/metadata/tutorial001.py!}
```
{* ../../docs_src/metadata/tutorial001.py hl[3:16,19:32] *}
/// tip | "Tipp"
/// tip | Tipp
Sie können Markdown in das Feld `description` schreiben und es wird in der Ausgabe gerendert.
@@ -38,9 +36,7 @@ Seit OpenAPI 3.1.0 und FastAPI 0.99.0 können Sie die `license_info` auch mit ei
Zum Beispiel:
```Python hl_lines="31"
{!../../../docs_src/metadata/tutorial001_1.py!}
```
{* ../../docs_src/metadata/tutorial001_1.py hl[31] *}
## Metadaten für Tags
@@ -62,13 +58,11 @@ Versuchen wir das an einem Beispiel mit Tags für `users` und `items`.
Erstellen Sie Metadaten für Ihre Tags und übergeben Sie sie an den Parameter `openapi_tags`:
```Python hl_lines="3-16 18"
{!../../../docs_src/metadata/tutorial004.py!}
```
{* ../../docs_src/metadata/tutorial004.py hl[3:16,18] *}
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.
@@ -78,9 +72,7 @@ Sie müssen nicht für alle von Ihnen verwendeten Tags Metadaten hinzufügen.
Verwenden Sie den Parameter `tags` mit Ihren *Pfadoperationen* (und `APIRouter`n), um diese verschiedenen Tags zuzuweisen:
```Python hl_lines="21 26"
{!../../../docs_src/metadata/tutorial004.py!}
```
{* ../../docs_src/metadata/tutorial004.py hl[21,26] *}
/// info
@@ -108,9 +100,7 @@ Sie können das aber mit dem Parameter `openapi_url` konfigurieren.
Um beispielsweise festzulegen, dass es unter `/api/v1/openapi.json` bereitgestellt wird:
```Python hl_lines="3"
{!../../../docs_src/metadata/tutorial002.py!}
```
{* ../../docs_src/metadata/tutorial002.py hl[3] *}
Wenn Sie das OpenAPI-Schema vollständig deaktivieren möchten, können Sie `openapi_url=None` festlegen, wodurch auch die Dokumentationsbenutzeroberflächen deaktiviert werden, die es verwenden.
@@ -127,6 +117,4 @@ Sie können die beiden enthaltenen Dokumentationsbenutzeroberflächen konfigurie
Um beispielsweise Swagger UI so einzustellen, dass sie unter `/documentation` bereitgestellt wird, und ReDoc zu deaktivieren:
```Python hl_lines="3"
{!../../../docs_src/metadata/tutorial003.py!}
```
{* ../../docs_src/metadata/tutorial003.py hl[3] *}

View File

@@ -11,7 +11,7 @@ Eine „Middleware“ ist eine Funktion, die mit jedem **Request** arbeitet, bev
* Sie kann etwas mit dieser **Response** tun oder beliebigen Code ausführen.
* 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.
@@ -31,11 +31,9 @@ Die Middleware-Funktion erhält:
* Dann gibt es die von der entsprechenden *Pfadoperation* generierte `response` zurück.
* Sie können die `response` dann weiter modifizieren, bevor Sie sie zurückgeben.
```Python hl_lines="8-9 11 14"
{!../../../docs_src/middleware/tutorial001.py!}
```
{* ../../docs_src/middleware/tutorial001.py hl[8:9,11,14] *}
/// 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>.
@@ -43,7 +41,7 @@ Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser
///
/// note | "Technische Details"
/// note | Technische Details
Sie könnten auch `from starlette.requests import Request` verwenden.
@@ -59,9 +57,7 @@ Und auch nachdem die `response` generiert wurde, bevor sie zurückgegeben wird.
Sie könnten beispielsweise einen benutzerdefinierten Header `X-Process-Time` hinzufügen, der die Zeit in Sekunden enthält, die benötigt wurde, um den Request zu verarbeiten und eine Response zu generieren:
```Python hl_lines="10 12-13"
{!../../../docs_src/middleware/tutorial001.py!}
```
{* ../../docs_src/middleware/tutorial001.py hl[10,12:13] *}
## Andere Middlewares

View File

@@ -2,7 +2,7 @@
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*.
@@ -16,33 +16,11 @@ 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:
//// tab | Python 3.10+
```Python hl_lines="1 15"
{!> ../../../docs_src/path_operation_configuration/tutorial001_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="3 17"
{!> ../../../docs_src/path_operation_configuration/tutorial001_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="3 17"
{!> ../../../docs_src/path_operation_configuration/tutorial001.py!}
```
////
{* ../../docs_src/path_operation_configuration/tutorial001_py310.py hl[1,15] *}
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.
@@ -54,29 +32,7 @@ Sie können auch `from starlette import status` verwenden.
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`):
//// tab | Python 3.10+
```Python hl_lines="15 20 25"
{!> ../../../docs_src/path_operation_configuration/tutorial002_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="17 22 27"
{!> ../../../docs_src/path_operation_configuration/tutorial002_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="17 22 27"
{!> ../../../docs_src/path_operation_configuration/tutorial002.py!}
```
////
{* ../../docs_src/path_operation_configuration/tutorial002_py310.py hl[15,20,25] *}
Diese werden zum OpenAPI-Schema hinzugefügt und von den automatischen Dokumentations-Benutzeroberflächen verwendet:
@@ -90,37 +46,13 @@ In diesem Fall macht es Sinn, die Tags in einem `Enum` zu speichern.
**FastAPI** unterstützt diese genauso wie einfache Strings:
```Python hl_lines="1 8-10 13 18"
{!../../../docs_src/path_operation_configuration/tutorial002b.py!}
```
{* ../../docs_src/path_operation_configuration/tutorial002b.py hl[1,8:10,13,18] *}
## Zusammenfassung und Beschreibung
Sie können eine Zusammenfassung (`summary`) und eine Beschreibung (`description`) hinzufügen:
//// tab | Python 3.10+
```Python hl_lines="18-19"
{!> ../../../docs_src/path_operation_configuration/tutorial003_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="20-21"
{!> ../../../docs_src/path_operation_configuration/tutorial003_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="20-21"
{!> ../../../docs_src/path_operation_configuration/tutorial003.py!}
```
////
{* ../../docs_src/path_operation_configuration/tutorial003_py310.py hl[18:19] *}
## Beschreibung mittels Docstring
@@ -128,29 +60,7 @@ 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).
//// tab | Python 3.10+
```Python hl_lines="17-25"
{!> ../../../docs_src/path_operation_configuration/tutorial004_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="19-27"
{!> ../../../docs_src/path_operation_configuration/tutorial004_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="19-27"
{!> ../../../docs_src/path_operation_configuration/tutorial004.py!}
```
////
{* ../../docs_src/path_operation_configuration/tutorial004_py310.py hl[17:25] *}
In der interaktiven Dokumentation sieht das dann so aus:
@@ -160,29 +70,7 @@ In der interaktiven Dokumentation sieht das dann so aus:
Die Response können Sie mit dem Parameter `response_description` beschreiben:
//// 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!}
```
////
{* ../../docs_src/path_operation_configuration/tutorial005_py310.py hl[19] *}
/// info
@@ -204,9 +92,7 @@ Daher, wenn Sie keine vergeben, wird **FastAPI** automatisch eine für „Erfolg
Wenn Sie eine *Pfadoperation* als <abbr title="deprecated obsolet, veraltet: Es soll nicht mehr verwendet werden">deprecated</abbr> kennzeichnen möchten, ohne sie zu entfernen, fügen Sie den Parameter `deprecated` hinzu:
```Python hl_lines="16"
{!../../../docs_src/path_operation_configuration/tutorial006.py!}
```
{* ../../docs_src/path_operation_configuration/tutorial006.py hl[16] *}
Sie wird in der interaktiven Dokumentation gut sichtbar als deprecated markiert werden:

View File

@@ -6,57 +6,7 @@ So wie Sie mit `Query` für Query-Parameter zusätzliche Validierungen und Metad
Importieren Sie zuerst `Path` von `fastapi`, und importieren Sie `Annotated`.
//// tab | Python 3.10+
```Python hl_lines="1 3"
{!> ../../../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!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```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.
///
```Python hl_lines="3"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001.py!}
```
////
{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *}
/// info
@@ -74,59 +24,9 @@ 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:
//// tab | Python 3.10+
{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[10] *}
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="11"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="8"
{!> ../../../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.
///
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001.py!}
```
////
/// note | "Hinweis"
/// note | Hinweis
Ein Pfad-Parameter ist immer erforderlich, weil er Teil des Pfads sein muss.
@@ -138,7 +38,7 @@ Doch selbst wenn Sie ihn mit `None` deklarieren, oder einen Defaultwert setzen,
## Sortieren Sie die Parameter, wie Sie möchten
/// tip | "Tipp"
/// tip | Tipp
Wenn Sie `Annotated` verwenden, ist das folgende nicht so wichtig / nicht notwendig.
@@ -160,39 +60,25 @@ Sie können Ihre Funktion also so deklarieren:
//// tab | Python 3.8 nicht annotiert
/// tip | "Tipp"
/// tip | Tipp
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="7"
{!> ../../../docs_src/path_params_numeric_validations/tutorial002.py!}
{!> ../../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.
//// tab | Python 3.9+
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial002_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial002_an.py!}
```
////
{* ../../docs_src/path_params_numeric_validations/tutorial002_an_py39.py hl[10] *}
## 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.
@@ -213,64 +99,20 @@ Wenn Sie eines der folgenden Dinge tun möchten:
Python macht nichts mit diesem `*`, aber es wird wissen, dass alle folgenden Parameter als <abbr title="Keyword-Argument Schlüsselwort-Argument: Das Argument wird anhand seines Namens erkannt, nicht anhand seiner Reihenfolge in der Argumentliste">Keyword-Argumente</abbr> (Schlüssel-Wert-Paare), auch bekannt als <abbr title="Von: K-ey W-ord Arg-uments"><code>kwargs</code></abbr>, verwendet werden. Selbst wenn diese keinen Defaultwert haben.
```Python hl_lines="7"
{!../../../docs_src/path_params_numeric_validations/tutorial003.py!}
```
{* ../../docs_src/path_params_numeric_validations/tutorial003.py hl[7] *}
### Besser mit `Annotated`
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.
//// tab | Python 3.9+
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial003_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial003_an.py!}
```
////
{* ../../docs_src/path_params_numeric_validations/tutorial003_an_py39.py hl[10] *}
## Validierung von Zahlen: Größer oder gleich
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).
//// tab | Python 3.9+
```Python hl_lines="10"
{!> ../../../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!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="8"
{!> ../../../docs_src/path_params_numeric_validations/tutorial004.py!}
```
////
{* ../../docs_src/path_params_numeric_validations/tutorial004_an_py39.py hl[10] *}
## Validierung von Zahlen: Größer und kleiner oder gleich
@@ -279,35 +121,7 @@ Das Gleiche trifft zu auf:
* `gt`: `g`reater `t`han größer als
* `le`: `l`ess than or `e`qual kleiner oder gleich
//// 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!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial005.py!}
```
////
{* ../../docs_src/path_params_numeric_validations/tutorial005_an_py39.py hl[10] *}
## Validierung von Zahlen: Floats, größer und kleiner
@@ -319,35 +133,7 @@ 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>.
//// tab | Python 3.9+
```Python hl_lines="13"
{!> ../../../docs_src/path_params_numeric_validations/tutorial006_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="12"
{!> ../../../docs_src/path_params_numeric_validations/tutorial006_an.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="11"
{!> ../../../docs_src/path_params_numeric_validations/tutorial006.py!}
```
////
{* ../../docs_src/path_params_numeric_validations/tutorial006_an_py39.py hl[13] *}
## Zusammenfassung
@@ -368,7 +154,7 @@ Sie alle teilen die gleichen Parameter für zusätzliche Validierung und Metadat
///
/// note | "Technische Details"
/// note | Technische Details
`Query`, `Path` und andere, die Sie von `fastapi` importieren, sind tatsächlich Funktionen.

View File

@@ -2,9 +2,7 @@
Sie können Pfad-„Parameter“ oder -„Variablen“ mit der gleichen Syntax deklarieren, welche in Python-<abbr title="Format-String Formatierter String: Der String enthält Variablen, die mit geschweiften Klammern umschlossen sind. Solche Stellen werden durch den Wert der Variable ersetzt">Format-Strings</abbr> verwendet wird:
```Python hl_lines="6-7"
{!../../../docs_src/path_params/tutorial001.py!}
```
{* ../../docs_src/path_params/tutorial001.py hl[6:7] *}
Der Wert des Pfad-Parameters `item_id` wird Ihrer Funktion als das Argument `item_id` übergeben.
@@ -18,9 +16,7 @@ Wenn Sie dieses Beispiel ausführen und auf <a href="http://127.0.0.1:8000/items
Sie können den Typ eines Pfad-Parameters in der Argumentliste der Funktion deklarieren, mit Standard-Python-Typannotationen:
```Python hl_lines="7"
{!../../../docs_src/path_params/tutorial002.py!}
```
{* ../../docs_src/path_params/tutorial002.py hl[7] *}
In diesem Fall wird `item_id` als `int` deklariert, also als Ganzzahl.
@@ -123,17 +119,13 @@ Und Sie haben auch einen Pfad `/users/{user_id}`, um Daten über einen spezifisc
Weil *Pfadoperationen* in ihrer Reihenfolge ausgewertet werden, müssen Sie sicherstellen, dass der Pfad `/users/me` vor `/users/{user_id}` deklariert wurde:
```Python hl_lines="6 11"
{!../../../docs_src/path_params/tutorial003.py!}
```
{* ../../docs_src/path_params/tutorial003.py hl[6,11] *}
Ansonsten würde der Pfad für `/users/{user_id}` auch `/users/me` auswerten, und annehmen, dass ein Parameter `user_id` mit dem Wert `"me"` übergeben wurde.
Sie können eine Pfadoperation auch nicht erneut definieren:
```Python hl_lines="6 11"
{!../../../docs_src/path_params/tutorial003b.py!}
```
{* ../../docs_src/path_params/tutorial003b.py hl[6,11] *}
Die erste Definition wird immer verwendet werden, da ihr Pfad zuerst übereinstimmt.
@@ -149,9 +141,7 @@ Indem Sie von `str` erben, weiß die API Dokumentation, dass die Werte des Enums
Erstellen Sie dann Klassen-Attribute mit festgelegten Werten, welches die erlaubten Werte sein werden:
```Python hl_lines="1 6-9"
{!../../../docs_src/path_params/tutorial005.py!}
```
{* ../../docs_src/path_params/tutorial005.py hl[1,6:9] *}
/// info
@@ -159,7 +149,7 @@ Erstellen Sie dann Klassen-Attribute mit festgelegten Werten, welches die erlaub
///
/// tip | "Tipp"
/// 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.
@@ -169,9 +159,7 @@ Falls Sie sich fragen, was „AlexNet“, „ResNet“ und „LeNet“ ist, das
Dann erstellen Sie einen *Pfad-Parameter*, der als Typ die gerade erstellte Enum-Klasse hat (`ModelName`):
```Python hl_lines="16"
{!../../../docs_src/path_params/tutorial005.py!}
```
{* ../../docs_src/path_params/tutorial005.py hl[16] *}
### Testen Sie es in der API-Dokumentation
@@ -187,19 +175,15 @@ Der *Pfad-Parameter* wird ein *<abbr title="Member Mitglied: Einer der mögl
Sie können ihn mit einem Member Ihres Enums `ModelName` vergleichen:
```Python hl_lines="17"
{!../../../docs_src/path_params/tutorial005.py!}
```
{* ../../docs_src/path_params/tutorial005.py hl[17] *}
#### *Enum-Wert* erhalten
Den tatsächlichen Wert (in diesem Fall ein `str`) erhalten Sie via `model_name.value`, oder generell, `ihr_enum_member.value`:
```Python hl_lines="20"
{!../../../docs_src/path_params/tutorial005.py!}
```
{* ../../docs_src/path_params/tutorial005.py hl[20] *}
/// tip | "Tipp"
/// tip | Tipp
Sie können den Wert `"lenet"` außerdem mittels `ModelName.lenet.value` abrufen.
@@ -211,9 +195,7 @@ Sie können *Enum-Member* in ihrer *Pfadoperation* zurückgeben, sogar verschach
Diese werden zu ihren entsprechenden Werten konvertiert (in diesem Fall Strings), bevor sie zum Client übertragen werden:
```Python hl_lines="18 21 23"
{!../../../docs_src/path_params/tutorial005.py!}
```
{* ../../docs_src/path_params/tutorial005.py hl[18,21,23] *}
In Ihrem Client erhalten Sie eine JSON-Response, wie etwa:
@@ -252,11 +234,9 @@ In diesem Fall ist der Name des Parameters `file_path`. Der letzte Teil, `:path`
Sie verwenden das also wie folgt:
```Python hl_lines="6"
{!../../../docs_src/path_params/tutorial004.py!}
```
{* ../../docs_src/path_params/tutorial004.py hl[6] *}
/// tip | "Tipp"
/// tip | Tipp
Der Parameter könnte einen führenden Schrägstrich (`/`) haben, wie etwa in `/home/johndoe/myfile.txt`.

View File

@@ -4,25 +4,11 @@
Nehmen wir als Beispiel die folgende Anwendung:
//// tab | Python 3.10+
```Python hl_lines="7"
{!> ../../../docs_src/query_params_str_validations/tutorial001_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="9"
{!> ../../../docs_src/query_params_str_validations/tutorial001.py!}
```
////
{* ../../docs_src/query_params_str_validations/tutorial001_py310.py hl[7] *}
Der Query-Parameter `q` hat den Typ `Union[str, None]` (oder `str | None` in Python 3.10), was bedeutet, er ist entweder ein `str` oder `None`. Der Defaultwert ist `None`, also weiß FastAPI, der Parameter ist nicht erforderlich.
/// note | "Hinweis"
/// note | Hinweis
FastAPI weiß nur dank des definierten Defaultwertes `=None`, dass der Wert von `q` nicht erforderlich ist
@@ -46,7 +32,7 @@ Importieren Sie zuerst:
In Python 3.9 oder darüber, ist `Annotated` Teil der Standardbibliothek, also können Sie es von `typing` importieren.
```Python hl_lines="1 3"
{!> ../../../docs_src/query_params_str_validations/tutorial002_an_py310.py!}
{!> ../../docs_src/query_params_str_validations/tutorial002_an_py310.py!}
```
////
@@ -58,7 +44,7 @@ In Versionen unter Python 3.9 importieren Sie `Annotated` von `typing_extensions
Es wird bereits mit FastAPI installiert sein.
```Python hl_lines="3-4"
{!> ../../../docs_src/query_params_str_validations/tutorial002_an.py!}
{!> ../../docs_src/query_params_str_validations/tutorial002_an.py!}
```
////
@@ -123,21 +109,7 @@ Wenden wir uns jetzt den spannenden Dingen zu. 🎉
Jetzt, da wir `Annotated` für unsere Metadaten deklariert haben, fügen Sie `Query` hinzu, und setzen Sie den Parameter `max_length` auf `50`:
//// tab | Python 3.10+
```Python hl_lines="9"
{!> ../../../docs_src/query_params_str_validations/tutorial002_an_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="10"
{!> ../../../docs_src/query_params_str_validations/tutorial002_an.py!}
```
////
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[9] *}
Beachten Sie, dass der Defaultwert immer noch `None` ist, sodass der Parameter immer noch optional ist.
@@ -153,7 +125,7 @@ FastAPI wird nun:
Frühere Versionen von FastAPI (vor <abbr title="vor 2023-03">0.95.0</abbr>) benötigten `Query` als Defaultwert des Parameters, statt es innerhalb von `Annotated` unterzubringen. Die Chance ist groß, dass Sie Quellcode sehen, der das immer noch so macht, darum erkläre ich es Ihnen.
/// tip | "Tipp"
/// tip | Tipp
Verwenden Sie für neuen Code, und wann immer möglich, `Annotated`, wie oben erklärt. Es gibt mehrere Vorteile (unten erläutert) und keine Nachteile. 🍰
@@ -161,21 +133,7 @@ Verwenden Sie für neuen Code, und wann immer möglich, `Annotated`, wie oben er
So würden Sie `Query()` als Defaultwert Ihres Funktionsparameters verwenden, den Parameter `max_length` auf 50 gesetzt:
//// tab | Python 3.10+
```Python hl_lines="7"
{!> ../../../docs_src/query_params_str_validations/tutorial002_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="9"
{!> ../../../docs_src/query_params_str_validations/tutorial002.py!}
```
////
{* ../../docs_src/query_params_str_validations/tutorial002_py310.py hl[7] *}
Da wir in diesem Fall (ohne die Verwendung von `Annotated`) den Parameter-Defaultwert `None` mit `Query()` ersetzen, müssen wir nun dessen Defaultwert mit dem Parameter `Query(default=None)` deklarieren. Das dient demselben Zweck, `None` als Defaultwert für den Funktionsparameter zu setzen (zumindest für FastAPI).
@@ -275,113 +233,13 @@ Da `Annotated` mehrere Metadaten haben kann, können Sie dieselbe Funktion auch
Sie können auch einen Parameter `min_length` hinzufügen:
//// tab | Python 3.10+
```Python hl_lines="10"
{!> ../../../docs_src/query_params_str_validations/tutorial003_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="10"
{!> ../../../docs_src/query_params_str_validations/tutorial003_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="11"
{!> ../../../docs_src/query_params_str_validations/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/query_params_str_validations/tutorial003_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="10"
{!> ../../../docs_src/query_params_str_validations/tutorial003.py!}
```
////
{* ../../docs_src/query_params_str_validations/tutorial003_an_py310.py hl[10] *}
## Reguläre Ausdrücke hinzufügen
Sie können einen <abbr title="Ein regulärer Ausdruck, auch regex oder regexp genannt, ist eine Zeichensequenz, die ein Suchmuster für Strings definiert.">Regulären Ausdruck</abbr> `pattern` definieren, mit dem der Parameter übereinstimmen muss:
//// tab | Python 3.10+
```Python hl_lines="11"
{!> ../../../docs_src/query_params_str_validations/tutorial004_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="11"
{!> ../../../docs_src/query_params_str_validations/tutorial004_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="12"
{!> ../../../docs_src/query_params_str_validations/tutorial004_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="9"
{!> ../../../docs_src/query_params_str_validations/tutorial004_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="11"
{!> ../../../docs_src/query_params_str_validations/tutorial004.py!}
```
////
{* ../../docs_src/query_params_str_validations/tutorial004_an_py310.py hl[11] *}
Dieses bestimmte reguläre Suchmuster prüft, ob der erhaltene Parameter-Wert:
@@ -399,11 +257,9 @@ Vor Pydantic Version 2 und vor FastAPI Version 0.100.0, war der Name des Paramet
Sie könnten immer noch Code sehen, der den alten Namen verwendet:
//// tab | Python 3.10+ Pydantic v1
//// tab | Pydantic v1
```Python hl_lines="11"
{!> ../../../docs_src/query_params_str_validations/tutorial004_an_py310_regex.py!}
```
{* ../../docs_src/query_params_str_validations/tutorial004_regex_an_py310.py hl[11] *}
////
@@ -415,37 +271,9 @@ Sie können natürlich andere Defaultwerte als `None` verwenden.
Beispielsweise könnten Sie den `q` Query-Parameter so deklarieren, dass er eine `min_length` von `3` hat, und den Defaultwert `"fixedquery"`:
//// tab | Python 3.9+
{* ../../docs_src/query_params_str_validations/tutorial005_an_py39.py hl[9] *}
```Python hl_lines="9"
{!> ../../../docs_src/query_params_str_validations/tutorial005_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="8"
{!> ../../../docs_src/query_params_str_validations/tutorial005_an.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="7"
{!> ../../../docs_src/query_params_str_validations/tutorial005.py!}
```
////
/// note | "Hinweis"
/// note | Hinweis
Ein Parameter ist optional (nicht erforderlich), wenn er irgendeinen Defaultwert, auch `None`, hat.
@@ -485,77 +313,13 @@ q: Union[str, None] = Query(default=None, min_length=3)
Wenn Sie einen Parameter erforderlich machen wollen, während Sie `Query` verwenden, deklarieren Sie ebenfalls einfach keinen Defaultwert:
//// tab | Python 3.9+
```Python hl_lines="9"
{!> ../../../docs_src/query_params_str_validations/tutorial006_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="8"
{!> ../../../docs_src/query_params_str_validations/tutorial006_an.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="7"
{!> ../../../docs_src/query_params_str_validations/tutorial006.py!}
```
/// tip | "Tipp"
Beachten Sie, dass, obwohl in diesem Fall `Query()` der Funktionsparameter-Defaultwert ist, wir nicht `default=None` zu `Query()` hinzufügen.
Verwenden Sie bitte trotzdem die `Annotated`-Version. 😉
///
////
{* ../../docs_src/query_params_str_validations/tutorial006_an_py39.py hl[9] *}
### Erforderlich mit Ellipse (`...`)
Es gibt eine Alternative, die explizit deklariert, dass ein Wert erforderlich ist. Sie können als Default das <abbr title='Zeichenfolge, die einen Wert direkt darstellt, etwa 1, "hallowelt", True, None'>Literal</abbr> `...` setzen:
//// tab | Python 3.9+
```Python hl_lines="9"
{!> ../../../docs_src/query_params_str_validations/tutorial006b_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="8"
{!> ../../../docs_src/query_params_str_validations/tutorial006b_an.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="7"
{!> ../../../docs_src/query_params_str_validations/tutorial006b.py!}
```
////
{* ../../docs_src/query_params_str_validations/tutorial006b_an_py39.py hl[9] *}
/// info
@@ -573,65 +337,15 @@ Sie können deklarieren, dass ein Parameter `None` akzeptiert, aber dennoch erfo
Um das zu machen, deklarieren Sie, dass `None` ein gültiger Typ ist, aber verwenden Sie dennoch `...` als Default:
//// tab | Python 3.10+
{* ../../docs_src/query_params_str_validations/tutorial006c_an_py310.py hl[9] *}
```Python hl_lines="9"
{!> ../../../docs_src/query_params_str_validations/tutorial006c_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="9"
{!> ../../../docs_src/query_params_str_validations/tutorial006c_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="10"
{!> ../../../docs_src/query_params_str_validations/tutorial006c_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="7"
{!> ../../../docs_src/query_params_str_validations/tutorial006c_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="9"
{!> ../../../docs_src/query_params_str_validations/tutorial006c.py!}
```
////
/// tip | "Tipp"
/// tip | Tipp
Pydantic, welches die gesamte Datenvalidierung und Serialisierung in FastAPI antreibt, hat ein spezielles Verhalten, wenn Sie `Optional` oder `Union[Something, None]` ohne Defaultwert verwenden, Sie können mehr 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> erfahren.
///
/// tip | "Tipp"
/// tip | Tipp
Denken Sie daran, dass Sie in den meisten Fällen, wenn etwas erforderlich ist, einfach den Defaultwert weglassen können. Sie müssen also normalerweise `...` nicht verwenden.
@@ -643,71 +357,7 @@ Wenn Sie einen Query-Parameter explizit mit `Query` auszeichnen, können Sie ihn
Um zum Beispiel einen Query-Parameter `q` zu deklarieren, der mehrere Male in der URL vorkommen kann, schreiben Sie:
//// tab | Python 3.10+
```Python hl_lines="9"
{!> ../../../docs_src/query_params_str_validations/tutorial011_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="9"
{!> ../../../docs_src/query_params_str_validations/tutorial011_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="10"
{!> ../../../docs_src/query_params_str_validations/tutorial011_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="7"
{!> ../../../docs_src/query_params_str_validations/tutorial011_py310.py!}
```
////
//// tab | Python 3.9+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="9"
{!> ../../../docs_src/query_params_str_validations/tutorial011_py39.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="9"
{!> ../../../docs_src/query_params_str_validations/tutorial011.py!}
```
////
{* ../../docs_src/query_params_str_validations/tutorial011_an_py310.py hl[9] *}
Dann, mit einer URL wie:
@@ -728,7 +378,7 @@ Die Response für diese URL wäre also:
}
```
/// tip | "Tipp"
/// tip | Tipp
Um einen Query-Parameter vom Typ `list` zu deklarieren, wie im Beispiel oben, müssen Sie explizit `Query` verwenden, sonst würde der Parameter als Requestbody interpretiert werden.
@@ -742,49 +392,7 @@ Die interaktive API-Dokumentation wird entsprechend aktualisiert und erlaubt jet
Und Sie können auch eine Default-`list`e von Werten definieren, wenn keine übergeben werden:
//// tab | Python 3.9+
```Python hl_lines="9"
{!> ../../../docs_src/query_params_str_validations/tutorial012_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="10"
{!> ../../../docs_src/query_params_str_validations/tutorial012_an.py!}
```
////
//// tab | Python 3.9+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="7"
{!> ../../../docs_src/query_params_str_validations/tutorial012_py39.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="9"
{!> ../../../docs_src/query_params_str_validations/tutorial012.py!}
```
////
{* ../../docs_src/query_params_str_validations/tutorial012_an_py39.py hl[9] *}
Wenn Sie auf:
@@ -807,37 +415,9 @@ gehen, wird der Default für `q` verwendet: `["foo", "bar"]`, und als Response e
Sie können auch `list` direkt verwenden, anstelle von `List[str]` (oder `list[str]` in Python 3.9+):
//// tab | Python 3.9+
{* ../../docs_src/query_params_str_validations/tutorial013_an_py39.py hl[9] *}
```Python hl_lines="9"
{!> ../../../docs_src/query_params_str_validations/tutorial013_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="8"
{!> ../../../docs_src/query_params_str_validations/tutorial013_an.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="7"
{!> ../../../docs_src/query_params_str_validations/tutorial013.py!}
```
////
/// note | "Hinweis"
/// note | Hinweis
Beachten Sie, dass FastAPI in diesem Fall den Inhalt der Liste nicht überprüft.
@@ -851,7 +431,7 @@ Sie können mehr Informationen zum Parameter hinzufügen.
Diese Informationen werden zur generierten OpenAPI hinzugefügt, und von den Dokumentations-Oberflächen und von externen Tools verwendet.
/// note | "Hinweis"
/// note | Hinweis
Beachten Sie, dass verschiedene Tools OpenAPI möglicherweise unterschiedlich gut unterstützen.
@@ -861,111 +441,11 @@ Einige könnten noch nicht alle zusätzlichen Informationen anzeigen, die Sie de
Sie können einen Titel hinzufügen `title`:
//// tab | Python 3.10+
```Python hl_lines="10"
{!> ../../../docs_src/query_params_str_validations/tutorial007_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="10"
{!> ../../../docs_src/query_params_str_validations/tutorial007_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="11"
{!> ../../../docs_src/query_params_str_validations/tutorial007_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="8"
{!> ../../../docs_src/query_params_str_validations/tutorial007_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="10"
{!> ../../../docs_src/query_params_str_validations/tutorial007.py!}
```
////
{* ../../docs_src/query_params_str_validations/tutorial007_an_py310.py hl[10] *}
Und eine Beschreibung `description`:
//// tab | Python 3.10+
```Python hl_lines="14"
{!> ../../../docs_src/query_params_str_validations/tutorial008_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="14"
{!> ../../../docs_src/query_params_str_validations/tutorial008_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="15"
{!> ../../../docs_src/query_params_str_validations/tutorial008_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="11"
{!> ../../../docs_src/query_params_str_validations/tutorial008_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="13"
{!> ../../../docs_src/query_params_str_validations/tutorial008.py!}
```
////
{* ../../docs_src/query_params_str_validations/tutorial008_an_py310.py hl[14] *}
## Alias-Parameter
@@ -985,57 +465,7 @@ Aber Sie möchten dennoch exakt `item-query` verwenden.
Dann können Sie einen `alias` deklarieren, und dieser Alias wird verwendet, um den Parameter-Wert zu finden:
//// tab | Python 3.10+
```Python hl_lines="9"
{!> ../../../docs_src/query_params_str_validations/tutorial009_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="9"
{!> ../../../docs_src/query_params_str_validations/tutorial009_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="10"
{!> ../../../docs_src/query_params_str_validations/tutorial009_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="7"
{!> ../../../docs_src/query_params_str_validations/tutorial009_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="9"
{!> ../../../docs_src/query_params_str_validations/tutorial009.py!}
```
////
{* ../../docs_src/query_params_str_validations/tutorial009_an_py310.py hl[9] *}
## Parameter als deprecated ausweisen
@@ -1045,57 +475,7 @@ Sie müssen ihn eine Weile dort belassen, weil Clients ihn benutzen, aber Sie m
In diesem Fall fügen Sie den Parameter `deprecated=True` zu `Query` hinzu.
//// tab | Python 3.10+
```Python hl_lines="19"
{!> ../../../docs_src/query_params_str_validations/tutorial010_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="19"
{!> ../../../docs_src/query_params_str_validations/tutorial010_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="20"
{!> ../../../docs_src/query_params_str_validations/tutorial010_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="16"
{!> ../../../docs_src/query_params_str_validations/tutorial010_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="18"
{!> ../../../docs_src/query_params_str_validations/tutorial010.py!}
```
////
{* ../../docs_src/query_params_str_validations/tutorial010_an_py310.py hl[19] *}
Die Dokumentation wird das so anzeigen:
@@ -1105,57 +485,7 @@ Die Dokumentation wird das so anzeigen:
Um einen Query-Parameter vom generierten OpenAPI-Schema auszuschließen (und daher von automatischen Dokumentations-Systemen), setzen Sie den Parameter `include_in_schema` in `Query` auf `False`.
//// tab | Python 3.10+
```Python hl_lines="10"
{!> ../../../docs_src/query_params_str_validations/tutorial014_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="10"
{!> ../../../docs_src/query_params_str_validations/tutorial014_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="11"
{!> ../../../docs_src/query_params_str_validations/tutorial014_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="8"
{!> ../../../docs_src/query_params_str_validations/tutorial014_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="10"
{!> ../../../docs_src/query_params_str_validations/tutorial014.py!}
```
////
{* ../../docs_src/query_params_str_validations/tutorial014_an_py310.py hl[10] *}
## Zusammenfassung

View File

@@ -2,9 +2,7 @@
Wenn Sie in ihrer Funktion Parameter deklarieren, die nicht Teil der Pfad-Parameter sind, dann werden diese automatisch als „Query“-Parameter interpretiert.
```Python hl_lines="9"
{!../../../docs_src/query_params/tutorial001.py!}
```
{* ../../docs_src/query_params/tutorial001.py hl[9] *}
Query-Parameter (Deutsch: Abfrage-Parameter) sind die Schlüssel-Wert-Paare, die nach dem `?` in einer URL aufgelistet sind, getrennt durch `&`-Zeichen.
@@ -63,21 +61,7 @@ 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:
//// tab | Python 3.10+
```Python hl_lines="7"
{!> ../../../docs_src/query_params/tutorial002_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="9"
{!> ../../../docs_src/query_params/tutorial002.py!}
```
////
{* ../../docs_src/query_params/tutorial002_py310.py hl[7] *}
In diesem Fall wird der Funktionsparameter `q` optional, und standardmäßig `None` sein.
@@ -91,21 +75,7 @@ Beachten Sie auch, dass **FastAPI** intelligent genug ist, um zu erkennen, dass
Sie können auch `bool`-Typen deklarieren und sie werden konvertiert:
//// tab | Python 3.10+
```Python hl_lines="7"
{!> ../../../docs_src/query_params/tutorial003_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="9"
{!> ../../../docs_src/query_params/tutorial003.py!}
```
////
{* ../../docs_src/query_params/tutorial003_py310.py hl[7] *}
Wenn Sie nun zu:
@@ -147,21 +117,7 @@ Und Sie müssen sie auch nicht in einer spezifischen Reihenfolge deklarieren.
Parameter werden anhand ihres Namens erkannt:
//// tab | Python 3.10+
```Python hl_lines="6 8"
{!> ../../../docs_src/query_params/tutorial004_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="8 10"
{!> ../../../docs_src/query_params/tutorial004.py!}
```
////
{* ../../docs_src/query_params/tutorial004_py310.py hl[6,8] *}
## Erforderliche Query-Parameter
@@ -171,9 +127,7 @@ Wenn Sie keinen spezifischen Wert haben wollen, sondern der Parameter einfach op
Aber wenn Sie wollen, dass ein Query-Parameter erforderlich ist, vergeben Sie einfach keinen Defaultwert:
```Python hl_lines="6-7"
{!../../../docs_src/query_params/tutorial005.py!}
```
{* ../../docs_src/query_params/tutorial005.py hl[6:7] *}
Hier ist `needy` ein erforderlicher Query-Parameter vom Typ `str`.
@@ -219,21 +173,7 @@ 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:
//// tab | Python 3.10+
```Python hl_lines="8"
{!> ../../../docs_src/query_params/tutorial006_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="10"
{!> ../../../docs_src/query_params/tutorial006.py!}
```
////
{* ../../docs_src/query_params/tutorial006_py310.py hl[8] *}
In diesem Fall gibt es drei Query-Parameter:
@@ -241,7 +181,7 @@ In diesem Fall gibt es drei Query-Parameter:
* `skip`, ein `int` mit einem Defaultwert `0`.
* `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}.

View File

@@ -16,69 +16,13 @@ Das, weil hochgeladene Dateien als „Formulardaten“ gesendet werden.
Importieren Sie `File` und `UploadFile` von `fastapi`:
//// tab | Python 3.9+
```Python hl_lines="3"
{!> ../../../docs_src/request_files/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="1"
{!> ../../../docs_src/request_files/tutorial001_an.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="1"
{!> ../../../docs_src/request_files/tutorial001.py!}
```
////
{* ../../docs_src/request_files/tutorial001_an_py39.py hl[3] *}
## `File`-Parameter definieren
Erstellen Sie Datei-Parameter, so wie Sie es auch mit `Body` und `Form` machen würden:
//// 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!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="7"
{!> ../../../docs_src/request_files/tutorial001.py!}
```
////
{* ../../docs_src/request_files/tutorial001_an_py39.py hl[9] *}
/// info
@@ -88,7 +32,7 @@ Aber erinnern Sie sich, dass, wenn Sie `Query`, `Path`, `File` und andere von `
///
/// tip | "Tipp"
/// 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.
@@ -106,35 +50,7 @@ Aber es gibt viele Fälle, in denen Sie davon profitieren, `UploadFile` zu verwe
Definieren Sie einen Datei-Parameter mit dem Typ `UploadFile`:
//// tab | Python 3.9+
```Python hl_lines="14"
{!> ../../../docs_src/request_files/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="13"
{!> ../../../docs_src/request_files/tutorial001_an.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="12"
{!> ../../../docs_src/request_files/tutorial001.py!}
```
////
{* ../../docs_src/request_files/tutorial001_an_py39.py hl[14] *}
`UploadFile` zu verwenden, hat mehrere Vorzüge gegenüber `bytes`:
@@ -177,13 +93,13 @@ Wenn Sie sich innerhalb einer normalen `def`-*Pfadoperation-Funktion* befinden,
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.
///
/// 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.
@@ -195,7 +111,7 @@ HTML-Formulare (`<form></form>`) senden die Daten in einer „speziellen“ Kodi
**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.
@@ -205,7 +121,7 @@ Wenn Sie mehr über Formularfelder und ihre Kodierungen lesen möchten, besuchen
///
/// 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.
@@ -217,91 +133,13 @@ Das ist keine Limitation von **FastAPI**, sondern Teil des HTTP-Protokolls.
Sie können eine Datei optional machen, indem Sie Standard-Typannotationen verwenden und den Defaultwert auf `None` setzen:
//// 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="10 18"
{!> ../../../docs_src/request_files/tutorial001_02_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="7 15"
{!> ../../../docs_src/request_files/tutorial001_02_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="9 17"
{!> ../../../docs_src/request_files/tutorial001_02.py!}
```
////
{* ../../docs_src/request_files/tutorial001_02_an_py310.py hl[9,17] *}
## `UploadFile` mit zusätzlichen Metadaten
Sie können auch `File()` zusammen mit `UploadFile` verwenden, um zum Beispiel zusätzliche Metadaten zu setzen:
//// 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!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="7 13"
{!> ../../../docs_src/request_files/tutorial001_03.py!}
```
////
{* ../../docs_src/request_files/tutorial001_03_an_py39.py hl[9,15] *}
## Mehrere Datei-Uploads
@@ -311,53 +149,11 @@ Diese werden demselben Formularfeld zugeordnet, welches mit den Formulardaten ge
Um das zu machen, deklarieren Sie eine Liste von `bytes` oder `UploadFile`s:
//// tab | Python 3.9+
```Python hl_lines="10 15"
{!> ../../../docs_src/request_files/tutorial002_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="11 16"
{!> ../../../docs_src/request_files/tutorial002_an.py!}
```
////
//// tab | Python 3.9+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="8 13"
{!> ../../../docs_src/request_files/tutorial002_py39.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!}
```
////
{* ../../docs_src/request_files/tutorial002_an_py39.py hl[10,15] *}
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.
@@ -369,49 +165,7 @@ Sie können auch `from starlette.responses import HTMLResponse` verwenden.
Und so wie zuvor können Sie `File()` verwenden, um zusätzliche Parameter zu setzen, sogar für `UploadFile`:
//// tab | Python 3.9+
```Python hl_lines="11 18-20"
{!> ../../../docs_src/request_files/tutorial003_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="12 19-21"
{!> ../../../docs_src/request_files/tutorial003_an.py!}
```
////
//// tab | Python 3.9+ nicht annotiert
/// tip | "Tipp"
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!}
```
////
{* ../../docs_src/request_files/tutorial003_an_py39.py hl[11,18:20] *}
## Zusammenfassung

View File

@@ -12,75 +12,19 @@ Z. B. `pip install python-multipart`.
## `File` und `Form` importieren
//// 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!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="1"
{!> ../../../docs_src/request_forms_and_files/tutorial001.py!}
```
////
{* ../../docs_src/request_forms_and_files/tutorial001_an_py39.py hl[3] *}
## `File` und `Form`-Parameter definieren
Erstellen Sie Datei- und Formularparameter, so wie Sie es auch mit `Body` und `Query` machen würden:
//// tab | Python 3.9+
```Python hl_lines="10-12"
{!> ../../../docs_src/request_forms_and_files/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="9-11"
{!> ../../../docs_src/request_forms_and_files/tutorial001_an.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="8"
{!> ../../../docs_src/request_forms_and_files/tutorial001.py!}
```
////
{* ../../docs_src/request_forms_and_files/tutorial001_an_py39.py hl[10:12] *}
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.
/// 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.

View File

@@ -14,69 +14,13 @@ Z. B. `pip install python-multipart`.
Importieren Sie `Form` von `fastapi`:
//// tab | Python 3.9+
```Python hl_lines="3"
{!> ../../../docs_src/request_forms/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="1"
{!> ../../../docs_src/request_forms/tutorial001_an.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="1"
{!> ../../../docs_src/request_forms/tutorial001.py!}
```
////
{* ../../docs_src/request_forms/tutorial001_an_py39.py hl[3] *}
## `Form`-Parameter definieren
Erstellen Sie Formular-Parameter, so wie Sie es auch mit `Body` und `Query` machen würden:
//// tab | Python 3.9+
```Python hl_lines="9"
{!> ../../../docs_src/request_forms/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="8"
{!> ../../../docs_src/request_forms/tutorial001_an.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="7"
{!> ../../../docs_src/request_forms/tutorial001.py!}
```
////
{* ../../docs_src/request_forms/tutorial001_an_py39.py hl[9] *}
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.
@@ -90,7 +34,7 @@ Mit `Form` haben Sie die gleichen Konfigurationsmöglichkeiten wie mit `Body` (u
///
/// 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.
@@ -102,7 +46,7 @@ HTML-Formulare (`<form></form>`) senden die Daten in einer „speziellen“ Kodi
**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.
@@ -112,7 +56,7 @@ Wenn Sie mehr über Formularfelder und ihre Kodierungen lesen möchten, besuchen
///
/// warning | "Achtung"
/// warning | Achtung
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.

View File

@@ -4,29 +4,7 @@ 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.
//// tab | Python 3.10+
```Python hl_lines="16 21"
{!> ../../../docs_src/response_model/tutorial001_01_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="18 23"
{!> ../../../docs_src/response_model/tutorial001_01_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="18 23"
{!> ../../../docs_src/response_model/tutorial001_01.py!}
```
////
{* ../../docs_src/response_model/tutorial001_01_py310.py hl[16,21] *}
FastAPI wird diesen Rückgabetyp verwenden, um:
@@ -59,31 +37,9 @@ Sie können `response_model` in jeder möglichen *Pfadoperation* verwenden:
* `@app.delete()`
* usw.
//// tab | Python 3.10+
{* ../../docs_src/response_model/tutorial001_py310.py hl[17,22,24:27] *}
```Python hl_lines="17 22 24-27"
{!> ../../../docs_src/response_model/tutorial001_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="17 22 24-27"
{!> ../../../docs_src/response_model/tutorial001_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="17 22 24-27"
{!> ../../../docs_src/response_model/tutorial001.py!}
```
////
/// note | "Hinweis"
/// 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.
@@ -93,7 +49,7 @@ Beachten Sie, dass `response_model` ein Parameter der „Dekorator“-Methode is
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.
@@ -113,21 +69,7 @@ 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:
//// 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!}
```
////
{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
/// info
@@ -140,21 +82,7 @@ oder `pip install pydantic[email]`.
Wir verwenden dieses Modell, um sowohl unsere Eingabe- als auch Ausgabedaten zu deklarieren:
//// tab | Python 3.10+
```Python hl_lines="16"
{!> ../../../docs_src/response_model/tutorial002_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="18"
{!> ../../../docs_src/response_model/tutorial002.py!}
```
////
{* ../../docs_src/response_model/tutorial002_py310.py hl[16] *}
Immer wenn jetzt ein Browser einen Benutzer mit Passwort erzeugt, gibt die API dasselbe Passwort in der Response zurück.
@@ -162,7 +90,7 @@ 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.
/// 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.
@@ -172,57 +100,15 @@ Speichern Sie niemals das Klartext-Passwort eines Benutzers, oder versenden Sie
Wir können stattdessen ein Eingabemodell mit dem Klartext-Passwort, und ein Ausgabemodell ohne das Passwort erstellen:
//// tab | Python 3.10+
```Python hl_lines="9 11 16"
{!> ../../../docs_src/response_model/tutorial003_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="9 11 16"
{!> ../../../docs_src/response_model/tutorial003.py!}
```
////
{* ../../docs_src/response_model/tutorial003_py310.py hl[9,11,16] *}
Obwohl unsere *Pfadoperation-Funktion* hier denselben `user` von der Eingabe zurückgibt, der das Passwort enthält:
//// tab | Python 3.10+
```Python hl_lines="24"
{!> ../../../docs_src/response_model/tutorial003_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="24"
{!> ../../../docs_src/response_model/tutorial003.py!}
```
////
{* ../../docs_src/response_model/tutorial003_py310.py hl[24] *}
... haben wir deklariert, dass `response_model` das Modell `UserOut` ist, welches das Passwort nicht enthält:
//// tab | Python 3.10+
```Python hl_lines="22"
{!> ../../../docs_src/response_model/tutorial003_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="22"
{!> ../../../docs_src/response_model/tutorial003.py!}
```
////
{* ../../docs_src/response_model/tutorial003_py310.py hl[22] *}
Darum wird **FastAPI** sich darum kümmern, dass alle Daten, die nicht im Ausgabemodell deklariert sind, herausgefiltert werden (mittels Pydantic).
@@ -246,21 +132,7 @@ 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.
//// tab | Python 3.10+
```Python hl_lines="7-10 13-14 18"
{!> ../../../docs_src/response_model/tutorial003_01_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="9-13 15-16 20"
{!> ../../../docs_src/response_model/tutorial003_01.py!}
```
////
{* ../../docs_src/response_model/tutorial003_01_py310.py hl[7:10,13:14,18] *}
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.
@@ -302,9 +174,7 @@ Es kann Fälle geben, bei denen Sie etwas zurückgeben, das kein gültiges Pydan
Der häufigste Anwendungsfall ist, wenn Sie [eine Response direkt zurückgeben, wie es später im Handbuch für fortgeschrittene Benutzer erläutert wird](../advanced/response-directly.md){.internal-link target=_blank}.
```Python hl_lines="8 10-11"
{!> ../../../docs_src/response_model/tutorial003_02.py!}
```
{* ../../docs_src/response_model/tutorial003_02.py hl[8,10:11] *}
Dieser einfache Anwendungsfall wird automatisch von FastAPI gehandhabt, weil die Annotation des Rückgabetyps die Klasse (oder eine Unterklasse von) `Response` ist.
@@ -314,9 +184,7 @@ Und Tools werden auch glücklich sein, weil sowohl `RedirectResponse` als auch `
Sie können auch eine Unterklasse von `Response` in der Typannotation verwenden.
```Python hl_lines="8-9"
{!> ../../../docs_src/response_model/tutorial003_03.py!}
```
{* ../../docs_src/response_model/tutorial003_03.py hl[8:9] *}
Das wird ebenfalls funktionieren, weil `RedirectResponse` eine Unterklasse von `Response` ist, und FastAPI sich um diesen einfachen Anwendungsfall automatisch kümmert.
@@ -326,21 +194,7 @@ 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 💥:
//// tab | Python 3.10+
```Python hl_lines="8"
{!> ../../../docs_src/response_model/tutorial003_04_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="10"
{!> ../../../docs_src/response_model/tutorial003_04.py!}
```
////
{* ../../docs_src/response_model/tutorial003_04_py310.py hl[8] *}
... 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`.
@@ -352,21 +206,7 @@ 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:
//// tab | Python 3.10+
```Python hl_lines="7"
{!> ../../../docs_src/response_model/tutorial003_05_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="9"
{!> ../../../docs_src/response_model/tutorial003_05.py!}
```
////
{* ../../docs_src/response_model/tutorial003_05_py310.py hl[7] *}
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. 🤓
@@ -374,29 +214,7 @@ Das bewirkt, dass FastAPI die Generierung des Responsemodells unterlässt, und d
Ihr Responsemodell könnte Defaultwerte haben, wie:
//// tab | Python 3.10+
```Python hl_lines="9 11-12"
{!> ../../../docs_src/response_model/tutorial004_py310.py!}
```
////
//// tab | Python 3.9+
```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!}
```
////
{* ../../docs_src/response_model/tutorial004_py310.py hl[9,11:12] *}
* `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`.
@@ -410,29 +228,7 @@ 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:
//// tab | Python 3.10+
```Python hl_lines="22"
{!> ../../../docs_src/response_model/tutorial004_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="24"
{!> ../../../docs_src/response_model/tutorial004_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="24"
{!> ../../../docs_src/response_model/tutorial004.py!}
```
////
{* ../../docs_src/response_model/tutorial004_py310.py hl[22] *}
Die Defaultwerte werden dann nicht in der Response enthalten sein, sondern nur die tatsächlich gesetzten Werte.
@@ -503,7 +299,7 @@ dann ist FastAPI klug genug (tatsächlich ist Pydantic klug genug) zu erkennen,
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`.
@@ -519,7 +315,7 @@ 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.
/// tip | "Tipp"
/// tip | Tipp
Es wird dennoch empfohlen, dass Sie die Ideen von oben verwenden, also mehrere Klassen statt dieser Parameter.
@@ -529,23 +325,9 @@ Das trifft auch auf `response_model_by_alias` zu, welches ähnlich funktioniert.
///
//// tab | Python 3.10+
{* ../../docs_src/response_model/tutorial005_py310.py hl[29,35] *}
```Python hl_lines="29 35"
{!> ../../../docs_src/response_model/tutorial005_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="31 37"
{!> ../../../docs_src/response_model/tutorial005.py!}
```
////
/// tip | "Tipp"
/// tip | Tipp
Die Syntax `{"name", "description"}` erzeugt ein `set` mit diesen zwei Werten.
@@ -557,21 +339,7 @@ Die Syntax `{"name", "description"}` erzeugt ein `set` mit diesen zwei Werten.
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:
//// tab | Python 3.10+
```Python hl_lines="29 35"
{!> ../../../docs_src/response_model/tutorial006_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="31 37"
{!> ../../../docs_src/response_model/tutorial006.py!}
```
////
{* ../../docs_src/response_model/tutorial006_py310.py hl[29,35] *}
## Zusammenfassung

View File

@@ -8,11 +8,9 @@ So wie ein Responsemodell, können Sie auch einen HTTP-Statuscode für die Respo
* `@app.delete()`
* usw.
```Python hl_lines="6"
{!../../../docs_src/response_status_code/tutorial001.py!}
```
{* ../../docs_src/response_status_code/tutorial001.py hl[6] *}
/// 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.
@@ -33,7 +31,7 @@ Das wird:
<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.
@@ -43,7 +41,7 @@ FastAPI versteht das und wird in der OpenAPI-Dokumentation anzeigen, dass es kei
## Ü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.
@@ -66,7 +64,7 @@ Kurz:
* 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.
/// 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>.
@@ -76,9 +74,7 @@ Um mehr über Statuscodes zu lernen, und welcher wofür verwendet wird, lesen Si
Schauen wir uns das vorherige Beispiel noch einmal an:
```Python hl_lines="6"
{!../../../docs_src/response_status_code/tutorial001.py!}
```
{* ../../docs_src/response_status_code/tutorial001.py hl[6] *}
`201` ist der Statuscode für „Created“ („Erzeugt“).
@@ -86,15 +82,13 @@ Aber Sie müssen sich nicht daran erinnern, welcher dieser Codes was bedeutet.
Sie können die Hilfsvariablen von `fastapi.status` verwenden.
```Python hl_lines="1 6"
{!../../../docs_src/response_status_code/tutorial002.py!}
```
{* ../../docs_src/response_status_code/tutorial002.py hl[1,6] *}
Diese sind nur eine Annehmlichkeit und enthalten dieselbe Nummer, aber auf diese Weise können Sie die Autovervollständigung Ihres Editors verwenden, um sie zu finden:
<img src="/img/tutorial/response-status-code/image02.png">
/// note | "Technische Details"
/// note | Technische Details
Sie können auch `from starlette import status` verwenden.

View File

@@ -8,35 +8,15 @@ 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.
//// tab | Python 3.10+ Pydantic v2
//// tab | Pydantic v2
```Python hl_lines="13-24"
{!> ../../../docs_src/schema_extra_example/tutorial001_py310.py!}
```
{* ../../docs_src/schema_extra_example/tutorial001_py310.py hl[13:24] *}
////
//// tab | Python 3.10+ Pydantic v1
//// tab | Pydantic v1
```Python hl_lines="13-23"
{!> ../../../docs_src/schema_extra_example/tutorial001_py310_pv1.py!}
```
////
//// tab | Python 3.8+ Pydantic v2
```Python hl_lines="15-26"
{!> ../../../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!}
```
{* ../../docs_src/schema_extra_example/tutorial001_pv1_py310.py hl[13:23] *}
////
@@ -58,7 +38,7 @@ Sie können `schema_extra` setzen, mit einem `dict`, das alle zusätzlichen Date
////
/// tip | "Tipp"
/// tip | Tipp
Mit derselben Technik können Sie das JSON-Schema erweitern und Ihre eigenen benutzerdefinierten Zusatzinformationen hinzufügen.
@@ -80,21 +60,7 @@ Mehr erfahren Sie am Ende dieser Seite.
Wenn Sie `Field()` mit Pydantic-Modellen verwenden, können Sie ebenfalls zusätzliche `examples` deklarieren:
//// tab | Python 3.10+
```Python hl_lines="2 8-11"
{!> ../../../docs_src/schema_extra_example/tutorial002_py310.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="4 10-13"
{!> ../../../docs_src/schema_extra_example/tutorial002.py!}
```
////
{* ../../docs_src/schema_extra_example/tutorial002_py310.py hl[2,8:11] *}
## `examples` im JSON-Schema OpenAPI
@@ -114,57 +80,7 @@ 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:
//// tab | Python 3.10+
```Python hl_lines="22-29"
{!> ../../../docs_src/schema_extra_example/tutorial003_an_py310.py!}
```
////
//// tab | Python 3.9+
```Python hl_lines="22-29"
{!> ../../../docs_src/schema_extra_example/tutorial003_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="23-30"
{!> ../../../docs_src/schema_extra_example/tutorial003_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```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!}
```
////
{* ../../docs_src/schema_extra_example/tutorial003_an_py310.py hl[22:29] *}
### Beispiel in der Dokumentations-Benutzeroberfläche
@@ -176,57 +92,7 @@ Mit jeder der oben genannten Methoden würde es in `/docs` so aussehen:
Sie können natürlich auch mehrere `examples` übergeben:
//// 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"
{!> ../../../docs_src/schema_extra_example/tutorial004_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="24-39"
{!> ../../../docs_src/schema_extra_example/tutorial004_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="19-34"
{!> ../../../docs_src/schema_extra_example/tutorial004_py310.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!}
```
////
{* ../../docs_src/schema_extra_example/tutorial004_an_py310.py hl[23:38] *}
Wenn Sie das tun, werden die Beispiele Teil des internen **JSON-Schemas** für diese Body-Daten.
@@ -267,57 +133,7 @@ Jedes spezifische Beispiel-`dict` in den `examples` kann Folgendes enthalten:
Sie können es so verwenden:
//// 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="24-50"
{!> ../../../docs_src/schema_extra_example/tutorial005_an.py!}
```
////
//// tab | Python 3.10+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="19-45"
{!> ../../../docs_src/schema_extra_example/tutorial005_py310.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="21-47"
{!> ../../../docs_src/schema_extra_example/tutorial005.py!}
```
////
{* ../../docs_src/schema_extra_example/tutorial005_an_py310.py hl[23:49] *}
### OpenAPI-Beispiele in der Dokumentations-Benutzeroberfläche
@@ -327,7 +143,7 @@ Wenn `openapi_examples` zu `Body()` hinzugefügt wird, würde `/docs` so aussehe
## 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**.
@@ -337,7 +153,7 @@ Sie können dies als eine kurze **Geschichtsstunde** zu OpenAPI und JSON Schema
///
/// warning | "Achtung"
/// warning | Achtung
Dies sind sehr technische Details zu den Standards **JSON Schema** und **OpenAPI**.

View File

@@ -20,35 +20,7 @@ Lassen Sie uns zunächst einfach den Code verwenden und sehen, wie er funktionie
Kopieren Sie das Beispiel in eine Datei `main.py`:
//// tab | Python 3.9+
```Python
{!> ../../../docs_src/security/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python
{!> ../../../docs_src/security/tutorial001_an.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python
{!> ../../../docs_src/security/tutorial001.py!}
```
////
{* ../../docs_src/security/tutorial001_an_py39.py *}
## Ausführen
@@ -82,7 +54,7 @@ Sie werden etwa Folgendes sehen:
<img src="/img/tutorial/security/image01.png">
/// check | "Authorize-Button!"
/// check | Authorize-Button!
Sie haben bereits einen glänzenden, neuen „Authorize“-Button.
@@ -94,7 +66,7 @@ Und wenn Sie darauf klicken, erhalten Sie ein kleines Anmeldeformular zur Eingab
<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.
@@ -154,37 +126,9 @@ In dem Fall gibt Ihnen **FastAPI** ebenfalls die Tools, die Sie zum Erstellen br
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.
//// tab | Python 3.9+
{* ../../docs_src/security/tutorial001_an_py39.py hl[8] *}
```Python hl_lines="8"
{!> ../../../docs_src/security/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="7"
{!> ../../../docs_src/security/tutorial001_an.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="6"
{!> ../../../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`.
@@ -220,41 +164,13 @@ Es kann also mit `Depends` verwendet werden.
Jetzt können Sie dieses `oauth2_scheme` als Abhängigkeit `Depends` übergeben.
//// tab | Python 3.9+
```Python hl_lines="12"
{!> ../../../docs_src/security/tutorial001_an_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="11"
{!> ../../../docs_src/security/tutorial001_an.py!}
```
////
//// tab | Python 3.8+ nicht annotiert
/// tip | "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="10"
{!> ../../../docs_src/security/tutorial001.py!}
```
////
{* ../../docs_src/security/tutorial001_an_py39.py hl[12] *}
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.
/// 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.

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